最近有这样一个需求,需要将arcgis server发布的地图瓦片放在移动硬盘中,系统演示的时候,直接调用本地的地图瓦片,而非远程的,主要是为了系统演示的时候加快地图访问速度。

而且需要在任意电脑运行,这就要求不能安装笨重的arcgis server。

那么在不修改前端地图代码的情况下,如何做到这种效果呢?

在此,我们又想到了代理大佬nginx。

1、地图瓦片请求URL规律

地图瓦片可以用两种形式的url

1)rest风格

http://IP:PORT/arcgis/rest/services/myMapServer/MapServer/tile/{TileMatrix}/{TileRow}/{TileCol}

2)  GET参数形式

http://IP:PORT/arcgis/rest/services/myMapServer/MapServer/WMTS?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE=Default&FORMAT=image%2Fpng&LAYER=myMapServer&TILEMATRIXSET=default028mm&TileMatrix={TileMatrix}&TileCol={TileCol}&TileRow={TileRow}

其中TileMatrix表示zoom层级,TileRow表示行号,TileCol表示列号,myMapServer是服务名称

2、arcgis server 瓦片命名规律

arcgis server 的瓦片默认存储在 arcgisserver\directories\arcgiscache\myMapServer\图层\_alllayers 目录下

其目录结构为:

zoom层级文件夹命名规则:"L" + 长度为2位前面补零的10进制TileMatrix

行号文件夹命名规则:“R” + 长度为8位前面补零的16进制TileRow

列号文件夹命名规则:“C” + 长度为8位前面补零的16进制TileCol

     

3、nginx配置

nginx的工作就是:一旦发现有 前缀是 arcgis/rest/services/myMapServer 的HTTP请求,就先用正则表达式,找到URL重要的三个参数,TileMatrix、TileRow和TileCol

然后就按照上面列举的地图瓦片命名规则进行转换

这里我们用到了openresty,而非官网的nginx,openresty的优势在于可以用lua语言编写脚本,让nginx可能轻松编程。

下面是nginx配置中的核心代码

 location /arcgis/rest/services/MapServer/ {
  if ($request_uri ~* "TileMatrix=(.*)&TileCol=(.*)&TileRow=(.*)") {
    set_by_lua $TileMatrix "return string.format('%02d', ngx.arg[1]);" $1;
    set_by_lua $TileCol "return string.format('%08x', ngx.arg[1]);" $2;
    set_by_lua $TileRow "return string.format('%08x', ngx.arg[1]);" $3;
  }
  rewrite ^.*.*$ /data/MapServer/图层/_alllayers/L$TileMatrix/R$TileRow/C$TileCol.png last;
}

其中:set_by_lua就是openresty中的语法,用lua语句块设置变量值,可以看到,用lua很方便的将行列号转换成了16进制的8字符串

然后再利用rewrite实现url重定位,直接指向瓦片的物理路径

nginx在代理转发地图瓦片数据中的应用的更多相关文章

  1. nginx反向代理转发后页面上的js css文件无法加载【原创】

    故障现象:nginx做代理转发后,发现页面上的js css文件无法加载,页面样式乱了. 原因:没有配置静态资源 解决js css文件无法加载无法访问的问题 解决办法: 修改配置文件nginx.conf ...

  2. C++代码利用pthread线程池与curl批量下载地图瓦片数据

    项目需求编写的程序,稳定性有待进一步测试. 适用场景:在网络地图上,比如天地图与谷歌地图,用户用鼠标在地图上拉一个矩形框,希望下载该矩形框内某一层级的瓦片数据,并将所有瓦片拼接成一个完整的,包含地理坐 ...

  3. Nginx 反向代理 如何在web应用中获取用户ip

    转载:http://blog.csdn.net/bao19901210/article/details/52537279 问题背景: 在实际应用中,我们可能需要获取用户的ip地址,比如做异地登陆的判断 ...

  4. 【转】Nginx反向代理转发tomcat

    http://blog.csdn.net/mlc1218559742/article/details/53117520 最近刚接触nginx,在网上查阅了相关资料,看到最多的形容nginx的词就是反向 ...

  5. Linux +Docker +Nginx 部署代理转发初探

    很多开发人员仅仅只会码代码,如果让开发人员部署一些深入点的东西,或者做负载均衡等,很多开发人员估计就懵逼了,作为一个专业的开发还需要懂一些基本的运维知识:虽然说在互联网行业中,中小企业都有一个牛逼的运 ...

  6. nginx反向代理(proxy_pass)tomcat的过程中,session失效的问题解决

    Nginx反向代理tomcat,很是方便,但是也有些细节的问题需要注意:今天遇到了这样一个问题,tomcat中路径“host/web1”,nginx中直接“host/”代理,这时候session就无法 ...

  7. 记阿里云SLB后配置Nginx反向代理百度地图API的坑

    需求: 百度的原始请求:https://api.map.baidu.com/place/v2/suggestion?query=s&region=sc&city_limit=true& ...

  8. nginx反向代理转发apache配置 之 cookie去哪儿了?

    在公司接手了个微信项目,由于微信环境下访问网站需要使用对外开放的域名,所以有相关问题,都是直接运维同事帮忙处理. 原理是这样: 方案一: 1. 将域名解析指向测试服务器的地址: 2. 开放相关端口访问 ...

  9. 【Nginx】Nginx反向代理转发Host设置

    #事故现场: 服务器A(Nginx服务器):192.168.2.126 服务器B(Web服务器):192.168.2.221 服务器A反向代理服务器B,A配置了upstream为: http { up ...

随机推荐

  1. NeuChar 平台使用及开发教程(六):成为开发者

    在上一篇<NeuChar 平台使用及开发教程(五):使用 NeuChar 的关键字回复服务>中,我们已经学习了如何命中关键字来反馈特定格式内容的信息,这是由微信开发者/运营者自己来维护的信 ...

  2. Redis缓存实现排序功能

    如果对实时并发排序感兴趣,请关注这个项目(java):https://github.com/xuerong/hqrank,欢迎参与开发,pass:支持多字段排行 最近遇到一个问题就是根据需求需要对所有 ...

  3. [Swift]LeetCode62. 不同路径 | Unique Paths

    A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagram below). The ...

  4. [Swift]LeetCode650. 只有两个键的键盘 | 2 Keys Keyboard

    Initially on a notepad only one character 'A' is present. You can perform two operations on this not ...

  5. [Swift]LeetCode961. 重复 N 次的元素 | N-Repeated Element in Size 2N Array

    In a array A of size 2N, there are N+1 unique elements, and exactly one of these elements is repeate ...

  6. 关于scrollTop获取卷曲距离的三种方式- --兼容代码如下

    对于不同浏览器而言--获取卷曲距离方式可能有所不一样---下面提供三种方式--- scrollTop1 = window.pageYoffset || document.documentElement ...

  7. java中 try catch finally和return联合使用时,代码执行顺序的小细节

    代码1测试 public static void main(String[] args) { aa(); } static int aa() { try { int a=4/0; } catch (E ...

  8. C#中为什么会出现空静态构造方法的写法

    再过几个小时,就要回家过春节了,今天说些简单点的东西,大家在看C#代码的时候,一定会对这样的写法非常迷茫:在一个类中会出现一个空的静态构造方法.这不是多此一举吗,这样做的目的是什么?今天我就来说说这个 ...

  9. Calling handler.OnEndpointsUpdate报错原因

    过程:部署node01节点时从一台已经部署好的node02把/opt/kubernetes目录直接拷贝了过来,然后修改相应配置文件,启动kubelet是日志报如下图错误: 导致node01无法连接上m ...

  10. 爬虫入门(四)——Scrapy框架入门:使用Scrapy框架爬取全书网小说数据

    为了入门scrapy框架,昨天写了一个爬取静态小说网站的小程序 下面我们尝试爬取全书网中网游动漫类小说的书籍信息. 一.准备阶段 明确一下爬虫页面分析的思路: 对于书籍列表页:我们需要知道打开单本书籍 ...