Python、GIS和Fortran:尝试从xy点数据创建多个多边形

1 投票
1 回答
521 浏览
提问于 2025-04-17 02:52

我在这个问题上已经努力了很久,但在ESRI论坛上和我写的FORTRAN三角剖分脚本中都没有找到解决办法。

我有两个.csv文件,里面有几百个xy坐标点。这些点代表了潮间带的高低范围。高点和低点是平行的,我想创建一些多边形的细条,每一英尺连接四个点,形成不同的多边形。多边形的高度会根据高低点之间的距离而变化。下面的链接展示了两张图片,能更好地说明我的意思:

http://forums.arcgis.com/threads/39757-Feature-to-Line..?p=135880&posted=1#post135880

我遇到的主要问题是让多边形在拐角处正确形成。我明白,当在弯道上移动时,底部直径为1英尺、顶部直径也为1英尺的多边形是无法存在的。但这只是我在尝试解决这个问题时遇到的众多问题之一……

如果能得到任何帮助,我将非常感激,感谢!

1 个回答

0

这个方法应该可以用来进行插值(比如说潮汐线距离岸边某个控制点的x和y距离):

import math

example_triangle = [[0,0], [5,5], [0,5], [0,0]]
high_tide_line = [[0, 0], [5., 1.5], [10., 3.2], [20., 1.], [30., 4.5], [80.,2.], [80,0]]
low_tide_line = [[0, 10.], [5., 11.5], [10., 13.2], [20., 11.], [30., 14.5], [80., 12.], [80, 10]]

def points_from_geom(geom):
    idx = 0
    line_lengths = []
    unit_vectors = []
    interpolated_points = []
    while idx < (len(geom) - 1):
        dy, dx = ((geom[idx+1][1] - geom[idx][1]), (geom[idx+1][0] - geom[idx][0]))
        line_lengths.append(math.sqrt(dy**2 + dx**2))
        try:
            angle = math.atan(dy/dx)
            unit_vectors.append([math.cos(angle)*cmp(dx, 0),
                math.sin(angle)*cmp(dy, 0)])
        except ZeroDivisionError:
            if geom[idx+1][1] < geom[idx][1]:
                direction = [0, -1]
            else:
                direction = [0, 1]
            unit_vectors.append(direction)
        idx += 1

    for i, length in enumerate(line_lengths):
        inter = 0
        while inter <= length:
            interpolated_points.append([geom[i][0] + unit_vectors[i][0]*inter,\
                geom[i][1] + unit_vectors[i][1]*inter])
            inter += .3048 # a ft in proper units ;)

    return interpolated_points

ln1 = points_from_geom(example_triangle)
ln2 = points_from_geom(high_tide_line)
ln3 = points_from_geom(low_tide_line)

print ln1, ln2, ln3

制作多边形的方法有很多种。我可能会尝试确定一个参考的海岸线,然后在固定的间隔或者每条线段的中间,向它画垂直线。接着,可以用这些线和相邻的海岸线的交点来制作一个多边形或者边界框。顺便提一下,在实际应用中,你需要确保cmp不在(0,0)这个点上操作。

撰写回答