Подтвердить что ты не робот

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

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

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

Но в этом примере используется ol.Style.Icon вместо OpenLayers.Marker в 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
});

Спасибо

4b9b3361

Ответ 1

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

Q2. В файле ol.source.Vector представлен набор функций, обратите внимание на строку, функции: [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.Feature внутри цикла на основе некоторого источника данных, но я надеюсь, что это демонстрирует подход. Обратите также внимание на то, что вы можете применить стиль к ol.layer.Vector, чтобы он был применен ко всем функциям, добавляемым к слою, вместо того, чтобы устанавливать стиль для отдельных функций, предполагая, что вы хотите, чтобы они были то же, очевидно.

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

Ответ 2

есть хороший учебник по адресу: 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);

Ответ 3

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);