Vuelvo a este tema porque es muy similar a ¿Cómo puedo encontrar el vector de línea teniendo en QGIS o HIERBA? y puede ser resuelto con Python en la misma forma:
1) Haversine distancia
Uno puede encontrar un montón de secuencias de comandos mediante la búsqueda Haversine distancia con Python en el Internet y puedo elegir a uno de ellos en la Fórmula de Haversine en Python (rumbo y Distancia entre dos puntos en el GPS)
def haversine(lon1, lat1, lon2, lat2):
"""
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(math.radians, [lon1, lat1, lon2, lat2])
# haversine formula
dlon = lon2 - lon1
dlat = lat2 - lat1
a = math.sin(dlat/2)**2 + math.cos(lat1) * math.cos(lat2) * math.sin(dlon/2)**2
c = 2 * math.asin(math.sqrt(a))
km = 6367 * c
return km
Tenemos una serie de líneas (puntos) en el archivo que debe ser tratada en pares (punto1 - punto2) para calcular la distancia. Para ello vamos a utilizar un iterador simple de la Mayoría de python el camino para obtener el elemento anterior
def offset(iterable):
prev = None
for elem in iterable:
yield prev, elem
prev = elem
Ahora es posible leer el archivo (ejemplo de Kerrie) en pares de líneas/puntos
import csv
with open('testhavers.csv', 'rb') as f:
reader = csv.DictReader(f)
for pair in offset(reader):
print pair
(None, {'LAT': '10.08527', 'LON': '124.59833', 'ID': '1', 'TIME': '21:24:37'})
({'LAT': '10.08527', 'LON': '124.59833', 'ID': '1', 'TIME': '21:24:37'},
{'LAT': '10.08523', 'LON': '124.59830', 'ID': '2', 'TIME': '21:25:07'})
({'LAT': '10.08523', 'LON': '124.59830', 'ID': '2', 'TIME': '21:25:07'},
{'LAT': '10.08526', 'LON': '124.59832', 'ID': '3', 'TIME': '21:25:37'})
({'LAT': '10.08526', 'LON': '124.59832', 'ID': '3', 'TIME': '21:25:37'},
{'LAT': '10.08526', 'LON': '124.59831', 'ID': '4', 'TIME': '21:26:07'})
A continuación, cree un archivo de forma que contiene el original de los campos del archivo csv y un nuevo campo para la distancia con los módulos de Python bien formada y Fiona de Sean Gillies:
import fiona
from shapely.geometry import Point, mapping
# creation of the schema of the shapefile (geometry and fields)
schema = { 'geometry': 'Point', 'properties':{'ID': 'int', 'LAT':'float', 'LON':'float', 'TIME':'str','distance' : 'float'}}
# creation of the shapefile:
with fiona.collection("result.shp", "w", "ESRI Shapefile", schema) as output:
# reading the csv file
with open('testhavers.csv', 'rb') as f:
reader = csv.DictReader(f)
# we need here to eliminate the first pair of point with None
for i, pair in enumerate(offset(reader)):
if i == 0: (pair with None)
# writing of the point geometry and the attributes
point = Point(float(pair[1]['LON']), float(pair[1]['LAT']))
dist = 0 # None
output.write({'properties': {'ID':int(pair[1]['ID']),'LAT':float(pair[1]['LAT']),'LON':float(pair[1]['LON']), 'TIME':pair[1]['TIME'],'distance': dist},'geometry': mapping(point)})
else:
# writing of the point geometry and the attributes
point = Point(float(pair[1]['LON']), float(pair[1]['LAT']))
# Haversine distance between pairs of points
dist = haversine(float(pair[0]['LON']), float(pair[0]['LAT']), float(pair[1]['LON']),float(pair[1]['LAT']))
output.write({'properties': {'ID':int(pair[1]['ID']),'LAT':float(pair[1]['LAT']),'LON':float(pair[1]['LON']), 'TIME':pair[1]['TIME'],'distance': dist},'geometry': mapping(point)})
y el resultado:
También es posible hacerlo con PyQGIS pero es más complejo de lo que Fiona que utiliza simples diccionarios para crear archivos de forma.
Usted puede utilizar otra función para calcular el Haversine distancia (¿por Qué es la ley de los cosenos más preferible de haversine a la hora de calcular la distancia entre dos de latitud y longitud de los puntos?) sin ningún problema, sólo que el cálculo de la distancia de cambios, y no en el proceso de crear el archivo de forma.