使用Python对shapefile进行简单的主题映射?


37

我希望在不使用ArcGIS / ArcPy的情况下使用Python可视化地理数据并制作地图。

在互联网上,我发现了如何使用Python制作专题图

这是我尝试过的一些代码:

import shpUtils
import matplotlib.pyplot as plt

shpRecords = shpUtils.loadShapefile('C:\\Users\\shapefile.shp')

for i in range(0,len(shpRecords)):
    x = []
    y = []
    for j in range(0,len(shpRecords[i]['shp_data']['parts'][0]['points'])):

    tempx = float(shpRecords[i]['shp_data']['parts'][0]['points'][j]['x'])
    tempy = float(shpRecords[i]['shp_data']['parts'][0]['points'][j]['y'])
    x.append(tempx)
    y.append(tempy)
    plt.fill(x,y)

plt.axis('equal')
plt.title("Testing")
plt.show()

但是,当我运行它时,它会给我随机的颜色。

如果我想可视化shapefile的某一列,如何使用类似的代码实现呢?

在上面提供的链接中,这很不清楚,他只讨论颜色的使用...

我是否可能需要其他模块来完成此任务,例如笛卡尔PySAL

Answers:


61

我不了解ArcPy,但是多年来我一直在Python中使用shapefile和栅格

  1. 为了在Python中处理shapefile,有许多模块,例如osgeo / ogrFionaPysalPyshpshpUtils是其中之一,但不是最常用的),以及其他模块,请参见Pypi:GIS和gis.stackexchange上的示例以及网络(不仅是英文)。它们中的大多数比ArcPy(或arcgisscripting)要古老得多...
  2. 处理光栅可以使用OSGEO / @中,标准
  3. 为了处理地理空间的几何形状,有身材匀称
  4. 为绘制几何形状,你可以使用matplotlib,并可能笛卡尔,为地区matplotlib的“延伸”,但也有许多,许多其他模块,看到 的PyPI:绘图和模块,如编写Mayavi的3D表现(matplotlib也)
  5. 还有诸如mapnik之类的模块 ,它们直接为您提供以下可能性:1)读取shapefile和4)使用模块Pycairo进行绘图。

之后,就像一个GIS:

  • 您可以使用模块1)打开,保存shapefile,并根据需要对其他模块(例如numpy或scipy)进行处理。
  • 您可以使用shape来处理和分析几何对象(缓冲区等)。
  • 您可以使用matplotlib绘制几何图形,但是matplotlib不知道要绘制什么图形。您可以使用模块1)或3)来指定要绘制的内容(属性等)以及如何绘制。

如果要可视化shapefile的某一列,如何在代码中实现呢?

因此,您必须学习matplotib和其他模块。您必须学习ArcPy,这是相同的...(网络上有很多很棒的教程,尤其是对于matplolib,由于它是纯Python,因此ArcPy更容易实现)。

仅使用Python的一些示例

在此处输入图片说明

基于属性的颜色的地质图(多边形shapefile)

在此处输入图片说明

基于属性具有颜色的3D点(PointZ shapefile)

在此处输入图片说明

DEM上的3D点(以z为属性的Point shapefile)和3D线(PolyLineZ shapefile)以及覆盖在DEM曲面上的栅格上。

在此处输入图片说明

基于原始shapefile(折线shapefile)的属性(地质构造=横截面)的具有z值和颜色的地形轮廓

在此处输入图片说明

带模块Mayavi2的DEM(GeoTIFF)

在此处输入图片说明

带有visvis模块的DEM(ESRI ascii网格,.asc)和Point shapefile(以z为属性)

在此处输入图片说明

钻孔(折线Z的3D缓冲区,其颜色基于属性(地质构造),颜色由点shapefile(以z为属性)中的numpy和matplotlib模块计算出的网格表面,通过visvis模块可视化


16

我遇到了类似的问题,需要快速可视化shapefile,并且我总是发现Matplotlib方法相当长,可以完成这么小的任务。取而代之,我开发了“ Python地理可视化工具”模块,简称为GeoVis。更新: v0.2.0现在已经发布了许多新功能。

有了它,可视化shapefile就再简单不过了:

import geovis
geovis.ViewShapefile("C:/yourshapefile.shp")

瞧,您的地图会在Tkinter窗口中作为图像弹出,您也可以将地图保存到图像文件中。还可以对地图进行样式,着色和添加多层,并且在最新版本中,您还可以基于属性进行分类放大到特定区域。在下面的地图中,geovis在大约5分钟内加载了世界上所有的GADM省并对其进行了分类着色。您可以从此处下载GeoVis,还可以其中阅读有关如何使用它的更多信息。

在此处输入图片说明

目的是在易于安装和易于使用的基础上,GeoVis可以供拥有Python且不需要任何其他模块的任何人使用,因为它可以使用内置的Tkinter Canvas作为渲染器。但是强烈建议您拥有或获取Aggdraw,PIL或PyCairo,它们也可以用作渲染器,并且速度更快,质量更高。

Backdraw是您的shapefile必须使用纬度/经度坐标系取消投影-它尚未处理投影或变换。



1

在2019年,用python中的shapefile制作专题图的最简单方法是geopandas

文档中的示例:http : //geopandas.org/mapping.html

import geopandas
world = geopandas.read_file(geopandas.datasets.get_path('naturalearth_lowres'))
world['gdp_per_cap'] = world.gdp_md_est / world.pop_est
world.plot(column='gdp_per_cap')
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.