Comment calculer l'aire d'un polygone sur la surface de la terre à l'aide de python?
Le titre, fondamentalement, tout est dit. J'ai besoin de calculer la superficie à l'intérieur d'un polygone sur la surface de la Terre à l'aide de Python. Calcul de la surface délimitée par l'arbitraire d'un polygone sur la surface de la Terre dit quelque chose sur elle, mais reste vague sur les détails techniques:
Si vous voulez le faire avec un plus
"SIG" la saveur, vous devez alors sélectionner
une unité de mesure de votre région et de
trouver la bonne projection
préserve de la zone (mais pas tous). Puisque vous
parlons de calcul d'un
arbitraire polygone, je voudrais utiliser
quelque chose comme un Lambert Azimuthal
L'égalité de la Zone de projection. Définir le
origine/centre de la projection de l'être
le centre de votre polygone, projet
le polygone de nouvelles coordonnées
système, puis de calculer la surface à l'aide de
standard plane techniques.
Alors, comment dois-je le faire en Python?
- Si vous choisissez une zone de préservation de la projection, les côtés du polygone de ne plus être tout droit
Vous devez vous connecter pour publier un commentaire.
Disons que vous avez une représentation de l'état du Colorado en format GeoJSON
Toutes les coordonnées de longitude et de latitude. Vous pouvez utiliser pyproj de projet les coordonnées et Galbées pour trouver la surface de tout projet de polygone:
C'est une égalité de la zone de projection centrée sur et bracketing de la zone d'intérêt. Maintenant, faire de nouvelles projetées représentation GeoJSON, se transformer en un Galbe objet géométrique, et de prendre la région:
C'est une très bonne approximation de la zone étudiée. Pour des fonctions plus complexes, vous aurez besoin de l'échantillon sur les bords, entre les sommets, pour obtenir des valeurs précises. Toutes les mises en garde ci-dessus sur les délais, etc, s'appliquent. Si vous êtes seulement intéressés par la région, vous pouvez traduire votre fonction à l'écart de la ligne de changement de date avant la projection.
[-102.05, 41.0]
. La spec est un peu vague sur ces choses, parfois.basemap
de faire de la projection (par exemple 'aea', 'ace'). En termes de Vert du théorème, un one-linerarea=np.abs(0.5*np.sum(y[:-1]*np.diff(x) - x[:-1]*np.diff(y)))
vous libère de la nécessité de lashapely
moduleLa façon la plus simple de le faire (à mon avis), c'est projeter les choses en (très simple) de l'égalité de la zone de projection et d'utiliser l'un de l'habitude plane techniques pour le calcul de la superficie.
Tout d'abord, je vais supposer que d'une terre sphérique est assez proche de vos besoins, si vous vous posez cette question. Si non, alors vous avez besoin pour reprojeter vos données à l'aide d'un ellipsoïde approprié, dans ce cas, vous allez avoir à utiliser une projection réelle de la bibliothèque (tout ce qui est utilise proj4 derrière les coulisses, ces jours-ci) tels que les liaisons python pour GDAL/OGR ou (ce qui est beaucoup plus convivial) pyproj.
Toutefois, si vous êtes d'accord avec une forme sphérique de la terre, qu'il est assez simple de le faire sans aucun des bibliothèques spécialisées.
La plus simple de l'égalité de la zone de projection pour le calcul est un projection sinusoïdale. Fondamentalement, il suffit de multiplier la latitude de la longueur d'un degré de latitude et la longitude de la longueur d'un degré de latitude et le cosinus de la latitude.
Bon... Maintenant tout ce que nous avons à faire est de calculer l'aire de l'arbitraire d'un polygone dans un avion.
Il y a un certain nombre de façons de le faire. Je vais utiliser ce qui est probablement le plus commun ici.
J'espère que ça va vous diriger dans la bonne direction, de toute façon...
shapely
package pour calculer la zone avecshapely.geometry.Polygon(list(zip(x, y))).area
pour obtenir la zone de la sq. mètres.Un peu tard peut-être, mais ici, c'est une autre méthode, à l'aide de Girard du théorème. Il indique que l'aire d'un polygone de grands cercles est de R**2 fois la somme des angles entre les polygones moins (N-2)*pi où N est le nombre de coins.
Je pensais que ce serait la peine de poster, car il ne repose pas sur toutes les autres bibliothèques de numpy, et c'est une tout autre méthode que les autres. Bien sûr, cela ne fonctionne que sur une sphère, donc il y aura une certaine imprécision lors de l'application sur la Terre.
Tout d'abord, je définir une fonction pour calculer l'angle d'azimut du point 1 le long d'un grand cercle au point 2:
Maintenant je peux l'utiliser pour trouver les angles, et puis la région (Dans la suite, lons-le-saunier et le lats doit être spécifié, et ils devraient être dans le bon ordre. Aussi, le rayon de la sphère doit être spécifié.)
Avec le Colorado coordonnées données dans une autre réponse, et avec le rayon de la Terre 6371 km, j'obtiens que la zone est 268930758560.74808
139013699.103
) est assez différente de la valeur (809339.212
), j'ai obtenu de l'aide d'une "grille" de la méthode, qui est de prendre toutes les cellules de la grille à l'intérieur du polygone à partir d'un bâtiment rectangulaire de Mercator de la grille, et en additionnant les cellules de grille domaines. La surface de chaque cellule est le produit de il zonale et méridienne intervalles (converti à partir lat,lon km).contour
fonction, en fait, j'ai quelques dizaines d'entre eux et tout le monde a signalé une zone négative à l'aide de votre méthode.x=x[::5]; y=y[::5]
), j'ai pu obtenir une valeur positive qui est proche de la "vraie" valeur.Parce que la terre est une surface fermée fermée polygone dessiné sur sa surface crée DEUX polygonale domaines. Vous devez également définir qui l'on est à l'intérieur et à l'extérieur!
La plupart du temps les gens vont être aux prises avec des petits polygones, et donc il est "évident", mais une fois que vous avez des choses à la taille des océans et des continents, vous feriez mieux de vous assurer d'obtenir ce dans le bon sens.
Aussi, n'oubliez pas que les lignes peuvent aller de l' (-179,0) à (+179,0) de deux façons différentes. L'un est beaucoup plus longue que l'autre. Encore une fois, surtout que vous allez faire l'hypothèse que c'est une ligne qui va de (-179,0) à (-180,0) qui est (+180,0) et ensuite (+179,0), mais un jour... il ne sera pas.
Le traitement de lat-long comme un simple (x,y) du système de coordonnées, ou même en négligeant le fait que toute projection de coordonnées va avoir des distorsions et des pauses, peut vous faire échouer le grand-temps sur les sphères.
Ou tout simplement utiliser une bibliothèque: https://github.com/scisco/area
...renvoie la surface en mètres carrés.
Ici est une solution qui utilise
basemap
, au lieu depyproj
etshapely
, pour la conversion de coordonnées. L'idée est la même que celle suggérée par @sgillies bien. NOTEZ que j'ai ajouté le 5ème point, de sorte que le chemin d'accès est une boucle fermée.Le résultat est 268993.609651 en km^2.