【问题标题】:Python Shapely seems to assign wrong point to polygonPython Shapely 似乎为多边形分配了错误的点
【发布时间】:2021-10-03 20:12:35
【问题描述】:

我正在使用 shapely 将坐标映射到 geojson 文件,但似乎映射错误。在下图中(来自 geojson.io),您可以看到多边形,黄色是我要映射的点。在这种情况下,匀称地告诉我该点位于多边形内部,但正如您所见,这是错误的。

我的代码:

import json
from shapely.geometry import shape, Point

upzs = open('upzs.geojson', encoding='utf-8')
upzs = json.load(upzs)

point = Point(-74.09008026123047,4.719461869021348) # longitude, latitude

for feature in upzs['features']:
    polygon = shape(feature['geometry'])
    if point.within(polygon) == True:
        print(feature['properties']['NOMBRE'])
    if polygon.contains(point):
        print(feature['properties']['NOMBRE'])

我的输出:

EL RINCON
EL RINCON

('EL RINCON' 是错误多边形的名称)

如果你想测试它,你可以从link下载geojson文件

【问题讨论】:

  • 你的代码返回给我,Exception has occurred: AttributeError 'NoneType' object has no attribute 'lower' File "C:\Lab Stackoverflow\readDir.py", line 31, in <module> polygon = shape(feature['geometry'])
  • @Rizquuula,感谢您的反馈。我已经更新了指向正确 geojson 文件的链接
  • 我不确定我是否在关注...您说的是一个点和一个多边形,但图像似乎显示了两个多边形(一个灰色,一个较小,用黄色勾勒)。
  • @TurePålsson,黄色的那个是一个点,我只是画了一个正方形来显示。如果您检查代码示例,我将其分配为坐标

标签: python gis shapely


【解决方案1】:

您确定您发布的图片真的是 GeoJson 文件中的 EL RINCON 吗?

当我在 jupyter notebook 上运行以下命令时,我得到了一个非常不同的形状。

import json
from shapely.geometry import shape, Point

upzs = open('pensionadosactivosupz.geojson', encoding='utf-8')
upzs = json.load(upzs)

point = Point(-74.09008026123047,4.719461869021348) # longitude, latitude

for feature in upzs['features']:
    polygon = shape(feature['geometry'])
    if point.within(polygon) == True:
        print(feature['properties']['NOMBRE'])
    if polygon.contains(point):
        print(feature['properties']['NOMBRE'])
        display(polygon)

此外,如果我映射该点(使用其他包,都在 pip 上可用),则该点包含在多边形中。找到底部的白色圆圈。

import matplotlib.pyplot as plt
import mplleaflet
import geopandas as gpd
from shapely.geometry import shape, Point
p = Point(-74.09008026123047,4.719461869021348)

x = gpd.read_file("pensionadosactivosupz.geojson")

fig, ax = plt.subplots()
x[x.NOMBRE=="EL RINCON"].plot(ax=ax)
ax.scatter([-74.09008026123047], [4.719461869021348], c="white")
mplleaflet.show()

【讨论】:

  • 对了,只看多边形中的纬度/经度值,很明显点在里面。
  • @Kota Mori 你是对的。您可以注意到我发布的多边形是如何在您发布的多边形内的。我的困惑是两个多边形有相同的名称:“EL RINCON”,在我的城市中,最大的一个叫做 UPZ(规划区统一),它包含社区,有时 UPZ 和社区有相同的名称.邻居文件也是另一个。感谢您的帮助!
【解决方案2】:

我不确定,也许你显示的多边形有误?

这是我的代码

import json
from shapely.geometry import shape, Point
import folium

upzs = open('upzs.geojson', encoding='utf-8')
upzs = json.load(upzs)

point = Point(-74.09008026123047,4.719461869021348) # longitude, latitude

for feature in upzs['features']:
    polygon = shape(feature['geometry'])
    if point.within(polygon) == True:
        print(feature['properties']['NOMBRE'])
    if polygon.contains(point):
        print(feature['properties']['NOMBRE'])
        break

m=folium.Map(location=(5,5),zoom_start=6)
folium.Marker([4.719461869021348,-74.09008026123047], popup=folium.Popup('hello',max_width=1000),
              tooltip='click here').add_to(m)
folium.GeoJson(polygon).add_to(m)

m

【讨论】:

  • 你是对的。您可以注意到我发布的多边形是如何在您发布的多边形内的。我的困惑是两个多边形有相同的名称:“EL RINCON”,在我的城市中,最大的一个叫做 UPZ(规划区统一),它包含社区,有时 UPZ 和社区有相同的名称.此外,邻居文件是另一个文件。感谢您的帮助!
猜你喜欢
  • 2022-11-15
  • 2019-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-30
  • 2010-12-29
  • 2013-12-26
  • 2018-05-01
相关资源
最近更新 更多