Класс 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]...)
вы можете указать свой код? – mmenschig
Я мог бы, но проблема не в моем коде. Моя проблема заключается в том, что функция 'length' Shapely для класса LineString обеспечивает декартовое расстояние, и мне нужно географическое расстояние. – steveclark