如何从 GeoPandas DataFrame 创建 shapefile?

Posted

技术标签:

【中文标题】如何从 GeoPandas DataFrame 创建 shapefile?【英文标题】:How do I create a shapefile from a GeoPandas DataFrame? 【发布时间】:2021-12-28 18:58:17 【问题描述】:

我在使用 GeoDataFrame.to_file() 函数将 GeoPandas DataFrame 写入 shapefile 时遇到问题。当我运行下面的代码时,有时我得到一个空的 shapefile,有时它运行但什么也不返回。

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


arcpy.env.overwriteOutput = True

arcpy.env.workspace = r'F:\\GY539_Programming\\project_data'
ws = arcpy.env.workspace

files = glob.glob(ws + '/*.csv')
for filename in files:
    df = pd.read_csv(filename, sep=',')
    geometry = [Point(xy) for xy in zip(df['Longitude'], df['Latitude'])]
    gdf = gpd.GeoDataFrame(df, crs='EPSG:4326', geometry=geometry)
    gdf.to_file('file.shp', driver='ESRI Shapefile')

有什么建议吗?我的数据来自一个 csv 文件,该文件包含一列带有经度坐标和另一列带有纬度坐标。这是它的一个sn-p:

              Api  Permit  ... Latitude Longitude
0     5.000000e+13  163019  ...    61.14   -149.98
1     5.000000e+13  100001  ...    61.21   -149.77
2     5.000000e+13  163015  ...    61.33   -149.91
3     5.000000e+13  165037  ...    61.30   -149.99
4     5.000000e+13  100002  ...    61.42   -149.81

非常感谢!

【问题讨论】:

会不会是files返回一个空列表? Aslo 在每次 for 循环迭代中您使用文件名 file.shp 保存,因此会覆盖您之前保存的文件,这意味着最终您将只有一个 shapefile。但我不认为那是你的意图。 感谢您的 cmets!我用打印语句检查了文件,它确实打印了我保存在文件夹中的几个 csv 文件的列表。 我知道名称覆盖问题。这是我认为接下来可以解决的问题。 您能否检查files 变量中的最后一个csv 文件。它可能是空的吗? 【参考方案1】:

感谢您添加示例文件。 问题是,如果您提供像这里这样的相对文件路径

gdf.to_file('file.shp', driver='ESRI Shapefile')

然后文件保存在您当前的工作目录中,该目录可能不是您希望文件出现的目录,因此不要在那里搜索文件是否存在。如果要将 shapefile 保存到另一个工作目录,则只需提供一个绝对文件路径,如下例所示:

filepath = "C:/users/your/file/path"
gdf.to_file(f"filepath/file.shp", driver='ESRI Shapefile')

这对您的示例数据有用。我还可以通过像这样将文件作为 GeoDataFrame 再次加载来验证这一点:

gpd_df = gpd.read_file(f"filepath/file.shp")

希望也能为您解决。

【讨论】:

谢谢 intedgar!不幸的是,这仍然对我不起作用!在玩了一些之后,我认为这是crs的问题。由于某种原因,GeoDataFrame 中的 crs 没有附加到输出文件中。当我运行代码时,它会创建一个输出文件,但是当我在 ArcPro 中打开它时,它不包含任何点并且会弹出“未知坐标系”错误。奇怪的是,新的 shapefile 确实有一个正确的属性表!我想知道这是否可能是我的 geopandas (0.9.0) 版本的错误?

以上是关于如何从 GeoPandas DataFrame 创建 shapefile?的主要内容,如果未能解决你的问题,请参考以下文章

GeoPandas 笔记: GeoDataFrame.plot()

python包介绍:GeoPandas(初识)

Pandas (GeoPandas)笔记:set_index & reset_index

组合 Geopandas 数据框中的行

Python之深入解析一行代码计算每个省面积的神器Geopandas

Python中的GeoPandas和GeoDataFrame