Obter todos os vértices de um polígono usando OGR e Python

18

Estou tendo um pequeno problema com a API OGR do Python. O que estou tentando fazer é obter todas as coordenadas de cada vértice do anel externo de um polígono.

Isto é o que eu tenho até agora:

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

Ouvi dizer que você pode foratravessar a região, mas que apenas retorna os anéis no polígono, não os nós.

Qualquer um capaz de ajudar.

Nathan W
fonte

Respostas:

15

Depende um pouco do formato e da geometria do arquivo, mas, em princípio, a continuação pode ser assim.

  for p in xrange(points):
        lon, lat, z = ring.GetPoint(p)
relet
fonte
Esta é uma das saídas: (1.8565347032449642e-313, 7.1913896573768921e-305, 6.3952653423603306e-305) Alguma idéia do que há com isso?
Nathan W
Não exatamente, trata-se de um triplo de coordenadas, ainda que um pouco pequenas;) - como são os dados de entrada e a projeção? eg O que ogrinfo -aldiz?
relet
Parece-me que está interpretando carros alegóricos como duplos ou similares.
MerseyViking
5
Essa linha deve ler: O lon, lat, z = ring.GetPoint(p)que funciona para mim.
MerseyViking
Obrigado MerseyViking, que fez isso .. não posso acreditar que eu olhei sobre isso.
Nathan W
5

Acabei de encontrar o mesmo problema. Acabei usando a função ExportToJson no ogr e depois li a string Json em um dicionário. Usando meus dados e a notação da pergunta original, isso se parece com:

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
fonte
4

Se você estiver olhando apenas para shapefiles, também poderá usar o 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
fonte