Есть ли способ использовать geopandas / shapely / fiona для получения наивысшей точки внутри многоугольника?

У меня есть шейп-файл точек и шейп-файл многоугольников. Я хочу найти наивысшую точку в каждом многоугольнике. Я сделал пересечение, чтобы узнать, какие точки принадлежат каждому многоугольнику:

import geopandas as gpd

from geopandas.tools import sjoin

point = gpd.GeoDataFrame.from_file(pointSHP)
print("POINT", point)
poly = gpd.GeoDataFrame.from_file(polygonSHP)
print("POLY", poly)
points_within_poly = gpd.sjoin(point, poly, how="inner", op='intersects')
print(points_within_poly.head(10))

Теперь я хотел бы выбрать наивысшую точку для каждого index_right. Я думаю, что это вопрос сортировки по значению Z в столбце геометрии, но у меня возникают проблемы с этим. Я не знаю, как извлечь координату Z из геометрии с помощью геопанд. Наконец, я хотел бы выполнить пространственное соединение и указать значение Z до ближайшей точки (другой шейп-файл).

Спасибо


person Javier    schedule 09.07.2020    source источник
comment
Чтобы получить значение z из 3D-точки в вашем случае, просто используйте point.geometry[0].z для первого элемента во фрейме геоданных.   -  person swatchai    schedule 10.07.2020
comment
спасибо swatchai, знаете ли вы, как я могу сохранить точку с наибольшим значением для каждого многоугольника? После этого мне просто нужно соединить эту точку с другим набором точек в том же многоугольнике, используя идентификатор многоугольника. Спасибо :)   -  person Javier    schedule 11.07.2020


Ответы (1)


Я сосредоточусь на первом вопросе, используйте его, чтобы извлечь координату z.

import geopandas as gpd
gdf = gpd.read_file("file.shp")
gdf['z'] = None
gdf['z'] = gdf.geometry.apply(lambda x: list(x.coords)[0][2])

или, альтернативно,

z_values = [list(x.coords)[0][2] for x in gdf.geometry]
gdf['z'] = None
gdf['z'] = z_values

объяснение: для каждой геометрии составьте список coords из геометрии, возьмите первое[0] из списка coords и возьмите третье значение [2], которое является значением z геометрии (потому что первое [0] - это x, а второе [1] - значение y). часть пространственного соединения от ближайшего соседа слишком длинная, чтобы ее можно было записать. Предлагаю задать новый вопрос по этой теме.

person sutan    schedule 29.08.2020