Baixar conjunto de dados do serviço ArcGIS REST

Respostas:

27

Esse serviço de mapa é um serviço de Mapa Dinâmico do ArcGIS Server que normalmente retorna apenas imagens e resultados de consultas específicas, como um WMS. Alguns serviços de imagem do ArcGIS Server permitem o download de dados, mas esse não é um deles.

Você pode obter as informações que procura através da operação de consulta, mas serão necessárias várias consultas, pois o limite máximo de retorno de registro neste serviço é 1000 e existem mais de 58000 registros somente na camada v14.

Para enviar consultas, vá para o ponto final da camada, role para baixo até as operações suportadas e clique em Consulta . Para encontrar o número total de registros, digite 1 = 1 no campo Onde e selecione Verdadeiro apenas para contagem de retorno , se parece com 58919 registros. Ele retornará apenas 1000 registros por vez, portanto, você precisará emitir 59 consultas para obter todos os registros. Parece mais fácil filtrar por OBJECTID, portanto, a primeira consulta seria WHERE OBJECTID <1000, Out Fields = *, Geometria de retorno = TRUE, Contagem de retorno = False e Format é HTML . O serviço retorna todos os recursos de 1 a 999 e seus atributos. Você pode alterar o formato de saída para KMZ e converter para o formato desejado posteriormente, percorrer e você terá todos os dados.

Outro método que funcionaria é pegar programaticamente as informações individuais do recurso usando o ponto final do recurso. Na resposta formatada em HTML acima, o atributo OBJECTID é realmente um hiperlink para os atributos desse recurso . A URL REST termina com OBJECTID, para que você possa incrementá-la e capturar cada resposta no JSON para facilitar a análise.

NOTA - alguns desses recursos / links são aplicáveis ​​apenas aos terminais REST do ArcGIS Server 10.1.

wwnick
fonte
3
+1 Às vezes, embora ObjectIDs não sejam seqüenciais (como no ArcSDE), talvez uma solução mais geral seja a return IDs onlyque retorne todos os 58919 IDs.
Kirk Kuykendall
Bom ponto, também é bom notar que isso não é exposto da mesma maneira para serviços de mapa lado a lado.
Wwnick 7/11
@wwnick você disse que "pegue cada resposta em JSON" quando tentar obter dados por ID do objeto. Mas, neste caso, o formato de dados é "pjson" ou "json", mas como converter esses dois formatos em shapefil ou outro formato comum de dados geográficos e qual é o mais fácil?
SIslam
Eu usaria o OGR para converter json para qualquer formato que você precisar.
Wwnick 26/05
9

Eu sempre me encontro em situações em que preciso exportar todos os dados de um Serviço de Mapa para um shapefile. Aqui está um utilitário muito fácil de usar que exportará todos os recursos de um serviço e os salvará como shapefile e geojson, se necessário. Você precisará ter ou instalar o node.js.

https://github.com/tannerjt/AGStoShapefile

Depois de colocar os arquivos no seu sistema, basta navegar para a pasta, adicionar seu serviço de mapa ao arquivo services.txt e executar na linha de comando:

node AGStoSHP.txt services.txt ./output/

Coloque um canal (|) no arquivo services.txt para adicionar um nome ao seu serviço.

Espero que isso ajude outras pessoas que precisam dessa funcionalidade.

jOshT
fonte
Essa resposta é idêntica à postada em gis.stackexchange.com/questions/98485/… Respostas idênticas geralmente significam que as perguntas às quais estão sendo aplicadas devem ser duplicadas. Se for esse o caso, sinalize-os como tal.
PolyGeo
Obrigado, sinalizei a outra pergunta como duplicada. Eles são solicitados de maneiras diferentes, mas basicamente iguais.
jOshT
4

Faça o download dos dados armazenados em um ArcGIS REST MapServer uma camada de cada vez, usando a linha de comando e o pacote Python pyesridump .

Comando de exemplo:

esri2geojson http://gis.naperville.il.us/arcgis/rest/services/OpenData/OpenDataMapService/MapServer/4 naperville_parking_lots_122417.geojson
stevevance
fonte
você pode elaborar mais sobre esse método?
precisa saber é o seguinte
1
@ Geo.Dude Para usar o comando que começa com "esri2geojson", você precisará instalar o pacote Python chamado "pyesridump" através da linha de comando. Após a instalação, você pode copiar e colar o comando que começa com "esri2geojson" em sua linha de comando (em um Mac, você pode usar o aplicativo Terminal interno) e pressionar a tecla Enter para executar o comando.
stevevance
0

Eu tive que fazer isso recentemente e essa foi a minha melhor tentativa até agora. Eu estava originalmente tentando fazer um "objectid non in {}".format(ids)where ids seria uma tupla de IDs de objetos coletados, mas o URL não retornaria nenhum dado; deve haver um limite de quanto tempo a string da cláusula where pode estar. parte desse código é codificado e, se os IDs não forem seqüenciais, esse script provavelmente não funcionará. de qualquer forma, espero que isso ajude 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
fonte