Suite

Conversion d'un énorme multipolygone en polygones

Conversion d'un énorme multipolygone en polygones


J'ai un fichier de formes avec d'énormes multipolygones, avec 100 000 pièces. Quel serait le moyen le plus simple de les diviser en polygones en une seule partie ? Je recherche quelque chose comme la fonction QGIS "Multipart to singlepart", mais le fichier est trop volumineux pour que QGIS puisse le gérer. Je suppose qu'il existe probablement déjà un module Python qui peut le faire pour moi. Des conseils ?


Les fichiers de formes n'ont pas de type MultiPolygon (type = Polygon), mais ils les supportent quand même (tous les anneaux sont stockés dans un polygone = liste de polygones, regardez GDAL : ESRI Shapefile)

C'est plus facile avec Fiona et Shapely :

import fiona from shapely.geometry import shape, mapping # ouvrez le fichier MultiPolygon original avec fiona.open('multipolygons.shp') comme source : # créez le nouveau fichier : le driver et crs sont les mêmes # pour le schéma le type de géométrie est "Polygon" à la place output_schema = dict(source.schema) # faire une copie indépendante output_schema['geometry'] = "Polygon" avec fiona.open('output.shp', 'w', driver=source.driver, crs =source.crs, schema=output_schema) en sortie : # lire le fichier d'entrée pour multi dans la source : # extraire chaque entité Polygon pour poly in shape(multi['geometry']): # écrire l'entité Polygon output.write({ 'properties' : multi['properties'], 'geometry' : mapping(poly) })

de la liste de diffusion GDAL en utilisant python

import os depuis osgeo import ogr def multipoly2poly(in_lyr, out_lyr): pour in_feat in in_lyr: geom = in_feat.GetGeometryRef() if geom.GetGeometryName() == 'MULTIPOLYGON': pour geom_part dans geom: addPolygon(geom_kb().Export , out_lyr) else: addPolygon(geom.ExportToWkb(), out_lyr) def addPolygon(simplePolygon, out_lyr): featureDefn = out_lyr.GetLayerDefn() polygon = ogr.CreateGeometryFromWkb(simplePolygon).Featureneometryn(out_feat)(feogr polygon) out_lyr.CreateFeature(out_feat) print 'Polygone ajouté.' depuis osgeo import gdal gdal.UseExceptions() driver = ogr.GetDriverByName('ESRI Shapefile') in_ds = driver.Open('data/multipoly.shp', 0) in_lyr = in_ds.GetLayer() outputhp = 'data/poly. shp' si os.path.exists(outputshp): driver.DeleteDataSource(outputshp) out_ds = driver.CreateDataSource(outputshp) out_lyr = out_ds.CreateLayer('poly', geom_type=ogr.wkbPolygon) multipoly2poly(in_lyr, out_lyr

Ogr2ogr grand fichier gdb vers SQLite avertissement : "organizePolygons() a reçu un polygone avec plus de 100 parties"

J'essaie d'écrire un fichier .gdb (cela pourrait également être n'importe quel autre format, geojson, gpkg, etc.) dans une base de données Spatialite, mais cela prend un certain temps et je reçois un avertissement.

Je sais que SQLite a des paramètres par défaut faibles pour les transactions et la mémoire, c'est pourquoi j'ai ajouté les options -gt illimité et --config OGR_SQLITE_CACHE 1024 mais elles n'ont aucun effet sur la vitesse de la commande. Avec ces 2 options supprimées, cela prend le même temps.

Y a-t-il une commande dans ogr2ogr que je peux utiliser pour accélérer l'exécution, ou peut-être devrais-je passer à geopandas et utiliser une fonction élégante pour résoudre ce problème ?

Merci toute aide est appréciée!

Une réponse

L'erreur signifie que vos données source contiennent un polygone avec plus de 100 parties. Je crois que dans ce contexte, les parties signifient des anneaux, à la fois extérieurs et intérieurs. Une explication plutôt bonne peut être trouvée sur https://gdal.org/doxygen/classOGRGeometryFactory.html#a9ce97d39ca2e0dd88f415227e71b7fd5

Organisez des polygones en fonction de géométries. Analysez un ensemble d'anneaux (transmis en tant que polygones simples) et, sur la base d'une analyse géométrique, convertissez-les en un polygone avec des anneaux internes (ou un MultiPolygon s'il s'agit de plusieurs polygones) qui suivent la spécification OGC Simple Feature. Toutes les géométries d'entrée doivent être OGRPolygon/OGRCurvePolygon avec uniquement un anneau extérieur valide (au moins 4 points) et aucun anneau intérieur. Les géométries passées deviennent la responsabilité de la méthode, mais le papoPolygons "pointer array" reste la propriété de l'appelant. Pour un calcul plus rapide, un polygone est considéré comme à l'intérieur d'un autre si un seul point de son anneau externe est inclus dans l'autre. (sauf si l'option de configuration 'OGR_DEBUG_ORGANIZE_POLYGONS' est définie sur TRUE. Dans ce cas, un algorithme plus lent qui teste les relations topologiques exactes est utilisé si GEOS est disponible.) Dans les cas où un grand nombre de polygones est transmis à cette fonction, le traitement par défaut peut être vraiment lent. Vous pouvez ignorer le traitement en ajoutant METHOD=SKIP à la liste d'options (le résultat de la fonction sera un multi-polygone avec tous les polygones comme polygones de niveau supérieur) ou ne lui faire analyser que les polygones dans le sens inverse des aiguilles d'une montre en ajoutant METHOD=ONLY_CCW à la liste d'options si vous pouvez supposer que le contour des trous est défini dans le sens inverse des aiguilles d'une montre (c'est la convention par exemple dans les fichiers de formes, les géodatabases personnelles ou les géodatabases fichier). Pour FileGDB, dans la plupart des cas, mais pas toujours, une méthode plus rapide que ONLY_CCW peut être utilisée. C'est CCW_INNER_JUST_AFTER_CW_OUTER. Lors de son utilisation, les bagues intérieures sont supposées être orientées dans le sens inverse des aiguilles d'une montre et suivant immédiatement la bague extérieure (orientée dans le sens des aiguilles d'une montre) à laquelle elles appartiennent. Si cette hypothèse n'est pas remplie, une bague intérieure peut être attachée à la mauvaise bague extérieure, cette méthode doit donc être utilisée avec précaution. Si l'option de configuration OGR_ORGANIZE_POLYGONS est définie, sa valeur écrasera la valeur de l'option METHOD de papszOptions (utile pour modifier le comportement du pilote shapefile)

Je ne sais pas si j'ai bien compris comment contrôler la méthode utilisée pour analyser les anneaux, mais j'essaierais avec cette commande :

Écrivez un courrier à la liste gdal-dev si cette commande ne fait aucune différence ou renvoie une erreur.


Chaque donnée spatiale est livrée avec un système de référence de coordonnées (CRS en abrégé) qui décrit comment les données sont représentées à la surface de la terre. Une définition approfondie de CRS dépasse le cadre de cet article, nous verrons ici comment obtenir des informations CRS à partir d'un objet sf et comment les transformer en un nouveau système de référence.

Les CRS sont définis dans sf par leur code epsg, par exemple le CRS GPS/WGS84 classique a le code 4326, explorons ceci :

Lorsque vous travaillez avec des données spatiales, il est essentiel de s'assurer que les SIR sont adéquats, par exemple, les zones de calcul ou les distances ont plus de sens dans les SIR projetés que dans les SIR géographiques. De plus, lors d'opérations spatiales sur plusieurs objets spatiaux, tous les SCR doivent être identiques.


Fonctionnalités simples

Il existe une tonne de packages pour R qui vous permettent d'interagir avec des fichiers de formes et des données spatiales. Ici, nous allons nous concentrer sur un package moderne pour lire et transformer des données spatiales dans un format ordonné. Fonctionnalités simples ou accès simple aux fonctionnalités fait référence à une norme formelle qui décrit comment les objets du monde réel peuvent être représentés dans les ordinateurs, en mettant l'accent sur la spatial géométrie de ces objets. Il décrit également comment de tels objets peuvent être stockés et extraits de bases de données, et quelles opérations géométriques doivent être définies pour eux.

La norme est largement mise en œuvre dans les bases de données spatiales (telles que PostGIS), les SIG commerciaux (par exemple, ESRI ArcGIS) et constitue la base de données vectorielles pour les bibliothèques telles que GDAL. Un sous-ensemble de fonctionnalités simples forme la norme GeoJSON.

R a des classes bien prises en charge pour stocker des données spatiales ( sp ) et s'interfacer avec les environnements mentionnés ci-dessus ( rgdal , rgeos ), mais il manquait jusqu'à présent une implémentation complète de fonctionnalités simples, rendant les conversions parfois alambiquées, inefficaces ou incomplètes. Le paquet sf essaie de combler cette lacune.


Ytdjtkui

Pourquoi est-ce une mauvaise idée d'engager un tueur à gages pour éliminer la plupart des politiciens corrompus ?

Groupes matriciels de type fini dont les valeurs propres sont toutes algébriques

Quel exploit ces agents utilisateurs essaient-ils d'utiliser ?

Données de test d'apprentissage automatique

Comment éviter le trope "ils tombent amoureux"

Que faut-il pour rendre les signaux GPS disponibles à l'intérieur ?

La Commission de la pomme de terre de l'Idaho associe-t-elle les peaux de pomme de terre à une alimentation saine ?

Convertir des secondes en minutes

Phares de voiture dans un monde sans électricité

Comment expliquer de manière compacte les caractères secondaires et tertiaires sans recourir aux stéréotypes ?

Quelle est la couleur la plus courante pour indiquer que le champ de saisie est désactivé ?

Existe-t-il un moyen neutre pour l'hémisphère de spécifier une saison ?

Authentification basée sur les connaissances à l'aide de la conception pilotée par domaine en C#

Le patron de l'intimidation a lancé une campagne de diffamation et m'a rendu inemployable

OP Amp n'amplifie pas le signal audio

Vitesse du processeur limitée à 0,4 Ghz

Déverrouillez mon téléphone ! Février 2018

Comment montrer à un propriétaire ce que nous avons en économies ?

Que signifie le même-ish?

Quelle est la factorisation entière la plus rapide pour casser RSA ?

Comment quitter BASH pendant la boucle à l'aide de l'opérateur de module ?

Commande Mathematica qui lui permet de lire mes intentions

Faites des créatures avec une vitesse de 0 pied, volez à 30 pieds. (planer) jamais toucher le sol?

Comment appelle-t-on quelqu'un qui pose beaucoup de questions ?

Superpositions spatiales : Union entre multiligne et multipolygone avec géopandas

Trouvez des paires d'entités proches avec geopandas, fiona, GDAL, etc. de la collection de géométrie à la géométrie des polygones avec python countryBuffer avec dissolution - Geopandas - unary_union multipolygonOverlay Union Geopandas améliore les performancesPourquoi Union dans ArcMap est-il beaucoup plus rapide que d'autres approches ?

J'essaie de superposer (appliquer l'union) mon multipolygone sur la multiligne avec GeoPandas, mais il semble que la fonction de superposition de GeoPandas ne fonctionne qu'avec (Multi)polygon. Existe-t-il un moyen de le faire avec des multilignes et des multipolygones avec GeoPandas. Voici mon code :

Quelle sortie attendez-vous pour superposer des polygones avec des lignes ? Fractionner des lignes avec des attributs de polygone ?

Ouais exactement, c'est ce que je veux faire, diviser des lignes avec des attributs de polygone

Pouvez-vous coder en dur des exemples de géométries à l'aide d'objets galbés ?

Oui, je pense que je peux dp ça

J'essaie de superposer (appliquer l'union) mon multipolygone sur la multiligne avec GeoPandas, mais il semble que la fonction de superposition de GeoPandas ne fonctionne qu'avec (Multi)polygon. Existe-t-il un moyen de le faire avec des multilignes et des multipolygones avec GeoPandas. Voici mon code :

Quelle sortie attendez-vous pour superposer des polygones avec des lignes ? Diviser les lignes avec des attributs de polygone ?

Ouais exactement, c'est ce que je veux faire, diviser des lignes avec des attributs de polygone

Pouvez-vous coder en dur des exemples de géométries à l'aide d'objets galbés ?

Oui, je pense que je peux dp ça

J'essaie de superposer (appliquer l'union) mon multipolygone sur la multiligne avec GeoPandas, mais il semble que la fonction de superposition de GeoPandas ne fonctionne qu'avec (Multi)polygon. Existe-t-il un moyen de le faire avec des multilignes et des multipolygones avec GeoPandas. Voici mon code :

J'essaie de superposer (appliquer l'union) mon multipolygone sur la multiligne avec GeoPandas, mais il semble que la fonction de superposition de GeoPandas ne fonctionne qu'avec (Multi)polygon. Existe-t-il un moyen de le faire avec des multilignes et des multipolygones avec GeoPandas. Voici mon code :

Quelle sortie attendez-vous pour superposer des polygones avec des lignes ? Fractionner des lignes avec des attributs de polygone ?

Ouais exactement, c'est ce que je veux faire, diviser des lignes avec des attributs de polygone

Pouvez-vous coder en dur des exemples de géométries à l'aide d'objets galbés ?

Oui, je pense que je peux dp ça

Quelle sortie attendez-vous pour superposer des polygones avec des lignes ? Fractionner des lignes avec des attributs de polygone ?

Ouais exactement, c'est ce que je veux faire, diviser des lignes avec des attributs de polygone

Pouvez-vous coder en dur des exemples de géométries à l'aide d'objets galbés ?

Oui, je pense que je peux dp ça

Quelle sortie attendez-vous pour superposer des polygones avec des lignes ? Fractionner des lignes avec des attributs de polygone ?

Quelle sortie attendez-vous pour superposer des polygones avec des lignes ? Diviser les lignes avec des attributs de polygone ?

Ouais exactement, c'est ce que je veux faire, diviser des lignes avec des attributs de polygone

Ouais exactement, c'est ce que je veux faire, diviser des lignes avec des attributs de polygone

Pouvez-vous coder en dur des exemples de géométries à l'aide d'objets galbés ?

Pouvez-vous coder en dur des exemples de géométries à l'aide d'objets galbés ?

Oui, je pense que je peux dp ça

Oui, je pense que je peux dp ça


3. Travailler avec des données raster¶

Contrairement aux données vectorielles (objets géométriques : comme les points, les lignes, les polygones), les données raster sont une matrice de valeurs de « pixels » (également appelées « cellules »). Chaque cellule représente une petite zone et contient une valeur représentant certaines informations :

Les données raster sont comme les données d'images numériques que vous regardez sur votre ordinateur, sauf que maintenant, chaque pixel représente une région spatiale. La « résolution » d'un raster est la zone que chaque pixel représente. Un raster de résolution de 1 mètre signifie que chaque pixel représente une zone de 1 m x 1 m au sol. Cependant, lorsque nous disons « haute résolution », nous entendons souvent une faible valeur de résolution pour chaque pixel, c'est-à-dire qu'une résolution de 1 mètre est supérieure à une résolution de 8 mètres, comme l'illustre l'image ci-dessous :

Comme les données vectorielles, il existe différents formats de fichiers pour le stockage des données raster. Le plus courant est GeoTIFF ( .tif ), qui est essentiellement un fichier image contenant des informations de géoréférencement. Les données raster sont utilisées pour une variété de problèmes, les exemples courants incluent l'imagerie satellitaire et les modèles d'élévation numériques. Ces choses dépassent un peu le cadre de ce cours, mais examinons brièvement quelques données raster ci-dessous. Le package de base pour travailler avec des données raster en Python est rasterio.

J'ai un fichier raster d'image satellite d'une partie de l'UBC dans mon dossier de données que j'ai téléchargé à partir du réseau de données Abacus. Chargeons-le avec rasterio :

Nous pouvons commencer à étudier des choses comme la largeur et la hauteur (en pixels/cellules) du raster :

Les données raster ont souvent des « bandes » représentant différentes informations (par exemple, une image en couleur a généralement des bandes rouges, vertes et bleues). Cette image satellite particulière a 4 bandes (dans l'ordre : rouge, bleu, vert, infrarouge) :

Nous pourrions importer la première bande en tant que tableau numpy en utilisant :

Mais avant d'importer plus de données, il est utile de simplement voir l'image. Je vais d'abord "sous-échantillonner" mon raster (réduire la résolution en augmentant la taille de la cellule) pour réduire la taille des données et accélérer un peu les choses :

Comme nos données ne sont que des tableaux numpy, nous pouvons les tracer avec la fonction matplotlib plt.imshow() :

Bien sûr, cela semble plus réaliste en utilisant tous les canaux :

rasterio dispose de nombreuses fonctionnalités avancées pour manipuler et tracer des données raster si vous en ressentez le besoin. Consultez la documentation.


Développement piloté par les tests (TDD)

Après avoir identifié l'implémentation de référence (la fonction pointsWithinPolygon de Turf.js) et nos deux entrées pour la fonction, j'ai ensuite écrit un petit module TypeScript à exécuter dans Node.js et appeler Turf.js et imprimer les résultats. Je les ai enregistrés dans des fichiers geojson dans tests/fixtures/natural-earth/ . Il y a maintenant 6 cas de test que nous comparerons plus tard. Polygones simples et complexes, et 3 tailles de collections de points (10, 100 et 1 000).

Voici un extrait d'un des tests unitaires de Rust. Notez la correspondance de motif à la fin :


Hfrhyu

Existe-t-il une sorte de relais qui ne consomme que de l'énergie lors de la commutation?

Existe-t-il des preuves tangibles que le système d'examen par les pairs des subventions fonctionne bien mieux que le système aléatoire ?

Le don « Attaque puissante » du don Grand maître d'armes peut-il s'appliquer aux attaques du sort Arme spirituelle ?

Deadpool a-t-il sauvé tous les X-Force ?

Dans quelle mesure nr est-il sécurisé en tant qu'octets d'arrêt ?

Comment réduire l'écart entre la gauche et la droite de cdot avec une macro ?

Le code ci-dessous, est-ce un NDR mal formé ou est-il bien formé ?

Comment utiliser le nouvel élément fini non linéaire de Mathematica 12 pour cette équation ?

Pourquoi sonne-t-il parfois bien de jouer un appoggiature comme introduction à une note dans une mélodie ?

Quelle est la topologie associée aux algèbres de la monade de l'ultrafiltre ?

À quelle fréquence le roque se produit-il dans les jeux de grand maître ?

Pourquoi DOSKEY n'a-t-il pas été intégré à COMMAND.COM ?

Pourquoi devons-nous utiliser le modèle de conception du constructeur alors que nous pouvons faire la même chose avec les setters ?

Quelle est la signification de « retenue d'infraction renforcée » ?

Comment se fait-il que Sam ne soit pas devenu Lord of Horn Hill ?

Les AppleTV créent un réseau WiFi alternatif bavard

Question sur l'anti-rebond - délai de changement d'état

Comment appelleriez-vous cet étrange appareil métallique qui permet de soulever des personnes ?

Qu'est-ce qu'une correspondance fractionnaire ?

Pourquoi est-il plus rapide de réchauffer quelque chose que de le cuire ?

Comment réagir face au comportement hostile d'un développeur senior ?

Peut-on voir quelque chose du centre du vide de Boötes ? À quel point serait-il sombre ?

Trouvez rapidement tous les polygones qui se chevauchent avec deux ou plusieurs polygones dans Shapely

Unicorn Meta Zoo #1 : Pourquoi un autre podcast ? Comment trouver les zones d'intersection des zones tampons qui se chevauchent dans un seul fichier de formes ? Trouvez et répertoriez tous les polygones qui se chevauchent avec un autre polygoneComment convertir les petites entités surfaciques qui se chevauchent en anneau intérieur dans QGISShapely (geos) se bloque pendant unary_unionDissoudre des polygones basés sur des attributs avec Python (shapely, fiona) ?Somme des valeurs d'attributs pour les zones où plusieurs polygones se chevauchent à l'aide de QGIS ?ArcGIS trouve tous les polygones qui se croisent avec plus d'un polygone d'une autre couche N polygonesMultipolygon créé à partir de Scratch LayerQuand le “polygonize_full” de Shapely détecte-t-il un pendant ?Impossible de trouver des polygones qui se trouvent à l'intérieur d'un grand polygone à l'aide de GeoPandas

J'ai un ensemble de polygones (dans Shapely) que je souhaite trouver toutes les intersections composées de chevauchements de deux ou plusieurs polygones. J'ai travaillé sur la base du code trouvé dans cette réponse. J'ai jusqu'à présent un code qui fonctionne dans l'instruction if 1: ci-dessous, mais son exécution est très longue. Le code qui se trouve dans l'instruction if 0: s'exécute rapidement, mais produit une sortie avec quelques erreurs. Voir ci-dessous pour un exemple de l'erreur.

Ci-dessous, l'orange représente toutes les formes que je voudrais vérifier si elles sont produites (par union unaire dans Shapely) par deux ou plusieurs chevauchements, le cyan représente la sortie de l'instruction if qui fonctionne (si 1 dans le code ci-dessus) , et le rose représente les polygones sélectionnés incorrects par l'instruction if qui ne fonctionne pas (si 0 dans le code ci-dessus). Les coins en haut à gauche des zones de texte dans les images représentent ce point en cours de sélection, et comme vous pouvez le voir sur la deuxième image, la zone rose n'a qu'un seul polygone de STEREO_OBSERVATIONS (qui est l'ensemble de polygones dont le chevauchement est vérifié) il ne doit donc pas être sélectionné. En revanche, le carré cyan gauche adjacent au carré rose mis en évidence dans la troisième image a deux polygones de STEREO_OBSERVATIONS et en tant que tel est correctement sélectionné par le résultat cyan. La superposition des couches de polygones est montrée dans la première image.

Quelle est la meilleure façon d'interroger la structure STRtree afin de vérifier l'intersection ou le chevauchement ? J'ai essayé d'utiliser le centroïde dans le code, mais cela n'a pas semblé produire la sortie correcte.

Fig. 1 (Légende/superposition)

Fig 2. (Sélection incorrecte par l'algorithme rapide [si 0 dans le code] en rose)

Fig 3. (Sélection correcte par algorithme lent [si 1 dans le code]


R comme SIG pour les économistes

Par jointure spatiale, nous entendons des opérations spatiales qui impliquent tous les éléments suivants :

  • superposer une couche spatiale (couche cible) sur une autre couche spatiale (couche source)
  • pour chacune des observations dans la couche cible
    • identifier les objets de la couche source qu'il croise géographiquement (ou une relation topologique différente) avec
    • extraire les valeurs associées aux objets qui se croisent dans la couche source (et synthétiser si nécessaire),
    • affecter la valeur extraite à l'objet dans le calque cible

    Pour les économistes, il s'agit probablement de la motivation la plus courante pour l'utilisation d'un logiciel SIG, le but ultime étant d'inclure les variables spatialement jointes en tant que covariables dans l'analyse de régression.

    Nous pouvons classer les jointures spatiales en quatre catégories selon le type d'objets spatiaux sous-jacents :

    • vector-vector : données vectorielles (cible) contre données vectorielles (source)
    • vector-raster : données vectorielles (cible) par rapport aux données raster (source)
    • raster-vector : données raster (cible) par rapport aux données vectorielles (source)
    • raster-raster : données raster (cible) par rapport aux données raster (source)

    Parmi les quatre, nous nous concentrons ici sur le premier cas. Le deuxième cas sera discuté au chapitre 5. Nous ne couvrirons pas les troisième et quatrième cas dans ce cours car il arrive presque toujours que nos données cibles soient des données vectorielles (par exemple, des champs de ville ou de ferme comme points, des frontières politiques comme polygones, etc.).

    La catégorie 1 peut être subdivisée en différentes sous-catégories selon le type d'objet géographique (point, ligne et polygone). Ici, nous ignorerons toutes les jointures spatiales impliquant des lignes. En effet, les objets représentés par des lignes sont rarement des unités d'observation dans l'analyse économétrique ni les données sources à partir desquelles nous extrairons des valeurs. 64 Voici la liste des types de jointures spatiales que nous allons apprendre.

    1. points (cible) contre polygones (source)
    2. polygones (cible) contre points (source)
    3. polygones (cible) contre polygones (source)

    3.3.1 Cas 1 : points (cible) vs polygones (source)

    Le cas 1, pour chacune des observations (points) dans les données cibles, trouve quel polygone dans le fichier source il croise, puis attribue la valeur associée au polygone au point 65 . Pour y parvenir, nous pouvons utiliser la fonction st_join(), dont la syntaxe est la suivante :

    Semblable au sous-ensemble spatial, la relation topologique par défaut est st_intersects() 66 .

    Nous utilisons les données des puits d'irrigation du Kansas (points) et les données des limites du comté du Kansas (polygones) pour une démonstration. Notre objectif est d'attribuer aux puits les informations sur les prix du maïs au niveau du comté à partir des données du comté du Kansas. Permettez-moi d'abord de créer et d'ajouter une fausse variable de prix du maïs au niveau du comté aux données du comté de Kansas.

    Voici la carte des comtés du Kansas différenciée par couleur selon le prix du faux maïs (Figure 3.16) :

    Figure 3.16 : Carte du prix du faux maïs au niveau du comté

    Pour ce contexte particulier, le code suivant fera l'affaire :

    Vous pouvez voir sur la figure 3.17 ci-dessous que tous les puits à l'intérieur du même comté ont la même valeur de prix du maïs.

    Figure 3.17 : Carte des puits différenciée par couleur selon le prix du maïs

    3.3.2 Cas 2 : polygones (cible) vs points (source)

    Cas 2, pour chacune des observations (polygones) dans les données cibles, recherchez les observations (points) dans le fichier source qu'elle croise, puis attribuez les valeurs associées aux points au polygone. Nous utilisons la même fonction : st_join() 67 .

    Supposons que vous soyez maintenant intéressé par l'analyse au niveau du comté et que vous vouliez obtenir le pompage total des eaux souterraines au niveau du comté. Le fichier cible est KS_counties et le fichier source est KS_wells .

    Comme vous pouvez le voir dans le jeu de données résultant, toutes les combinaisons uniques polygone - point d'intersection comprennent les observations. Pour chacun des polygones, vous aurez autant d'observations que le nombre de puits qui coupent le polygone. Une fois que vous avez joint les deux couches, vous pouvez trouver des statistiques par polygone (comté ici). Puisque nous voulons l'extraction des eaux souterraines par comté, ce qui suit fait le travail.

    Bien entendu, il est tout aussi simple d'obtenir d'autres types de statistiques en modifiant simplement la partie resume().

    Cependant, ce processus en deux étapes peut en fait être effectué en une seule étape à l'aide d'aggregate() , dans laquelle vous spécifiez comment vous souhaitez agréger avec l'option FUN comme suit :

    Notez que la fonction Mean() a été appliquée à toutes les colonnes de KS_wells , y compris le numéro d'identification du site. Ainsi, vous voudrez peut-être sélectionner les variables que vous souhaitez joindre avant d'appliquer la fonction d'agrégat () comme ceci :

    3.3.3 Cas 3 : polygones (cible) vs polygones (source)

    Dans ce cas, st_join(target_sf, source_sf) renverra toutes les combinaisons polygones-polygones d'intersection uniques avec les informations du polygone de source_sf jointes.

    Nous utiliserons les acres de maïs au niveau du comté dans l'Iowa en 2018 à partir de USDA NASS 68 et des unités hydrologiques 69. Notre objectif ici est de trouver des acres de maïs par unités HUC sur la base des données d'acres de maïs au niveau du comté 70 .

    Nous importons d'abord les données des acres de maïs de l'Iowa :

    Voici la carte des comtés de l'Iowa différenciée par la couleur des acres de maïs (Figure 3.18) :

    Figure 3.18 : Carte des comtés de l'Iowa différenciée par couleur selon la superficie plantée en maïs

    Importez maintenant les données des unités HUC :

    Voici la carte des unités HUC (Figure 3.19) :

    Figure 3.19 : Carte des unités HUC qui croisent la frontière de l'État de l'Iowa

    Voici une carte des comtés de l'Iowa avec des unités HUC superposées sur le dessus (Figure 3.20) :

    Figure 3.20 : Carte des unités HUC superposées aux comtés de l'Iowas

    La jointure spatiale produira ce qui suit.

    Chacune des combinaisons HUC-comté qui se croisent devient une observation avec sa géométrie résultante identique à la géométrie de l'unité HUC. Pour le voir, jetons un coup d'œil à l'une des unités HUC.

    L'unité HUC avec HUC_CODE ==10170203 croise quatre comtés.

    La figure 3.21 montre la carte des quatre observations.

    Figure 3.21 : Plan de l'unité HUC

    Ainsi, les quatre observations ont une géométrie identique, qui est la géométrie de l'unité HUC, ce qui signifie que st_join() n'a pas laissé d'informations sur la nature de l'intersection de l'unité HUC et des quatre comtés. Encore une fois, rappelez-vous que l'option par défaut est st_intersects() , qui vérifie si les objets spatiaux se croisent ou non, rien de plus. Si vous calculez simplement la moyenne simple des acres de maïs en ignorant le degré de chevauchement spatial, c'est très bien. Cependant, si vous souhaitez calculer une moyenne pondérée par zone, vous ne disposez pas de suffisamment d'informations. Vous verrez ci-dessous comment trouver la moyenne pondérée par zone.

    Notez que nous n'avons extrait aucune valeur d'attribut des chemins de fer au chapitre 1.4. Nous venons de calculer la longueur du trajet des chemins de fer, ce qui signifie que la géométrie des chemins de fer eux-mêmes était intéressante au lieu des valeurs associées aux chemins de fer.↩︎

    Vous pouvez voir un exemple pratique de ce cas en action dans la démonstration 1 du chapitre 1.↩︎

    Bien qu'il soit peu probable que vous ayez à modifier la relation topologique, vous pouvez le faire en utilisant l'option de jointure.↩︎

    Vous pouvez voir un exemple pratique de ce cas en action dans la démonstration 2 du chapitre 1.↩︎

    Voir le chapitre 9.1 pour savoir comment télécharger les données Quick Stats depuis R.↩︎

    Voir ici pour une explication de ce qu'ils sont. Vous n'avez pas vraiment besoin de savoir ce que sont les unités HUC pour comprendre ce qui est fait dans cette section.↩︎

    Oui, il y aura des erreurs de mesure substantielles car les polygones source (acres de maïs par comté) sont grands par rapport aux polygones cibles (unités HUC). Mais, cela sert une bonne illustration d'une jointure polygone-polygone.↩︎


    Voir la vidéo: Reclassifying Raster Data