【问题标题】:Python: Defining a minimum bounding rectanglePython:定义最小边界矩形
【发布时间】:2013-12-27 21:59:28
【问题描述】:

我有以下格式的数据,二维 x,y 坐标列表:

[(6, 7), (2, 4), (8, 9), (3, 7), (5, 4), (9, 9)]

我正在尝试遍历列表以找到格式为 [(minx,miny),(maxx,miny),(maxx,maxy),(minx,maxy)] 的最小边界框

因此,我编写了以下代码,但它似乎不起作用。可能与我没有将其传递给数组而不是列表的事实有关。输入和代码如下,打印坐标返回前面提到的列表:

os.chdir("filepath")
with open ('file.csv') as csvfile:
    coords = [(int(x), int(y)) for x, y in csv.reader(csvfile, delimiter= ',')]
print coords


def bounding_box(coords):
    min_x, min_y = numpy.min(coords[0], axis=0)
    max_x, max_y = numpy.max(coords[0], axis=0)
    return numpy.array(
        [(min_x, min_y), (max_x, min_y), (max_x, max_y), (min_x, max_y)])

谁能指出我正确的方向?如果没有帮助,请随意忽略上面的整个代码。

【问题讨论】:

  • 您可以尝试在 Google 上搜索“最小边界矩形”,或者您可以阅读“赫尔算法”。您也可以提供输入/输出示例。
  • @christian 谢谢,我试过谷歌搜索,但在从我的数据输入构建方面我找不到 mbr 的任何东西。此外,凸包算法对于我需要的东西来说太复杂了,只需定义四个角就足够了。
  • 请按照我的说法,您能提供输入/输出示例吗?因此,我们更容易为您提供帮助。
  • 所有你需要做的就是从对np.minnp.max的调用中删除[0],即np.min(coords, axis=0)

标签: python list numpy 2d gis


【解决方案1】:

为什么不用四个计数器遍历列表:min_xmin_ymax_xmax_y

def bounding_box(coords):

  min_x = 100000 # start with something much higher than expected min
  min_y = 100000
  max_x = -100000 # start with something much lower than expected max
  max_y = -100000

  for item in coords:
    if item[0] < min_x:
      min_x = item[0]

    if item[0] > max_x:
      max_x = item[0]

    if item[1] < min_y:
      min_y = item[1]

    if item[1] > max_y:
      max_y = item[1]

  return [(min_x,min_y),(max_x,min_y),(max_x,max_y),(min_x,max_y)]

使用您的示例输入:

bounding_box([(6, 7), (2, 4), (8, 9), (3, 7), (5, 4), (9, 9)])
>> [(2, 4), (9, 4), (9, 9), (2, 9)]

【讨论】:

  • @matt_stokes ,现在一切正常,谢谢!由于定义了最小值和最大值,它可能不是完美的解决方案,但它可以完成工作。
  • 如果您的列表中至少有 1 个元素,则始终会覆盖最小值和最大值。为了 100% 安全,您应该为空列表添加条件
【解决方案2】:

您遇到的问题是您正在搜索矢量最小值/最大值,而您应该按每个 verctor 维度(在您的情况下为两个)进行搜索。 所以你应该寻找 X 的最小值和 Y 的最小值,最大值相同。

正确的做法是:

min_x, min_y = numpy.min(coords[...,0]), numpy.min(coords[...,1])
max_x, max_y = numpy.max(coords[...,0]), numpy.max(coords[...,1])
return numpy.array(
    [(min_x, min_y), (max_x, min_y), (max_x, max_y), (min_x, max_y)])

coords[...,0]coords[...,1] 表示您正在从特定维度(分别为 X 或 Y)中选择值。

为了让所有这些都能正常工作,您还应该将坐标列表设为一个 numpy 二维数组,而不是元组列表。

【讨论】:

  • 对于二维数组,您对np.min 的两次调用等效于np.min(coords, axis=0),对np.max 的两次调用也是如此。
  • 谢谢,我不知道,我对 numpy 比较陌生,总的来说,我给出的代码示例工作得很好。 user3115802 的问题只是您在评论中提到的 [0] 部分
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-31
  • 2011-06-30
  • 2018-08-08
  • 2019-08-11
  • 2019-12-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多