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)
我尝试使用最新的稳定 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)