使用Google Maps JavaScript API v3和Geocoding API映射多个位置

时间:2015-04-05 22:55:17

标签: javascript google-maps google-maps-api-3 google-geocoder google-geocoding-api

我正在使用Google Maps JavaScript API v3生成包含多个位置/标记的地图。我只有这些位置的地址,而不是坐标,所以我使用地理编码API来获取坐标。

我终于让Google的地理编码工作了,所以位置标记显示在它们应该是的位置。但是,每个InfoWindow中都会显示相同的内容。我好像无法将位置数组传递给地理编码功能。 (顺便提一下,我也尝试为地理编码结果创建一个变量,并将地理编码功能的infoWindow函数移到之外,但我也无法做到这一点。)

我已经尝试了一百种不同的方法。我希望别人能看到我无法看到的东西。

    var locations = [
        ['Location 1 Name', 'Location 1 Address', 'Location 1 URL'],
        ['Location 2 Name', 'Location 2 Address', 'Location 2 URL'],
        ['Location 3 Name', 'Location 3 Address', 'Location 3 URL']
    ];

    geocoder = new google.maps.Geocoder();

    for (i = 0; i < locations.length; i++) {

        title = locations[i][0];
        address = locations[i][1];
        url = locations[i][2];

        geocoder.geocode({ 'address' : locations[i][1] }, function(results, status) {
          marker = new google.maps.Marker({
              icon: 'marker_blue.png',
              map: map,
              position: results[0].geometry.location,
              title: title,
              animation: google.maps.Animation.DROP,
              address: address,
              url: url
          })
          infoWindow(marker, map, title, address, url);
        })

    }

    function infoWindow(marker, map, title, address, url) {
        google.maps.event.addListener(marker, 'click', function() {
            var html = "<div><h3>" + title + "</h3><p>" + address + "<br></div><a href='" + url + "'>View location</a></p></div>";
            iw = new google.maps.InfoWindow({ content : html, maxWidth : 350});
            iw.open(map,marker);
        });
    }

3 个答案:

答案 0 :(得分:19)

这是google map info window multiple addresses via xml的副本,只是不完全重复。地理编码器是异步的,因此当地理编码器回调运行时,地址的值是从循环结束开始的所有调用。

答案是一样的:最简单的解决方案是使用函数闭包将对地理编码器的调用与返回的结果相关联:

function geocodeAddress(locations, i) {
    var title = locations[i][0];
    var address = locations[i][1];
    var url = locations[i][2];
    geocoder.geocode({
        'address': locations[i][1]
    },

    function (results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
            var marker = new google.maps.Marker({
                icon: 'http://maps.google.com/mapfiles/ms/icons/blue.png',
                map: map,
                position: results[0].geometry.location,
                title: title,
                animation: google.maps.Animation.DROP,
                address: address,
                url: url
            })
            infoWindow(marker, map, title, address, url);
            bounds.extend(marker.getPosition());
            map.fitBounds(bounds);
        } else {
            alert("geocode of " + address + " failed:" + status);
        }
    });
}

Working fiddle

代码段:

var locations = [
  ['Location 1 Name', 'New York, NY', 'Location 1 URL'],
  ['Location 2 Name', 'Newark, NJ', 'Location 2 URL'],
  ['Location 3 Name', 'Philadelphia, PA', 'Location 3 URL']
];

var geocoder;
var map;
var bounds = new google.maps.LatLngBounds();

function initialize() {
  map = new google.maps.Map(
    document.getElementById("map_canvas"), {
      center: new google.maps.LatLng(37.4419, -122.1419),
      zoom: 13,
      mapTypeId: google.maps.MapTypeId.ROADMAP
    });
  geocoder = new google.maps.Geocoder();

  for (i = 0; i < locations.length; i++) {


    geocodeAddress(locations, i);
  }
}
google.maps.event.addDomListener(window, "load", initialize);

function geocodeAddress(locations, i) {
  var title = locations[i][0];
  var address = locations[i][1];
  var url = locations[i][2];
  geocoder.geocode({
      'address': locations[i][1]
    },

    function(results, status) {
      if (status == google.maps.GeocoderStatus.OK) {
        var marker = new google.maps.Marker({
          icon: 'http://maps.google.com/mapfiles/ms/icons/blue.png',
          map: map,
          position: results[0].geometry.location,
          title: title,
          animation: google.maps.Animation.DROP,
          address: address,
          url: url
        })
        infoWindow(marker, map, title, address, url);
        bounds.extend(marker.getPosition());
        map.fitBounds(bounds);
      } else {
        alert("geocode of " + address + " failed:" + status);
      }
    });
}

function infoWindow(marker, map, title, address, url) {
  google.maps.event.addListener(marker, 'click', function() {
    var html = "<div><h3>" + title + "</h3><p>" + address + "<br></div><a href='" + url + "'>View location</a></p></div>";
    iw = new google.maps.InfoWindow({
      content: html,
      maxWidth: 350
    });
    iw.open(map, marker);
  });
}

function createMarker(results) {
  var marker = new google.maps.Marker({
    icon: 'http://maps.google.com/mapfiles/ms/icons/blue.png',
    map: map,
    position: results[0].geometry.location,
    title: title,
    animation: google.maps.Animation.DROP,
    address: address,
    url: url
  })
  bounds.extend(marker.getPosition());
  map.fitBounds(bounds);
  infoWindow(marker, map, title, address, url);
  return marker;
}
html,
body,
#map_canvas {
  height: 100%;
  width: 100%;
  margin: 0px;
  padding: 0px
}
<script src="https://maps.googleapis.com/maps/api/js"></script>
<div id="map_canvas" style="border: 2px solid #3872ac;"></div>

答案 1 :(得分:1)

步骤-1

首先,您必须为此创建地图位置,例如,您要在哪里添加此地图在您的网络应用上。因此,首先要创建JSP / HTML / ASP页面,您必须在其中创建要显示地图的位置。

<div id="map_canvas" style="width: 1350px; height: 500px"></div>

步骤-2

下面我编写脚本,您可以使用该脚本在Web应用程序上查看地图。

<script src="https://maps.googleapis.com/maps/api/js"></script>
<script type="text/javascript"
src="http://maps.google.com/maps/api/js?sensor=TRUEORFALSE"></script>
<script type="text/javascript">
var map;
var markers;
function initialize() {

    $
            .ajax({

                type : "POST",
                url : "Your Servlet Name", //Servlet Name
                data : $("#FormID"),

                success : function(responseJson) {


                    var result = $.parseJSON(responseJson);
                    markers = result;

                    // Below mapOptions var includes styling maps and zoom level of your map, it also includes mapTypeId.
                    var mapOptions = {
                        center : new google.maps.LatLng(
                                markers[0].latitude, markers[0].longitude),
                        zoom : 5,
                        scrollwheel: false, 
                        styles : [ {
                            "featureType" : "administrative",
                            "elementType" : "labels.text.fill",
                            "stylers" : [ {
                             "color" : "#444444"
                            } ]
                           }, {
                            "featureType" : "landscape",
                            "elementType" : "all",
                            "stylers" : [ {
                             "color" : "#f2f2f2"
                            } ]
                           }, {
                            "featureType" : "poi",
                            "elementType" : "all",
                            "stylers" : [ {
                             "visibility" : "off"
                            } ]
                           }, {
                            "featureType" : "poi.park",
                            "elementType" : "geometry.fill",
                            "stylers" : [ {
                             "visibility" : "on"
                            }, {
                             "color" : "#1ba093"
                            } ]
                           }, {
                            "featureType" : "road",
                            "elementType" : "all",
                            "stylers" : [ {
                             "saturation" : -100
                            }, {
                             "lightness" : 45
                            } ]
                           }, {
                            "featureType" : "road.highway",
                            "elementType" : "all",
                            "stylers" : [ {
                             "visibility" : "simplified"
                            } ]
                           }, {
                            "featureType" : "road.arterial",
                            "elementType" : "labels.icon",
                            "stylers" : [ {
                             "visibility" : "off"
                            } ]
                           }, {
                            "featureType" : "transit",
                            "elementType" : "all",
                            "stylers" : [ {
                             "visibility" : "off"
                            } ]
                           }, {
                            "featureType" : "water",
                            "elementType" : "all",
                            "stylers" : [ {
                             "color" : "#00748c"
                            }, {
                             "visibility" : "on"
                            } ]
                           } ],
                        mapTypeId : google.maps.MapTypeId.ROADMAP
                    };
                    map = new google.maps.Map(document
                            .getElementById("map_canvas"), mapOptions);
                    addYourLocationButton(map,marker);  
                    //Create and open InfoWindow.
                    var infoWindow = new google.maps.InfoWindow();                      

                    for (var i = 0; i < markers.length; i++) {
                        var data = markers[i];

                        var myLatlng = new google.maps.LatLng(
                                data.latitude, data.longitude);
                        var marker = new google.maps.Marker({
                            position : myLatlng,
                            animation: google.maps.Animation.DROP,
                            map : map,
                            title : //Any title that you want to display while cursor over the marker.
                        });

                        //Click event 
                        (function(marker, data) {
                            google.maps.event
                                    .addListener(
                                            marker,
                                            "click",
                                            function(e) {                                                   
                                                infoWindow
                                                        .setContent("<div style = 'width:300px;min-height:50px'>+Write information about your location if you want.+"</div>");
                                                infoWindow
                                                        .open(map, marker);
                                            });
                        })(marker, data);

                    }

                }

            });

}

答案 2 :(得分:0)

function buildMapWithMultipleBuyerLocations(buyerLocations) {
  const infowindow = new google.maps.InfoWindow();
  const geocoder = new google.maps.Geocoder();
  const map = new google.maps.Map(document.getElementById('map'), {
    zoom: 13,
    center: new google.maps.LatLng(-23.5489, -46.6388),
    mapTypeId: google.maps.MapTypeId.ROADMAP,
  });

  let latAverage = 0;
  let lngAverage = 0;
  buyerLocations.forEach(function(buyerLocation, index) {
    geocoder.geocode({'address': buyerLocation.location}, function(results, status) {
      if (status == google.maps.GeocoderStatus.OK) {
        const latitude = results[0].geometry.location.lat();
        const longitude = results[0].geometry.location.lng();
        // calc center of map by each
        if (index === 0) {
          latAverage = latitude;
          lngAverage = longitude;
        } else {
          latAverage = ((latAverage + latitude) / 2);
          lngAverage = ((lngAverage + longitude) / 2);
        }

        map.setCenter(new google.maps.LatLng(latAverage, lngAverage));

        setLocation(map, infowindow, longitude, latitude);
      }
    });
  });
}

function setLocation(map, infowindow, longitude, latitude) {
  const marker = new google.maps.Marker({
    position: new google.maps.LatLng(latitude, longitude),
    map: map,
  });

  google.maps.event.addListener(
    marker,
    'click',
    (function (marker) {
      return function () {
        infowindow.setContent(buyerLocation.location)
        infowindow.open(map, marker)
      };
    })(marker)
  );
}

const response = {
  data: {
    buyerLocations: [
      {
        id: 2,
        location: 'Setor D Sul QSD 37 - Taguatinga, Brasília - DF, Brasil',
        addressDetails: 'Casa da leia',
        street: '',
        zipcode: '72020-370',
        city: 'Brasília',
        state: 'DF',
        name: 'love',
        responsibleDelivery: {
          name: 'Ruan Herculano',
          email: 'ruannawe95@gmail.com',
          phoneNumber: '(61) 98125-7366'
        }
      },
      {
        id: 1,
        location: 'Setor E Sul QSE 19 - Taguatinga, Brasília - DF, Brasil',
        addressDetails: '',
        street: '',
        zipcode: '',
        city: '',
        state: '',
        name: 'Setor E Sul QSE 19 - Taguatinga, Brasília - DF, Brasil'
      }
    ]
  }
}

const { data } = response;
const { buyerLocations } = data;
buildMapWithMultipleBuyerLocations(buyerLocations);
<script
type="text/javascript"
src="https://maps.googleapis.com/maps/api/js?key=AIzaSyCTrSO0GAJbjDBLmxR3xOl-GjpNOUacrw0&libraries=places">
</script>
<div id="#map"></div>