权声明:本文为博主原创文章,未经博主允许不得转载。
利用百度API(JavaScript 版)实现在地图上绘制任一多边形,并判断给定经纬度是否在多边形范围内。以及两点间的测距功能。
- 绘制多边形(蓝色),折线轨迹(红色)效果图:
- <img src="https://img-blog.youkuaiyun.com/20150915193750707?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
判断点范围,测距:
html代码:
- <!DOCTYPE html>
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=gbk" />
- <meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
- <style type="text/css">
- body, html{width: 100%;height: 100%;margin:0;font-family:"微软雅黑";}
- #allmap {height:500px; width: 100%;}
- #control{width:100%;}
- </style>
- <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=iqgvSM0gddG4NkGXFlawVa6C"></script>
- <script type="text/javascript" src="GeoUtils.js"></script>
- <title>设置线、面可编辑</title>
- </head>
- <body>
- <div id="allmap"></div>
- <div id="control">
- <button onclick = "polyline.enableEditing();polygon.enableEditing();">开启线、面编辑功能</button>
- <button onclick = "polyline.disableEditing();polygon.disableEditing();">关闭线、面编辑功能</button>
- </div>
- </body>
- </html>
- <script type="text/javascript">
- // 百度地图API功能
- var map = new BMap.Map("allmap");
- map.centerAndZoom(new BMap.Point(106.613922,29.53832), 15);
- map.enableScrollWheelZoom();
- var polyline = new BMap.Polyline([
- new BMap.Point(106.612539,29.529602),
- new BMap.Point(106.607975,29.53177),
- new BMap.Point(106.610311,29.525862),
- new BMap.Point(106.60776,29.524008)
- ], {strokeColor:"red", strokeWeight:2, strokeOpacity:0.5}); //创建折线
- map.addOverlay(polyline); //增加折线
- var polygon = new BMap.Polygon([
- new BMap.Point(106.607477,29.544864),
- new BMap.Point(106.613572,29.548324),
- new BMap.Point(106.619357,29.537421),
- new BMap.Point(106.612988,29.537079),
- new BMap.Point(106.615359,29.541143)
- ], {strokeColor:"blue", strokeWeight:2, strokeOpacity:0.5}); //创建多边形
- map.addOverlay(polygon); //增加多边形
- var ppoint = new BMap.Point(106.613087,29.540485);
- var result=BMapLib.GeoUtils.isPointInPolygon(ppoint, polygon);
- alert("数字图书馆是否在多边形范围内:"+result);
- var ppoint1 = new BMap.Point(106.614986,29.539876);
- var result1=BMapLib.GeoUtils.isPointInPolygon(ppoint1, polygon);
- alert("乒乓球馆是否在多边形范围内:"+result1+"米");
- var distance =map.getDistance(ppoint, ppoint1);
- alert("The Distance is"+distance);
- </script>
第二步,添加GeoUtils.js文件,代码如下:
- /**
- * @fileoverview GeoUtils类提供若干几何算法,用来帮助用户判断点与矩形、
- * 圆形、多边形线、多边形面的关系,并提供计算折线长度和多边形的面积的公式。
- * 主入口类是<a href="symbols/BMapLib.GeoUtils.html">GeoUtils</a>,
- * 基于Baidu Map API 1.2。
- *
- * @author Baidu Map Api Group
- * @version 1.2
- */
- //BMapLib.GeoUtils.degreeToRad(Number)
- //将度转化为弧度
- //BMapLib.GeoUtils.getDistance(Point, Point)
- //计算两点之间的距离,两点坐标必须为经纬度
- //BMapLib.GeoUtils.getPolygonArea(polygon)
- //计算多边形面或点数组构建图形的面积,注意:坐标类型只能是经纬度,且不适合计算自相交多边形的面积(封闭的面积)
- //BMapLib.GeoUtils.getPolylineDistance(polyline)
- //计算折线或者点数组的长度
- //BMapLib.GeoUtils.isPointInCircle(point, circle)
- //判断点是否在圆形内
- //BMapLib.GeoUtils.isPointInPolygon(point, polygon)
- //判断点是否多边形内
- //BMapLib.GeoUtils.isPointInRect(point, bounds)
- //判断点是否在矩形内
- //BMapLib.GeoUtils.isPointOnPolyline(point, polyline)
- //判断点是否在折线上
- //BMapLib.GeoUtils.radToDegree(Number)
- //将弧度转化为度
- /**
- * @namespace BMap的所有library类均放在BMapLib命名空间下
- */
- var BMapLib = window.BMapLib = BMapLib || {};
- (function () {
- /**
- * 地球半径
- */
- var EARTHRADIUS = 6370996.81;
- /**
- * @exports GeoUtils as BMapLib.GeoUtils
- */ &