Как мога да добавя персонализиран HTML маркер за карта към карта на Nokia HERE?

От това, което чета за документацията на картите на Nokia, мога да добавя персонализиран маркер с помощта на векторен API за рисуване: http://developer.nokia.com/Community/Wiki/HERE_Maps_API_-_How_to_create_custom_graphics_marker

Можете да създавате персонализирани графични маркери, но само въз основа на спрайт: http://heremaps.github.io/examples/examples.html#sprite-markers

Или можете да добавите техни собствени маркери: http://developer.nokia.com/Community/Wiki/HERE_Maps_API_-_How_to_add_map_markers

Но има ли някакъв начин да предоставите HTML фрагмент, който да се позиционира на картата като маркер на карта? Ето как работят другите библиотеки с карти, така че мога напълно да контролирам маркера на картата в HTML/CSS. Вече имам маркери на картата, които бих искал да използвам, които са стилизирани в HTML/CSS и не бих искал да дублирам този стил в персонализиран JS.


person dbanksdesign    schedule 17.01.2014    source източник
comment
Можете също да добавите маркери въз основа на вашето собствено изображение активи, без да използвате спрайтове или да комбинирате изображения с вектор чертеж или използвайте SVG маркери - някое от тях ще ви бъде ли полезно?   -  person Jason Fox    schedule 20.01.2014
comment
Не, защото бих искал да запазя стила на маркерите на картата в CSS, не искам да дублирам изобразяването на маркер на карта по различен начин (вектор/svg/изображение) от начина, по който вече го правя в други области на приложението с помощта на шрифт на икона и CSS. По този начин, ако някога актуализирам стила, няма да се налага да го правя на две места. Благодаря все пак!   -  person dbanksdesign    schedule 21.01.2014


Отговори (1)


Ако възнамерявате да използвате стилизиран, инжектиран HTML, би било възможно да създадете поредица от персонализирани компоненти (по един за всеки маркер) и да ги прикачите към map. Това ще инжектира елемент на ниво блок за всеки компонент, който можете да стилизирате, както сметнете за добре.

Това не е съвсем различно от простия компонент GroundOverlay, който използвах преди ImgTileProvider класът беше разкрит в API - той инжектира <IMG> елемент и преоразмерява zoomLevel (което вероятно ще трябва да премахнете), но въпреки това ефективно прикачва част от HTML към конкретна опорна точка на картата.

За повечето прости приложения обикновено бих използвал Маркери (със или без моя собствена иконография) или Инфобалончета обаче. Те водят до по-отзивчив и стандартен потребителски интерфейс и не претрупват картата.

function extend(B, A) {
  function I() {}
  I.prototype = A.prototype;
  B.prototype = new I();
  B.prototype.constructor = B;
}

function GroundOverlay(url, boundingBox) {
  nokia.maps.map.component.Component.call(this);
  this.init(url, boundingBox);
}

extend(GroundOverlay,
    nokia.maps.map.component.Component);


GroundOverlay.prototype.init = function (url, boundingBox) {
  var that = this;
  that.overlayDiv  = document.createElement('div');
  that.overlayDiv.style.position = 'absolute';
  that.overlayDiv.style.cursor = 'default';
  that.overlayImage = document.createElement('img');
  that.overlayImage.id = 'groundoverlay';
  that.overlayDiv.appendChild(that.overlayImage);

  that.set('url', url);
  that.set('boundingBox', boundingBox);
  that.set('visible', true);
  that.set('opacity', 1);

  that.addOverlay = function () {
    var isVisible = that.get('visible'),
      bbox,
      topLeft,
      bottomRight;

    if (isVisible === false) {
      that.overlayDiv.style.display = 'none';
    } else {
      bbox = that.get('boundingBox');
      topLeft = that.map.geoToPixel(bbox.topLeft);
      bottomRight = that.map.geoToPixel(bbox.bottomRight);
      that.overlayDiv.style.display = 'block';
      that.overlayDiv.style.left = topLeft.x + 'px';
      that.overlayDiv.style.top = topLeft.y + 'px';
      that.overlayDiv.style.width = (bottomRight.x - topLeft.x) + 'px';
      that.overlayDiv.style.height = (bottomRight.y - topLeft.y) + 'px';
      that.overlayImage.src = that.get('url');
      that.overlayImage.style.width = (bottomRight.x - topLeft.x) + 'px';
      that.overlayImage.style.height = (bottomRight.y - topLeft.y) + 'px';
      that.overlayImage.style.opacity = that.get('opacity');
    }
  };

  that.addObserver('opacity', that.addOverlay);
  that.addObserver('visible', that.addOverlay);
  that.addObserver('url', that.addOverlay);
  that.addObserver('boundingBox', that.addOverlay);

  that.eventHandlers = {
    dragListener : function (evt) {
      var newGeo = that.map.pixelToGeo(
        that.map.width / 2 - evt.deltaX,
        that.map.height / 2 - evt.deltaY
      );
      that.map.set('center', newGeo);
      evt.stopPropagation();
    },
    dblClickListener :  function (evt) {
      evt.target = this.parentNode.parentNode;
      that.map.dispatch(evt);
    },
    mouseWheelListener :  function (evt) {
      evt.target = this.parentNode.parentNode;
      that.map.dispatch(evt);
    }
  };
};


GroundOverlay.prototype.attach = function (map) {
  this.map = map;
  var controls = map.getUIContainer().firstChild,
    child = controls.firstChild;
  controls.insertBefore(this.overlayDiv, child);

  map.addObserver('center', this.addOverlay);
  map.addObserver('zoomLevel', this.addOverlay);

  if (!this.evtTarget) {
    this.evtTarget =  nokia.maps.dom.EventTarget(
      document.getElementById('groundoverlay')
    ).enableDrag();
    this.evtTarget.addListener('drag', this.eventHandlers.dragListener);
    this.evtTarget.addListener('dblclick', this.eventHandlers.dblClickListener);
    this.evtTarget.addListener('mousewheel', this.eventHandlers.mouseWheelListener);
    this.addOverlay();
  }
};

GroundOverlay.prototype.detach = function (map) {
  this.map = null;
  map.removeObserver('center', this.addOverlay);
  map.removeObserver('zoomLevel', this.addOverlay);
  this.overlayDiv.parentNode.removeChild(this.overlayDiv);
};

GroundOverlay.prototype.getId = function () {
  return 'GroundOverlay';
};


GroundOverlay.prototype.getVersion = function () {
  return '1.0.0';
};
person Jason Fox    schedule 20.01.2014
comment
Точно това ми трябва. Много благодаря! - person dbanksdesign; 21.01.2014