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)
Другие вопросы по тегам