区域地址搜索 - 地理信息系统(5)

(2017-07-23 银河统计)

区域地址搜索是指某一地址或某些地址是否在指定的区域范围内。区域范围通常有圆形、矩形和多边形,利用百度地图API提供的数据接口,能够提取中国,各省、市、区,甚至是小区或商圈的边界经纬度坐标(多边形)。这样,就能够根据判断任意经纬度所在区域,在地址分类以及和地址相关指标的分类和插值算法中有普遍用途。javascript

本文判别计算须要引入百度地图API类库:css

<script type="text/javascript" src="http://api.map.baidu.com/library/GeoUtils/1.2/src/GeoUtils_min.js"></script>

类BMapLib.GeoUtils提供的都是静态方法,勿需实例化便可使用。方法列表以下:html

方法 返回值 描述
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、点与区域之间的关系

这里,“点”指某一地址或经纬度坐标,区域指园形、矩形、多边形或当前地图可视区域。点与区域之间的关系是指点在区域内或区域外。java

一、判断一些点是否在给定圆形区域内

待判别经纬度坐标

圆心经度  圆心纬度  圆半径 (米) 算法

二、判断一些点是否在给定矩形区域内

待判别经纬度坐标

矩形左下角经度  矩形左下角纬度 
矩形右上角经度  矩形右上角纬度 api

数组

三、判断一些点是否在给定多边形区域内

待判别经纬度坐标

多边形边界坐标

工具

2、区域边界经纬度坐标提取

通常状况下行政区域边界为多边形,判断一些点是否在给定多边形区域内这种技巧应用比较普遍。学习

一、按省(或直辖市)、市、区(或县)和商圈名称提取边界经纬度

商圈是指以店铺座落点为核心向外延伸必定距离而造成的一个方圆范围,是店铺吸引顾客的地理区域。百度地图只提供了部分发达城市的商圈区域边界经纬度。ui

输入省(直辖市)、市、区(县)和商圈名称

经纬度坐标列表

经纬度坐标数组

注:可在省(直辖市)、市、区(县)和商圈名称列表中选择区域(能够只选省份名称或城市名称),点击“获取轮廓线”按钮得到区域边界经纬度

代码样例

<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>

二、提取小区边界经纬度

百度和高德等地图API提供的区域边界经纬度坐标通常只到区(县)一级,农村的乡、村和城市的小区区域边界经纬度坐标则须要项目开发者本身根据项目需求本身标注。另外还有城市绿地、农村耕地、天然湖泊等区域边界经纬度坐标等也须要自行标注。标注方法及工具参见后续文章。

在住宅房地产价格批量评估技术中,因为同一小区同类房地产价格相近,一般须要根据小区内出售的房地产平均价格作为小区的基准价格。所以,首先根据天然小区或价格相似的区域把一座城市划分为几百或几千个基准价格分区(大部分是天然小区、小部分为人工合并的小区),而后以小区房地产平均价格小区基准价格(没有销售数据或销售量不多的小区须要评估师估价或用近邻小区自动估价)。这样,

以哈尔滨市为例,为了进行住宅房地产价格批量评估,首先划分出2000多个基准价格分区(标注出小区边界经纬度坐标,本文只列出约100个小区),这样对任一地址(哈尔滨市道里区通达街单元室)的房地产,估价步骤以下:

I、将地址转换为经纬度;
II、运用点与区域之间的关系判断改地址所属基准价格分区,从而获得基准价;
III、根据楼层、朝向和面积等个别特性调整基准价,最后获得估价。

在批量估价过程当中,地址批量解析、小区边界经纬度坐标标注、小区销售价格采集等工做在规模较大城市将耗费大量人力、物力和财力。

哈尔滨市  &nbsp小区 

经纬度坐标列表

经纬度坐标数组

本文提供的各类区域经纬度边界工具仅用于我的学习或教学研究用途,不支持大批量商业用途的区域边界经纬度坐标提取(因为百度地图key的限制)。