目录

  • 说明
  • 1. GDAL安装
  • 2. GDAL读取shp
  • 3. GDAL创建shp
  • 4. GDAL修改shp
  • 5. 参考
  • 6. 相关资源

说明

当我们需要借助编程手段对 Shapefile 进行操作时,会想到用 ArcGIS Engine、ArcGIS Runtime SDK或开源的 GDAL。在没有一定基础的情况下,这些弄起来属实挺麻烦(配环境、写程序等)。当我们做些简单的 Shapefile 数据处理,有没有好办法呢?这里非常推荐使用 Python 语言,介绍三个常用的开发库:

  • ArcPy
    什么是快… ArcPy,下面是文档地址。
    https://desktop.arcgis.com/zh-cn/arcmap/10.5/analyze/arcpy/what-is-arcpy-.htm
    简言之就是 ArcGIS 的配套工具,好用,但是有限定条件:使用它的前提是安装好 ArcGIS 的环境,另外无论是运行还是打包后执行,都将永久依赖 ArcGIS 。

  • pyshp
    由纯 Python 打造的读、写 Shapefile 的轻量级开源工具,Github 地址。
    https://github.com/GeospatialPython/pyshp
    如果你只做 Shapefile 读写的话,用它是非常合适的。

  • GDAL for Python
    嗷它还是 GDAL,但是显然 Python 版本更适合于小型项目(可能叫工具更合适),它比 C++版本的好配太多,也更省去源码编译的过程。功能强大且开源,选它选它。

1. GDAL安装

Python环境就不说了,先到这里下载 GDAL‑<gdal版本>‑cp<python版本>‑<平台架构>.whl 安装包,
https://www.lfd.uci.edu/~gohlke/pythonlibs/#gdal
下载完成后安装

pip install xxx.whl

安装后试一下能否 import 进来包。

D:\test>python
Python 3.7.6 (default, Jan  8 2020, 20:23:39) [MSC v.1916 64 bit (AMD64)] :: Anaconda, Inc. on win32>>> from osgeo import gdal
>>>

没有问题。

2. GDAL读取shp

#!/usr/bin/python
# -*- coding: UTF-8 -*-
from osgeo import gdal
from osgeo import ogr
from osgeo import osrdef ReadShp(_filename):# 支持中文路径gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES")# 支持中文编码gdal.SetConfigOption("SHAPE_ENCODING", "UTF-8")# 注册所有的驱动ogr.RegisterAll()# 打开数据ds = ogr.Open(_filename, 0)if ds == None:return ("打开文件失败!")# 获取数据源中的图层个数,shp数据图层只有一个,gdb、dxf会有多个# iLayerCount = ds.GetLayerCount()# 获取第一个图层oLayer = ds.GetLayerByIndex(0)if oLayer == None:return ("获取图层失败!")# 对图层进行初始化oLayer.ResetReading()# 输出图层中的要素个数num = oLayer.GetFeatureCount(0)result_list = []# 获取要素for i in range(0, num):ofeature = oLayer.GetFeature(i)# shp 文件的 NAME 字段fieldName = ofeature.GetFieldAsString('NAME')# geom = str(ofeature.GetGeometryRef())result_list.append(fieldName)ds.Destroy()del dsreturn result_listif __name__ == '__main__':shpFile = "TM_WORLD_BORDERS-0.3.shp"nameList = ReadShp(shpFile)for name in nameList:print (name)

3. GDAL创建shp

#!/usr/bin/python
# -*- coding: UTF-8 -*-from osgeo import gdal
from osgeo import ogr
from osgeo import osrdef NewShp(_strDriverName):# 支持中文路径gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES")# 属性表字段支持中文gdal.SetConfigOption("SHAPE_ENCODING", "UTF-8")# 注册驱动ogr.RegisterAll()# 创建shp数据strDriverName = "ESRI Shapefile"oDriver = ogr.GetDriverByName(strDriverName)if oDriver == None:return ("驱动不可用:"+strDriverName)# 创建数据源oDS = oDriver.CreateDataSource(_strDriverName)if oDS == None:return ("创建文件失败"+_strDriverName)# 创建一个多边形图层,指定坐标系为WGS84papszLCO = []geosrs = osr.SpatialReference()geosrs.SetWellKnownGeogCS("WGS84")# 线:ogr_type = ogr.wkbLineString# 点:ogr_type = ogr.wkbPointogr_type = ogr.wkbPolygon# 面的类型为Polygon,线的类型为Polyline,点的类型为PointoLayer = oDS.CreateLayer("Polygon", geosrs, ogr_type, papszLCO)if oLayer == None:return ("图层创建失败!")# 创建属性表# 创建id字段oId = ogr.FieldDefn("id", ogr.OFTInteger)oLayer.CreateField(oId, 1)# 创建name字段oName = ogr.FieldDefn("name", ogr.OFTString)oLayer.CreateField(oName, 1)oDefn = oLayer.GetLayerDefn()# 创建要素# 数据集# wkt_geom id namefeatures = ['test0;POLYGON((-1.58 0.53, -0.79 0.55, -0.79 -0.23, -1.57 -0.25, -1.58 0.53))', 'test1;POLYGON((-1.58 0.53, -0.79 0.55, -0.79 -0.23, -1.57 -0.25, -1.58 0.53))']for index, f in enumerate(features):oFeaturePolygon = ogr.Feature(oDefn)oFeaturePolygon.SetField("id",index)oFeaturePolygon.SetField("name",f.split(";")[0])geomPolygon = ogr.CreateGeometryFromWkt(f.split(";")[1])oFeaturePolygon.SetGeometry(geomPolygon)oLayer.CreateFeature(oFeaturePolygon)# 创建完成后,关闭进程oDS.Destroy()print ("数据集创建完成!")if __name__ == '__main__':shpFile = "TestCreateShp.shp"NewShp(shpFile)

4. GDAL修改shp

#!/usr/bin/python
# -*- coding: UTF-8 -*-
from osgeo import gdal
from osgeo import ogr
from osgeo import osr
def UpdateShp(_filename):# 支持中文路径gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES")# 属性表字段支持中文gdal.SetConfigOption("SHAPE_ENCODING", "UTF-8")# 注册驱动ogr.RegisterAll()strDriverName = "ESRI Shapefile"oDriver = ogr.GetDriverByName(strDriverName)if oDriver == None:warninglist.append("驱动不可用:"+strDriverName)return ("驱动不可用:"+strDriverName)# 打开数据oDS = oDriver.Open(_filename, 1)oLayer = oDS.GetLayer()# 编辑属性字段for feature in oLayer: feature.SetField('NAME', "EditName")oLayer.SetFeature(feature)feature.Destroy()oDS.Destroy()print ("编辑完成!")if __name__ == '__main__':shpFile = "TM_WORLD_BORDERS-0.3.shp"UpdateShp(shpFile)

5. 参考

本文参考了

[1]. https://cloud.tencent.com/developer/article/1743325
[2]. https://blog.csdn.net/sinat_41310868/article/details/112722839
[3]. https://www.cnblogs.com/weihongli/p/7843451.html

6. 相关资源

本文用到的示例数据和上贴出的代码,没什么其他特别的东西。

https://download.csdn.net/download/ShyLoneGirl/16752858

.
.
.
.
.
.


桃花仙人种桃树,又摘桃花换酒钱_

Python读写修改Shapefile相关推荐

  1. python读写修改配置文件(ini)

    示例ini配置文件(setting.ini) [txtA] name = comma,end,full,run comma = 1000 end = 3 full = 2 run = 1 defaul ...

  2. Python读写矢量数据(2)矢量数据写入(属性数据)——Python地理数据处理学习分享

    这一节主要介绍矢量数据的写入(只有属性数据,无几何),如果有读者没有读取的基础建议先看一下上一篇文章,需要对矢量数据读取有一定的了解才能继续学习本节.在这里我们用到的数据仍为goble文件夹下的数据, ...

  3. python读取txt文件写入-Python读写txt文本文件的操作方法全解析

    一.文件的打开和创建 >>> f = open('/tmp/test.txt') >>> f.read() 'hello python! hello world! ...

  4. python读中文-python读写中文

    广告关闭 2017年12月,云+社区对外发布,从最开始的技术博客到现在拥有多个社区产品.未来,我们一起乘风破浪,创造无限可能. api api annotation json.dumps( ) 将py ...

  5. python处理excel教程实例-python 读写excel文件操作示例【附源码下载】

    本文实例讲述了python 读写excel文件操作.分享给大家供大家参考,具体如下: 对excel文件的操作,python有第三方的工具包支持,xlutils,在这个工具包中包含了xlrd,xlwt等 ...

  6. python改文件名_通过python顺序修改文件名字的方法

    通过python顺序修改文件名字的方法 更新时间:2018年07月11日 11:48:55 作者:longma666666 今天小编就为大家分享一篇通过python顺序修改文件名字的方法,具有很好的参 ...

  7. Python 读写配置文件模块: configobj 和 configParser

    参考:http://www.voidspace.org.uk/python/configobj.html Python模块之ConfigParser - 读写配置文件:http://www.cnblo ...

  8. python 读写文件 另存为_python读写文件(五)

    今天继续分享python读写文件. 首先介绍一个新的函数open(),这个函数是干什么的呢?在python里面可以用open函数来打开文件.要用open函数打开一个文件,就是要向它传递一个字符串路径, ...

  9. 使用Python批量修改PPTX文件中文本框格式

    问题描述:最近正在整理Python教材的配套PPT,原来的PPT是4:3的,考虑到现在很多屏幕都是宽屏的,于是打算重新整理一下.对于正常的幻灯片,直接在"页面设置"中修改一下就可以 ...

  10. python读写不同编码txt文件

    python读写不同编码txt文件 以后整理规范[python] view plaincopy import os import codecs filenames=os.listdir(os.getc ...

最新文章

  1. OpenCASCADE Make Primitives-Sphere
  2. 测试用例设计方法-错误推测法
  3. Spring读取配置文件,获取bean的几种方式
  4. 【留用】C#的一些好的书籍
  5. java calendar field_Java Calendar详解
  6. 微信小程序开发系列七:微信小程序的页面跳转
  7. java mvc mvp_一篇文章让你彻底了解 MVC、MVP 、MVVM
  8. 视频光端机各种视频接口的传输距离是多少?
  9. web3 0.2.x 和 1.x.x版本之间的差异
  10. 这些数据分析方法你都掌握了么
  11. 插件占坑,四大组件动态注册前奏(二) 系统Service的启动流程
  12. html登录界面QQ微信图标,discuz修改QQ登录图标和微信登录图标的方法
  13. 抓包|获取移动app里的数据,什么是抓包?
  14. Python 爬取手机 豆果美食app存Mongodb
  15. mac pycharm如何打开setting
  16. 【论文泛读171】具有对抗性扰动的自监督对比学习,用于鲁棒的预训练语言模型
  17. AutoJs学习-实现抖音采集
  18. ios状态栏,导航栏,工具栏,tab栏的位置,附图
  19. 利用重复性渐变编写邮件线
  20. WLAN——一篇让你从0到1了解无线局域网的文章

热门文章

  1. (产品分析)KFC肯德基APP分析报告
  2. 如何制作一个HTML网页
  3. java 翻译英文_JAVA 一些常用的英文及翻译
  4. 铺铜需要把agnd和dgnd分开_AGNDDGND 分析
  5. MASM5及LINK命令行
  6. php搜索功能与jquery搜索功能,JavaScript_基于jQuery实现页面搜索功能,jQuery实现页面搜索,搜索筛选 - phpStudy...
  7. vmware workstation网络设置
  8. access 链接mysql数据库教程_ACCESS实例教程(数据库的编程)
  9. 谷歌金山词霸CBSText.dll文件丢失解决方法
  10. google 翻译 tts 语音 tk tkk代码