Как использовать геопанду или стройную форму, чтобы найти ближайшую точку в том же геодатафрейме - PullRequest
0 голосов
/ 10 июня 2019

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

Я легко могу это сделать, если у меня есть разные геоданные, использующие ближайшие_пункты (geom1, geom2) в библиотеке shapely.ops.Однако все мои местоположения хранятся в одном геоданных.Я пытаюсь выполнить цикл, и вот где у меня возникают проблемы

Вот мой пример файла:

geofile=gpd.GeoDataFrame([[0,'location A',Point(55,55)],[1,'location B',Point(66,66)],[2, 'Location C' ,Point(99,99)],[3, 'Location D' ,Point(11,11)]],columns=['ID','Location','geometry'])

Вот цикл, который я создаю безрезультатно.

for index, row in geofile.iterrows():
    nearest_geoms=nearest_points(row, geofile)
    print('location:' + nearest_geoms[0])
    print('nearest:' + nearest_geoms[1])
    print('-------')

Я получаю эту ошибку:

AttributeError: 'Series' object has no attribute '_geom'

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

Мой конечный результат для одного местоположения будет следующим:

([0,'location A','location B', '5 miles', Point(55,55)], columns=['ID','Location','Nearest', 'Distance',geometry'])

1 Ответ

1 голос
/ 10 июня 2019

Функция Shapely near_points сравнивает геометрические фигуры. Чтобы сравнить геометрию одной точки с несколькими другими геометриями точки, вы можете использовать .unary_union для сравнения с результирующей геометрией MultiPoint. И да, при каждой операции строки удаляйте соответствующую точку, чтобы она не сравнивалась с самой собой.

import geopandas as gpd
from shapely.geometry import Point
from shapely.ops import nearest_points

df = gpd.GeoDataFrame([[0, 'location A', Point(55,55)], 
                       [1, 'location B', Point(66,66)],
                       [2, 'Location C', Point(99,99)],
                       [3, 'Location D' ,Point(11,11)]], 
                      columns=['ID','Location','geometry'])
df.insert(3, 'nearest_geometry', None)

for index, row in df.iterrows():
    point = row.geometry
    multipoint = df.drop(index, axis=0).geometry.unary_union
    queried_geom, nearest_geom = nearest_points(point, multipoint)
    df.loc[index, 'nearest_geometry'] = nearest_geom

В результате

    ID  Location    geometry        nearest_geometry
0   0   location A  POINT (55 55)   POINT (66 66)
1   1   location B  POINT (66 66)   POINT (55 55)
2   2   Location C  POINT (99 99)   POINT (66 66)
3   3   Location D  POINT (11 11)   POINT (55 55)

enter image description here

...