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