Vorwort
Mit der weit verbreiteten Entwicklung des mobilen Internets heute ist die App -Entwicklung die erste Wahl für viele Unternehmen, die in das mobile Internet eintreten. Der Autor hat viele Apps entwickelt und festgestellt, dass viele Apps eine solche Funktion haben, dh in der Nähe von Personen zu erhalten. Wie bekomme ich in der Nähe von Menschen? Tatsächlich ist es sehr einfach. Es soll immer die Informationen des Benutzers (Breiten- und Längengrad-) Informationen in der Datenbank aufzeichnen und dann nach allen Benutzern in der Datenbank und der aktuellen Koordinatenposition in einem bestimmten Bereich basierend auf den Koordinaten des aktuellen Benutzers suchen.
In der Tat ist es für den Abstand zwischen zwei Probanden, deren geografische Lage nicht ändert, am besten das Ergebnis direkt statisch. Schreiben Sie es direkt in die Konfiguration.
Finden Sie zum Beispiel eine U -Bahn -Station in der Nähe Ihres Hauses.
In diesem Fall wird das Thema "Zuhause" im Allgemeinen nicht leicht herumlaufen. Es ist nicht sinnvoll, die Entfernung einmal bei jeder Abfrage zu berechnen. Es ist am besten, die Entfernung zu bestehen und sie direkt abzufragen.
Ein weiterer Fall:
Holen Sie sich die U -Bahn -Station in der Nähe des Standorts des App -Benutzers
In diesem Fall ändert sich der geografische Standort des Benutzers. Die tatsächliche Entfernung muss also jedes Mal in Echtzeit berechnet werden.
Implementierungsideen
Behandeln Sie die Erde als Standardkugel und verwenden Sie die kugelförmige Abstandsformel, um die Bogenlänge des großen Kreises zwischen zwei Punkten auf der kugelförmigen Oberfläche zu berechnen.
Kugelförmige Entfernung
public static double getDistance2 (Double Long1, Double Lat1, Double Long2, Double Lat2) {lat1 = rad (lat1); lat2 = rad (lat2); Doppel a = lat1 - lat2; double b = rad (long1 - long2); double sa2 = math.sin (a / 2.0); double 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));}Kennen Sie einfach den Breitengrad und die Länge zwischen zwei Punkten.
Natürlich muss diese Berechnung in die Datenbank platziert und dann nach Entfernung zurückgeführt werden. Bringen Sie einfach die obige Formel in SQL.
Beispiele für nahe gelegene U -Bahn -Stationen
Beispieltisch zum Bau einer U -Bahn -Station
Tabellenstation erstellen (ID int auto_increment Primärschlüssel, Name Varchar (20) NULL -Kommentar 'MRT -Station Name', lng double null Kommentar 'Longitude', lat Double Null -Kommentar 'Dimension');
SQL -Beispiel
SET @targetLat = 31.175702;SET @targetLng = 121.519095;SELECT s.id , s.name , s.lng , s.lat , ROUND( 6378.138 * 2 * ASIN( SQRT( POW( SIN( ( @targetLat * PI() / 180 - s.lat * PI() / 180 ) / 2 ), 2 ) + COS( @targetlat * pi () / 180) * cos (s.lat * pi () / 180) * pow (sin ((@targetLng * pi () / 180 - s.lng * pi () / 180) / 2), 2)) * 1000) als Entfernung von Startbetrag nach Entfernung ASC, S. Idlimit 20;
Unter ihnen sind Targetlat und TargetLng die geografischen Orte der Benutzer.
Dies kann tatsächlich das Ziel erreichen. Dies soll jedoch zuerst den Abstand zwischen allen Daten und dem Benutzer berechnen und dann sortieren.
Wenn die Anzahl der U -Bahn -Stationen zu groß ist, ist dieser Vorgang weniger elegant. Es ist nicht nur nicht elegant genug, sondern es ist auch sehr effizient.
Optimierung
Tatsächlich können viele Daten vor der Berechnung der Entfernung herausgefiltert werden.
Bei der Berechnung des Abstands zwischen Shanghai -U -Bahnstationen besteht keine Notwendigkeit, den Abstand zwischen der US -U -Bahnstation zu berechnen.
Dies kann in den meisten Anwendungen zuerst einige unerwünschte Daten herausgefiltert werden.
Wenn die Daten beispielsweise Städte unterscheiden, können Sie SQL in Folgendes ändern:
Set @targetlat = 31.175702; set @targetlng = 121.519095; set @CityId = 605; Select S.Id, s.Name, s.lng, s.lat, rund (6378.138 * 2 * Asin (sqrt (pow (@targetLat) / 2) / 180 /180 - s. ( @@targetlat *) (@targetlat (@targetlat) (@targetlat * pi () / 180 - s. 2) + cos (@targetlat * pi () / 180) * cos (s.lat * pi () / 180) * pow (Sin ((@targetlng * pi () / 180 - s.lng * pi () / 180) / 2), 2)) * 1000) als Distanz, die Startstation stellt. 20;
Die obige Verbesserung besteht darin, die meisten zu berechnenden Daten vor der Berechnung zu entfernen. Bei der Suche nach einer Changsha -U -Bahnstation müssen zuerst nicht in Shanghai gesucht werden.
Natürlich ist diese Situation etwas Besonderes, da Sie die Stadt kennen, in der sich der Benutzer im Voraus befindet.
Eine weitere Verbesserung ist:
Zeichnen Sie mit der Position des Benutzers als Mitte einen Kreis mit einem Radius R und schließen Sie dann den Breiten- und Längengradbereich des äußeren Vierecks des Kreises um. Filtern Sie vor der Berechnung des Abstands Daten außerhalb der Länge und Länge des äußeren Viereckers heraus.
Geben Sie einen idealen Radius R an und filtern Sie Daten heraus, die zuerst die Kriterien nicht erfüllen können.
Umgekehrter externer Vierecker-Reichweite umgekehrt
/** * Get the latitude and longitude of the four vertices of the point at the specified latitude and longitude{@code radius} KM's external quadrilateral (strictly speaking, it should be an external cube)* * @param lng longitude* @param lat latitude* @param radius, unit: KM * @return <lng1,lng2,lat1,lat2> */public static Tuple4 <Double> CalcBoxByDistFrompt (Double LNG, Double Lat, Double Radius) {SpatialContext context = spatialContext.geo; Rechteck rectangle = context.getDistCalc () // .calcboxByDistfrompt (// context.makePoint (lng, lat), // radius * com.spatial4j.core.distance.distanceutils.km_to_deg, context, null //); RECHTEN SIE NEUE TUPLE4 <> (Rechteck.getminx (), Rechteck.getMaxx (), Rechteck.getMiny (), Rechteck.getMaxy ());};};};};Die hier verwendeten Maven -Koordinaten sind wie folgt:
<Depopenty> <gruppe> com.spatial4j </GroupId> <artifactId> rspatial4j </artifactId> <version> 0.5 </Version> </abhängig>
Zu diesem Zeitpunkt kann SQL darauf geändert werden:
SET @targetLat = 31.175702;SET @targetLng = 121.519095;SELECT s.id , s.name , s.lng , s.lat , ROUND( 6378.138 * 2 * ASIN( SQRT( POW( SIN( ( @targetLat * PI() / 180 - s.lat * PI() / 180 ) / 2 ), 2 ) + COS( @targetLat * PI( ) / 180 ) * COS( s.lat * PI( ) / 180 ) * POW( SIN( ( @targetLng * PI() / 180 - s.lng * PI() / 180 ) / 2 ) , 2 ) ) ) * 1000 ) AS distanceFROM station sWHERE ( s.lng BETWEEN ${lng1} AND ${lng2} ) AND ( s.lat BETWEEN $ {lat1} und $ {lat2}) bestellen nach Distanz ASC, S.Idlimit 20;Das obige LNG1, LNG2, LAT1, LAT2 ist der Bereich des äußeren Viereckers.
Zitierte Informationen: http://blog.csdn.net/a364572/article/details/50483568
Beispielquellcode
Service: https: //github.com/hylexus/bl ...
Daten initialisieren: https: //github.com/hylexus/bl ...
Zusammenfassen
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, dass der Inhalt dieses Artikels einen gewissen Referenzwert für das Studium oder die Arbeit eines jeden hat. Wenn Sie Fragen haben, können Sie eine Nachricht zur Kommunikation überlassen. Vielen Dank für Ihre Unterstützung bei Wulin.com.