我在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()
我知道我在代码中有很多不必要的东西,但是当我修复这个最大距离时我会解决这个问题。
答案 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)
然后,这不会打印N
次N
次,而只是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;距离。