我日常的编程语言是C++,看到周边的同事有学习python,围观了几个小例子,感觉python很不错,用起来很方便。所以我打算利用业余时间学习一些python的知识,如果学会了用GPIO 库控制我的树莓派做一些好玩的事情最好了。这篇文章里。我打算分享一下gdal python库的安装与pycharm下编写一个读取shapefile小程序的过程。
1)编译gdal
首先是到gdal的官网上下载 gdal的源码,我选择的版本是2.2.3。源码地址 。因为gdal python的实现方式是 使用 swig对c++对象进行的封装(以上说法可能不太准确),所以需要先用msvc 编译gdal的c++源码。如果你的电脑也是64位操作系统,请先修改“nmake.opt”文件第206行将#WIN64=YES 前面的#去掉。我电脑上安装的 visual studio 2017 community 版本,所以我打开的是 vs2017 版本的“x64 Native Tools Command Prompt for VS 2017”命令行窗口,cd到源码所在目录。执行命令nmake -f makefile.vc MSVC_VER=1910 等待程序编译成功,执行nmake -f makefile.vc install ,编译生成的链接库、exe等会被拷贝到“C:\warmerda\bld\bin”(可以在nmake.opt中修改)。将上面路径加入系统变量“path”中。
2) 安装 gdal python
安装 gdal python模块前,确保你的电脑上安装了python 。cd到源码所在路径的swig/python下,执行命令python setup.py build ,python setup.py install 。然后新开一个python 程序,执行import gdal ,如果没有报错,证明gdal 的安装是成功的。
3) pycharm 安装
对于初学者,编写python需要一个友好的IDE,同事推荐的是pycharm 。我安装的是pycharm 2017 community版本。
需要注意的是,当新建一个工程时,pycharm 已经自带一个python interpreter(解释器)了,而这个解释器并不是刚才我们安装gdal的解释器,所以需要将工程的解释器指定为系统的解释器。解决办法:“File->Settings->Project:xxx->Project Interpreter”,在对话框中选择project interpreter 的“show all”
在弹出的窗口中点“+”add local。选择 “system interpreter”
4) gdal 程序编写
我打算编写一个读取shapefile,获得表字段名称,获取要素个数,并且打印每一个要素的wkt字符,并且打印其外接矩形坐标。程序代码如下:
import sys from osgeo import gdal from osgeo import ogr filename = "test_data/poly.shp" ds = gdal.OpenEx(filename, gdal.OF_VECTOR) if ds is None: print("can't open "+filename) exit(1) layer = ds.GetLayer(0) layer.ResetReading() #打印 layer defination lyrDefn =layer.GetLayerDefn() for i in range(lyrDefn.GetFieldCount()): fieldDefn = lyrDefn.GetFieldDefn(i) print(fieldDefn.GetNameRef()) print("there are total {0} features in layer".format(layer.GetFeatureCount())) i =1 for feature in layer: print("---------{0}th feature--------".format(i)) geom = feature.GetGeometryRef() print("points number {0}".format(geom.GetPointCount())) print(geom.ExportToWkt()) #print(geom.GetGeometryCount()) env = geom.GetEnvelope() for point in env: print(point) i = i+1 #print(geom.Area())
使用过程中,我的疑问如下。有经验的同学可以指点一下,我后面学习到答案,会回来补充。
- python 中类型转换是如何表达的,比如,在c++中,我通过将Geometry对象转成Polygon对象以使用polygon的专有方法,在python 中,不知道这个过程如何实现的,或者,有没有这个概念?
- pycharm 如何支持第三方库的代码补全?用起来好不方便。
- gdal python的API Reference 好像不太全,里面好多东西都没有,比如,有些函数的返回值类型并没有标记。