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.4.1. Intersect判斷兩個要素是否相交?

poly2.Intersect(poly1)

返回0表示不相交,返回1表示相交

4.4.2. Disjoint判斷兩個要素是否不相交?

poly2.Disjoint(poly1)

返回1表示不相交,返回0表示相交,跟Intersect正好相反

4.4.3. Touch表示相鄰(擦邊)?

poly2.Touches(poly1)

返回0表示不擦邊,返回1表示擦邊

4.4.4. Crosses穿越,一般是一條線穿過一個多邊形?

poly2.Crosses(line)

返回0表示不穿過,返回1表示穿過

4.4.5. Within包含,一個要素完全被另一個要素圈起來了?

ptB.Within(poly1)

返回0表示點在多邊形外,返回1表示點在多邊形內

4.4.6. Contains包含,跟Within正好相反?

poly1.Contains(ptB)

就是把主調對象和參數換一下啦

4.4.7. Overlaps重疊,好像只有兩個多邊形之間才能overlap?

poly2.Overlaps(poly3)

返回0表示不重疊,返回1表示重疊

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教材上找到,在此不多贅述。