Rumah pembangunan bahagian belakang Tutorial Python python gdal教程之:几何形状geometry与投影projection

python gdal教程之:几何形状geometry与投影projection

Dec 24, 2016 pm 04:01 PM
gdal geometry

建立空的geometry对象:ogr.Geometry

定义各种不同的geometry使用的方法是不一样的(point, line, polygon, etc)

新建点point,使用方法AddPoint( , , [])。其中的z坐标一般是省略的,默认值是0

例如:

point = ogr.Geometry(ogr.wkbPoint)

point.AddPoint(10,20)

新建line

使用AddPoint(, , [])添加点

使用SetPoint(, , , [])更改点的坐标

例如下面这段代码,更改了0号点的坐标:

line = ogr.Geometry(ogr.wkbLineString)

line.AddPoint(10,10)

line.AddPoint(20,20)

line.SetPoint(0,30,30)   #(10,10) -> (30,30)

统计所有点的数目

print line.GetPointCount()

读取0号点的x坐标和y坐标

print line.GetX(0)

print line.GetY(0)

新建多边形,首先要新建环(ring),然后把环添加到多边形对象中。

如何创建一个ring?先新建一个ring对象,然后向里面逐个添加点。

ring = ogr.Geometry(ogr.wkbLinearRing)

ring.AddPoint(0,0)

ring.AddPoint(100,0)

ring.AddPoint(100,100)

ring.AddPoint(0,100)

结束的时候,用CloseRings关闭ring,或者将最后一个点的坐标设定为与第一个点相同。

ring.CloseRings()

ring.AddPoint(0,0)

下面举一个例子,创建一个方框。这是个polygon对象,又例外两层ring构成。

outring = ogr.Geometry(ogr.wkbLinearRing)

outring.AddPoint(0,0)

outring.AddPoint(100,0)

outring.AddPoint(100,100)

outring.AddPoint(0,100)

outring.AddPoint(0,0)

inring = ogr.Geometry(ogr.wkbLinearRing)inring = ogr.Geometry(ogr.wkbLinearRing)

inring.AddPoint(25,25)

inring.AddPoint(75,25)

inring.AddPoint(75,75)

inring.AddPoint(25,75)

inring.CloseRings()

polygon = ogr.Geometry(ogr.wkbPolygon)

polygon.AddGeometry(outring)

polygon.AddGeometry(inring)

最后三句话比较重要,就是先建立一个polygon对象,然后添加外层ring和内层ring

下面这句话可以帮你数数你的polygon能有几个ring

print polygon.GetGeometryCount()

从polygon中读取ring,index的顺序和创建polygon时添加ring的顺序相同

outring = polygon.GetGeometryRef(0)

inring = polygon.GetGeometryRef(1)

创建复合几何形状multi geometry

例如MultiPoint, MultiLineString, MultiPolygon

用AddGeometry把普通的几何形状加到复合几何形状中,例如:

multipoint = ogr.Geometry(ogr.wkbMultiPoint)

point = ogr.Geometry(ogr.wkbPoint)point = ogr.Geometry(ogr.wkbPoint)

point.AddPoint(10,10)

multipoint.AddGeometry(point)

point.AddPoint(20,20)

multipoint.AddGeometry(point)

读取MultiGeometry中的Geometry,方法和从Polygon中读取ring是一样的,可以说Polygon是一种内置的MultiGeometry。

不要删除一个已存在的Feature的Geometry,会把python搞崩溃的

只能删除脚本运行期间创建的Geometry,比方说手工创建出来的,或者调用其他函数自动创建的。就算这个Geometry已经用来创建别的Feature,你还是可以删除它。

例如:Polygon.Destroy()

关于投影Projections,使用SpatialReference对象

多种多样的Projections,GDAL支持WKT, PROJ.4, ESPG, USGS, ESRI.prj

可以从layer和Geometry中读取Projections,例如:

spatialRef = layer.GetSpatialRef()

spatialRef = geom.GetSpatialReference()

投影信息一般存储在.prj文件中,如果没有这个文件,上述函数返回None

建立一个新的Projection:

首先导入osr库,之后使用osr.SpatialReference()创建SpatialReference对象

之后用下列语句向SpatialReference对象导入投影信息

    •ImportFromWkt()

    •ImportFromEPSG()

    •ImportFromProj4()

    •ImportFromESRI()

    •ImportFromPCI(, ,

      )

    •ImportFromUSGS(, )

•ImportFromXML()

导出Projection,使用下面的语句可以导出为字符串

    •ExportToWkt()

    •ExportToPrettyWkt()

    •ExportToProj4()

    •ExportToPCI()

    •ExportToUSGS()

•ExportToXML()

对一个几何形状Geometry进行投影变换,要先初始化两个Projection,然后创建一个CoordinateTransformation对象,用它来做变换

sourceSR = osr.SpatialReference()

sourceSR.ImportFromEPSG(32612) #UTM 12N WGS84

targetSR = osr.SpatialReference()

targetSR.ImportFromEPSG(4326) #Geo WGS84

coordTrans = osr.CoordinateTransformation(sourceSR, targetSR)

geom.Transform(coordTrans)

但是这段代码很让人蛋疼!在windows里面跑不通。老外的论坛里面有讨论,说在linux里面没问题,windows死活不行,哎。。。

另外还有几个要注意的地方:

要在适当的时候编辑Geometry,投影变换之后最好就不要再动了吧。

对一个数据源DataSource里面的所有Geometry做投影变换,你得一个一个来。用个循环吧。

将你的投影写入.prj文件,其实很简单。首先MorphToESRI(),转成字符串,然后开个文本文件往里面写就行了。例如:

targetSR.MorphToESRI()

file = open('test.prj', 'w')

file.write(targetSR.ExportToWkt())

ffile.close()  

 以上就是python gdal教程之:几何形状geometry与投影projection的内容,更多相关内容请关注PHP中文网(www.php.cn)!


Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Bagaimana untuk menyelesaikan masalah kebenaran yang dihadapi semasa melihat versi Python di Terminal Linux? Bagaimana untuk menyelesaikan masalah kebenaran yang dihadapi semasa melihat versi Python di Terminal Linux? Apr 01, 2025 pm 05:09 PM

Penyelesaian kepada Isu Kebenaran Semasa Melihat Versi Python di Terminal Linux Apabila anda cuba melihat versi Python di Terminal Linux, masukkan Python ...

Bagaimana Mengajar Asas Pengaturcaraan Pemula Komputer Dalam Kaedah Projek dan Masalah Dikemukakan Dalam masa 10 Jam? Bagaimana Mengajar Asas Pengaturcaraan Pemula Komputer Dalam Kaedah Projek dan Masalah Dikemukakan Dalam masa 10 Jam? Apr 02, 2025 am 07:18 AM

Bagaimana Mengajar Asas Pengaturcaraan Pemula Komputer Dalam masa 10 jam? Sekiranya anda hanya mempunyai 10 jam untuk mengajar pemula komputer beberapa pengetahuan pengaturcaraan, apa yang akan anda pilih untuk mengajar ...

Bagaimana untuk mengelakkan dikesan oleh penyemak imbas apabila menggunakan fiddler di mana-mana untuk membaca lelaki-dalam-tengah? Bagaimana untuk mengelakkan dikesan oleh penyemak imbas apabila menggunakan fiddler di mana-mana untuk membaca lelaki-dalam-tengah? Apr 02, 2025 am 07:15 AM

Cara mengelakkan dikesan semasa menggunakan fiddlerevery di mana untuk bacaan lelaki-dalam-pertengahan apabila anda menggunakan fiddlerevery di mana ...

Bagaimana cara menyalin seluruh lajur satu data ke dalam data data lain dengan struktur yang berbeza di Python? Bagaimana cara menyalin seluruh lajur satu data ke dalam data data lain dengan struktur yang berbeza di Python? Apr 01, 2025 pm 11:15 PM

Apabila menggunakan Perpustakaan Pandas Python, bagaimana untuk menyalin seluruh lajur antara dua data data dengan struktur yang berbeza adalah masalah biasa. Katakan kita mempunyai dua DAT ...

Bagaimanakah uvicorn terus mendengar permintaan http tanpa serving_forever ()? Bagaimanakah uvicorn terus mendengar permintaan http tanpa serving_forever ()? Apr 01, 2025 pm 10:51 PM

Bagaimanakah Uvicorn terus mendengar permintaan HTTP? Uvicorn adalah pelayan web ringan berdasarkan ASGI. Salah satu fungsi terasnya ialah mendengar permintaan HTTP dan teruskan ...

Bagaimana untuk mendapatkan data berita yang melangkaui mekanisme anti-crawler Investing.com? Bagaimana untuk mendapatkan data berita yang melangkaui mekanisme anti-crawler Investing.com? Apr 02, 2025 am 07:03 AM

Memahami Strategi Anti-Crawling of Investing.com Ramai orang sering cuba merangkak data berita dari Investing.com (https://cn.investing.com/news/latest-news) ...

Bagaimana secara dinamik membuat objek melalui rentetan dan panggil kaedahnya dalam Python? Bagaimana secara dinamik membuat objek melalui rentetan dan panggil kaedahnya dalam Python? Apr 01, 2025 pm 11:18 PM

Di Python, bagaimana untuk membuat objek secara dinamik melalui rentetan dan panggil kaedahnya? Ini adalah keperluan pengaturcaraan yang biasa, terutamanya jika perlu dikonfigurasikan atau dijalankan ...

See all articles