【问题标题】:OpenLayers creating a complex style (polygon with a hole and a stroke on one side)OpenLayers 创建复杂的样式(一侧有孔和笔划的多边形)
【发布时间】:2022-01-22 22:26:40
【问题描述】:

创建复杂的多边形样式有困难。 措辞如下:

  • 多边形应绘制为一个多边形,其外侧有一个孔和一个笔划。

以一种困难的方式(在我看来),我绘制了一个带孔的多边形:

  1. 转为草皮
  2. 使用 turf.buffer 和负缓冲区值,我得到一个内部缓冲区
  3. 使用 turf.difference(源多边形和缓冲区)我得到一个带孔的多边形

但我不明白如何仅从外部绘制边框%) 如果在同一个函数中我尝试返回 2 种样式(线 + 多边形),则会出现错误(未捕获的 TypeError:s.simplifyTransformed 不是函数)。

一般来说,是否可以在样式中返回 2 个不同的几何图形?

图中红色的多边形是我最后需要得到的。

我也做了一个minimal example on codepen

感谢您的帮助!


更新。

循环

并缩小

【问题讨论】:

  • 样式的几何体必须是单个几何体,而不是数组,并且线性环不是可样式化的几何体。但是您可以将多边形的环转换为可设置样式的 MultiLineString lineStyle.setGeometry(new ol.geom.MultiLineString(geom.getCoordinates()));
  • @迈克!谢谢,真的有效!问题仍然存在,是否有可能以更漂亮的方式获得带孔的多边形。
  • 如果你只是想要一个多色的外部笔触,你可以像stackoverflow.com/questions/57421223/…一样设置样式
  • 嗨,@Mike!是的,我看过这个例子,很有趣。我试图在自己身上实现类似的机制,但不知何故没有成功。目前的问题是:1)如何计算“dist”,使内外笔画没有间隙2)计算内笔画时,得到循环。这可以通过较小的笔划厚度清楚地看到。当规模发生变化时,它就会变得完全恐怖。 -----在问题中添加图片并更新示例:codepen link

标签: javascript openlayers turfjs cartography


【解决方案1】:

要使OpenLayers 3: Offset stroke style 示例适用于多边形,您需要在每一端将环延长一段,以便正确计算原始起点/终点处的新坐标,然后在创建结果时删除多余的坐标多边形。

var style = function(feature, resolution) {
  var poly = feature.getGeometry();
  if (poly.getType() == 'Polygon') {
var coordinates = poly.getCoordinates()[0];
coordinates = coordinates.slice(-2, -1).concat(coordinates).concat(coordinates.slice(1, 2));
var geom = new ol.geom.LineString(coordinates);
var colors = ['green', 'yellow', 'red'];
var width = 4;
var styles = [];
for (var line = 0; line < colors.length; line++) {
    var dist = width * resolution * (line - (colors.length-1)/2);
    var coords = [];
    var counter = 0;
    geom.forEachSegment(function(from, to) {
        var angle = Math.atan2(to[1] - from[1], to[0] - from[0]);
        var newFrom = [
            Math.sin(angle) * dist + from[0],
            -Math.cos(angle) * dist + from[1]
        ];
        var newTo = [
            Math.sin(angle) * dist + to[0],
            -Math.cos(angle) * dist + to[1]
        ];
        coords.push(newFrom);
        coords.push(newTo);
        if (coords.length > 2) {
            var intersection = math.intersect(coords[counter], coords[counter+1], coords[counter+2], coords[counter+3]);
            coords[counter+1] = (intersection) ? intersection : coords[counter+1];
            coords[counter+2] = (intersection) ? intersection : coords[counter+2];
            counter += 2;
        }
    });
    styles.push(
        new ol.style.Style({
            geometry: new ol.geom.Polygon([coords.slice(2, -1)]),
            stroke: new ol.style.Stroke({
                color: colors[line],
                width: width
            })
        })
    );
}
return styles;
  }
};


var raster = new ol.layer.Tile({
  source:  new ol.source.OSM() 
});

var source = new ol.source.Vector();

var vector = new ol.layer.Vector({
  source: source,
  style: style
});

var map = new ol.Map({
  layers: [raster, vector],
  target: 'map',
  view: new ol.View({
center: [-11000000, 4600000],
zoom: 4
  })
});

map.addInteraction(new ol.interaction.Draw({
  source: source,
  type: 'Polygon',
  style: style
}));
html, body, .map {
    margin: 0;
    padding: 0;
    width: 100%;
    height: 100%;
}
<link href="https://cdn.rawgit.com/openlayers/openlayers.github.io/master/en/v5.3.0/css/ol.css" rel="stylesheet" />
<script src="https://cdn.rawgit.com/openlayers/openlayers.github.io/master/en/v5.3.0/build/ol.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjs/5.4.1/math.min.js"></script>
<div id="map" class="map"></div>

原来的 LineStrings 算法在有多个顶点的拐角处存在问题

当缩小时,内线上的两个顶点应该合并到一个点,但这并没有发生,而是它们交叉并导致在线扭结。

【讨论】:

  • 在 14-20 的范围内,看起来应该如此。但是如果你取0-13,那就太可怕了。此外,显示不仅取决于比例,还取决于原始多边形的大小。由于我的内部线(内部缓冲区)应该更粗(相对于外部笔划大约 3 倍),因此在这些比例下,它会向所有方向(在父多边形之外)展开。我已经用你的代码更新了这个例子。感谢参与! codepen example
  • 我觉得一定比例的内笔画的大小和父多边形的大小一定有某种关系。当描边开始超出范围时,只需用内部描边颜色完全填充多边形。
  • 您可以根据分辨率限制内部宽度,例如var widths = [12 / Math.max(1, resolution / 10), 4];
  • 谢谢!这似乎是真的。我试图通过区域比较,但有一些细微差别。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-19
  • 2012-05-08
  • 1970-01-01
  • 1970-01-01
  • 2010-09-26
相关资源
最近更新 更多