Calcular la distancia entre un punto y una línea virtual de dos lat / lngs

14

Consulte el ejemplo y la imagen correspondiente.

Me gustaría lograr lo siguiente: proporcionar dos ubicaciones (lat / lng), que se muestran a continuación como A y B . A partir de esto, se dibujará una línea virtual y luego se calculará la distancia entre esta línea y C (en cualquier medida).

Lo he logrado actualmente en la API de Google Maps v3, pero también me gustaría poder realizar esto entre bastidores en el idioma de mi elección. ¡Cualquier consejo / idea sería muy apreciado!

    
pregunta Prisoner 23.06.2011 - 16:24

4 respuestas

6
def get_perp( X1, Y1, X2, Y2, X3, Y3):
    """************************************************************************************************ 
    Purpose - X1,Y1,X2,Y2 = Two points representing the ends of the line segment
              X3,Y3 = The offset point 
    'Returns - X4,Y4 = Returns the Point on the line perpendicular to the offset or None if no such
                        point exists
    '************************************************************************************************ """
    XX = X2 - X1 
    YY = Y2 - Y1 
    ShortestLength = ((XX * (X3 - X1)) + (YY * (Y3 - Y1))) / ((XX * XX) + (YY * YY)) 
    X4 = X1 + XX * ShortestLength 
    Y4 = Y1 + YY * ShortestLength
    if X4 < X2 and X4 > X1 and Y4 < Y2 and Y4 > Y1:
        return X4,Y4
    return None

La longitud más corta es la distancia que necesitas, a menos que me equivoque.

    
respondido por el Hairy 24.06.2011 - 10:45
11

Tal vez lo estoy complicando demasiado, pero lo que quieres es la distancia desde un punto a una línea. Esa es la distancia desde un punto a lo largo de AB que une AB con C con una línea ortogonal a AB. Este vector perpendicular a AB está dado por

v=[x2-x1, -(y2-y1)] # Point A is [x1,y1] Point B is [x2,y2]

(He usado los corchetes para definir un vector o una matriz de dos elementos). La distancia entre C [xp, yp] y el punto A es

u=[x1-xp, y1-xp]

La distancia entre la línea y C es solo la proyección de u en v. Si asumimos que mod (v) = 1 (solo lo normalizamos), entonces

distance = u*v = abs( (x2-x1)*(y1-yp) - (x1-xp)*(y2-y1) )

La única complicación es que probablemente desee asegurarse de que sus coordenadas no sean pares de registro / latido WGS84, sino que estén proyectadas (o que utilicen coordenadas geodésicas). Puede utilizar OGR o Proj4 para esto.

    
respondido por el Jose 23.06.2011 - 17:30
4

También siendo un poco reacio a todas estas matemáticas, lo abordaría desde un ángulo diferente. Lo convertiría en una línea "real", en lugar de una línea virtual, y luego utilizaría las herramientas existentes.

Si A y B comparten un atributo, puede conectarlos dibujando una línea (Kosmo GIS tiene una herramienta que creará líneas a partir de puntos, y creo que también hay un complemento de QGIS para esto). Una vez que tenga las líneas, una función 'cerca' en la capa de puntos 'C' le dará la distancia a la línea. ¡Deje que el software maneje las matemáticas por usted!

    
respondido por el Darren Cope 24.06.2011 - 13:36
1

Si estabas usando java en Android, es solo una línea con la función de biblioteca

import static com.google.maps.android.PolyUtil.distanceToLine;

distanceToLine:

public static double distanceToLine(LatLng p, LatLng start,LatLng end)

Calcula la distancia en la esfera entre el punto p y el segmento de línea de principio a fin.

Parámetros: p - el punto a medir

inicio: el principio del segmento de línea

fin: el final del segmento de línea

Devoluciones: la distancia en metros (asumiendo tierra esférica)

Solo agrega una biblioteca a tu

dependencies {
    compile 'com.google.maps.android:android-maps-utils:0.5+'
}
    
respondido por el indy 06.06.2017 - 20:31

Lea otras preguntas en las etiquetas