8 votos

¿Cómo calcular distancias en una secuencia de punto?

Estoy en busca de ayuda para el cálculo de la distancia entre una secuencia de puntos que están en un único archivo Shapefile en QGIS. A continuación es lo que los datos de mi aspecto y un espacio en blanco de distancia de la columna he añadido a mostrar cómo me gustaría que la distancia a la mirada. Quiero saber la distancia entre el punto 1 y 2, 2 y 3, etc. Me gustaría que la distancia en metros o en Kilómetros, pero en la actualidad mi Shapefile en una proyección cuyas unidades son grados decimales.

ID  LAT         LON         TIME        DISTANCE
1   10.08527    124.59833   21:24:37    0
2   10.08523    124.59830   21:25:07    ?
3   10.08526    124.59832   21:25:37    ?
4   10.08526    124.59831   21:26:07    ?

Un número de personas que tienen preguntas similares, pero ninguna acababa de conseguir lo que yo quiero hacer. Este post está cerca, pero esto es en PostGIS, no QGIS Calcular las distancias entre una serie de puntos en postgis

Este post me hizo parte del camino, pero ya que soy nuevo en el QGIS la respuesta no ofrecen información suficiente para mí. Por ejemplo, una vez que he instalado el CÉSPED plugin, creo que tengo que guardar o importar el archivo Shapefile con mi serie de puntos GPS en la HIERBA, de modo que se puede utilizar el v. módulo de distancia, pero no sé cómo hacerlo. QGIS calcular la distancia del punto a lo largo de una línea

Es la HIERBA v. módulo de distancia el único camino a seguir? O es que hay una forma más sencilla? Si v. a distancia es la única manera de que alguien sea capaz de que me apunte a o explicar paso a paso cómo hacerlo?

8voto

GreyCat Puntos 146

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: enter image description here

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.

5voto

Rihan Meij Puntos 362

Si estás familiarizado con r, utilice una combinación del paquete 'sp' y 'dismo'.

Así por ejemplo (suponiendo que los puntos con coordenadas x, y):

library(sp)
library(dismo)

data <- read.csv2(..) # Read in your data
coordinates(data) <- ~x+y # point them to your coordinates to make a spatialpoint layer
# Or like this:
Pointlayer <- SpatialPoints(cbind(data$x,data$y))


# then calculate your distance matrix your point sequence
d <- pointDistance(pp,longlat=F)

# Looks for example like this:
head(d)
          [,1]     [,2]     [,3]     [,4]     [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]
[1,]  0.000000       NA       NA       NA       NA   NA   NA   NA   NA    NA    NA    NA
[2,] 54.561891  0.00000       NA       NA       NA   NA   NA   NA   NA    NA    NA    NA
[3,] 25.000000 73.49830  0.00000       NA       NA   NA   NA   NA   NA    NA    NA    NA
[4,] 50.487622 43.93177 53.14132  0.00000       NA   NA   NA   NA   NA    NA    NA    NA
[5,]  4.123106 57.00877 26.30589 54.58938  0.00000   NA   NA   NA   NA    NA    NA    NA
[6,] 32.249031 37.21559 57.14018 60.30755 32.01562    0   NA   NA   NA    NA    NA    NA

#More information about the method in dismo package help

3voto

¿Tal vez podría ayudar la herramienta de matriz de distancia? Se encuentra bajo el menú de vectores. Para cada punto de esta calcular la distancia a cada uno de los otros puntos y almacena el resultado en un archivo CSV.

Si desea que las distancias en metros creo que tendría sentido para transformar sus puntos de lat/lon a un shapefile proyectada (posiblemente UTM51 en su caso) antes de utilizar la herramienta.

N.

0voto

Utilice v.to.db en hierba (por ejemplo, a través de plugin de Sextante) con opción = longitud (longitud de línea).

Ejemplo de carga longitudes de línea (en metros) de cada línea de vector a la tabla de atributos (rellenar los correspondientes campos en el GUI):

v.to.db map=roads option=length type=line col=linelength units=me

0voto

Michiel Borkent Puntos 11503

Me parece que este problema es más fácil de resolver, trabajando en una hoja de cálculo, no utilizar la sig. Me encontré con el trabajo de Chris Vidad a ser muy útil -

http://www.movable-type.co.uk/scripts/latlong.html

Si se desplaza el párrafo inferior, encontrará los enlaces a las dos hojas de excel, que son:

http://www.movable-type.co.uk/scripts/latlong-distance+bearing.xls

http://www.movable-type.co.uk/scripts/latlong-dest-point.xls

Ver también;

¿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?

y usted puede buscar en el sig.se para haversine.

saludos

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X