Concat несколько шейп-файлов через геопанды
Я пытаюсь объединить несколько шейп-файлов путем реализации следующего:
import geopandas as gpd
import pandas as pd
for i in range(10,56):
interesting_files = "/Users/m3105/Downloads/area/tl_2015_{}_arealm.shp".format(i)
gdf_list = []
for filename in sorted(interesting_files):
gdf_list.append(gpd.read_file((filename)))
full_gdf = pd.concat(gdf_list)
в котором каталог /Users/m3105/Downloads/area
имеет несколько шейп-файлов с такими как tl_2015_01_arealm.shp
, tl_2015_02_arealm.shp
вплоть до tl_2015_56_arealm.shp
, Я хотел бы объединить все эти шейп-файлы и избежать повторения их заголовков. Однако всякий раз, когда я пытаюсь объединить файлы, используя приведенный выше код, я получаю следующую ошибку:
ValueError: Null layer: u''
Обычно я знаю, как объединять CSV-файлы вместе, но я точно знаю, как объединять шейп-файлы. Я был бы очень признателен за любую помощь
3 ответа
Я не могу проверить это, поскольку у меня нет ваших данных, но вы хотите что-то вроде этого (предположим, Python 3):
from pathlib import Path
import pandas
import geopandas
folder = Path("/Users/m3105/Downloads/area")
shapefiles = folder.glob("tl_2015_*_arealm.shp")
gdf = pandas.concat([
geopandas.read_file(shp)
for shp in shapefiles
]).pipe(geopandas.GeoDataFrame)
gdf.to_file(folder / 'compiled.shp')
При использовании pandas.concat в качестве ответа @Paul H некоторая географическая информация, такая как система координат (crs), по умолчанию не сохраняется. Но это сработало при использовании способа, как показано ниже:
import os
import geopandas as gpd
file = os.listdir("Your folder")
path = [os.path.join("Your folder", i) for i in file if ".shp" in i]
gdf = gpd.GeoDataFrame(pd.concat([gpd.read_file(i) for i in path],
ignore_index=True), crs=gpd.read_file(path[0]).crs)
Таким образом, в фрейме геоданных будет CRS, как вам нужно.
У меня недостаточно представителей, чтобы прокомментировать последнюю отправку, но после тестирования входных файлов с разными CRS,
gdf = gpd.GeoDataFrame(pd.concat([gpd.read_file(i) for i in path],
ignore_index=True), crs=gpd.read_file(path[0]).crs)
должно быть
gdf = gpd.GeoDataFrame(pd.concat([gpd.read_file(i).to_crs(gpd.read_file(path[0]).crs) for i in path],
ignore_index=True), crs=gpd.read_file(path[0]).crs)