Я пытаюсь найти, где несколько линий пересекают многоугольник для двух разных геоданных:
from shapely.geometry import Polygon, LineString
import geopandas as gpd
polygon = Polygon([(0, 0), (1, 0), (1, 1), (0, 1), (0, 0)])
line1 = LineString([(0.5, 0.5), (0.7, 0.7)])
line2 = LineString([(0.9, 0.9), (0.2, 0.6)])
poly_gdf = gpd.GeoDataFrame(geometry=[polygon])
line_gdf = gpd.GeoDataFrame(geometry=[line1, line2])
Так выглядят вышеперечисленные геоданные (у одного есть многоугольник, а у другого две линии). Мне кажется, что обе линии пересекают многоугольник:
Однако вывод о пересечении очень запутанный:
print(line_gdf.intersects(poly_gdf))
0 Правда
1 ложь
print(line1.intersects(polygon))
print(line2.intersects(polygon))
Правда
Правда
Почему geopandas
intersect
метод дает другой вывод по сравнению со стандартным shapely
?
Я использую Python 3.5.3 и Geopandas 0.2.1 все на Anaconda.
python
intersection
shapely
geopandas
bgordon
источник
источник
print(line.intersects(polygon))
вас есть доступ к переменной, которая не определена, насколько я вижу. Вы определилиline1
иline2
ранее в коде. Я не знаю, почему это вернуло бы Истину.print(line.intersects(polygon))
была опечатка. Я обновил вопрос, чтобы обратиться кline1
тому, что я имел в виду.line_gdf.info
подтверждает, что у вас есть только один столбец геометрии. Я в тупике. Я буду следить, если найду что-нибудь.Ответы:
При сравнении геоданных и операций с геометрией в Geopandas геометрии сначала сопоставляются по индексу. В случае, когда нет соответствующего индекса (потому что у вас есть только один полигон, например), тогда будет результат
False
.Если бы он сравнивал каждый объект в,
GeoSeries
вам вместо этого нужно было бы получить полный прямоугольный массив данных с логическими значениями, и это, вероятно, было бы очень неэффективно.Если вы хотите сравнить все геометрии, у вас есть два варианта. Первое (и, вероятно, самое простое) - это использование
sjoin
метода геопанды :Это возвращает новое
GeoDataFrame
с геометриями для каждого объекта в левом кадре данных, повторяемыми для каждой геометрии, которую они пересекают справа, с индексом объекта справа, то есть:Второй метод - это
apply
метод pandasGeoSeries
для возврата прямоугольного фрейма данных:Что, в свою очередь, возвращает (с ростом неэффективности по мере роста кадров данных):
В общем, если вам не нужна квадратная матрица, мой совет будет придерживаться
sjoin
метода.источник