Neste post, vamos demonstrar como você - como um Cientista de Dados Espaciais - pode usar R<\/A> para acessar um Serviço ArcGIS REST, respondendo à seguinte pergunta: "Existem ferrovias abandonadas na Flórida?<\/EM>".<\/P><\/P>O ArcGIS Living Atlas of the World<\/A> oferece um conjunto de dados interessante com ferrovias nos Estados Unidos: USA Railroads<\/A>. Seguindo a URL do Serviço, podemos acessar a página de consulta desta Camada de Feição<\/A>.<\/P><\/P>O script R abaixo mostra como você pode rapidamente criar um mapa interativo para responder nossa pergunta. Por favor, role para baixo para uma pequena explicação...<\/P>library<SPAN class="punctuation token">(<\/SPAN>httr<SPAN class="punctuation token">)<\/SPAN> library<SPAN class="punctuation token">(<\/SPAN>sf<SPAN class="punctuation token">)<\/SPAN> library<SPAN class="punctuation token">(<\/SPAN>tmap<SPAN class="punctuation token">)<\/SPAN> url <SPAN class="operator token"><<\/SPAN><SPAN class="operator token">-<\/SPAN> parse_url<SPAN class="punctuation token">(<\/SPAN><SPAN class="string token">"https:\/\/services.arcgis.com\/P3ePLMYs2RVChkJx\/arcgis\/rest\/services"<SPAN class="punctuation token">)<\/SPAN> url$path <SPAN class="operator token"><<\/SPAN><SPAN class="operator token">-<\/SPAN> paste<SPAN class="punctuation token">(<\/SPAN>url$path<SPAN class="punctuation token">,<\/SPAN> <SPAN class="string token">"USA_Railroads_1\/FeatureServer\/0\/query"<SPAN class="punctuation token">,<\/SPAN> sep <SPAN class="operator token">=<\/SPAN> <SPAN class="string token">"\/<SPan class=\"punctuation token\">)<\/<SPan></Span> url$query <span class=\"operator token\"><<\/<span class=\"operator token\">-</span> list<span class=\"punctuation token\">(</span>where <span class=\"operator token\">=<\/<span class=\"string token\">STATE = 'FL'</span>, outFields <span class=\"operator token\">=<\/<span class=\"string token\">*</span>, returnGeometry <span class=\"operator token\">=<\/<span class=\"string token\">true</span>, f <span class=\"operator token\">=<\/<span class=\"string token\">geojson</span>) request <span class=\"operator token\"><<\/<span class=\"operator token\">-</span> build_url<span class=\"punctuation token\">(</span>url<span class=\"punctuation token\">)</span> Florida_Railroads <span class=\"operator token\"><<\/<span class=\"operator token\">-</span> st_read<span class=\"punctuation token\">(</span>request<span class=\"punctuation token\">)</span> tmap_mode<span class=\"punctuation token\">(</span>mode <span class=\"operator token\">=<</span> <span class=\"string token\">view</span><span class=\"punctuation token\">)</span> tm_shape<span class=\"punctuation token\">(</span>Florida_Railroads<span class=\"punctuation token\">)</span><span class=\"operator token\">+</span>tm_lines<span class=\"punctuation token\">(</span>col<span class=\"operator token\">=<</span><span class=\"string token\">NET_DESC</span>, palette <span class=\"operator token\">=<</span> <span class=\"string token\">Set1</span>, lwd <span class=\"operator token\">=<</span> 5<span class=\"punctuation token\">)</span><SPan cLass=22line-numbers-rows22><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></SPan><SPan></SPan><SPan></SPan><SPan></SPan></Span><\/P>No RStudio<\/A>, começamos carregando os 3 pacotes R seguintes:<\/P>httr<\/STRONG><\/SPAN> - para nos ajudar a construir a URL da consulta<\/LI>sf<\/STRONG><\/SPAN> - para ler os dados espaciais<\/LI>tmap<\/STRONG><\/SPAN> - para criar o mapa interativo, baseado na biblioteca JavaScript Leaflet<\/A><\/LI><\/UL><\/P>Nós analisamos a URL para criar uma lista onde podemos adicionar todos os parâmetros da nossa consulta - where<\/SPAN>, outFields<\/SPAN>, returnGeometry<\/SPAN>, e f<\/SPAN> - com seus valores apropriados. Assim que a lista está populada usamos a função build_url()<\/SPAN> para criar uma requisição devidamente codificada. Esta requisição é então passada para a função st_read()<\/SPAN>, que popula o objeto Florida_Railroads<\/SPAN>. Este objeto se torna tanto um objeto simple features quanto um data frame, ou seja, contém tanto a geometria quanto os valores dos atributos das ferrovias.<\/P><\\/P\\n<P>No print da tela abaixo podemos ver que o número total de registros retornados é 3305, o que está bem além do limite de registros (maxRecordCount) (1000) para esta Camada de Feição. A biblioteca GDAL, usada pela função st_read(), no pacote sf, fornece paginação automática. Legal, não é?<\\/P\\n<P\\/><\\/P\\n<P\\/>Com as duas últimas linhas do script criamos o mapa interativo no Visualizador do RStudio.<\\/P\\n<P\\/><\\/P\\n<P\\/>Então, a resposta para nossa pergunta é: "Sim, existem várias ferrovias abandonadas na Flórida." Essas linhas abandonadas estão marcadas em vermelho no mapa mostrado no print da tela abaixo.<\\/P\\n<P\\/>
<\/P>
O script R abaixo mostra como você pode rapidamente criar um mapa interativo para responder nossa pergunta. Por favor, role para baixo para uma pequena explicação...<\/P>
library<SPAN class="punctuation token">(<\/SPAN>httr<SPAN class="punctuation token">)<\/SPAN> library<SPAN class="punctuation token">(<\/SPAN>sf<SPAN class="punctuation token">)<\/SPAN> library<SPAN class="punctuation token">(<\/SPAN>tmap<SPAN class="punctuation token">)<\/SPAN> url <SPAN class="operator token"><<\/SPAN><SPAN class="operator token">-<\/SPAN> parse_url<SPAN class="punctuation token">(<\/SPAN><SPAN class="string token">"https:\/\/services.arcgis.com\/P3ePLMYs2RVChkJx\/arcgis\/rest\/services"<SPAN class="punctuation token">)<\/SPAN> url$path <SPAN class="operator token"><<\/SPAN><SPAN class="operator token">-<\/SPAN> paste<SPAN class="punctuation token">(<\/SPAN>url$path<SPAN class="punctuation token">,<\/SPAN> <SPAN class="string token">"USA_Railroads_1\/FeatureServer\/0\/query"<SPAN class="punctuation token">,<\/SPAN> sep <SPAN class="operator token">=<\/SPAN> <SPAN class="string token">"\/<SPan class=\"punctuation token\">)<\/<SPan></Span> url$query <span class=\"operator token\"><<\/<span class=\"operator token\">-</span> list<span class=\"punctuation token\">(</span>where <span class=\"operator token\">=<\/<span class=\"string token\">STATE = 'FL'</span>, outFields <span class=\"operator token\">=<\/<span class=\"string token\">*</span>, returnGeometry <span class=\"operator token\">=<\/<span class=\"string token\">true</span>, f <span class=\"operator token\">=<\/<span class=\"string token\">geojson</span>) request <span class=\"operator token\"><<\/<span class=\"operator token\">-</span> build_url<span class=\"punctuation token\">(</span>url<span class=\"punctuation token\">)</span> Florida_Railroads <span class=\"operator token\"><<\/<span class=\"operator token\">-</span> st_read<span class=\"punctuation token\">(</span>request<span class=\"punctuation token\">)</span> tmap_mode<span class=\"punctuation token\">(</span>mode <span class=\"operator token\">=<</span> <span class=\"string token\">view</span><span class=\"punctuation token\">)</span> tm_shape<span class=\"punctuation token\">(</span>Florida_Railroads<span class=\"punctuation token\">)</span><span class=\"operator token\">+</span>tm_lines<span class=\"punctuation token\">(</span>col<span class=\"operator token\">=<</span><span class=\"string token\">NET_DESC</span>, palette <span class=\"operator token\">=<</span> <span class=\"string token\">Set1</span>, lwd <span class=\"operator token\">=<</span> 5<span class=\"punctuation token\">)</span><SPan cLass=22line-numbers-rows22><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></SPan><SPan></SPan><SPan></SPan><SPan></SPan></Span>
No
Nós analisamos a URL para criar uma lista onde podemos adicionar todos os parâmetros da nossa consulta - where<\/SPAN>, outFields<\/SPAN>, returnGeometry<\/SPAN>, e f<\/SPAN> - com seus valores apropriados. Assim que a lista está populada usamos a função build_url()<\/SPAN> para criar uma requisição devidamente codificada. Esta requisição é então passada para a função st_read()<\/SPAN>, que popula o objeto Florida_Railroads<\/SPAN>. Este objeto se torna tanto um objeto simple features quanto um data frame, ou seja, contém tanto a geometria quanto os valores dos atributos das ferrovias.<\/P><\\/P\\n<P>No print da tela abaixo podemos ver que o número total de registros retornados é 3305, o que está bem além do limite de registros (maxRecordCount) (1000) para esta Camada de Feição. A biblioteca GDAL, usada pela função st_read(), no pacote sf, fornece paginação automática. Legal, não é?<\\/P\\n<P\\/><\\/P\\n<P\\/>Com as duas últimas linhas do script criamos o mapa interativo no Visualizador do RStudio.<\\/P\\n<P\\/><\\/P\\n<P\\/>Então, a resposta para nossa pergunta é: "Sim, existem várias ferrovias abandonadas na Flórida." Essas linhas abandonadas estão marcadas em vermelho no mapa mostrado no print da tela abaixo.<\\/P\\n<P\\/>
Hi @Egge-Jan_Pollé,
Thank you for the example. I am not familiar with the URL construction. What if I need to query multiple values of a field. In your example, would that be possible to set where = STATE = 'FL' and 'WA' and 'OR'?
The expression where = STATE = c('FL', 'WA','OR') doesn't work either.
Could you help? Thanks!
Yuan Grund
Hi @Egge-Jan_Pollé
Following the question already asked by @YuanGrund , I have the same doubt, but in outFields, c("Var1", "Var2", "Var3") does not work.
Thank you.
EDITED & SOLVED:
Just use: outFields = "Var1, Var2, Var3"
What if we want to access a private survey of our organization, I tried inputing my credentials ins url$username and url$password, but it didn't worked out at all. Here's my code and my output, censoring my sensible information with "~~~"
library(httr)library(sf)library(tmap)
url <- parse_url("https://services6.arcgis.com/~~~~~~~/arcgis/rest/services")url$path <- paste(url$path,"~~~~~~~~/FeatureServer/0/query",sep = "/")url$username <- '~~~USERNAME~~~'url$password <- '~~~PASSWORD~~~'url$query <- list(where = 'objectid = "*"',outFields = "*",returnGeometry = "true",f = "geojson")request <- build_url(url)test <- st_read(request)
https://services6.arcgis.com/~~~~~~~/arcgis/rest/services/~~~~~~~~/FeatureServer/0/query?where=objectid = "*"&outFields=*&returnGeometry=true&f=geojson";Check connection parameters.
Should I try another library rather than httr?
Membros conectados podem postar, seguir atualizações e mais. Novo aqui? Registre uma conta gratuita.
Find useful guides, FAQs, and documents to help you navigate and make the most of Esri Community.