如何在开放层3中为每个多边形显示一个标签?

时间:2016-05-18 17:33:55

标签: openlayers-3

我在尝试弄清楚如何在OL3中为每个多边形显示一个标签时遇到问题。它目前显示每个多边形的标签,在这种情况下,在任何情况下都不理想。

screenshot

var vector = new ol.layer.Vector({
source: new ol.source.Vector({
    format: new ol.format.GeoJSON(),
    projection: 'EPSG:4326',
    url: 'resources/ol3/countries.geojson'
}),
style: function (feature, resolution) {
    style.getText().setText(resolution < 10000 ? feature.get('NAME') : '');
    style.getFill().setColor('rgba(255, 255, 255, 0)');
    return styles;
}});

如果可能的话,我想在最大的多边形上显示标签。

2 个答案:

答案 0 :(得分:5)

客户端的另一个选择是从多边形的多边形部分中标出较大的一个选项。 对于此选项,您不需要在服务器端进行任何控制。因此,请使用以下代码或直接转到fiddle以查看其实际操作:

var vector = new ol.layer.Vector({
  style: function (feature, resolution) {
    var polyStyleConfig = {
      stroke: new ol.style.Stroke({
        color: 'rgba(255, 255, 255, 1)',
        width: 1
      }),
      fill: new ol.style.Fill({
        color: 'rgba(255, 0, 0,0.3)'
      })
    }
    var textStyleConfig = {
      text:new ol.style.Text({
        text:resolution < 100000 ? feature.get('NAME') : '' ,
        fill: new ol.style.Fill({ color: "#000000" }),
        stroke: new ol.style.Stroke({ color: "#FFFFFF", width: 2 })
      }),
      geometry: function(feature){
        var retPoint;
        if (feature.getGeometry().getType() === 'MultiPolygon') {
          retPoint =  getMaxPoly(feature.getGeometry().getPolygons()).getInteriorPoint();
        } else if (feature.getGeometry().getType() === 'Polygon') {
          retPoint = feature.getGeometry().getInteriorPoint();
        }
        console.log(retPoint)
        return retPoint;
      }
    }
    var textStyle = new ol.style.Style(textStyleConfig);
    var style = new ol.style.Style(polyStyleConfig);
    return [style,textStyle];
  },
  source: new ol.source.Vector({
    url: 'http://openlayers.org/en/v3.8.2/examples/data/geojson/countries.geojson',
    format: new ol.format.GeoJSON(),
    wrapX: false
  })
});

您还需要一个辅助函数来验证哪个是更大的多边形:

function getMaxPoly(polys) {
  var polyObj = [];
  //now need to find which one is the greater and so label only this
  for (var b = 0; b < polys.length; b++) {
    polyObj.push({ poly: polys[b], area: polys[b].getArea() });
  }
  polyObj.sort(function (a, b) { return a.area - b.area });

  return polyObj[polyObj.length - 1].poly;
 }

答案 1 :(得分:2)

ol3不支持你想要做的事情,至少不是'本地'。有几种方法可以实现您的目标,但我不认为在“客户端”进行此操作是最好的方法。

1 - 简单快捷的方式,服务器端

如果您可以控制您的数据/服务器,那么我将管理从那里显示的标签。您可以创建一个“特定于标签”的字段,其中包含您要显示的文本的副本,以及那些您不会将其留空的字段。如果你只想要最大的岛屿总是有标签,那就行了。

2 - 复杂而缓慢的方式 - 客户端

在客户端,在样式函数中,您可以循环每个要素并收集与要尝试标记的要素具有相同名称的要素,然后比较它们的几何区域。如果该功能没有其他具有更大区域的同名功能,则仅标记该功能。

此解决方案也可以在服务器端实现。如果要素是共享相同名称的区域中面积最大的那个,则可以返回值为1的额外字段,如果不是,则返回0。您只能使用此字段= 1标记要素。