我在 GIS 中设置了一个多边形,其中包含很多多边形。我的任务是找到两个多边形之间距离最大[两个最远/最热的多边形,我的英语很有趣:( ]
到目前为止,这是我的代码,但我停止了,因为输出给了我不正确的最大值。请帮忙。这是我的代码:
# -*- coding: utf-8 -*-
from shapely.wkb import loads
from osgeo import ogr
datoteka=ogr.Open("sth.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()
我知道我在代码中有很多不必要的东西,但是当我修复这个最大距离时,我会解决这个问题。
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:UsersSanjaDesktopDesktopGeofGeof
IVBPPpodacikatastar.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()
但是,这些距离是以纬度/纬度坐标计算的,即它们不代表地球上的真实距离。但是,如果图层中的对象不跨越地球的大面积区域,则纬度/纬度坐标系中距离最大的对很可能对应于具有最大"真实"距离的对。