zoukankan      html  css  js  c++  java
  • 使TileCache配合OpenLayers,产生地图瓦块的一些资料(转)

    在tilecache.cfg中配置好被切割地图的参数,比如:

    [mytestmap]
    layers=3,5,7,8
    type=WMS
    url=http://localhost/arcgis/services/mytestmap/MapServer/WMSServer
    extension=gif
    bbox=120.00,30.00,125.00,35.00
    extent_type=loose
    resolutions=0.0007936954220105229,0.00031747816880420905,0.00015873908440210453,0.00007936954220105226,0.000031747816880420904,0.000015873908440210452

    其中,
    mytestmap为自定义的名字,随便起
    type就不用说了
    url为发布的wms服务地址
    extension为切出来图片的格式
    bbox为图副的范围,单位是经纬度,依次为左下角和右上角的经纬度
    extent_type=loose意思是在指定范围内切图的时候,边缘部分如果多一条的情况下,宽松处理,就往规定外围再扩一些
    layers为wms中图层名称的列表,越往后越在图层的上层,这里最后一个8是最上层的,排列好,千万别把区放在最上面,否则切了半天白切了!!!!
    resolutions为解析度列表--和比例尺转化见附
    当然还可以定义其他的参数,可以参见tilecache的帮助文档

    cmd中执行命令行
    python "E:wwwroot ilecache ilecache_seed.py" mytestmap 0 6
    即可产生瓦块地图
    如果切的比例尺很大的话要切很久很久很久。。。

    【附】解析度与比例尺换算关系:
    resolution:------------------scales(1:X)

    0.15873908440210452---------50000000
    0.031747816880420915---------10000000
    0.015873908440210457---------5000000
    0.007936954220105229----------2500000
    0.0031747816880420914---------1000000
    0.0015873908440210457---------500000
    0.0007936954220105229---------250000
    0.00031747816880420905--------100000
    0.00015873908440210453---------50000
    0.00007936954220105226---------25000
    0.000031747816880420904--------10000
    0.000015873908440210452--------5000     
    0.000007936954220105226---------2500

    1.以上的13个比例尺级别是googlemap中的比例尺级别
    2.解析度的值意义就是:一个px的单位所代表的实际距离,单位是degree
    3.dpi是按照96计算的

     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    如果能让tilecache直接访问缓存中的图片,不再需要wms服务,地图加载速度就会很快,这就需要tilecache切图与openlayers缩放级别相互配合,翻译了一些相关资料,都是来自于官方网站,可能不准确,下面都有英文原文链接。网上相关资料太少了,而且大部分都是英文,特将翻译给中国人共享之。


    配置Openlayers中的缩放级别

    OpenLayers Map可以在不同的比例尺或解析度下显示他的每一个layer
    map对象含有缩放级别的引用,即ZoomLevels,而且允许他的每一个layer去自定义他们自己的缩放级别,使之看起来合适
    可以通过在构造函数中设置options属性来配置openlayers layer的缩放级别

     == 正常图层==
    对于基于openlayers.layer的正常layer,和能够在任何解析度下显示的layer,存在多种不同的方式去配置缩放级别和他们各自的比例尺和解析度

    “解析度数组”:
    要是转化缩放级别成为解析度,需要一个{{{resolutions}}}数组,他是这个图层所支持的不同解析度的列表,缩放级别就仅仅是一个解析度数组的索引,解析度数组始于0终于缩放级别-1

    比如:
    一个图层的解析度为[a,b,c],那么缩放级别的0就是a ,1就是b。。。


     === 配置解析度数组的方式 ===

     可选项:
     {{{scales}}} - ''Array'' -- 预先设置比例尺值的数组
    {{{resolutions}}} - ''Array'' -- 预先设置解析度值的数组
     {{{minScale}}} - ''float'' --layer能够显示的最小比例尺
     {{{maxScale}}} - ''float'' --layer能够显示的最大比例尺
     {{{maxResolution}}} - ''float'' --layer能够显示的最大解析度
    {{{minResolution}}} - ''float'' -- layer能够显示的最小解析度
    {{{minExtent}}} - ''!OpenLayers.Bounds'' --layer能显示出的最小范围
    {{{maxExtent}}} - ''!OpenLayers.Bounds'' -- layer能显示出的最大范围
    {{{numZoomLevels}}} - ''int'' -- 缩放级别的总数
    {{{units}}} - ''String'' - layer显示的单位,作用于比例尺-解析度换算

    Example Declarations:
    {{{
        var options = { scales: [50000000, 30000000, 10000000, 5000000],
                        resolutions: [1.40625,0.703125,0.3515625,0.17578125,0.087890625,0.0439453125],
                        minScale: 50000000,
                        maxResolution: "auto",
                        maxExtent: new OpenLayers.Bounds(-180, -90, 180, 90),
                        maxResolution: 0.17578125,
                        maxScale: 10000000,
                        minResolution: "auto",
                        minExtent: new OpenLayers.Bounds(-1, -1, 1, 1),
                        minResolution: 0.0439453125,
                        numZoomLevels: 5,
                        units: "degrees"
                      };
        map = new OpenLayers.Map( $('map') , options);
    }}}


    显然所有的配置项不能在一次设置中全都用上,因为他们可能相互冲突,他们会按照下面的优先级起作用:
     
    [A]【预设的缩放级别列表】缩放级别由预先设置的比例尺或解析度决定

    {{{scales}}} -解析度的数组由这些比例尺直接转化而来
    {{{resolutions}}} - 解析度数组直接从初始化函数的option参数中带来
    Examples:
    {{{
        var options = { scales: [50000000, 30000000, 10000000, 5000000] };
        map = new OpenLayers.Map( $('map') , options);
    }}}

    {{{
        var options = { resolutions: [1.40625,0.703125,0.3515625,0.17578125,0.087890625,0.0439453125] };
        map = new OpenLayers.Map( $('map') , options);
    }}}

     * '''maxResolution and numZoomLevels''' - ''!ZoomLevels are determined based on a maximum resolution and the number of desired !ZoomLevels''


    [B]【最大解析度 &缩放级别的总数】缩放级别在最大解析度和缩放级别的总数上被决定
    B1 最大解析度的确定
     {{{minScale}}}  --解析度的值从比例尺由单位{{{units}}}转化来
     {{{maxExtent}}} AND {{{maxResolution == "auto"}}} --解析度由地图的div尺寸和maxExtent属性计算而来。若maxExtent属性未指定,默认从map继承,即全世界
     {{{maxResolution}}}--解析度的值直接从layer的options参数中带来,若没指定,则默认为从map的options中带来
    B2 缩放级别的总数确定
        B2_a基于最大和最小解析度的比值来计算--确定最小解析度:
     {{{maxScale}}} --解析度的值从比例尺由单位{{{units}}}转化来
     {{{minExtent}}} AND {{{minResolution == "auto"}}}--解析度的值基于地图div尺寸和minExtent属性来计算。minExtent属性必须被指定,默认不从map继承
     {{{minResolution}}} --解析度的值从layer指定的option参数中直接带来,若没指定,最小解析度保持为空,缩放级别数直接接受
        B2_b {{{numZoomLevels}}}缩放级别数直接从layer指定的option参数带来,若没有指定默认从map的option带来

    Examples:

    ||maxResolution||Converted from minScale using specified units||
    ||numZoomLevels||Default from map||
    {{{
        var options = { minScale: 50000000,
                        units: "degrees"
                      };
        map = new OpenLayers.Map( $('map') , options);
    }}}
    [[BR]]

    ||maxResolution||Calculated based on div size and default maxExtent from map||基于div的尺寸和地图最大范围计算
    ||numZoomLevels||Calculated using ratio of maxResolution/minResolution||用最大最小分辨率的比值计算
    {{{
        var options = { maxResolution: "auto",
                        maxExtent: new OpenLayers.Bounds(-180, -90, 180, 90),
                        minResolution: 0.0439453125
                      };
        map = new OpenLayers.Map( $('map') , options);
    }}}
    [[BR]]

    ||maxResolution||Specified||
    ||numZoomLevels||Specified||
    {{{
        var options = { maxResolution: 0.17578125,
                        numZoomLevels: 15
                      };
                map = new OpenLayers.Map( $('map') , options);
    }}}
    [[BR]]

    ||maxResolution||Default from map||
    ||numZoomLevels||Converted maxScale (using default units from map) to minResolution, then uses ratio of maxResolution/minResolution to calculate numZoomLevels||
    {{{
        var options = { maxScale: 10000000 };
        map = new OpenLayers.Map( $('map') , options);
    }}}
    [[BR]]

    ||maxResolution||Specified||
    ||numZoomLevels||Calculated minResolution based on div size and default minExtent from map, then uses ratio of maxResolution/minResolution to calculate numZoomLevels||
    {{{
        var options = { maxResolution: 0.17578125,
                        minResolution: "auto",
                        minExtent: new OpenLayers.Bounds(-1, -1, 1, 1),
                      };
        map = new OpenLayers.Map( $('map') , options);
    }}}

    英文原版:http://trac.openlayers.org/wiki/SettingZoomLevels
    ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    TileCache配置
    =============
    有一些参数是控制tilecache并且应用于所有的图层
    bbox-图层的外围框范围,解析度数组默认的解析度等于外围框范围除以512(2000个瓦块)
    debug--是否发送调式信息到error.log,默认是yes,可以设置为no
    description--图层描述,用在一些返回元数据的响应中,默认为空
    extension--图层的文件扩展(名?),用来从WMS服务器中请求图片,也用在产生缓存(图片)文件时
    layers--用来描述图层的字符串,主要是被直接传给渲染器。WMSLayer发送http请求,MapServerLayer根据这个字符串选择响应的图层来呈现。若没有提供layer,layer name 被用来填充这个属性
    levels--一个整数,描述缩放级别的数字或支持的比例尺。若忽略则被解析度覆盖。
    mapfile--mapfile的绝对路径,是MapServer 和Mapnik layers所需要的
    maxResolution--解析度的最大值,若这个被设置了,解析度的数组会自动地被计算出来,计算时依据levels的值
    metaTile--设置yes会打开metaTiling,这将会请求更大的瓦块,并且用Python Imaging library切开,默认为no
    metaBuffer--需要设置在呈现出的瓦块周围的像素数。很好的解决不同地图返回后产生的边缘问题,默认为10
    metaSize--一对由逗号隔开的整数,用来决定当用metaTiling的时候应当呈现多少瓦块,默认为5,5
    resolutions--你想让TileCache支持的一组解析度的列表,由逗号隔开
    size--逗号隔开的整数,描述瓦块的宽/高,默认为256,256
    srs--空间参考系的字符串,默认为 "EPSG:4326" 
    type--图层的类型,选项有WMSLayer, MapnikLayer, MapServerLayer, ImageLayer
    url---远程 WMS 服务器的访问地址,为WMSLayer必须
    watermarkImage--水印图片参数是在每一个图层被指定的,你想作用在每个地图瓦块上的的图片的路径。我们建议你用和瓦块尺寸大小相同的图片,如果你用了默认的瓦块尺寸,你就应该用一张256*256的图片
    注意:Python Imaging Library不支持交织的图片(??)
    watermarkOpacity--这个参数在每个图层上被指定,用来配置水印的不透明度,这是个0-1的浮点数,是可选的
    extent_type--设置成‘loose’将会允许TileCache在最大边界框之外产生图片。在客户端不知道何时停止请求地图瓦块时很有用。
    tms_type--设置成‘google’将会时瓦块转换垂直放上的顺序(即,符合google类型的x/y模式)


    配合OpenLayers使用TileCache
    ===============================
    使用tilecache运行openlayers的时候,OpenLayers.Layer.WMS构造函数中的URL必须指向tilecache脚本,比如tilecache.cgi或tilecache.py.可以参考例子,tilecache中的index.html

    【让tilecache工作的配置方法。。略】
    最重要的是保证openlayers的图层和你的tilecache图层具有相同的解析度和边框。
    你可以在openlayers中通过resolutions或者maxResolution选项来定义解析度,定义的maxExtent应当和TileCache图层所定义的bbox相匹配

    如果你用tilecache来覆盖的话,你应当设置图层的reproject选项为false

    让TileCache播种
    ======================
    tilecache_seed.py脚本能够自动地产生地图瓦块,你需要安装tilecache按照上面的配置好

    用法
    -----
         tilecache_seed.py [options] <layer> [<zoom start> <zoom stop>]

    可选项
    -------
      --version             显示程序的版本且退出
      -h, --help            显示帮助信息且退出
      -f, --force           强制重新生成瓦块,即使缓存中已经存在
      -b BBOX, --bbox=BBOX  限制在指定的边界内
      -p PADDING, --pading=PADDING
                             在产生瓦片的目标区外边缘的额外的瓦块,默认为0(一些边缘瓦块将会变没)。值为1会保证所有的瓦块被创建,但是一些瓦块可能在你定义的边界之外

    参数
    ---------

        layer 
           tilecache.cfg中配置的layer名字
        zoom start
           开始的缩放级别
        zoom end
           结束的缩放级别

  • 相关阅读:
    Java实现 洛谷 P1060 开心的金明
    (Java实现) 洛谷 P1605 迷宫
    (Java实现) 洛谷 P1605 迷宫
    (Java实现)洛谷 P1093 奖学金
    (Java实现)洛谷 P1093 奖学金
    Java实现 洛谷 P1064 金明的预算方案
    Java实现 洛谷 P1064 金明的预算方案
    (Java实现) 洛谷 P1031 均分纸牌
    QT树莓派交叉编译环开发环境搭建(附多个exe工具下载链接)
    武则天红人对唐睿宗的桃色报复(如此缺少城府,注定了要在宫廷中过早地出局)
  • 原文地址:https://www.cnblogs.com/jinqier/p/3434543.html
Copyright © 2011-2022 走看看