区域地址搜索 - 地理信息系统(5)
区域地址搜索是指某一地址或某些地址是否在指定的区域范围内。区域范围一般有圆形、矩形和多边形,利用百度地图API提供的数据接口,可以提取中国,各省、市、区,甚至是小区或商圈的边界经纬度坐标(多边形)。这样,就可以根据判断任意经纬度所在区域,在地址分类以及和地址相关指标的分类和插值算法中有广泛用途。
本文判别计算需要引入百度地图API类库:
<script type="text/javascript" src="http://api.map.baidu.com/library/GeoUtils/1.2/src/GeoUtils_min.js"></script>
类BMapLib.GeoUtils提供的都是静态方法,勿需实例化即可使用。方法列表如下:
方法 | 返回值 | 描述 |
---|---|---|
BMapLib.GeoUtils.degreeToRad(Number) | Number | 将度转化为弧度 |
BMapLib.GeoUtils.radToDegree(Number) | Number | 将弧度转化为度 |
BMapLib.GeoUtils.getDistance(Point, Point) | Number | 计算经纬度之间的距离 |
BMapLib.GeoUtils.getPolygonArea(polygon) | Number | 计算多边形面或点数组构建图形的面积 |
BMapLib.GeoUtils.getPolylineDistance(polyline) | Number | 计算折线或者点数组的长度 |
BMapLib.GeoUtils.isPointInCircle(point, circle) | Boolean | 判断点是否在圆形内 |
BMapLib.GeoUtils.isPointInPolygon(point, polygon) | Boolean | 判断点是否多边形内 |
BMapLib.GeoUtils.isPointInRect(point, bounds) | Boolean | 判断点是否在矩形内 |
BMapLib.GeoUtils.isPointOnPolyline(point, polyline) | Boolean | 判断点是否在折线上 |
一、点与区域之间的关系
这里,“点”指某一地址或经纬度坐标,区域指园形、矩形、多边形或当前地图可视区域。点与区域之间的关系是指点在区域内或区域外。
1、判断一些点是否在给定圆形区域内
圆心经度 圆心纬度 圆半径 (米)
2、判断一些点是否在给定矩形区域内
矩形左下角经度 矩形左下角纬度
矩形右上角经度 矩形右上角纬度
3、判断一些点是否在给定多边形区域内
二、区域边界经纬度坐标提取
一般情况下行政区域边界为多边形,判断一些点是否在给定多边形区域内这种技巧应用比较广泛。
1、按省(或直辖市)、市、区(或县)和商圈名称提取边界经纬度
商圈是指以店铺座落点为核心向外延伸一定距离而形成的一个方圆范围,是店铺吸引顾客的地理区域。百度地图只提供了部分发达城市的商圈区域边界经纬度。
经纬度坐标列表
经纬度坐标数组
注:可在省(直辖市)、市、区(县)和商圈名称列表中选择区域(可以只选省份名称或城市名称),点击“获取轮廓线”按钮获得区域边界经纬度
代码样例
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>获取地区轮廓线</title>
<script type="text/javascript" src="http://api.map.baidu.com/api?v=1.3"></script>
<style type="text/css">
body{font-size:13px;margin:10px}
#container{width:800px;height:500px;border:1px solid gray}
</style>
</head>
<body>
<div id="container"></div>
<br />
输入省、直辖市或县名称:<input type="text" id="districtName" style="width:80px" value="重庆市">
<input type="button" onclick="getBoundary()" value="获取轮廓线">
<script type="text/javascript">
var map = new BMap.Map("container");
map.centerAndZoom(new BMap.Point(116.403765, 39.914850), 5);
map.addControl(new BMap.NavigationControl({type: BMAP_NAVIGATION_CONTROL_SMALL}));
map.enableScrollWheelZoom();
function getBoundary(){
var bdary = new BMap.Boundary();
var name = document.getElementById("districtName").value;
bdary.get(name, function(rs){ //获取行政区域
map.clearOverlays(); //清除地图覆盖物
var count = rs.boundaries.length; //行政区域的点有多少个
for(var i = 0; i < count; i++){
var ply = new BMap.Polygon(rs.boundaries[i], {strokeWeight: 2, strokeColor: "#ff0000"}); //建立多边形覆盖物
map.addOverlay(ply); //添加覆盖物
map.setViewport(ply.getPath()); //调整视野
}
});
}
</script>
</body>
</html>
2、提取小区边界经纬度
百度和高德等地图API提供的区域边界经纬度坐标一般只到区(县)一级,农村的乡、村和城市的小区区域边界经纬度坐标则需要项目开发者自己根据项目需求自己标注。另外还有城市绿地、农村耕地、自然湖泊等区域边界经纬度坐标等也需要自行标注。标注方法及工具参见后续文章。
在住宅房地产价格批量评估技术中,由于同一小区同类房地产价格相近,通常需要根据小区内出售的房地产平均价格做为小区的基准价格。因此,首先根据自然小区或价格类似的区域把一座城市划分为几百或几千个基准价格分区(大部分是自然小区、小部分为人工合并的小区),然后以小区房地产平均价格小区基准价格(没有销售数据或销售量很少的小区需要评估师估价或用近邻小区自动估价)。这样,
以哈尔滨市为例,为了进行住宅房地产价格批量评估,首先划分出2000多个基准价格分区(标注出小区边界经纬度坐标,本文只列出约100个小区),这样对任一地址(哈尔滨市道里区通达街号栋单元室)的房地产,估价步骤如下:
I、将地址转换为经纬度;
II、运用点与区域之间的关系判断改地址所属基准价格分区,从而得到基准价;
III、根据楼层、朝向和面积等个别特性调整基准价,最后得到估价。
在批量估价过程中,地址批量解析、小区边界经纬度坐标标注、小区销售价格采集等工作在规模较大城市将耗费大量人力、物力和财力。
经纬度坐标列表
经纬度坐标数组
本文提供的各种区域经纬度边界工具仅用于个人学习或教学研究用途,不支持大批量商业用途的区域边界经纬度坐标提取(由于百度地图key的限制)。
©哈尔滨商业大学 银河统计工作室
银河统计工作室成员由在校统计、计算机部分师生和企业数据数据分析师组成,维护和开发银河统计网和银河统计博客(技术文档)。专注于数据挖掘技术研究和运用,探索统计学、应用数学和IT技术有机结合,尝试大数据条件下新型统计学教学模式。