代码之家  ›  专栏  ›  技术社区  ›  Alpha

检查点是否在边界内

  •  0
  • Alpha  · 技术社区  · 6 年前

    我有一个描述西班牙边界的点列表。我想知道一对lat,lon是否在这些边界内。我尝试了以下方法:

    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。事实上,我没有得到一个点,我试图返回一个真的。

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

    1 回复  |  直到 6 年前
        1
  •  2
  •   Alpha    6 年前

    以防万一其他人也有同样的问题。以下代码工作正常:

    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”: