У меня есть файл shp Вроцлавские границы города и Вроцлавские велосипедные дорожки . Я хотел бы посчитать, сколько км велосипедных дорожек в каждом районе.
Чтобы вычислить, что я хотел выбрать только пути, которые есть в каждом районе, а затем суммировать их длины. Я попытался сделать это 4 способами, и не получилось. Для простоты примера давайте используем только первый район
import geopandas as gpd
#For ease of the example, lets use only first district
district = city_bounderies.iloc[[0], ]
type(district)
#we can see that there are some bicycle paths in this district
plot = district.plot( color = "red")
bicycle_path.plot(ax = plot)
#for example bicycle path 8982 id in the district
plot = district.plot( color = "red")
bicycle_path.iloc[[8982],].plot(ax = plot)
1. geo pandas внутри метода - в зависимости от того, что я прочитал здесь
district_bicycle_path = bicycle_path[bicycle_path.geometry.within(district)]
но в результате я получаю пустой фрейм данных
2. geo pandas метод клипа - в зависимости от того, что я прочитал здесь
bicycle_path.clip(district)
district.clip(bicycle_path)
Но оба они дают ошибку: # TypeError: float() argument must be a string or a number, not 'LineString'
3. geo pandas метод стирания - в зависимости от того, что я прочитал здесь
bicycle_path.Erase(district)
Но это дает ошибку: #error AttributeError: 'GeoDataFrame' object has no attribute 'Erase'
4. geo pandas оверлей функции
gpd.overlay(district, bicycle_path, how='intersection')
Ошибка: #error TypeError: overlay only takes GeoDataFrames with (multi)polygon geometries.
РЕДАКТИРОВАТЬ:
Я добавляю меньший, воспроизводимый пример , на основе описания, как создать shp
Исходный набор данных выглядит примерно так
import geopandas as gpd
from shapely.geometry import Point, Polygon, LineString
# Create an empty geopandas GeoDataFrame
Sample_district = gpd.GeoDataFrame()
Sample_line = gpd.GeoDataFrame()
# Create a new column called 'geometry' to the GeoDataFrame
Sample_district['geometry'] = None
Sample_line['geometry'] = None
# Coordinates of the sample data
coordinates_district = [(0, 0), (2, 0), (2, 2), (0, 2)]
coordinates_bicycleroad = [(-1, 1), (3, 1)]
# Create a Shapely polygon from the coordinate-tuple list
poly = Polygon(coordinates_district)
line = LineString(coordinates_bicycleroad)
# Insert the polygon into 'geometry' -column at index 0
Sample_district.loc[0, 'geometry'] = poly
Sample_line.loc[0, 'geometry'] = line
#Plot
p = Sample_district.plot(color = "blue")
Sample_line.plot(ax = p, color = "red")
, что дает сюжет
Но я бы хотел убрать все велосипедные дороги, которые находятся за пределами округа, чтобы выглядеть примерно так:
Sample_line_desired = gpd.GeoDataFrame()
Sample_line_desired['geometry'] = None
coordinates_bicycleroad_desired = [(0, 1), (2, 1)]
line_desired = LineString(coordinates_bicycleroad_desired)
Sample_line_desired.loc[0, 'geometry'] = line_desired
p = Sample_district.plot(color = "blue")
Sample_line_desired.plot(ax = p, color = "black")