将 Geopandas 数据框直接导出到压缩的 shapefile

Posted

技术标签:

【中文标题】将 Geopandas 数据框直接导出到压缩的 shapefile【英文标题】:Exporting a Geopandas dataframe to a zipped shapefile directly 【发布时间】:2021-07-09 06:58:42 【问题描述】:

我正在尝试将 Geopandas 数据框保存到直接写入压缩文件夹的 shapefile 中。

任何 shapefile 用户都知道,shapefile 不是单个文件,而是要一起读取的文件集合。所以调用myGDF.to_file(filename='myshapefile.shp', driver='ESRI Shapefile') 不仅会创建myshapefile.shp,还会创建myshapefile.prjmyshapefile.dbfmyshapefile.shxmyshapefile.cpg。这可能就是为什么我在这里努力获取语法的原因。

考虑一个虚拟的 Geopandas 数据框,例如:

import pandas as pd
import geopandas as gpd
from shapely.geometry import Point

data = pd.DataFrame('name': ['a', 'b', 'c'],
    'property': ['foo', 'bar', 'foo'],
        'x': [173994.1578792833, 173974.1578792833, 173910.1578792833],
        'y': [444135.6032947102, 444186.6032947102, 444111.6032947102])
geometry = [Point(xy) for xy in zip(data['x'], data['y'])]
myGDF = gpd.GeoDataFrame(data, geometry=geometry)

我看到有人使用gzip,所以我尝试了:

import geopandas as gpd
myGDF.to_file(filename='myshapefile.shp.gz', driver='ESRI Shapefile',compression='gzip')

但它不起作用。

然后我尝试了以下方法(在 Google Colab 环境中):

import zipfile
pathname = '/content/'
filename = 'myshapefile.shp'
zip_file = 'myshapefile.zip'
with zipfile.ZipFile(zip_file, 'w') as zipf:
   zipf.write(myGDF.to_file(filename = '/content/myshapefile.shp', driver='ESRI Shapefile'))

但它只将.shp文件保存在一个zip文件夹中,其余的都写在zip文件夹旁边。

如何直接将 Geopandas DataFrame 编写为压缩的 shapefile?

【问题讨论】:

你的myGDF.to_file(... 方法将返回None,而zipf.write 的输入必须是一个字符串,所以这永远不会起作用。我也怀疑您是否使用该代码在 zip 文件中写入了任何文件。 【参考方案1】:

这样的事情对你有用 - 将 shapefile 转储到一个新的 tempdir,然后压缩该 tempdir 中的所有内容。

import tempfile
import zipfile
from pathlib import Path

with tempfile.TemporaryDirectory() as temp_dir:

    temp_dir = Path(temp_dir)

    # geodataframe.to_file(str(d / "myshapefile.shp"))
    with open(temp_dir / "a.shp", "w") as _f:
        _f.write("blah")
    with open(temp_dir / "a.prj", "w") as _f:
        _f.write("blah")

    with zipfile.ZipFile('myshapefile.zip', 'w') as zipf:
        for f in temp_dir.glob("*"):
            zipf.write(f, arcname=f.name)

【讨论】:

【参考方案2】:

只需使用zip作为文件扩展名,保留驱动程序的名称:

myGDF.to_file(filename='myshapefile.zip', driver='ESRI Shapefile')

这应该适用于 GDAL 3.1 或更高版本。

【讨论】:

我得到一个名为myshapefile.zip 的(未压缩的)文件夹。 GDAL 3.3.1【参考方案3】:

从 Geopandas 数据框创建压缩 shapefile

import shutil
import tempfile
from pathlib import Path
#gdf = some geopandas dataframe

with tempfile.TemporaryDirectory() as temp_dir:
  temp_dir = Path(temp_dir)
  localFile = 'myshapefile'

  gdf.to_file(filename=temp_dir, driver='ESRI Shapefile')

  archiveFile = shutil.make_archive(localFile, 'zip', temp_dir)
  shutil.rmtree(temp_dir)

【讨论】:

以上是关于将 Geopandas 数据框直接导出到压缩的 shapefile的主要内容,如果未能解决你的问题,请参考以下文章

使用 geopandas 从 S3 读取文件地理数据库的驱动程序错误

将 csv 和 shapefile 与 geopandas 合并

导出数据框excel直接到sharepoint(或网页)。

如何填充使用 geopandas 溶解地理数据框时创建的多面体中的孔?

来自 Geopandas Dataframe 的 Python Chloropleth Mapbox

text 在geopandas中打开压缩的shapefile