Descargue el conjunto de datos del servicio REST de ArcGIS

Respuestas:

27

Ese servicio de mapas es un servicio de mapas dinámicos de ArcGIS Server que generalmente solo devuelve imágenes y resultados de consultas específicos, de forma muy similar a un WMS. Algunos servicios de imagen de ArcGIS Server permiten la descarga de datos, pero este no es uno de esos.

Puede obtener la información que está buscando a través de la operación de consulta, pero tomará varias consultas ya que el límite máximo de retorno de registros en este servicio es 1000, y hay más de 58000 registros solo en la capa v14.

Para enviar consultas, vaya al punto final de la capa y desplácese hasta la parte inferior para ver las operaciones admitidas, luego haga clic en Consulta . Para encontrar el número total de registros, ingrese 1 = 1 en el campo Dónde y seleccione Verdadero solo para Recuento de devoluciones , se ve como 58919 registros. Solo devolverá 1000 registros a la vez, por lo que tendrá que emitir 59 consultas para obtener todos los registros. Parece más fácil de filtrar por OBJECTID, por lo que la primera consulta sería WHERE OBJECTID <1000, Out Fields = *, Return Geometry = TRUE, Return Count = False, y Format es HTML . El servicio devuelve todas las características 1-999 y sus atributos. Puede cambiar el formato de salida a KMZ y convertirlo al formato deseado más tarde, iterar y tendrá todos los datos.

Otro método que funcionaría es tomar programáticamente la información de la entidad individual utilizando el punto final de la entidad. En la respuesta con formato HTML de arriba, el atributo OBJECTID es en realidad un hipervínculo a los atributos solo para esa característica . La URL REST termina con el OBJECTID, por lo que puede aumentar eso y obtener cada respuesta en JSON para que sea más fácil de analizar.

NOTA: algunas de estas características / enlaces solo son aplicables a los puntos finales REST de ArcGIS Server 10.1.

wwnick
fuente
3
+1 A veces, los ObjectIDs no son secuenciales (como con ArcSDE), por lo que quizás sería una solución más general la return IDs onlyque devuelve todos los 58919 identificadores.
Kirk Kuykendall el
Buen punto, también es bueno tener en cuenta que esto no está expuesto de la misma manera para los servicios de mapas en mosaico.
wwnick
@wwnick dijiste que "toma cada respuesta en JSON" cuando intentas obtener datos por ID de objeto. Pero en este caso, el formato de datos es "pjson" o "json", pero ¿cómo convertir estos dos formatos en shapefil u otros formatos de datos geográficos comunes y cuál es el más fácil?
SIslam
Me gustaría utilizar OGR para convertir a cualquier formato JSON que necesita.
wwnick
9

Siempre me encuentro en situaciones en las que necesito exportar todos los datos de un servicio de mapas a un archivo de forma. Aquí hay una utilidad muy fácil de usar que exportará todas las funciones de un servicio y las guardará como un shapefile y geojson si lo necesita. Necesitará tener o instalar node.js.

https://github.com/tannerjt/AGStoShapefile

Una vez que haya colocado los archivos en su sistema, simplemente navegue a la carpeta, agregue su servicio de mapas al archivo services.txt y ejecútelo desde la línea de comandos:

node AGStoSHP.txt services.txt ./output/

Asegúrese de poner una tubería (|) en su archivo services.txt para agregar un nombre a su servicio.

Espero que esto ayude a otros que necesitan esta funcionalidad.

JOSHT
fuente
Esta respuesta es idéntica a la publicada en gis.stackexchange.com/questions/98485/… Las respuestas idénticas generalmente significan que las preguntas a las que se aplican deben ser duplicadas. Si ese es el caso, márquelos como tales.
PolyGeo
Gracias, marqué la otra pregunta como duplicada. Se les pregunta de diferentes maneras, pero básicamente lo mismo.
jOshT
4

Descargue los datos almacenados en un ArcGIS REST MapServer capa por capa utilizando la línea de comando y el paquete Python pyesridump .

Comando de ejemplo:

esri2geojson http://gis.naperville.il.us/arcgis/rest/services/OpenData/OpenDataMapService/MapServer/4 naperville_parking_lots_122417.geojson
stevevance
fuente
¿Puedes elaborar más sobre este método?
NULL.Dude
1
@ Geo.Dude Para usar el comando que comienza con "esri2geojson", necesitará instalar el paquete Python llamado "pyesridump" a través de la línea de comando. Después de instalarlo, puede copiar y pegar el comando que comienza con "esri2geojson" en su línea de comando (en una Mac puede usar la aplicación Terminal integrada) y presione la tecla Intro para ejecutar el comando.
stevevance
0

Tuve que hacer esto recientemente y este fue mi mejor intento hasta ahora. Originalmente estaba tratando de hacer un "objectid non in {}".format(ids)where ids sería una tupla de objectid recopilados, pero la url no devolvería ningún dato, debe haber un límite sobre cuánto tiempo puede ser la cadena de cláusula where. parte de este código está codificado y si los identificadores no son secuenciales, es probable que este script no funcione. pero de todos modos espero que esto ayude a guiar

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")
ziggy
fuente