


Java+js oder MySQL berechnet den Abstand zwischen zwei Koordinaten in der Gaode-Karte
Aufgrund von Arbeitsanforderungen muss ich den Abstand zwischen zwei Koordinaten in der Amap-Karte berechnen. Ich habe verschiedene Implementierungsmethoden gefunden, indem ich nach relevanten Informationen gesucht habe. Der folgende Artikel stellt Ihnen hauptsächlich die Verwendung von Java vor. js oder mysql. Die relevanten Informationen zur Berechnung des Abstands zwischen zwei Koordinaten in der Amap-Karte werden im Detail durch Beispielcode vorgestellt.
Vorwort
Aus beruflichen Gründen habe ich in letzter Zeit an kartenbezogenen Anwendungen gearbeitet und Amap studiert Methode zur Berechnung des Abstands zwischen zwei Koordinaten auf einer Karte. Das auf der offiziellen Website bereitgestellte Entwicklungspaket enthält verwandte Methoden. Da mein Produkt jedoch etwas ganz Besonderes ist und ich die bereitgestellte Methode nicht direkt verwenden kann, habe ich die entsprechende Berechnungsmethode selbst gekapselt Als Referenz gibt es im Folgenden nicht viel mehr zu sagen. Werfen wir einen Blick auf die ausführliche Einführung.
Java-Implementierung
Definieren Sie zunächst eine Klasse zum Speichern von Längen- und Breitengraden, hier heißt sie: LngLat
package amap; import java.text.DecimalFormat; import java.text.DecimalFormatSymbols; import java.util.Locale; /** * 存储经纬度坐标值的类,单位角度 * * @author jianggujin * */ public final class LngLat implements Cloneable { /** * 纬度 (垂直方向) */ public final double latitude; /** * 经度 (水平方向) */ public final double longitude; /** * 格式化 */ private static DecimalFormat format = new DecimalFormat("0.000000", new DecimalFormatSymbols(Locale.US)); /** * 使用传入的经纬度构造LatLng 对象,一对经纬度值代表地球上一个地点。 * * @param longitude * 地点的经度,在-180 与180 之间的double 型数值。 * @param latitude * 地点的纬度,在-90 与90 之间的double 型数值。 */ public LngLat(double longitude, double latitude) { this(longitude, latitude, true); } /** * 使用传入的经纬度构造LatLng 对象,一对经纬度值代表地球上一个地点 * * @param longitude * 地点的经度,在-180 与180 之间的double 型数值。 * * @param latitude * 地点的纬度,在-90 与90 之间的double 型数值。 * @param isCheck * 是否需要检查经纬度的合理性,建议填写true */ public LngLat(double longitude, double latitude, boolean isCheck) { if (isCheck) { if ((-180.0D <= longitude) && (longitude < 180.0D)) this.longitude = parse(longitude); else { throw new IllegalArgumentException("the longitude range [-180, 180]."); // this.longitude = parse(((longitude - 180.0D) % 360.0D + 360.0D) % // 360.0D - 180.0D); } if ((latitude < -90.0D) || (latitude > 90.0D)) { throw new IllegalArgumentException("the latitude range [-90, 90]."); } this.latitude = latitude; // this.latitude = parse(Math.max(-90.0D, Math.min(90.0D, latitude))); } else { this.latitude = latitude; this.longitude = longitude; } } /** * 解析 * * @param d * @return */ private static double parse(double d) { return Double.parseDouble(format.format(d)); } public LngLat clone() { return new LngLat(this.latitude, this.longitude); } @Override public int hashCode() { final int prime = 31; int result = 1; long temp; temp = Double.doubleToLongBits(latitude); result = prime * result + (int) (temp ^ (temp >>> 32)); temp = Double.doubleToLongBits(longitude); result = prime * result + (int) (temp ^ (temp >>> 32)); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; LngLat other = (LngLat) obj; if (Double.doubleToLongBits(latitude) != Double.doubleToLongBits(other.latitude)) return false; if (Double.doubleToLongBits(longitude) != Double.doubleToLongBits(other.longitude)) return false; return true; } public String toString() { return "lat/lng: (" + this.latitude + "," + this.longitude + ")"; } }
Die Berechnungstoolklasse lautet wie folgt:
package amap; /** * 高德地图工具 * * @author jianggujin * */ public class AMapUtils { /** * 根据用户的起点和终点经纬度计算两点间距离,此距离为相对较短的距离,单位米。 * * @param start * 起点的坐标 * @param end * 终点的坐标 * @return */ public static double calculateLineDistance(LngLat start, LngLat end) { if ((start == null) || (end == null)) { throw new IllegalArgumentException("非法坐标值,不能为null"); } double d1 = 0.01745329251994329D; double d2 = start.longitude; double d3 = start.latitude; double d4 = end.longitude; double d5 = end.latitude; d2 *= d1; d3 *= d1; d4 *= d1; d5 *= d1; double d6 = Math.sin(d2); double d7 = Math.sin(d3); double d8 = Math.cos(d2); double d9 = Math.cos(d3); double d10 = Math.sin(d4); double d11 = Math.sin(d5); double d12 = Math.cos(d4); double d13 = Math.cos(d5); double[] arrayOfDouble1 = new double[3]; double[] arrayOfDouble2 = new double[3]; arrayOfDouble1[0] = (d9 * d8); arrayOfDouble1[1] = (d9 * d6); arrayOfDouble1[2] = d7; arrayOfDouble2[0] = (d13 * d12); arrayOfDouble2[1] = (d13 * d10); arrayOfDouble2[2] = d11; double d14 = Math.sqrt((arrayOfDouble1[0] - arrayOfDouble2[0]) * (arrayOfDouble1[0] - arrayOfDouble2[0]) + (arrayOfDouble1[1] - arrayOfDouble2[1]) * (arrayOfDouble1[1] - arrayOfDouble2[1]) + (arrayOfDouble1[2] - arrayOfDouble2[2]) * (arrayOfDouble1[2] - arrayOfDouble2[2])); return (Math.asin(d14 / 2.0D) * 12742001.579854401D); } }
Schreiben Sie abschließend einen Testcode zum Testen it:
package test; import org.junit.Test; import amap.AMapUtils; import amap.LngLat; public class AMapTest { @Test public void Test() { LngLat start = new LngLat(116.368904, 39.923423); LngLat end = new LngLat(116.387271, 39.922501); System.err.println(AMapUtils.calculateLineDistance(start, end)); } }
Das laufende Ergebnis ist: 1569.6213922679392. Das Beispielergebnis der Javascript-API der offiziellen Website ist wie in der Abbildung dargestellt:
Obwohl das Ergebnis einen leichten Fehler aufweist, liegt es im akzeptablen Bereich.
Javascript implementiert den gleichen Algorithmus wie
und konvertiert ihn in JS-Schreibweise. Der vollständige Code lautet wie folgt:
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title></title> <script type="text/javascript" src="js/ajax.js"></script> <script> /** * 存储经纬度 * @param {Object} longitude * @param {Object} latitude */ function LngLat(longitude, latitude) { this.longitude = longitude; this.latitude = latitude; } function calculateLineDistance(start, end) { var d1 = 0.01745329251994329; var d2 = start.longitude; var d3 = start.latitude; var d4 = end.longitude; var d5 = end.latitude; d2 *= d1; d3 *= d1; d4 *= d1; d5 *= d1; var d6 = Math.sin(d2); var d7 = Math.sin(d3); var d8 = Math.cos(d2); var d9 = Math.cos(d3); var d10 = Math.sin(d4); var d11 = Math.sin(d5); var d12 = Math.cos(d4); var d13 = Math.cos(d5); var arrayOfDouble1 = []; var arrayOfDouble2 = []; arrayOfDouble1.push(d9 * d8); arrayOfDouble1.push(d9 * d6); arrayOfDouble1.push(d7); arrayOfDouble2.push(d13 * d12); arrayOfDouble2.push(d13 * d10); arrayOfDouble2.push(d11); var d14 = Math.sqrt((arrayOfDouble1[0] - arrayOfDouble2[0]) * (arrayOfDouble1[0] - arrayOfDouble2[0]) + (arrayOfDouble1[1] - arrayOfDouble2[1]) * (arrayOfDouble1[1] - arrayOfDouble2[1]) + (arrayOfDouble1[2] - arrayOfDouble2[2]) * (arrayOfDouble1[2] - arrayOfDouble2[2])); return(Math.asin(d14 / 2.0) * 12742001.579854401); } var start = new LngLat(116.368904, 39.923423); var end = new LngLat(116.387271, 39.922501); </script> </head> <body> <script> document.write(calculateLineDistance(start, end)); </script> </body> </html>
MySQL-Implementierung
DELIMITER $$ CREATE FUNCTION `calculateLineDistance`(startLng double, startLat double, endLng double, endLat double) RETURNS double BEGIN declare d2 DOUBLE; declare d3 DOUBLE; declare d4 DOUBLE; declare d5 DOUBLE; declare d6 DOUBLE; declare d7 DOUBLE; declare d8 DOUBLE; declare d9 DOUBLE; declare d10 DOUBLE; declare d11 DOUBLE; declare d12 DOUBLE; declare d13 DOUBLE; declare d14 DOUBLE; declare arrayOfDouble10 DOUBLE; declare arrayOfDouble11 DOUBLE; declare arrayOfDouble12 DOUBLe; declare arrayOfDouble20 DOUBLE; declare arrayOfDouble21 DOUBLE; declare arrayOfDouble22 DOUBLE; set d2 = startLng * 0.01745329251994329; set d3 = startLat * 0.01745329251994329; set d4 = endLng * 0.01745329251994329; set d5 = endLat * 0.01745329251994329; set d6 = sin(d2); set d7 = sin(d3); set d8 = cos(d2); set d9 = cos(d3); set d10 = sin(d4); set d11 = sin(d5); set d12 = cos(d4); set d13 = cos(d5); set arrayOfDouble10 = (d9 * d8); set arrayOfDouble11 = (d9 * d6); set arrayOfDouble12 = d7; set arrayOfDouble20 = (d13 * d12); set arrayOfDouble21 = (d13 * d10); set arrayOfDouble22 = d11; set d14 = sqrt((arrayOfDouble10 - arrayOfDouble20) * (arrayOfDouble10 - arrayOfDouble20) + (arrayOfDouble11 - arrayOfDouble21) * (arrayOfDouble11 - arrayOfDouble21) + (arrayOfDouble12 - arrayOfDouble22) * (arrayOfDouble12 - arrayOfDouble22)); return (asin(d14 / 2.0) * 12742001.579854401); END $$ DELIMITER ;
Zusammenfassung
Das obige ist der detaillierte Inhalt vonJava+js oder MySQL berechnet den Abstand zwischen zwei Koordinaten in der Gaode-Karte. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen











Laravel ist ein PHP -Framework zum einfachen Aufbau von Webanwendungen. Es bietet eine Reihe leistungsstarker Funktionen, darunter: Installation: Installieren Sie die Laravel CLI weltweit mit Komponisten und erstellen Sie Anwendungen im Projektverzeichnis. Routing: Definieren Sie die Beziehung zwischen der URL und dem Handler in Routen/Web.php. Ansicht: Erstellen Sie eine Ansicht in Ressourcen/Ansichten, um die Benutzeroberfläche der Anwendung zu rendern. Datenbankintegration: Bietet eine Out-of-the-Box-Integration in Datenbanken wie MySQL und verwendet Migration, um Tabellen zu erstellen und zu ändern. Modell und Controller: Das Modell repräsentiert die Datenbankentität und die Controller -Prozesse HTTP -Anforderungen.

MySQL und PhpMyAdmin sind leistungsstarke Datenbankverwaltungs -Tools. 1) MySQL wird verwendet, um Datenbanken und Tabellen zu erstellen und DML- und SQL -Abfragen auszuführen. 2) PHPMYADMIN bietet eine intuitive Schnittstelle für Datenbankverwaltung, Tabellenstrukturverwaltung, Datenoperationen und Benutzerberechtigungsverwaltung.

Im Vergleich zu anderen Programmiersprachen wird MySQL hauptsächlich zum Speichern und Verwalten von Daten verwendet, während andere Sprachen wie Python, Java und C für die logische Verarbeitung und Anwendungsentwicklung verwendet werden. MySQL ist bekannt für seine hohe Leistung, Skalierbarkeit und plattformübergreifende Unterstützung, die für Datenverwaltungsanforderungen geeignet sind, während andere Sprachen in ihren jeweiligen Bereichen wie Datenanalysen, Unternehmensanwendungen und Systemprogramme Vorteile haben.

Artikelzusammenfassung: Dieser Artikel enthält detaillierte Schritt-für-Schritt-Anweisungen, um die Leser zu leiten, wie das Laravel-Framework einfach installiert werden kann. Laravel ist ein leistungsstarkes PHP -Framework, das den Entwicklungsprozess von Webanwendungen beschleunigt. Dieses Tutorial deckt den Installationsprozess von den Systemanforderungen bis zur Konfiguration von Datenbanken und das Einrichten von Routing ab. Durch die Ausführung dieser Schritte können die Leser schnell und effizient eine solide Grundlage für ihr Laravel -Projekt legen.

In MySQL besteht die Funktion von Fremdschlüssel darin, die Beziehung zwischen Tabellen herzustellen und die Konsistenz und Integrität der Daten zu gewährleisten. Fremdeschlüssel behalten die Wirksamkeit von Daten durch Referenzintegritätsprüfungen und Kaskadierungsvorgänge bei. Achten Sie auf die Leistungsoptimierung und vermeiden Sie bei der Verwendung häufige Fehler.

Der Hauptunterschied zwischen MySQL und Mariadb ist Leistung, Funktionalität und Lizenz: 1. MySQL wird von Oracle entwickelt und Mariadb ist seine Gabel. 2. Mariadb kann in Umgebungen mit hoher Last besser abschneiden. 3.MariADB bietet mehr Speichermotoren und Funktionen. 4.Mysql nimmt eine doppelte Lizenz an, und Mariadb ist vollständig Open Source. Die vorhandene Infrastruktur, Leistungsanforderungen, funktionale Anforderungen und Lizenzkosten sollten bei der Auswahl berücksichtigt werden.

Zusammenfassung des ersten Absatzes des Artikels: Bei der Auswahl von Software zur Entwicklung von YI -Framework -Anwendungen müssen mehrere Faktoren berücksichtigt werden. Während native Tools für mobile Anwendungsentwicklung wie Xcode und Android Studio eine starke Kontrolle und Flexibilität bieten können, werden plattformübergreifende Frameworks wie React Native und Flutter immer beliebter, da die Vorteile der Bereitstellung gleichzeitig auf mehreren Plattformen gleichzeitig eingesetzt werden können. Für Entwickler, die in der mobilen Entwicklung neu sind, können Niedrigcode- oder No-Code-Plattformen wie Appsheet und Glide schnell und einfach Anwendungen erstellen. Darüber hinaus vergrößern Cloud -Dienstanbieter wie AWS und Firebase umfassende Tools

SQL ist eine Standardsprache für die Verwaltung von relationalen Datenbanken, während MySQL ein Datenbankverwaltungssystem ist, das SQL verwendet. SQL definiert Möglichkeiten, mit einer Datenbank zu interagieren, einschließlich CRUD -Operationen, während MySQL den SQL -Standard implementiert und zusätzliche Funktionen wie gespeicherte Prozeduren und Auslöser bereitstellt.
