LineString 的长度(以英里为单位)

Posted

技术标签:

【中文标题】LineString 的长度(以英里为单位)【英文标题】:Length of LineString in Miles 【发布时间】:2015-05-04 00:21:27 【问题描述】:

我将运行数据表示为 Shapely LineStrings,其中 LineString 中的每个点都是一个坐标。我试图以英里为单位计算 LineString 的长度。我知道 LineString 有一个length 方法,但是我不知道结果是什么单位。

例如,我知道跑步是 0.13 英里,但是当我打印出 runs[0].length 时,我得到 0.00198245721108。我认为这是因为 LineString 在笛卡尔坐标系中,但我并不完全确定。

【问题讨论】:

你能提供你的代码吗? 我可以,但问题不在我的代码中。我的问题是 LineString 类的 Shapely 的 length 函数提供了笛卡尔距离,我需要地理距离。 【参考方案1】:

Shapely 的LineString 类提供了一个coords 方法,该方法返回构成LineString 的所有坐标。例如:

from shapely.geometry import LineString

# Create a LineString to mess around with
coordinates = [(0, 0), (1, 0)]
line1 = LineString(coordinates)

# Grab the second coordinate along with its x and y values using standard array indexing
secondCoord = line1.coords[1]
x2 = secondCoord[0]
y2 = secondCoord[1]

# Print values to console to verify code worked
print "Second Coordinate: " + str(secondCord)
print "Second x Value: " + str(x2)
print "Second y Value: " + str(y2)

将打印

第二坐标:(1.0, 0.0) 第二个 x 值:1.0 第二个y值:0.0

您可以使用它来获取LineString 中每个 GPS 坐标的latlon 值,其中x 代表laty 代表lon。然后使用Haversine 公式可以计算地理距离。快速搜索后,我发现 this answer 为 Haversine 公式函数提供 Python 代码,我已经验证了它的工作原理。但是,这只是为您提供 2 个点之间的距离,因此如果您的 GPS 数据中有转弯,您将不得不计算每个单独点之间的距离,而不是起点和终点的距离。这是我使用的代码:

from shapely.geometry import LineString
from math import radians, cos, sin, asin, sqrt

# Calculates distance between 2 GPS coordinates
def haversine(lat1, lon1, lat2, lon2):
    """
    Calculate the great circle distance between two points 
    on the earth (specified in decimal degrees)
    """
    # convert decimal degrees to radians 
    lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2])

    # haversine formula 
    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 = 3956 # Radius of earth in kilometers. Use 3956 for miles
    return c * r

for line in listOfLines:
    numCoords = len(line.coords) - 1
    distance = 0
    for i in range(0, numCoords):
        point1 = line.coords[i]
        point2 = line.coords[i + 1]
        distance += haversine(point1[0], point1[1], point2[0], point2[1])

    print distance

如果您只为一个 LineString 执行此操作,您可以摆脱外部 for 循环,但我需要计算几次运行的距离。另外,请注意,如果您从链接中的答案中获取代码,我已经切换了函数参数,因为提供的答案首先具有lon,但它很烦人必须输入haversine(point1[1], point1[0]...)

【讨论】:

GRS80 地球的平均半径为 6371 公里或 3959 英里。这段代码中的r = 3956 是什么?在此处查看导出的几何常数 R1:geoweb.mit.edu/~tah/12.221_2005/grs80_corr.pdf

以上是关于LineString 的长度(以英里为单位)的主要内容,如果未能解决你的问题,请参考以下文章

如何按距离(以英里为单位)从 C# 中的给定纬度/经度对纬度/经度列表进行排序?

如何在sql server中通过给定的邮政编码和以英里为单位的半径从附近的表中获取所有其他邮政编码或(纬度和经度)?

mysql中如何根据经纬度优化这个距离查询

php mysql比较long和lat,返回10英里以下的

《基础微积分》---引言

《基础微积分》---引言