как добавить маркеры с OpenLayers 3


Я пытаюсь добавить создателей на OpenLayers 3 карта.

единственный пример, который я нашел это этой в OpenLayers пример список.

но в этом примере используется ol.Стиль.Значок вместо чего-то вроде OpenLayers.Маркер на OpenLayers 2.

Первый Вопрос

единственное различие будет заключаться в том, что вы должны установить Url-адрес изображения, но это единственный способ добавить маркер?

и OpenLayers 3 не кажется, чтобы прийти с маркерами изображений, так что это имело бы смысл, если нет другого способа, чем ol.Style.Icon

Второй Вопрос

было бы очень хорошо, если бы кто-нибудь мог дать мне пример функции для добавления маркеров или значков после загрузки карты.

насколько я понимаю, в Примере, они создают слой на значок

var iconFeature = new ol.Feature({
  geometry: new ol.geom.Point(ol.proj.transform([-72.0704, 46.678], 'EPSG:4326', 'EPSG:3857')),
  name: 'Null Island',
  population: 4000,
  rainfall: 500
});


var iconStyle = new ol.style.Style({
  image: new ol.style.Icon(/** @type {olx.style.IconOptions} */ ({
    anchor: [0.5, 46],
    anchorXUnits: 'fraction',
    anchorYUnits: 'pixels',
    opacity: 0.75,
    src: 'data/icon.png'
  }))
});

iconFeature.setStyle(iconStyle);

var vectorSource = new ol.source.Vector({
  features: [iconFeature]
});

var vectorLayer = new ol.layer.Vector({
  source: vectorSource
});

затем они устанавливают слой значков при инициализации карта

var map = new ol.Map({
  layers: [new ol.layer.Tile({ source: new ol.source.OSM() }), vectorLayer],
  target: document.getElementById('map'),
  view: new ol.View2D({
    center: [0, 0],
    zoom: 3
  })
});

если я хочу добавить много маркеров, мне нужно создать 1 слой для каждого маркера?

как я могу добавить много маркеров на слое? Я не могу понять, как эта часть будет выглядеть как

var vectorSource = new ol.source.Vector({
  features: [iconFeature]
});

var vectorLayer = new ol.layer.Vector({
  source: vectorSource
});

спасибо

3 61

3 ответа:

Q1. Маркеры считаются устаревшими в OpenLayers 2, хотя это не очень очевидно из документации. Вместо этого, вы должны использовать OpenLayers.Особенность.Вектор с внешним графическим набором к некоторому источнику изображения в его стиле. Это понятие было перенесено на OpenLayers 3, поэтому нет класса маркеров, и это делается так, как в приведенном примере.

Q2. Ол.источник.Вектор принимает массив объектов, обратите внимание на линию, функции: [iconFeature], поэтому вы создадите массив иконок и добавить функции к этому, например:

var iconFeatures=[];

var iconFeature = new ol.Feature({
  geometry: new ol.geom.Point(ol.proj.transform([-72.0704, 46.678], 'EPSG:4326',     
  'EPSG:3857')),
  name: 'Null Island',
  population: 4000,
  rainfall: 500
});

var iconFeature1 = new ol.Feature({
  geometry: new ol.geom.Point(ol.proj.transform([-73.1234, 45.678], 'EPSG:4326',     
  'EPSG:3857')),
  name: 'Null Island Two',
  population: 4001,
  rainfall: 501
});

iconFeatures.push(iconFeature);
iconFeatures.push(iconFeature1);

var vectorSource = new ol.source.Vector({
  features: iconFeatures //add an array of features
});

var iconStyle = new ol.style.Style({
  image: new ol.style.Icon(/** @type {olx.style.IconOptions} */ ({
    anchor: [0.5, 46],
    anchorXUnits: 'fraction',
    anchorYUnits: 'pixels',
    opacity: 0.75,
    src: 'data/icon.png'
  }))
});


var vectorLayer = new ol.layer.Vector({
  source: vectorSource,
  style: iconStyle
});

очевидно, что это может быть более элегантно обработано, поставив все ol.Создание функции внутри цикла на основе некоторого источника данных, но я надеюсь, что это демонстрирует подход. Обратите также внимание, что вы можете применить стиль к ol.слой.Вектор, чтобы он применялся ко всем объектам, добавляемым в слой, вместо того, чтобы устанавливать стиль для отдельных объектов, предполагая, что вы хотите, чтобы они были одинаковыми, очевидно.

EDIT: этот ответ, похоже, не работает. Вот обновленный скрипка это работает путем добавления объектов (значков) к пустому векторному источнику в цикле, используя vectorSource.addFeature, а затем добавляет весь лот к вектору слоя впоследствии. Я буду ждать и посмотреть, если это работает для вас, прежде чем обновлять мой оригинальный ответ.

есть хороший учебник по адресу:http://openlayersbook.github.io

не проверено, но может быть полезно

var features = [];

//iterate through array...
for( var i = 0 ; i < data.length ; i++){
    var item = data[i];                                     //get item
    var type = item.type;                                   //get type
    var longitude = item.longitude;                         //coordinates
    var latitude = item.latitude;
    /*....
    * now get your specific icon...('..../ic_customMarker.png')
    * by e.g. switch case...
    */
    var iconPath = getIconPath(type);

    //create Feature... with coordinates
    var iconFeature = new ol.Feature({
        geometry: new ol.geom.Point(ol.proj.transform([longitude, latitude], 'EPSG:4326',     
        'EPSG:3857'))
    });

    //create style for your feature...
    var iconStyle = new ol.style.Style({
        image: new ol.style.Icon(/** @type {olx.style.IconOptions} */ ({
        anchor: [0.5, 46],
        anchorXUnits: 'fraction',
        anchorYUnits: 'pixels',
        opacity: 0.75,
        src: iconPath
        }))
    });

    iconFeature.setStyle(iconStyle);
    features.push(iconFeature);
    //next item...
}

/*
* create vector source
* you could set the style for all features in your vectoreSource as well
*/
var vectorSource = new ol.source.Vector({
    features: features      //add an array of features
    //,style: iconStyle     //to set the style for all your features...
});

var vectorLayer = new ol.layer.Vector({
    source: vectorSource
});
map.addLayer(vectorLayer);
var exampleLoc = ol.proj.transform(
    [131.044922, -25.363882], 'EPSG:4326', 'EPSG:3857');

var map = new ol.Map({
  target: 'map',
  renderer: 'canvas',
  view: new ol.View2D({
    projection: 'EPSG:3857',
    zoom: 3,
    center: exampleLoc
  }),
  layers: [
    new ol.layer.Tile({source: new ol.source.MapQuest({layer: 'osm'})})
  ]
});

map.addOverlay(new ol.Overlay({
  position: exampleLoc,
  element: $('<img src="resources/img/marker-blue.png">')
      .css({marginTop: '-200%', marginLeft: '-50%', cursor: 'pointer'})
      .tooltip({title: 'Hello, world!', trigger: 'click'})
}));

map.on('postcompose', function(evt) {
  evt.vectorContext.setFillStrokeStyle(
      new ol.style.Fill({color: 'rgba(255, 0, 0, .1)'}),
      new ol.style.Stroke({color: 'rgba(255, 0, 0, .8)', width: 3}));
  evt.vectorContext.drawCircleGeometry(
      new ol.geom.Circle(exampleLoc, 400000));
});

var exampleKml = new ol.layer.Vector({
  source: new ol.source.KML({
    projection: 'EPSG:3857',
    url: 'data/example.kml'
  })
});
map.addLayer(exampleKml);