Python与开源GIS:获取要素信息
获取要素(Feature)信息
如果只从计算机角度来看,有人认为要素就是一些几何形状,这种观点是欠妥的。
几何形状,具体包括点、线、多边形、弧段、向量、控制点等等非常多种,
其实是要素的模型抽象。
在Shapefile中,要素模型由点、线、面三种类型构成。
要素类都带有属性信息,
一个要素一般对应属性表中的一行。
获取图层中的要素
下面看一下如何获取图层中的要素(feature)。
>>> from osgeo import ogr
>>> inshp = ‘/gdata/world_borders.shp’
>>> datasource = ogr.Open(inshp)
>>> layer = datasource.GetLayer(0)
>>> feature = layer.GetFeature(0)
另外还有按顺序读取feature,循环遍历所有的feature:
>>> feat = layer.GetNextFeature()
>>> while feat:
> feat = layer.GetNextFeature()
>>> layer.ResetReading()
GetNextFeature()用来获取下一下要素,
ResetReading()则是进行重置,以便再次获取。
获取要素的属性
下面是一个简单的例子:
>>> feat = layer.GetFeature(0)
>>> feat.keys()
[‘CAT’, ‘FIPS_CNTRY’, ‘CNTRY_NAME’, ‘AREA’, ‘POP_CNTRY’]
>>> fid = feat.GetField(‘AREA’)
>>> print(fid)
193.0
下面是对所有的属性值进行遍历:
>>> for i in range(feature.GetFieldCount()):
> print feature.GetField(i)
1.0
AA
Aruba
193.0
71218.0
这会列出这个要素的所有属性值。
如果要看整个表的结构,各个字段的名称等等信息,可以在layer的附加信息里看。
>>> layerdef = layer.GetLayerDefn()
>>> for i in range(layerdef.GetFieldCount()):
> defn = layerdef.GetFieldDefn(i)
> print(defn.GetName(),defn.GetWidth(),defn.GetType(),defn.GetPrecision())
(‘CAT’, 16, 2, 0)
(‘FIPS_CNTRY’, 80, 4, 0)
(‘CNTRY_NAME’, 80, 4, 0)
(‘AREA’, 15, 2, 2)
(‘POP_CNTRY’, 15, 2, 2)
要素的形状(Geometry)
>>> geom = feature.GetGeometryRef()
>>> geom.GetGeometryName()
‘POLYGON’
>>> geom.GetGeometryCount()
1
>>> geom.GetPointCount()
0
>>> geom.GetX()
0.0
>>> geom.GetY()
0.0
>>> print(geom) # 会打印出所有的点
POLYGON ((-69.882232999999999 12.41111,-69.946944999999999 12.436666,
…
12.411664999999999,-69.882232999999999 12.41111))
>>> print(geom.ExportToWkt())
POLYGON ((-69.882232999999999 12.41111,-69.946944999999999 12.436666,
…
12.411664999999999,-69.882232999999999 12.41111))
>>> polygon = geom.GetGeometryRef(0)
>>> polygon.GetGeometryName()
‘LINEARRING’
>>> polygon.GetGeometryCount()
0
>>> polygon.GetPointCount()
19
>>> polygon.GetX(0)
-69.882232999999999
>>> polygon.GetY(0)
12.411110000000001
>>> polygon.GetZ(0)
0.0
>>> print(polygon.ExportToWkt())
LINEARRING (-69.882232999999999 12.41111,-69.946944999999999 12.436666,
…
12.411664999999999,-69.882232999999999 12.41111)
转载自:https://blog.csdn.net/MR_yuan24/article/details/8055197