【问题标题】:Load markers from database as a toggleable layer从数据库加载标记作为可切换层
【发布时间】:2016-03-31 11:46:09
【问题描述】:

我正在尝试将数据库中的标记作为图层加载到我的谷歌地图。我已经在加载 KML 图层,但我希望用户能够在我的数据库中保存和加载他们自己的自定义标记。

我的数据库结构如下:

| ID | TITLE | LAT | LON |

由于每个用户都有自己的自定义点,我想获取用户的点并将它们加载为地图上的一个图层以及其他默认图层 (KML)。我读到创建数据层将是最好的方法,并且还使用我仍然不知道如何从我的数据库创建的 geoJSON。

目前,我使用通用 json 文件只是为了查看是否可以将其添加为可切换层,但我无法正确处理。一旦我开始工作,我就可以弄清楚如何从数据库中获取结果并将其格式化为 geoJSON 并添加到地图中。

这就是我尝试将 json 数据作为可切换层获取的方式,但它不起作用:

function initMap() {
  map = new google.maps.Map(document.getElementById('map'), {
    center: {lat: -49.7770641, lng: 55.6602758},
    zoom: 6,
    mapTypeControlOptions: {
         position: google.maps.ControlPosition.RIGHT_TOP
      },

  });

    layers[0] = new google.maps.KmlLayer('http://www.example.com/kmllayer1.kml', {preserveViewport: true, suppressInfoWindows: false, zIndex: 1});
    layers[1] = new google.maps.KmlLayer('http://www.example.com/kmllayer2.kml', {preserveViewport: true, zIndex: 2, suppressInfoWindows: true});
    layers[2] = map.data.loadGeoJson('https://storage.googleapis.com/maps-devrel/google.json');
    for (var i = 0; i < layers.length; i++) {
        layers[i].setMap(map);
      }
}
function toggleLayer(i) {
      if(layers[i].getMap() === null) {
        layers[i].setMap(map);
      }
      else {
        layers[i].setMap(null);
      }
    }

【问题讨论】:

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


    【解决方案1】:

    数据层与KmlLayer不同,.loadGeoJson方法返回一个Data.Feature对象数组。来自the documentation

    addGeoJson(geoJson:Object, options?:Data.GeoJsonOptions)

    返回值:Array&lt;Data.Feature&gt;

    将 GeoJSON 功能添加到集合中。给这个方法一个解析的 JSON。返回导入的特征。如果无法导入 GeoJSON,则引发异常。

    像这样将它添加到您的图层数组中(注意只有一个):

    layers[2] = map.data;
    layers[2].loadGeoJson(GEOJSON_URL);
    

    proof of concept fiddle

    代码 sn-p:

    var geocoder;
    var map;
    var layers = [];
    
    function toggleLayer(i) {
      if (layers[i].getMap() === null) {
        layers[i].setMap(map);
      } else {
        layers[i].setMap(null);
      }
    }
    
    function initMap() {
      map = new google.maps.Map(document.getElementById('map'), {
        center: {
          lat: 43,
          lng: -87
        },
        zoom: 4,
        mapTypeControlOptions: {
          position: google.maps.ControlPosition.RIGHT_TOP
        },
    
      });
    
      layers[0] = new google.maps.KmlLayer('http://googlemaps.github.io/js-v2-samples/ggeoxml/cta.kml', {
        preserveViewport: true,
        suppressInfoWindows: false,
        zIndex: 2
      });
      layers[1] = new google.maps.KmlLayer('https://developers.google.com/kml/documentation/us_states.kml', {
        preserveViewport: true,
        zIndex: 1,
        suppressInfoWindows: true
      });
      layers[2] = map.data;
      layers[2].loadGeoJson('http://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/2.5_week.geojson');
      for (var i = 0; i < layers.length; i++) {
        layers[i].setMap(map);
      }
      var btns = document.getElementsByClassName("btn");
      for (var i = 0; i < btns.length; i++) {
        google.maps.event.addDomListener(btns[i], 'click', (function(i) {
          return function() {
            toggleLayer(i);
          }
        })(i));
      }
    }
    
    google.maps.event.addDomListener(window, "load", initMap);
    html,
    body,
    #map {
      height: 100%;
      width: 100%;
      margin: 0px;
      padding: 0px
    }
    <script src="https://maps.googleapis.com/maps/api/js"></script>
    <input class="btn" id="btn0" type="button" value="0" />
    <input class="btn" id="btn1" type="button" value="1" />
    <input class="btn" id="btn2" type="button" value="2" />
    <div id="map"></div>

    【讨论】:

    • 完美运行!我知道我的错误在哪里。感谢您抽出宝贵时间回答并提供 sn-p,非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-18
    • 2014-04-28
    • 2014-05-25
    • 2012-07-24
    • 1970-01-01
    • 2015-12-01
    相关资源
    最近更新 更多