将数据库中的标记加载为可切换图层

时间:2016-03-31 11:46:09

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

我正在尝试将数据库中的标记作为图层加载到我的谷歌地图中。我已经加载了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);
      }
    }

1 个答案:

答案 0 :(得分:1)

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

  

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

     

返回值:Array<Data.Feature>

     

将GeoJSON功能添加到集合中。为此方法提供已解析的JSON。将返回导入的功能。如果无法导入GeoJSON,则会引发异常。

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

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

proof of concept fiddle

代码段

&#13;
&#13;
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);
&#13;
html,
body,
#map {
  height: 100%;
  width: 100%;
  margin: 0px;
  padding: 0px
}
&#13;
<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>
&#13;
&#13;
&#13;