首页软件基础教程GeoPandas【GeoPandas空间数...

【GeoPandas空间数据分析】4.数据的读与写


本系列文章是根据GeoPandas官方文档翻译整理,学习任何一个Python第三方库,其官方文档都是最好的学习资料。相比网络搜索得到的一些资料,官方文档是权威的一手资料,其内容全面、准确可靠。通过官方文档入手,能够保证学习认知不会有大偏差。在学习完官方文档后,可以在寻找其他资料进一步学习。

点击“阅读原文”或者直接访问下方链接,查看翻译整理的“GeoPandas 0.12.2 中文文档”。

https://www.mizhushare.com/docs
本系列文章配套代码获取有以下两种途径:
  • 可以通过百度网盘获取,需要在本地配置代码运行环境:
链接:https://pan.baidu.com/s/185Qs6RpVhyP2nm9VV39Ehw?pwd=mnsj 提取码:mnsj
  • 前往GitHub详情页面,单击 code 按钮,选择Download ZIP选项:
https://github.com/returu/geopandas





01

读取数据


GeoPandas 可以使用geopandas.read_file()命令读取几乎任何基于矢量的空间数据格式,包括 ESRI shapefileGeoJSON GeoPackage等文件格式,返回一个 GeoDataFrame 对象。

上述命令的实现是因为 GeoPandas 使用了 fiona 库,而 fiona 库又使用了一个旨在促进空间数据转换的名为 GDAL/OGR 的大型开源程序。

在文件名之后传递给geopandas.read_file()的任何参数都会直接传递给fiona.open(),后者会进行实际的数据导入。

总的来说,geopandas.read_file() 非常有效,无需额外参数就可以做你想做的事,如要获得更多帮助,请输入:

1>>> import fiona
2
3>>> help(fiona.open)

除此之外,可以使用driver关键字显式设置驱动程序(shapefileGeoJSON),目前fiona只公开了默认的驱动程序,可以通过以下命令查看:

1>>> import fiona
2>>> fiona.supported_drivers
  • 加载shapefile文件:

 1>>> china_gdf = gpd.read_file("./datasets/china/china_provinces.shp")
2>>> china_gdf.head()
3   OBJECTID  省域代  Shape_Leng  Shape_Area                                           geometry
40         1   11   10.115308    1.734812  POLYGON ((116.67527 41.04010116.67616 41.040...
51         2   12   12.341771    1.231230  POLYGON ((117.44383 40.25101117.45611 40.246...
62         3   13   57.093011   19.725624  MULTIPOLYGON (((118.85390 39.10692118.84934 ...
73         4   14   27.203120   15.993148  POLYGON ((114.13714 40.73445114.13860 40.732...
84         5   15  149.939859  129.126641  MULTIPOLYGON (((124.48740 40.15550124.48747 ...
9
10>>> china_gdf.plot()

绘图结果如下图所示:

  • 加载geojson格式数据:

1>>> china_gdf = gpd.read_file('./datasets/china.geojson')
2>>> china_gdf.head()
3   OBJECTID  省域代  Shape_Leng  Shape_Area                                           geometry
40         1   11   10.115308    1.734812  POLYGON ((116.67527 41.04010116.67616 41.040...
51         2   12   12.341771    1.231230  POLYGON ((117.44383 40.25101117.45611 40.246...
62         3   13   57.093011   19.725624  MULTIPOLYGON (((118.85390 39.10692118.84934 ...
73         4   14   27.203120   15.993148  POLYGON ((114.13714 40.73445114.13860 40.732...
84         5   15  149.939859  129.126641  MULTIPOLYGON (((124.48740 40.15550124.48747 ...
  • 加载文件地理数据库中的数据:

 1# 文件地理数据库中包含两个文件:china_national + china_provinces
2# 使用 layer 关键字从多层文件中选择一个图层读取文件地理数据库中指定文件
3>>> china_national = gpd.read_file('./datasets/china.gdb' , layer = "china_national")
4>>> china_national
5   OBJECTID      AREA  PERIMETER  ...  Shape_Length  Shape_Area                                           geometry
60         1  0.001184   0.168217  ...    462.764697  961.831319  MULTIPOLYGON (((113.23390 6.31909113.23230 6...
7
8[1 rows x 10 columns]
9
10>>> china_national.plot()

绘图结果如下图所示:

1>>> china_provinces = gpd.read_file('./datasets/china.gdb' , layer = "china_provinces")
2>>> china_provinces.plot()

绘图结果如下图所示:

  • 加载 web URL 资源:

fiona 支持的情况下,geopandas 还可以直接从 web URL 加载资源,例如来自 geojson.xyzGeoJSON 文件:

 1>>> url = "http://d2ad6b4ur7yvpq.cloudfront.net/naturalearth-3.3.0/ne_110m_land.geojson"
2
3>>> gdf = gpd.read_file(url)
4>>> gdf
5     scalerank featureclass                                           geometry
60            1      Country  POLYGON ((-59.57209 -80.04018, -59.86585 -80.5...
71            1      Country  POLYGON ((-159.20818 -79.49706, -161.12760 -79...
82            1      Country  POLYGON ((-45.15476 -78.04707, -43.92083 -78.4...
93            1      Country  POLYGON ((-121.21151 -73.50099, -119.91885 -73...
104            1      Country  POLYGON ((-125.55957 -73.48135, -124.03188 -73...
11..         ...          ...                                                ...
12122          1      Country  POLYGON ((51.13619 80.5472849.79368 80.41543...
13123          1      Country  POLYGON ((99.93976 78.8809497.75794 78.75620...
14124          1      Country  POLYGON ((-87.02000 79.66000, -85.81435 79.336...
15125          1      Country  POLYGON ((-68.50000 83.10632, -65.82735 83.028...
16126          1      Country  POLYGON ((-27.10046 83.51966, -20.84539 82.726...
17
18[127 rows x 3 columns]
19
20>>> gdf.plot()

绘图结果如下图所示:

  • 加载包含数据的 ZIP 文件:

如果数据集位于 ZIP 文件的文件夹中,则必须附加其名称;如果 ZIP 文件中的一个文件夹中有多个数据集,您还必须指定文件名。

 1>>> zipfile = "./datasets/nybb_16a.zip"
2>>> nybb = gpd.read_file(zipfile)
3>>> nybb
4   BoroCode       BoroName     Shape_Leng    Shape_Area                                           geometry
50         5  Staten Island  330470.010332  1.623820e+09  MULTIPOLYGON (((970217.022 145643.332970227....
61         4         Queens  896344.047763  3.045213e+09  MULTIPOLYGON (((1029606.077 156073.814102957...
72         3       Brooklyn  741080.523166  1.937479e+09  MULTIPOLYGON (((1021176.479 151374.797102100...
83         1      Manhattan  359299.096471  6.364715e+08  MULTIPOLYGON (((981219.056 188655.316980940....
94         2          Bronx  464392.991824  1.186925e+09  MULTIPOLYGON (((1012821.806 229228.265101278...
10
11>>> nybb.plot()

绘图结果如下图所示:

02

写出数据


可以使用 geopandas.GeoDataFrame.to_file() 方法将 GeoDataFrames 导出为许多不同的标准格式。

此外,可以使用 geopandas.GeoDataFrame.to_postgis()方法将 GeoDataFrames 上传到 PostGIS 数据库。

GeoDataFrames 可以包含比大多数文件格式支持的字段类型更多的字段类型。例如,元组或列表可以很容易地存储在 GeoDataFrames 中,但将它们保存到例如GeoPackageShapefile 将引发 ValueError。在保存到文件之前,需要将它们转换为所选驱动程序支持的格式。

  • 写出为Shapefile文件:
1>>> china_gdf.to_file("./out/china.shp",encoding="utf-8")
  • 写出为GeoJSON文件:
1>>> china_gdf.to_file("./out/china.geojson", driver='GeoJSON')
  • 写出为GeoPackage文件:
1>>> china_national.to_file("./out/package.gpkg", layer='china_national', driver="GPKG")
2>>> china_provinces.to_file("./out/package.gpkg", layer='china_provinces', driver="GPKG")

本篇文章来源于微信公众号: 码农设计师

RELATED ARTICLES

欢迎留下您的宝贵建议

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Recent Comments