Python:定义最小边界矩形

时间:2013-12-27 21:59:29

标签: python list numpy 2d gis

我有以下格式的数据,一个2d x,y坐标列表:

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

我正试图遍历列表,找到格式为[(minx,miny),(maxx,miny),(maxx,maxy),(minx,maxy)]

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

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)])

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

2 个答案:

答案 0 :(得分: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)]

答案 1 :(得分:0)

您遇到的问题是您正在搜索向量最小值/最大值,而应该按每个检查器维度进行搜索(在您的情况下为两个)。 所以你应该寻找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二维数组而不是元组列表。