Saya memiliki garis bujur dan garis lintang dan hasil yang diharapkan adalah multipoligon mana pun yang menjadi titiknya, saya mendapatkan nama atau ID multipoligon.

import geopandas as gpd

world = gpd.read_file('/Control_Areas.shp')
world.plot()

Keluaran

   0    MULTIPOLYGON (((-9837042.000 6137048.000, -983...
   1    MULTIPOLYGON (((-11583146.000 5695095.000, -11...
   2    MULTIPOLYGON (((-8542840.287 4154568.013, -854...
   3    MULTIPOLYGON (((-10822667.912 2996855.452, -10...
   4    MULTIPOLYGON (((-13050304.061 3865631.027, -13.

Upaya sebelumnya: Saya telah mencoba fiona, shapely, dan geopanda untuk menyelesaikannya, tetapi saya telah berjuang keras untuk membuat kemajuan dalam hal ini. Yang paling dekat yang saya dapatkan adalah fungsi dalam dan berisi, tetapi bidang pekerjaan yang saya perjuangkan adalah transformasi multipoligon menjadi poligon dengan sukses juga dan kemudian memanfaatkan kekuatan dalam dan berisi untuk mendapatkan output yang diinginkan.

Shapefile telah diunduh dari di sini.

0
Aizaz Ali 3 September 2020, 14:32

1 menjawab

Jawaban Terbaik

world.crs memberikan {'init': 'epsg:3857'} (proyeksi Web Mercator) jadi Anda harus terlebih dahulu memproyeksikan ulang GeoDataFrame Anda dalam proyeksi WGS84 jika Anda ingin mempertahankan sistem koordinat lintang-bujur titik Anda.

world = world.to_crs("EPSG:4326")

Kemudian Anda dapat menggunakan metode intersects dari GeoPandas untuk menemukan indeks Poligon yang berisi titik Anda.

Misalnya untuk kota New York:

from shapely.geometry import Point
NY_pnt = Point(40.712784, -74.005941)
world[["ID","NAME"]][world.intersects(NY_pnt)]

Yang mengakibatkan:

ID  NAME
20  13501   NEW YORK INDEPENDENT SYSTEM OPERATOR

Anda dapat memeriksa hasilnya dengan metode shapely within:

NY_pnt.within(world["geometry"][20])

Jika Anda memiliki banyak titik, Anda dapat membuat GeoDataFrame dan menggunakan metode sjoin:

NY_pnt = Point(40.712784, -74.005941)
LA_pnt = Point(34.052235, -118.243683)
points_df = gpd.GeoDataFrame({'geometry': [NY_pnt, LA_pnt]}, crs='EPSG:4326')
results = gpd.sjoin(points_df, world, op='within')
results[['ID', 'NAME']]

Keluaran:

ID  NAME
0   13501   NEW YORK INDEPENDENT SYSTEM OPERATOR
1   11208   LOS ANGELES DEPARTMENT OF WATER AND POWER
2
J-B 3 September 2020, 13:12