kikita & Maps

GIS,spatial and artificial intellegence learning and share

上一篇博客中提到工具还有投影坐标系支持和切片方案(.xml)自动获取的问题尚未解决,更新这篇的目的在于说明问题已经找到了workaround,并且新的版本已经在上周五(9.21)发布了。

问题诊断过程

这两个问题其实本质上是一个问题。

我们知道,当需要生成矢量切片的地图的坐标系不是 3857(web mercator)时,ArcGIS Pro 提供的 Create Vector Tile Package / Index 工具可以自动生成与地图的坐标系统一致的切片方案(.xml)文件,默认放置于 C:\Users\当前用户\AppData\Local\ESRI\Geoprocessing 下。
这是个极好的功能,但是通过python调用此工具时,这个功能是没有提供接口的。此处的疑惑,也咨询了Esri US 的工程师,确实arcpy没有提供像工具UI中的自动计算功能。

在最初的版本中,我尝试使用arcpy.GenerateMapServerCacheTilingScheme_server() 来生成xml文件,可以应对地理坐标系的地图。也是这个过程中遇到了切片原点传参失败这个坑
投影坐标系的切片原点不像是地理坐标系一样简单粗暴,不同的投影方法都会导致不同的原点坐标,我想过将常用坐标系枚举出来,可是从工具的通用角度来讲,不是个好事。最佳的解决方法还是想办法生成相同的xml,至少可以获取工具生成的xml。

在上个版本的局部更新矢量切片工具中,我和马老师还自命名了“Advanced Vector Tile Package”的矢量切片包,我们在矢量切片包中还打包塞入了切片方案和切片索引面。这样,局部工具在更新这种包时,可以自动解析原包获取xml和index。但是,需要用户事先使用我们定制的 Create Advanced Vector Tile Package 工具来创建矢量切片包。

解决方法

考虑到用户在更新矢量切片之前,已经做过该地图的矢量切片,那么在User那个目录下已经有了对应的xml文件,那么我只要代码中获取了地图的坐标系,然后按照xml的命名规则顺藤摸瓜并顺手牵羊即可。
现实总是比想象骨感。ArcGIS Pro 的 arcpy 中提供的 Map 对象竟然没有提供查询其坐标系统的属性或方法…… 测试基于ArcGIS Pro 2.2.1,写这篇时的最新版本。相信新的版本早晚会有的。好在我还是找到了一个workaround:从map的defaultCamera属性中获取,如下图左边最下部分所示。(现在没有测试环境,图出自讨论时的聊天记录,将就看吧)

使用这个思路之后,解决了本文开头提到的问题,但是要求用户本机user目录下事先有相关的xml文件,没有的话需要打开创建矢量切片工具自动生产一次。

工具的相关代码都进行了更新,采用了新的逻辑,目前可以支持矢量切片工具自身支持的全部坐标系统。并同时保留了,上个版本的局部更新工具中可以自动解析 Advanced Vector Tile Package 功能。

工具地址

Latest VersionPartially Upate ArcGIS Vector Tiles Toolbox 3.1.0

收尾

这个工具即与工作相关,又是业余之作。自己执念太重,希望在esri工作的最后一天归还机器前尽快改好发布出来,因为将来的投入时间和测试环境,不知道是否能够保证。自己可见的坑还是自己填好比较稳妥,哈。姑且把这个版本当成最后的latest版本吧。因为这个工具的更新,搞得最后一天的时间特别紧张,没有和很多同事道别,不过将来总有机会再见的。

An image service of ArcGIS Server provides access to raster data through a web service. ArcGIS Image Server is required to share a mosaic dataset. This testing reporting indicates workflows and issues of sharing Image Service which is basing on a mosaic dataset referencing the raster dataset on a cloud storage.

Local Testing Environment

  • Latest Esri Technologies
    • ArcMap 10.6.1 ( both final release version and early adopter version)
    • ArcGIS Enterprise 10.6.1 with ArcGIS Image Server 10.6.1
  • Windows 10 Pro 64 bit English Version

Huawei Cloud

Steps

  1. Create Huawei Cloud connection file (√)

  2. Add raster to a local mosaic dataset referencing the connection file (√)

  3. Share the mosaic dataset as an image service (√)

  4. Consume this service in various client browsers (√)

Alibaba Cloud

Steps

  1. Create Huawei Cloud connection file (√)
  2. Add raster to a local mosaic dataset referencing the connection file (√)
  3. Share the mosaic dataset as an image service (√)
  4. Consume this service in various client browsers (×)

Explanation

  • It requires EA version installed on English language windows OS to avoid the failure of step 1 and step 2.

  • Checkerboarding on image service at now. and new case summitted for diagnose this issue.

    Internal Case #02172207 summited

For the purpose of assisting and sharing , I will try to write in English.

The new tool Create Cloud Storage Connection File is first introduced to ArcGIS Desktop 10.6.1 which is the latest version until now. The Create Cloud Storage Connection File tool creates a connection file (***.acs**) for ArcGIS-supported cloud storage. It allows existing raster geoprocessing tools to write cloud raster format (CRF) datasets into the cloud storage bucket or read raster datasets (not limited to CRF) stored in the cloud storage as input.

This is an amazing new feature of ArcGIS Desktop, including ArcMap 10.6.1 and ArcGIS Pro 2.2. The stuff from one of our partners and I are doing some researching on the new capability. This article is something about the testing report, which indicates the feasibility of various workflows for adding raster datasets to mosaic dataset.


Local Testing Environment

  • Latest Esri Technologies

    • ArcMap 10.6.1

    • ArcGIS Pro 2.2.1

  • Windows 10 Pro 64 bit English Version



Huawei Cloud

ArcMap

  • Steps

    1. Create Huawei Cloud connection file (√)
    2. Add raster to a local mosaic dataset (√)
  • Conclusion

    • Bingo ! This workflow for source raster dataset in Huawei Cloud is perfect.

ArcGIS Pro

  • Steps

    1. Create Huawei Cloud connection file (√)

    2. Add Raster to Mosaic Dataset (×)

      • Error Message as below:

        Failed to execute. Parameters are not valid.

        Error: 000732 Input Data: Dataset …\HuaWeiConnection.acs\…LGN00_MTL.txt does not exist or is not supported

    3. Trying workaround: Add Raster to Mosaic Dataset using arcpy (python 3.x for ArcGIS Pro).

      For the purpose of verification , Add Raster to Mosaic Dataset using arcpy (python 2.x for ArcMap), it works. (√)

  • Conclusion

    • It should be a bug of ArcGIS Pro, that the tool Add Rasters To Mosaic Dataset can not recognize the logical file path including cloud connection. The tool will justify the path if it exists. The path containing cloud connection is a logical path , not a physical path.  The same input file path works in ArcMap.

    • Internal case submitted #02166069 - closed

      Related bug: BUG-000116191

      Workaround: Store the rasters in the root of the bucket, and add them from that location.


ALiBaBa Cloud

In China, we also call it ALiYun.

ArcMap

  • Steps

    1. Create ALiBaBa Cloud connection file (×)

      The connection file was created, but there was a warning: WARNING 002574: Could not connect to cloud storage in the log

    2. Create a mosaic dataset in a local file geodatabase (√)

    3. Add raster to mosaic dataset (×)

      An error occurred: Error: 8004205f: No new mosaic dataset item was added.

      This error may due to the warning before, I think.

  • Conclusion

    • It may be a bug related to creating connection file to ALiBaBa Cloud Storage. ArcPy (python 27) for ArcMap didn’t work, either.

    • Extra diagnose

      • Using Fiddler to capture the HTTP(S) requests…

        I have used Fiddler Software to catch the HTTP(S) requests made by ArcMap, but nothing was found. I had enable the https capture before testing. At the same time , I checked the Windows Task Manager and Resource Monitor that there was a lot of network activities.

      • Using Wireshark to capture the network transaction …

        Bad TCP records were found.

ArcGIS Pro

  • Steps

    1. Create ALiBaBa Cloud connection file (×)
    2. Create a mosaic dataset in a local file geodatabase (√)
    3. Add raster to mosaic dataset (×)
  • Conclusion

    • Same issue with using HUAWEI cloud source data, and the issue points to the tool not to the cloud itself.
    • ArcPy (python 36) for ArcGIS Pro didn’t work, either.

Internal case submitted #02157762

Related bug: BUG-000116297

Workaround: Internal Version 9226


Custom Cloud

using s3 compatible cloud, for example, Tencent Cloud.

  • Steps

    1. Create Tencent Cloud connection file using ArcPy (python 27) for ArcMap
    2. Capture network interaction information using WireShark
      • As Amazon Provider selected, the region and endpoint will request Amazon CNAME address. In this condition, I don’t think the custom cloud works for now.
  • Internal case submitted

    #02157772 Can Service End Point parameter be customized by users when connecting to the cloud storage ?


Other Issue

failure with file Geodatabase transfer

  • Details

    When the file geodatabase was copied to a new location ,which was some scheme of path as before, on the other new machine . The mosaic dataset didn’t show up the source raster data at all.

  • Internal case submitted

    #02165287 how to transfer mosaic dataset referencing raster dataset in cloud storage



The information above is valid as the day it published, I will try my best to have it up to date.

Thank you for reviewing.

为什么会有这个需求和想法呢?还是源自于 局部更新矢量切片 的想法,当我们遭遇一个海量矢量数据的矢量切片创建更新任务时,希望尽可能少且尽可能准确地更新受影响的bundle,而不是全局,那么了解bundle的范围是十分必要的。在写上一篇《紧凑型缓存技术小结》的时候,目的在于在其基础之上探索矢量切片的bundle。

为了确保单个bundle文件的矢量切片数据的完整性,每级每次至少需要更新一个bundle文件。当矢量切片的数据量不显著的时候,可能每级本身也就一个或几个bundle,那局部更新体现不出它的优势; 当某些等级(例如LOD比较大的级别)矢量切片bundle非常多的时候,如果更新的范围只影响了其中一个,或者几个文件时,局部更新是有必要的。

结论

参照栅格切片的 帮助文档 中明确说明的,  “A bundle contains up to 16,384 tiles. ” 那就是 128 × 128 的关系,照搬到矢量切片是否适用呢? 通过验证,确实如此。

先上结论,第N级的矢量切片的bundle范围刚好是第N-7级的切片范围,如下图,红线是 level 6 的切片索引,刚好可以作为level 13 的bundle范围:

示例

为了做验证和测试,我用了美国大选的区块数据做实验,这个面数据包含182895条记录,节点较多,很适合做矢量切片。假设,需要更新的切片范围仅仅是密歇根湖的一角:

PS:上图是完全由 ArcGIS Pro 制作导出的,使用到了 Layout , Extent Indicator; 从制图角度来说,ArcGIS Pro 是个非常好的桌面端应用,可以继承和超越ArcMap。

以13级为例,更新的这一角仅需替换一个bundle:

那么自定义工具 Create Part Vector Tile Package 所要做的工作,逻辑就变得非常清晰,也就是通过用户提供的待更新区域(AOI)来计算每级被影响到的bundle文件的地理范围,从而进行bundle的替换工作;包含了为其服务的,解包、打包、解析类的工作。

工具

Latest Version: Partially Upate ArcGIS Vector Tiles Toolbox 2.1.1

待解决的问题

  • 投影坐标系和自定义坐标系支持
  • tile scheme 原生获取

Tiling Scheme

每个缓存服务的切片目录中都会包含一个 Conf.xml,也是就是tile scheme 文件了。

这个文件包含了很多有关切片设置的信息:

  • Spatial reference information
  • Tile origin
  • Tile width/height
  • DPI
  • LODs (Levels of detail - scales)
  • Tile Image format
  • Compression quality
  • Antialiasing settings
  • Storage method

Version Issue

紧凑型缓存的存储格式为**.bundle** 。但有时我们会看到缓存目录中包含**.bundlx** 这样的文件,这说明这些缓存是ArcGIS 10.2.2 或以下版本创建的。从 ArcGIS 10.3 开始,紧凑型缓存做了些改进, .bundlx(tile index information) 文件被包含到了 .bundle 文件中 ,从而进一步降低了文件的数量。

你可以在缓存服务的tiling scheme “Conf.xml“ 中查看确认:

10.3 or later (Compact cache V1)

1
2
3
4
<CacheStorageInfo xsi:type='typens:CacheStorageInfo'>
<StorageFormat>esriMapCacheStorageModeCompact</StorageFormat>
<PacketSize>128</PacketSize>
</CacheStorageInfo>

10.2.2 or former (Compact cache V2)

1
2
3
4
   <CacheStorageInfo xsi:type='typens:CacheStorageInfo'>
<StorageFormat>esriMapCacheStorageModeCompactV2</StorageFormat>
<PacketSize>128</PacketSize>
</CacheStorageInfo>
  • 10.3 及之后版本的 ArcGIS Server 仍然可以使用低版本的生产的切片来运行现有服务。如果我们需要将低版本的缓存拷贝过来给高版本的服务用,要注意这个<StorageFormat>参数的一致性。
  • ArcToolbox工具 Upgrade Map Server Cache Storage Format 来升级缓存。升级的过程中不会重新创建切片,而是重组原有的切片。这个工具在ArcGIS Pro 中没有提供。目前,我们还只能使用ArcMap或者使用ArcGIS Server 带有的arcpy包,通过Python来调用。
  • 不支持将高版本的切片供低版本软件使用。如果希望降级,可以使用 Export Map Server Cache 工具导出紧凑型切片。

Tile Format

Tile Format 是指存储切片使用了何种栅格格式,而不是切片文件的本身存储格式 / Storage Format ( Exploded / Compact )。

  • PNG

    ArcGIS 10.1开始引入的类型。选择这种类型,Server会自行确认每张切片的PNG位深,从而达到缩减磁盘占用的目的。在我们不确定使用何种PNG格式时,保持这个默认设置就不错。

    如果磁盘空间不在考虑范围下,而希望优先考虑切片速度,那最好选择MIXED格式了。

  • PNG8

    位深为8位的PNG图片格式;可以最多存储256色,支持布尔透明,磁盘空间占用小,并且无损。适合于颜色相对简单,并且需要透明背景的地图,例如公路数据切图。

  • PNG24

    位深为24的PNG图片格式;可以最多支持约1600万色。当地图的色彩复杂程度超过256时,你就该考虑使用这个格式。但是,PNG24不支持透明,另外不建议在IE6及以前版本浏览器中使用。

  • PNG32

    在PNG24的基础上增加了Alpha通道,因而增加了各种程度半透明的支持。当地图色彩复杂,并开启了抗锯齿功能,PNG32就是最佳选择了,并且PNG32在各个版本的浏览器中支持良好。

  • JPEG

    当切片中不需要透明背景时,JPEG是最常用的切片格式,并且JPEG可以hold住大量的复杂色彩。例如,包含影像、符号化精细程度高的矢量地图都可以使用这个格式。

    JPEG是种有损压缩格式,可以在1%-100%间设置压缩比率,默认值75%一般是显示质量和磁盘空间的最佳平衡。如果觉得噪点过多质量不够,可以调高这个百分比,但你需要在响应性能和图片质量之间做好博弈。

  • MIXED

    顾名思义,混合格式,在切片不透明区域使用JPEG,在透明区域使用PNG32。这是种非常智能的搭配方案,降低硬盘占用的同时,很好的解决了例如在切片边缘需要的透明需求。

  • LERC

    LERC是Esri自主研发的开源的有损压缩格式,点这里有更多信息。推荐用于位深较大的单波段影像或高程数据服务中,如浮点型,32-bit、16-bit、12-bit的数据。 官方声称,LERC压缩方法在压缩速度和压缩质量方面分别是LZ77的5-10倍。当LERC用于整型栅格数据时,损失率在0.99或更低,几乎可以视为无损压缩。

    LERC压缩方式目前只支持Image Service ,而不支持 Map Service。

Performance Suggestion

紧凑型切片比松散型切片有诸多有点,详见文末的官方文档。但不是说选了紧凑型切片性能就没有继续改善的余地了,下面的这些点也是提升切片性能的一些有效建议:

  • 地图数据尽可能使用本地数据,共享目录的数据切片时间可能会更长些;
  • 尽可能的避免使用动态投影;
  • 设置图层的可见比例尺;
  • 谨慎设置反锯齿的级别,标注的反锯齿对切片性能影响甚微,但要素符号的反锯齿会显著增长切片的时长;
  • 建议切片期间关闭防病毒等安全软件;
  • 尽可能地使用MIXED格式
  • 在切片之前为所有数据创建空间索引
  • CachingTools服务的最大实例数 = 核数 + 1,这是官方给出的最佳实践建议
  • 降低日志的级别,如果在大量切图任务中把Server日志开到Debug或Verbose级别,会产生极大的资源浪费。

Tile|SuperTile|Bundle

这三者的关系早在多年前就有大牛们探索发现过,见本文末的相关文章,文中有逻辑缜密且经得起时间检验的详细演绎过程……

简言之,他们的关系是个简单的数学关系,如下:

1
2
3
4
5
6
7
8
9
如果:
Tile = 256 × 256 pixel # 256×256 是ArcGIS Server默认的切片大小
Supertile = 4096 × 4096 pixel # 未开抗锯齿情况下是 4096×4096
那么:
Supertile = 16 × 16 Tile
已知:
Bundle = 128 × 128 Tile
因此:
Bundle 范围是 N-3 级的 Supertile 的范围

看图说话:

官方文档:

  • 了解紧凑型缓存存储格式

相关文章:

  • 菩提老王的葡萄架子:ArcGIS Server 10中的切图/缓存机制深入
  • 牛魔王的作坊:ArcGIS 切片缓存紧凑文件格式分析与使用
  • ArcGIS产品与技术专栏:Esri中国ArcGIS for Server 10.3.X 新型紧凑型缓存的解读和应用
0%