【问题标题】:Scale Google maps Marker Image by Meters(fixed geographic size)按米缩放谷歌地图标记图像(固定地理大小)
【发布时间】:2015-11-05 17:41:32
【问题描述】:

我有一个 svg 文件,我将它用于谷歌地图标记。大小为 65 像素 x 65 像素。

我想确保这个自定义标记可以缩放到 1500 米。它应该在地图缩放时进行缩放。

我不确定如何完成这项工作。需要一种算法来根据缩放级别计算 scaledSize 并使用户在地图上为 1500 米。

            var offset = new google.maps.Point(50, 50);
            var getIcon = function (uid, selected) {
                return {
                    url: svg_url,
                    anchor: offset,
                    scaledSize: sccaledSize // not sure what to put here
                };
            };
            new google.maps.Marker({
                    position: new google.maps.LatLng(xx,yy),
                    icon: getIcon(Uid, false)
                });

【问题讨论】:

  • 你为什么不直接使用google.maps.Circle?它的半径以米为单位。
  • 原因是圆圈不能像标记一样工作,圆圈不能分组不支持标记簇
  • 您可能希望在您的问题中包含这些额外的约束。虽然不知道为什么一个圈子“不能分组”。
  • @geocodezip 另外,google.maps.Circle 有时并不完美。

标签: google-maps google-maps-api-3 svg google-maps-markers marker


【解决方案1】:

根据this thread,以下函数可用于计算谷歌地图中每像素的米数:

function getScale(latLng,zoom){
  return 156543.03392 * Math.cos(latLng.lat() * Math.PI / 180) / Math.pow(2, zoom)
}

因此图标的大小可以这样指定:

 var zoom = map.getZoom();
 var scale = getScale(position,zoom + 1); //meters per pixel
 var width = 1500 / scale; 
 var height = width;

 var icon = {
    url: "https://openclipart.org/download/82549/blue-circle.svg",
    anchor: new google.maps.Point(50, 50),
    scaledSize: new google.maps.Size(width, height)
 };

完整示例

var map;
var marker;

function initMap() {
  map = new google.maps.Map(document.getElementById('map'), {
    zoom: 11,
    center: { lat: 60.1823822, lng: 25.0036073 }
  });

 

  

 //var circle = new google.maps.Circle({
 //     center: map.getCenter(),
 //     radius: 1500,  //in meters
 //     map: map
 // });

 
  marker = createMarker(map.getCenter(),map);

  google.maps.event.addListener(map, 'zoom_changed', function() {
     marker.setMap(null);
     marker = createMarker(marker.getPosition(),map);
   });

}


function createMarker(position,map) {
     var zoom = map.getZoom();
     var scale = getScale(position,zoom + 1); //meters per pixel
     var width = 1500 / scale; 
     var height = width;

     var icon = {
        url: "https://openclipart.org/download/82549/blue-circle.svg",
        anchor: new google.maps.Point(50, 50),
        scaledSize: new google.maps.Size(width, height)
     };

     return new google.maps.Marker({
        position: position,
        map: map,
        icon: icon
     });
}


function getScale(latLng,zoom){
  return 156543.03392 * Math.cos(latLng.lat() * Math.PI / 180) / Math.pow(2, zoom)
}
html, body {
    height: 100%;
    margin: 0;
    padding: 0;
}

#map {
    height: 100%;
}
<script src="https://maps.googleapis.com/maps/api/js?&callback=initMap&signed_in=true" async defer></script>
<div id="map"></div>

【讨论】:

  • 我找到了你在这个答案之前链接的谷歌线程。我想摆脱神奇的数字“156543.03392”,所以我搜索了一下,发现自己在这里。任何关于这个数字到底是什么的见解?
猜你喜欢
  • 1970-01-01
  • 2016-11-23
  • 2014-07-10
  • 2019-09-21
  • 2017-05-29
  • 1970-01-01
  • 2015-08-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多