8
votes

Pointe-in-polygone pointu et matplotlib non précis avec la géolocalisation

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


0 commentaires

4 Réponses :


3
votes

Je viens de faire cela pour tester si les points sont réellement à l'intérieur du triangle: xxx

image montre le point 1 n'est pas à 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.

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 ?! xxx

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.


2 commentaires

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.



10
votes

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


3 commentaires

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 à la place?



8
votes

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 et Basemap dans mpl_toolkit : xxx


0 commentaires

0
votes

Pour vérifier si un polygone contient plusieurs points, j'utiliserais MATPLOTLIB contient_points , documenté ici: http://matplotlib.org/api/path_api.html#matplotlib.path.path.contains_points

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.


0 commentaires