подсчитать количество полигонов с одинаковой геометрией в одном кадре данных - PullRequest
0 голосов
/ 15 марта 2019

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

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

df_union = gpd.overlay(df_in, df_in, how='union')

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

Если мои предположения верны, я не могу понять, как теперь подсчитать идентичные многоугольники в одном кадре данных, чтобы получить такие результаты, как:

Count geometry

5 POLYGON ((xxxxxx... 1 POLYGON ((xxxxxx...

Я пытался df_union.groupby('geometry') проверить, есть ли идентичные геометрии для подсчета, но это дает результат, который я не могу просмотреть.

Будем весьма благодарны за любые указания на это.

1 Ответ

0 голосов
/ 15 марта 2019

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

Например, для фрейма данных типа

df.head()

id  geometry
0   6795584 MULTIPOLYGON (((652670.3 6862958.2, 652675.6 6...
1   6794255 MULTIPOLYGON (((652935.2 6862338.2, 652935 686...
2   6794256 MULTIPOLYGON (((652988.8 6862328.5, 652991.9 6...
3   6794289 MULTIPOLYGON (((653006.6 6862311.6, 653015.2 6...
4   6794290 MULTIPOLYGON (((652998 6862280.3, 652999.8 686..

мы приводим геометрию как строку

df.geometry= df.geometry.astype(str)

и тогда мы можем сгруппироваться на нем

df.groupby('geometry')['id'].count()
...