视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
利用百度地图实现地图网格的实例分享
2020-11-27 20:03:49 责编:小OO
文档

最近要使用百度地图实现楼盘可视化的功能,因此最基础的功能就是将地图网格化以后实现不同地域的楼盘划分;本文主要为大家分享一篇使用百度地图实现地图网格的示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧,希望能帮助到大家。

1,自行去百度地图的开放平台申请秘钥哈,这里我就把自己的秘钥贴出来了;ak=A3CklGvnFOjkAzKzay2dySgfdig0GKz4

2,新建一个简单页面,下面我把自己的页面贴出来

<!DOCTYPE html>
<html>
<head>
 <meta name="viewport" content="initial-scale=1.0, user-scalable=no"/>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
 <style type="text/css">
 html {
 height: 100%
 }
 body {
 height: 100%;
 margin: 0px;
 padding: 0px
 }
 #container {
 height: 100%
 }
 </style>
 <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=A3CklGvnFOjkAzKzay2dySgfdig0GKz4"></script> 
<script type="text/javascript" src="ziroom-map.js"></script>
 </head>
 <body> 
<p id="container"></p>
 <script> 
var myMap = new ZMap("container"); </script>
 </body>
 </html>

3,其中引入了ziroom-map.js,这是我们公司的名字啦,我把代码贴出来,这个js是封装了百度的js的api的,有人如果要问为什么封装,直接使用不可以么?那我的回答是:封装可以将具体业务和地图相结合,使代码更清晰,并且可以持久化当前地图的状态,利于实现对地图的操作。

var ZMap = function (id, center, level) {
 this.initCenter = new ZPoint(116.404, 39.915);//初始化的中心点,同时为了定义网格的中心点
 this.id = id;//p的id
 this.level = level ? level : 13;//地图级别
 this.center = center ? center : this.initCenter;//中心点
 this.map = null;//百度地图实例
 this.xgrids = [];//经线
 this.ygrids = [];//纬线
 this.beSelectBounds = {};
 this.bounds = null;//当前地图的四个顶点
 this.span = null;//当前网格的跨度
 this.init();
}
ZMap.prototype = {
 init: function () {//全局初始化
 var zMap = this;
 this.map = new BMap.Map(this.id);
 this.map.centerAndZoom(this.center.point, this.level);
 this.map.enableScrollWheelZoom();
 this.map.disableInertialDragging();
 this.map.addControl(new BMap.NavigationControl({
 anchor: BMAP_ANCHOR_BOTTOM_RIGHT,
 type: BMAP_NAVIGATION_CONTROL_ZOOM
 })); //缩放按钮
 this.map.addControl(new BMap.ScaleControl({anchor: BMAP_ANCHOR_BOTTOM_LEFT, offset: new BMap.Size(80, 25)})); //比例尺
 this.map.disableDoubleClickZoom();
 this.map.setMapStyle({style: 'googlelite'});
 this.initProperty();
 this.initGrid();
 //添加移动后的点击事件
 this.map.addEventListener("dragend", function () {
 zMap.initProperty();
 zMap.initGrid();
 });
 //添加放大或缩小时的事件
 this.map.addEventListener("zoomend", function () {
 zMap.initProperty();
 zMap.initGrid();
 });
 //设置点击事件
 this.map.addEventListener("click", function (e) {
 var point = e.point;
 //获取当前点是在哪个区块内,获取正方形的四个顶点
 var points = zMap.getGrid(point);
 //判断当前区域是否已经被选中过,如果被选中过则取消选中
 var key = '' + points[0].lng + points[0].lat + points[2].lng + points[2].lat;//使用两个点的坐标作为key
 if (zMap.beSelectBounds[key]) {
 zMap.map.removeOverlay(zMap.beSelectBounds[key]);
 delete zMap.beSelectBounds[key];
 return;
 }
 var polygon = new BMap.Polygon(points, {strokeColor: "red", strokeWeight: 2, strokeOpacity: 0.5});
 zMap.map.addOverlay(polygon);
 zMap.beSelectBounds[key] = polygon;
 });
 },
 initProperty: function () {//初始化当前地图的状态
 this.level = this.map.getZoom();
 this.bounds = {
 x1: this.map.getBounds().getSouthWest().lng,
 y1: this.map.getBounds().getSouthWest().lat,
 x2: this.map.getBounds().getNorthEast().lng,
 y2: this.map.getBounds().getNorthEast().lat
 };
 this.span = this.getSpan();//需要使用level属性
 },
 initGrid: function () {//初始化网格
 var zMap = this;
 //将原来的网格线先去掉
 for (var i in zMap.xgrids) {
 this.map.removeOverlay(zMap.xgrids[i]);
 }
 zMap.xgrids = [];
 for (var i in zMap.ygrids) {
 this.map.removeOverlay(zMap.ygrids[i]);
 }
 zMap.ygrids = [];
 //获取当前网格跨度
 var span = zMap.span;
 //初始化地图上的网格
 for (var i = zMap.bounds.x1 + (zMap.initCenter.point.lng - zMap.bounds.x1) % span.x - span.x; i < zMap.bounds.x2 + span.x; i += span.x) {
 var polyline = new BMap.Polyline([
 new BMap.Point(i.toFixed(6), zMap.bounds.y1),
 new BMap.Point(i.toFixed(6), zMap.bounds.y2)
 ], {strokeColor: "black", strokeWeight: 1, strokeOpacity: 0.5});
 zMap.xgrids.push(polyline);
 zMap.map.addOverlay(polyline);
 }
 for (var i = zMap.bounds.y1 + (zMap.initCenter.point.lat - zMap.bounds.y1) % span.y - span.y; i < zMap.bounds.y2 + span.y; i += span.y) {
 var polyline = new BMap.Polyline([
 new BMap.Point(zMap.bounds.x1, i.toFixed(6)),
 new BMap.Point(zMap.bounds.x2, i.toFixed(6))
 ], {strokeColor: "black", strokeWeight: 1, strokeOpacity: 0.5});
 zMap.ygrids.push(polyline);
 zMap.map.addOverlay(polyline);
 }
 },
 getSpan: function () {//获取网格的跨度
 var scale = 0.75;
 var x = 0.000;
 for (var i = this.level; i < 19; i++) {
 x *= 2;
 }
 var y = parseFloat((scale * x).toFixed(5));
 return {x: x, y: y};
 },
 getGrid: function (point) {//返回当前点在所在区块的四个顶点
 var zMap = this;
 //先找出两条纵线坐标
 var xpoints = this.xgrids.map(function (polyline) {
 return polyline.getPath()[0].lng;
 }).filter(function (lng) {
 return Math.abs(lng - point.lng) <= zMap.span.x;
 }).sort(function (a, b) {
 return a - b;
 }).slice(0, 2);
 //再找出两条横线的坐标
 var ypoints = this.ygrids.map(function (polyline) {
 return polyline.getPath()[0].lat;
 }).filter(function (lat) {
 return Math.abs(lat - point.lat) <= zMap.span.y;
 }).sort(function (a, b) {
 return a - b;
 }).slice(0, 2);
 return [
 new BMap.Point(xpoints[0], ypoints[0]),
 new BMap.Point(xpoints[0], ypoints[1]),
 new BMap.Point(xpoints[1], ypoints[1]),
 new BMap.Point(xpoints[1], ypoints[0])
 ];
 },
 reset: function () {//重置
 this.map.reset();
 }
}
var ZPoint = function (x, y, code) {
 this.code = code;
 this.point = new BMap.Point(x, y);
}

下载本文
显示全文
专题