angular-heremaps
Version:
Angular directive for working with Nokia Here Maps
107 lines (83 loc) • 3.74 kB
JavaScript
module.exports = HereMapsMarkerService;
HereMapsMarkerService.$inject = [
'HereMapsDefaultMarker',
'HereMapsDOMMarker',
'HereMapsSVGMarker',
'HereMapsCONSTS'
];
function HereMapsMarkerService(HereMapsDefaultMarker, HereMapsDOMMarker, HereMapsSVGMarker, HereMapsCONSTS) {
var MARKER_TYPES = HereMapsCONSTS.MARKER_TYPES;
return {
addMarkersToMap: addMarkersToMap,
addUserMarker: addUserMarker,
updateMarkers: updateMarkers,
isMarkerInstance: isMarkerInstance,
setViewBounds: setViewBounds
}
function isMarkerInstance(target) {
return target instanceof H.map.Marker || target instanceof H.map.DomMarker;
}
function addUserMarker(map, place) {
if (map.userMarker)
return map.userMarker;
place.markup = '<svg width="35px" height="35px" viewBox="0 0 90 90" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">' +
'<defs><circle id="path-1" cx="302" cy="802" r="15"></circle>' +
'<mask id="mask-2" maskContentUnits="userSpaceOnUse" maskUnits="objectBoundingBox" x="-30" y="-30" width="90" height="90">' +
'<rect x="257" y="757" width="90" height="90" fill="white"></rect><use xlink:href="#path-1" fill="black"></use>' +
'</mask></defs><g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">' +
'<g id="Service-Options---directions---map" transform="translate(-257.000000, -757.000000)"><g id="Oval-15">' +
'<use fill="#FFFFFF" fill-rule="evenodd" xlink:href="#path-1"></use>' +
'<use stroke-opacity="0.29613904" stroke="#3F34A0" mask="url(#mask-2)" stroke-width="60" xlink:href="#path-1"></use>' +
'<use stroke="#3F34A0" stroke-width="5" xlink:href="#path-1"></use></g></g></g></svg>';
map.userMarker = new HereMapsSVGMarker(place).create();
map.addObject(map.userMarker);
return map.userMarker;
}
function addMarkersToMap(map, places, refreshViewbounds) {
if (!places || !places.length)
return;
if (!(map instanceof H.Map))
throw new Error('Unsupported map instance');
if (!map.markersGroup)
map.markersGroup = new H.map.Group();
places.forEach(function (place, i) {
var creator = _getMarkerCreator(place),
marker = place.draggable ? _draggableMarkerMixin(creator.create()) : creator.create();
map.markersGroup.addObject(marker);
});
map.addObject(map.markersGroup);
if (refreshViewbounds) {
setViewBounds(map, map.markersGroup.getBounds());
}
}
function setViewBounds(map, bounds, opt_animate) {
map.setViewBounds(bounds, !!opt_animate);
}
function updateMarkers(map, places, refreshViewbounds) {
if (map.markersGroup) {
map.markersGroup.removeAll();
map.removeObject(map.markersGroup);
map.markersGroup = null;
}
addMarkersToMap.apply(null, arguments);
}
function _getMarkerCreator(place) {
var ConcreteMarker,
type = place.type ? place.type.toUpperCase() : null;
switch (type) {
case MARKER_TYPES.DOM:
ConcreteMarker = HereMapsDOMMarker;
break;
case MARKER_TYPES.SVG:
ConcreteMarker = HereMapsSVGMarker;
break;
default:
ConcreteMarker = HereMapsDefaultMarker;
}
return new ConcreteMarker(place);
}
function _draggableMarkerMixin(marker) {
marker.draggable = true;
return marker;
}
};