2015-05-04 2 views
1

Я представляю данные выполнения как Shapely LineStrings, где каждая точка в LineString является координатой. Я пытаюсь выяснить длину LineString с точки зрения миль. Я знаю, что LineString имеет метод length, но я не знаю, какие единицы результаты.Length of LineString in Miles

Например, у меня есть пробег, который я знаю, составляет 0,13 мили, но когда я распечатываю runs[0].length, я получаю 0,00198245721108. Я предполагаю, что это потому, что LineString находится в декартовой системе координат, но я не совсем уверен.

+0

вы можете указать свой код? – mmenschig

+0

Я мог бы, но проблема не в моем коде. Моя проблема заключается в том, что функция 'length' Shapely для класса LineString обеспечивает декартовое расстояние, и мне нужно географическое расстояние. – steveclark

ответ

1

Класс Shapely's 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)
Второе значение х: 1,0
Второй год Значение: 0,0

Вы можете использовать это для захвата значений lat и lon значений каждой координаты GPS в вашем LineString, где x представляет lat и y представляет lon. Затем, используя Формулу Хаверсина, вы можете рассчитать географическое расстояние. После быстрого поиска я нашел this answer, который предоставляет код Python для функции Haversine Formula, которую я проверил. Тем не менее, это просто дает вам расстояние между двумя точками, поэтому, если ваши данные 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]...)

Смежные вопросы