【问题标题】:Combine circles as polygon without intersecting common areas将圆组合为多边形而不与公共区域相交
【发布时间】:2018-08-16 22:30:43
【问题描述】:

我正在为我公司的供应商创建覆盖图,然后需要检查有多少客户居住在整体覆盖范围之外。供应商的覆盖范围始终是一个圆圈。

我使用this 解决方案将我们供应商的覆盖区域合并为一个多边形,以便我可以使用containsLocation function 来比较客户的位置。问题是 containsLocation 函数将一些重叠的覆盖区域识别为超出覆盖范围。这是一个示例,该图钉应保持不可见,因为它在 2 个供应商的覆盖范围内。 Overlapping Vendor Coverage Example

  function updateMap(){
     var radius = $('#radius').val();
     $.ajax({
       url: "",
       dataType: "json",
       type: "POST",
       data: $('#dataForm').serialize()
     }).done(function(result){
       for(var i=0; i<result.length; i++){
         center = {lat: parseFloat(result[i].Latitude), lng: parseFloat(result[i].Longitude)};
         shapeArray.push(drawCircle(center, (radius), 1));
       }
        coverage = new google.maps.Polygon({
            paths: shapeArray,
            strokeColor: "#ff0000",
            strokeOpacity: 0.8,
            strokeWeight: 1,
            fillColor: "#ff0000",
            fillOpacity: 0.35,
            map: map
        });
     });
  }

  function drawCircle(point, radius, dir)
  { 
    var d2r = Math.PI / 180;   // degrees to radians 
    var r2d = 180 / Math.PI;   // radians to degrees 
    var earthsradius = 3963; // 3963 is the radius of the earth in miles
    var points = 32; 

    // find the raidus in lat/lon 
    var rlat = (radius / earthsradius) * r2d; 
    var rlng = rlat / Math.cos(point.lat * d2r); 

    var extp = new Array(); 
    if (dir==1) {var start=0;var end=points+1} // one extra here makes sure we connect the
    else{var start=points+1;var end=0}
    for (var i=start; (dir==1 ? i < end : i > end); i=i+dir)  
    {
        var theta = Math.PI * (i / (points/2)); 
        ey = point.lng + (rlng * Math.cos(theta)); // center a + radius x * cos(theta) 
        ex = point.lat + (rlat * Math.sin(theta)); // center b + radius y * sin(theta) 
        extp.push(new google.maps.LatLng(ex, ey));
    }
    return extp;
  } 

  function showUncovered(el){
    if(!el.checked){
      for(var i=0; i<markerArray.length; i++){
          markerArray[i].setVisible(false);
      }
      return;
    }
    for(var i=0;i<markerArray.length;i++){
      var pos = markerArray[i].position;
      var isAffected = false;
      if(!google.maps.geometry.poly.containsLocation(pos,coverage)){
        markerArray[i].setVisible(true);
      }       
    }         
  }     

【问题讨论】:

  • 您说“引脚应该保持不可见”,但您的代码基本上是在说 if containsLocation() { setVisible(true) } - 不应该反过来吗? markerArray[i].setVisible(false); 隐藏它
  • 我很抱歉。地图最终将需要能够在覆盖区域内外的引脚之间来回翻转,并且对于我所说的情况,我必须错误地复制/粘贴了我的代码。代码已更新。
  • 这是我从上面提到的示例中派生出来的一个小提琴,它将 containsLocation 的值放在控制台中。请注意,当单击多边形圆圈相交的位置时,它将返回 false。 jsfiddle.net/qrvvctja

标签: javascript google-maps google-maps-api-3


【解决方案1】:

【讨论】:

    【解决方案2】:

    由于您拥有所有圆圈,您可以迭代 shapeArray 并在每个圆圈中运行 .containsLocation(...,第一个包含该位置的圆圈结束循环(如果没有,则标记位于多边形之外)。

    实际上,这是bug report 文件中提出的解决方案(看起来他们不会修复它)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-02
      • 1970-01-01
      • 2016-02-03
      • 1970-01-01
      • 1970-01-01
      • 2017-07-07
      相关资源
      最近更新 更多