我有一个3的OpenLayers地图上我展示各种数据。其中之一是显示由附近的雷达探测船。目前我正在显示船只作为一个简单的矢量圆。我想它显示为形如船的向量。
据我了解,我最好的选择是使用*。PNG图标,做这样的事情:
style: new ol.style.Icon({
image: new ol.style.Icon(({
anchor: [0.5, 0.5],
anchorXUnits: 'fraction',
anchorYUnits: 'fraction',
opacity: 1,
scale: 1,
src: '/Content/images/boat.png',
rotation: 0
}))
});
这工作,但我希望有,当我在输入/输出放大不缩放向量。我的一些不同的数据目前的解决方案是显示一个矩形,但缩放在缩放:
var style = (function () {
function (feature, resolution) {
// font size
if (resolution > 0.4) var fontSize = '12px';
else var fontSize = '14px';
var temperature = feature.get('temperature') || '-';
temperature = temperature.replace(/,/g, '.');
return [new ol.style.Style({
fill: fill,
stroke: stroke,
text: new ol.style.Text({
font: 'bold ' + fontSize + ' helvetica,sans-serif',
text: Math.round(temperature * 100) / 100 + '°C',
fill: new ol.style.Fill({ color: '#000' })
}),
geometry: function (feature) {
var startingCoordinates = feature.getGeometry().getCoordinates();
var coordinates = [[
[startingCoordinates[0] + 0, startingCoordinates[1] + 0],
[startingCoordinates[0] + 33, startingCoordinates[1] + 0],
[startingCoordinates[0] + 33, startingCoordinates[1] + (-11.35)],
[startingCoordinates[0] + 0, startingCoordinates[1] + (-11.35)],
[startingCoordinates[0] + 0, startingCoordinates[1] + 0]
]];
return new ol.geom.Polygon(coordinates);
}
})]
}
})()
是否有这种比使用startingCoordinates +(常数*分辨率)一个更好的解决办法?是否有使用矢量与PNG任何显著的性能差异?谢谢
编辑:和我的几个同事咨询后,我基本上想有这个http://openlayers.org/en/v3.5.0/examples/regularshape.html但自定形状。
EDIT2:其实更像是这个http://dev.openlayers.org/examples/graphic-name.html“指定符号的‘闪电’,‘矩形’和‘教会’是用户定义的。”
这就是我已经做到了,它类似于原来的,但没有我不得不制定出的坐标应该是什么,我只是提供这是多么大的像素,让地图计算出的其余部分。
geometry: function (feature) {
var startingCoordinates =feature.getGeometry().getCoordinates();
var pixel = map.getPixelFromCoordinate(startingCoordinates);
var p1,p2,p3,p4,polyCoords=[],sizex=90, sizey=30;
p1 = pixel;
p2 = [pixel[0]+sizex,p1[1]];
p3 = [pixel[0]+sizex,pixel[1]+sizey];
p4 = [pixel[0],pixel[1]+sizey];
var p = [p1,p2,p3,p4,p1];
for (var c = 0; c < 5;c++){
polyCoords.push(map.getCoordinateFromPixel(p[c]));
}
return new ol.geom.Polygon([polyCoords]);
}
这给了我一个矩形,这正是我想要的。
我知道这是一个老问题,但在回答别人,因为这是当我正在研究如何做到这一点的顶部结果。
我的解决方案是使用一个数据:图像/ SVG + XML与SVG提供一个图标,你可以通过编程生成
new ol.style.Style({
image: new ol.style.Icon({
// svg of an equilateral triangle 25px wide at the base
src: `data:image/svg+xml,${encodeURIComponent('<svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="21.65" width="25" id="canvas"><polygon points="0,0 25,0 12.5,21.65" style="fill:rgba(0,0,0,1);"></polygon></svg>')}`,
}),
})
注意:您don't need to base64 SVG编码在数据网址,但您确实需要encodeURIComponent方法(),它对于非WebKit浏览器。