2017-05-10 15 views
2

J'utilise 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 point générique P des coordonnées x,y se trouve dans ce polygone. Je voudrais donc avoir une fonction qui me permet de vérifier cette condition et retourner True ou False si le point est à l'intérieur ou à l'extérieur du polygone.Vérifie si le géo-point est à l'intérieur ou à l'extérieur du polygone en Python

enter image description here

Dans cet exemple, le point est à l'extérieur de sorte que le résultat serait False

Question: Y at-il une bibliothèque/package qui permet d'atteindre mon objectif? Si oui, lequel recommandez-vous? serais-tu capable de donner un petit exemple sur la façon de l'utiliser?

Voici le code que je l'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 falls 

Pour tracer le polygone et le point d'intérêt je 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() 

Remarque:

  • points sont reliés les uns aux autres par la Grande-Ci rcles!
  • J'ai fait des recherches dans le internt et j'ai fini par trouver des questions similaires like this one mais je n'ai pas eu de succès car ils utilisent tous des fichiers .shp que je n'ai pas.
+0

Essayez de convertir cet algorithme en Python https://wrf.ecse.rpi.edu//Research/Short_Notes/pnpoly.html # Le code C – arboreal84

+0

python n'a pas de paquets qui font quoi que ce soit. il a un petit nombre de modules pré-construits. les paquets sont généralement fournis par la communauté. – Uriel

+1

Le polygone est-il toujours convexe? –

Répondre

3

Voici une solution possible à mon problème.

  1. Les coordonnées géographiques doivent être stockées correctement. Exemple np.array([[Lon_A, Lat_A], [Lon_B, Lat_B], [Lon_C, Lat_C]])
  2. Créer le polygone
  3. Créer le point à tester
  4. utilisation polygon.contains(point) pour tester si le point est à l'intérieur (True) ou à l'extérieur (False) du polygone.

Voici la partie manquante du code:

from shapely.geometry import Point 
from shapely.geometry.polygon import Polygon 

lons_lats_vect = np.column_stack((lons_vect, lats_vect)) # Reshape coordinates 
polygon = Polygon(lons_lats_vect) # create polygon 
point = Point(y,x) # create point 
print(polygon.contains(point)) # check if polygon contains point 

Remarque: le polygone ne prend pas en compte de grands cycles apparemment, il est donc nécessaire de diviser les bords en plusieurs segments augmentant ainsi le nombre de sommets.

+0

Il est préférable d'écrire la première latitude suivie de la longitude. Rien de mal avec la logique ici, mais pour être sûr que désolé. – Zahran