Advertisement
Guest User

Untitled

a guest
Apr 9th, 2018
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.92 KB | None | 0 0
  1. from __future__ import print_function
  2.  
  3. import time
  4. import json
  5. import os
  6.  
  7. import tortilla
  8. from requests.packages import urllib3
  9. import arcpy
  10.  
  11. urllib3.disable_warnings()
  12.  
  13. timestamp = time.strftime("%Y-%m-%d-%H%M%S")
  14.  
  15. class AGOL:
  16.     """ A class for administering an ArcGIS Online account"""
  17.  
  18.     def __init__(self, in_username, in_password, expiration=60):
  19.         self.agol = tortilla.wrap('https://www.arcgis.com')
  20.         self.services = tortilla.wrap('https://services.arcgis.com')
  21.         self.username = in_username
  22.         self.password = in_password
  23.         self.expiration = expiration
  24.         self.token = self.gen_token()
  25.  
  26.     def gen_token(self):
  27.         """ Returns a token given a username and password """
  28.  
  29.         param = dict(username=self.username, password=self.password, expiration=self.expiration, client='referer',
  30.                      referer='https://www.arcgis.com', f='json')
  31.  
  32.         token = self.agol.sharing.rest.generateToken.post(params=param)
  33.  
  34.         if hasattr(token, 'error'):
  35.             print(token.error.message)
  36.             print(token.error.details)
  37.             quit()
  38.         else:
  39.             return token
  40.  
  41.     def get_user(self):
  42.         """Returns personal details of the user, such as e-mail and groups,
  43.        are returned only to the user or the administrator of the user's organization"""
  44.        
  45.         param = dict(token=self.token.token, f='json')
  46.  
  47.         user = self.agol.sharing.rest.community.users(self.username).get(params=param)
  48.  
  49.         if hasattr(user, 'error'):
  50.             print(user.error.message)
  51.             print(user.error.details)
  52.             quit()
  53.         else:
  54.             return user
  55.        
  56.  
  57.     def get_user_content(self):
  58.         """ Returns the content items for a particular user """
  59.  
  60.         param = dict(token=self.token.token, f='json')
  61.  
  62.         items = self.agol.sharing.rest.content.users(self.username).get(params=param)
  63.  
  64.         if hasattr(items, 'error'):
  65.             print(items.error.message)
  66.             print(items.error.details)
  67.             quit()
  68.         else:
  69.             return items
  70.        
  71.     def export_features_single(self, org_id, name, save_loc):
  72.         """Export a single feature layer from ArcGIS Online and saves it in a File Geodatabase"""
  73.  
  74.         service = ''.join(e for e in name if e.isalnum())
  75.         gdb_name = 'export_' + service + '.gdb'
  76.  
  77.         service_folder = os.path.join(save_loc, name)
  78.         os.makedirs(service_folder)
  79.  
  80.         json_folder = os.path.join(service_folder, 'json')
  81.         os.makedirs(json_folder)
  82.                
  83.         arcpy.CreateFileGDB_management(service_folder, gdb_name, 'CURRENT')
  84.        
  85.         param = dict(token=self.token.token, f='json')
  86.         param_query = dict(token=self.token.token, f='json', outFields='*', where='1=1')
  87.        
  88.         item = self.services(org_id).arcgis.rest.services(name).FeatureServer.get(params=param)
  89.  
  90.         for layer in item.layers:
  91.             layer_item = self.services(org_id).arcgis.rest.services(name).FeatureServer(layer.id).query.get(params=param_query)
  92.  
  93.             if hasattr(layer_item, 'error'):
  94.                 print(layer_item.error.message)
  95.                 print(layer_item.error.details)
  96.                 quit()
  97.             else:                
  98.                 json_source = os.path.join(json_folder, layer.name + ".json")
  99.                
  100.                 with open(json_source, 'w') as fp:
  101.                     json_file = json.dump(obj=layer_item, fp=fp)
  102.  
  103.                 feature_class_name = ''.join(e for e in layer.name if e.isalnum())
  104.                 output = os.path.join(service_folder, gdb_name, feature_class_name)
  105.                 arcpy.JSONToFeatures_conversion(json_source, output)
  106.         return
  107.  
  108.     def export_features_bulk(self, org_id, content, export_loc):
  109.         """Exports all feature layers from ArcGIS Online and saves them in a File Geodatabase"""
  110.        
  111.         items = content.items
  112.        
  113.         for i in items:
  114.             if i.type == "Feature Service" and "Hosted Service" in i.typeKeywords:
  115.                 print("\nSaving", i.title)
  116.                 print("URL:", i.url)
  117.                
  118.                 service = ''.join(e for e in i.title if e.isalnum())
  119.                 service_folder = os.path.join(export_loc, service)
  120.                 os.makedirs(service_folder)
  121.  
  122.                 json_folder = os.path.join(service_folder, 'json')
  123.                 os.makedirs(json_folder)
  124.                
  125.                 gdb_name = 'export_' + service + '.gdb'
  126.                
  127.                 arcpy.CreateFileGDB_management(service_folder, gdb_name, 'CURRENT')
  128.  
  129.                 param = dict(token=self.token.token, f='json')
  130.                 param_query = dict(token=self.token.token, f='json', outFields='*', where='1=1')
  131.                 actual_name = i.url.split("/")[-2]
  132.                 item = self.services(org_id).arcgis.rest.services(actual_name).FeatureServer.get(params=param)
  133.  
  134.                 for layer in item.layers:
  135.                     layer_item = self.services(org_id).arcgis.rest.services(actual_name).FeatureServer(layer.id).query.get(params=param_query)
  136.  
  137.                     if hasattr(layer_item, 'error'):
  138.                         print(layer_item.error.message)
  139.                         print(layer_item.error.details)
  140.                         pass
  141.                     else:                    
  142.                         json_source = os.path.join(json_folder, layer.name + ".json")                        
  143.                         with open(json_source, 'w') as fp:
  144.                             json_file = json.dump(obj=layer_item, fp=fp)
  145.  
  146.                         feature_class_name = ''.join(e for e in layer.name if e.isalnum())
  147.                         output = os.path.join(service_folder, gdb_name, feature_class_name)
  148.                         arcpy.JSONToFeatures_conversion(json_source, output)
  149.         return
  150.  
  151.                    
  152.     def file_writer(self, data, location):
  153.         with open(os.path.join(location, "itemdata-" + timestamp + ".json"), 'w') as fp:
  154.             json.dump(obj=data, fp=fp, indent=4)
  155.         return
  156.  
  157.  
  158. if __name__ == "__main__":
  159.    
  160.     save_location = r"C:\Users\petrik.emanuel\Desktop\backup"
  161.     username = "portoitapoa"
  162.     password = "gestao2018"
  163.     batch = True
  164.  
  165.     agol = AGOL(username, password)
  166.  
  167.     org_id = agol.get_user().orgId
  168.  
  169.     backup_location = os.path.join(save_location, timestamp)
  170.     os.makedirs(backup_location)
  171.    
  172.     content = agol.get_user_content()
  173.     print(content)
  174.     agol.file_writer(content, backup_location)
  175.  
  176.     if batch:
  177.         print("\nBACKUP FEATURE LAYERS")
  178.         print("=====================")
  179.         agol.export_features_bulk(org_id, content, backup_location)
  180.     else:
  181.         print("\nEXPORT SINGLE FEATURES")
  182.         print("======================")
  183.         export = agol.export_features_single(org_id, "FeatureServiceName", backup_location)    
  184.  
  185.     print("\nfinished")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement