我有一张在 QGIS 中维护的地图,并且定期将图层导出到 geojson,以便在网站上的 OpenLayers 中使用。
QGIS 允许我在要素上设置自定义标签位置,并将自定义标签位置的坐标存储在该图层的属性表中。
另一方面,OpenLayers 没有办法处理标签的特定坐标,而只能定义偏移量。
很简单,我只需要从特征中获取坐标,并测量到为标签存储的坐标的距离,并将其作为偏移量。至少我是这么想的。
这是我现有的代码,它计算距要素范围中心的偏移量:
var offsetX = 0;
var offsetY = 0;
var labelX = +(feature.get('LabelX'));
var labelY = +(feature.get('LabelY'));
if (labelX && labelY) {
var labelXY_coor = [labelX, labelY];
var labelXY = map.getPixelFromCoordinate(labelXY_coor);
var centerXY_coor = ol.extent.getCenter(feature.getGeometry().getExtent());
var centerXY = map.getPixelFromCoordinate(centerXY_coor);
offsetX = (labelXY[0] - centerXY[0]);
offsetY = (labelXY[1] - centerXY[1]);
}
但是,OpenLayers 解释的偏移似乎不是从要素中心开始的,而是从 OpenLayers 最初放置标签的位置开始的偏移。这并不总是中心,具体取决于形状。因此,只有当相关特征恰好完全对称时,我的代码才能正常工作,在这种情况下,我无论如何都不太可能自定义位置。
我已经搜索了一段时间,试图找出 OpenLayers 如何确定默认标签位置,但运气不佳,而且 API 文档中似乎没有方法告诉我它将把它放在哪里。
为了正确创建偏移,我如何找到 OpenLayers 计划放置标签的坐标(而不是像我现在所做的那样位于范围的中心)?
或者我什至吠叫正确的树,有更好的方法来保持 QGIS 和 OpenLayers 之间的自定义标签位置同步吗?
OpenLayers 有一个
geometry
选项来处理特定坐标 https://openlayers.org/en/latest/apidoc/module-ol_style_Style.html
在你的情况下,你可以使用类似的东西
var geometry = new ol.geom.Point([+(feature.get('LabelX')), +(feature.get('LabelY'))]);