Отримайте всі вершини багатокутника за допомогою OGR та Python


18

У мене виникають невеликі проблеми з API OGR Python. Я намагаюся зробити всі координати кожної вершини зовнішнього кільця багатокутника.

Ось що я маю досі:

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) Будь-яка ідея, що з цим?
Nathan W

Не зовсім, це потрійна координата, якщо трохи крихітна;) - як виглядають ваші вхідні дані та проекція? наприклад, що ogrinfo -alговорить?
relet

Мені це здається, що він інтерпретує поплавці як парні або подібні.
MerseyViking

5
У цьому рядку слід писати: lon, lat, z = ring.GetPoint(p)Що працює для мене.
MerseyViking

Дякую MerseyViking, що це зробило .. не вірю, що я переглянув це.
Nathan 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.