当前位置: 首页 > 知识库问答 >
问题:

当循环多边形时,Python Shapely无法在多边形中找到点

林和煦
2023-03-14

我有一个带有lat和lon的商店位置csv文件。我还有一个geojson文件,其中包含美国人口普查区的多边形特征。我想使用Python查看每个位置存在哪些多边形。

我使用Shapely Python库的包含()来循环通过存储位置的csv文件,获取lat和lon坐标,然后检查这些坐标是否存在于Geojson文件中的一个多边形中。

如果我先遍历每个位置/坐标,然后遍历每个多边形,使用contains()或infrance()检查多边形是否包含该点,那么我的代码将成功运行。

但是这太慢了,所以我想反转这个过程,首先遍历polygons/geojson文件,然后根据数千个坐标检查数十万个多边形,而不是相反。

但是,当我简单地切换循环以对照坐标检查多边形时,contains()不会找到任何匹配项,即使当我首先循环坐标并对照多边形检查它们时,contains()会找到正确的匹配项。代码是一样的,只是颠倒了。

代码(contains显示false):

with open(mapFile) as f:
    data = json.load(f)

    #Loop through features in Geojson file
    for feature in data['features']:

        polygon = shape(feature["geometry"])

        for row in locationsFile:
            #get point coordinates from file
            pointLat = float(row[13])
            pointLon = float(row[14])

            point = Point(pointLon, pointLat)

            print(polygon.contains(point))   
            if polygon.contains(point):

                #Grab data
                newx = feature["properties"]["x"]
                newy = feature["properties"]["y"]
                newz = feature["properties"]["z"]
                #append data
                row.append(newx)
                row.append(newy)
                row.append(newz)
                #update file
                newFile.writerow(row)
                break

此代码生成准确的结果:

with open(mapFile) as f:
    data = json.load(f)

    #Loop through coordinates in CSV file
    for row in locationsFile:
        #get point coordinates from file
        pointLat = float(row[13])
        pointLon = float(row[14])

        point = Point(pointLon, pointLat)

        #Loop through features in Geojson file
        for feature in data['features']:

            polygon = shape(feature["geometry"])

            if polygon.contains(point):

                #Grab data
                newx = feature["properties"]["x"]
                newy = feature["properties"]["y"]
                newz = feature["properties"]["z"]
                #append data
                row.append(newx)
                row.append(newy)
                row.append(newz)
                #update file
                newFile.writerow(row)
                break

共有1个答案

蒋茂材
2023-03-14

break在这两种情况下的行为都不同。它只会中断最里面的循环,在“正确”的情况下,是通过数据['features']的循环,但在不正确的情况下,是通过位置文件的循环

 类似资料:
  • 我有一个数据库,其中一个表(ca_licenses)是商业地址,另一个表是市议会区多边形的公共模式(ca_la_la_council)。 我运行此查询是为了将议会表中的地区号码放在企业地址表中: 我的问题是我总是得不到任何结果。两个几何列都是几何类型,SRID是4326。 示例ca_licenses数据:https://raw . githubusercontent . com/pour safe

  • 返回顶点的输入数组,并且附有一些其他方法,如下面所描述 polygon.area() 返回此多边形的标定区域。如果顶点是逆时针顺序,面积为正,否则为负。 polygon.centroid() 返回一个表示此多边形的质心的两元素数组。 polygon.clip(subject) 对这个多边形剪切主题多边形。换句话说,返回一个多边形表示这个多边形和主题多边形的交集。假定剪切的多边形是逆时针方向以及凸多

  • 我正在寻找一种方法来创建一组多边形(rechtangles),沿着一条线在多个多边形中创建一组多边形(rechtangles),并将其水平隔开,如图所示。 我尝试生成点并将其用作多边形的中点,但问题是,通过创建等间距的点光栅,除了180度之外,不可能以任何其他方向旋转。 例子 给出了一个多多边形形状的对象和由宽度和高度以及每个多边形之间的垂直和水平间距定义的多边形。多边形应仅放置在多多边形内,且不

  • 问题内容: 我对mysql,多边形的Geometric数据类型有一个典型的问题。 我有经度和纬度数组形式的面数据,例如: 我有一个经度和纬度坐标的点(顶点),例如: 现在,我想查找此顶点(点)是否在多边形内。我如何在php中做到这一点? 问题答案: 这是我从另一种语言转换为PHP的功能: 附加: 有关更多功能,我建议您使用此处提供的polygon.php类。使用顶点创建类,并以测试点作为输入调用该

  • 基础示例 <vuep template="#example"></vuep> <script v-pre type="text/x-template" id="example"> <template> <div class="amap-page-container"> <el-amap vid="amap" :zoom="zoom" :amap-manager="ama

  • SVG 多边形 - <polygon> 实例 1 <polygon> 标签用来创建含有不少于三个边的图形。 多边形是由直线组成,其形状是"封闭"的(所有的线条 连接起来)。 polygon来自希腊。 "Poly" 意味 "many" , "gon" 意味 "angle". 下面是SVG代码: <svg xmlns="http://www.w3.org/2000/svg" version="1.1"