说明:番外篇是对正篇矢量切片(Vector tile)中提到的一些值得继续延伸的关注点继续进行探索和学习,所涉及的内容以解决实际问题为主要导向。

一、新的需求?

  在完成了矢量切片的工作后,新的需求出现了, 也就是我在上一篇中所提到的:我所拥有的历史数据都是基于某一个特定的Projection,那么如何利用GeoServer以及OpenLayers去制定一个针对特定坐标系的矢量切片呢?

  其实很简单,回顾一下我们上一篇文章是如何实现并调用矢量切片的:

  发布数据 --> 配置参数【选择数据格式(GeoJSON/TopoJSON/MapBox Vector tile(MVT))、选择tile size(256*256)、选择gridsets】 --> 预览数据 --> OL3调用数据

  那在哪一个环节会出问题?

  1)数据发布和切片的生成:你可以把数据想象成为蛋糕,不同坐标系下的数据就是不同形状的蛋糕,按照同一种方法去切割不同形状的蛋糕,那肯定会出问题。

面对不同形状的蛋糕,也应该采取不同的策略去制定切法

  2)数据调用:每一块不同形状的蛋糕在完成切片后,留下的最小存在单元的形状也肯定是不一样的,如果是椭圆,所切出来的小块肯定是有着平滑边缘的蛋糕块,而五角星的每一小块很有可能是有着尖锐边缘的蛋糕块,所以我们想要把切出来的蛋糕块完美的放在某一个容器中端出来,那这个容器肯定需要和蛋糕块的形状契合,所以,在调用数据的时候,也需要为数据提供一个契合的数据框架。

  通过上述分析,我们已经知道了应该在哪里进行补充工作了,那么接下来就让我们一起去实现吧。

二、基于某一个特定的坐标系实现的矢量切片

   首先在发布数据时,我们应当找到当下准备发布数据的坐标系信息,你可以通过ArcGIS加载该数据来查看,在此我使用的是深圳市绿道数据,基于EPSG:4490,即China Geodetic Coordinate System 2000

  1) 进入GeoServer的发布数据页面

  还记得在发布数据过程中,为切片数据配置的页面吗?我们需要在页面上完成数据格式(GeoJSON/TopoJSON/MapBox Vector tile(MVT))、tile size(256*256)、gridsets等配置。

  但这里要注意的是,你会发现在gridset这一栏里默认的只有EPSG:4326和EPSG:900913的切片格网方案,而我这里使用的数据是EPSG:4490,蛋糕形状变了, 切的刀法也应该有所变化。所以我们需要针对EPSG:4490定制一个切蛋糕方案:

  2)自定义gridset

  从GeoServer面板左边的菜单栏中进入Tile Caching的Gridsets子菜单,然后在Gridsets的管理页面中选择新建一个gridset,接下来你就能看到这样一个页面:

  

  在这个页面,你有很多参数需要配置,配置完之后点击保存即可:

  - Name

  - Coordinate Reference System : 与之对应的坐标系编码

  - Gridset bounds:范围(会影响到切片的参数)

  - tile size:256*256

  - Tile Matrix Set:根据你的数据和需要设置缩放级别

 

  最后,在上一个配置参数的页面,将新配置的gridset添加进去

  

  好了,我们现在已经用合适而恰当的方法把蛋糕切好了,接下来我们需要为这些数据蛋糕找到合适的容器。

三、在OL3中自定义坐标系

  1)OpenLayers中的坐标系

  在OpenLayers3中,提供了好几种默认已经定义好的坐标系,这其中就有我们熟悉的EPSG:4326,EPSG:900913 or EPSG:3857等等,能够保证一般情况下的使用,但对于特定需求,可能就需要借助外力的帮助,而这个外力就是:Proj4js

  2)Proj4js

  在github上,关于Proj4js的定义是这样的:

  Proj4js is a JavaScript library to transform point coordinates from one coordinate system to another, including datum transformations. 
  // Proj4js主要是一个用来将点坐标从源坐标系统转换到另一个目标坐标系统的JS库,包括基准转换
  Originally a port of PROJ.4 and GCTCP C it is a part of the MetaCRS group of projects.
  // 本项目起源于PROJ.4和GCTCP C

  PS:定义中提到的基准转换,应该是大地测量学里面的术语,我也不是很了解,稍微查了一下资料,在此作为冷知识补充一下:

  我们通常所说的坐标系统,是由坐标系和基准构成的,所谓的基准指的是为了描述空间位置而定义的点、线、面,在大地测量中,基准指的是描述地球形状的地球椭球参数。

  回到正题,这里是Proj4js在github中的地址:https://github.com/proj4js/proj4js,在proj4js中提到了两种用途:

  1)转换坐标点;

  //其中fromProjection是源坐标系,toProjection指的是目标坐标系
  //如果你没有提供fromProjection,则默认fromProjection为WGS84坐标系
  //fromProjection,toProjection等参数可以是ol中的projection对象,也可以是一个WKT String
  proj4(promProjection,toProjection,coordinates);

  2)定义命名一个自定义坐标系统

  //定义一个新的坐标系统
  proj4.defs('WGS84', "+title=WGS 84 (long/lat) +proj=longlat +ellps=WGS84 +datum=WGS84 +units=degrees");

  需要补充一点,在Proj4js中已经预定义了几种projection:

  - 'EPSG:4326' or 'WGS84'

  - 'EPSG:4269'

  - 'EPSG:3857' or 'EPSG:3785' or 'GOOGLE' or 'EPSG:900913' or 'EPSG:102113'

  根据文档中的介绍,我们使用Proj4js去定义一个新的ol3中的projection对象:

  a)首先,和所有的JS库一样,请不要忘记在页面完成对库的引用,

 <script type="text/javascript" src="lib/proj4js/dist/proj4.js"></script>

  b)其次,在你的JS文件中加入以下代码:

  function loadVectorTile_4490(){
   //定义EPSG:4490,具体的字符串参数你可以在:http://epsg.io中查询到,只需输入你的projection的EPSG码或者坐标系的名称
   //即可获得相应坐标系的字符串参数,直接将其复制到代码中即可
   proj4.defs("EPSG:4490","+proj=longlat +ellps=GRS80 +no_defs");
   //获得定义的坐标系
   var projection4490 = new ol.proj.get('EPSG:4490');
   //给定义的坐标系统限定范围,此处4490的范围与4326类似,因为他们的单位都是degree
   projection4490.setExtent([-180,-90,180,90]);    var layerName2 = 'szdata:greenway';
     var layerProjection2 = '';      
   //矢量切片图层
 var vectorTile_GreenWay = new ol.layer.VectorTile({
title:"深圳绿道-VectorTile",
style: new ol.style.Style({
            stroke: new ol.style.Stroke({
                color:'#548B54'
            })
     }),
projection: projection4490,
     //矢量切片数据
source: new ol.source.VectorTile({
       projeciton: projection4490,
format: new ol.format.GeoJSON(),

tileGrid: ol.tilegrid.createXYZ({
          extent: ol.proj.get('EPSG:4490').getExtent(),
          maxZoom: 13
}),
      tilePixelRatio:1,
      
//发出获取切片的请求
      tileUrlFunction: function(tileCoord){
                return '/geoserver/gwc/service/tms/1.0.0/'
+layerName+'@EPSG%3A'+layerProjection+'@geojson/'+(tileCoord[0]-1)
+ '/'+tileCoord[1] + '/' + (Math.pow(2,tileCoord[0]-1)+tileCoord[2]) + '.geojson';
}
      })
    });

    //需要注意的是,要给view设定一个合适的Projection属性,不然数据无法正常显示
    var map = new ol.Map({
        target: 'map',
   layers: [
          new ol.layer.Tile({
            source: new ol.source.OSM();
          }),
          vectorTile_GreenWay
        ],
   view: new ol.View({
            //view中的projection
             projection: projection4490,
              center: [114.15, 22.65]
        })
    });
  }

  c) 其实最后的实现很简单,只不过在上一篇文章的内容中添加了一个Proj4js定义新坐标系的内容,实现过程也比预想要顺利,因此作为一个小番外添加进来,也是对上一篇文章末尾提到的问题进行一个补充。实现结果如下:

  

【GISER && Painter】矢量切片(Vector tile)番外一:Proj4js的更多相关文章

  1. 【GISER && Painter】矢量切片(Vector tile)

    说明:本月的主要工作都是围绕制作矢量切片这一个核心问题进行的,所以2月的主题就以这个问题为主,目前分支出来的一些内容主要包括了TMS(Tile map service),OpenLayers3中的Pr ...

  2. 矢量切片(Vector tile)

    说明:本月的主要工作都是围绕制作矢量切片这一个核心问题进行的,所以2月的主题就以这个问题为主,目前分支出来的一些内容主要包括了TMS(Tile map service),OpenLayers3中的Pr ...

  3. 使用GeoServer+OpenLayers发布和调用WMTS、Vector Tile矢量切片服务 | Publishing and Calling WMTS, Vector Tile Service Using GeoServer + OpenLayers

    Web GIS系列: 1.搭建简易Web GIS网站:使用GeoServer+PostgreSQL+PostGIS+OpenLayers3 2.使用GeoServer+QGIS发布WMTS服务 3.使 ...

  4. 矢量切片(Vector tile)番外一:Proj4js

    说明:番外篇是对正篇矢量切片(Vector tile)中提到的一些值得继续延伸的关注点继续进行探索和学习,所涉及的内容以解决实际问题为主要导向. 一.新的需求? 在完成了矢量切片的工作后,新的需求出现 ...

  5. 【转】10.4新特性-ArcGIS 10.4矢量切片介绍

    原文地址:http://zhihu.esrichina.com.cn/article/567 1.矢量切片简介GIS的底图一直使用金字塔技术进行切图,使用户能够快速访问指定级别的地图或者影像.但是切图 ...

  6. PostGIS计算矢量切片(一)--渲染数据

        没写错,是使用postgis计算出来矢量切片.在这之前先准备一个数据:一个GIS数据表(本例中数据为一百万的点数据,坐标:4326),并在表中添加x,y字段,方便后面的数据筛选.sql中用到了 ...

  7. ArcGIS Pro 自定义坐标系地图矢量切片制作

    ArcGIS Pro从1.4版本起就支持自定义坐标系统地图的矢量切片制作了. 步骤: 1. 将地图有全图范围缩小到屏幕像素大约10*10像素的范围,然后记录下地图的比例尺.这一步十分关键,不然系统要经 ...

  8. 使用tippecanoe把GeoJSON制作成供mapbox展示的矢量切片vectortile

    本文记录一下把geojson格式的数据制作成本地的矢量切片,并在mapbox中展示的过程. 1.切片 1.1 矢量数据需要先转换为geojson,如果是shp格式可以使用QGIS或者下载shp2gwo ...

  9. 矢量切片应用中geoserver与geowebcache分布式部署方案

    在进行GIS项目开发中,常使用Geoserver作为开源的地图服务器,Geoserver是一个JavaEE项目,常通过Tomcat进行部署.而GeoWebCache是一个采用Java实现用于缓存WMS ...

随机推荐

  1. 深度学习方法(十一):卷积神经网络结构变化——Google Inception V1-V4,Xception(depthwise convolution)

    欢迎转载,转载请注明:本文出自Bin的专栏blog.csdn.net/xbinworld. 技术交流QQ群:433250724,欢迎对算法.机器学习技术感兴趣的同学加入. 上一篇讲了深度学习方法(十) ...

  2. 自组织神经网络介绍:自组织特征映射SOM(Self-organizing feature Map),第三部分

    前面两篇介绍了SOM的基本概念和算法,第一部分,第二部分,本篇具体展开一下应用中的一些trick设定. SOM设计细节 输出层设计 输出层神经元数量设定和训练集样本的类别数相关,但是实际中我们往往不能 ...

  3. 什么是VC、PE、LP、GP?

    天使基金主要关注原创项目构思和小型初创项目,投资规模大多在300万元以下:风险投资关注初创时期企业长期投资,规模在1000万元以下:私募股权投资主要关注3年内可以上市的成熟型企业. VC即ventur ...

  4. Linux的权限对于文件与目录的意义

    权限对文件: r:可读取此文件的实际内容. w:可以编辑.新增或者是修改该文件的内容(但不含删除该文件),如果没有r权限,无法w. x :该文件具有被系统执行的权限.可以删除. 权限对目录: r:re ...

  5. 04 java 基础:数据类型

    java 数据类型:基本类型与引用类型 基本类型:数值型,其中数值型分为整型.浮点型,整型包括 byte.short .int.long ,默认为 int 类型.浮点类型分为单精度.双精度,分为 fl ...

  6. IndiaHacks 2016 - Online Edition (Div. 1 + Div. 2) E - Bear and Forgotten Tree 2 链表

    E - Bear and Forgotten Tree 2 思路:先不考虑1这个点,求有多少个连通块,每个连通块里有多少个点能和1连,这样就能确定1的度数的上下界. 求连通块用链表维护. #inclu ...

  7. Redis实战(七)

    修改数据 C#语言修改Redis示例. 1.通过key修改单个value using (var redisClient = RedisManager.GetClient()) { var user = ...

  8. Mutex 的正确打开方式

    在使用 Mutex 在给线程/进程间加锁时,需要注意的问题. 1 AbandonedMutexException 在使用 mutex.WaitOne 时,可能抛出异常 AbandonedMutexEx ...

  9. springMVC接受对象集合,name数组

    这两天开发遇到一个很常见的问题,即使自己一直没遇见过,不过之前看过是实现接受对象集合的代码,只不过没注意罢了 推荐一篇文章 直接贴代码吧 public class Person { private S ...

  10. 洛谷——P2683 小岛

    P2683 小岛 题目背景 西伯利亚北部的寒地,坐落着由 N 个小岛组成的岛屿群,我们把这些小岛依次编号为 1 到 N . 题目描述 起初,岛屿之间没有任何的航线.后来随着交通的发展,逐渐出现了一些连 ...