У меня в EPSG: 4326 есть кадр данных геопанды, и я бы создал новый кадр данных, состоящий из всех строк, которые попадают в определенную ограничивающую рамку.
Сначала я получаю ограничивающий прямоугольник, который мне небезразличен (на самом деле это ограничивающий прямоугольник другого фрейма данных):
print df_sussex.total_bounds
[ -1.57239292 50.57467674 0.14528384 51.27465152]
Затем я создаю фрейм данных, состоящий только из этой ограничительной рамки:
pts = gpd.GeoDataFrame(df_sussex.total_bounds)
И, наконец, я пытаюсь получить все функции, которые пересекаются с этим ограничивающим прямоугольником:
sac_sussex = gpd.overlay(pts, df_sac, how='intersection')
Но это дает мне AttributeError: No geometry data set yet (expected in column 'geometry'
.
Что я делаю неправильно?
Ответы:
Проблема в том, что вы используете метод total_bounds. Он создает только кортеж с максимальными и минимальными точками ограничительной рамки. Используемый метод - «конверт»; предыдущий, чтобы построить его соответствующий GeoDataFrame. Например, читая мои шейп-файлы как GeoDataFrame :
Создание ограничивающего прямоугольника pol1 и создание соответствующего GeoDataFrame :
Пересечение обоих GeoDataFrame :
Результаты печати:
Это сработало, как и ожидалось.
Редактирование Примечание:
Используя метод total_bounds (поскольку метод envelope возвращает ограничивающую рамку для каждого объекта полигонов), можно использовать этот подход:
и результат идентичен.
источник
Вы можете использовать
cx
метод на геоданных, чтобы выбрать строки в ограничительной рамке. Для вашего примера кадры:С http://geopandas.org/indexing.html :
источник
.cx
это немного отличается отgpd.overlay
решения: оно выбирает строки, которые пересекают ограничивающую рамку, но оставляет геометрии нетронутыми, тогда какgpd.overlay
решение будет возвращать только части геометрии в ограничительной рамке. В зависимости от ситуации вы можете захотеть одно или другое.