资讯专栏INFORMATION COLUMN

百度地图判断多边形区域是否重复

gself / 2026人阅读

摘要:原文来自前端时间遇到个问题,就是判断百度地图里的多个任意多边形区域是否重复,在网上看了很多的文章都没有找到解决方案,功夫不负有心人,在网上找到个可以判断是否重复的,但是在包含的情况下就不能判断,后来自己加入根据点判断点是否在多边形内来判断重

原文来自 taoeer.top

</>复制代码

  1. 前端时间遇到个问题,就是判断百度地图里的多个任意多边形区域是否重复,在网上看了很多的文章都没有找到解决方案,功夫不负有心人,在网上找到个可以判断是否重复的,但是在包含的情况下就不能判断,后来自己加入根据点判断点是否在多边形内来判断重复,问题已解决,在此把代码贴出来,供大家参考


</>复制代码

  1. //#region 验证两个面是否相交的算法 (此函数摘抄自网络)
  2. function intersectsPolygonAndPolygon (polygon1LinearRings, polygon2LinearRings) {
  3. // polygon1LinearRings : array[LinearRing,...]
  4. function intersectsByPolygon (polygon1LinearRings, polygon2LinearRings) {
  5. var intersect = false;
  6. intersect = intersectsByLinearRings(polygon1LinearRings, polygon2LinearRings);
  7. if(!intersect) {
  8. // check if this poly contains points of the ring/linestring
  9. for(i=0, len=polygon2LinearRings.length; i 0) {
  10. contained = containsPointByLinearRing(point, LinearRings[0]);
  11. if( numRings > 1) {
  12. // check interior rings
  13. var hole;
  14. for(var i=1; i 0) {
  15. fig = parseFloat(num.toPrecision(sig));
  16. }
  17. return fig;
  18. }
  19. var digs = 14;
  20. var px = approx(point.x, digs);
  21. var py = approx(point.y, digs);
  22. function getX(y, x1, y1, x2, y2) {
  23. return (y - y2) * ((x2 - x1) / (y2 - y1)) + x2;
  24. }
  25. var numSeg = LinearRing.length - 1;
  26. var start, end, x1, y1, x2, y2, cx, cy;
  27. var crosses = 0;
  28. for(var i=0; i= x1 && px <= x2) || // right or vert
  29. x1 >= x2 && (px <= x1 && px >= x2)) { // left or vert
  30. // point on edge
  31. crosses = -1;
  32. break;
  33. }
  34. }
  35. // ignore other horizontal edges
  36. continue;
  37. }
  38. cx = approx(getX(py, x1, y1, x2, y2), digs);
  39. if(cx == px) {
  40. // point on line
  41. if(y1 < y2 && (py >= y1 && py <= y2) || // upward
  42. y1 > y2 && (py <= y1 && py >= y2)) { // downward
  43. // point on edge
  44. crosses = -1;
  45. break;
  46. }
  47. }
  48. if(cx <= px) {
  49. // no crossing to the right
  50. continue;
  51. }
  52. if(x1 != x2 && (cx < Math.min(x1, x2) || cx > Math.max(x1, x2))) {
  53. // no crossing
  54. continue;
  55. }
  56. if(y1 < y2 && (py >= y1 && py < y2) || // upward
  57. y1 > y2 && (py < y1 && py >= y2)) { // downward
  58. ++crosses;
  59. }
  60. }
  61. var contained = (crosses == -1) ?
  62. // on edge
  63. 1 :
  64. // even (out) or odd (in)
  65. !!(crosses & 1);
  66. return contained;
  67. }
  68. function intersectsByLinearRings (LinearRing1, LinearRings2) {
  69. var intersect = false;
  70. var segs1 = getSortedSegments(LinearRing1);
  71. var segs2 = getSortedSegments(LinearRings2);
  72. var seg1, seg1x1, seg1x2, seg1y1, seg1y2,
  73. seg2, seg2y1, seg2y2;
  74. // sweep right
  75. outer: for(var i=0, len=segs1.length; i seg1x2) {
  76. // seg1 still left of seg2
  77. break;
  78. }
  79. if(seg2.x2 < seg1x1) {
  80. // seg2 still left of seg1
  81. continue;
  82. }
  83. seg2y1 = seg2.y1;
  84. seg2y2 = seg2.y2;
  85. if(Math.min(seg2y1, seg2y2) > Math.max(seg1y1, seg1y2)) {
  86. // seg2 above seg1
  87. continue;
  88. }
  89. if(Math.max(seg2y1, seg2y2) < Math.min(seg1y1, seg1y2)) {
  90. // seg2 below seg1
  91. continue;
  92. }
  93. if(segmentsIntersect(seg1, seg2)) {
  94. intersect = true;
  95. break outer;
  96. }
  97. }
  98. }
  99. return intersect;
  100. }
  101. function getSortedSegments(points) {
  102. var numSeg = points.length - 1;
  103. var segments = new Array(numSeg), point1, point2;
  104. for(var i=0; i= 0 && along1 <= 1 && along2 >=0 && along2 <= 1) {
  105. // intersect
  106. if(!point) {
  107. intersection = true;
  108. } else {
  109. // calculate the intersection point
  110. var x = seg1.x1 + (along1 * x12_11);
  111. var y = seg1.y1 + (along1 * y12_11);
  112. intersection = { "x":x, "y":y };
  113. }
  114. }
  115. }
  116. if(tolerance) {
  117. var dist;
  118. if(intersection) {
  119. if(point) {
  120. var segs = [seg1, seg2];
  121. var seg, x, y;
  122. // check segment endpoints for proximity to intersection
  123. // set intersection to first endpoint within the tolerance
  124. outer: for(var i=0; i<2; ++i) {
  125. seg = segs[i];
  126. for(var j=1; j<3; ++j) {
  127. x = seg["x" + j];
  128. y = seg["y" + j];
  129. dist = Math.sqrt(
  130. Math.pow(x - intersection.x, 2) +
  131. Math.pow(y - intersection.y, 2)
  132. );
  133. if(dist < tolerance) {
  134. intersection.x = x;
  135. intersection.y = y;
  136. break outer;
  137. }
  138. }
  139. }
  140. }
  141. } else {
  142. // no calculated intersection, but segments could be within
  143. // the tolerance of one another
  144. var segs = [seg1, seg2];
  145. var source, target, x, y, p, result;
  146. // check segment endpoints for proximity to intersection
  147. // set intersection to first endpoint within the tolerance
  148. outer: for(var i=0; i<2; ++i) {
  149. source = segs[i];
  150. target = segs[(i+1)%2];
  151. for(var j=1; j<3; ++j) {
  152. p = {x: source["x"+j], y: source["y"+j]};
  153. result = distanceToSegment(p, target);
  154. if(result.distance < tolerance) {
  155. if(point) {
  156. intersection = { "x":p.x, "y":p.y };
  157. } else {
  158. intersection = true;
  159. }
  160. break outer;
  161. }
  162. }
  163. }
  164. }
  165. }
  166. return intersection;
  167. };
  168. function distanceToSegment(point, segment) {
  169. var result = distanceSquaredToSegment(point, segment);
  170. result.distance = Math.sqrt(result.distance);
  171. return result;
  172. };
  173. function distanceSquaredToSegment(point, segment) {
  174. var x0 = point.x;
  175. var y0 = point.y;
  176. var x1 = segment.x1;
  177. var y1 = segment.y1;
  178. var x2 = segment.x2;
  179. var y2 = segment.y2;
  180. var dx = x2 - x1;
  181. var dy = y2 - y1;
  182. var along = ((dx * (x0 - x1)) + (dy * (y0 - y1))) /
  183. (Math.pow(dx, 2) + Math.pow(dy, 2));
  184. var x, y;
  185. if(along <= 0.0) {
  186. x = x1;
  187. y = y1;
  188. } else if(along >= 1.0) {
  189. x = x2;
  190. y = y2;
  191. } else {
  192. x = x1 + along * dx;
  193. y = y1 + along * dy;
  194. }
  195. return {
  196. distance: Math.pow(x - x0, 2) + Math.pow(y - y0, 2),
  197. x: x, y: y,
  198. along: along
  199. };
  200. }
  201. return intersectsByPolygon(polygon1LinearRings, polygon2LinearRings);
  202. }
  203. //#endregion
  204. function railsIsOverlap (rails) {
  205. var i, j, k, v, l, n;
  206. if (rails.length < 2) {
  207. return false;
  208. }
  209. for (i = 0, j = rails.length - 1; i < j; i++) {
  210. var rail = rails[i];
  211. var railPath = rail.getPath();
  212. for (k = i + 1, v = rails.length; k < v; k++) {
  213. var railed = rails[k];
  214. var railedPath = railed.getPath();
  215. for (l = 0 , n = railPath.length; l < n; l ++) {
  216. if (BMapLib.GeoUtils.isPointInPolygon(new BMap.Point(railPath[l].lng, railPath[l].lat), railed)) {
  217. layer.alert("片区不能重复");
  218. return true;
  219. }
  220. }
  221. for (l = 0, n = railedPath.length; l < n; l ++) {
  222. if (BMapLib.GeoUtils.isPointInPolygon(new BMap.Point(railedPath[l].lng, railedPath[l].lat), rail)) {
  223. // console.log(53)
  224. layer.alert("片区不能重复");
  225. return true;
  226. }
  227. }
  228. }
  229. }
  230. var lines = [];
  231. for ( i = 0 ; i < rails.length; i ++) {
  232. var line = rails[i].getPath();
  233. lines.push([]);
  234. for (j = 0 ;j < line.length ; j ++) {
  235. var p = {
  236. x: line[j].lng,
  237. y: line[j].lat
  238. };
  239. lines[i].push(p);
  240. }
  241. lines[i].push(lines[i][0])
  242. }
  243. for (i = 0; i < lines.length - 1; i ++) {
  244. var p1 = lines[i];
  245. for (j = i + 1; j < lines.length; j ++) {
  246. var p2 = lines[j];
  247. if (intersectsPolygonAndPolygon(p1,p2)) {
  248. layer.alert("片区不能重复!");
  249. return true;
  250. }
  251. }
  252. }
  253. return false;
  254. }

</>复制代码

  1. 使用时直接调用railsIsOverlap函数就行,参数是多边形数组

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/50283.html

相关文章

  • 百度地图判断边形区域是否重复

    摘要:原文来自前端时间遇到个问题,就是判断百度地图里的多个任意多边形区域是否重复,在网上看了很多的文章都没有找到解决方案,功夫不负有心人,在网上找到个可以判断是否重复的,但是在包含的情况下就不能判断,后来自己加入根据点判断点是否在多边形内来判断重 原文来自 taoeer.top 前端时间遇到个问题,就是判断百度地图里的多个任意多边形区域是否重复,在网上看了很多的文章都没有找到解决方案,功夫不...

    Charles 评论0 收藏0
  • 基于百度地图区域重叠判断

    摘要:原文链接前些日的一个小需求用户在后台划不规则区域,区域之间不能重叠,如图判断分两步判断多变形是否有相交线段,无则进行第二步判断公式判断多变形之间是否存在顶点与多边形的包含关系代码如下点线面线段是否相交判断两多 原文链接: Fyerls Blog 前些日的一个小需求:用户在后台划不规则区域,区域之间不能重叠,如图showImg(https://segmentfault.com/img/b...

    OBKoro1 评论0 收藏0
  • 仿链家地图找房的简单实现

    摘要:本篇目录使用入门简单使用流程链家地图找房效果区域点位气泡数据结构实现方法区域边界获取区域点位经纬度获取区域边界小结最近由于项目需要,开始调研如何使用百度地图实现类似于链家的地图找房的功能,从而开始学习百度地图相关内容。 本篇目录: 使用入门 简单使用流程 链家地图找房效果 区域点位气泡 数据结构 实现 addOverlay方法 区域边界 获取区域点位经纬度 获取区域边...

    RancherLabs 评论0 收藏0
  • vue 地图可视化(1)

    摘要:百度地图百度地图作为项目中地图可视化最重要的一部分,不止其为国人自己的地图,还因为其完善的技术文档案例和多样化的开源插件等上有的组件可以直接使用,有兴趣的同学可以直接上手这里不采用已经封装好的地图组件,而是从零开始,采用原生的百度地图一 百度地图 百度地图作为项目中地图可视化最重要的一部分,不止其为国人自己的地图,还因为其完善的技术文档案例和多样化的开源插件(echarts、Mapv等...

    1treeS 评论0 收藏0

发表评论

0条评论

gself

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<