簡體   English   中英

GeoJSON 和 MuliPolygon:將多邊形數據整形為數據框(python,勻稱)

[英]GeoJSON and MuliPolygon: shape polygon data into dataframe (python, shapely)

我必須找到這個點是否屬於一個區域。 信息由 geojson 文件提供。 我通過以下方式創建了 DataFrame:

choro = pd.concat([pd.DataFrame({'name':block['properties']['name'], 'area': shape(block['geometry'])}) for block in geojson['features']], ignore_index=True)

該代碼與警告一起工作:

ShapelyDeprecationWarning:不推薦使用多部分幾何圖形的迭代,並將在 Shapely 2.0 中刪除。 使用geoms屬性訪問多部分幾何的組成部分

但有效! 順便說一句,如果您知道如何修改代碼以關閉該警告 - 非常感謝!

數據框看起來像:

在此處輸入圖片說明

這是檢查點是否屬於該區域的代碼:

for index, area in choro.iterrows():
    polygon = area['area']
    if polygon.contains(point):
        print('Point belongs to ',area['name'])

如果我更改我的數據框(排除“形狀”命令)以僅獲取坐標(並且沒有警告消息):

choro = pd.concat([pd.DataFrame({'name':block['properties']['name'], 'area': block['geometry']['coordinates']}) for block in geojson['features']], ignore_index=True)

我會有:

在此處輸入圖片說明

顯然是多邊形的“形狀”命令:

polygon = shape(area['area'])

和:

polygon = MultiPolygon(area['area'])

不再工作了。

問題是我如何獲得更清晰的代碼:將多邊形(或任何其他“工作”結構)存儲在數據幀結構中以使用勻稱函數來查找點是否屬於該區域並且沒有任何警告或錯誤.

您可以使用geopandas包輕松創建您的 DataFrame,如下所示:

import geopandas as gpd
import geojson
import pandas as pd
with open("FileName.geojson", encoding='UTF-8') as json_file:
    geojson = geojson.load(json_file)
df = gpd.GeoDataFrame.from_features(geojson["features"])
df['Area']= df['geometry'].area
df['centroid'] = df['geometry'].centroid

然后創建此函數以返回任何點的多邊形名稱:

def find_department(point):
    for index, row in df.iterrows():
        if row.geometry.contains(point):
            return row['name']

要定義地理點,您可以使用:

from shapely.geometry import shape, Point
point = Point(Longitude, latitude)

如果您想使用shapely ,我想直到您確認您的代碼運行良好,沒有任何錯誤或警告,但這里有一些例外錯誤:

  1. 您以相反的順序放置點坐標。 記住它是(經度,緯度)
  2. 點和 geoJSON 文件可能不具有相同的坐標參考系統(CRS) 請確保使用正確的EPSG值導出您的 geoJSON 文件,即: WGS84 (EPSG: 4326)查看此 PDF以了解更多詳細信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM