Obtenez tous les sommets d'un polygone en utilisant OGR et Python

18

J'ai un petit problème avec l'API Python OGR. Ce que j'essaie de faire, c'est d'obtenir toutes les coordonnées de chaque sommet de l'anneau extérieur d'un polygone.

Voici ce que j'ai jusqu'à présent:

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

J'ai entendu dire que vous pouvez juste forsurvoler la région, mais cela ne renvoie que les anneaux du polygone, pas les nœuds.

Toute personne en mesure d'aider.

Nathan W
la source

Réponses:

15

Cela dépend un peu de votre format de fichier et de votre géométrie, mais en principe la suite pourrait ressembler à ceci.

  for p in xrange(points):
        lon, lat, z = ring.GetPoint(p)
relouer
la source
C'est l'une des sorties: (1.8565347032449642e-313, 7.1913896573768921e-305, 6.3952653423603306e-305) Une idée de ce qui se passe avec ça?
Nathan W
Pas exactement, c'est un triple de coordonnées, bien qu'un peu minuscule;) - à quoi ressemblent vos données d'entrée et votre projection? Par exemple, que ogrinfo -aldit-on?
relancer le
Cela me semble interpréter les flotteurs comme des doubles ou similaires.
MerseyViking
5
Cette ligne devrait se lire: lon, lat, z = ring.GetPoint(p)ce qui fonctionne pour moi.
MerseyViking
Merci MerseyViking, ça y est. Je ne peux pas croire que j'ai regardé ça.
Nathan W
5

Je viens de rencontrer le même problème. J'ai fini d'utiliser la fonction ExportToJson dans ogr, puis de lire la chaîne Json dans un dictionnaire. En utilisant mes données et la notation de la question d'origine, cela ressemble à ceci:

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
la source
4

Si vous regardez uniquement les fichiers de formes, vous pouvez également utiliser 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
la source