Получить все вершины многоугольника, используя OGR и Python

18

У меня небольшие проблемы с Python OGR API. То, что я пытаюсь сделать, это получить все координаты каждой вершины внешнего кольца многоугольника.

Это то, что я до сих пор:

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

Я слышал, что вы можете только forнад областью, но это возвращает только кольца в многоугольнике, а не узлы.

Любой, кто может помочь.

Натан У
источник

Ответы:

15

Это немного зависит от формата и геометрии вашего файла, но в принципе продолжение может выглядеть следующим образом.

  for p in xrange(points):
        lon, lat, z = ring.GetPoint(p)
пересдавать
источник
Это один из выходов: (1.8565347032449642e-313, 7.1913896573768921e-305, 6.3952653423603306e-305) Есть идеи, что с этим?
Натан W
Не совсем, это тройка координат, если немного крошечная;) - как выглядят ваши входные данные и проекция? например, что ogrinfo -alговорит?
relet
Мне кажется, это интерпретирует поплавки как двойные или похожие.
MerseyViking
5
Эта строка должна гласить: lon, lat, z = ring.GetPoint(p)что работает для меня.
MerseyViking
Спасибо MerseyViking, что сделал это .. не могу поверить, что я посмотрел на это.
Натан W
5

Я просто столкнулся с той же проблемой. Я прекратил использовать функцию ExportToJson в ogr и затем прочитал строку Json в словарь. Используя мои данные и обозначения из исходного вопроса, это выглядит так:

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

Если вы смотрите только шейп-файлы, вы также можете использовать 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
Марк Пфистер
источник