多边形集中多边形之间的最大距离
Max distance between polygons in a polygon set
我在 GIS 中设置了一个包含很多多边形的多边形。我的任务是找到两个之间距离最大的多边形 [两个多边形 farthest/farthermost,我的英语很有趣 :( ]
到目前为止,这是我的代码,但我停止了,因为输出给我的最大值不正确。请帮忙。这是我的代码:
# -*- 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:\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()
但是,这些距离是在 lat/lon 坐标中计算的,即它们不代表地球上的真实距离。然而,如果图层中的对象没有跨越地球的大片区域,那么 lat/lon 坐标系中距离最大的对很可能对应于 "true" 距离最大的对.
我在 GIS 中设置了一个包含很多多边形的多边形。我的任务是找到两个之间距离最大的多边形 [两个多边形 farthest/farthermost,我的英语很有趣 :( ]
到目前为止,这是我的代码,但我停止了,因为输出给我的最大值不正确。请帮忙。这是我的代码:
# -*- 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:\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()
但是,这些距离是在 lat/lon 坐标中计算的,即它们不代表地球上的真实距离。然而,如果图层中的对象没有跨越地球的大片区域,那么 lat/lon 坐标系中距离最大的对很可能对应于 "true" 距离最大的对.