手机版

利用java、js或关系型数据库计算高德地图中两坐标之间的距离

时间:2021-09-03 来源:互联网 编辑:宝哥软件园 浏览:

前言

因为工作的原因,最近在做与地图相关的应用,使用了高德地图,研究了下高德地图计算两坐标距离的方法,官网上提供的开发包中有相关的方法,但是我的产品中比较特殊,无法直接使用提供的方法,所以就自己封装了相关计算方法,供大家参考,下面话不多说了,来一起看看详细的介绍吧。

爪哇实现

首先定义一个用于存储经纬度的类,这里起个名字叫:LngLat

包装advanced multiprogramming-analysis 高级多种编程分析导入Java。文字。十进制格式;导入java.text。抽取格式符号;导入Java。乌提尔。区域设置;/** * 存储经纬度坐标值的类,单位角度* * @作者jianggujin * */公共期末班LngLat实现了可克隆{ /** *纬度(垂直方向)*/公共最终双纬度;/** * 经度(水平方向)*/公共最终双经度;/** * 格式化*/私有静态十进制格式=新十进制格式(' 0.000000 ',新十进制格式符号(区域设置。美国);/** * 使用传入的经纬度构造锁定对象,一对经纬度值代表地球上一个地点* * @参数经度*地点的经度,在-180 与180 之间的两倍型数值* @param纬度*地点的纬度,在-90 与90 之间的两倍型数值*/public LngLat(双经度,双纬度){这个(经度,纬度,真);} /** * 使用传入的经纬度构造锁定对象,一对经纬度值代表地球上一个地点* * @param经度*地点的经度,在-180 与180 之间的两倍型数值* * @参数纬度*地点的纬度,在-90 与90 之间的两倍型数值* @param isCheck *是否需要检查经纬度的合理性,建议填写true */public LngLat(双经度、双纬度、布尔isCheck){ if(isCheck){ if((-180.0D=经度)(经度180.0D))这个。经度=解析(经度);else {抛出新的IllegalArgumentException('经度范围[-180,180]));//这个。经度=parse(((经度-180.0D)%} if(纬度-90.0D) ||(纬度90.0D)){ 0抛出新的IllegalArgumentException('纬度范围[-90,90].');} this.latitude=纬度;//这个。latitude=parse(数学。max(-90.0D,Math.min(90.0D,纬度));} else { this . latitude=latitude this。经度=经度;} } /** * 解析* * @ param d * @ return */private static double parse(double d){ return double。解析double(格式。格式(d));}公共LngLat克隆(){ 0返回新的这个纬度,这个。经度);} @ Override public int hashCode(){ final int prime=31;(同Internationalorganizations)国际组织结果=1;长期温度;temp=Double.doubleToLongBits(纬度);结果=质数*结果(整数)(温度(温度32));temp=Double.doubleToLongBits(经度);结果=质数*结果(整数)(温度(温度32));返回结果;} @覆盖公共布尔等于(对象对象){ if(this==obj)返回真实的如果(obj==null)返回falseif (getClass()!=obj.getClass())返回false LngLat other=(LngLat)obj;if (Double.doubleToLongBits(纬度)!=双倍。双tolongbits(其他。纬度))返回假信号(Double.doubleToLongBits(经度)!=Double.doubleToLongBits(其他。经度))返回错误的返回真;}公共字符串ToString(){ return ' lat/LNG :(' this。‘纬度’,这个。经度')';}}计算工具类如下:

包装北极监测评价方案/** *高德地图工具* * @作者姜家金* */公开课AMapUtils{ /** *根据用户的起点和终点经纬度计算两点间距离,此距离为相对较短的距离,单位米* * @参数开始*起点的坐标* @参数结束*终点的坐标* @ return */public static double computing distance(LngLat start,LngLat end){ if((start==null)| |(end==null)){ 0抛出新的IllegalArgumentException('非法坐标值,不能为null’);}双D1=0.01745329251994329d;双d2=开始。经度;双d3=开始。纬度;双d4=结束。经度;double D5=end . latituded 2 *=D1 D3 *=D1 D4 *=D1 D5 *=D1双d6=数学辛(D2);双D7=数学。罪恶(D3);双D8=数学。cos(D2);double d9=数学。cos(D3);双d10=数学辛(D4);double d11=数学。辛(D5);双d12=数学cos(D4);double d13=数学。cos(D5);double[] arrayOfDouble1=新的双[3];double[] arrayOfDouble2=新的双[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=数学。sqrt((arrayOfDouble1[0]-arrayOfDouble2[0])*(arrayOfDouble1[0]-arrayOfDouble2[0])(arrayOfDouble1[1]-arrayOfDouble2[1])*(arrayOfDouble1[1]-arrayOfDouble2[1])(arrayOfDouble1[2]-arrayOfDouble2[2])*(arrayOfDouble1[2]-arrayOfDouble1 return(数学asin(d14/2.0D)* 12742001.579854401D;}}最后边写一段测试代码测试一下:

包装测试;导入组织。JUnit。测试;导入北极监测评价方案.苹果电脑;导入北极监测评价方案.LngLat公共类AMapTest { @ Test public void Test(){ LngLat start=new LngLat(116 . 368904,39 . 923423);LngLat end=new LngLat(116.387271,39 . 922501);系统。呃。println(Amaputils)。计算距离(开始,结束));}}运行结果为:1569.6213922679392,官网的javascript API示例结果如图:

结果虽然有一点误差,但是这你好在可接受范围内的。

爪哇岛描述语言实现

同样的算法,将其转换成射流研究…的写法,完整的代码如下:

!DOCTYPE html html head meta charset=' utf-8 '/title/title script type=' text/JAVAScript ' src=' http : js/Ajax。js '/script script/* * *存储经纬度* @param {Object}经度* @param {Object}纬度*/函数LngLat(经度,纬度){这个。经度=经度;this.latitude=纬度;}函数计算线距离(开始,结束){ var D1=0.01745329251994329;var d2=开始。经度;var d3=起始纬度;var d4=结束。经度;var d5=结束。纬度;d2 *=d1d3 *=d1d4 *=d1d5 *=d1d6=数学辛(D2);var D7=数学。罪恶(D3);var D8=数学。cos(D2);var d9=数学。cos(D3);var D10=数学。辛(D4);var d11=数学。辛(D5);var d12=数学。cos(D4);var d13=数学。cos(D5);var arrayOfDouble1=[];var arrayOfDouble2=[];arrayofdouble1。推送(d9 * D8);arrayofdouble1。push(d9 * D6);arrayofdouble1。推动(D7);arrayofdouble2。push(d13 * d12);arrayofdouble2。push(d13 * D10);arrayofdouble2。push(d11);var d14=数学。sqrt((arrayOfDouble1[0]-arrayOfDouble2[0])*(arrayOfDouble1[0]-arrayOfDouble2[0])(arrayOfDouble1[1]-arrayOfDouble2[1])*(arrayOfDouble1[1]-arrayOfDouble2[1])(arrayOfDouble1[2]-arrayOfDouble2[2])*(arrayOfDouble1[2]-arrayOfDouble1 return(数学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 /body/htmlMySQL实现

分隔符$ $ CREATE FUNCTION ` calculatelinedistance `(start ng DOUBLE,startLat double,endLng double,end lat DOUBLE)返回DOUBLE begin Clare D2 DOUBLE;宣布d3为两倍申报d4 DOUBLE申报d5 DOUBLE宣布d6加倍;申报d7 DOUBLE申报d8 DOUBLE申报d9 DOUBLE宣布d10加倍;申报d11 DOUBLE宣布d12加倍;申报d13 DOUBLE申报d14 DOUBLE声明arrayOfDouble10 DOUBLE声明arrayOfDouble11 DOUBLE声明arrayOfDouble12 DOUBLe声明arrayOfDouble20 DOUBLE声明arrayOfDouble21 DOUBLE声明arrayOfDouble22 DOUBLE设置D2=起点* 0.01745329251994329;设置D3=startLat * 0.01745329251994329;设置d4=endLng * 0.01745329251994329设置d5=endLat * 0.01745329251994329设定d6=辛(D2);设置D7=sin(D3);设置D8=cos(D2);设置d9=cos(D3);设d10=辛(D4);设置d11=罪恶(D5);设置d12=cos(D4);设置d13=cos(D5);设置arrayOfDouble10=(d9 * D8);set arrayOfDouble11=(d9 * D6);设置arrayOfDouble12=D7 set arrayOfDouble20=(d13 * d12);set arrayOfDouble21=(d13 * D10);设置arrayOfDouble22=d11 set d14=sqrt((arrayOfDouble10-arrayOfDouble20)*(arrayOfDouble10-arrayOfDouble20)(arrayOfDouble11-arrayOfDouble21)*(arrayOfDouble11-arrayOfDouble21)(arrayOfDouble12-arrayOfDouble22)*(arrayOfDouble12-arrayOfDouble22));返回(asin(d14/2.0)* 12742001。59999999401美元分隔符;总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

版权声明:利用java、js或关系型数据库计算高德地图中两坐标之间的距离是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。