De nombreuses organisations publient des services OGC WFS comme une option pour la fourniture de données, soit au grand public, soit à un public restreint. Souvent cependant, ces services sont destinés à la cartographie à grande échelle, comme au sein d'une seule municipalité, et le téléchargement en masse à l'échelle nationale n'est pas pris en charge - soit une taille maximale de collection d'entités par requête est définie sur le serveur, soit la pagination des réponses n'est pas prise en charge, donc un client prêt à l'emploi ne va pas fournir un ensemble de données complet. Parfois, bien que ces restrictions ne soient pas présentes, assembler et livrer une requête pour une grande collection d'entités dépasse la capacité du serveur ou des paramètres réseau (par conception), ou l'application cliente ne prend pas en charge la pagination (divulgation complète, la pagination des réponses WFS 2.0.0 arrive dans le cœur d'ArcGIS Pro dans une future version ; l'extension Data Interoperability prend déjà en charge la pagination WFS 2.0.0 si le serveur fournit des URL suivantes/précédentes).<\/P>
<\/P>
Ce blog porte sur l'utilisation de ArcGIS Data Interoperability<\/STRONG> pour contourner ces limitations afin d'obtenir un téléchargement en masse répétable des données WFS<\/STRONG> à n'importe quelle échelle. Vous aurez besoin de solides compétences en Data Interoperability (ou FME) pour mettre en œuvre ce flux de travail, ou être prêt à apprendre à partir du contenu du téléchargement du blog.<\/P><\/P>À ce stade, je dois vous montrer une carte sinon vous allez faire autre chose, alors je vous présente le sujet du jour - la Norvège !<\/P><\/P><\/P><\/P>Il est nécessaire d'utiliser un exemple réel, et les gens de GeoNorge ont d'excellents services WFS publics qui me permettent de montrer les problèmes, donc ce sera la Norvège. En parcourant leur site, j'ai choisi un service de réseau routier. Voici comment y accéder vous-même, tout en apprenant éventuellement un peu de norvégien. Voici GeoNorge<\/A>, (n'utilisez pas '\/en' si votre norvégien est suffisant) cliquez sur Aller au catalogue de cartes<\/A>, puis dans le panneau de sélection à gauche choisissez Type = Service, Sujet = Transport, Forme de distribution = Service WFS, puis parmi les services disponibles cliquez sur ELF Road Transport Network<\/A>. Faites défiler vers le bas et vous verrez : URL Get Capabilities : <\/STRONG>https:\/\/wfs.geonorge.no\/skwms1\/wfs.inspire-tn-ro?request=GetCapabilities&service=WFS<\/A>.<\/P><\/DIV>Si vous ne connaissez pas les normes OGC, soyez reconnaissant, c'est notre travail ! L'URL ci-dessus est un modèle typique, le document XML retourné annonce ce que le service WFS peut faire. Vous savez que je vais vous faire cliquer sur l'URL ci-dessus et<\/STRONG> inspecter la réponse, mais avant l'excitation du XML nous allons sortir des sentiers battus ici et commencer à mieux comprendre le problème.<\/DIV><\/DIV>Voici une carte de 50 commerces alimentaires situés à moins de 500 m à pied du Palais Royal à Oslo. Je détecte un schéma où il faut marcher au nord ou au sud du palais pour déjeuner, ce qui est intéressant, peut-être dû au fait qu'il faut traverser une route principale qui coupe la zone, mais mon point principal est que le centre-ville d'Oslo a beaucoup de routes longeables à pied, alors que dans le cercle arctique - pas tellement (pas de carte, mais faites-moi confiance). Nous allons avoir besoin d'une méthode pour lire le service WFS de transport routier par morceaux afin de ne pas demander plus que la limite de réponse du service dans les villes et ne pas faire de requêtes inutiles dans les zones avec peu de routes. Nous allons concevoir une stratégie de lecture WFS en tuiles.<\/STRONG><\/DIV><\/DIV><\/DIV><\/DIV>D'accord maintenant<\/EM> cliquez sur l'URL GetCapabilities< \/A> et cherchez ces éléments :<\/DIV><\/DIV>Nous ne pouvons pas< \/STRONG> demander des pages :<\/DIV>< \/DIV>< \/DIV>Nous pouvons seulement obtenir< \/STRONG> 10000< \/STRONG> entités à la fois :< \/DIV>< \/DIV>< \/DIV>Nous pouvons récupérer des types d'entités tn-ro:RoadLink< \/STRONG> dans une grande variété de systèmes de coordonnées sur une vaste zone :< \/DIV>< \/DIV>< \/DIV>Nous pouvons demander des entités dans une BBox (Boîte Englobante)< \/STRONG>:< \/DIV></ DIV >< DIV >< IMG __jive_id = "472663" class = "image-9 j-img-centered jive-image" src = "https://us.v-cdn.net/6038851/uploads/legacyfs/online/472663_pastedImage_1.png" style = "display: block; margin-left: auto; margin-right: auto;" / >< / DIV >< DIV >< / DIV >< DIV > Maintenant pour un exercice. Ouvrez l'application Workbench depuis le ruban Analyse (Data Interoperability devra être installé et licencié) et ajoutez un Lecteur WFS avec ces paramètres (URL GetCapabilities, Version WFS 2.0.0, type d'entité RoadLink, sans MaxFeatures). Connectez un journal au lecteur, il n'est pas nécessaire d'écrire quoi que ce soit.< / DIV >< DIV >< / DIV >< DIV >< IMG __jive_id = "472660" class = "image-6 j-img-centered jive-image" src = "https://us.v-cdn.net/6038851/uploads/legacyfs/online/472660_pastedImage_1.png" style = "display: block; margin-left: auto; margin-right: auto;" / >< / DIV >< DIV >< / DIV >< DIV >< IMG __jive_id = "472661" class = "image-7 j-img-centered jive-image" src = "https://us.v-cdn.net/6038851/uploads/legacyfs/online/472661_pastedImage_2.png" style = "display: block; margin-left: auto; margin-right: auto;" / >< / DIV >< DIV >< / DIV >< DIV > Exécutez l'espace de travail, vous verrez que cette URL</ A > est générée et vous obtiendrez un téléchargement contenant 10000 entités.< / DIV >< DIV >< / DIV >< DIV > Maintenant ajoutez l'URL dans votre navigateur puis modifiez l'URL pour ajouter un paramètre '< STRONG >resultType=hits</ STRONG >'.& nbsp ; C'est une requête spéciale pour compter le nombre d'entités disponibles dans le service, exécutez l'< A href = "http://wfs.geonorge.no/skwms1/wfs.inspire-tn-ro?SERVICE=WFS&VERSION=2.0.0&REQUEST=GetFeature&TYPENAMES=tn-ro%3ARoadLink&NAMESPACES=xmlns%28tn-ro%2Chttp%3A%2F%2Finspire.ec.europa.eu%2Fschemas%2Ftn-ro%2F4.0%29&OUTPUTFORMAT=application%2Fgml%2Bxml%3B%20version%3D3.2&resultType=hits" rel = "nofollow noopener noreferrer">URL modifiée</ A > dans votre navigateur.& nbsp ; Vous obtiendrez une réponse comme celle-ci :< / DIV >< DIV >< / DIV >< DIV >< IMG __jive_id = "472662" class = "jive-image image-8 j-img-centered j-img-original" src = "https://us.v-cdn.net/6038851/uploads/legacyfs/online/472662_pastedImage_1.png" style = "display: block; margin-left: auto; margin-right: auto;" / >< / DIV >< DIV >< / DIV >< DIV > Regardez la propriété numberMatched -& nbsp ; < STRONG >1 976 423 entités Road Link sont disponibles.< / STRONG > < / DIV >< DIV >< / DIV >< DIV >< / DIV >< DIV > La Norvège a une superficie terrestre d'environ 385 000 kilomètres carrés, donc en moyenne environ 5 entités road link par kilomètre carré, et en moyenne environ 2000 kilomètres carrés contiendront environ 10 000 road links, la limite du service WFS, soit approximativement un carré de 45 km.& nbsp ; Ce sera une zone beaucoup plus grande dans le nord du pays pour contenir 10 000 entités.& nbsp ; En utilisant la méthode scientifique consistant à choisir un nombre pratique sorti du néant qui est du bon ordre de grandeur, mon point de départ pour un schéma de tuilage pour lecture WFS était un < STRONG >filet poisson carré de 100 km< / STRONG > , créé avec l'outil géotraitement < STRONG >Create Fishnet< / STRONG > (les cellules qui n'intersectent pas la terre sont supprimées, et je suis parti avec la projection ETRS 1989 UTM Zone 33N, qui est EPSG :25833 dans les propriétés du service) :< / DIV >< DIV >< / DIV >< DIV >< IMG __jive_id = "472776" class = "j-img-centered jive-image image-10" src = "https://us.v-cdn.net/6038851/uploads/legacyfs/online/472776_pastedImage_1.jpg" style = "display: block; margin-left: auto; margin-right: auto;" / >< / DIV >< DIV >< / DIV >< DIV > Remarquez que j'ai ajouté quelques champs (XMin,YMin,XMax,YMax,RoadCount) au filet poisson et défini les valeurs initiales pour les champs des limites coordonnées (en utilisant des extraits Python - ceux-ci sont dans le téléchargement du blog).& nbsp ; Ces limites seront utilisées comme entrées paramétriques Bounding Box dans les requêtes WFS.& nbsp ; Maintenant j'ai besoin d'un flux de travail pour affiner le filet poisson afin que les cellules soient subdivisées progressivement pour qu'il y ait moins de 10 000 entités road link dans chacune.& nbsp ; D'abord je dois comprendre la méthodologie pour lire le service WFS dans une étendue....< / DIV >< DIV >< / DIV >< DIV > Si vous ouvrez Workbench et glissez-déposez < STRONG >BasicGetFeatureWithBBOX.fmw< / STRONG > depuis le téléchargement du blog vous verrez un lecteur WFS avec les propriétés dont j'avais besoin pour inspecter une URL GetFeature.& nbsp ; L'espace de travail ressemble à ceci :< / DIV >< DIV >< / DIV >< DIV >< IMG __jive_id = "472804" class="image-13 j-img-centered jive-image" src="https:\/\/us.v-cdn.net\/6038851\/uploads\/legacyfs\/online\/472804_pastedImage_1.png" style="display: block; margin-left: auto; margin-right: auto;" \/><\/DIV><\/DIV>Sous le lecteur, vous pouvez voir comment j'ai reproduit l'URL GetFeature dans un HTTPCaller mais en paramétrant les valeurs BBOX. J'ai utilisé une étendue de cellule fishnet contenant la ville de Trondheim. Le format de téléchargement est GML J'ai utilisé l'outil de géotraitement Quick Import (disponible avec Data Interoperability) pour traduire le GML en une géodatabase fichier. Voici 10 000 segments routiers autour de Trondheim:<\/DIV><\/DIV><\/DIV><\/DIV><\/DIV>Maintenant, j'ai les éléments constitutifs d'un lecteur WFS en tuiles. Et le voici ! ReadWFSFeatures.fmw<\/STRONG>:<\/DIV><\/DIV><\/DIV><\/DIV><\/DIV>L'outil Spatial ETL lit les entités RoadLink dans des cellules fishnet sélectionnées par une clause WHERE, voici la première passe lisant les entités dans toutes les cellules:<\/DIV><\/DIV><\/DIV><\/DIV>Je peux voir que toutes les cellules de 100 km n'intersectent pas des routes - celles que vous pouvez voir sélectionnées dans la couche fishnet - donc elles peuvent être supprimées. Maintenant commence le travail d'affinement du fishnet.<\/DIV><\/DIV>Le flux de travail itératif est le suivant (soyez très prudent !) :<\/DIV>Exécutez ReadWFSFeatures.fmw<\/STRONG> avec une clause WHERE<\/STRONG> sélectionnant la plus petite taille de cellule (initialement Shape_Length = 400000, puis 200000 lorsque ces cellules sont créées, puis 100000 lorsque celles-ci sont créées dans une étape ultérieure ci-dessous...<\/STRONG>)<\/LI>Ajoutez la classe d'entités RoadLink<\/STRONG> en sortie à votre carte<\/LI>Exécutez RoadCount.py<\/STRONG> dans la fenêtre Python pour remplir RoadCount<\/STRONG> dans NO_Fishnet<\/STRONG><\/LI>Sélectionnez les entités NO_Fishnet<\/STRONG> avec RoadCount >= 9000<\/STRONG> (en dessous de 10 000 pour permettre la construction de routes)<\/LI>S'il n'y a aucune entité NO_Fishnet<\/STRONG> sélectionnée alors ARRÊTEZ - vous avez fini de créer le fishnet<\/STRONG><\/LI>Exécutez MinimumBoundingFishnet<\/STRONG> pour créer un fishnet séparé avec des cellules ayant la moitié de la largeur/hauteur du minimum précédent ; il est important que la sélection sur NO_Fishnet<\/STRONG> soit toujours active<\/LI>Exécutez Delete Features<\/STRONG> sur les cellules sélectionnées NO_Fishnet<\/STRONG><\/LI>Exécutez Append<\/STRONG> pour ajouter les cellules fishnet plus petites générées à NO_Fishnet<\/STRONG>, en utilisant l'option de mappage des champs.<\/LI>Exécutez SetExtentAttributes.py<\/STRONG> dans la fenêtre Python pour recalculer les coordonnées des limites<\/LI>Supprimez la classe d'entités RoadLink<\/STRONG><\/LI>Retournez à la première étape<\/LI><\/UL><\/DIV>La première subdivision des cellules fishnet en entités carrées de 50 km avec MinimumBoundingFishnet<\/STRONG> ressemble à ceci :<\/DIV><\/DIV><\/DIV><\/DIV>Après avoir bouclé à travers le processus d'affinement du fishnet jusqu'à ce qu'aucune cellule ne contienne plus de 9 000 routes, vous pouvez exécuter ReadWFSFeatures.fmw<\/STRONG> avec une clause WHERE qui sélectionne toutes les cellules fishnet et créer la classe d'entités complète RoadLink<\/STRONG>. Enfin, exécutez RoadCount.py<\/STRONG> pour remplir NO_Fishnet<\/STRONG> avec le nombre de segments routiers qui intersectent chaque cellule. Vérifiez s'il y a des cellules avec RoadCount = 0 et si vous pensez que des routes ne seront jamais construites là-bas alors supprimez les cellules, mais il faudra être Norvégien pour porter ce jugement.<\/DIV><\/DIV>Télécharger toutes les entités a pris exactement 1h 0s et exactement 1 976 423 sont arrivées, comme annoncé par le service WFS. Voici à quoi ressemblent les données, avec les étiquettes étant le décompte final des routes :<\/DIV>
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.