如何把地理数据变成 Minecraft 城市:Arnis 世界生成管线技术详解
【免费下载链接】arnisGenerate any location from the real world in Minecraft with a high level of detail.项目地址: https://gitcode.com/GitHub_Trending/ar/arnis
在地图上拖一个矩形框住你的街区,几分钟后你就得到一个 Minecraft 世界:街道、建筑、河流和起伏的地形都照着真实世界来。Arnis 就是这样一款把地理数据变成 Minecraft 城市世界的开源工具。它没有用到什么"魔法"识别,靠的只是免费公开数据和一条设计得很讲究的管线。
"把地图变方块城"背后要啃的三个硬骨头
首先是坐标对不上。经纬度是地球球面上的角度单位,而 Minecraft 世界是个 1 格等于 1 米的三维网格,你手机里的"平面地图"本身也经过投影、自带形变。其次是世界格式不统一:Java 版、基岩版和 Minetest(Luanti)的存档结构完全不同,各自一套方块 ID,就像三种互不兼容的集装箱。最后是性能:几平方公里城区就有几十万地图要素、上亿个方块,内存和写入速度都容易成为瓶颈。Arnis 的做法是让这三件事各归其位。
数据流全景:从 OSM 文件到存档文件夹
整条链路是一条单向流水线。第一步取数:OpenStreetMap(OSM,全球社区共建的地图数据库)提供建筑、道路和用地信息,高程数据提供地形起伏,土地覆盖数据提供植被分布,还能接入 Overture 作为补充数据源。第二步坐标转换:你框选的经纬度矩形被换算成以方块为单位的世界范围,后续所有要素都落在它里面定位。第三步要素解析:OSM 要素按类型分发给对应处理器——建筑、道路、桥梁、河流各走各的管线。第四步世界写入:内存里的方块网格按目标版本序列化成存档文件。
下面三步是整条管线里最有看头的地方。
管线背后的三个关键技术
🧮 从经纬度到方块:把地球表面摊平到桌面上
问题:球面坐标没法直接塞进网格世界,既要准又要快。
思路:Web Mercator 投影——也就是你手机地图在用的那套投影,可以理解为"把地球表面摊平到桌面上"。Arnis 做了两处关键调整:一是把原点设在你所选区域的中心,世界的 (0,0) 正好落在矩形中央;二是引入"每米多少方块"的比例尺,同一地区既可按 1:1 生成,也能缩小到四分之一。同时遵循 Minecraft 的习惯:北方对应负 Z 轴。单元测试保证了经纬度与方块坐标来回换算的误差小于 1e-8——去了还能原路回来,不会漂移。
效果:同一套投影代码在慕尼黑和悉尼都成立,48.85°N、2.35°E 上的建筑会精确落在方块网格上。实现在 src/coordinate_system/,地理坐标系(经纬度)与笛卡尔坐标系(方块)分成两个子模块,用统一转换接口衔接。
🧩 OSM 标签当菜谱:要素到方块的映射规则
问题:OSM 里一个建筑不过是"building + 高度 12"几个标签,怎么把"菜谱"做成方块成品?
思路:src/element_processing/ 像一排专业厨房,建筑、道路、桥梁、河流、树木各有管线。建筑管线用轮廓加高度"拔"出楼体,再按风格补屋顶和立面;道路管线按中心线和宽度参数铺出路面,还会给每个格子登记"路面标高"——后面地形生成跑过时按这个标高来挖填,于是路面平整,边缘自然出现路堤和切坡,而不是架在半空的悬浮带。树木管线最有意思:先用柯本气候分类(一套判断某地是湿润亚热带还是冷沙漠的体系)定位区域气候,再到对应气候区的树木库里挑树种,冷荒漠和热带铺出来的植物完全是两套。
效果:你看到的是"真实地点的方块化",而不是随机城市——这正是 Arnis 生成的城市能被当地人认出来的原因。
📦 一套内存世界,三种穿法:跨版本写入与流式落盘
问题:Java、基岩、Luanti 三种存档格式结构迥异、方块 ID 各成体系,大城市生成还特别吃内存。
思路:内部先搭一个与版本无关的"世界"——方块网格加实体列表,保存时才换衣服:Java 版写 Anvil 区域文件,基岩版打 .mcworld 包,Luanti 写 map.sqlite 数据库;方块名内部统一,出口处各查各版本的 ID 表。内存上两个手法:一是分块并行,把地图切成瓦片多核同时处理,每片外扩一圈光环余量防止接缝漏块,完成后再合并;二是流式落盘,区域写完就交给后台线程压缩落盘、立刻释放内存,之后任何写入都丢弃,内存占用不随世界变大而膨胀。再配上确定性随机数:同区域同参数,输出逐方块一致,出 bug 能精确复现,自动化测试也因此可行。
效果:你在界面上选个版本,剩下的全是无感的后台工程,1 平方公里的郊区和十几平方公里的市中心走的是同一条管线。实现在 src/world_editor/。
实际价值:生成完你能拿到什么
你拿到的不是贴图包,而是一个能直接在游戏里打开的世界:街道能走通,主要建筑带门,河流高度正确,树种和当地气候对得上。图形界面里框区域、选版本、选生成模式(地形加要素、纯要素、纯地形),一键开跑;命令行用户传输出目录和矩形坐标即可。想自己编译的话,先git clone https://gitcode.com/GitHub_Trending/ar/arnis,再用 cargo build --release 构建。建议第一次先试 1~2 平方公里的小区域,快,也便于判断参数是否合适。
下一步能往哪走:两个具体方向
第一是增量再生。输出已经是确定性的、按瓦片组织的,OSM 数据更新后只需重跑发生变化的区域再合并进旧世界,"重做一座城"就从大手术变成日常维护,类似地图瓦片按块更新。第二是分布式生成。分块并行加流式落盘正是为分布式打底:把整张地图切给多台机器各算一片、完成再合并,是顺着现有架构能自然扩出去的路径,也是从单机"市中心"长到"都会区"最直接的一步。
【免费下载链接】arnisGenerate any location from the real world in Minecraft with a high level of detail.项目地址: https://gitcode.com/GitHub_Trending/ar/arnis
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考