Obtener todos los vértices de un polígono usando OGR y Python

16

Tengo un pequeño problema con la API OGR de Python. Lo que estoy tratando de hacer es obtener todas las coordenadas de cada vértice del anillo exterior de un polígono.

Esto es lo que tengo hasta ahora:

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

He escuchado que solo puedes for sobre la región pero eso solo devuelve los anillos en el polígono, no los nodos.

Cualquier persona capaz de ayudar.

    
pregunta Nathan W 05.04.2011 - 13:53

4 respuestas

15

Depende un poco del formato de archivo y la geometría, pero en principio la continuación podría tener este aspecto.

  for p in xrange(points):
        lon, lat, z = ring.GetPoint(p)
    
respondido por el relet 05.04.2011 - 14:52
6

FYI: para un ejemplo de código completo basado en la pregunta original y un script que puede usar de inmediato ... vea enlace

    
respondido por el 1tylermitchell 31.01.2013 - 03:55
4

Si solo está viendo shapefiles, también puede usar 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
    
respondido por el Marc Pfister 31.01.2013 - 06:08
4

Me acabo de encontrar con el mismo problema. Terminé usando la función ExportToJson en ogr y luego leyendo la cadena Json en un diccionario. Usando mis datos y la notación de la pregunta original, esto parece:

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'}
    
respondido por el David M 05.01.2016 - 01:50

Lea otras preguntas en las etiquetas