python - shapely 和 matplotlib 多边形中的点与地理定位不准确

标签 python google-maps-api-3 matplotlib point-in-polygon shapely

我正在使用 matplotlib 和 shapely 测试多边形中的点函数。

这是一个map包含一个百慕大三角多边形。

Google map 的多边形内点函数清楚地显示 testingPointtestingPoint2 在多边形内部,这是一个正确的结果。

如果我在 ma​​tplotlib 和 shapely 中测试这两个点,只有 point2 通过测试。

In [1]: from matplotlib.path import Path

In [2]: p = Path([[25.774252, -80.190262], [18.466465, -66.118292], [32.321384, -64.75737]]) 

In [3]: p1=[27.254629577800088, -76.728515625]

In [4]: p2=[27.254629577800088, -74.928515625]

In [5]: p.contains_point(p1)
Out[5]: 0

In [6]: p.contains_point(p2)
Out[6]: 1

shapely 显示与 matplotlib 相同的结果。

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

这里到底发生了什么?谷歌的算法比那两个好吗?

谢谢

最佳答案

记住:世界不是平的!如果 Google map 的投影是您想要的答案,您需要将地理坐标投影到 spherical Mercator 上获得一组不同的 X 和 Y 坐标。 Pyproj可以帮助解决这个问题,只需确保您之前反转坐标轴(即:X、Y 或经度、纬度)。

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

似乎得到了正确答案。

关于python - shapely 和 matplotlib 多边形中的点与地理定位不准确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21328854/

相关文章:

google-maps - Google map 未使用 Ionic 2 原生 google-maps 插件显示

python - 使用日期索引的时间序列数据在 x 轴上绘制耗时

python - 如何使用 pandas 从 word 文档 (.docx) 文件中的表创建数据框

javascript - map - 折线根据速度改变颜色

android - 如何从Android中的经纬度获取地址?

python - 如何在matplotlib中绘制范围条形图?

python - 如何使用 Matplotlib 绘制 Shapely 多边形和对象?

python - Pandas:重新索引仅对具有唯一值的 Index 对象有效

python - 从文件中写入和读取列表

python - 如何验证字符串是否是有效的 float ?