最近、仕事の都合上、Amapマップ内の2つの座標間の距離を計算する必要があり、関連情報を検索するとさまざまな実装方法が見つかりました。次の記事では主にJava、js、またはmysqlの使用方法を紹介します。ドイツ地図上の 2 つの座標間の距離に関する関連情報が、サンプル コードを通じて詳細に紹介されています。
はじめに
最近、仕事の都合で、Amapを使って、公式サイトで提供されている2つの座標間の距離を計算する方法を勉強していました。関連するメソッドはありますが、私の製品は非常に特殊で、提供されたメソッドを直接使用することはできません。そのため、参考のために関連する計算メソッドを自分でカプセル化しました。以下では詳細は説明しません。詳細を見てみましょう。導入。
java実装
緯度と経度を保存するためのクラスを定義します。ここでは名前が付けられています:lnglat
rreee計算ツールのクラスは次のとおりです。最後の段落 コードをテストします:
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 + ")"; } }
実行結果は次のとおりです: 1569.6213922679392 公式 Web サイトの JavaScript API の例の結果は次の図に示すとおりです:
結果には若干の誤差がありますが、許容範囲内です。Javascript実装
同じアルゴリズムをJS記述に変換すると、完全なコードは次のとおりです: MySQL実装 rree 概要 以上がJava+js または mysql は、Gaode マップ内の 2 つの座標間の距離を計算しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。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);
}
}