nginx在代理转发地图瓦片数据中的应用
最近有这样一个需求,需要将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在代理转发地图瓦片数据中的应用的更多相关文章
- nginx反向代理转发后页面上的js css文件无法加载【原创】
故障现象:nginx做代理转发后,发现页面上的js css文件无法加载,页面样式乱了. 原因:没有配置静态资源 解决js css文件无法加载无法访问的问题 解决办法: 修改配置文件nginx.conf ...
- C++代码利用pthread线程池与curl批量下载地图瓦片数据
项目需求编写的程序,稳定性有待进一步测试. 适用场景:在网络地图上,比如天地图与谷歌地图,用户用鼠标在地图上拉一个矩形框,希望下载该矩形框内某一层级的瓦片数据,并将所有瓦片拼接成一个完整的,包含地理坐 ...
- Nginx 反向代理 如何在web应用中获取用户ip
转载:http://blog.csdn.net/bao19901210/article/details/52537279 问题背景: 在实际应用中,我们可能需要获取用户的ip地址,比如做异地登陆的判断 ...
- 【转】Nginx反向代理转发tomcat
http://blog.csdn.net/mlc1218559742/article/details/53117520 最近刚接触nginx,在网上查阅了相关资料,看到最多的形容nginx的词就是反向 ...
- Linux +Docker +Nginx 部署代理转发初探
很多开发人员仅仅只会码代码,如果让开发人员部署一些深入点的东西,或者做负载均衡等,很多开发人员估计就懵逼了,作为一个专业的开发还需要懂一些基本的运维知识:虽然说在互联网行业中,中小企业都有一个牛逼的运 ...
- nginx反向代理(proxy_pass)tomcat的过程中,session失效的问题解决
Nginx反向代理tomcat,很是方便,但是也有些细节的问题需要注意:今天遇到了这样一个问题,tomcat中路径“host/web1”,nginx中直接“host/”代理,这时候session就无法 ...
- 记阿里云SLB后配置Nginx反向代理百度地图API的坑
需求: 百度的原始请求:https://api.map.baidu.com/place/v2/suggestion?query=s®ion=sc&city_limit=true& ...
- nginx反向代理转发apache配置 之 cookie去哪儿了?
在公司接手了个微信项目,由于微信环境下访问网站需要使用对外开放的域名,所以有相关问题,都是直接运维同事帮忙处理. 原理是这样: 方案一: 1. 将域名解析指向测试服务器的地址: 2. 开放相关端口访问 ...
- 【Nginx】Nginx反向代理转发Host设置
#事故现场: 服务器A(Nginx服务器):192.168.2.126 服务器B(Web服务器):192.168.2.221 服务器A反向代理服务器B,A配置了upstream为: http { up ...
随机推荐
- 【错误解决】Intellj(IDEA) warning no artifacts configured
: warning no artifacts configured,,上面木有Artifacts的选项,,好尴尬, [解决方案]artifacts,是maven中的概念(项目是maven项目),由于没 ...
- C++ Opencv remap()重映射函数详解及使用示例
一.重映射及remap()函数介绍 重映射,就是把一幅图像中某位置的像素放置到另一图像指定位置的过程.即: 在重映射过程中,图像的大小也可以同时发生改变.此时像素与像素之间的关系就不是一一对应关系,因 ...
- [Swift]LeetCode329. 矩阵中的最长递增路径 | Longest Increasing Path in a Matrix
Given an integer matrix, find the length of the longest increasing path. From each cell, you can eit ...
- [Swift]LeetCode682. 棒球比赛 | Baseball Game
You're now a baseball game point recorder. Given a list of strings, each string can be one of the 4 ...
- [Swift]LeetCode724. 寻找数组的中心索引 | Find Pivot Index
Given an array of integers nums, write a method that returns the "pivot" index of this arr ...
- Jason Wang: 结对编程 CountWord(第三次作业)
本次作业地址: https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass1/homework/2882 学号: 201731072323 ...
- Agens层次聚类
层次聚类是另一种主要的聚类方法,它具有一些十分必要的特性使得它成为广泛应用的聚类方法.它生成一系列嵌套的聚类树来完成聚类.单点聚类处在树的最底层,在树的顶层有一个根节点聚类.根节点聚类覆盖了全部的所有 ...
- Python内置函数(49)——pow
英文文档: pow(x, y[, z]) Return x to the power y; if z is present, return x to the power y, modulo z (co ...
- 【Vue】IView之table组件化学习(二)
最基本的绑定table是这样的,需要columns和data两个属性. <template> <Card> <h4>表格栗子</h4> <Tabl ...
- 从零开始学习PYTHON3讲义(一)认识Python
课程名称 从零开始PYTHON3 课程长度 15讲 适用年龄 15-20岁(初三-大一) 本讲名称 认识Python 时长 90分钟 教学内容分析 Python是时下最流行的计算机编程语言之一.本课程 ...