Просторові об'єднання з Geopandas
Свайпніть щоб показати меню
Просторові з'єднання — це потужний спосіб об'єднання геопросторових наборів даних на основі їхніх просторових відносин, а не лише за збігом атрибутів. За допомогою geopandas можна легко виконувати просторові з'єднання, щоб відповісти на запитання на кшталт «Які точки знаходяться в яких полігонах?» або «Які об'єкти розташовані найближче один до одного?». Основний інструмент для цього в geopandas — це метод sjoin(), який об'єднує два об'єкти GeoDataFrame, оцінюючи їхні просторові відносини.
Припустимо, у вас є два просторові набори даних: один містить розташування шкіл (у вигляді точок), а інший — межі районів (у вигляді полігонів). Виконавши просторове з'єднання, можна визначити, яка школа знаходиться в якому районі, або підрахувати кількість шкіл у кожному районі.
Метод sjoin() у geopandas дозволяє вказати тип просторового відношення для з'єднання, наприклад, within, contains або intersects. Крім того, можна обрати тип з'єднання — left, right або inner, що визначає, як записи з кожного набору даних будуть зіставлені та збережені у результаті.
123456789101112131415161718192021222324252627282930313233343536import geopandas as gpd from shapely.geometry import Point, Polygon # Create GeoDataFrame of points (e.g., schools) points = gpd.GeoDataFrame({ "school": ["A", "B", "C"], "geometry": [ Point(1, 1), Point(2, 2), Point(3, 3) ] }) # Create GeoDataFrame of polygons (e.g., neighborhoods) polygons = gpd.GeoDataFrame({ "neighborhood": ["Red", "Blue"], "geometry": [ Polygon([(0,0), (0,2), (2,2), (2,0)]), # Red neighborhood Polygon([(2,2), (2,4), (4,4), (4,2)]) # Blue neighborhood ] }) # Spatial join: which school is in which neighborhood? left_join = gpd.sjoin(points, polygons, how="left", predicate="within") right_join = gpd.sjoin(points, polygons, how="right", predicate="within") inner_join = gpd.sjoin(points, polygons, how="inner", predicate="within") print("Left Join Result:") print(left_join[["school", "neighborhood"]]) print("\nRight Join Result:") print(right_join[["school", "neighborhood"]]) print("\nInner Join Result:") print(inner_join[["school", "neighborhood"]])
У наведеному вище прикладі показано три типи з'єднань:
- Left join: зберігає всі точки (школи), додаючи інформацію про район, якщо вона доступна;
- Right join: зберігає всі полігони (райони), додаючи школи, що знаходяться в них;
- Inner join: зберігає лише ті точки, які знаходяться в районі.
Вибір правильного типу з'єднання залежить від цілей аналізу. Наприклад, якщо потрібно отримати всі школи незалежно від того, чи знаходяться вони в районі, використовуйте left join. Якщо потрібно побачити всі райони та школи, які в них розташовані, використовуйте right join. Якщо цікавлять лише школи, що знаходяться в районах, використовуйте inner join.
Дякуємо за ваш відгук!
Запитати АІ
Запитати АІ
Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат