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