目录
矢量数据存储格式
常用的矢量存储格式包括两类。Shapefile是存储矢量的通用格式,它至少包括三个文件,而且文件用途各不相同。几何信息存储在.shp和.shx文件中,属性信息存储在.dbf文件中。另一种广泛的格式,尤其针对网络地图是GeoJSON格式,他是纯文本文件,所有信息只存储在这一个文件中。
GDAL/OGR
GDAL是地理空间数据抽象库,是Python处理矢量、栅格文件基础的模块。OGR是GDAL的一部分,它并不代表任何东西。GDAL的OGR部分具有读写许多不同矢量数据格式的功能。OGR还允许你创建和操作要素的几何形状、编辑其属性值、对矢量数据进行筛选等操作。如果想使用GDAL/OGR需要安装GDAL库,GDAL库安装参考以下文章。Python环境下GDAL库的安装(Windows系统)_Cishazhu_ooook的博客-CSDN博客https://blog.csdn.net/remote_giser/article/details/127345752?spm=1001.2014.3001.5501 GDAL/OGR支持多种数据格式(矢量数据并不包括以上两种),想了解OGR支持的矢量格式可以浏览以下。OGR/GMT矢量数据格式 — GMT 中文手册 (gmt-china.org)
https://docs.gmt-china.org/latest/table/ogrgmt/ 此外,我们还应该知道OGR打开数据源是,会有一个数据源(DataSource)对象。此数据源可以有一个或多个子图层对象,每一个图层代表数据源中的一个数据集。数据集中会包含数据的各个特征。
读取矢量数据
在arcgis中打开.shp文件查看,如图。(本文用到的数据在附录下载后globe文件下)
使用简单的Python代码达到读取矢量数据的目的。
# 导入模块
import sys
from osgeo import ogr
# 读取文件路径
fn="D:\\Python_study\\osgeopy-data\\global\\ne_50m_populated_places.shp"
# 打开文件
ds=ogr.Open(fn,0)
if ds is None:
sys.exit('Could not open{0}.'.format(fn))
# 打开图层
lyr=ds.GetLayer(0)
# 利用for循环进行打印特征
i=0
for feat in lyr:
pt=feat.geometry()
x=pt.GetX()
y=pt.GetY()
name=feat.GetField('NAME')
pop=feat.GetField('POP_MAX')
print(name,pop,x,y)
i+=1
if i==10:
break
# 关闭文件
del ds
我们成功读取到了文件中前10个点name、pop、x/y信息,运行结果如下:
值得一提的是,这里我们导入了两个模块,sys与ogr。sys是针对与python系统的模块,在读取文件失败后起作用,如果不需要可以自行删除,这里必备的模块ORG在程序运行中起关键作用。(个人不太熟悉,想学习的可以自行搜素。应用在本例修改代码的路径会提示路径错误。)对于以上代码在正常运行情况下可以删掉sys模块和第一个if条件语句。
针对这个程序,我们首先要做的事打开这个程序,令一个变量为文件的路径,在这里我们使用变量fn。调用ds=ogr.Open(fn,0)打开数据源。这里fn我们前面已经叙述过,后面的0代表文件以只读的形式打开。OGR的Open函数会传递文件名和一个可选的更新标记,可选变量标记可以是0或1,0代表只读模式打开,仅能进行读取数据工作;而1代表编辑模式打开,可以对内容进行编辑。如果第二个参数不设定,则会以只读模式打开。例:这里我将代码改为ds=ogr.Open(fn)文件正常运行,因为此程序仅为只读,我们也同样以只读模式打开的文件。
别忘了,上面我们提到过OGR打开数据源后会出现多个图层,因此我们需要获得具体图层。数据源(ds)有一个GetLayer函数,可用用来索引所需要的图层。图层索引是从0开始的,所以第一层的索引为0(类似于列表)。同样如果不给GetLayer设置参数,默认索引第一层。在本例中我们使用lyr=ds.GetLayer(0)索引了第一层。(其实本例就一个图层)
前面只是对数据的打开,接下来才是文件的真正读取。图层构成的要素,可以用for循环来遍历读取。(本例只读取了前10个值)
- 首先我们要获得几何位置X/Y。先用一个变量(pt)存储他的几何位置。在这里用.geometry()函数获取了他的几何特征,并用.GetX/Y()来获取x/y。
- 文本特征这里用.GetField()来获取。但是值得注意的时该函数返回的数据类型与地层数据集中的数据类型一致。本例中name返回的的是字符型,pop返回的为整型。如果想让pop也返回数值型,可使用.GetFieldAsString()函数。
最后使用del ds关闭打开的整个文件。
总结
本小节我们学习的OGR库如下:
- ogr.Open(路径,0/1)
- .GetLayer(图层) ——注意第一层是从0开始的
- .geometry()
- .GetX/Y()
- .GetField()
附录
本文所涉及的数据可在Geoprocessing with Python (manning.com)页面resources处下载。