将 Geopandas 数据框直接导出到压缩的 shapefile
Exporting a Geopandas dataframe to a zipped shapefile directly
我正在尝试将 Geopandas 数据框保存到直接写入压缩文件夹的 shapefile 中。
任何 shapefile 用户都知道,shapefile 不是单个文件,而是要一起读取的文件集合。所以调用 myGDF.to_file(filename='myshapefile.shp', driver='ESRI Shapefile')
不仅会创建 myshapefile.shp
,还会创建 myshapefile.prj
、myshapefile.dbf
、myshapefile.shx
和 myshapefile.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?
类似的方法对您有用 - 将 shapefile 转储到一个新的临时目录,然后将所有内容压缩到该临时目录中。
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)
只需使用zip
作为文件扩展名,保留驱动程序名称:
myGDF.to_file(filename='myshapefile.shp.zip', driver='ESRI Shapefile')
这应该适用于 GDAL 3.1 或更新版本。
从 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 中。
任何 shapefile 用户都知道,shapefile 不是单个文件,而是要一起读取的文件集合。所以调用 myGDF.to_file(filename='myshapefile.shp', driver='ESRI Shapefile')
不仅会创建 myshapefile.shp
,还会创建 myshapefile.prj
、myshapefile.dbf
、myshapefile.shx
和 myshapefile.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?
类似的方法对您有用 - 将 shapefile 转储到一个新的临时目录,然后将所有内容压缩到该临时目录中。
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)
只需使用zip
作为文件扩展名,保留驱动程序名称:
myGDF.to_file(filename='myshapefile.shp.zip', driver='ESRI Shapefile')
这应该适用于 GDAL 3.1 或更新版本。
从 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)