Holen Sie sich alle Eckpunkte eines Polygons mit OGR und Python


18

Ich habe ein kleines Problem mit der Python-OGR-API. Ich versuche, alle Koordinaten jedes Scheitelpunkts des äußeren Rings eines Polygons abzurufen.

Das habe ich bisher:

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

Ich habe gehört, dass Sie nur forüber die Region können, aber das gibt nur die Ringe im Polygon zurück, nicht die Knoten.

Jeder, der helfen kann.

Antworten:


15

Es hängt ein bisschen von Ihrem Dateiformat und Ihrer Geometrie ab, aber im Prinzip könnte die Fortsetzung so aussehen.

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

Dies ist einer der folgenden Ausgänge: (1.8565347032449642e-313, 7.1913896573768921e-305, 6.3952653423603306e-305) Irgendeine Idee, was damit los ist?
Nathan W

Nicht genau, es ist ein Dreifach von Koordinaten, wenn auch ein bisschen winzig;) - wie sehen Ihre Eingabedaten und Projektionen aus? zB Was ogrinfo -alsagt das?
Relet

Das sieht für mich so aus, als würde es Floats als Double oder ähnlich interpretieren.
MerseyViking

5
Diese Zeile sollte lauten: lon, lat, z = ring.GetPoint(p)Welche für mich funktioniert.
MerseyViking

Danke MerseyViking, das hat es getan. Ich kann nicht glauben, dass ich darüber nachgesehen habe.
Nathan W


5

Ich bin auf dasselbe Problem gestoßen. Ich beendete die Verwendung der ExportToJson-Funktion in OGR und las dann den Json-String in ein Wörterbuch. Unter Verwendung meiner Daten und der Notation aus der ursprünglichen Frage sieht dies folgendermaßen aus:

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

Wenn Sie sich nur Shapefiles ansehen , können Sie auch pyshp verwenden .

import shapefile
sf = shapefile.Reader("shapefiles/blockgroups")
shapes = sf.shapes()
for shape in shapes:
  for vertex in shape.points:
    #do something with the vertex
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.