ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

ArcGIS Maps SDK for Unity入门:从坐标系到图层,跑通真实世界三维场景

ArcGIS Maps SDK for Unity入门:从坐标系到图层,跑通真实世界三维场景 简介《Arc Engine轻松入门教程》专为GIS初学者和希望快速上手Arc Engine的开发者设计覆盖从GIS基本概念、ArcGIS Engine安装配置到桌面端地图加载、图层管理、空间查询、数据读写以及Web/移动GIS开发等核心主题帮助读者建立清晰的学习路径。压缩包共82个文件以C#源码、sln解决方案、pdf教程文档为核心另含exe演示程序、tif/shp等示例地理数据和相关配置文件整体大小29.22MB便于快速下载与本地环境实践。目前已有222人学习/浏览适合作为自学或课程配套入门资料。资源内置ArcGIS Engine轻松入门.pdf、完整源码目录及配套Engine GIS数据可对照练习加载地图文档、添加图层、执行几何查询、处理Shapefile和栅格数据等操作源码中的接口调用与对象模型注释也能帮助读者理解API设计思路并支撑后续地理编码、空间分析、网络分析及3D可视化等进阶开发。 开篇先说一个我见了很多次的场景Unity开发者装好ArcGIS Maps SDK从官方文档拖了一个Sample场景改好API Key点击Play屏幕上什么都没有。白茫茫一片或是黑屏最客气的也是只有一颗孤零零的地球模型放大之后全是糊的。于是第一反应是“SDK坏了”第二反应是“文档写得烂”。其实两个都不一定对。Arc Engine官方名称是ArcGIS Maps SDK for Unity社区里习惯叫Arc Engine不是传统意义上的“插件”它是一套把GIS数据和实时渲染引擎桥接起来的完整运行时。你不能用“放一个Prefab进去就能跑”的思路去理解它入门最大的门槛不是操作而是坐标系、图层类型、服务鉴权这一整条GIS知识链。这篇文章就是带你把这串链条理顺之后你会觉得它其实非常顺手。1. Arc Engine到底解决了什么问题——GIS世界和游戏引擎世界之间隔着一道墙1.1 两个世界的坐标系碰撞做实时渲染的人常年和米、厘米打交道。你建一个角色它站在(0, 0, 0)往前走十米就是(0, 0, 10)。但GIS数据的坐标系完全不同——真实世界的坐标是经纬度加椭球高一个北京的坐标大致是(116.39, 39.9, 45)这个数字扔进Unity的场景坐标里没有任何意义。你可能会说“我写个换算函数不就行了”问题没有这么简单。真实世界的数据量极其庞大一整条北京市道路网如果全部以GameObject形式加载进场景Unity根本扛不住。Arc Engine的核心价值就在于它做了三件普通换算函数做不到的事按需流式加载地图数据被切分成瓦片相机走到哪里它就加载哪里的数据离开视野的数据会被自动卸载。多级细节LOD自动管理你从三万米高空俯瞰时只加载低精度地形下降到三百米时高精度建筑物和道路自然浮现出来。地理配准和坐标投影影像、地形、矢量、3D白模、倾斜摄影全部实时配准到同一个地理坐标系里。换句话说Arc Engine不是“把地球搬进Unity”而是让Unity有了一张永不下线的虚拟地球你的相机指到哪它就把那块的真实世界呈现给你。1.2 为什么数字孪生和智慧城市项目离不开它我不是做游戏出身的我最早接触Arc Engine是因为一个数字孪生项目——要把整个园区的BIM模型、管线数据、摄像头点位、人员定位全部放到一个三维场景里。当时我天真地想直接在Unity里按比例尺摆模型不就行了结果两周之后我就发现BIM模型是局部坐标系管线数据是CAD的绝对坐标摄像头经纬度是从数据库里读出来的它们根本不在一个坐标系里。Arc Engine解决的不是单一数据的加载而是多元异构数据在地理空间上的对齐。你只需给每个数据源指定它自己的坐标系和位置Arc Engine会自动把它们钉在地球正确的位置上。这个能力在智慧城市、规划评审、安防应急、自动驾驶仿真这些场景里几乎是刚需。这也是为什么你现在去看Esri的官方案例Unity版本的点击率远高于几年前——因为实时渲染引擎正在成为GIS数据的主要可视化出口。1.3 谁需要看这篇教程如果你属于下面任何一类这篇教程能在半小时内帮你绕开大部分入门坑Unity或Unreal开发者第一次接GIS数据对ArcGIS完全陌生。GIS开发/数据处理人员想把ArcGIS Pro或Online里的数据搬到实时渲染引擎里展示。学生或独立开发者想用真实世界地图给游戏做个超大开放世界场景。你不需要会ArcGIS Pro也不需要懂测绘原理。但你得有一颗“愿意理解坐标系”的心。接下来我拿Unity版本举例子Unreal的流程基本一致只是组件名称略有差别。2. 安装ArcGIS Maps SDK for Unity前必须搞清楚的三个前置问题2.1 版本匹配最先遇到的坑从Unity 2021.3.0f1开始官方SDK已经全面转向了Package Manager分发的模式。你在Unity里这样安装Window Package Manager Add Package from Git URL地址填:https://github.com/Esri/arcgis-maps-sdk-unity.git但这有个大坑——不要随手拿一个最新版Git URL就填进去。SDK对Unity的最小版本有硬性要求而且Unity版本太新也可能出问题。比如SDK 1.3.0要求Unity 2021.3SDK 1.2.0支持2020.3但如果你用的是Unity 2022.2以上部分shader会出现兼容性问题表现是地形变成紫粉色或者模型闪烁。我的建议是先查Esri官方Releases页面确认你要用的SDK版本对应的Unity版本号然后安装完全匹配的Unity Editor。不要用Unity Hub里的最新版本凑合SDK和引擎的版本组合是“官方测试过的那种最稳”。我目前长期使用的组合是Unity 2021.3.15f1 SDK 1.3.0实测稳定。2.2 注册开发者账号并申请API KeyArc Engine玩的是“在线服务驱动”的模式——没有网络没有API Key你就什么都加载不出来。去developers.arcgis.com注册一个ArcGIS Developer账号免费套餐足够学习和原型验证。登录之后在Dashboard里新建一个API Key。注意有两个细节在创建Key的时候要勾选你需要的服务权限。至少勾上“Basemaps”底图、“Elevation”高程和“Scene”3D场景内容。在“Authentication”里选API Key访问方式而不是OAuth 2.0。OAuth 2.0适合需要用户登录的业务场景入门阶段用API Key最简单直接。收到API Key之后在Unity里把它填到ArcGIS Maps SDK组件的API Key字段里就行。这个Key相当于你访问Esri在线服务的“通行证”免费额度的调用量对一个测试项目完全够用。2.3 安装后的目录结构和Sample场景包导入成功后你会看到工程里多了一个ArcGIS Maps SDK for Unity菜单。这个菜单里藏着一个好东西Toolbar Samples。强烈建议你先用Samples里的场景做验证而不是自己从头搭。原因很简单——Arc Engine的场景搭建有个“先有鸡还是先有蛋”的逻辑ArcGISMap组件、ArcGISMapView组件、ArcGIS Camera这三者缺一不可而且父级层级关系一旦错了数据就加载不出来。Samples场景默认带了一套完整的层级结构你可以直接改Camera的坐标和API Key然后点击Play验证连通性。等跑通了再拷贝层级结构到自己的场景里改造这是最稳的路线不要一上来就自己从空场景开始搭。3. 十分钟跑通第一个ArcGIS场景——从空场景到真实世界3.1 核心组件是谁ArcGISMap、ArcGISMapView、ArcGIS Camera虽然前面说建议用Sample改但你还是得知道这套东西是怎么咬合的。三个核心组件各司其职ArcGISMap地图/场景的容器。它管理着所有图层的集合相当于一个“图层管理器”同时持有API Key配置。ArcGISMapView负责把ArcGISMap里的数据渲染到场景中。它是连接“GIS数据层”和“Unity渲染层”的桥梁。ArcGIS Camera负责控制观察位置但它用的不是Transform里的普通坐标而是经纬度、高度、俯仰角和朝向。一个最简场景的层级结构如下—— ArcGISMap —— ArcGISMapView —— ArcGIS Camera父物体是ArcGISMap子物体是ArcGISMapView相机放在View下面。如果你把ArcGISMap和ArcGISMapView平级摆放数据加载也会出错这个顺序我栽过跟头。3.2 给相机设置一个“真实世界坐标”接下来是最容易迷惑的地方相机的位置怎么设如果是Unity原生开发你拖拽一下相机就行了。但在Arc Engine里相机必须通过经纬度、海拔高度、俯仰角和朝向四个参数来定位。你可以手动改Camera组件上的属性更常用的方式是代码控制using UnityEngine; using Esri.ArcGISMapsSDK.Components; public class CameraLocator : MonoBehaviour { public ArcGISCameraComponent arcGISCamera; void Start() { // 北京国贸附近 double longitude 116.458376; double latitude 39.908737; double altitude 800; // 海拔800米俯瞰视角 double heading 0; // 朝向正北 double pitch 65; // 俯仰角65度带一点倾斜 arcGISCamera.LookAt(longitude, latitude, altitude, heading, pitch, 0); } }注意这里的LookAt是在SDK 1.3.0及以后版本提供的API更老的版本用的是SetPosition和SetRotation。你在网上搜索老教程时会看到很多SetPosition(lat, lon, alt)的写法不妨碍理解但要注意版本兼容。3.3 配置图层影像底图 高程 3D白模ArcGISMap组件里的Layers集合是这个入口的核心玩法。打开ArcGISMap组件的Inspector点击Layers旁边的号你可以添加各种图层类型ArcGISImageLayer影像底图。适合加卫星影像。ArcGISElevationLayer高程图层。没有它地形永远是一个平面。ArcGIS3DObjectSceneLayer3D建筑白模/倾斜摄影。适合城市级场景。ArcGISBuildingSceneLayer结构化建筑楼层数据可以单独隐藏/显示楼层。如果一切以官方服务为依赖你可以直接用我下面这套组合跑通城市级场景图层类型服务URL说明影像底图https://ibasemaps-api.arcgis.com/arcgis/rest/services/World_Imagery/MapServer全球卫星影像高程图层https://elevation3d.arcgis.com/arcgis/rest/services/WorldElevation3D/Terrain3D/ImageServer全球地形高度3D建筑https://tiles.arcgis.com/tiles/... (需申请)城市级白模/精模这里有个顺序要注意先加高程让地形有起伏再加影像和高程叠加最后加3D图层。如果你先加3D建筑再临时加高程建筑可能会因为地形起伏变化而漂浮或半埋进地面。SDK支持在运行时动态增删图层但图层层级关系的调整最好在编辑阶段就定好。配置好之后把相机的经纬度设置到你熟悉的大城市市中心区域然后点击Play。正常情况是先看到低清的全球影像几秒钟后你所在区域的高清影像和地形细节逐渐浮现出来。4. 第一次跑出来的场景为什么是“空白”的——五个必查项4.1 API Key没生效或权限不足这是最多人遇到的情况表现为Console窗口弹出401或者Forbidden错误。排查思路检查API Key粘贴时有没有多余空格确认ArcGISMap组件上的API Key字段不是空的最难察觉的是——你在ArcGIS Developer后台创建Key时没有勾选对应服务权限。如果你要用的是Elevation和Imagery但Key只勾了Geocoding照样是401。这个问题的特征是球体模型能加载出来因为基础球体不依赖服务但图层数据永远加载不出来。4.2 相机离地球表面太远或朝向太空Arc Engine默认把场景原点定位在地心坐标系上。相机默认位置在(0,0,0)而地球表面在地心坐标系的某个特定半径处——大约是6371000米的位置。如果你用的是普通相机而不是ArcGIS Camera或者Camera组件下没有挂ArcGISCameraComponent画面会呈现两种情况要么是黑屏要么是白色的一大片——因为你正对着太空天空和地球都在你的视野之外。解决方式给相机挂上ArcGISCameraComponent然后通过脚本或者Inspector把经纬度和海拔设成一个正常值。这里有一个经验习惯海拔不要低于50米低于这个高度会看到地形边缘的切片断层也不要高于10万米上面影像分辨率太差看起来像蓝色塑料片。4.3 高程图层缺失地形永远是平的如果你能看清地图影像但地面一马平川怎么放大都是平的那基本是没加高程图层。地形起伏要靠ArcGISElevationLayer提供高度数据没有高程图层Arc Engine只能把影像贴在一个半径6371000米的球面上——不要惊讶就算你人在玉龙雪山脚下看到的地面还是平的因为高度信息根本没进场景。另外注意两件事高程图层在Layers集合里的顺序最好在影像图层之前遇到高程为NoData的区域时可以尝试更换不同的全球高程服务以及地形网格密度可以在ArcGISMapView组件里调节默认值偏保守靠近地面时会看到明显的网格感。4.4 网络被拦截或服务被限制Arc Engine的数据全部走HTTPS请求而且加载是异步的。如果你的网络环境里有代理工具或者公司网络的白名单规则严格HTTP请求会被静默拦掉表现就是什么都加载不出来但不报错。排查办法是打开Console面板的Verbose日志如果看到请求超时、SSL错误这类信息基本就是网络问题。我建议入门阶段直接使用直连网络验证通了之后再考虑内网部署或离线包方案。4.5 数据瓦片还没加载完就被挪走了还有一种情况特别让人恼火——加载到一半画面已经出现了半个建筑群但白色和灰色区域交错看起来像“烂尾楼”。这通常是瓦片缓存还没构建完成或者你动了相机位置导致SDK丢弃了正在加载的瓦片。Arc Engine的流式加载机制是按需调度网络越差这个现象越严重。解决方法是加载时保持相机静止等画面稳定后再移动视角。另外可以在ArcGISMapView组件的Settings里调高“Max Level of Detail”强制提前加载高精度瓦片但会显著增加显存占用要量力而行。5. 从跑通Demo到实际项目——地形、业务数据与性能优化的一次性讲明白5.1 让场景更像“项目”自定义图层与业务数据叠加跑到这里你已经成功把真实世界装进了Unity。但“能看”和“能用”之间还差一段路。在实际项目里几乎没人只放一个官方全球底图就交付你要叠加的业务数据往往来自这几个方向用户自己的SHP/GeoJSON数据通过ArcGISGeoJsonLayer或ArcGISFeatureLayer组件加载支持运行时动态设置样式比如按属性渲染颜色、图标。ArcGIS Online/Portal上的公开服务直接在Layers里添加Elevation和Imagery也可以用ArcGIS3DObjectSceneLayer加载别人共享的倾斜摄影模型。本地离线数据用.mspkMobile Scene Package离线包。在ArcGIS Pro里打包然后丢进Unity的StreamingAssets目录用ArcGISMobileSceneLayer加载。这个方案的优点是场景加载速度快、可控性高、不依赖网络非常适合园区级数字孪生项目。5.2 性能优化瓦片加载压力与渲染压力要分开排查Arc Engine的性能瓶颈分三种你至少得会区分网络瓶颈每秒瓦片请求数过高。解决方法是降低Max Level of Detail或者用离线包把数据放在本地。CPU瓶颈GameObject数量爆炸。ArcGIS3DObjectSceneLayer加载的每栋建筑都是一个或多个GameObject一个城市的建筑模型轻松上十万个。解决办法是减少同屏可见的图层比例或者将建筑图层替换成跨平台低面数版本。GPU瓶颈过度绘制多视角相机重复渲染。ArcGISMapView在URP和HDRP管线下的Shader开销都偏高如果项目必须兼顾移动端我建议在画质设置里降低阴影距离和反射探针质量并且避免多台相机同时渲染同一个ArcGISMapView。有一个最常见的误区觉得加载慢就调高内存。Arc Engine加载的地形和建筑数据会被合批成Mesh内存占用高没有用真正要吃的是显存带宽。判断是不是显存瓶颈可以直接打开Frame Debugger看DrawCall数量和顶点数量如果顶点数量很高但DrawCall不高说明SDK已经做了合批这时再优化就只能从降低Mesh精度下手。5.3 坐标系当你手里的数据不是经纬度怎么办我见过很多团队在项目中期卡在坐标系上。业务侧交过来的数据经常是地方坐标系或投影坐标系比如2000国家大地坐标系CGCS2000的高斯-克吕格投影或者城市独立坐标系。直接输入到Arc Engine里是不认的。正确做法分两步在ArcGIS Pro里把原始数据“投影”成WGS84经纬度坐标系EPSG:4326或Web MercatorEPSG:3857。把转换后的数据发布为Feature Service或者导出成GeoJSON/SceneLayer包再接入Unity。这里有一个程序员思维容易掉的坑你不能在Unity端做坐标转换——Arc Engine的坐标体系是固定的它只认和它服务的真实地理坐标对齐的数据。任何本地坐标系的转换都要在数据准备阶段完成而不是运行时。如果你的团队没有ArcGIS Pro许可证也不是完全不能工作。用QGIS可以完成绝大多数投影转换工作然后用GeoJSON格式导入Unity。只是对于几GB级别的倾斜摄影原始数据QGIS的处理能力会比较吃力这种场景还是建议上ArcGIS Pro它的数据切片和打包能力非常成熟。5.4 一个可用于实际项目验证的体验流程最终给你一个搭好之后可以直接验证的路径。假设你要做一个园区的三维可视化在ArcGIS Online搜索或上传园区范围的影像和矢量切片。在ArcGIS Pro或QGIS里把边界地物导出为GeoJSON发布为公开服务。在Unity场景里用ArcGISMap组件配置好底图、影像、高程、3D建筑四层结构。在相机代码里定位到园区中心经纬度海拔设置到100米上下俯仰角45度。把相机控制脚本挂到ArcGISCameraComponent上跑起来验证。这条链路通了你就具备了把真实世界数据搬进Unity的基本功。之后不管接到的是城市级、园区级还是场馆级项目本质都是一样的数据准备好服务发布好地图配好相机放好剩下的只是业务逻辑的叠加。写到这里我想起第一次把Arc Engine跑通时看到北京国贸建筑群的清晰白模那种感觉确实和“用模型拼城市”完全不同——你面对的是一个真实存在、可查询、可联动业务数据的数字地球。入门之路并不长把坐标系、图层和数据流这三条线理清楚后续的难度会断崖式下降。本文还有配套的精品资源点击获取
返回列表