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

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

最佳答案

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


您可以使用它来获取lat中每个GPS坐标的lonLineString值,其中x代表laty代表lon。然后,使用Haversine公式可以计算地理距离。快速搜索后,我发现this answer为Haversine Formula函数提供了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]...)

关于python - LineString的长度(以英里为单位),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30020930/

10-12 23:20