前言

了解ArcGIS的同仁们应该知道,自从ArcGIS Desktop与ArcGIS Server捆绑销售后,整个下来成本不菲,所以只有大项目敢上这些重量级的支撑软体。小项目就只有求助于开源平台,而最近在一直肤浅地学习GeoServer与OpenLayer,发现还是太啰嗦,尤其是使用GeoServer发布数据,各种选项(大多用不著,尤其是从一个小项目角度出发),各种协议(OGC的WMS、WFS、WMTS,这里说句不爱听的,一大堆所谓的专家与大学教授聚在一起搞这个,虽然协议与介面是非常重要,但是在目前大前端的发展来讲,这些基于XML的WMS、WFS,以及KML与GML,都是落伍的。当然WMS、WFS、WMTS的3.0在考虑基于JSON的协议与介面),总而言之,GeoServer这个采用Java开发的开源GIS Server,对于目前一些Web应用来讲,口味还是有点重,这个就好比那些推行Leaflet的同仁们,一直在拿之与OpenLayer比较的过程,以轻量这个优点来克敌制胜。那么,问题来了,能否自己动手写一个简单的GIS Server来满足采用轻量API(Leaflet)来做GIS开发的Web应用?答案会在这个系列的连载中来回答。(连载的原因,一次没太多时间来进行总结和写作)

需求设定

这部分很重要,自己实现的肯定是一只麻雀,比不了商业的和成熟的,但是简单有多简,轻量有多轻,在这一小节会把功能范围大致框定,可能不一定会适用于各位看官的需求,但整个实现思路会对您有所启发,这也是个人迫不及待想要写下来的一个原因。

1.前端支持Leaflet API;(原先也考虑可以用ArcGIS JS API来调用,但尝试ArcGIS JS API调用GeoServer发布的WFS服务之后,就放弃了,问题之多难以列表)

2.支持GeoJSON,不支持WMS、WFS、WMTS、KML、GML等等,理由如前言所述;

3.发布格式目前只支持ShapeFile,GIS格式由于百花齐放,格式万万千,但SHP应该是最基础的,各平台转换成该格式的功能也是约定俗成的;

4.框架选用NodeJS+ExpressJS,不多说,也不争辩,这个基于目前只应用在前端开发上,因此采用Java的同仁请继续支持GeoServer。(前两天,一公司的技术副总(Java出身)竟然问我这样一个问题,Node能访问资料库吗? 。。。。。。)

5.支持静态栅格切片、动态矢量切片(支持前端和后端渲染,这个是重点,请各位看下去,这个本人也是在摸索中去窥探其它GIS Server的实现方式,请放心,本文能实现的功能,各位只要有基础也能实现,即使只是GIS开发的初学者)。如果看官有心的话,应该可以做一个简单对应:WFS用GeoJSON,WMS用栅格切片,WMTS用矢量切片。

6.Mongo资料库存储发布数据

7.坐标系只支持wgs84(4326)、web mercator(3857)

8.支持高德地图、谷歌地图,暂不支持百度地图(切片计算方式不同)

补充说明,NodeJS+ExpressJS+Mongo与GeoJSON也是完美结合,如果NodeJS+ExpressJS去支持XML,不是不可以,相信各位也一定会觉得很难受。

技术准备

如果您要动手实现,请先储备如下技术:

1.GIS初学者或爱好者,老鸟请回避,抬杠受不鸟;

2.NodeJS+ExpressJS

3.Mongo+mongoose

4.Leaflet

5.开发IDE:WebStorm或VS Code

本文不会手把手来进行教学,所以在了解以上技术的情况,对重点实现思路或部分重点代码进行讲解。

源码仓库

1.server(服务):green-gis-server,仓库地址

2.manager(后台管理以及调用示例):green-gis-manager,仓库地址

示例效果

  1. 发布数据(publish shp,wkid=4326 or 3857)

2.GeoJSON(use leaflet geojson class to render geojson data)

3.Backend(use node-canvas render data in node)

4.Frontend(extend leaflet GridLayer to render data in browser)

5.Vector Tile(checkout chrome dev tools)

连载章节

1.node-gdal:shapefile in and geojson out

2.tile:generate tile to handle big data

3.node-canvas:draw vector tile from backend

4.leaflet gridlayer:draw vector tile from frontend

5.cache:eat memory for faster tile

6.static tile:the fastest tile


推荐阅读:
相关文章