Python geo pandas - как агрегировать (или сделать какую-то другую статистику) значения точек внутри многоугольника? - PullRequest
0 голосов
/ 16 апреля 2020

У меня проблема с geo pandas, и я сам не могу придумать умное решение ...

У меня есть два кадра данных geo pandas. Одна содержит геометрию точек (например, города), другая геометрия многоугольника (например, страны). Каждая точка имеет значения (например, граждан), и я хочу определить общее количество граждан в пределах многоугольника. У них обоих одинаковый CRS.

Любой, кто может предоставить мне быстрый и универсальный c способ кодирования, который в python?

, с которым я работаю Python 3.7 и geo pandas 0.7.0.

Большое спасибо заранее!

1 Ответ

1 голос
/ 17 апреля 2020

Я думаю, что лучший рабочий процесс, который вы можете иметь в этой точке, это

  1. Пространственное соединение, чтобы сопоставить ваши точки с полигоном, которому они принадлежат
  2. groupby ваш идентификатор полигона и agg('sum')

Вы можете найти этот ответ о том, как использовать его для выбора наблюдений, которые попадают куда-то, например, в Европе

Синтаксис следующий:

geopandas.sjoin(points, polygons, how="inner", op='within')

Примечание. Для выполнения таких операций необходимо установить rtree. Если вам нужно установить эту зависимость, используйте pip или conda для ее установки

Пример

Давайте возьмем слияние между городами и странами и агрегируем значения по континентам.

import geopandas
import numpy as np

world = geopandas.read_file(geopandas.datasets.get_path('naturalearth_lowres'))
cities = geopandas.read_file(geopandas.datasets.get_path('naturalearth_cities'))

Мы создаем фиктивную переменную в cities данных:

cities['pop'] = np.random.randint(1, 6, cities.shape[0])

cities.head(3)
    name            geometry    pop
0   Vatican City    POINT (12.45339 41.90328)   4
1   San Marino      POINT (12.44177 43.93610)   1
2   Vaduz           POINT (9.51667 47.13372)    1

Пространственное соединение выполняется с использованием метода, описанного выше:

data_merged = geopandas.sjoin(cities, world, how="inner", op='within')

data_merged.head(2)
    name_left   geometry    pop     index_right     pop_est     continent   name_right  iso_a3  gdp_md_est
0   Vatican City    POINT (12.45339 41.90328)   4   141     62137802    Europe  Italy   ITA     2221000.0
1   San Marino  POINT (12.44177 43.93610)   1   141     62137802    Europe  Italy   ITA     2221000.0

Обратите внимание, что например, вы получите объект point geo pandas, если хотите построить график.

Затем вы можете использовать стандартный синтаксис pandas для вычисления статистики по вашим точечным данным

data_merged.groupby('continent').agg('sum')

    pop     index_right     pop_est     gdp_md_est
continent               
Africa  153     3430    1471168898  8227904.00
Asia    129     4761    4462705033  56109347.77
Europe  125     5392    1013640800  35541477.00
North America   47  587     569302584   23362898.00
Oceania     12  415     36220960    1401392.00
South America   23  494     426315904   6381910.00
...