Je teste la fonction Point-in-Polygon avec Matplotlib et galonnièrement.
Voici un carte contient des bermudes Triangle polygone. P>
Google Maps Strong> Les fonctions point in-polygones sont clairement indique clairement Point de test strong> et TestingPoint2 strong> sont à l'intérieur du polygone qui est un résultat correct. p> Si je teste les deux points de matplotlib strong> et galbé, seul point2 transmet le test. P> In [1]: from shapely.geometry import Polygon, Point
In [2]: poly = Polygon(([25.774252, -80.190262], [18.466465, -66.118292], [32.321384, -64.75737]))
In [3]: p1=Point(27.254629577800088, -76.728515625)
In [4]: p2=Point(27.254629577800088, -74.928515625)
In [5]: poly.contains(p1)
Out[5]: False
In [6]: poly.contains(p2)
Out[6]: True
4 Réponses :
Je viens de faire cela pour tester si les points sont réellement à l'intérieur du triangle: Maintenant, lorsque vous utilisez Google Maps et que le polygone est mappé sur des coordonnées sphériques, le triangle est déformé, une chose à garder à l'esprit. p> Quoi qu'il en soit, tracer vos données avec KML dans la Terre de Gokele montrent également le point situé à l'extérieur du triangle ?! p> même apparence que dans l'image MATPLOTLIB, Le point 1 est glaciaire à l'extérieur du triangle, lorsqu'il est tracé dans des coordonnées de 2D euclidiennes.
Pour les calculs géométriques dans les coordonnées géométriques, vérifiez la console de Python QGIS ou des outils GDAL / OGR. Ou vous utiliseriez l'API Google Maps, comme dans l'exemple, qui est lié sur Page , où le sujet 2D-géométries vs géométries géodésiques est Coverd. p> p> p>
Merci pour l'explication. Matplotlib utilise-t-il des coordonnées sphériques pour la correspondance?
Qu'est-ce que "x" et "y" dans votre code? Votre exemple n'est pas complet.
N'oubliez pas: le monde n'est pas plat! em> Si la projection de Google Maps 'est la réponse souhaitée, vous devez projeter les coordonnées géographiques sur Mercator sphérique pour obtenir un ensemble différent de coordonnées X et Y. pyproj peut vous aider, assurez-vous d'inverser vos axes de coordonnées (c.-à-d.: x, Y ou longitude, latitude). import pyproj
from shapely.geometry import Polygon, Point
from shapely.ops import transform
from functools import partial
project = partial(
pyproj.transform,
pyproj.Proj(init='epsg:4326'),
pyproj.Proj('+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs'))
poly = Polygon(([-80.190262, 25.774252], [-66.118292, 18.466465], [-64.75737, 32.321384]))
p1 = Point(-76.728515625, 27.254629577800088)
# Old answer, using long/lat coordinates
poly.contains(p1) # False
poly.distance(p1) # 0.01085626429747994 degrees
# Translate to spherical Mercator or Google projection
poly_g = transform(project, poly)
p1_g = transform(project, p1)
poly_g.contains(p1_g) # True
poly_g.distance(p1_g) # 0.0 meters
Merci beaucoup pour l'idée, cela a résolu le problème. BTW, j'ai trouvé de la boutique aussi bien que Matplotlib si elle est exécutée, disons 1000 fois.
Bon à savoir, je vais devoir voir ce qui rend le matplotlib tant plus vite.
Est-ce que je peux faire la transformation avec matplotlib code> à la place?
Bien que vous ayez déjà accepté une réponse, mais en plus de la réponse de @ Miket, je vais ajouter ceci pour les futurs visiteurs qui pourraient vouloir faire la même chose avec matplotlib code> et Basemap dans
mpl_toolkit code>:
Pour vérifier si un polygone contient plusieurs points, j'utiliserais MATPLOTLIB Cela fait un grand appel à l'aide d'une matrice numpue, c'est pourquoi il est efficace.
Notez que vous pouvez transmettre un rayon qui gonfle ou délate le polygone, vous pouvez également transformer (projections ...) avant de faire le chèque. P> contient_points code>, documenté ici: http://matplotlib.org/api/path_api.html#matplotlib.path.path.contains_points p>