Как я могу добавить пользовательский маркер карты 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 к определенной точке привязки на карта.

Для большинства простых приложений я обычно использую Маркеры (с моей собственной иконкой или без нее) или Infobubbles. Это приводит к более гибкому и стандартному пользовательскому интерфейсу и не загромождает карту.

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