地址之间的距离 - 地理信息系统(4)

(2017-07-17 银河统计)

在哈尔滨市,从道里区通达街138号到道里区井街18号的距离是多少?这个问题可以有多种答案。首先,将两个地址进行地址解析,经纬度为:

点A:哈尔滨市道里区通达街138号(126.616759,45.74989)
点B:哈尔滨市道里区井街18号(126.628442,45.786112)

墨卡托坐标为:

点A:哈尔滨市道里区通达街138号(14095066.5,5709461.47)
点B:哈尔滨市道里区井街18号(14096367.06,5715222.83)

根据地址和经纬度都可以计算出不同位置之间的距离,通常应该先将地址解析为经纬度或墨卡托坐标,然后再计算各种距离。

1、直线距离

已知两点间平面坐标(墨卡托坐标)\(A(X_1, Y_1)\)\(B(X_2, Y_2)\),根据欧氏距离公式,

\[S=\sqrt{(X_1 - X_2)^2+(Y_1 - Y_2)^2}=\sqrt{(14095066.5 - 14096367.06)^2+(5709461.47 - 5715222.83)^2}\approx 5906.33 \]

可以计算出两点间直线距离为5906.33像素。

2、球面距离

已知两点间经纬度坐标\(A(JD_1, WD_1)\)\(B(JD_2, WD_2)\),根据百度地图API提供的算法计算球面距离,

地址A: 经度  纬度 
地址B: 经度  纬度 
球面距离:  (米) 

注:更改地址A和地址B经纬度,点击“计算球面距离”按钮可计算出两点间球面距离

百度地图API代码(Javascript)

var point1 = new BMap.Point(126.616759, 45.74989);  
var point2 = new BMap.Point(126.628442, 45.786112);  
var distance = map.getDistance(point1,point2);

3、驾车距离和时间

直线距离或球面距离属于数学范畴的抽象距离。在城镇中,两个地址间的距离取决于街道距离或街道的连通性。通常分为两个地址间的的驾车距离、步行距离或公交距离及所需时间。

I、两个地址之间的驾车距离和时间

地址A 
地址B 
驾车距离 (米) 驾车时间 (分钟)

II、两个经纬度坐标之间的驾车距离和时间

地址A: 经度  纬度 
地址B: 经度  纬度 
驾车距离 (米) 驾车时间 (分钟)

注:两个地址或两个经纬度坐标之间的驾车时长和时间点有关,只是做完出行参考。驾车距离指标反映街区距离,在数据分析和建模中非常有用。两个地址可以先转换为经纬度再计算驾车距离,所以两个经纬度坐标之间的驾车或步行距离是基本街区距离指标

百度地图API代码(Javascript)

var transit = new BMap.DrivingRoute(map, {renderOptions: {map: map},
onSearchComplete: function (results){
if (transit.getStatus() != BMAP_STATUS_SUCCESS){return;}
       	var plan = results.getPlan(0);
            alert(plan.getDistance(true));  //驾车距离
            alert(plan.getDuration(true));  //驾车时间
       	},
    onPolylinesSet: function(){setTimeout(function(){},"1000");		
}});
transit.search(new BMap.Point(126.616759, 45.74989), new BMap.Point(126.628442, 45.786112));

4、步行距离和时间

地址A: 经度  纬度 
地址B: 经度  纬度 
步行距离 (米) 步行时间 (分钟)

注:两个地址或两个经纬度坐标之间的步行时长和时间点无关

百度地图API代码(Javascript)

var Walking = new BMap.WalkingRoute(map, {renderOptions: {map: map},
onSearchComplete: function (results){
if (Walking.getStatus() != BMAP_STATUS_SUCCESS){return;}
       	var plan = results.getPlan(0);
            alert(plan.getDistance(true));  //步行距离
            alert(plan.getDuration(true));  //步行时间
       	},
    onPolylinesSet: function(){setTimeout(function(){},"1000");		
}});
Walking.search(new BMap.Point(126.616759, 45.74989), new BMap.Point(126.628442, 45.786112));

5、公交距离和时间

地址A: 经度  纬度 
地址B: 经度  纬度 
公交距离 (米) 公交时间 (分钟)

注:两个地址或两个经纬度坐标之间的公交时长和时间点有关

百度地图API代码(Javascript)

var transit = new BMap.TransitRoute(map, {renderOptions: {map: map},
onSearchComplete: function (results){
if (transit.getStatus() != BMAP_STATUS_SUCCESS){return;}
       	var plan = results.getPlan(0);
            alert(plan.getDistance(true));  //公交距离
            alert(plan.getDuration(true));  //公交时间
       	},
    onPolylinesSet: function(){setTimeout(function(){},"1000");		
}});
transit.search(new BMap.Point(126.616759, 45.74989), new BMap.Point(126.628442, 45.786112));

6、一对多点直线和球面距离计算

一对多点距离计算可以按不同距离搜索出离某一特定地址(点)最近的K个地址(点),技术结果在空间插值方法和数据挖掘技术中经常用到。

经度  纬度 

不同距离选项: 

注:在下拉框中选择直线距离或球面距离,可输出距离(由小到大)表

7、一对多点驾车、步行和公交距离计算

经度  纬度 

经纬度数组长度  当前项        

操作步骤:

I、  重复点击“计算距离”(节奏不用太快),直至当前项和经纬度数组长度相等;
II、 点击“距离列表”获得排序后的所有距离表格;
III、点击“数据重置”按钮设置所有缺省参数,以便于重新计算。

注:一对多点驾车、步行和公交距离百度地图API没有批量处理功能,运用Javacript回调函数每次只能调回一对经纬度间的驾车、步行或公交距离。如果要计算1个经纬度点到10个经纬度点之间的距离,需要点击10次“距离计算”按钮

本文提供的各种距离计算工具仅用于个人学习或教学研究用途,不支持大批量商业用途的驾车、步行和公交距离计算(由于百度地图key的限制)。

posted @ 2017-07-17 18:39  银河统计  阅读(1240)  评论(0编辑  收藏  举报