OpenLayers 以米为单位绘制具有实际宽度的 LineString

OpenLayers draw LineString with real width in meters

我尝试使用最新的稳定 OpenLayers 库绘制宽度以米为单位的折线(道路车道),但它没有正确的实际宽度(在 Google 地图层顶部检查)。 这是对我有用的代码片段:

polyLineFeature.setStyle((feature, resolution) => {
    const lineString = feature.getGeometry();
    const lineStyles = [
        new Style({
            stroke: new Stroke({
                width:
                    laneWidth /
                    resolution /
                    getPointResolution("EPSG:3857", 1, lineString.getCoordinateAt(0.5)),
                lineCap: "square",
            }),
        }),
    ];
    return lineStyles;
});

我到处都使用默认投影(网络墨卡托)。

但我不明白为什么我必须将实际宽度(以米为单位)除以当前分辨率和与实际区域相关的另一个分辨率。 这在任何地方都有解释吗?

WebMercator 3857 是一个关于距离的糟糕投影。当您远离赤道时,它会引入巨大的扭曲(这就是为什么格陵兰岛在地图上看起来很大,而实际上它是一块相当小的土地)。

通过将宽度除以 getPointResolution,您可以有效地纠正这种扭曲。

如果您使用的是另一个保持距离的投影,例如 UTM,则您不必进行此除法(或者,如果您这样做,getPointResolution 的值将为 1)