Ottieni tutti i vertici di un poligono usando OGR e Python


18

Sto riscontrando un piccolo problema con l'API OGR di Python. Quello che sto cercando di fare è ottenere tutte le coordinate di ciascun vertice dell'anello esterno di un poligono.

Questo è quello che ho finora:

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()

Ho sentito che puoi appena foroltre la regione, ma che restituisce solo gli anelli nel poligono, non i nodi.

Chiunque sia in grado di aiutare.

Risposte:


15

Dipende un po 'dal formato del file e dalla geometria, ma in linea di principio la continuazione potrebbe apparire così.

  for p in xrange(points):
        lon, lat, z = ring.GetPoint(p)

Questa è una delle uscite: (1.8565347032449642e-313, 7.1913896573768921e-305, 6.3952653423603306e-305) Qualche idea di cosa succede?
Nathan W,

Non esattamente, è una tripla di coordinate, anche se un po 'minuscole;) - che aspetto hanno i dati di input e la proiezione? ad es. cosa ogrinfo -aldice?
Relet

Mi sembra che interpretare i float come doppi o simili.
MerseyViking

5
Quella riga dovrebbe leggere: lon, lat, z = ring.GetPoint(p)che funziona per me.
MerseyViking

Grazie MerseyViking, è stato così ... non posso credere di averlo guardato.
Nathan W,


5

Ho appena incontrato lo stesso problema. Ho finito di usare la funzione ExportToJson in ogr e poi di leggere la stringa Json in un dizionario. Utilizzando i miei dati e la notazione della domanda originale, questo sembra:

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'}

4

Se stai guardando solo gli shapefile, puoi anche usare 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.