【问题标题】:Custom vector shape markers in OpenLayers 3OpenLayers 3 中的自定义矢量形状标记
【发布时间】:2015-05-15 09:18:05
【问题描述】:

我有一张 OpenLayers 3 地图,我在上面显示了各种数据。其中之一是显示附近雷达检测到的船只。目前我将船显示为一个简单的矢量圆圈。我想将它显示为一个形状像船的矢量。

据我所知,我最好的选择是使用 *.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'命名符号“闪电”、“矩形”和“教堂”是用户定义的。'

【问题讨论】:

  • 使用图标有什么问题?图标的大小以像素为单位指定。放大或缩小时,该大小不会改变。所以我不明白你为什么说“这有效,但我想要一个在我放大/缩小时不缩放的矢量”。
  • 嗯,使用图标是一种可能的解决方案,但是我必须为不同类型的对象制作大量图标,并为它们的状态制作不同的颜色。使用以编程方式生成的矢量图标,我可以根据它们是否处于危险之中或是否可能对其他人造成危险来改变它们的颜色。另外,我真的很想了解更多关于 ol3 的信息,而且我确信有更简单的方法可以做到这一点。
  • @erilem 如果您有兴趣,添加了(可能)更好的解释。
  • 关于性能:根据我的经验,在渲染数千个标记时,光栅图标和矢量标记之间的差异变得显着。当然,这可能因客户端机器而异。关于您关于使用不可扩展 svg 的问题 - 我通过为每个标记生成一个 .svg 文件来解决这个问题。它可以通过脚本完成,但所有标记都必须存储在某个地方,因此它只是解决您的问题的部分解决方案。

标签: javascript vector openlayers-3


【解决方案1】:

我知道这是一个老问题,但在我研究如何做到这一点时,这是为其他人回答的最佳结果。

我的解决方案是使用带有 svg 的 data:image/svg+xml 来提供可以通过编程方式生成的图标

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 在数据 url 中编码 svg,但您确实需要为非 webkit 浏览器编码URIComponent()。

【讨论】:

    【解决方案2】:

    我就是这样做的,它与原版类似,但无需我计算坐标应该是什么,我只需提供它的像素大小,然后让地图计算其余部分。

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

    这给了我一个矩形,这正是我想要的。

    【讨论】:

      猜你喜欢
      • 2017-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多