百度地图小区边界(轮廓)处理

最近,查了很多资料都没法在百度地图上画出小区边界,经过一番研究后,终于发现了一种方式。以下是demo的相关说明:

1. demo中小区相关信息查询是基于jsonp的方式处理
2. 使用百度地图需要申请AK,demo中使用的是我个人的申请的,如果demo打开没有效果可能是AK过期了
3. 因为小区轮廓百度没有公布相关API,demo中的接口有可能被百度关闭
4. 可能有的小区并没有相关轮廓数据,所以demo中也无法显示出来


闲话不多说了,直接上代码

1)JS代码(下变第一部分代码)

2)HTML代码(下边第二部分代码)

3)下载地址:http://pan.baidu.com/s/1qY2rAPI

4)效果



var queryHouseOutline = function(hid, callback){
	var baseURL = 'http://map.baidu.com/?reqflag=pcmap&coord_type=3&from=webmap&qt=ext&ext_ver=new&l=18';
	var url = baseURL + "&uid=" + hid;
	callback && (window.queryHouseOutlineCallback = callback);
	$.ajax({
		type: "get",
		async: false,
		url: url,
		dataType: "jsonp",
		jsonpCallback: "queryHouseOutlineCallback",
		success: function(datas) {
		}
	});
};

/**
 * 模糊查询小区信息, 无返回值
 * @param {} house	小区名称
 * @param {} city	所属城市名称
 * @param {} ak		百度地图AK
 * @param {} callback	回调函数,该函数可以接收到请求的返回值
 */
var queryHouse = function(house, city, ak, callback){
	var baseURL = 'http://api.map.baidu.com/place/v2/search?output=json&scope=2';
	var url = baseURL + "&q=" + house + "&region=" + city + "&ak=" + ak;
	callback && (window.queryHouseCallback = callback);
	$.ajax({
		type: "get",
		async: false,
		url: url,
		dataType: "jsonp",
		jsonpCallback: "queryHouseCallback",
		success: function(datas) {
		}
	});
};

/**
 * 墨卡托坐标转百度坐标
 * @param {} coordinate
 * @return {}
 */
var coordinateToPoints = function(map, coordinate) {
	var points = [];
	if (coordinate) {
		var arr = coordinate.split(";");
		if(arr){
			for(var i = 0; i < arr.length; i++){
				var coord = arr[i].split(",");
				if(coord && coord.length == 2){
					var mctXY = new BMap.Pixel(coord[0], coord[1]);    
					var project = map.getMapType().getProjection();
					var point = project.pointToLngLat(mctXY);   
					points.push(new BMap.Point(point.lng, point.lat));
				}
			}
		}
	}
	return points;
};

/**
 * 墨卡托坐标解析
 * @param {} mocator
 * @return {}
 */
var parseGeo = function(mocator){
	if(typeof mocator != 'string'){
		return {};
	}
	var t = mocator.split("|");
	var n = parseInt(t[0]);
	var i = t[1];
	var r = t[2];
	var o = r.split(";");
	if(n === 4){
		for (var a = [], s = 0; s < o.length - 1; s++){
			"1" === o[s].split("-")[0] && a.push(o[s].split("-")[1]);
		}
		o = a;
		o.push("");
	}
	var u = [];
	switch(n){
		case 1:
			u.push(o[0]);
			break;
		case 2:
		case 3:
		case 4:
			for (var s = 0; s < o.length - 1; s++) {
				var l = o[s];
				if (l.length > 100){
					l = l.replace(/(-?[1-9]\d*\.\d*|-?0\.\d*[1-9]\d*|-?0?\.0+|0|-?[1-9]\d*),(-?[1-9]\d*\.\d*|-?0\.\d*[1-9]\d*|-?0?\.0+|0|-?[1-9]\d*)(,)/g,
									"$1,$2;");
					u.push(l);
				} else {
					for (var c = [], d = l.split(","), f = 0; f < d.length; f += 2) {
						var p = d[f];
						var h = d[f + 1];
						c.push(p + "," + h);
					}
					u.push(c.join(";"))
				}
			}
			break;
		default:
			break;
	}
	
	if(u.length <= 1){
		u = u.toString();
	}
	
	var result = {
		type : n,
		bound : i,
		points : u
	};
	return result;
};


<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>地图DEMO</title>
<script type="text/javascript"
	src="http://api.map.baidu.com/api?v=2.0&ak=E1ec599cbc4a8006eb37d99cf002e054"></script>
<script type="text/javascript" src="js/jquery-3.2.1.min.js"></script>
<script type="text/javascript" src="js/equipmentMapUtil.js"></script>
<script type="text/javascript">
	$(document).ready(function() {
		var map = new BMap.Map("allmap"); // 创建Map实例
		map.centerAndZoom("深圳", 15);
		map.addControl(new BMap.MapTypeControl()); //添加地图类型控件

		var options = {
			renderOptions : {
				map : map,
				selectFirstResult : true
			},
			onSearchComplete : function(results) {
				//这个函数会被调用两次
			}
		};

		map.enableScrollWheelZoom(true); //开启鼠标滚轮缩放
		
		/**
		 * 第一个参数是城市名,第二参数是小区名 
		 */
		var showArea = function(city, area){
			queryHouse(area, city, "E1ec599cbc4a8006eb37d99cf002e054", function(data){
				if(data.message == 'ok'){
					var houses = data.results;
					if(houses && houses.length > 0){
						var house = houses[0];
						queryHouseOutline(house.uid, function(houseOutline){
							var geo = houseOutline.content.geo;
							if(!geo){
								var location = house.location;
								var point = new BMap.Point(location.lng, location.lat);
								map.centerAndZoom(point, 19);
								var marker = new BMap.Marker(point);
								marker.setAnimation(BMAP_ANIMATION_BOUNCE); 
								map.addOverlay(marker);
							}else{
								map.clearOverlays();
								var geoObj = parseGeo(geo);
								//var bounds = coordinateToPoints(geoObj.bound);
								//边界点
								var points = coordinateToPoints(map, geoObj.points);
								var ply = new BMap.Polygon(points, {
									strokeWeight: 2,
									strokeColor: "#F01B2D",
									strokeOpacity: 0.9,
									fillColor : "#FFEBCC"
								}); //建立多边形覆盖物
								map.addOverlay(ply); //添加覆盖物
								map.setViewport(ply.getPath()); //调整视野 
							}
						});
					}
				}
			});
		};
		
		showArea($('#cityId').val(), $('#areaId').val());
		
		$('#showBtn').click(function(){
			debugger;
			showArea($('#cityId').val(), $('#areaId').val());
		});
	});
</script>
</head>
<body>
	<table>
		<tr>
			<td>城市:</td>
			<td><input id="cityId" type="text" value="深圳" /></td>
			<td>小区:</td>
			<td><input id="areaId" type="text" value="南方科技大学" /></td>
			<td>
				<button id="showBtn">显示</button>
			</td>
		</tr>
	</table>
	<div id="allmap" style="width: 600px; height: 480px;"></div>
	<script type="text/javascript">
		
	</script>
</body>
</html><!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>地图DEMO</title>
<script type="text/javascript"
	src="http://api.map.baidu.com/api?v=2.0&ak=E1ec599cbc4a8006eb37d99cf002e054"></script>
<script type="text/javascript" src="js/jquery-3.2.1.min.js"></script>
<script type="text/javascript" src="js/equipmentMapUtil.js"></script>
<script type="text/javascript">
	$(document).ready(function() {
		var map = new BMap.Map("allmap"); // 创建Map实例
		map.centerAndZoom("深圳", 15);
		map.addControl(new BMap.MapTypeControl()); //添加地图类型控件

		var options = {
			renderOptions : {
				map : map,
				selectFirstResult : true
			},
			onSearchComplete : function(results) {
				//这个函数会被调用两次
			}
		};

		map.enableScrollWheelZoom(true); //开启鼠标滚轮缩放
		
		/**
		 * 第一个参数是城市名,第二参数是小区名 
		 */
		var showArea = function(city, area){
			queryHouse(area, city, "E1ec599cbc4a8006eb37d99cf002e054", function(data){
				if(data.message == 'ok'){
					var houses = data.results;
					if(houses && houses.length > 0){
						var house = houses[0];
						queryHouseOutline(house.uid, function(houseOutline){
							var geo = houseOutline.content.geo;
							if(!geo){
								var location = house.location;
								var point = new BMap.Point(location.lng, location.lat);
								map.centerAndZoom(point, 19);
								var marker = new BMap.Marker(point);
								marker.setAnimation(BMAP_ANIMATION_BOUNCE); 
								map.addOverlay(marker);
							}else{
								map.clearOverlays();
								var geoObj = parseGeo(geo);
								//var bounds = coordinateToPoints(geoObj.bound);
								//边界点
								var points = coordinateToPoints(map, geoObj.points);
								var ply = new BMap.Polygon(points, {
									strokeWeight: 2,
									strokeColor: "#F01B2D",
									strokeOpacity: 0.9,
									fillColor : "#FFEBCC"
								}); //建立多边形覆盖物
								map.addOverlay(ply); //添加覆盖物
								map.setViewport(ply.getPath()); //调整视野 
							}
						});
					}
				}
			});
		};
		
		showArea($('#cityId').val(), $('#areaId').val());
		
		$('#showBtn').click(function(){
			debugger;
			showArea($('#cityId').val(), $('#areaId').val());
		});
	});
</script>
</head>
<body>
	<table>
		<tr>
			<td>城市:</td>
			<td><input id="cityId" type="text" value="深圳" /></td>
			<td>小区:</td>
			<td><input id="areaId" type="text" value="南方科技大学" /></td>
			<td>
				<button id="showBtn">显示</button>
			</td>
		</tr>
	</table>
	<div id="allmap" style="width: 600px; height: 480px;"></div>
	<script type="text/javascript">
		
	</script>
</body>
</html>


  • 11
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
百度地图提供了一种方便的方法,可以通过JSON边界下载来获取地图数据。 首先,要使用百度地图JSON边界下载功能,需要使用开发者密钥。开发者密钥用于向百度地图API发送请求,并获取相应的地图数据。 接下来,可以通过发送HTTP GET请求来获取JSON边界数据。在请求URL中,需要包含相应的参数,如请求类型(type)为边界类型(bound)等。百度地图支持多个边界类型,例如省级边界(province)、市级边界(city)和区县级边界(district)等。 请求发送后,百度地图API会返回相应的JSON数据,其中包括了所请求的边界数据。可以通过解析JSON数据,获取到地图的边界坐标信息。 对于省、市、区县等不同级别的边界数据,百度地图提供了相应的接口和参数,可以根据需求进行选择和调整。例如,可以通过设置返回数据的坐标类型(坐标系类型),进行数据的适配和转换。 JSON边界下载功能在许多应用场景中都有广泛的应用。例如,可以通过获取市级边界数据,进行城市边界划定和画图等操作。也可以通过获取区县边界数据,进行行政区划相关的分析和展示等。 总之,百度地图的JSON边界下载功能提供了一种方便的方式,可以获取到所需的地图边界数据。通过发送请求,并解析返回的JSON数据,可以实现对地图数据的灵活应用和定制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值