1. 目前在项目中,遇到一个需求不会做,就是要计算两个城市之间的距离,而这两个城市的输入是可变的,如果要使用数据库来先存储两地之间的距离,调用的时候再来调用,那么存数据的时候,要哭的,因为光是省级区域,目前就是34个省级行政区,两个城市之间的距离,就是取任意两地之间的距离,那么按照排列组合的分析,就要有 34*33 = 1122 种排列组合方式,每个省有若干个城市,那这工作量就大了,所以需要寻找一种更为方便的方法来求两个城市之间的距离
2. 先看下需求:两个城市之间的距离,在数学中,两点之间的距离就是两点之间的直线长度,如果两点之间使用曲线链接,那么两点之间的距离就是曲线的长度;那么怎么样求两点之间的距离呢,首先,需要知道两点分别在哪里,所以,第一步,就是要获取这点之间的定位,准确的说,是先要找出这两个点在当前平面上的坐标,x坐标是多少,y坐标是多少,找出了(x1,y1),(x2,y2)之间的坐标后,就可使用公式:d = sqrt((x1-x2 )2+ (y1-y2)2 );来求直线距离了
3. 对应到两地之间的距离,就是要先确认两地的位置,也是就经纬度,经纬度一旦确定,定位就确定了,地球表面是一个球面,那么两地之间的距离就是一条弧线,根据弧线的计算公式,就可以把两地之间的距离算出来了,当然我们这个是有假设的,假设地球球面是光滑的,这样算下来的距离,会有一定的误差,但是从理论上是可行的

4. 自己按照地球表面的弧度来计算两地之间的距离,理论上是可行的,但是,目前网上有一些做好API,我们可以直接调用,就可以计算出两地之间的距离了,而且很好用。下面,我将使用 高德地图的API 来计算两地之间的距离

4.1 按照上面所说的理论,要计算两地的距离,首先需要确认这两个点在哪里,那怎么确定呢?--------地球上一个点的定位,使用经纬度就可以了,经度和纬度定了,那么这个点也就定了

例如:我们要计算:重庆市到深圳市的距离

现在,我们需要获取  重庆市 和 深圳市 的经纬度

4.1. 1 来看高德地图API:要使用高德的API,首先需要注册一下成为高德用户,直接在百度里输入 ‘高德地图’ ,回车,然后进入 ‘高德开放平台 | 高德地图API’

4.1.2  然后在点击注册页面,注册一个用户

4.1.3 申请秘钥:

为什么要申请秘钥呢?因为你要使用高德地图的服务,而服务会以一个地址的形式发送到高德的服务器,高德的服务器会先确定你的身份,然后再确定是否处理你提交的东西;那高德地图怎么确定是否要受理这份请求呢,毕竟谁也不会吃饱了没事干,然后有求必应,处理完了还不知道是谁在发送请求;这里秘钥就器作用了,秘钥说白了就是一个字符串,是一个身份标识,是高德地图给注册它的用户的一个身份标识。你发送请求了,他先确定,哦,这是我的用户,然后才会进行处理,而且用户的请求是有限制的,每个用户每天最多只能请求多少次,每秒钟请求多少次,这都是有限制的。

秘钥申请 OK 之后,在你发送请求的同时,把秘钥放在请求的参数里,一起发送到高德地图的服务端,服务端返回请求结果,这样就可以使用了

4.1.4.1   获取起始点和结束点的经纬度(重庆和深圳的经纬度)

找到web 服务,如下:

4.1.4.2 我们将会用到以下两个模块:

4.1.4.3 请求地址:

4.1.4.4 请求返回的数据:

4.1.4.5 请求例子:

例如,我申请的秘钥是:key=3eac2241aca3b6f67079173fe3f3b8ec

然后申请的地点是:重庆市

那么我的服务请求就是:  http://restapi.amap.com/v3/geocode/geo?address=重庆市&output=JSON&key=3eac2241aca3b6f67079173fe3f3b8ec

把上面的请求输入浏览器地址栏:http://restapi.amap.com/v3/geocode/geo?address=重庆市&output=JSON&key=3eac2241aca3b6f67079173fe3f3b8ec,得到以下结果:

这里得到重庆市的经纬度为:106.551556,29.563009

通过相同的方式,获取深圳市的经纬度为:114.057868,22.543099

4.1.4.6  计算两地之间的距离:

4.1.4.7 找到距离测量:

4.1.4.8 测距返回数据:

4.1.4.9  服务请求地址:

http://restapi.amap.com/v3/distance?origins=106.551556,29.563009&destination=114.057868,22.543099&output=json&key=3eac2241aca3b6f67079173fe3f3b8ec&type=1

在浏览器中输入:http://restapi.amap.com/v3/distance?origins=106.551556,29.563009&destination=114.057868,22.543099&output=json&key=3eac2241aca3b6f67079173fe3f3b8ec&type=1,请求结果如下:

所以,重庆市和深圳市之间的距离就是:1446881  米 ,合 1446.88 公里

查看下手机高德地图的导航结果:1445 公里,基本一致

5.  把距离测算写成代码:

 <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<script src="http://code.jquery.com/jquery-latest.js">
</script>
<title>Document</title>
<script>
$(function() {
// 获取起始点和结束点的经纬度
$("#btn2").on('click', function() {
var dizhi1 = $("#ostart").val();
var dizhi2 = $("#oend").val();
// var url = "http://restapi.amap.com/v3/geocode/geo?address=" + dizhi1 + "|" + dizhi2 + "&output=JSON&key=3eac2241aca3b6f67079173fe3f3b8ec&batch=true";
var url1 = "http://restapi.amap.com/v3/geocode/geo";
$.post(url1, {
address: dizhi1 + '|' + dizhi2,
output: 'JSON',
key: '3eac2241aca3b6f67079173fe3f3b8ec',
batch: true
}, function(data) {
$("#ospan").html(data.geocodes[0].location);
$("#osend").html(data.geocodes[1].location);
});
});
// 根据经纬度计算起始点和结束点的距离
$("#btn").on('click', function() {
var st = $("#ospan").html();
var ed = $("#osend").html();
var url2 = "http://restapi.amap.com/v3/distance?origins=" + st + "&destination=" + ed + "&output=json&key=3eac2241aca3b6f67079173fe3f3b8ec&type=1"
$.get(url2, {}, function(data) {
$("#distance").html(data.results[0].distance);
});
});
$("#btn1").on('click', function() {
$("#ostart").val('');
$("#oend").val('');
$("#ospan").html('');
$("#osend").html('');
$("#distance").html('');
});
});
</script>
</head>
<body>
<input type="button" id="btn2" value="获取经纬度">
<input type="button" id="btn" value="显示距离">
<input type="button" id="btn1" value="清空">
<p>起始地:<input type="text" value="" id="ostart"><span id="ospan"></span></p>
<p>结束地:<input type="text" value="" id="oend"><span id="osend"></span></p>
<p>两地距离:<span class="distance" id="distance"></span>米</p>
</body>
</html>

运行结果:

后记:

隔几个月后(2018/7/5日),我想,有没有可能不用先点击获取经纬度按钮,直接获取距离呢,这样想后,就需要把获取经纬度加载到第二个按钮中来了,我试了一下,不能写在回调函数外面,只能写在回调函数里面,想了一下,因为回调函数是ajax 请求,是异步处理机制,而写在回调函数外面的话,是同步处理机制,同步执行的时间比异步要早,所以不行,写在回调函数中就可以了,如下:

 <!DOCTYPE html>
<html lang="en"> <head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
<script src=""></script>
</script>
<title>Document</title>
<script>
$(function () { // 根据经纬度计算起始点和结束点的距离
$("#btn").on('click', function () { // 选择框将触发事件改为change 即可 var dizhi1 = $("#ostart").val(); // 起始地点城市
var dizhi2 = $("#oend").val(); // 结束地点城市
var Odistance = 0; //定义两地距离变量
var url1 = "http://restapi.amap.com/v3/geocode/geo";
$.post(url1, {
address: dizhi1 + '|' + dizhi2,
output: 'JSON',
key: '3eac2241aca3b6f67079173fe3f3b8ec',
batch: true
}, function (data) {
var st = data.geocodes[0].location,
ed = data.geocodes[1].location;
var url2 = "http://restapi.amap.com/v3/distance?origins=" + st +
"&destination=" + ed +
"&output=json&key=3eac2241aca3b6f67079173fe3f3b8ec&type=1"
$.get(url2, {}, function (data) {
$("#distance").html(data.results[0].distance);
Odistance = data.results[0].distance; });
}); }); $("#btn1").on('click', function () {
$("#ostart").val('');
$("#oend").val('');
$("#distance").html('');
});
});
</script>
</head> <body>
<input type="button" id="btn" value="显示距离">
<input type="button" id="btn1" value="清空">
<p>起始地:
<input type="text" value="" id="ostart"> </p>
<p>结束地:
<input type="text" value="" id="oend">
</p>
<p>两地距离:
<span class="distance" id="distance"></span>米</p>
</body> </html>

运行结果:结果OK

高德地图 API 计算两个城市之间的距离的更多相关文章

  1. IOS 计算两个经纬度之间的距离

    IOS 计算两个经纬度之间的距离 一 丶 -(double)distanceBetweenOrderBy:(double) lat1 :(double) lat2 :(double) lng1 :(d ...

  2. AJPFX:求两个城市之间的距离

    键盘录入多个城市: 城市1,城市2,城市3  以 ### 结束输出然后再键盘录入各个城市之间的距离:  格式如下:0,12,4512,0,2245,22,0### 然后按照输入的两个城市,求得两个城市 ...

  3. PHP MYSQL 搜索周边坐标,并计算两个点之间的距离

    搜索附近地点,例如,坐标(39.91, 116.37)附近500米内的人,首先算出“给定坐标附近500米”这个范围的坐标范围. 虽然它是个圆,但我们可以先求出该圆的外接正方形,然后拿正方形的经纬度范围 ...

  4. reactjs中使用高德地图计算两个经纬度之间的距离

    第一步下载依赖 npm install --save react-amap 第二步,在组件中使用 import React, { Component } from 'react' import { L ...

  5. 计算两个经纬度之间的距离(python算法)

    EARTH_REDIUS = 6378.137 def rad(d): return d * pi / 180.0 def getDistance(lat1, lng1, lat2, lng2): r ...

  6. PHP计算两个坐标之间的距离

    <?php /** * 计算两点之间的距离 * @param $lng1 经度1 * @param $lat1 纬度1 * @param $lng2 经度2 * @param $lat2 纬度2 ...

  7. [转] PHP计算两个坐标之间的距离, Calculate the Distance Between Two Points in PHP

    Calculate the Distance Between Two Points in PHP There are a lot of applications where it is useful ...

  8. iOS 计算两个坐标之间的距离

    //第一个坐标 CLLocation *before=[[CLLocation alloc] initWithLatitude:29.553968 longitude:106.538872]; //第 ...

  9. mysql实现经纬度计算两个坐标之间的距离sql语句

    select *,(2 * 6378.137* ASIN(SQRT(POW(SIN(PI()*(111.86141967773438-latitude)/360),2)+COS(PI()*33.070 ...

随机推荐

  1. 【转载】这样去写你的HTML

    昨天在 twitter 上说,怎么忍心把页面写得这么难用?是的,这个世界还有一群人等着我们创建出来的东西,可以让他们的生活能过得更容易呢.比如那些需要读屏软件的用户.作为一个前端,我们又怎么会忍心呢. ...

  2. CentOS 7安装Oracle 11gR2以及设置自启动(1)

    一.环境准备 1.正确无误的CentOS 7系统环境 虚拟机要求: 内存至少2G 处理器至少2个 根分区要大于20G(安装oracle很占空间,空闲空间要足够) 2.正确的JDK环境 CentOS 7 ...

  3. win7颜色反转

    win7屏幕太亮,整天看电脑看的头疼 利用放大镜实现颜色反转 打开控制面板 //也可'开始'处直接输入输入放大镜进入 选择轻松访问 启用放大镜 选择设置 启用颜色反转 win+'+'增加放大镜的放大倍 ...

  4. 为帮助保护你的安全,您的Web浏览器已经限制此文件显示可能访问您的计算机的活动内容

    在开发时,会遇到是要HTML来做UI,是要js与C++进行交互. 在加载完页面后,一些电脑中会出现“为帮助保护你的安全,您的Web浏览器已经限制此文件显示可能访问您的计算机的活动内容”(用IE打开,自 ...

  5. [UE4]Cast to OverlaySlot、Set Vertical Alignment、Get Slot,解决Child Widget垂直居中对齐问题

  6. Oracle 在SQL语句中如何获取系统当前时间并进行操作

    select sysdate from dual;select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual; select to_char(s ...

  7. GAC 注册查看与删除

    1.复制以下命令粘贴到以管理员权限运行的命令行程序里,回车运行(前提条件得有gacutil.exe注册工具): cd "C:\NETFX 4.0 Tools" 以windows7 ...

  8. Submline Text 3插件sublimeTmpl添加新模板

    1.安装 一般安装Package Control 2.插件 添加模板 1).进入Preferences->Browse Packages->SublimeTmpl->template ...

  9. CS229 6.18 CNN 的反向传导算法

    本文主要内容是 CNN 的 BP 算法,看此文章前请保证对CNN有初步认识. 网络表示 CNN相对于传统的全连接DNN来说增加了卷积层与池化层,典型的卷积神经网络中(比如LeNet-5 ),开始几层都 ...

  10. Solr查询参数sort(排序)

    摘要: Solr查询每一次返回的数据都有一定的顺序,特定顺序的结果对于业务来说可能非常重要. 不指定排序 一般我们不指定排序规则,这样的结果能满足大部分需求,默认是用文档的得分作为排序标准.相当于加上 ...