修改那个切片程序

时间过得好快,这周几乎什么都没做就这么结束了。这周的前半段还在为一个工作上的问题各种纠结,接下来的几天就完全无所事事了。
  前几天是为了解决Arcpy的切片问题,周一时邹院拿来一份数据,就是一份栅格图片。要求做成切片,发布成服务供领导们查看。主任想起我以前做过的领导用图,于是让我的程序跑一下这个,也算是个测试了。但结果很不理想,图是切出来了,因为这张图九十多兆,切片预览时无法预览全图。这就比较尴尬了,其实这个问题我很早就知道了,当时没怎么在意,于是就一直放着了。主任让我尽量周二前解决,解决不了的话只能先把图交给数据部处理了。曾经单纯的我以为只要肯花时间,这个问题肯定能够解决。我查遍了ArcGIS帮助文档,终于知道问题出现的原因了。当我切片时,ArcGIS会自动的调整“细节层次”,这个地方可以通过ArcGIS Server的Server editor看到并可以进行手动的调节。我发现它总是将最小的比例尺限定在1:50000000上,一旦比例尺小于这个值就不会被切出来。这么说我只需要使用Arcpy控制下这个Server editor中的“细节层次”就可以咯,我又不停地再翻ArcGIS帮助文档,丝毫没有任何关于控制这个属性的方法,哪怕server这个对象都无法获得。我甚至修改原始的.mxd文档,也尝试着修改切片函数的各种参数,结果还是丝毫没有发生变化。
  


要是能直接修改Levels of Detail就好了

我开始怀疑这是不是一个系统BUG,我可是为了完成这个切片任务特地的卸下10.0安装了10.2呀。ESRI有个论坛,里面的问题比较多,可以在里面查找遇到的各种有关ArcGIS开发方面的问题。在查找过程中我也见到了几位遇到了相似问题的外国同仁们,但利用Arcpy进行切片遇到这种问题的就更少了,并且也没有给出对我任何有效解决方案。我很失望,想到也许花费了很多时间也不一定能够解决问题。同时我开始扩大了搜索范围,并不局限在Arcpy切片上,最终看到了这样的一张帖子Manage Map Server Cache Tiles not showing all levels of detail,这位先生自问自答,给出了比较尴尬的“解决方案”:

Nevermind. I forgot to check the service properties and set them to show the new level of detail. Everything works now.

这是什么鬼!一开始我觉得很茫然,直到最后我才想明白,加上之前我查ArcGIS帮助文档时见到的Arcpy修改sddraft文件的例子。sddraft文件对我来说是个临时文件,因为生成并发送至服务器后就直接被删掉了。在程序进行切片过程中,我找准时机将sddraft文件复制了一份出来,并仔细查看了这个文档里面是否有我自己想要的信息,终于我找到了一个属性minScale!sddraft文件里面有三个,我很确定第一个属性就是我想要的,因为它的值就是500000000.这么说只要改动这个值就可以了。于是在生成sddraft文件后我又添加了几行代码:

  #修改草稿draft
    # read sddraft xml
    doc = DOM.parse(sddraft)

    # turn on caching in the configuration properties
    configProps = doc.getElementsByTagName('ConfigurationProperties')[0]
    propArray = configProps.firstChild
    propSets = propArray.childNodes
    for propSet in propSets:
        keyValues = propSet.childNodes
        for keyValue in keyValues:
            if keyValue.tagName == 'Key':
                if keyValue.firstChild.data == "minScale":
                    # turn on caching
                    keyValue.nextSibling.firstChild.data = "32000000000"

    # output to a new sddraft
    if os.path.exists(sddraft): os.remove(sddraft)
    f = open(sddraft, 'w')
    doc.writexml( f )
    f.close()

问题得到解决,我喜极而泣。原来只要花时间,还真的能够把问题解决。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,308评论 19 139
  • 前言 ||| 第二章 使用ArcPy编写脚本 Python支持大部分在其他语言中出现的编程结构。在本章内容中,我们...
    muyan阅读 90,532评论 10 55
  • 第二章 使用ArcPy编写脚本 ||| 第四章 查找和修复数据源 我们将在本章介绍以下案例: 引用当前地图文档 引...
    muyan阅读 15,158评论 19 23
  • 谈及道家,无为二字便是最好的落眼处。可是世人谈无为,却往往害于其辞,好似无为便真的无所作为,但如果真的这么作解,就...
    蕊生阅读 3,813评论 4 5
  • 每个人在行业里面的发展有两条路,第一条路你在技术上做到了顶尖,也会成为大家。 但是,你在商业上面做得好,在传播上也...
    zxc789阅读 3,733评论 0 0