首页 / 资讯中心 / 文章详情

ArcGIS大规模影像管理与共享:从镶嵌数据集到服务发布

ArcGIS大规模影像管理与共享:从镶嵌数据集到服务发布 ★ FEATURED ARTICLE
简介这份PDF面向使用ArcGIS处理国产卫星影像的GIS从业者与遥感学习者聚焦大规模影像数据的管理与共享难题。内容以镶嵌数据集为核心讲解如何通过数据库编目元数据而非存储原始影像快速组织ZY02C、ZY3、HJ-1A/B等不同传感器、分辨率与波段的数据并覆盖数据预处理、创建镶嵌数据集、添加影像、设置镶嵌规则、影像匀色、构建接边线与概视图等完整流程同时给出拉伸参数、Geoid选项与栅格类型模板等实操细节。资源包共1个PDF文件大小约1.65MB便于随身查阅与按章节检索。目前已有346人学习适合需要搭建影像管理方案、排查显示与匀色问题的中高级用户参考。1. 从一堆散落影像到一张可检索的底图ArcGIS大规模影像管理到底在管什么做过测绘、遥感或者自然资源相关项目的同行大概都经历过这个场景硬盘里躺着几百个 GB 甚至几个 TB 的无人机正射影像、卫星切片、扫描地形图文件名五花八门有的按日期有的按图幅号有的干脆是“新建文件夹(3)”。想找某一块区域的影像只能靠记忆翻目录想给别人共享只能整包拷贝或者丢一个网盘链接对方拿到之后还得自己拼。ArcGIS 大规模影像管理和共享操作说明这个标题说的就是怎么把这堆散落的数据变成一套可检索、可发布、可多人调用的影像服务体系。它解决的核心问题有三个第一影像不入库就永远是文件入了库才能按空间范围、时间、分辨率去查第二影像不建金字塔和概视图缩放浏览时要么糊要么卡第三影像不发布成服务就只能靠拷贝共享没法做到“一份数据多人同时用”。这套东西适合谁适合手里有批量影像、需要给团队或跨部门提供底图服务的人比如做国土调查、城市规划、灾害监测、林业普查的团队。如果你只是偶尔看一两张图用不上这套但一旦影像上了百 GB、使用方超过三个人不上这套管理体系后面维护成本会指数级上升。2. 影像入库前的准备镶嵌数据集为什么比栅格目录更值得选2.1 先搞清楚三种管理方式的边界ArcGIS 里管影像常见的有三条路栅格目录Raster Catalog、镶嵌数据集Mosaic Dataset、以及单纯的文件夹栅格图层。很多人一开始图省事直接把影像文件夹拖进 ArcMap 或 ArcGIS Pro做个栅格图层就完事了。影像少的时候没问题一旦超过几十景加载慢、无法统一管理、没法做动态镶嵌问题全暴露出来。栅格目录是早期方案本质是一张表记录每个栅格文件的路径查询方便但显示时是逐景叠加没有动态镶嵌能力接边处会有明显缝隙。镶嵌数据集是后来主推的方案它把影像的元数据、 footprints轮廓、边界、金字塔、概视图全部存在地理数据库里原始影像可以留在文件系统也可以入库。查询时走数据库索引显示时动态镶嵌缩放时自动切换金字塔层级。对于大规模影像镶嵌数据集基本是默认选择。对比项栅格目录镶嵌数据集动态镶嵌不支持支持金字塔/概视图需单独建内建管理查询性能中等高接边缝隙处理手动自动适合规模小批量大批量2.2 创建镶嵌数据集的最小操作在 ArcGIS Pro 里创建镶嵌数据集走的是“数据管理工具箱 → 镶嵌数据集 → 创建镶嵌数据集”。关键参数有三个空间参考、产品定义、像素类型。空间参考必须和你的影像一致否则后续加影像时会报坐标不匹配。产品定义决定后续能否做正射映射如果只是做底图选“无”也行。像素类型建议选和影像一致的比如 8 位无符号。# ArcPy 创建镶嵌数据集示例 import arcpy # 输出地理数据库路径 out_gdb rC:\data\image_manage.gdb # 镶嵌数据集名称 md_name ortho_mosaic # 创建文件地理数据库如果不存在 if not arcpy.Exists(out_gdb): arcpy.CreateFileGDB_management(rC:\data, image_manage.gdb) # 创建镶嵌数据集 arcpy.CreateMosaicDataset_management( in_workspaceout_gdb, mosaic_dataset_namemd_name, spatial_referencePROJCS[CGCS2000_3_Degree_GK_CM_120E,...], # 按实际坐标系填 pixel_type8_BIT_UNSIGNED, product_definitionNONE, product_band_field, max_visible_cells )这段代码的逻辑是先确保地理数据库存在再在库里建一个空的镶嵌数据集容器。空间参考参数一定要和影像实际坐标系一致我一般会先用arcpy.Describe读一张样本影像的 spatialReference 再填进去避免手写出错。像素类型如果选错后续加影像时会出现拉伸异常或者值域截断。2.3 批量添加影像与构建金字塔创建完空容器后下一步是把影像加进去。加影像用“添加栅格至镶嵌数据集”工具支持整个文件夹批量添加。这里有个参数叫“更新概视图”建议第一次添加时勾选让系统自动处理。添加完成后必须手动构建金字塔和概视图否则缩放浏览会非常卡。# 批量添加影像到镶嵌数据集 arcpy.AddRastersToMosaicDataset_management( in_mosaic_datasetout_gdb \\ md_name, raster_typeRaster Dataset, input_pathrC:\data\ortho_images, # 影像所在文件夹 update_cellsize_rangesUPDATE_CELL_SIZES, update_boundaryUPDATE_BOUNDARY, update_overviewsNO_OVERVIEWS, # 先不建后面单独建 maximum_pyramid_levels, maximum_cell_size, minimum_dimension, spatial_reference, filter, sub_folderSUBFOLDERS, duplicate_items_actionALLOW_DUPLICATES, build_pyramidsBUILD_PYRAMIDS, calculate_statisticsCALCULATE_STATISTICS, build_thumbnailsBUILD_THUMBNAILS ) # 单独构建概视图 arcpy.BuildOverviews_management( in_mosaic_datasetout_gdb \\ md_name, build_overviewsBUILD_OVERVIEWS )添加影像时sub_folderSUBFOLDERS这个参数很关键它决定是否递归子文件夹。如果你的影像按日期分了多层目录不设这个参数会漏掉大部分文件。build_pyramids和calculate_statistics建议都开金字塔影响显示速度统计值影响拉伸效果。概视图单独构建的好处是如果后续还要继续加影像可以等全部加完再统一建一次省时间。3. 影像共享的落地路径从服务发布到权限控制3.1 发布影像服务前的检查清单影像管理好了下一步是共享。共享的本质是把镶嵌数据集发布成影像服务让别人通过网络调用。发布之前有几项必须检查镶嵌数据集的坐标系是否统一、金字塔和概视图是否已建、统计值是否已算、是否有明显的接边黑边或异常值。我见过太多人跳过检查直接发布结果服务出来一片黑或者一片白回头排查浪费半天。检查可以用 ArcGIS Pro 的“镶嵌数据集属性”面板逐项看也可以用 ArcPy 批量检查。# 检查镶嵌数据集状态 md out_gdb \\ md_name # 查看概视图是否存在 desc arcpy.Describe(md) print(Has overviews:, desc.hasOverviews if hasattr(desc, hasOverviews) else unknown) # 查看影像数量 count arcpy.GetCount_management(md) print(Raster count:, count) # 查看坐标系 sr arcpy.Describe(md).spatialReference print(Spatial reference:, sr.name)如果概视图不存在服务发布后缩放浏览会直接读原始影像几十 GB 的数据能把服务器拖垮。影像数量用来确认是否全部添加成功有时候批量添加会因为个别文件损坏而静默跳过数量对不上就要去日志里找原因。3.2 发布影像服务的关键参数发布走的是“共享 → 发布 Web 图层”选择“影像服务”。关键参数包括缓存方式、切片方案、最大影像高度、以及是否允许客户端下载。缓存方式建议选“按需缓存”因为大规模影像预生成全部切片耗时太长按需缓存第一次访问慢一点后续就快了。切片方案如果没特殊要求用默认的 Web 墨卡托或者和你的业务坐标系一致。最大影像高度这个参数控制单次请求返回的像素数设太大服务器内存扛不住设太小客户端拼接次数多。我一般设 4096 或者 8192具体看服务器配置。允许客户端下载这个选项如果数据敏感就关掉如果只是内部使用可以开方便别人导出。# 使用 ArcPy 发布影像服务需 ArcGIS Server 环境 import arcpy # 创建服务定义草稿 sddraft rC:\data\image_service.sddraft arcpy.CreateImageServiceSDDraft( in_mosaic_datasetout_gdb \\ md_name, out_sddraftsddraft, service_nameortho_image_service, server_typeFROM_CONNECTION_FILE, connection_file_pathrC:\data\server_connection.ags, server_folderimage_services, summary正射影像服务, tags影像,正射,底图 )这段代码生成的是服务定义草稿还需要经过“过渡”和“上传”两步才能真正发布。server_folder参数决定服务放在服务器哪个文件夹下建议按业务分类建文件夹不要全堆在根目录。summary和tags是给使用者看的写清楚数据范围和用途能减少很多“这个服务是啥”的询问。3.3 权限控制与访问方式服务发布后权限控制是共享环节最容易出问题的地方。ArcGIS Server 支持基于角色的权限可以控制哪些用户能看、哪些能下载、哪些能编辑。常见做法是建两个角色一个只读角色给普通用户一个管理角色给维护人员。只读角色只能调用导出和查询接口管理角色才能修改服务配置。访问方式上影像服务支持 REST、WMS、WMTS 等多种协议。REST 是原生方式功能最全WMS 和 WMTS 适合对接第三方 GIS 平台。如果对方用的是开源 GIS 软件WMTS 兼容性最好。这里要注意不同协议支持的坐标系可能不同发布前确认对方需要的坐标系是否在服务支持列表里。提示权限配置修改后需要重启服务才能生效重启期间服务不可用建议在业务低峰期操作。4. 避坑指南大规模影像管理里最容易翻车的五个点4.1 影像坐标系不统一导致添加失败现象批量添加影像时部分影像报“空间参考不匹配”添加失败。原因不同来源的影像坐标系不一致有的是地理坐标系有的是投影坐标系甚至同一个项目里混用了不同带号的高斯投影。解决添加前先用 ArcPy 批量读取所有影像的坐标系按坐标系分组统一投影后再添加。# 批量检查影像坐标系 import arcpy, os folder rC:\data\ortho_images sr_set set() for root, dirs, files in os.walk(folder): for f in files: if f.endswith((.tif, .img, .jp2)): full_path os.path.join(root, f) try: sr arcpy.Describe(full_path).spatialReference sr_set.add(sr.name) except Exception as e: print(Error reading:, full_path, e) print(Unique spatial references:, sr_set)如果输出集合里不止一个坐标系就必须先做投影转换。投影转换用“投影栅格”工具注意转换时重采样方法的选择连续数据用双线性分类数据用最近邻。4.2 概视图没建导致缩放卡死现象服务发布后缩小到全局视图时客户端卡死或者长时间无响应。原因概视图没建或者建得不完整客户端每次缩放都要读原始高分辨率影像。解决发布前确认概视图已建如果影像还在持续增加可以设置定时任务定期重建概视图。概视图的构建时间取决于影像总量几十 GB 的影像可能要跑几个小时。建议在非工作时间跑并且监控磁盘空间概视图本身也会占用不少存储。4.3 接边处出现黑边或白边现象多景影像拼接处有明显的黑边或白边。原因影像本身带有无效值NoData但镶嵌时没有正确设置 NoData 值导致无效区域被当作有效像素渲染。解决在镶嵌数据集属性里设置正确的 NoData 值或者在添加影像时指定。# 设置镶嵌数据集的 NoData 值 arcpy.SetMosaicDatasetProperties_management( in_mosaic_datasetout_gdb \\ md_name, nodata_value0 # 根据实际影像的无效值填 )不同影像的 NoData 值可能不同有的用 0有的用 -9999。如果统一设置解决不了可以在添加影像时逐景指定或者在镶嵌时用“轮廓”做裁剪。4.4 服务发布后查询返回空结果现象服务能访问但按空间范围查询时返回空。原因镶嵌数据集的 footprints 没有正确计算或者查询用的坐标系和服务坐标系不一致。解决先检查 footprints 是否覆盖了影像实际范围再确认查询请求里的坐标系参数。# 重新计算 footprints arcpy.BuildFootprints_management( in_mosaic_datasetout_gdb \\ md_name, reset_footprintRADII, min_data_value1, max_data_value255, approx_footprintNO_APPROX )reset_footprintRADII表示按有效像素半径计算轮廓适合大多数影像。如果影像有旋转或者不规则形状可能需要用NO_APPROX精确计算但耗时会增加。4.5 并发访问时服务响应变慢现象多人同时访问影像服务时响应时间明显变长。原因服务器内存或连接数不足或者按需缓存第一次访问时并发太高。解决增加服务器内存调整服务实例数或者对热点区域预生成缓存。服务实例数在服务配置里调整一般设为 CPU 核数的 1.5 到 2 倍。预生成缓存用“管理缓存”工具可以按比例尺级别生成优先覆盖访问频率高的区域。5. 进阶技巧用金字塔层级和缓存策略把浏览体验压到秒开影像服务做到能用的程度不难难的是做到好用。我自己的经验是浏览体验的瓶颈往往不在服务器性能而在金字塔层级和缓存策略没调对。金字塔层级决定了不同缩放级别下读取哪一层数据层级不够缩放时就会频繁读原始影像层级过多构建时间和存储又浪费。一个实用的调优方法是先统计影像的平均分辨率和最大分辨率按 2 的幂次生成金字塔层级直到最顶层单幅影像不超过 256×256 像素。ArcGIS 默认会算但默认值不一定最优。可以在构建金字塔时手动指定层级数。# 手动指定金字塔层级构建 arcpy.BuildPyramids_management( in_rasterout_gdb \\ md_name, pyramid_level12, # 按实际需要调整 skip_firstNONE, resample_techniqueBILINEAR, compression_typeJPEG, compression_quality85 )pyramid_level设多少合适我一般会先看影像的最大分辨率比如 0.2 米分辨率全局范围如果是 100 公里那需要的层级大概是 log2(100000/0.2/256) 约等于 11 层。设 12 层留一点余量。compression_type用 JPEG 能显著减小金字塔体积但会损失一点精度如果做量测分析建议用 LZ77 无损压缩。缓存策略上按需缓存适合访问范围不固定的场景预生成缓存适合热点区域固定的场景。我通常的做法是全局低层级比如 1 到 6 级预生成因为这部分数据量小、访问频率高高层级按需生成因为数据量大、访问范围分散。这样能在存储和体验之间取得平衡。注意预生成缓存后如果影像更新了需要重新生成对应区域的缓存否则会看到旧数据。建议在影像更新流程里加一步缓存刷新。最后说一个我踩过的坑有一次帮某团队调影像服务怎么调都慢后来发现是服务器磁盘 IO 瓶颈影像和概视图放在同一块机械盘上并发读取时磁头来回寻道。换成 SSD 之后同样的配置响应时间直接降了一半。所以调优之前先看硬件别上来就改参数。希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?
咨询建站