Dapatkan semua simpul poligon menggunakan OGR dan Python

18

Saya mengalami sedikit masalah dengan API Python OGR. Apa yang saya coba lakukan adalah mendapatkan semua koordinat dari setiap simpul cincin luar poligon.

Inilah yang saya miliki sejauh ini:

import osgeo.ogr
import glob

path = "/home/woo/maps/"
out = path + 'output.txt'

file = open(out,'w')
for filename in glob.glob(path + "*.shp"):
    ds = osgeo.ogr.Open(filename)
    layer1 = ds.GetLayer(0)
    print layer1.GetExtent()    
    for feat in layer1:
        geom = feat.GetGeometryRef()
        ring = geom.GetGeometryRef(0)
        points = ring.GetPointCount()
        #Not sure what to do here


file.close()

Saya telah mendengar bahwa Anda dapat formelewati wilayah tersebut tetapi itu hanya mengembalikan cincin dalam poligon, bukan simpul.

Siapa pun dapat membantu.

Nathan W
sumber

Jawaban:

15

Tergantung sedikit pada format file dan geometri Anda, tetapi pada prinsipnya kelanjutannya bisa seperti ini.

  for p in xrange(points):
        lon, lat, z = ring.GetPoint(p)
relet
sumber
Ini adalah salah satu output: (1.8565347032449642e-313, 7.1913896573768921e-305, 6.3952653423603306e-305) Ada yang tahu ada apa dengan itu?
Nathan W
Tidak persis, itu adalah tiga koordinat, jika agak kecil;) - seperti apa data input dan proyeksi Anda? mis. Apa ogrinfo -alkatanya?
Relet
Bagi saya itu seperti menafsirkan floats sebagai ganda atau serupa.
MerseyViking
5
Baris itu seharusnya berbunyi: lon, lat, z = ring.GetPoint(p)Yang mana cocok untuk saya.
MerseyViking
Terima kasih MerseyViking, itu berhasil..tidak percaya saya telah melihat itu.
Nathan W
5

Saya hanya mengalami masalah yang sama. Saya akhirnya menggunakan fungsi ExportToJson di ogr dan kemudian membaca string Json ke dalam kamus. Menggunakan data saya dan notasi dari pertanyaan awal, ini terlihat seperti:

import json
...
ring_dict = json.loads(ring.ExportToJson())
ring_dict

{'coordinates': [[-4.94237, 55.725449],
  [-4.941922, 55.725585],
  [-4.9420024, 55.7252119],
  [-4.9422001, 55.7250997],
  [-4.9423197, 55.7251789],
  [-4.9425472, 55.7253089],
  [-4.94237, 55.725449]],
 'type': 'LineString'}
David M
sumber
4

Jika Anda hanya melihat shapefile, Anda juga bisa menggunakan pyshp .

import shapefile
sf = shapefile.Reader("shapefiles/blockgroups")
shapes = sf.shapes()
for shape in shapes:
  for vertex in shape.points:
    #do something with the vertex
Marc Pfister
sumber