【问题标题】:Check if point is inside boundaries检查点是否在边界内
【发布时间】:2018-03-09 20:51:04
【问题描述】:

我有一个描述西班牙边界的点列表。我希望能够判断一对纬度,经度是否在这些边界内。我尝试了以下方法:

import shapefile
import matplotlib.pyplot as plt
from shapely.geometry import MultiPoint, Point, Polygon
from shapely.geometry.polygon import Polygon
sf = shapefile.Reader(r"\ESP_adm0.shp")
shapes = sf.shapes()
lat = []; lon = []
for i in range(len(shapes[0].points)):
    lon.append(shapes[0].points[i][0]);lat.append(shapes[0].points[i][1])

我知道我正在检索积分,因为我能够绘制并获得所需的结果:

plt.plot(lon,lat,'.', ms=0.1)

(在下面的链接中绘制) plot result

我执行以下操作将点变成一个多边形:

    coords = list(zip(lat,lon))
    spain_pol = Polygon(coords)

然后我使用 contains 函数,总是得到 false。

    spain_pol.contains(Point(0,42))
    spain_pol.contains(Point(42,0))

这两个都返回 false。事实上,我试图返回一个 True 却没有得到任何一点。

我尝试了各种各样的事情,但我想我一定错过了一些基本的东西。也许西班牙有岛屿并且有不止一个多边形的事实是问题所在?我迷路了。欢迎任何帮助。

【问题讨论】:

  • 您是否尝试过使用更简单的多边形(如正方形)的代码?
  • 彻底阅读文档后,您的代码看起来不错。我看到的唯一可能发生的问题是因为 Polygon 声明不当(我没有查到)。
  • @WilliamBurnham 我用一个非常简单的 4 顶点多边形尝试过它,它可以工作。我认为这个问题可能与这实际上是一个多面体有关。
  • @JordiMuñoz 你能提供你正在使用的形状文件吗?如果可能的话,我想试试你的数据。
  • 我设法得到了我想要的结果。我认为我的问题是数据的多面体特征。这是获取文件的链接:gadm.org/country 选择西班牙和 shapefile。我解压缩并得到了 adm0,因为我需要的只是国家边界。我会尝试发布我自己的问题的答案。还是谢谢你!!!

标签: python gis shapefile fiona


【解决方案1】:

以防万一其他人有同样的问题。以下代码完美运行:

import shapefile
import fiona
from shapely.geometry import MultiPoint, Point, Polygon,shape
from shapely.geometry.polygon import Polygon

multipol = fiona.open(r"C:\Users\Jordi\Downloads\ESP_adm_shp\ESP_adm0.shp")
multi = next(iter(multipol))

point = Point(0,42)
point.within(shape(multi['geometry']))

这会返回一个非常受欢迎的“True”:)

【讨论】:

  • 我认为您可以删除import shapefile 行,因为它不再使用了。
猜你喜欢
  • 1970-01-01
  • 2016-07-02
  • 2014-06-11
  • 2014-04-26
  • 2015-04-03
  • 1970-01-01
  • 2013-08-20
相关资源
最近更新 更多