OGR几何要素处理(创建编辑点线面)——Python地理数据处理学习分享
目錄:
一、處理點(diǎn)要素
1.創(chuàng)建編輯單點(diǎn)
?2.在一個(gè)要素中創(chuàng)建多點(diǎn)
二、處理線要素
1.創(chuàng)建和編輯單條線
2.創(chuàng)建和編輯多線為一個(gè)要素
三、處理面要素
1.創(chuàng)建和編輯環(huán)行線和單個(gè)多邊形
2.創(chuàng)建多個(gè)多邊形為一個(gè)要素
一、處理點(diǎn)要素
1.創(chuàng)建編輯單點(diǎn)
? ? ? ? 對(duì)于創(chuàng)建單點(diǎn)的操作,我們需要OGR庫(kù)中的幾個(gè)函數(shù)。ogr.Geometry(ogr.__)表示用來(lái)創(chuàng)建一個(gè)幾何對(duì)象要素,括號(hào)內(nèi)__參數(shù)如下:
? ? ? ? 對(duì)于創(chuàng)建單點(diǎn)對(duì)象要素的操作,我們這里對(duì)于輸入ogr.wkbPoint確認(rèn)幾何類型為2D的點(diǎn)。在點(diǎn)創(chuàng)建完成后可以使用Add.Point()來(lái)創(chuàng)建一個(gè)新的單點(diǎn),同時(shí)可以采用.GetX/Y()獲取他的X/Y值,或直接打印該點(diǎn)查看。此外可以用SetPoint(point,x,y,[z])來(lái)編輯這個(gè)點(diǎn),其中point代表對(duì)象中點(diǎn)的幾何索引FID(如:0、1、2....,如果只有一個(gè)點(diǎn),則僅有唯一FID為0),X/Y/Z分別代表他的三個(gè)坐標(biāo)。
實(shí)例代碼如下:
# 導(dǎo)入模板 from osgeo import ogr import os from ospybook.vectorplotter import VectorPlotter # 創(chuàng)建點(diǎn) new_point = ogr.Geometry(ogr.wkbPoint) new_point.AddPoint(100,20) # 查看創(chuàng)建點(diǎn)信息 x,y=new_point.GetX(),new_point.GetY() print(x,y,new_point) # 打印到圖像上 vp=VectorPlotter(False) vp.plot(new_point,'rs') vp.draw() # 編輯第一個(gè)點(diǎn),FID索引為0 new_point.SetPoint(0,10,20) print(new_point)?2.在一個(gè)要素中創(chuàng)建多點(diǎn)
? ? ? ? 前面我們使用過(guò)單點(diǎn)要素的創(chuàng)建,但有時(shí)我們有時(shí)讓一個(gè)變量(要素)包含多個(gè)點(diǎn)。對(duì)于該操作我們至少需要?jiǎng)?chuàng)建兩個(gè)幾何對(duì)象。至少需要一個(gè)點(diǎn)對(duì)象和一個(gè)多點(diǎn)對(duì)象來(lái)容納。
# 導(dǎo)入模板 from osgeo import ogr import os from ospybook.vectorplotter import VectorPlotter # 創(chuàng)建單點(diǎn)和多點(diǎn)要素 new_points=ogr.Geometry(ogr.wkbMultiPoint) new_point=ogr.Geometry(ogr.wkbPoint) # 多次將單點(diǎn)導(dǎo)入單點(diǎn) new_point.AddPoint(10,20) new_points.AddGeometry(new_point) new_point.AddPoint(20,30) new_points.AddGeometry(new_point) new_point.AddPoint(50,10) new_points.AddGeometry(new_point) # 將多點(diǎn)打印在圖像上 vp=VectorPlotter(False) vp.plot(new_points,'bo') vp.draw()二、處理線要素
1.創(chuàng)建和編輯單條線
? ? ? ? 線要素是通過(guò)直線將多個(gè)頂點(diǎn)或點(diǎn)相連。創(chuàng)建線的第一步就是創(chuàng)建一個(gè)空的幾何對(duì)象,然后添加頂點(diǎn)(按順序)。
# 導(dǎo)入模板 from osgeo import ogr import os from ospybook.vectorplotter import VectorPlotter # 第一部分創(chuàng)建單線 # 創(chuàng)建單條線 new_line=ogr.Geometry(ogr.wkbLineString) new_line.AddPoint(5,6) new_line.AddPoint(7,9) new_line.AddPoint(10,14) new_line.AddPoint(1,5) # 打印在圖像中 vp=VectorPlotter(False) vp.plot(new_line,'b-') vp.draw() print(new_line) # 第二部分修改點(diǎn) # 更改第四個(gè)頂點(diǎn)位置并打印 new_line.SetPoint(3,12,16) vp.plot(new_line,'y--') vp.draw() print(new_line.GetPoints()) # 第三部分在兩個(gè)點(diǎn)之間增加一個(gè)點(diǎn) # 添加一個(gè)點(diǎn)_將頂點(diǎn)轉(zhuǎn)為元組 line_list=new_line.GetPoints() line_list[2:2]=[(30,40)] print(line_list) # 添加一個(gè)點(diǎn)_元組導(dǎo)成頂點(diǎn) add_line=ogr.Geometry(ogr.wkbLineString) for i in line_list:add_line.AddPoint(*i) vp.plot(add_line,'r:') vp.draw() print(add_line)? ? ? ? 在代碼第一個(gè)部分中,首先我們利用ogr.Geometry(ogr.wkbLineString)創(chuàng)建了一個(gè)線要素,然后挨個(gè)添加頂點(diǎn)(在線要素中,不會(huì)頂替上一個(gè)點(diǎn)的信息,這一點(diǎn)與點(diǎn)不同),增加的頂點(diǎn)會(huì)自己連成線,然后輸出打印。
? ? ? ? 在第二部分修改點(diǎn)坐標(biāo)中,與點(diǎn)要素類似,通過(guò)SetPoint(索引FID,X,Y)來(lái)修改點(diǎn)的信息。
? ? ? ? 第三部分則實(shí)現(xiàn)了在兩點(diǎn)之間增加新點(diǎn)的操作。首先通過(guò) 對(duì)象.GetPoints()來(lái)獲取一個(gè)新的元組列表,用list[a:a]=[坐標(biāo)元組],將新的坐標(biāo)值以元組形式傳入列表中。然后創(chuàng)建一個(gè)新的線要素,利用for循環(huán)將列表的元組轉(zhuǎn)化為坐標(biāo)加入到新線要素中(注意:for循環(huán)時(shí)使用*將頂點(diǎn)炸開為兩個(gè)參數(shù),而一個(gè)元組整體是不能應(yīng)用于AddPoint()函數(shù)的),并打印出圖。
2.創(chuàng)建和編輯多線為一個(gè)要素
? ? ? ? 對(duì)于多線的操作與點(diǎn)類似,分別建立不同的單線要素,再將這些要素添加到多線要素中。
# 導(dǎo)入模板 from osgeo import ogr import os from ospybook.vectorplotter import VectorPlotter import ospybook as pb # 創(chuàng)建單條線3組 new_line1=ogr.Geometry(ogr.wkbLineString) new_line1.AddPoint(5,6) new_line1.AddPoint(7,9) new_line1.AddPoint(10,14) new_line1.AddPoint(1,5) new_line2=ogr.Geometry(ogr.wkbLineString) new_line2.AddPoint(8,6) new_line2.AddPoint(7,4) new_line2.AddPoint(20,14) new_line3=ogr.Geometry(ogr.wkbLineString) new_line3.AddPoint(15,16) new_line3.AddPoint(4,9) new_line3.AddPoint(10,14) new_line3.AddPoint(11,5) # 創(chuàng)立多線要素,并將單線添加到里面 line=ogr.Geometry(ogr.wkbMultiLineString) line.AddGeometry(new_line1) line.AddGeometry(new_line2) line.AddGeometry(new_line3) # 結(jié)果顯示 vp=VectorPlotter(False) vp.plot(line,'b-') vp.draw() print(line)三、處理面要素
1.創(chuàng)建和編輯環(huán)行線和單個(gè)多邊形
? ? ? ? 簡(jiǎn)單來(lái)看,多邊形是由線構(gòu)成,我們把這些線稱為環(huán)形線,因此當(dāng)我們想構(gòu)建一個(gè)多邊形就要先構(gòu)建圍城多邊形的環(huán)形線。
? ? ? ? 開始構(gòu)建環(huán)形線的操作與線相同,逐個(gè)添加頂點(diǎn)并形成線。這里注意的時(shí),環(huán)形線需要閉合,在構(gòu)建環(huán)形線時(shí)確定第一個(gè)點(diǎn)和最后一個(gè)點(diǎn)的坐標(biāo)相同或環(huán)形或多邊形上調(diào)用CloseRings()函數(shù)使其閉合。??
? ? ? ? 環(huán)形線構(gòu)成后添加到新建的面要素中即可完成對(duì)單面的創(chuàng)建。
# 導(dǎo)入模板 from osgeo import ogr import os from ospybook.vectorplotter import VectorPlotter import ospybook as pb # 創(chuàng)建環(huán)形線 new_ring=ogr.Geometry(ogr.wkbLinearRing) new_ring.AddPoint(10,14) new_ring.AddPoint(15,14) new_ring.AddPoint(15,22) new_ring.AddPoint(10,22) # 創(chuàng)建單個(gè)多邊形 new_polygon=ogr.Geometry(ogr.wkbPolygon) new_polygon.AddGeometry(new_ring) # 閉合多邊形,如果在環(huán)形線添加最后一個(gè)點(diǎn)也第一個(gè)點(diǎn)坐標(biāo)相同可不進(jìn)行此操作 new_polygon.CloseRings() # 繪制圖形 vp=VectorPlotter(False) vp.plot(new_polygon,'b') vp.draw()? ? ? ? 對(duì)于多邊形的編輯我們首先要改變他的環(huán)形線,再對(duì)多邊形進(jìn)行編輯。
# 導(dǎo)入模板 from osgeo import ogr import os from ospybook.vectorplotter import VectorPlotter import ospybook as pb # 此操作同創(chuàng)建單個(gè)多邊形 # 創(chuàng)建環(huán)形線 new_ring=ogr.Geometry(ogr.wkbLinearRing) new_ring.AddPoint(10,14) new_ring.AddPoint(15,14) new_ring.AddPoint(15,22) new_ring.AddPoint(10,22) # 創(chuàng)建單個(gè)多邊形 new_polygon=ogr.Geometry(ogr.wkbPolygon) new_polygon.AddGeometry(new_ring) # 閉合多邊形,如果在環(huán)形線添加最后一個(gè)點(diǎn)也第一個(gè)點(diǎn)坐標(biāo)相同可不進(jìn)行此操作 new_polygon.CloseRings() # 繪制圖形 vp=VectorPlotter(False) vp.plot(new_polygon,'b') vp.draw() # 編輯多邊形 # 改變某個(gè)點(diǎn)位置改變多邊形 ring=new_polygon.GetGeometryRef(0) ring.SetPoint(0,9,14) # 通過(guò)列表轉(zhuǎn)換,用兩個(gè)頂點(diǎn)代替第三個(gè)頂點(diǎn) list=ring.GetPoints() list[2:3]=((16,14),(16,23)) for i in range(len(list)):ring.SetPoint(i,*list[i]) polygon=ogr.Geometry(ogr.wkbPolygon) polygon.AddGeometry(ring) vp.plot(polygon,'b') vp.draw()2.創(chuàng)建多個(gè)多邊形為一個(gè)要素
? ? ? ? 創(chuàng)建多個(gè)多邊形的操作與線相同,分別創(chuàng)建不同的多邊形進(jìn)行加入。
# 導(dǎo)入模板 from osgeo import ogr import os from ospybook.vectorplotter import VectorPlotter import ospybook as pb # 創(chuàng)建兩個(gè)多邊形 ring1=ogr.Geometry(ogr.wkbLinearRing) ring1.AddPoint(10,10) ring1.AddPoint(10,15) ring1.AddPoint(15,15) polygon1=ogr.Geometry(ogr.wkbPolygon) polygon1.AddGeometry(ring1) ring2=ogr.Geometry(ogr.wkbLinearRing) ring2.AddPoint(10,12) ring2.AddPoint(15,5) ring2.AddPoint(10,4) polygon2=ogr.Geometry(ogr.wkbPolygon) polygon2.AddGeometry(ring2) # 創(chuàng)建一個(gè)要素多個(gè)多邊形 polygon=ogr.Geometry(ogr.wkbMultiPolygon) polygon.AddGeometry(polygon1) polygon.AddGeometry(polygon2) polygon.CloseRings() vp=VectorPlotter(False) vp.plot(polygon,fill=False,ec='b') vp.draw()總結(jié)
以上是生活随笔為你收集整理的OGR几何要素处理(创建编辑点线面)——Python地理数据处理学习分享的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 记录-蓝鲸相关知识点
- 下一篇: AES128加密-S盒和逆S盒构造推导及