我在河流网络上有一个 .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
我不知道如何解释这些结果以及如何计算以米为单位的距离。 我是地理空间数据的初学者,将不胜感激任何帮助。
我发现库之间在纬度、经度的使用顺序方面没有达成共识。 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