J'ai rencontré de nombreux utilisateurs qui ont demandé la possibilité de télécharger les services de fonctionnalités hébergés ArcGIS Online et les services de fonctionnalités/cartes ArcGIS Server. Voir l'outil ci-joint pour faire exactement cela. L'outil vous permettra également de télécharger les pièces jointes des services de fonctionnalités hébergés ArcGIS Online. J'espère que les utilisateurs trouveront cela utile et pratique.<\/P>
<\/P>
Mise à jour 10\/08\/17:<\/STRONG> L'outil téléchargera désormais les domaines de valeurs codées dans la géodatabase. De plus, consolidation des versions 2x et 3x en un seul outil. L'outil peut être exécuté depuis ArcGIS Pro ou ArcGIS Desktop.<\/P>Mise à jour 13\/11\/17: <\/STRONG>L'outil prend désormais en charge l'utilisation d'une clause where pour interroger le service.<\/P>Mise à jour 14\/03\/17:<\/STRONG> Mise à jour vers un script unique pour ArcMap\/Pro utilisant le module requests<\/P>Mise à jour 17\/01\/19:<\/STRONG> Merci à Adam Eversole<\/A> d'avoir signalé que la fonctionnalité de cet outil peut désormais être prise en charge par l'outil Feature Class to Feature Class<\/A> d'ArcGIS Pro :<\/P><\/P><\/BODY><\/HTML>
<\/P><\/BODY><\/HTML>
Jake Skinner Unfortunately I don't have access to ArcGIS outside of our network but I have tested it by reducing parts of the code and it looks like it opens the proxy gets the URL and then next time it goes to see a URL the proxy is closed. I think I need to find some code that keeps the "session" open. My python skills are limited, more of a copy/paste and test type of guy
Does this tool work for ArcMap 10.6?
I am getting the error "line 661, in <module> if hasrow == True:NameError: name 'hasrow' is not defined"
Brita Austin, yes this works with ArcGIS 10.6. Can you share you the service to an ArcGIS Online Group and invite my user account (jskinner_CountySandbox)? I can try to download the service and troubleshoot.
I've created the group and shared as you asked. Thank you so much! I really appreciate the help
Brita Austin this may be a possible bug. The script calls the CreateReplica function. When doing this manually by going to:
https://services5.arcgis.com/CvSVG6rs7CUXohUs/arcgis/rest/services/PLANO/FeatureServer/createReplica
the returned JSON is empty for the features and attachments in the JSON file. This is only occurring for tables. I'm checking with the ArcGIS Online team if this is expected, a bug, or a limitation. I'll let you know ASAP.
This tool is great and really helpful. However, I am having trouble downloading attachments. Not all of my points hosted on ArcGIS online have attachments but with the points containing attachments I would like to download them. When using the tool I check get attachments and have tried several places of storing the photo directory but the attachments are not downloading and the results bar says service has no attachments, despite me checking in ArcGIS online and several points having attachments. I am just wondering if you have tips for how to download the attachments with the points
Brad, I have made a similar tool only for arcgis pro: I have added also spatial filter. You can try see if it download attachments GitHub - nicogis/DownloadService: Download data from services of arcgis server or host service
hi,
i am having issues downloading attachments using this tool i can successfully download without attachments. but if i tick the "download Attachments" box i get a warning saying "Service does not have sync operation enabled" it is enabled as i can do editing (including offline)
the error that follows is:
urllib.urlretrieve(replicaUrl, cwd + os.sep + 'myLayer.json')NameError: name 'replicaUrl' is not defined
and if i check the json there is no key called replicaURL
here is the error message i am getting
ok so i have figured out part of it ,
the createReplica URL was incorrect, it contained the layer number at the end
i.e. the end of the url looked like FeatureServer/0createReplica instead of FeatureServer/createReplica
so i changed line 273 from
crUrl = baseURL[0:-7] + r'createReplica'
to crUrl = baseURL[0:-8] + r'createReplica'
to strip the last character and i no longer get that error,
now the script does not throw an error but it exits early and i get a message that the "Service does not contain attachments", which is not true because one feature does
and this is being caused by the replicaURL
line 290 - 292
urllib.urlretrieve(replicaUrl, cwd + os.sep + 'myLayer.json')
f = open(cwd + os.sep + 'myLayer.json')
it is not copying myLayer,json anywhere because the replicaURL is not returning anything
if i copy the replicaURL into a browser i get an error "SSL required"
so does it need the token generated earlier in script to be appended?
i manually tried this by appending the token to the end of the replicaURL but maybe thst not the correct position for the token. in what position within the url should the token be?
Further to the above,
the SSL error is caused because replica url is using http, i have modified so it uses https
now i need to figure out where to include the token in the url
------------SOLVED ------------------
i had to add the following line
replicaUrl=("https{}").format(replicaUrl[4:])+"?token={}".format(crValues['token'])
before urllib.urlretrieve(replicaUrl, cwd + os.sep + 'myLayer.json')
around the line 293 area
now it downloads attachments. YAY!
Brad Wilson can you share your service to an ArcGIS Online Group and invite my user account (jskinner_CountySandbox)? I can take a look and see if I can reproduce.
Anthony, could you please share your full updated script? I would love to try it out!
here is updated script,only slight changes to Jake Skinner's script as documented above
import arcpy, urllib, urllib2, json, os, math, sysfrom arcpy import envenv.overwriteOutput = 1env.workspace = env.scratchGDB
hostedFeatureService = arcpy.GetParameterAsText(0)agsService = arcpy.GetParameterAsText(1)
baseURL = arcpy.GetParameterAsText(2) + "/query"
agsFeatures = arcpy.GetParameterAsText(3)agsTable = arcpy.GetParameterAsText(4)
username = arcpy.GetParameterAsText(5)password = arcpy.GetParameterAsText(6)
# Generate token for hosted feature serviceif hostedFeatureService == 'true': try: arcpy.AddMessage('\nGenerating Token\n') tokenURL = 'https://www.arcgis.com/sharing/rest/generateToken' params = {'f': 'pjson', 'username': username, 'password': password, 'referer': 'http://www.arcgis.com'} req = urllib2.Request(tokenURL, urllib.urlencode(params)) response = urllib2.urlopen(req) data = json.load(response) token = data['token'] except: token = ''
# Genereate token for AGS feature serviceif agsService == 'true': try: arcpy.AddMessage('\nGenerating Token\n') server = baseURL.split("//")[1].split("/")[0] tokenURL = 'http://' + server + '/arcgis/tokens/?username=' + username + '&password=' + password + '&referer=http%3A%2F%2F' + server + '&f=json' req = urllib2.Request(tokenURL) response = urllib2.urlopen(req) data = json.load(response) token = data['token'] except: token = '' pass
# Return largest ObjectIDparams = {'where': '1=1', 'returnIdsOnly': 'true', 'token': token, 'f': 'json'}req = urllib2.Request(baseURL, urllib.urlencode(params))response = urllib2.urlopen(req)data = json.load(response)try: data['objectIds'].sort()except: arcpy.AddWarning("\nURL is incorrect. Or, Service is secure, please enter username and password.\n")iteration = int(data['objectIds'][-1])minOID = int(data['objectIds'][0]) - 1OID = data['objectIdFieldName']
# Code for downloading hosted feature serviceif hostedFeatureService == 'true': if iteration < 1000: x = iteration y = minOID where = OID + '>' + str(y) + 'AND ' + OID + '<=' + str(x) fields ='*'
query = "?where={}&outFields={}&returnGeometry=true&f=json&token={}".format(where, fields, token) fsURL = baseURL + query
fs = arcpy.FeatureSet() fs.load(fsURL)
arcpy.AddMessage('Copying features with ObjectIDs from ' + str(y) + ' to ' + str(x)) outputFC = arcpy.GetParameterAsText(7) desc = arcpy.Describe(os.path.dirname(outputFC)) if desc.workspaceFactoryProgID == 'esriDataSourcesGDB.SdeWorkspaceFactory.1': outputFC2 = outputFC.split(".")[-1] arcpy.FeatureClassToFeatureClass_conversion(fs, os.path.dirname(outputFC), outputFC2) else: arcpy.FeatureClassToFeatureClass_conversion(fs, os.path.dirname(outputFC), os.path.basename(outputFC))
else: newIteration = (math.ceil(iteration/1000.0) * 1000) x = minOID + 1000 y = minOID firstTime = 'True'
while x <= newIteration: where = OID + '>' + str(y) + 'AND ' + OID + '<=' + str(x) fields ='*'
if firstTime == 'True': arcpy.AddMessage('Copying features with ObjectIDs from ' + str(y) + ' to ' + str(x)) outputFC = arcpy.GetParameterAsText(7) desc = arcpy.Describe(os.path.dirname(outputFC)) if desc.workspaceFactoryProgID == 'esriDataSourcesGDB.SdeWorkspaceFactory.1': outputFC2 = outputFC.split(".")[-1] arcpy.FeatureClassToFeatureClass_conversion(fs, os.path.dirname(outputFC), outputFC2) else: arcpy.FeatureClassToFeatureClass_conversion(fs, os.path.dirname(outputFC), os.path.basename(outputFC)) firstTime = 'False' else: desc = arcpy.Describe(os.path.dirname(outputFC)) if desc.workspaceFactoryProgID == 'esriDataSourcesGDB.SdeWorkspaceFactory.1': arcpy.AddMessage('Copying features with ObjectIDs from ' + str(y) + ' to ' + str(x)) insertRows = arcpy.da.InsertCursor(outputFC, ["*","SHAPE@"]) searchRows = arcpy.da.SearchCursor(fs, ["*","SHAPE@"]) for searchRow in searchRows: fieldList = list(searchRow) insertRows.insertRow(fieldList) elif desc.workspaceFactoryProgID == '': arcpy.AddMessage('Copying features with ObjectIDs from ' + str(y) + ' to ' + str(x)) arcpy.Append_management(fs, outputFC, "NO_TEST") else: arcpy.AddMessage('Copying features with ObjectIDs from ' + str(y) + ' to ' + str(x)) arcpy.Append_management(fs, outputFC) x += 1000 y += 1000
try: del searchRow, searchRows, insertRows except: pass
# Check to see if downloading a feature or tabular data from a ArcGIS Server serviceif agsService == 'true': if agsFeatures != 'true' and agsTable != 'true': arcpy.AddError("\nPlease check 'Downloading Feature Data' or 'Downloading Tabular Data'\n")
# Code for downloading feature dataif agsFeatures == 'true': if iteration < 1000: x = iteration y = minOID where = OID + '>' + str(y) + 'AND ' + OID + '<=' + str(x) fields ='*'
query = "?where={}&outFields={}&returnGeometry=true&f=json&token={}".format(where, fields, token) fsURL = baseURL + query fs = arcpy.FeatureSet() fs.load(fsURL)
# Code for downloading tabular dataif agsTable == 'true': if iteration < 1000: x = iteration y = minOID where = OID + '>' + str(y) + 'AND ' + OID + '<=' + str(x) fields ='*'
fs = arcpy.RecordSet() fs.load(fsURL)
arcpy.AddMessage('Copying features with ObjectIDs from ' + str(y) + ' to ' + str(x)) outputFC = arcpy.GetParameterAsText(7) desc = arcpy.Describe(os.path.dirname(outputFC)) if desc.workspaceFactoryProgID == 'esriDataSourcesGDB.SdeWorkspaceFactory.1': outputFC2 = outputFC.split(".")[-1] arcpy.TableToTable_conversion(fs, os.path.dirname(outputFC), outputFC2) else: arcpy.TableToTable_conversion(fs, os.path.dirname(outputFC), os.path.basename(outputFC))
query = "?where={}&outFields={}&f=json&token={}".format(where, fields, token) fsURL = baseURL + query
if firstTime == 'True': arcpy.AddMessage('Copying features with ObjectIDs from ' + str(y) + ' to ' + str(x)) outputFC = arcpy.GetParameterAsText(7) desc = arcpy.Describe(os.path.dirname(outputFC)) if desc.workspaceFactoryProgID == 'esriDataSourcesGDB.SdeWorkspaceFactory.1': outputFC2 = outputFC.split(".")[-1] arcpy.TableToTable_conversion(fs, os.path.dirname(outputFC), outputFC2) else: arcpy.TableToTable_conversion(fs, os.path.dirname(outputFC), os.path.basename(outputFC)) firstTime = 'False' else: desc = arcpy.Describe(os.path.dirname(outputFC)) arcpy.AddMessage('Copying features with ObjectIDs from ' + str(y) + ' to ' + str(x)) arcpy.Append_management(fs, outputFC) x += 1000 y += 1000
# Code for retrieving attachmentsgetAttachments = arcpy.GetParameterAsText(8)
if getAttachments == 'true': # Create Replica to retrieve attachments arcpy.AddMessage("\nRetrieving Attachments\n") cwd = arcpy.GetParameterAsText(9) crUrl = os.path.join(baseURL[0:-8], 'createReplica') # varied AHAY 20180712
crValues = {'f' : 'json', 'layers' : '0', 'returnAttachments' : 'true', 'token' : token }
crData = urllib.urlencode(crValues) crRequest = urllib2.Request(crUrl, crData) crResponse = urllib2.urlopen(crRequest) crJson = json.load(crResponse)
try: replicaUrl = crJson['URL'] except KeyError: arcpy.AddWarning("\nService does not have 'Sync' operation enabled\n")
replicaUrl=("https{}").format(replicaUrl[4:])+"?token={}".format(crValues['token']) # added AHAY 20180712 urllib.urlretrieve(replicaUrl, cwd + os.sep + 'myLayer.json')
lines = f.readlines() f.close()
for line in lines:
if not 'attachments' in line: arcpy.AddWarning("\nService does not contain attachments\n") os.remove(cwd + os.sep + 'myLayer.json') sys.exit()
# Get Attachment with open(cwd + os.sep + 'myLayer.json') as data_file: data = json.load(data_file)
dict = {} x = 0 while x <= iteration: try: dict[data['layers'][0]['features']['attributes'][OID]] = data['layers'][0]['features']['attributes']['GlobalID'] x += 1 except IndexError: x += 1 pass
fc = arcpy.GetParameterAsText(7) arcpy.AddField_management(fc, "GlobalID_Str", "TEXT")
for key in dict: with arcpy.da.UpdateCursor(fc, [OID, "GlobalID_Str"], OID + " = " + str(key)) as cursor: for row in cursor: row[1] = dict[key] cursor.updateRow(row)
arcpy.EnableAttachments_management(fc) arcpy.AddField_management(fc + "__ATTACH", "GlobalID_Str", "TEXT") arcpy.AddField_management(fc + "__ATTACH", "PhotoPath", "TEXT")
# Add Attachments # Create Match Table try: for x in data['layers'][0]['attachments']: gaUrl = x['url'] gaFolder = cwd + os.sep + x['parentGlobalId'] if not os.path.exists(gaFolder): os.makedirs(gaFolder) gaName = x['name'] gaValues = {'token' : token } gaData = urllib.urlencode(gaValues) urllib.urlretrieve(url=gaUrl + '/' + gaName, filename=os.path.join(gaFolder, gaName),data=gaData)
rows = arcpy.InsertCursor(fc + "__ATTACH") hasrow = False for cmtX in data['layers'][0]['attachments']: row = rows.newRow() hasrow = True row.setValue('GlobalID_Str', cmtX['parentGlobalId']) row.setValue('PhotoPath', cwd + os.sep +cmtX['parentGlobalId'] + os.sep + cmtX['name']) rows.insertRow(row)
if hasrow == True: del row del rows arcpy.AddAttachments_management(fc, 'GlobalID_Str', fc + '__ATTACH', 'GlobalID_Str', 'PhotoPath')
try: arcpy.MakeTableView_management(fc + '__ATTACH', "tblView") arcpy.SelectLayerByAttribute_management("tblView", "NEW_SELECTION", "DATA_SIZE = 0") arcpy.DeleteRows_management("tblView") arcpy.DeleteField_management(fc + '__ATTACH', 'GlobalID_Str') arcpy.DeleteField_management(fc + '__ATTACH', 'PhotoPath') except: pass except KeyError: pass
os.remove(cwd + os.sep + 'myLayer.json')
Hey Jake,
This tool works great, but I would like to download only features that have been edited within the last hour. Is this possible with a Where Clause? I have a feature service hosted in arcgis online with editor tracking turned on.
Thanks!
Drew Merrill SQL functions are supported in the query. Try the following:
EditDate > (CURRENT_TIMESTAMP - 1)
You will replace EditDate with your field name.
Is there a simplified version of this as just a ArcPy script that I can run independently without the use of toolbox. I'm looking for a way to just download a hosted feature service I own on AGOL.
Anthony Von Moos when you download the tool, it will include the python script. You can edit this and change the arcpy.GetParameterAsText to your parameters and then you can run this on a scheduled task if that's what you're looking to do. For the parameters that you check/uncheck in the tool, you will want to specify 'true' or 'false'.
Thanks for the reply. I updated the script and ran it but I'm receiving the error: NameError: name 'token' is not defined.
also what is the cwd parameter?
Thanks. Is there where a way to auto populate the current time into a field as I add new features to a hosted feature class?
Anthony Von Moos that is the directory where your attachments will be stored if you are download them. If you want to share your service to an ArcGIS Online group and invite my user account (jskinner_CountySandbox). I can take a look.
Drew Merrill you can enable editor tracking on the hosted feature service by going to the Settings tab and checking 'Keep track of who created and last updated features':
This will add 4 additional fields (Creator, CreateDate, Editor, EditDate) to your service.
Done! I'm wanting to be able to run that script and download a shapefile copy of that Test_Approaches feature layer to my C drive.
Perfect thanks that worked. I missed the fields being added when I enabled editor tracking the first time, but I see them now.
Anthony Von Moos here were the parameters I used to get this to work:
It looks like that did the trick! I appreciate all your help on this.
Jake,
I've been trying to apply an additional filter on the initial whereClause variable so that it only pulls feature from my Hosted Feature Service after a specified date. I tried at about line # 220 of the script so that the params variable includes the updated whereClause -- this is what I'm changing from:
<SPAN class="comment token"># Return largest ObjectID</SPAN> <SPAN class="keyword token">if</SPAN> whereClause <SPAN class="operator token">==</SPAN> <SPAN class="string token">''</SPAN><SPAN class="punctuation token">:</SPAN> whereClause <SPAN class="operator token">=</SPAN> <SPAN class="string token">'1=1'</SPAN> params <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">{</SPAN><SPAN class="string token">'where'</SPAN><SPAN class="punctuation token">:</SPAN> whereClause<SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'returnIdsOnly'</SPAN><SPAN class="punctuation token">:</SPAN> <SPAN class="string token">'true'</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'token'</SPAN><SPAN class="punctuation token">:</SPAN> token<SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'f'</SPAN><SPAN class="punctuation token">:</SPAN> <SPAN class="string token">'json'</SPAN><SPAN class="punctuation token">}</SPAN> data <SPAN class="operator token">=</SPAN> urllib<SPAN class="punctuation token">.</SPAN>parse<SPAN class="punctuation token">.</SPAN>urlencode<SPAN class="punctuation token">(</SPAN>params<SPAN class="punctuation token">)</SPAN> data <SPAN class="operator token">=</SPAN> data<SPAN class="punctuation token">.</SPAN>encode<SPAN class="punctuation token">(</SPAN><SPAN class="string token">'ascii'</SPAN><SPAN class="punctuation token">)</SPAN> <SPAN class="comment token"># data should be bytes</SPAN> req <SPAN class="operator token">=</SPAN> urllib<SPAN class="punctuation token">.</SPAN>request<SPAN class="punctuation token">.</SPAN>Request<SPAN class="punctuation token">(</SPAN>baseURL<SPAN class="punctuation token">,</SPAN> data<SPAN class="punctuation token">)</SPAN> response <SPAN class="operator token">=</SPAN> urllib<SPAN class="punctuation token">.</SPAN>request<SPAN class="punctuation token">.</SPAN>urlopen<SPAN class="punctuation token">(</SPAN>req<SPAN class="punctuation token">)</SPAN> data <SPAN class="operator token">=</SPAN> response<SPAN class="punctuation token">.</SPAN>read<SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">.</SPAN>decode<SPAN class="punctuation token">(</SPAN><SPAN class="string token">"utf-8"</SPAN><SPAN class="punctuation token">)</SPAN> json_acceptable_string <SPAN class="operator token">=</SPAN> data<SPAN class="punctuation token">.</SPAN>replace<SPAN class="punctuation token">(</SPAN><SPAN class="string token">"'"</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">"\""</SPAN><SPAN class="punctuation token">)</SPAN> data <SPAN class="operator token">=</SPAN> json<SPAN class="punctuation token">.</SPAN>loads<SPAN class="punctuation token">(</SPAN>json_acceptable_string<SPAN class="punctuation token">)</SPAN><SPAN class="line-numbers-rows"><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN></SPAN>
To:
<SPAN class="comment token"># Return largest ObjectID</SPAN> <SPAN class="comment token">#whereClause = '1=1'</SPAN> whereClause <SPAN class="operator token">=</SPAN> <SPAN class="string token">"CreationDate>'{}'"</SPAN><SPAN class="punctuation token">.</SPAN>format<SPAN class="punctuation token">(</SPAN>inputD<SPAN class="punctuation token">)</SPAN> <SPAN class="keyword token">if</SPAN> whereClause <SPAN class="operator token">==</SPAN> <SPAN class="string token">''</SPAN><SPAN class="punctuation token">:</SPAN> whereClause <SPAN class="operator token">=</SPAN> <SPAN class="string token">'1=1'</SPAN> <SPAN class="comment token">#params = urllib.urlencode({'f': 'pjson', 'where': "CreationDate>'{}'".format(inputDate), 'outFields': '*', 'token': token, 'returnGeometry': 'true'})</SPAN> params <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">{</SPAN><SPAN class="string token">'where'</SPAN><SPAN class="punctuation token">:</SPAN> whereClause<SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'returnIdsOnly'</SPAN><SPAN class="punctuation token">:</SPAN> <SPAN class="string token">'true'</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'token'</SPAN><SPAN class="punctuation token">:</SPAN> token<SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'f'</SPAN><SPAN class="punctuation token">:</SPAN> <SPAN class="string token">'json'</SPAN><SPAN class="punctuation token">}</SPAN> req <SPAN class="operator token">=</SPAN> urllib2<SPAN class="punctuation token">.</SPAN>Request<SPAN class="punctuation token">(</SPAN>baseURL<SPAN class="punctuation token">,</SPAN> urllib<SPAN class="punctuation token">.</SPAN>urlencode<SPAN class="punctuation token">(</SPAN>params<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN> <SPAN class="keyword token">print</SPAN> baseURL response <SPAN class="operator token">=</SPAN> urllib2<SPAN class="punctuation token">.</SPAN>urlopen<SPAN class="punctuation token">(</SPAN>req<SPAN class="punctuation token">)</SPAN> data <SPAN class="operator token">=</SPAN> json<SPAN class="punctuation token">.</SPAN>load<SPAN class="punctuation token">(</SPAN>response<SPAN class="punctuation token">)</SPAN><SPAN class="line-numbers-rows"><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN></SPAN>
However, anywhere else in the code where it checks for "if whereClause != '1=1':" then it seems to run into issues. Perhaps because it is using a Replica (which is out of sync with the queries feature service?).
Is there a straight forward way to alter this script so that the initial whereClause/params filtered on an input date?
Thanks
I am having trouble with the attachments (images) not being able to be opened. The Geometry and Attributes seem to come through fine, but the Photo1.jpg (similar for all) gives me the error "It looks like we don't support this file format". I get similar results opening with Windows Photos as well as paint. Any help would be greatly appreciated.
On another note, I occasionally get an error when running the script that "GlobalID_Str" has too many characters for the arcpy add field module.
ArcMap 10.6
Jonathan
Jonathan Holt can you share your service with an ArcGIS group and invite my user account (jskinner_CountySandbox)? I can see if I can reproduce.
Les membres connectés peuvent publier, suivre les mises à jour, et plus encore. Nouveau ici ? Inscrivez-vous gratuitement.
Find useful guides, FAQs, and documents to help you navigate and make the most of Esri Community.