Как добавить маркеры с 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
});
Спасибо
Ответы
Ответ 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);