• geoserver 的缓存技术


    geoserver提到的缓存工具共有两个:tilecache和geowebcache。geowebcache是java写的,整合进geoserer中。

    tilecache则是python写的一个小程序。

    tilecache是由MetaCarta Labs开发的用来缓存地图,配合openlayers使地图显示更快。可以把tilecache想成一个中间件,WMS服务器不用自己缓存地图,tilecache可以帮他完成。tilecache支持多种服务器和多种OGC服务标准,以及支持多种请求方式和格式。

    tilecache的配置可以看ESRI论坛的教程,因为我是用ubuntu和apache的,可能配置上有些不同,但使用大致还是相同的。tilecache中有一个tilecache.cfg文件,这是个配置文件,当有用户请求时,tilecache会载入这个文件。下面是我的配置文件,

    1
    2
    3
    [cache]
    type=GoogleDisk #默认是Disk,googledisk是以z/x/y.extension的方式存储
    base=/tmp/tilecache #缓存的路径
    1
    2
    3
    4
    5
    6
    7
    8
    [google] #图层的名称
    type=WMSLayer #
    url=http://192.168.1.106:8080/geoserver/wms #wms的url
    layers=topp:states #wms所拥有的图层
    extension=png
    resolutions=156543.033900000,78271.516950000,39135.758475000,19567.879237500,9783.939618750,4891.969809375,2445.984904688,1222.992452344,611.496226172,305.748113086,152.874056543,76.437028271,38.218514136,19.109257068,9.554628534,4.777314267,2.388657133,1.194328567,0.59716428337097171575,0.298582142 #划分比例尺,不明白的可以看看这篇
    srs=EPSG:900913 #google map的投影
    bbox=-20037508.3427892,-20037508.3427892,20037508.3427892,20037508.3427892 #显示的范围

    如果不使用resolutions,也可以用maxResolution设定最大的比例尺,系统会根据level自动声称resolutions, 但如果同时设置,resolutions会覆盖level。bbox和resolutions要根据不同的投影来计算,之前我就是犯了这个错误,用 900913,但bbox设成了-180,-90,180,90,地图怎么也显示不出来。

    接下来就用openlayers来显示,创建一个map,在option中resolutions和bbox都要和配置文件中的相同,单位要是米。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    var options = {
    resolutions:[156543.033900000,78271.516950000,39135.758475000,19567.879237500,9783.939618750,4891.969809375,2445.984904688,1222.992452344,611.496226172,305.748113086,152.874056543,76.437028271,38.218514136,19.109257068,9.554628534,4.777314267,2.388657133,1.194328567,0.59716428337097171575,0.298582142],
    projection: new OpenLayers.Projection(”EPSG:900913″),
    units: “m”,
    maxExtent: new OpenLayers.Bounds(-20037508.34, -20037508.34,20037508.34,20037508.34),
    };
    map = new OpenLayers.Map(’map’,options);
     
    添加google地图
    var googleMap = new OpenLayers.Layer.Google(
    “Google 卫星图”,
    {
    type: G_SATELLITE_MAP,
    sphericalMercator: true
    }
    );
    map.addLayer(googleMap);
     
    添加一个tilecache的WMS
    wms= new OpenLayers.Layer.WMS(
    “wms”,
    “http://localhost/tilecache/tilecache.py”,
    {
    layers: ‘google’,
    srs: ‘EPSG:900913′,
    format: ‘image/png’,
    transparent: true
    },
    {
    maxExtent: new OpenLayers.Bounds(-14206537.827649845,2721171.5119208517,-7133550.0444934964,6549529.8947561011),
    reproject: true,
    opacity: 0.4,
    isBaseLayer: false
    }
    );
    map.addLayer(wms);

    如果以能成功显示的话,那么恭喜你,你已经可以成功叠加了google map和tilecache生成的WMS,你也可以去缓存查看已缓存的图片。现在可以用openlayers的另一个类直接访问缓存,可用firebug来看下图片的请求地址,是以http://localhost/tilecache/tilecache.py/1.0.0/google/z/x/y.extension的形式。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    tms = new OpenLayers.Layer.TMS(
    “google”,
    “http://localhost/tilecache/tilecache.py/”,
    {
    serviceVersion: “1.0.0″,
    layername: “google”,
    type: “png”,
    opacity: 0.4,
    maxExtent: new OpenLayers.Bounds(-14206537.827649845,2721171.5119208517,-7133550.0444934964,6549529.8947561011),
    isBaseLayer: false
    }
    );
    map.addLayer(tms);

    但这不是我的最终目的,我是想先缓存完图片然后再访问,而不是边访问边缓存。tilecache也想到了这点,他有一个小工具tilecache_seed.py,可以帮你完成这个工作。

    1
    python tilecache_seed.py “http://localhost/tilecache/tilecache.py” google 5 10 -14206537.827649845,2721171.5119208517,-7133550.0444934964,6549529.8947561011

    上面代码是说将配置文件中图层名为google,在-14206537.827649845,2721171.5119208517,-7133550.0444934964,6549529.8947561011这个范围中的缩放等级为5到10的缓存起来,最后直接用OpenLayers.Layer.TMS访问就可以了。

    欢迎大家来我的新家看一看 3wwang个人博客-记录走过的技术之路

  • 相关阅读:
    eclipse乱码解决方法
    撞库攻击:一场需要用户参与的持久战
    网管把握市场需求,其实一点都不可怜 转载于 [http://tonyxiaohome.blog.51cto.com/925273/955589]
    mysql主从不同步,提示更新找不到记录
    安装完MongoDB后尝试mongod -dbpath命令为什么会一直卡在连接端口?
    mysqlslap对mysql进行压力测试
    mysqlslap: Error when connecting to server: 2001 Can't create UNIX socket (24) 解决方法
    MySQL架构
    VMWare linux 打印太多,看不到之前的记录的解决方法总结
    启动Mysql时,提示error 2002 的解决办法
  • 原文地址:https://www.cnblogs.com/wang985850293/p/5148958.html
Copyright © 2020-2023  润新知