Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 多边形中的shapely和matplotlib点与地理位置不一致_Python_Google Maps Api 3_Matplotlib_Point In Polygon_Shapely - Fatal编程技术网

Python 多边形中的shapely和matplotlib点与地理位置不一致

Python 多边形中的shapely和matplotlib点与地理位置不一致,python,google-maps-api-3,matplotlib,point-in-polygon,shapely,Python,Google Maps Api 3,Matplotlib,Point In Polygon,Shapely,我正在用matplotlib和shapely测试多边形函数中的点 这是一个包含百慕大三角多边形的多边形 谷歌地图的多边形中的点函数清楚地显示测试点和测试点2位于多边形内部,这是一个正确的结果 如果我在matplotlib和shapely中测试这两个点,则只有点2通过测试 In [1]: from matplotlib.path import Path In [2]: p = Path([[25.774252, -80.190262], [18.466465, -66.118292], [32.

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

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

谷歌地图的多边形中的点函数清楚地显示测试点测试点2位于多边形内部,这是一个正确的结果

如果我在matplotlib和shapely中测试这两个点,则只有点2通过测试

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
这里到底发生了什么?谷歌的算法比这两个好吗


谢谢

我这样做只是为了测试点是否在三角形内:

from matplotlib import pylab as plt
poly = [[25.774252, -80.190262],
        [18.466465, -66.118292],
        [32.321384, -64.75737],
        [25.774252, -80.190262]]
x = [point[0] for point in poly]
y = [point[1] for point in poly]
p1 = [27.254629577800088, -76.728515625]
p2 = [27.254629577800088, -74.928515625]
plt.plot(x,y,p1[0],p1[1],'*r',p2[0],p2[1],'*b')
plt.show()

现在,当你使用谷歌地图,多边形被映射到球坐标上时,三角形会变形,这一点需要记住

无论如何,在Gookle Earth中用kml绘制数据时,也会显示三角形外的点

<kml>
<Document>
<Placemark><name>Point 1</name><Point>
<coordinates> -76.728515625, 27.254629577800088,0</coordinates></Point></Placemark>
<Placemark><name>Point 2</name><Point>
<coordinates>-74.928515625, 27.254629577800088,     0</coordinates></Point></Placemark>
<Placemark><name>Poly</name><Polygon>
<outerBoundaryIs><LinearRing>
<coordinates> -80.190262,25.774252 -66.118292,18.466465 -64.75737,32.321384 -80.190262,25.774252</coordinates>
</LinearRing></outerBoundaryIs>
</Polygon></Placemark>
</Document>
</kml>

第1点
-76.728515625, 27.254629577800088,0
第2点
-74.928515625, 27.254629577800088,     0
聚
-80.190262,25.774252 -66.118292,18.466465 -64.75737,32.321384 -80.190262,25.774252
与matplotlib图像中的外观相同,当以欧几里德二维坐标绘制时,点1在三角形外很小。 对于地理坐标中的几何计算,请检查QGIS Python控制台或GDAL/OGR工具。或者您可以使用google maps api,就像在上链接的示例中一样,其中涵盖了主题2D几何图形与测地线几何图形

记住:世界不是平的!如果谷歌地图的投影是您想要的答案,那么您需要将地理坐标投影到上,以获得一组不同的X和Y坐标。如果有帮助,只需确保在之前反转坐标轴(即:X、Y或经度、纬度)


似乎得到了正确的答案。

虽然您已经接受了答案,但除了@MikeT的答案之外,我还将为将来可能希望使用
matplotlib
mpl\u工具包
执行相同操作的访问者添加此选项:

from mpl_toolkits.basemap import Basemap
from matplotlib.path import Path


# Mercator Projection
# http://matplotlib.org/basemap/users/merc.html
m = Basemap(projection='merc', llcrnrlat=-80, urcrnrlat=80,
            llcrnrlon=-180, urcrnrlon=180, lat_ts=20, resolution='c')

# Poly vertices
p = [[25.774252, -80.190262], [18.466465, -66.118292], [32.321384, -64.75737]]

# Projected vertices
p_projected = [m(x[1], x[0]) for x in p]

# Create the Path
p_path = Path(p_projected)

# Test points
p1 = [27.254629577800088, -76.728515625]
p2 = [27.254629577800088, -74.928515625]

# Test point projection
p1_projected = m(p1[1], p1[0])
p2_projected = m(p2[1], p2[0])

if __name__ == '__main__':
    print(p_path.contains_point(p1_projected))  # Prints 1
    print(p_path.contains_point(p2_projected))  # Prints 1

要检查多边形是否包含多个点,我将使用matplotlib
contains_points
,如下所示:

这会使用numpy数组执行一个大型调用,这就是它高效的原因。
请注意,您可以传递一个实际上会使多边形膨胀或Delate的半径,您也可以在执行检查之前变换(投影…)。

谢谢您的解释。matplotlib可以使用球坐标进行匹配吗?代码中的“x”和“y”是什么?您的示例不完整。非常感谢您的想法,它确实解决了问题。顺便说一句,我发现shapely比matplotlib慢得多。如果运行它,比如说1000次。很高兴知道,我必须看看matplotlib为什么会快得多。有没有办法用
matplotlib
来进行转换?
from mpl_toolkits.basemap import Basemap
from matplotlib.path import Path


# Mercator Projection
# http://matplotlib.org/basemap/users/merc.html
m = Basemap(projection='merc', llcrnrlat=-80, urcrnrlat=80,
            llcrnrlon=-180, urcrnrlon=180, lat_ts=20, resolution='c')

# Poly vertices
p = [[25.774252, -80.190262], [18.466465, -66.118292], [32.321384, -64.75737]]

# Projected vertices
p_projected = [m(x[1], x[0]) for x in p]

# Create the Path
p_path = Path(p_projected)

# Test points
p1 = [27.254629577800088, -76.728515625]
p2 = [27.254629577800088, -74.928515625]

# Test point projection
p1_projected = m(p1[1], p1[0])
p2_projected = m(p2[1], p2[0])

if __name__ == '__main__':
    print(p_path.contains_point(p1_projected))  # Prints 1
    print(p_path.contains_point(p2_projected))  # Prints 1