目录:
一、处理点要素
1.创建编辑单点
2.在一个要素中创建多点
二、处理线要素
1.创建和编辑单条线
2.创建和编辑多线为一个要素
三、处理面要素
1.创建和编辑环行线和单个多边形
2.创建多个多边形为一个要素
一、处理点要素
1.创建编辑单点
对于创建单点的操作,我们需要OGR库中的几个函数。ogr.Geometry(ogr.__)表示用来创建一个几何对象要素,括号内__参数如下:
对于创建单点对象要素的操作,我们这里对于输入ogr.wkbPoint确认几何类型为2D的点。在点创建完成后可以使用Add.Point()来创建一个新的单点,同时可以采用.GetX/Y()获取他的X/Y值,或直接打印该点查看。此外可以用SetPoint(point,x,y,[z])来编辑这个点,其中point代表对象中点的几何索引FID(如:0、1、2....,如果只有一个点,则仅有唯一FID为0),X/Y/Z分别代表他的三个坐标。
实例代码如下:
# 导入模板
from osgeo import ogr
import os
from ospybook.vectorplotter import VectorPlotter
# 创建点
new_point = ogr.Geometry(ogr.wkbPoint)
new_point.AddPoint(100,20)
# 查看创建点信息
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.在一个要素中创建多点
前面我们使用过单点要素的创建,但有时我们有时让一个变量(要素)包含多个点。对于该操作我们至少需要创建两个几何对象。至少需要一个点对象和一个多点对象来容纳。
# 导入模板
from osgeo import ogr
import os
from ospybook.vectorplotter import VectorPlotter
# 创建单点和多点要素
new_points=ogr.Geometry(ogr.wkbMultiPoint)
new_point=ogr.Geometry(ogr.wkbPoint)
# 多次将单点导入单点
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.创建和编辑单条线
线要素是通过直线将多个顶点或点相连。创建线的第一步就是创建一个空的几何对象,然后添加顶点(按顺序)。
# 导入模板
from osgeo import ogr
import os
from ospybook.vectorplotter import VectorPlotter
# 第一部分创建单线
# 创建单条线
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())
# 第三部分在两个点之间增加一个点
# 添加一个点_将顶点转为元组
line_list=new_line.GetPoints()
line_list[2:2]=[(30,40)]
print(line_list)
# 添加一个点_元组导成顶点
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)创建了一个线要素,然后挨个添加顶点(在线要素中,不会顶替上一个点的信息,这一点与点不同),增加的顶点会自己连成线,然后输出打印。
在第二部分修改点坐标中,与点要素类似,通过SetPoint(索引FID,X,Y)来修改点的信息。
第三部分则实现了在两点之间增加新点的操作。首先通过 对象.GetPoints()来获取一个新的元组列表,用list[a:a]=[坐标元组],将新的坐标值以元组形式传入列表中。然后创建一个新的线要素,利用for循环将列表的元组转化为坐标加入到新线要素中(注意:for循环时使用*将顶点炸开为两个参数,而一个元组整体是不能应用于AddPoint()函数的),并打印出图。
2.创建和编辑多线为一个要素
对于多线的操作与点类似,分别建立不同的单线要素,再将这些要素添加到多线要素中。
# 导入模板
from osgeo import ogr
import os
from ospybook.vectorplotter import VectorPlotter
import ospybook as pb
# 创建单条线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)
# 创立多线要素,并将单线添加到里面
line=ogr.Geometry(ogr.wkbMultiLineString)
line.AddGeometry(new_line1)
line.AddGeometry(new_line2)
line.AddGeometry(new_line3)
# 结果显示
vp=VectorPlotter(False)
vp.plot(line,'b-')
vp.draw()
print(line)
三、处理面要素
1.创建和编辑环行线和单个多边形
简单来看,多边形是由线构成,我们把这些线称为环形线,因此当我们想构建一个多边形就要先构建围城多边形的环形线。
开始构建环形线的操作与线相同,逐个添加顶点并形成线。这里注意的时,环形线需要闭合,在构建环形线时确定第一个点和最后一个点的坐标相同或环形或多边形上调用CloseRings()函数使其闭合。
环形线构成后添加到新建的面要素中即可完成对单面的创建。
# 导入模板
from osgeo import ogr
import os
from ospybook.vectorplotter import VectorPlotter
import ospybook as pb
# 创建环形线
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)
# 创建单个多边形
new_polygon=ogr.Geometry(ogr.wkbPolygon)
new_polygon.AddGeometry(new_ring)
# 闭合多边形,如果在环形线添加最后一个点也第一个点坐标相同可不进行此操作
new_polygon.CloseRings()
# 绘制图形
vp=VectorPlotter(False)
vp.plot(new_polygon,'b')
vp.draw()
对于多边形的编辑我们首先要改变他的环形线,再对多边形进行编辑。
# 导入模板
from osgeo import ogr
import os
from ospybook.vectorplotter import VectorPlotter
import ospybook as pb
# 此操作同创建单个多边形
# 创建环形线
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)
# 创建单个多边形
new_polygon=ogr.Geometry(ogr.wkbPolygon)
new_polygon.AddGeometry(new_ring)
# 闭合多边形,如果在环形线添加最后一个点也第一个点坐标相同可不进行此操作
new_polygon.CloseRings()
# 绘制图形
vp=VectorPlotter(False)
vp.plot(new_polygon,'b')
vp.draw()
# 编辑多边形
# 改变某个点位置改变多边形
ring=new_polygon.GetGeometryRef(0)
ring.SetPoint(0,9,14)
# 通过列表转换,用两个顶点代替第三个顶点
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.创建多个多边形为一个要素
创建多个多边形的操作与线相同,分别创建不同的多边形进行加入。
# 导入模板
from osgeo import ogr
import os
from ospybook.vectorplotter import VectorPlotter
import ospybook as pb
# 创建两个多边形
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)
# 创建一个要素多个多边形
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()