PANDAS -GEO PANDAS: локализация точек в шейп-файле - PullRequest
0 голосов
/ 16 апреля 2020

Используя pandas и geo pandas, я хотел бы определить функцию, которая будет применяться к каждой строке кадра данных, которая работает следующим образом: INPUT: столбец с координатами OUTPUT: зона, в которую попадает точка.

Я пытался с этим, но это занимает очень много времени.

def zone_assign(point,zones,codes):
    try:
        zone_label=zones[zones['geometry'].contains(point)][codes].values[0]
    except:
        zone_label=np.NaN
    return(zone_label)

где: точка - это ячейка строки, которая содержит географические координаты; zone - шейп-файл, импортированный с геопандами; коды - это столбец шейп-файла, который содержит метку, которая будет присвоена точке.

1 Ответ

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

Часть ответа взята из другого ответа, который я сделал ранее , который необходим внутри, а не содержит

Ваша ситуация похожа на типичный случай, когда 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()

enter image description here и базовый набор данных объединит необходимую нам информацию

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 метод соединения, но это параметр, который вы можете изменить, например, если вы хотите сохранить все точки, в том числе и те, которые не входят в многоугольник.

...