javascript - angularjs 谷歌地图信息窗口

标签 javascript angularjs google-maps

伙计们,我对来自 Angular Google map 的 InfoWindows 有疑问。 从this可以看出 fiddle (来自 this 问题):

  1. 信息窗口确实出现在标记的底部 --> 非常难看,它应该出现在顶部(与普通的 Google map 信息窗口相同)
  2. 我想要动态“标题”,因此每个信息窗口都应该有基于标记的不同内容 --> 标记的当前地址,稍后可能更多。

我已经在谷歌上搜索了几个小时,很遗憾我没能解决这个问题。非常感谢任何帮助(因为我认为其他人也有这个问题):)。

var myApp = angular.module('app', ['uiGmapgoogle-maps']);

myApp.config(function (uiGmapGoogleMapApiProvider) {
    uiGmapGoogleMapApiProvider.configure({
        key: '',
        v: '3',
        libraries: 'weather,geometry,visualization'
    });
});

myApp.controller('MainCtrl', function ($scope, uiGmapGoogleMapApi, uiGmapIsReady) {
uiGmapGoogleMapApi.then(function (maps) {
    $scope.googlemap = {};
    $scope.map = {
        center: {
            latitude: 37.78,
            longitude: -122.41
        },
        zoom: 14,
        pan: 1,
        options: $scope.mapOptions,
        control: {},
        events: {
            tilesloaded: function (maps, eventName, args) {},
            dragend: function (maps, eventName, args) {},
            zoom_changed: function (maps, eventName, args) {}
        }
    };
});

$scope.windowOptions = {
    show: false
};

$scope.onClick = function (data) {
    $scope.windowOptions.show = !$scope.windowOptions.show;
    console.log('$scope.windowOptions.show: ', $scope.windowOptions.show);
    console.log('This is a ' + data);
    //alert('This is a ' + data);
};

$scope.closeClick = function () {
    $scope.windowOptions.show = false;
};

$scope.title = "Window Title!";

uiGmapIsReady.promise() // if no value is put in promise() it defaults to promise(1)
.then(function (instances) {
    console.log(instances[0].map); // get the current map
})
    .then(function () {
    $scope.addMarkerClickFunction($scope.markers);
});

$scope.markers = [{
    id: 0,
    coords: {
        latitude: 37.7749295,
        longitude: -122.4194155
    },
    data: 'restaurant'
}, {
    id: 1,
    coords: {
        latitude: 37.79,
        longitude: -122.42
    },
    data: 'house'
}, {
    id: 2,
    coords: {
        latitude: 37.77,
        longitude: -122.41
    },
    data: 'hotel'
}];

$scope.addMarkerClickFunction = function (markersArray) {
    angular.forEach(markersArray, function (value, key) {
        value.onClick = function () {
            $scope.onClick(value.data);
            $scope.MapOptions.markers.selected = value;
        };
    });
};


$scope.MapOptions = {
    minZoom: 3,
    zoomControl: false,
    draggable: true,
    navigationControl: false,
    mapTypeControl: false,
    scaleControl: false,
    streetViewControl: false,
    disableDoubleClickZoom: false,
    keyboardShortcuts: true,
    markers: {
        selected: {}
    },
    styles: [{
        featureType: "poi",
        elementType: "labels",
        stylers: [{
            visibility: "off"
        }]
    }, {
        featureType: "transit",
        elementType: "all",
        stylers: [{
            visibility: "off"
        }]
    }],
};

});

最佳答案

我设置了一个 Plunker带有可点击的 Markers,每个标记的顶部都有一个独特的 infoWindow

这是JS:

angular.module('mapApp', []);

angular
    .module('mapApp')
    .controller('MapController', MapController);

function MapController(){

    var map = null;
    var locations = [];
    var icon = "http://maps.google.com/mapfiles/ms/icons/blue-dot.png";

    //markers array
    var markers = {"points" :[
        {"name" : "point1", "geo" : { "coordinates" : [ 52.483, 30 ],  "type" : "Point" } },
        {"name" : "point2", "geo" : { "coordinates" : [ 42.483, 26.084 ],  "type" : "Point" } },
        {"name" : "point3", "geo" : { "coordinates" : [ 32.483, 16.084 ],  "type" : "Point" } }
    ]};


    initMap();

    function initMap() {
        var map = new google.maps.Map(document.getElementById('map'), {
            zoom: 3,
            center: new google.maps.LatLng(32.483, 16.084)
        });

        for (var i = 0; i < markers.points.length; i++) {
            var currMarker = markers.points[i];
            var contentString =
                '<p><b>Name</b>: ' + currMarker.name + '</br>' +
                '<b>Type</b>: ' + currMarker.geo.type + '</br>' +
                '<b>Lat</b>: ' + currMarker.geo.coordinates[0] + '</br>' +
                '<b>Long</b>: ' + currMarker.geo.coordinates[1] +
                '</p>';

            // Converts each of the JSON records into Google Maps Location format (Note [Lat, Lng] format).
            locations.push({
                latlon: new google.maps.LatLng(currMarker.geo.coordinates[1], currMarker.geo.coordinates[0]),
                message: new google.maps.InfoWindow({
                    content: contentString,
                    maxWidth: 320
                }),
                username: currMarker.name,
                type: currMarker.geo.type
            });
        }

        // Loop through each location in the array and place a geometry
        locations.forEach(function (n) {
            console.log(n);
            var marker = new google.maps.Marker({
                position: n.latlon,
                map: map,
                icon: icon
            });

            // For each marker created, add a listener that checks for clicks
            google.maps.event.addListener(marker, 'click', function () {
                // When clicked, open the selected marker's message
                n.message.open(map, marker);
            });

        });
    }
}

希望我对您有所帮助。

关于javascript - angularjs 谷歌地图信息窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39399576/

相关文章:

javascript - 背景图片未出现在 Highcharts 中

Javascript 类 + 属性不遵守它们的值

html - 如何使用 AngularJS 制作模态消息框?

javascript - 如何合并两个 Angular Controller

javascript - Google map API - 以客户当前位置为中心的 map

javascript - 在 jQuery 中使用命名函数作为 $.getJSON 的回调来满足 Facebook 请求签名需求

javascript - 如何在不创建单独的 id 的情况下对多个项目使用一个函数?

angularjs - 多个 Protractor 套件未在 chrome 上运行

php - 获取 Google API 数据时 cURL 不起作用

php - 谷歌地图、PHP 和 MySQL : Create multiple markers on map using various options together