Prefacio
Con el desarrollo generalizado de Internet móvil hoy, el desarrollo de aplicaciones se ha convertido en la primera opción para que muchas compañías ingresen a Internet móvil. El autor ha desarrollado muchas aplicaciones y descubrió que muchas aplicaciones tienen tal función, es decir, para obtener personas cercanas. ¿Cómo obtener personas cercanas? De hecho, es muy simple. Siempre debe registrar la información de coordenadas del usuario (latitud y longitud) en la base de datos, y luego buscar a todos los usuarios en la base de datos y la posición de coordenadas actual dentro de un cierto rango basado en las coordenadas del usuario actual.
De hecho, para la distancia entre dos sujetos cuya ubicación geográfica no cambia, es mejor estaticar directamente el resultado. Es decir, escríbalo directamente en la configuración.
Por ejemplo, encuentre una estación de metro cerca de su hogar.
En este caso, en términos generales, el tema del "hogar" no "correrá" fácilmente. No tiene sentido calcular la distancia una vez cada consulta. Es mejor persistir la distancia y consultarla directamente.
Otro caso:
Obtenga la estación de metro cerca de la ubicación del usuario de la aplicación
En este caso, cambia la ubicación geográfica del usuario. Entonces la distancia real debe calcularse en tiempo real cada vez.
Ideas de implementación
Trate la tierra como una esfera estándar y use la fórmula de distancia esférica para calcular la longitud del arco del círculo grande entre dos puntos en la superficie esférica.
Distancia esférica
Public static double getDistance2 (doble long1, doble LAT1, doble long2, doble LAT2) {LAT1 = rad (LAT1); lat2 = rad (lat2); doble a = lat1 - lat2; doble b = rad (long1 - long2); doble sa2 = math.sin (a / 2.0); doble sb2 = math.sin (b / 2.0); return 2 * Earth_mean_radius_km * Math.asin (Math.Sqrt (SA2 * SA2 + Math.Cos (Lat1) * Math.Cos (Lat2) * SB2 * SB2));}Solo conozca la latitud y la longitud entre dos puntos.
Por supuesto, este cálculo debe colocarse en la base de datos y luego ordenarse de acuerdo con la distancia. Simplemente traiga la fórmula anterior a SQL.
Ejemplos de estaciones de metro cercanas
Tabla de ejemplo para construir una estación de metro
Crear estación de tabla (ID int Auto_incement Key primario, nombre Varchar (20) Comentario nulo 'Nombre de la estación MRT', Lng Double Null Comment 'Longitud', Lat Double Null Comment 'Dimension');
Ejemplo de SQL
Set @targetlat = 31.175702; set @targetlng = 121.519095; select s.id, s.name, s.lng, s.lat, ronda (6378.138 * 2 * asin (sqrt (pow (sen (@TargetLat * pi () / 180 - s.lat * pi () / 180) @TargetLat * Pi () / 180) * cos (s.lat * pi () / 180) * pow (sen ((@Targetlng * pi () / 180 - s.lng * pi () / 180) / 2), 2)) * 1000) como un sorder de la estación de distancia por distancia asc, s.idlimit 20;
Entre ellos, Targetlat y Targetlng son las ubicaciones geográficas de los usuarios.
Esto puede lograr el objetivo. Sin embargo, esto es para calcular la distancia entre todos los datos y el usuario primero y luego ordenarlo.
Cuando el número de estaciones de metro es demasiado grande, esta operación será menos elegante. No solo no es lo suficientemente elegante, sino que también es muy eficiente.
mejoramiento
De hecho, se pueden filtrar muchos datos antes de calcular la distancia.
No es necesario calcular la distancia entre la estación de metro de los EE. UU. Al calcular la distancia entre las estaciones de metro de Shanghai.
Esto se puede filtrar primero algunos datos no deseados en la mayoría de las aplicaciones.
Por ejemplo, cuando los datos distinguen las ciudades, puede cambiar SQL a lo siguiente:
Set @targetlat = 31.175702; set @targetlng = 121.519095; set @cityid = 605; select s.id, s.name, s.lng, s.lat, ronda (6378.138 * 2 * asin (sqrt (pow (sin ((@TargetLat * Pi () / 180 - s.lat * Pi () / 180 2) + cos (@targetlat * pi () / 180) * cos (s.lat * pi () / 180) * pow (sen ((@Targetlng * pi () / 180 - s.lng * pi () / 180) / 2), 2)) * 1000) a medida que la estación de distancia de la distancia de distancia de la distancia de la distancia de la distancia de la distancia. 20;
La mejora anterior es eliminar la mayoría de los datos que se calcularán antes de calcular. Al buscar una estación de metro Changsha, no hay necesidad de buscar primero en Shanghai.
Por supuesto, esta situación es un poco especial porque puede conocer la ciudad donde el usuario se encuentra con anticipación.
Otra mejora es:
Con la ubicación del usuario como centro, dibuje un círculo con un radio R y luego expulse inversamente el rango de latitud y longitud del cuadrilátero externo del círculo. Antes de calcular la distancia, filtre los datos fuera de la longitud y longitud del cuadrilátero externo.
Especifique un radio ideal R y filtre datos que no puedan cumplir primero los criterios.
Rango cuadrilátero externo reverso de empuje
/*** Obtenga la latitud y longitud de los cuatro vértices del punto en la latitud y longitud especificadas {@code radio} de Km's cuadrilátero externo (estrictamente hablando, debe ser un cubo externo)** @param lng longitude* @param lat latitud* @param radius, unit: km* @return <lng1, lng2, lat1, lat2 lat* @param radius, unit: km* @return <lng1, lng2, lat1, lat2 latitud TUPLE4 <Oble> CalcboxByDistFromPT (doble lng, doble lat, doble radio) {SpatialContext context = SpatialContext.geo; Rectangle rectangle = context.getDistCalc () // .calcboxbydistFrompt (// context.makePoint (lng, lat), // radio * com.spatial4j.core.distance.distanceutils.km_to_deg, context, null //); return new tuple4 <> (rectangle.getminx (), rectangle.getmaxx (), rectangle.getMiny (), rectangle.getmaxy ());}Las coordenadas Maven utilizadas aquí son las siguientes:
<Spendency> <MoupRoD> com.spatial4j </groupid> <artifactid> spatial4j </artifactid> <versión> 0.5 </versión> </pendency>
En este momento, SQL se puede cambiar a esto:
Set @targetlat = 31.175702; set @targetlng = 121.519095; select s.id, s.name, s.lng, s.lat, ronda (6378.138 * 2 * asin (sqrt (pow (sen (@TargetLat * pi () / 180 - s.lat * pi () / 180) @TargetLat * Pi () / 180) * cos (s.lat * pi () / 180) * pow (sen ((@TargetLng * pi () / 180 - s.lng * pi () / 180) / 2), 2)) * 1000) como Distancia de la estación Swhere (S.lng entre $ {lng1} y $ {lng2} $ {lat1} y $ {lat2}) orden por distancia asc, s.idlimit 20;El anterior LNG1, LNG2, LAT1, LAT2 es el rango del cuadrilátero externo.
Información citada: http://blog.csdn.net/a364572/article/details/50483568
Muestra de código fuente
Servicio: https: //github.com/hylexus/bl ...
Inicializar datos: https: //github.com/hylexus/bl ...
Resumir
Lo anterior es todo el contenido de este artículo. Espero que el contenido de este artículo tenga cierto valor de referencia para el estudio o el trabajo de todos. Si tiene alguna pregunta, puede dejar un mensaje para comunicarse. Gracias por su apoyo a Wulin.com.