Al usar la función STContains de la geografía SQL, fue posible calcular si un conjunto de coordenadas está dentro de un área < / a>, sin embargo, esto reveló que si las últimas coordenadas recibidas estaban fuera del área, estas coordenadas no coinciden con ninguna ubicación.

¿Cuál sería una forma eficiente de mostrar cuántos y dispositivos (de 4000) están presentes en qué ubicación (de 600) en función de la distancia más pequeña entre un conjunto estático? de coordenadas de ubicación y coordenadas dinámicas de dispositivos?

Tabla de ubicación:

loc_name | loc_lat | loc_long | loc_geo_polygon | loc_geo_point

Tabla de dispositivos:

dev_name | dev_lat | dev_long | dev_geo_point

La solución obvia es consultar ambas tablas para todos los datos y recorrer 4000 dispositivos y medir la distancia a 600 ubicaciones que devuelven la distancia más pequeña, pero eso crea cálculos de 2.4 mil cada vez que quiero ver datos. Incluso si elimino de la lista un dispositivo con una ubicación que ya coincide, todavía hay bastantes cálculos con un potencial limitado de crecimiento futuro.

Otra forma es agregar una columna location_name a la tabla Dispositivos y calcular la ubicación más cercana cada vez que recibo coordenadas de un dispositivo, que serían 100 dispositivos x 600 ubicaciones calculadas por minuto, mejor que antes, ya que es una carga constante en lugar de una ráfaga.

¿Quizás haya una mejor manera de abordar esto de manera lógica o con el uso de funciones que no conozco?

3
anm767 26 oct. 2020 a las 23:31

1 respuesta

La mejor respuesta

Puedo pensar en un par de formas. Ambos aprovecharán la capacidad de la solución anterior para encontrar el conjunto de puntos que están dentro de la tolerancia especificada de una de sus ubicaciones fijas. Lo cual, por extensión, debería darle una forma de encontrar el conjunto de puntos excepcionales.

Una vez que se encuentra ese conjunto, puede aplicar el tratamiento de "vecino más cercano" descrito aquí. Se verá más o menos así:

select *
from ExceptionalPoints as e
cross apply (
   select top(1) l.*
   from Location as l
   order by l.loc_geo_point.STDistance(e.dev_geo_point)
) as nn

Desde el documento, eso debería poder aprovechar los índices espaciales existentes en las tablas.

El otro enfoque en el que puedo pensar es crear un Voronoi Tessellation utilizando sus ubicaciones. Luego, agregaría otra columna a su tabla de Ubicaciones para almacenar la celda Voronoi asociada con esa ubicación. En ese punto, sería una cuestión de unir las dos tablas como en el enfoque original. Diablos ... esto incluso podría reemplazar el enfoque original (usando la celda de Voronoi en lugar de un búfer de radio fijo alrededor de la ubicación). Pero viene con la advertencia: calcular la teselación no es trivial. Por supuesto, solo necesita hacerlo una vez (o cuando cambie el conjunto de ubicaciones).

1
Ben Thul 26 oct. 2020 a las 20:57