Python循环不能在循环多边形时在多边形内找到点

时间:2015-11-09 09:03:47

标签: python geojson shapely

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

我正在使用 Shapely Python库的contains()循环遍历商店位置的csv文件,获取lat和lon坐标,然后检查坐标是否存在于geojson的多边形中文件。

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

但这太慢了,所以我想先颠倒过程并首先循环遍历多边形/ geojson文件,然后针对数千个坐标检查数十万个多边形,而不是相反。

然而,当我简单地切换循环以检查坐标上的多边形时,contains()找不到任何匹配项,即使它在我首先遍历坐标并检查它们与多边形对齐时找到了正确的匹配项。这是相同的代码,除了颠倒。

代码(包含错误):

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 个答案:

答案 0 :(得分:0)

在这两种情况下,

break的行为都不同。它只会突破最内层的循环,在“正确”的情况下,循环是data['features'],但在不正确的情况下,是循环通过locationsFile