4. GDAL python教程(3)——過濾器,簡單的空間分析,函數和模塊?
4.1. 屬性過濾器Attribute filters?
Layer對象有一個方法叫SetAttributeFilter(<where_clause>)可以將Layer中符合某一條件的Feature過濾出來。設定了Filter之后就可以用GetNextFeature()方法依次取出符合條件的Feature了。SetAttributeFilter(None)可以清楚一個Filter。例如
>>> layer.GetFeatureCount()
42
>>> layer.SetAttributeFilter("cover = 'shrubs'")
>>> layer.GetFeatureCount()
6
>>> layer.SetAttributeFilter(None)
>>> layer.GetFeatureCount()
42
4.2. 空間過濾器Spatial filters?
有兩種。一種是SetSpatialFilter(<geom>),過濾某一類型的Feature,例如參數中填Polygon,就是選出Layer中的所有Polygon。
另外還有SetSpatialFilterRect(<minx>, <miny>, <maxx>, <maxy>),參數輸入四個坐標,可以選中方框內的Feature
SetSpatialFilter(None)一樣是清空空間屬性過濾器。
例如下面這段代碼,layerAreas 是polygon,layerSites是point
>>> featAreas = layerAreas.GetNextFeature()
>>> poly = featAreas.GetGeometryRef()
>>> layerSites.GetFeatureCount()
42
>>> layerSites.SetSpatialFilter(poly)
>>> layerSites.GetFeatureCount()>>> layerSites.GetFeatureCount()
33
>>> layerSites.SetSpatialFilterRect(460000, 4590000, 490000, 4600000)
>>> layerSites.GetFeatureCount()
4
>>> layerSites.SetSpatialFilter(None)
>>> layerSites.GetFeatureCount()
42
還有更復雜的Filter,例如執行SQL查詢語句ExecuteSQL(<SQL>),憑借SQL的強大功能,可以執行更復雜的任務, 例如下面這段代碼,就是選擇cover類型為grass的Feature,并且按id號降序排列。
result = dsSites.ExecuteSQL("select * from sites where cover = 'grass' order by id desc")
resultFeat = result.GetNextFeature()
while resultFeat :
print resultFeat.GetField('id')print resultFeat.GetField('id')
resultFeat = result.GetNextFeature()
dsSites.ReleaseResultSet(result)
42
40
:
4
最后一句ReleaseResultSet(<result_layer>)是將查詢結果釋放,在執行下一條SQL語句之前一定要先釋放。
下面的例子,統計了cover為grass的所有Feature的數目
>>> result = dsSites.ExecuteSQL("select count(*) from sites where cover = 'grass'")
>>> result.GetFeatureCount()
11
>>> result.GetFeature(0).GetField(0)
11
>>> dsSites.ReleaseResultSet(result)
列出所有不同的cover類型
result = ds.ExecuteSQL("select distinct cover from sites")
resultFeat = result.GetNextFeature()
while resultFeat:
print resultFeat.GetField(0)
resultFeat = result.GetNextFeature()
ds.ReleaseResultSet(result)
shrubs
trees
rocks
grass
bare
Water
4.3. 統計每種cover類型各有多少個Feature?
coverLayer = ds.ExecuteSQL('select distinct cover from sites')
coverFeat = coverLayer.GetNextFeature()
while coverFeat:
cntLayer = ds.ExecuteSQL("select count(*) from sites where cover = ‘ “ + coverFeat.GetField(0) + “ ‘ “)
print coverFeat.GetField(0) + ' ' +print coverFeat.GetField(0) + ' ' + cntLayer.GetFeature(0).GetFieldAsString(0)
ds.ReleaseResultSet(cntLayer)
coverFeat = coverLayer.GetNextFeature()
ds.ReleaseResultSet(coverLayer)
shrubs 6
trees 11
rocks 6
grass 11
bare 6
water 2
4.4. 空間操作?
4.5. 下面看看簡單的地理數據處理geoprocessing?
多邊形的:
交:poly3.Intersection(poly2)
并:poly3.Union(poly2)
差:poly3.Difference(poly2)
補:poly3.SymmetricDifference(poly2)
geometry的:
<geom>.Buffer(<distance>) 給geometry加buffer,就是把點線變成多邊形,變粗了
<geom1>.Equal(<geom2>) 兩個geometry相等嗎?
<geom1>.Distance(<geom2>) 返回兩個geometry之間的最短距離
<geom>.GetEnvelope() 信封,有意思,其實就是用一個方框框住這個幾何形狀,返回四個角的坐標(minx, maxx, miny, maxy)
python的函數function,異常exception和模塊module可以從任何一本python教材上找到,在此不多贅述。