Часть ответа взята из другого ответа, который я сделал ранее , который необходим внутри, а не содержит
Ваша ситуация похожа на типичный случай, когда spatial joins
полезны. Идея пространственных объединений заключается в объединении данных с использованием географических c координат вместо использования атрибутов.
Три возможности в geopandas
:
intersects
within
contains
Кажется, что вы хотите contains
, что возможно с использованием следующего синтаксиса:
geopandas.sjoin(polygons, points, how="inner", op='contains')
Примечание. Для выполнения таких операций необходимо установить rtree
. Если вам нужно установить эту зависимость, используйте pip
или conda
для ее установки
Пример
В качестве примера возьмем случайную выборку городов и стран-участниц, связанных с ними. , Два примера наборов данных:
import geopandas
import matplotlib.pyplot as plt
world = geopandas.read_file(geopandas.datasets.get_path('naturalearth_lowres'))
cities = geopandas.read_file(geopandas.datasets.get_path('naturalearth_cities'))
cities = cities.sample(n=50, random_state=1)
world.head(2)
pop_est continent name iso_a3 gdp_md_est geometry
0 920938 Oceania Fiji FJI 8374.0 MULTIPOLYGON (((180.00000 -16.06713, 180.00000...
1 53950935 Africa Tanzania TZA 150600.0 POLYGON ((33.90371 -0.95000, 34.07262 -1.05982...
cities.head(3)
name geometry
196 Bogota POINT (-74.08529 4.59837)
95 Tbilisi POINT (44.78885 41.72696)
173 Seoul POINT (126.99779 37.56829)
world
- это мировой набор данных, а cities
- это подмножество.
Оба набора данных должны находиться в одной проекционной системе. Если нет, используйте .to_crs
перед объединением.
data_merged = geopandas.sjoin(countries, cities, how="inner", op='contains')
Наконец, чтобы увидеть результат, давайте создадим карту
f, ax = plt.subplots(1, figsize=(20,10))
data_merged.plot(axes=ax)
countries.plot(axes=ax, alpha=0.25, linewidth=0.1)
plt.show()
и базовый набор данных объединит необходимую нам информацию
data_merged.head(2)
pop_est continent name_left iso_a3 gdp_md_est geometry index_right name_right
7 6909701 Oceania Papua New Guinea PNG 28020.0 MULTIPOLYGON (((141.00021 -2.60015, 142.73525 ... 59 Port Moresby
9 44293293 South America Argentina ARG 879400.0 MULTIPOLYGON (((-68.63401 -52.63637, -68.25000... 182 Buenos Aires
Здесь я использовал inner
метод соединения, но это параметр, который вы можете изменить, например, если вы хотите сохранить все точки, в том числе и те, которые не входят в многоугольник.