使用Python计算MULTILINESTRING两点之间的距离?

问题描述 投票:0回答:1

我在河流网络上有一个 .gdb 文件,需要计算属于同一河流的点之间的距离。所以我需要计算河流每个部分的距离。 我用

geopandas
读取 .gdb 文件。我的 CRS 是 EPSG:4326

在文件中,每条河流都有一个如下所示的几何单元(数字各不相同):

MULTILINESTRING ((9.662499999999682 37.324999999998845, 9.656249999999602 37.331249999998924)) 

这是我迄今为止针对一条随机河流作为尝试而提出的解决方案:

river_geoms = rivers_main.loc[0, 'geometry']
if isinstance(river_geoms, MultiLineString):
    line_string = river_geoms[0]
    dists = calculate_distance(line_string)

def calculate_distance(line_string):
    points = [Point(xy) for xy in line_string.coords]
    distance_values = []
    for idx in range(len(points) - 1):
        distance = point1.distance(point2)
        print('Distance between points: ' + str(distance))
        distance_values.append(distance)
    return distance_values

我得到以下距离:

Distance between points: 0.0058925565099126834
Distance between points: 0.0041666666668191965
Distance between points: 0.0058925565099126834
Distance between points: 0.01666666666667993
Distance between points: 0.00589255650986244

我不知道如何解释这些结果以及如何计算以米为单位的距离。 我是地理空间数据的初学者,将不胜感激任何帮助。

python-3.x geospatial shapely rasterio
1个回答
0
投票

我发现库之间在纬度、经度的使用顺序方面没有达成共识。 Shapely 已将 lat,lon 转换为 lon,lat。此外,我添加了半正弦方程来解释地球曲率并将结果转换为米。令人兴奋的是经纬度序列并未标准化。最后是我的工作代码:

river_geoms = rivers_main.loc[0, 'geometry']
if isinstance(river_geoms, MultiLineString):
    line_string = river_geoms[0]
    dists = calculate_distance(line_string)

def calculate_distance(line_string):
    points = [xy for xy in line_string.coords]
    distance_values = []
    for idx in range(len(points) - 1):
        point1, point2 = points[idx], points[idx + 1]
        distance = haversine(point1[0], point1[1], point2[0], point2[1])
        print('Distance between points: ' + str(distance))
        distance_values.append(distance)
    return distance_values

def haversine(lon1, lat1, lon2, lat2):
    lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2])
    dlon = lon2 - lon1 
    dlat = lat2 - lat1 
    a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2
    c = 2 * asin(sqrt(a)) 
    r = 6371 * 1000
    return c * r
© www.soinside.com 2019 - 2024. All rights reserved.