Javascript 将圆合并为多边形,而不与公共区域相交
我正在为我公司的供应商创建一个覆盖范围图,然后需要检查有多少客户生活在整个覆盖范围之外。供应商的覆盖范围始终为圆形 我使用该解决方案将我们供应商的覆盖区域合并为一个多边形,以便我可以使用来比较客户的位置。问题在于containsLocation函数将一些重叠的覆盖区域标识为覆盖范围之外。以下是一个示例,其中pin应该保持不可见,因为它在两个供应商的覆盖范围内。Javascript 将圆合并为多边形,而不与公共区域相交,javascript,google-maps,google-maps-api-3,Javascript,Google Maps,Google Maps Api 3,我正在为我公司的供应商创建一个覆盖范围图,然后需要检查有多少客户生活在整个覆盖范围之外。供应商的覆盖范围始终为圆形 我使用该解决方案将我们供应商的覆盖区域合并为一个多边形,以便我可以使用来比较客户的位置。问题在于containsLocation函数将一些重叠的覆盖区域标识为覆盖范围之外。以下是一个示例,其中pin应该保持不可见,因为它在两个供应商的覆盖范围内。 函数更新映射(){ var radius=$('#radius').val(); $.ajax({ url:“”, 数据类型:“jso
函数更新映射(){
var radius=$('#radius').val();
$.ajax({
url:“”,
数据类型:“json”,
类型:“POST”,
数据:$('#dataForm')。序列化()
}).完成(功能(结果){
for(变量i=0;i结束;i=i+dir)
{
varθ=数学PI*(i/(点/2));
ey=点.lng+(rlng*Math.cos(θ));//中心a+半径x*cos(θ)
ex=point.lat+(rlat*Math.sin(θ));//中心b+半径y*sin(θ)
extp.push(新的google.maps.LatLng(ex,ey));
}
返回extp;
}
功能(el){
如果(!el.选中){
对于(var i=0;iGoogle将此视为一个bug。
由于您拥有所有的圆,因此可以迭代ShaperRay
并运行。containsLocation(…
在每个圆中,包含位置的第一个圆结束循环(如果没有,则标记在多边形外)
实际上,这是该领域提出的解决方案(看起来他们不会修复它)。你说“pin应该保持不可见”,但你的代码基本上是说如果containsLocation(){setVisible(true)}
-应该是另一种方式吗?markerary[i].setVisible(false)
为了隐藏它,我表示歉意。地图最终需要能够在覆盖区域内外的引脚之间来回翻转,并且我必须对我所陈述的案例错误地复制/粘贴我的代码。代码已经更新。这是我从著名示例中派生的一把小提琴,它将containsLocation的值置于cons中请注意,当单击多边形圆相交的位置时,将返回false。
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);
}
}
}