【问题标题】:Custom overlay map types and mapTypeControl自定义叠加地图类型和 mapTypeControl
【发布时间】:2012-08-17 21:56:05
【问题描述】:

我已成功地将 OSM 作为一种新的基本地图类型添加到我的 Google Maps API 应用程序中。

接下来我添加了一个新的叠加地图类型,它为地图添加了山体阴影。 https://developers.google.com/maps/documentation/javascript/maptypes?hl=en#OverlayMapTypes 上有关叠加地图类型的文档说:

“[...]您可以将地图类型添加到现有的 MapType[...]”

“叠加地图类型将显示在它们所附着的任何底图之上。”

并且“以下示例与上一个示例相同,只是我们在 ROADMAP 地图类型之上创建了一个瓦片叠加 MapType:”

但在代码示例中,叠加地图类型始终显示在您选择的任一地图类型上。

  1. 如何使我的山体阴影叠加地图类型仅显示在地图类型“路线图”和我的自定义“OSM”地图类型上? 编辑:更准确地说:实际上我想知道,是否有一种方法可以像上面的文档建议的那样自动执行此操作。我知道,如何通过监听 maptypeid_changed 事件手动执行此操作。

  2. 有没有办法将我的叠加地图类型作为复选框添加到 mapTypeControl,就像在默认卫星地图类型上使用“标签”或在路线图地图类型上使用“地形”一样? 编辑:直到几天前,上面的官方文档提出了一种方法来做到这一点,但没有准确描述它并且链接的示例被破坏(404-link)。你的用户在这里发现了同样的问题:Google maps api: Customising the MapTypeControl for separate map overlays

编辑: 我已经在下面发布了我当前解决方案的 jsFiddl。

【问题讨论】:

  • 我也遇到了同样的问题,但我没有采用 supported 方法来添加我自己的控件,而是实现了一个非常骇人听闻的解决方案,它依赖于当前的 DOM 结构现有的控制。我发布了我的解决方案here,以防有人感兴趣。

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


【解决方案1】:

好吧,似乎没有本地方法可以将叠加地图类型绑定到基本地图类型或使用 Google 的地图类型控件进行叠加地图类型。

这就是我最终所做的,以解决这个问题: http://jsfiddle.net/lejared/720L7wu0/3/

var ReliefCtrl = {/* see fiddle */};

我构建了一个自定义控件(外观与原生 Google 地图控件类似)。此控件切换我的叠加地图类型(山体阴影)。您可以定义适合此叠加地图类型的基本地图类型数组。如果选择了合适的底图类型,控件将自动显示/隐藏自身。

2017-02-01:更新 fiddle 以匹配谷歌地图控件的新原生外观。

【讨论】:

  • 看似简单的事情需要复杂的代码!我注意到部分复杂性是由于额外需要根据基本地图选择性地应用叠加层,这是通用汽车本身无法做到的。感谢您的代码 - 现在继续对它进行 de-jquery
【解决方案2】:

您的问题分为两部分:

  1. 要仅在某些地图类型处于活动状态时自动显示自定义叠加层,您需要监听 map 对象上的 maptypeid_changed 事件。您必须在该事件侦听器中添加/删除叠加层。

  2. 目前无法以分层方式将您自己的叠加层/地图类型添加到默认地图类型控件。更多详情请查看并加注星标:http://code.google.com/p/gmaps-api-issues/issues/detail?id=2490

【讨论】:

  • 1.谢谢。这就是我现在已经在做的事情。我在上面的问题中链接到的页面上的谷歌文档听起来像是有一种方法可以通过将叠加层链接到基本地图类型来自动执行此操作。我希望谷歌员工发表官方声明,看看 doku 是错误的还是当前的 API。我首先在 google 群组中提出了这个问题,但他们已将我重定向到此处,因为他们已将支持移至此处。
  • 这是一个长期存在的问题,但令人惊讶的是,它并没有引起太多关注(正如我所链接的问题上的星数所示)。如果您想从 Google 获得官方答复,您应该将其提交到 Google Maps API Office Hours session。他们在自己的 Google+ 页面上宣布办公时间:plus.google.com/u/0/104063627743574070634/posts
  • 2.是的,看起来好像没有办法 BTW:我认为这点上的doku 几天前已经改变了。我敢肯定,他们提到了一种将覆盖层添加到 mapTypeControl 的方法。相应示例的链接当时已断开。这里的人遇到了同样的问题,发现了同样令人困惑的文档。感谢您的链接,但它不包含任何答案,只是更多的问题。 :-(
  • 这是一个存在于 v2 地图中的功能,但从未在 v3 中实现。您可以随时开发自己的自定义控件。
  • 是的,实际上我已经做到了,并模仿了原始 google 控件的确切样式。但这是一个绝对应该被原生支持的特性,这样每当谷歌改变界面时,控件的感觉就会保持一致(他们已经在 V3 中多次这样做了)。
【解决方案3】:

问题 1.) 我创建了一个示例,其中选择 ROADMAP 您可以查看特定的 overlayMapType(并使用其他模式将其隐藏),复制并粘贴到您的 test.html,查看并享受!希望您可以对其进行编辑以满足您的需求:

<!DOCTYPE html>
<html>
  <head>
    <title>Google Maps JavaScript API v3 Example: Overlay MapTypes</title>
    <link href="https://developers.google.com/maps/documentation/javascript/examples/default.css" rel="stylesheet">
    <script src="https://maps.googleapis.com/maps/api/js?sensor=false"></script>
    <script>

      function CoordMapType(tileSize) {
        this.tileSize = tileSize;
      }

      CoordMapType.prototype.getTile = function(coord, zoom, ownerDocument) {
        var div = ownerDocument.createElement('div');
        div.innerHTML = coord;
        div.style.width = this.tileSize.width + 'px';
        div.style.height = this.tileSize.height + 'px';
        div.style.fontSize = '10';
        div.style.borderStyle = 'solid';
        div.style.borderWidth = '1px';
        div.style.borderColor = '#AAAAAA';
        return div;
      };

      var map;
      var chicago = new google.maps.LatLng(41.850033,-87.6500523);

      function initialize() {
        var mapOptions = {
    zoom: 4,
    center: new google.maps.LatLng(-33, 151),
    mapTypeControl: true,
    mapTypeControlOptions: {
      style: google.maps.MapTypeControlStyle.DROPDOWN_MENU
    },
    zoomControl: true,
    zoomControlOptions: {
      style: google.maps.ZoomControlStyle.SMALL
    },
    mapTypeId: google.maps.MapTypeId.ROADMAP
  }

        map = new google.maps.Map(document.getElementById('map_canvas'),
                                          mapOptions);

        // Insert this overlay map type as the first overlay map type at
        // position 0. Note that all overlay map types appear on top of
        // their parent base map.
        map.overlayMapTypes.insertAt(0, new CoordMapType(new google.maps.Size(256, 256)));

        // we check mapType when it is changing
        google.maps.event.addListener( map, "maptypeid_changed", function( evnt ) {
            if(map.mapTypeId === "roadmap") {
                // show my custom map layer - but only if its not already there
                // note: you could also check more specifily your map type here
                if(map.overlayMapTypes.getLength() == 0) {
                    map.overlayMapTypes.insertAt(0, new CoordMapType(new google.maps.Size(256, 256)));
                }
            } else {
                // if something else, remove it 
                // note: you could also check more specifily your map type here, but for now
                // we just check if something is already there
                if (map.overlayMapTypes.getLength() > 0){
                    map.overlayMapTypes.removeAt(0);
                }
            }
        });     

      }

    </script>
  </head>
  <body onload="initialize()">
    <div id="map_canvas" style="width: 640px; height: 480px;">map div</div>
  </body>
</html>

问题 2.) 试过了,但不可能(高度保护),改用谷歌自定义地图控件 - 这似乎是唯一的选择:(

https://developers.google.com/maps/documentation/javascript/controls#CustomControls

编辑:

您是否尝试过将 google 路线图类型添加为自己的基础层,这样您就可以像本示例中那样给它自己的名称(查看右上角的选择):https://google-developers.appspot.com/maps/documentation/javascript/examples/maptype-base?hl=fi 然后您将添加叠加地图(就像在我的示例中一样)在您显示 CoordMapType 网格(或您想要的覆盖图)的那个谷歌地图上。这样你就不会得到那个复选框,但至少你可以用自己的选择和名称在普通的谷歌地图控制器中查看它?我现在没有时间测试这个理论,因为我在工作,哈哈。 :)

但基本上你可以完成然后下拉菜单在哪里

  1. 地图(谷歌路线图)
  2. 我的图层(谷歌路线图,您的叠加地图在哪里,或多个)?

或者,您可以尝试使用 console.log(map);并尝试找到更多的方法,而不仅仅是:

CoordMapType.prototype.name = 'My base layer';
CoordMapType.prototype.alt = 'My base layer map type';

..如果这已经创建为基础层选择,则可能在某个地方隐藏了该复选框选项。那些复选框的东西必须总是覆盖地图选择切换。

【讨论】:

  • 感谢您的代码,但这不是我想要的。请查看我的编辑并对其他答案发表评论。我会再等一天,让谷歌官方回答表格来消除文档上的困惑。否则,如果有其他人遇到同样的问题,我会奖励你编写这个有用的示例代码。
  • ok @LeJared 我更新了我的答案,但这可能是最接近的答案
猜你喜欢
  • 2011-09-04
  • 1970-01-01
  • 2015-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多