コード例 #1
0
ファイル: map.js プロジェクト: iliuta/strava-client
function StravaMap(infoWindowCompiler) {

    // events
    let onSelectActivity = null;
    let onPhotoClick = null;
    let onRouteFound = null;

    // local vars
    let internalMap = L.map('map-canvas', {
        center: [39.73, -104.99],
        zoom: 8,
        layers: [runBikeHike]
    });
    L.control.layers(baseMaps).addTo(internalMap);

    let photosLayerGroup = null;

    let activityPopup = L.popup();

    setTimeout(function() {
        activityPopup.setContent(infoWindowCompiler());
    });

    let polylinesLayerGroup = null;

    let routingControl = Routing.control(
        {
            waypoints: [],
            lineOptions: {
                styles: [
                    {color: 'black', opacity: 0.15, weight: 9},
                    {color: 'white', opacity: 0.8, weight: 6},
                    {color: 'yellow', opacity: 1, weight: 2}
                ]
            },
            router: new Routing.OSRMv1({
                serviceUrl: '//router.project-osrm.org/route/v1',
                timeout: 30 * 1000,
                routingOptions: {}
            }),
            geocoder: Geocoder.nominatim()
        }
    );

    routingControl.on("routeselected", function (e) {
        if (onRouteFound) {
             // every time a route is found, save its coordinates to create gpx file
             // gpxTrack is about all coordinates of the selected route
             let gpxTrck = e.route.coordinates;
             // gpxRoute is about the coordinates of the crossings, taken from the cue sheet (instructions)
             let gpxRoute = [];
             e.route.instructions.forEach(function (instruction) {
                 gpxRoute.push(e.route.coordinates[instruction.index]);
             });
             onRouteFound(gpxTrck, gpxRoute);
        }
    });

    function createRoutePlannerButton(label, container) {
        var btn = L.DomUtil.create('button', '', container);
        btn.setAttribute('type', 'button');
        btn.innerHTML = label;
        return btn;
    }

    // hack to prevent click/dblclick weird behaviour
    let routePlannerMapOnDblClick = function (event) {
        internalMap.clicked = 0;
        internalMap.zoomIn();
    };

    let routePlannerMapOnClick = function (e) {
        // hack to prevent click/dblclick weird behaviour
        if (!internalMap.clicked) {
            internalMap.clicked = 0;
        }
        internalMap.clicked = internalMap.clicked + 1;
        setTimeout(function () {
            if (internalMap.clicked == 1) {
                // at first click display a popup
                if (!routingControl.getWaypoints()[0].latLng) {
                    let container = L.DomUtil.create('div');
                    let startBtn = createRoutePlannerButton('Start route from this location', container);

                    L.DomEvent.on(startBtn, 'click', function () {
                        routingControl.spliceWaypoints(0, 1, e.latlng);
                        internalMap.closePopup();
                    });

                    L.popup()
                        .setContent(container)
                        .setLatLng(e.latlng)
                        .openOn(internalMap);

                } else if (routingControl.getWaypoints().length == 2 && !routingControl.getWaypoints()[1].latLng) {
                    // then fill the coords of the last waypoint
                    routingControl.spliceWaypoints(routingControl.getWaypoints().length - 1, 1, e.latlng);
                } else {
                    // then add the new waypoint to the end
                    var lastWaypoint = routingControl.getWaypoints()[routingControl.getWaypoints().length - 1].latLng;
                    routingControl.spliceWaypoints(routingControl.getWaypoints().length - 1, 1, lastWaypoint, e.latlng);
                }
                internalMap.clicked = 0;
            }
        }, 300);
    };

    function drawActivityPolylineOnMap(activity) {
        if (!activity.map.summary_polyline) {
            console.log(activity.name);
            return null;
        } else {
            var decodedPath = L.Polyline.fromEncoded(activity.map.summary_polyline);

            var osmPath = L.polyline(decodedPath.getLatLngs(), {color: '#FF0000', weight: 2}).addTo(internalMap);

            osmPath.bindPopup(activityPopup);

            osmPath.addEventListener('mouseover',
                function (event) {
                    osmPath.setStyle({color: 'blue', weight: 7});
                });


            osmPath.addEventListener('mouseout',
                function () {
                    osmPath.setStyle({color: '#FF0000', weight: 2});
                });

            osmPath.addEventListener('click',
                function (event) {
                    if (onSelectActivity) {
                        onSelectActivity(activity);
                    }
                    activityPopup.setContent(infoWindowCompiler());
                    activityPopup.setLatLng(event.latlng);
                });


            return osmPath;
        }
    }

    this.invalidateMapSize = function() {
        internalMap.invalidateSize();
    }

    this.drawActivities = function (activities) {
        if (photosLayerGroup) {
            photosLayerGroup.clearLayers();
        }
        if (polylinesLayerGroup) {
            polylinesLayerGroup.clearLayers();
        }

        let bounds = null;

        polylinesLayerGroup = L.layerGroup();
        polylinesLayerGroup.addTo(internalMap);

        activities.forEach(function (activity) {
            var polyline = drawActivityPolylineOnMap(activity);
            if (polyline) {
                if (!bounds) {
                    bounds = polyline.getBounds();
                } else {
                    bounds.extend(polyline.getBounds());
                }
                polylinesLayerGroup.addLayer(polyline);
            }
        });

        if (bounds) {
            internalMap.fitBounds(bounds);
            internalMap.panInsideBounds(bounds);
        }
    };

    this.drawPhotos = function (photos) {
        if (!photosLayerGroup) {
            photosLayerGroup = L.layerGroup();
            photosLayerGroup.addTo(internalMap);
        }

        photos.forEach(function (photo) {
            if (photo.location && photo.location.length == 2) {
                var photoLatLng = new L.latLng(photo.location[0], photo.location[1]);

                var photoUrl = photo.urls[300];

                var image = L.icon({
                    iconUrl: photoUrl,
                    iconSize: [50, 50],
                    iconAnchor: [0, 32]
                });

                var marker = L.marker(photoLatLng, {
                    riseOnHover: true,
                    title: photoUrl,
                    icon: image
                });

                marker.addEventListener('click', function () {
                    if (onPhotoClick) {
                        onPhotoClick(photoUrl, photo);
                    }
                });
                photosLayerGroup.addLayer(marker);
                marker.addTo(internalMap);
            }
        });
    };

    this.on = function(eventName, handler) {
        if (eventName === 'selectActivity') {
            onSelectActivity = handler;
        } else if (eventName === 'photoClick') {
            onPhotoClick = handler;
        } else if (eventName === 'routeFound') {
            onRouteFound = handler;
        }
        return this;
    };


    this.displayRoutePlanner = function() {
        routingControl.addTo(internalMap);
        internalMap.on("dblclick", routePlannerMapOnDblClick);
        internalMap.on("click", routePlannerMapOnClick);
    };

    this.hideRoutePlanner = function() {
        routingControl.remove();
        internalMap.off("dblclick", routePlannerMapOnDblClick);
        internalMap.off("click", routePlannerMapOnClick);
     };

    this.resetRoutePlanner = function() {
       routingControl.spliceWaypoints(0, routingControl.getWaypoints().length);
    };


};
コード例 #2
0
    constructor($scope, $timeout) {
        'ngInject';
        //Map / attraction list load here

        //Assuming that call to webapi will generate a route in format similar to the one below
        var resultsList = [[{"id": 21, "lat": 1.302503, "lng": 103.857983}, {"id": 16, "lat": 1.307792, "lng": 103.852583}, {"id": 3, "lat": 1.339988, "lng": 103.833401}, {"id": 1, "lat": 1.361516, "lng": 103.835812}, {"id": 39, "lat": 1.311125, "lng": 103.814733}, {"id": 34, "lat": 1.30351, "lng": 103.833056}, {"id": 17, "lat": 1.313351, "lng": 103.855794}, {"id": 35, "lat": 1.307745, "lng": 103.851086}], [{"id": 33, "lat": 1.28633, "lng": 103.852932}, {"id": 31, "lat": 1.279464, "lng": 103.849946}, {"id": 5, "lat": 1.2816209, "lng": 103.844377}, {"id": 41, "lat": 1.277307, "lng": 103.837311}, {"id": 15, "lat": 1.271026, "lng": 103.819773}, {"id": 8, "lat": 1.304586, "lng": 103.839427}, {"id": 22, "lat": 1.292935, "lng": 103.849662}, {"id": 12, "lat": 1.290154, "lng": 103.844846}, {"id": 26, "lat": 1.301016, "lng": 103.845411}], [{"id": 10, "lat": 1.289857, "lng": 103.8552799}, {"id": 24, "lat": 1.280635, "lng": 103.87159}, {"id": 2, "lat": 1.281744, "lng": 103.867383}, {"id": 30, "lat": 1.303091, "lng": 103.859858}, {"id": 23, "lat": 1.303746, "lng": 103.901182}, {"id": 38, "lat": 1.31451, "lng": 103.901022}, {"id": 14, "lat": 1.300191, "lng": 103.857614}]];

        /*$http({
            method: 'POST',
            url: "http://188.166.230.3:8080/TripEngine/TripEngine",
            data: {
                "cashFlow": 500,
                "travelDays": 3,
                "startTime": 800,
                "endTime": 2230,
                "startAddress": 45,
                "endAddress": 45,
                "mustGo": []
            }
        }).then(function(result){
            console.log(result);
        }, function(){
            console.log("error occured");
        });*/
        L.Icon.Default.imagePath = 'packages/bevanhunt_leaflet/images';
        var map = L.map('google-map', {zoomControl: true}).setView([1.290270, 103.851959], 14);
        L.tileLayer('http://api.tiles.mapbox.com/v4/mapbox.streets/{z}/{x}/{y}.png?access_token=pk.eyJ1IjoieWlzaDkxIiwiYSI6ImNpb3Y0OGR5ODAwdmd0aG00eHlreW14eHMifQ.LV7N1cFaD4ll27UrYUllyQ', {
            maxZoom: 18,
            id: 'mapbox.streets',
            accessToken: 'pk.eyJ1IjoieWlzaDkxIiwiYSI6ImNpb3Y0OGR5ODAwdmd0aG00eHlreW14eHMifQ.LV7N1cFaD4ll27UrYUllyQ',
            detectRetina: true
        }).addTo(map);
        map.zoomControl.setPosition('bottomleft');
        
        var resultArr = resultsList[0];
        var latlngArray = [];

        for (var i = 0; i < resultArr.length; i++){
            if(resultArr[i]) {
                var ltln = L.latLng(resultArr[i].lat, resultArr[i].lng);
                latlngArray.push(ltln);
            }
        }
        var control = LeafletRouting.control({
            draggableWaypoints: false,
            addWaypoints: false,
            routeWhileDragging: false,
            show: false,
            plan: LeafletRouting.plan(latlngArray, {
                createMarker: function (i, wp) {
                    var markerIcon = L.icon({
                        iconUrl: '/img/map-marker-red.png',
                        iconSize:     [50, 50],
                        iconAnchor:   [25, 25],
                        popupAnchor:  [0, -10]
                    });
                    var marker = L.marker(wp.latLng, {icon: markerIcon});
                    marker.bindPopup("temporary text");
                    marker.on('click', function (e) {
                        this.openPopup();
                    });
                    marker.on('mouseover', function (e) {
                        this.openPopup();
                    });
                    marker.on('mouseout', function (e) {
                        this.closePopup();
                    });
                    return marker;
                }
            }),
            lineOptions: {
                styles: [{color: '#ff629f', opacity: 0, weight: 9}, {
                    color: '#ff629f',
                    opacity: 1,
                    weight: 6
                }, {color: '#ff629f', opacity: 1, weight: 2}]
            }
        }).addTo(map);
        $('#google-map').data('leafletControlInstance', control);
        //$scope.route = "[{link: '#', text: 'Travify'}, {link: '#', text: 'My trips'}, {link: '#', text: 'Travify Itinerary planner'}]";

        $scope.toggleEstimates = function(event){
            $(event.currentTarget).toggleClass('off');
            $('.timeline .card-estimate').parent().parent().slideToggle();
        }

        $scope.slideMenuOpen = true;
        $scope.openOverlay = false;

        $timeout(function(){
			var tmph = window.innerHeight - (document.getElementsByTagName('header')[0].clientHeight + document.getElementsByClassName('headerbars')[0].clientHeight);
			document.getElementsByClassName('page-content')[0].style.height = tmph + 'px';
			tmph -= (document.querySelector('.slidemenu-header').clientHeight);
			var elems = document.querySelectorAll('.slidemenu .body');
			for (var i=0; i<elems.length; i++){
				var siblings = elems[i].parentNode.childNodes;
				var offset = 0;
				for (var j=0;j<siblings.length; j++){
					if (siblings[j].nodeType == 1){
						if (siblings[j].classList.contains("header") || siblings[j].classList.contains("footer")){
							offset += siblings[j].clientHeight;
						}
					}
				}
				elems[i].style.height = (tmph - offset) + 'px';
			}
		}, 0);
    }