Coordenadas cercanas [cerrado]

Crearé una aplicación que debería publicar "coordenadas" y otra función es revisar la base de datos y encontrar coordenadas cercanas. Digamos que tengo 1.000.000 de entradas en mi base de datos, ¿qué algoritmo usar? ¿Cómo puedo comparar las coordenadas que están a 100 m de distancia de las coordenadas dadas? Muchas aplicaciones hacen eso, pero parece difícil.

Actualización: por coordenadas me refiero a lon-lat. No sé por qué consideraste que esto no es una pregunta "real", pero necesito un punto de partida, por eso hice esta pregunta "general".

Muchas Gracias

preguntado el 12 de junio de 12 a las 19:06

Esta pregunta es demasiado amplia para Stack Overflow. También es demasiado vago y carece de detalles. -

¿Por coordenadas te refieres a un punto 2D? Da un ejemplo de lo que es una "coordenada" en tu pregunta. Y lo que dijo @Oded. -

obtener datos de la base de datos, usar un algoritmo de búsqueda en los datos (no para bases de datos espaciales) -

Parece un tipo de pregunta amplia de "prácticas generales", no lo suficientemente específica para StackOverflow:

Esta pregunta se ha hecho antes (y se votó a favor, no en contra) varias veces aquí. se expresó de manera un poco diferente, pero sigue siendo la misma pregunta básica: "¿Cómo mapear las coordenadas cercanas usando códigos geográficos?". (mire la columna de "preguntas relacionadas" a la derecha). Puedo ver cerrarlo como un duplicado, pero en realidad no es que mala pregunta. -

2 Respuestas

He usado algo llamado el Gran distancia del círculo hacer esto en el pasado. Trata a la Tierra como una esfera perfecta (que no lo es) y utiliza dos conjuntos de lat longs para determinar la distancia entre dos puntos de esa esfera. Dado que la Tierra no es una esfera perfecta, estas distancias no son perfectamente precisas. Si está tratando con distancias pequeñas y una pequeña diferencia entre lo calculado y lo real está bien, esto probablemente estaría bien para usted. Aquí hay una función que calcula el GCD:

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS ON 
GO
CREATE FUNCTION dbo.GreatCircleDistance
(
    @Latitude1 float = NULL,
    @Longitude1 float = NULL,
    @Latitude2 float = NULL,
    @Longitude2 float = NULL
)
RETURNS float
AS
BEGIN
    IF @Latitude1 IS NULL RETURN 0.0
    IF @Longitude1 IS NULL RETURN 0.0
    IF @Latitude2 IS NULL RETURN 0.0
    IF @Longitude2 IS NULL RETURN 0.0

    DECLARE @sin1 float
        ,@sin2 float
        ,@sind float
        ,@cos1 float
        ,@cos2 float
        ,@cosd float

    SELECT @sin1 = SIN(RADIANS(@Latitude1))
        ,@sin2 = SIN(RADIANS(@Latitude2))
        ,@sinD = SIN(RADIANS(@Longitude2 - @Longitude1))
        ,@cos1 = COS(RADIANS(@Latitude1))
        ,@cos2 = COS(RADIANS(@Latitude2))
        ,@cosD = COS(RADIANS(@Longitude2 - @Longitude1))

    RETURN ATN2     (SQRT(SQUARE(@cos2 * @sinD) + SQUARE(@cos1 * @sin2 - @sin1 * @cos2 * @cosD))
                ,@sin1 * @sin2 + @cos1 * @cos2 * @cosD
            ) * 3959.871
END
GO

Robado de aquí.

Respondido el 12 de junio de 12 a las 19:06

Esto puede ser muy lento al buscar vecinos en la base de datos. Para mssql, recomiendo las herramientas espaciales integradas: Andrey

Podría ser. Cuando hice esto en el pasado, fue un acuerdo de una sola vez, por lo que no hubo consideraciones de rendimiento. Tendría que ver una consulta lenta usando esto para recomendar una solución para acelerarlo. - abe miessler

¿Latitud, longitud en grados-minutos-segundos o grados decimales? Si es decimal entonces dist^2 ~= lat^2 + lon^2. No olvide comprobar el cuadrante. Es posible que desee ordenar su lista de búsqueda en un árbol de búsqueda 2d si realiza varias búsquedas.

Respondido el 12 de junio de 12 a las 19:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.