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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章