如何从 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()
Pandas (GeoPandas)笔记:set_index & reset_index