修改那个切片程序

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


修改那个切片程序_第1张图片
要是能直接修改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()

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

你可能感兴趣的:(修改那个切片程序)