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


18

Tengo un pequeño problema con la API Python OGR. Lo que intento 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()

Escuché que puedes forsobre la región, pero eso solo devuelve los anillos en el polígono, no los nodos.

Cualquiera capaz de ayudar.

Respuestas:


15

Depende un poco del formato y la geometría de su archivo, pero en principio la continuación podría verse así.

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

Esta es una de las salidas: (1.8565347032449642e-313, 7.1913896573768921e-305, 6.3952653423603306e-305) ¿Alguna idea de qué pasa con eso?
Nathan W

No exactamente, es un triple de coordenadas, aunque un poco pequeño;) - ¿cómo son sus datos de entrada y su proyección? Por ejemplo, ¿qué ogrinfo -aldice?
Relet

Me parece que está interpretando flotadores como dobles o similares.
MerseyViking 05 de

55
Esa línea debería leer: lon, lat, z = ring.GetPoint(p)Lo que funciona para mí.
MerseyViking 05 de

Gracias MerseyViking, eso lo hizo ... no puedo creer que haya revisado eso.
Nathan W


5

Me encontré 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 se ve así:

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

Si solo estás mirando archivos de forma, también puedes 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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.