Обрезка дорог на основе шейп-файла в Python - PullRequest
0 голосов
/ 22 апреля 2020

У меня есть файл 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")

, что дает сюжет enter image description here

Но я бы хотел убрать все велосипедные дороги, которые находятся за пределами округа, чтобы выглядеть примерно так:

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")

enter image description here

...