Dans cet article, nous allons démontrer comment vous - en tant que Spatial Data Scientist - pouvez utiliser R<\/A> pour accéder à un service ArcGIS REST, en répondant à la question suivante : "Y a-t-il des chemins de fer abandonnés en Floride ?<\/EM>".<\/P><\/P>L'ArcGIS Living Atlas of the World<\/A> offre un ensemble de données intéressant avec les chemins de fer aux États-Unis : USA Railroads<\/A>. En suivant l'URL du Service, nous pouvons accéder à la page de requête de cette couche d'entités (Feature Layer)<\/A>.<\/P><\/P>Le script R ci-dessous montre comment vous pouvez rapidement créer une carte interactive pour répondre à notre question. Veuillez faire défiler vers le bas pour une petite explication...<\/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><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><SPAN class="punctuation token">,<\/SPAN> sep <SPAN class="operator token">=<\/SPAN> <SPAN class="string token">"\/<\/span><span class=\"punctuation token\">)<\/<span> url$query <span class=\"operator token\"><<\/<span><span class=\"operator token\">-<\/<span> list<span class=\"punctuation token\">(<\/<span>where <span class=\"operator token\">=<\/<span> <span class=\"string token\">"STATE = 'FL'"<\/<span>, outFields <span class=\"operator token\">=<\/<span> <span class=\"string token\">"*"<\/<span>, returnGeometry <span class=\"operator token\">=<\/<span> <span class=\"string token\">"true"<\/<span>, f <span class=\"operator token\">=<\/<span> <span class=\"string token\">"geojson"<\/<span>) request <span class=\"operator token\"><<\/<span><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><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>) 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\">=< <spanclass=22stringtoken22>22Set122</spana>, lwd <spanaclass=22numbertoken22>5</spana>)<SPANAclass=22line-numbers-rows22><SPANA><EMOJI_1></SPANA><SPANA><EMOJI_2></SPANA><SPANA><EMOJI_3></SPANA><SPANA><EMOJI_4></SPANA><SPANA><EMOJI_5></SPANA><SPANA><EMOJI_6></SPANA><SPANA><EMOJI_7></SPANA><SPANA><EMOJI_8></SPANA><SPANA><EMOJI_9></SPANA><SPANA><EMOJI_10></SPANA><SPANA><EMOJI_11></SPANA><SPANA><EMOJI_12></SPANA><SPANA><EMOJI_13></SPANA><SPANA><EMOJI_14></SPANA><SPANA><EMOJI_15></SPANA><SPANA><EMOJI_16></SPANA></SPANA><\/P>Dans RStudio<\/A>, nous commençons par charger les 3 packages R suivants :<\/P>httr<\/STRONG> - pour nous aider à construire l'URL de requête<\/LI>sf<\/STRONG> - pour lire les données spatiales<\/LI>tmap<\/STRONG> - pour créer la carte interactive, basée sur la bibliothèque JavaScript Leaflet<\/A><\/LI>Nous analysons l'URL pour créer une liste où nous pouvons ajouter tous les paramètres de notre requête - where<\/SPAN>, outFields<\/SPAN>, returnGeometry<\/SPAN> et f<\/SPAN> - avec leurs valeurs appropriées. Dès que la liste est remplie, nous utilisons la fonction build_url()<\/SPAN> pour créer une requête correctement encodée. Cette requête est ensuite passée à la fonction st_read()<\/SPAN> pour remplir Florida_Railroads<\/SPAN>. Ce dernier devient à la fois un objet simple features et un data frame, c'est-à-dire qu'il contient à la fois la géométrie et les valeurs attributaires des chemins de fer.Dans la capture d'écran ci-dessous, on peut voir que le nombre total d'enregistrements retournés est de 3305, ce qui dépasse largement le maxRecordCount (1000) pour cette couche d'entités. La bibliothèque GDAL, utilisée par la fonction st_read() dans le package sf, fournit une pagination automatique. Sympa, n'est-ce pas ?
<\/P>
Le script R ci-dessous montre comment vous pouvez rapidement créer une carte interactive pour répondre à notre question. Veuillez faire défiler vers le bas pour une petite explication...<\/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><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><SPAN class="punctuation token">,<\/SPAN> sep <SPAN class="operator token">=<\/SPAN> <SPAN class="string token">"\/<\/span><span class=\"punctuation token\">)<\/<span> url$query <span class=\"operator token\"><<\/<span><span class=\"operator token\">-<\/<span> list<span class=\"punctuation token\">(<\/<span>where <span class=\"operator token\">=<\/<span> <span class=\"string token\">"STATE = 'FL'"<\/<span>, outFields <span class=\"operator token\">=<\/<span> <span class=\"string token\">"*"<\/<span>, returnGeometry <span class=\"operator token\">=<\/<span> <span class=\"string token\">"true"<\/<span>, f <span class=\"operator token\">=<\/<span> <span class=\"string token\">"geojson"<\/<span>) request <span class=\"operator token\"><<\/<span><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><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>) 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\">=< <spanclass=22stringtoken22>22Set122</spana>, lwd <spanaclass=22numbertoken22>5</spana>)<SPANAclass=22line-numbers-rows22><SPANA><EMOJI_1></SPANA><SPANA><EMOJI_2></SPANA><SPANA><EMOJI_3></SPANA><SPANA><EMOJI_4></SPANA><SPANA><EMOJI_5></SPANA><SPANA><EMOJI_6></SPANA><SPANA><EMOJI_7></SPANA><SPANA><EMOJI_8></SPANA><SPANA><EMOJI_9></SPANA><SPANA><EMOJI_10></SPANA><SPANA><EMOJI_11></SPANA><SPANA><EMOJI_12></SPANA><SPANA><EMOJI_13></SPANA><SPANA><EMOJI_14></SPANA><SPANA><EMOJI_15></SPANA><SPANA><EMOJI_16></SPANA></SPANA>
Dans
Avec les deux dernières lignes du script, nous créons la carte interactive dans le Viewer de RStudio.
Donc, la réponse à notre question est : "Oui, il y a pas mal de chemins de fer abandonnés en Floride." Ces lignes abandonnées sont marquées en rouge sur la carte dans la capture d'écran ci-dessous.
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?
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.