Musiałem to zrobić niedawno i to była moja najlepsza jak dotąd próba. Początkowo próbowałem zrobić, "objectid non in {}".format(ids)
gdzie id będzie krotką zebranych identyfikatorów objectid, ale adres URL nie zwróci żadnych danych, musi istnieć limit długości łańcucha klauzuli where. część tego kodu jest na stałe zakodowana i jeśli identyfikatory nie są sekwencyjne, ten skrypt najprawdopodobniej nie zadziała. ale i tak mam nadzieję, że to pomoże
import os, arcpy, json, requests
arcpy.env.workspace=r'C:\path'
arcpy.env.overwriteOutput=True
def non_esri_extract(url,where,idlist):
dic={"where": where,"outFields": "*","returnGeometry": "true","f":"json"}
resp=requests.get(url, params=dic)
data=resp.json()
for i in data['features']:
idlist.append(int(i['attributes']['OBJECTID']))
maximum=max(idlist)
minimum=min(idlist)
return maximum,minimum
def esri_extract(url,e_w):
fields="*"
esri_param="?where={}&outFields={}&returnGeometry=true&f=json".format(e_w, fields)
fsURL=url+esri_param
fs = arcpy.FeatureSet()
fs.load(fsURL)
outname="interm"+str(x)
arcpy.CopyFeatures_management(fs, outname)
x=0
maximum=0
minimum=1
baseURL="http://gismaps.vita.virginia.gov/arcgis/rest/services/VA_Base_layers/VA_Parcels/FeatureServer/0/query"
while maximum!=minimum:
print "number of loops = {}".format(str(x))
if x==0:
ids=[]
maximum,minimum=non_esri_extract(baseURL,"LOCALITY = 'Franklin County'",ids)
esri_where="objectid >={} and objectid <={} and LOCALITY = 'Franklin County'".format(minimum,maximum)
esri_extract(baseURL,esri_where)
x+=1
else:
ids=[]
interm_where="objectid >={} and objectid <={} and LOCALITY = 'Franklin County'".format(maximum,maximum+999)
maximum,minimum=non_esri_extract(baseURL,interm_where,ids)
esri_where="objectid >={} and objectid <={} and LOCALITY = 'Franklin County'".format(minimum,maximum)
esri_extract(baseURL,esri_where)
x+=1
fcs = arcpy.ListFeatureClasses()
arcpy.Merge_management(fcs, "Merged")
return IDs only
zwrócenie wszystkich 58919 identyfikatorów.