You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Mapsui中将.pgm图像文件用作自定义地图,适配ROS机器人WPF应用

解决方案

完全可以实现,你可以通过Mapsui的ImageLayer直接加载单张PGM地图作为底图,无需依赖瓦片结构,具体实现步骤如下:

步骤1:PGM文件格式转换

Mapsui原生不直接支持PGM格式,你需要先将PGM文件转换为WPF可用的BitmapSource对象,推荐通过Magick.NET库实现快速转换,示例代码:

using (var magickImage = new MagickImage("你的地图文件路径.pgm"))
{
    // 转换为WPF兼容的BitmapSource
    var bitmapSource = magickImage.ToBitmapSource();
}

如果你不想引入第三方库,也可以自行解析PGM文件头的宽、高、像素灰度数据,手动生成BitmapSource。

步骤2:计算地图空间边界

你需要用到ROS地图配套的.yaml配置文件中的参数,计算地图在平面坐标系下的实际范围:

  • 从yaml中获取参数:分辨率resolution(单位:米/像素)、原点坐标origin(格式为[x, y, 0])、像素宽度width、像素高度height
  • 计算边界坐标:
var left = origin[0];
var bottom = origin[1];
var right = origin[0] + width * resolution;
var top = origin[1] + height * resolution;
var boundingBox = new MBoundingBox(left, bottom, right, top);

步骤3:创建底图图层并添加到Mapsui

将转换好的图片和计算出的边界绑定为ImageLayer,插入到地图图层集合的最底层作为底图:

// 把BitmapSource转为Mapsui兼容的ImageData格式
var imageData = BitmapSourceConverter.ToImageData(bitmapSource);
// 初始化底图层
var baseMapLayer = new ImageLayer("ROS机器人底图")
{
    DataSource = new ImageSource(imageData, boundingBox),
    IsMapInfoLayer = false
};
// 插入到图层最底部
myMapControl.Map.Layers.Insert(0, baseMapLayer);

步骤4:配置坐标系(适配ROS平面坐标)

因为室内机器人地图不需要地理坐标系投影,直接关闭Mapsui的投影转换即可:

myMapControl.Map.CRS = "None";
// 可以按需设置地图的最大/最小缩放级别
myMapControl.Map.Navigator.MinZoom = 0.5;
myMapControl.Map.Navigator.MaxZoom = 10;

叠加自定义图层

后续航点、机器人实时位置、路径轨迹等标识,都可以通过VectorLayer、PointLayer等Mapsui原生图层叠加到底图之上,默认即可使用Mapsui自带的手势缩放、平移、触控交互能力,不需要自行实现交互逻辑。

如果需要动态更新PGM底图,只要替换ImageLayer的DataSource属性后调用baseMapLayer.DataChanged()即可刷新,性能远高于手动Canvas渲染。


内容的提问来源于stack exchange,提问作者kglm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 02:54:04