在谷歌地图api v3中绘制(倒置)几何圆

时间:2013-08-14 15:09:25

标签: google-maps-api-3 latitude-longitude geometry

我正在寻找一种在Google Maps api v3中绘制倒置几何(非地理)圆的方法。

基本上,目标是在地图对象周围调暗地图 - 作为使地图对象脱颖而出的一种方法。要做到这一点,我采用了倒置叠加,并有一种方法在我的“阴影叠加”中创建圆形“洞”。

然而,我用来获得lat / lng坐标来生成这个圆的方法被调整为墨卡托投影并且不是一致的大小或形状,因为它是相对于它从赤道的位置。该方法需要创建一个圆(不使用谷歌的圆形对象 - 或者使用它来提取它的路径),它将根据不采用墨卡托投影的半径场计算中心的纬度/经度点考虑到 - 它会在地图上绘制的任何地方显示一个完美的圆圈。

它不应该很难,但我很难将此函数转换为不将Mercator投影应用于结果:

function getCircleCoords(point, radius) {
  var d2r = Math.PI / 180;   // degrees to radians
  var points = 90;
  var circleLatLngs = new Array();
  var circleLat = radius * 0.621371192 * 0.014483;
  var circleLng = circleLat / Math.cos( point.lat() * d2r);
  for (var i = 0; i < points+1; i++) { 
    var theta = Math.PI * (i / (points / 2)); 
    var vertexLat =  point.lat() + (circleLat * Math.sin(theta)); 
    var vertexLng =  point.lng() + (circleLng * Math.cos(theta));

    var vertexLat =  point.lat() + (circleLat * (theta)); 
    var vertexLng =  point.lng() + (circleLng * (theta));

    var vertextLatLng = new google.maps.LatLng(vertexLat, vertexLng);
    circleLatLngs.push( vertextLatLng );
  }
  return circleLatLngs;
}

这将被称为:

feature = new google.maps.Polygon({
    paths: [[my_shadow_layer_path],[getCircleCoords(latLng_, 800)] ],
    fillColor: '#ff0000',
    fillOpacity: 0.5,
    map: map_
  });
}

思想?

2 个答案:

答案 0 :(得分:0)

要使用多边形,您需要计算像素(世界)坐标中的圆坐标,使用fromPointToLatLng将它们转换为地理坐标,以获得圆的适当坐标。或者使用正确大小的叠加层并自己处理缩放变化。

答案 1 :(得分:0)

您可以尝试使用此库https://github.com/raihan2006i/google-map-inverted-circle。适用于Google Map V3。请参阅下面的示例代码块

var iCircle;
var map;
function initialize() {
    var mapDiv = document.getElementById('gMap');
    map = new google.maps.Map(mapDiv, {
        center: new google.maps.LatLng(37.4419, -122.1419),
        zoom: 13,
        mapTypeId: google.maps.MapTypeId.ROADMAP
    });

    iCircle = new InvertedCircle({
        center: map.getCenter(),
        map: map,
        radius: 5000, // 5 km
        editable: true,
        stroke_weight: 5,
        fill_opacity: 0.5,
        fill_color: "#ff0000"
    });
}
google.maps.event.addDomListener(window, 'load', initialize);