Изменить маркеры различных наборов данных map.data.loadGeo Json в google maps api 3 - PullRequest
0 голосов
/ 08 января 2020

У меня есть два разных набора данных geo json, и я хочу, чтобы один из маркеров набора данных был установлен на один пользовательский значок, а другой набор данных был установлен на другой пользовательский значок.

Как бы я go сделал это?

Вот мой код.

var map;
var infowindow = new google.maps.InfoWindow();

function initialize() {
    // Create a simple map.
    map = new google.maps.Map(document.getElementById('map2'), {
        zoom: 6,
        center: {lat: 53.939480, lng: -116.847401},
        mapTypeControlOptions: {
          mapTypeIds: ['roadmap', 'satellite', 'hybrid', 'terrain',
                  'styled_map']
        }
    });


    map.mapTypes.set('styled_map', styledMapType);
    map.setMapTypeId('styled_map'); //geo json

    google.maps.event.addListener(map, 'click', function() {
      infowindow.close();
    });

    // Load the associated GeoJSON
    var url = 'https://north-river.s3.us-east-2.amazonaws.com/Active.geojson';
    var url2 ='https://north-river.s3.us-east-2.amazonaws.com/Pipelines.geojson'
    map.data.loadGeoJson(url);
    map.data.loadGeoJson(url2);

  // Set event listener for each feature.
  map.data.addListener('click', function(event) {
     infowindow.setContent(
       "<table>"+
       "<tbody>"+"<th>Name:</th>" + "<td>" + event.feature.getProperty('Name') + "</td>" + "</tbody>" +
       "<tbody>"+"<th>Status:</th>" + "<td>" + event.feature.getProperty('Status') + "</td>" + "</tbody>" +
       "<tbody>"+"<th>Lat_DMS:</th>" + "<td>" + event.feature.getProperty('Lat_DMS') + "</td>" + "</tbody>" 


       );
     infowindow.setPosition(event.latLng);
     infowindow.setOptions({pixelOffset: new google.maps.Size(0,-34)});
     infowindow.open(map);
  });
}
google.maps.event.addDomListener(window, 'load', initialize);

Ответы [ 2 ]

1 голос
/ 08 января 2020

Используйте отдельные Данные слои для каждого файла, каждый с соответствующей функцией стиля для этого слоя:

  // Load the associated GeoJSON
  var url = 'https://north-river.s3.us-east-2.amazonaws.com/Active.geojson';
  var url2 = 'https://north-river.s3.us-east-2.amazonaws.com/Pipelines.geojson'

  var layer1 = new google.maps.Data();
  layer1.loadGeoJson(url);
  layer1.setStyle(function(feature) {
    return /** @type {!google.maps.Data.StyleOptions} */({
      icon: "http://maps.google.com/mapfiles/ms/micons/blue.png"});
  });
  layer1.setMap(map);
  var layer2 = new google.maps.Data();
  layer2.loadGeoJson(url2);
  layer2.setStyle(function(feature) {
    return /** @type {!google.maps.Data.StyleOptions} */({
      icon: "http://maps.google.com/mapfiles/ms/micons/green.png"});
  });
  layer2.setMap(map);

подтверждение концепции скрипта

screenshot of resulting map

var map;
var infowindow = new google.maps.InfoWindow();

function initialize() {
  // Create a simple map.
  map = new google.maps.Map(document.getElementById('map2'), {
    zoom: 6,
    center: {
      lat: 57.64206,
      lng: -122.494374
    },
    mapTypeControlOptions: {
      mapTypeIds: ['roadmap', 'satellite', 'hybrid', 'terrain',
        'styled_map'
      ]
    }
  });
  google.maps.event.addListener(map, 'center_changed', function() {
    console.log(map.getCenter().toUrlValue(6));
  });

  //  map.mapTypes.set('styled_map', styledMapType);
  //  map.setMapTypeId('styled_map'); //geo json

  google.maps.event.addListener(map, 'click', function() {
    infowindow.close();
  });

  // Load the associated GeoJSON
  var url = 'https://north-river.s3.us-east-2.amazonaws.com/Active.geojson';
  var url2 = 'https://north-river.s3.us-east-2.amazonaws.com/Pipelines.geojson'
  var layer1 = new google.maps.Data();
  layer1.loadGeoJson(url);
  layer1.setStyle(function(feature) {
    return /** @type {!google.maps.Data.StyleOptions} */ ({
      icon: "http://maps.google.com/mapfiles/ms/micons/blue.png"
    });
  });
  layer1.setMap(map);
  var layer2 = new google.maps.Data();
  layer2.loadGeoJson(url2);
  layer2.setStyle(function(feature) {
    return /** @type {!google.maps.Data.StyleOptions} */ ({
      icon: "http://maps.google.com/mapfiles/ms/micons/green.png"
    });
  });
  layer2.setMap(map);
  // Set event listener for each feature.
  function handleClicks(event) {
    infowindow.setContent(
      "<table>" +
      "<tbody>" + "<th>Name:</th>" + "<td>" + event.feature.getProperty('Name') + "</td>" + "</tbody>" +
      "<tbody>" + "<th>Status:</th>" + "<td>" + event.feature.getProperty('Status') + "</td>" + "</tbody>" +
      "<tbody>" + "<th>Lat_DMS:</th>" + "<td>" + event.feature.getProperty('Lat_DMS') + "</td>" + "</tbody>"


    );
    infowindow.setPosition(event.latLng);
    infowindow.setOptions({
      pixelOffset: new google.maps.Size(0, -34)
    });
    infowindow.open(map);
  }
  layer1.addListener('click', handleClicks);
  layer2.addListener('click', handleClicks);

}
google.maps.event.addDomListener(window, 'load', initialize);
/* Always set the map height explicitly to define the size of the div
 * element that contains the map. */

#map2 {
  height: 100%;
}


/* Optional: Makes the sample page fill the window. */

html,
body {
  height: 100%;
  margin: 0;
  padding: 0;
}
<div id="map2"></div>
<!-- Replace the value of the key parameter with your own API key. -->
<script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyCkUOdZ5y7hMm0yrcCQoCvLwzdM6M8s5qk"></script>
0 голосов
/ 08 января 2020

Кажется, это работает, но я не уверен, какое решение лучше, однако с этим решением мой обработчик кликов для информационного окна все еще работает

map.data.setStyle(function(feature) {
    var marker = feature.getProperty('Status');
    var markerCheck = marker === 'Active' ? 'https://cdn.mapmarker.io/api/v1/font-awesome/v5/pin?text=P&size=40&background=D94B43&color=FFF&hoffset=-1' : 'https://cdn.mapmarker.io/api/v1/font-awesome/v5/icon?icon=fa-star-solid&size=50&color=DC4C3F';
    var colorCheck = marker === 'Active' ? "#0000FF" : "#000000";
    return {
      icon: markerCheck,
      strokeColor: colorCheck
    };
  });
...