多边形集

时间:2017-11-26 23:34:51

标签: python shapely

我在GIS中有一个带有很多多边形的多边形集。我的任务是找到两个多边形,它们之间有最大距离[两个多边形是最远/最远的,我的英文很有趣:(]

这是我的代码到目前为止,但我停止了因为输出给了我不正确的最大值。请帮忙。这是我的代码:

# -*- coding: utf-8 -*-
from shapely.wkb import loads
from osgeo import ogr


datoteka=ogr.Open("C:\Users\Sanja\Desktop\Desktop\Geof\Geof 
IV\BPP\podaci\katastar.shp")
sloj=datoteka.GetLayerByName("katastar")


udaljenosti=[]
for i in sloj:
    cestica1=loads(i.GetGeometryRef().ExportToWkb())
    for j in sloj:
        cestica2=loads(j.GetGeometryRef().ExportToWkb())
        udaljenosti.append(cestica1.distance(cestica2))


max_udaljenost=max(udaljenosti)
print max_udaljenost


datoteka.Destroy()

我知道我在代码中有很多不必要的东西,但是当我修复这个最大距离时我会解决这个问题。

1 个答案:

答案 0 :(得分:0)

如果您在层sloj上进行迭代,则很可能存在问题。问题是如果你写这样的代码:

#!/usr/bin/env python
from shapely.wkb import loads
from osgeo import ogr

datoteka = ogr.Open("custom.shp")
sloj = datoteka.GetLayer()

N = sloj.GetFeatureCount()
print(N)
for p in sloj:
    cnt = 0
    for q in sloj:
        cnt += 1
    print(cnt)

然后,这不会打印NN次,而只是N后跟N-1。原因是sloj作为迭代器工作,因此当输入外部循环时,它会消耗第一个元素,而内部循环会消耗所有剩余的N-1元素。因此,外部循环在下一次迭代时终止,因为没有任何东西需要迭代。

为了在你的代码中反映这一点,你可以做例如(如果对象的数量不是太大):

# -*- coding: utf-8 -*-
from shapely.wkb import loads
from osgeo import ogr


datoteka=ogr.Open("C:\Users\Sanja\Desktop\Desktop\Geof\Geof 
IV\BPP\podaci\katastar.shp")
sloj=datoteka.GetLayerByName("katastar")

L = [p.GetGeometryRef().ExportToWkb() for p in sloj]
N, max_dist = len(L), -1

for i in range(N):
    cestica1 = L[i]
    for j in range(i+1, N):
        cestica2 = L[j]
        max_dist = max(max_dist, cestica1.distance(cestica2))

print(max_dist)

datoteka.Destroy()

然而,这些距离是以纬度/经度坐标计算的,即它们不代表地球上的真实距离。然而,如果图层中的对象不跨越地球的大区域,那么纬度/经度坐标系中距离最大的对将很可能对应于具有最大" true&#的对。 34;距离。