Как объединить геосерии в геоданные, основанные на атрибутах геометрии? - PullRequest
0 голосов
/ 13 июня 2019

У меня 5868 точек в геоданных с некоторыми столбцами / атрибутами.Между точками, которые имеют расстояние менее 10 м, я просто хочу выбрать только одну точку в качестве представления в этой области.Я сделал, используя следующий код:

ships = gpd.read_file(r"D:\Suhendra\Riset BARATA\data ais\lego_python\kepri_201812_ship.shp")
#'ships' have 5868 data/rows. It is geodataframe with some columns

#remove the 'ships' geometry that have less than 10 m distance each other
point_nodes = list(ships['geometry'])
for i in range(len(point_nodes) - 1):
    if point_nodes[i] is None:
        continue
    for j in range(i + 1, len(point_nodes)):
        if point_nodes[j] is None:
            continue
        if point_nodes[i].distance(point_nodes[j]) < 10: #in meter
            point_nodes[j] = None

new_point_nodes = gpd.GeoSeries([node for node in point_nodes if node is not None])
#'new_point_nodes' have 5321 data, it is just geoseries with geometry information

Результат - 5321 балл (меньше, чем исходные данные), но это просто геосерии, а не геоданные, как в исходных данных.Как выполнить следующее условие, чтобы получить результат как исходные данные?

1 Ответ

0 голосов
/ 13 июня 2019

Вместо слияния результата с вашим исходным DataFrame я предлагаю вам отфильтровать исходный DataFrame на основе ваших расчетов.С этой целью я предлагаю сделать сравнение расстояний на серии панд вместо списка.При этом сохраняется индекс DataFrame оригиналов, что снова позволяет легко фильтровать в конце

point_nodes = ships['geometry']

# Do distance comparisons on pandas Series instead of list
for i in range(len(point_nodes) - 1):
    if point_nodes.iloc[i] is None:
        continue
    for j in range(i + 1, len(point_nodes)):
        if point_nodes.iloc[j] is None:
            continue
        if point_nodes.iloc[i].distance(point_nodes.iloc[j]) < d:
            point_nodes.iloc[j] = None

# Now filter the original DataFrame according to point_nodes (select all elements which are not None in point_nodes)
new_point_nodes = ships.loc[~point_nodes.isnull()]
...