Vérifier si la géo-point est à l'intérieur ou à l'extérieur du polygone en Python
Je suis à l'aide de python et j'ai défini les latitudes et les longitudes (en degrés) d'un polygone sur la carte.
Mon but est de vérifier si un générique point de P
de coordonnées x,y
tombe à l'intérieur de ces polygones. Je voudrais donc avoir une fonction qui me permet de vérifier cette condition et retour True
ou False
si le point est à l'intérieur ou à l'extérieur du polygone.
Dans cet exemple, le point est à l'extérieur de sorte que le résultat serait False
Question: Est-il une bibliothèque qui permet d'atteindre mon objectif? si oui lequel me conseillez-vous? seriez-vous en mesure de donner un petit exemple sur la façon de l'utiliser?
Voici le code que j'ai écrit jusqu'à présent:
import numpy as np
# Define vertices of polygon (lat/lon)
v0 = [7.5, -2.5]
v1 = [2, 3.5]
v2 = [-2, 4]
v3 = [-5.5, -4]
v4 = [0, -10]
lats_vect = np.array([v0[0],v1[0],v2[0],v3[0],v4[0]])
lons_vect = np.array([v0[1],v1[1],v2[1],v3[1],v4[1]])
# Point of interest P
x, y = -6, 5 # x = Lat, y = Lon
## START MODIFYING FROM HERE; DO NOT MODIFY POLYGON VERTICES AND DATA TYPE
# Check if point of interest falls within polygon boundaries
# If yes, return True
# If no, return False
Afin de tracer le polygone et le point d'intérêt que j'ai utilisé cartopy et j'ai écrit les lignes de code suivantes:
import cartopy.crs as ccrs
import matplotlib.pyplot as plt
ax = plt.axes(projection=ccrs.PlateCarree())
ax.stock_img()
# Append first vertex to end of vector to close polygon when plotting
lats_vect = np.append(lats_vect, lats_vect[0])
lons_vect = np.append(lons_vect, lons_vect[0])
plt.plot([lons_vect[0:-1], lons_vect[1:]], [lats_vect[0:-1], lats_vect[1:]],
color='black', linewidth=1,
transform=ccrs.Geodetic(),
)
plt.plot(y, x,
'*', # marker shape
color='blue', # marker colour
markersize=8 # marker size
)
plt.show()
Note:
- points sont reliés les uns aux autres par de Grands Cercles!
- J'ai fait des recherches dans le internt et j'ai fini par trouver des questions similaires comme celui-ci mais je n'avais pas de succès, car ils ont tous l'utilisation de
.shp
fichiers dont je n'ai pas.
python n'a pas de packages qui font n'importe quoi. il a un petit nombre de pré construit des modules. les colis sont généralement fournis par la communauté.
Est le polygone toujours convexe?
En général non, il pourrait également être concave
Juste au cas où: vous pouvez toujours jeter un rayon de votre point à un point situé au milieu de toute de la du polygone à côtés. Si votre ray traverse du polygone à côtés d'un même nombre de fois, le point est à l'extérieur. Fonctionne avec des polygones convexes et concaves; fonctionne sur une surface de la sphère (et probablement toutes les 1 connecté à la surface) à l'aide d'une géodésique pour le rayon. A un bord de cas lorsqu'un rayon passe exactement par le biais d'un sommet: vous devez vérifier si les bords de l'incident au sommet sont sur le même côté de la raie.
OriginalL'auteur Federico Gentile | 2017-05-10
Vous devez vous connecter pour publier un commentaire.
Voici une solution possible à mon problème.
np.array([[Lon_A, Lat_A], [Lon_B, Lat_B], [Lon_C, Lat_C]])
polygon.contains(point)
pour tester si le point est à l'intérieur (True
) ou à l'extérieur (False
) le polygone.Ici est la partie manquante de la code:
Note: le polygone ne prend pas en compte les grands cycles apparemment, il est donc nécessaire de diviser les bords dans de nombreux segments augmentant ainsi le nombre de sommets.
Bien faite, ne pas utiliser de grand cercle distances. Il utilise Euclidienne
OriginalL'auteur Federico Gentile
Une autre façon de le faire est par l'utilisation de la même bizarre algorithme expliqué dans ce lien https://wrf.ecse.rpi.edu//Research/Short_Notes/pnpoly.html Le code python est donnée dans wikipédia https://en.wikipedia.org/wiki/Even-odd_rule
Gens, rappelez-vous que l'ORDRE DES POINTS du polygone! Je veux dire, différent de l'ordre des résultats dans les différents polygones.
OriginalL'auteur lfvv