简单
基于常用Java框架、以mapbox-gl所用接口为蓝本、以OGC为规范,学习成本极低。
高效
性能是geoserver的数倍:更高压缩率的数据结构、更合理的缓存利用、流传输等技术。
开放
层次化的模块结构,可以支持插件扩展,亦可单独提取某个模块作深度开发。
项目地址 https://doc.giscat.top/giscat-server/quickstart/
接口示例
giscat-server提供了把您的数据快速发布为GIS服务的能力,下面的示例中,我们先体验一下, 从阿里datav (opens new window)下载的全国各省份数据发布成的接口:
#查询名称为"云南省"的省:
curl'https://map.wowtools.org/giscat-server/DataSet/giscat_testdata_test_polygon/Query?properties=id,name&expression=%5B%22%3D%3D%22%2C%5B%22get%22%2C%22name%22%5D%2C%22%E4%BA%91%E5%8D%97%E7%9C%81%22%5D'
其中,expression参数是urlencode后的["==",["get","name"],"云南省"]
#查询距离点(101.5,20.4)最近的3个省:
curl'https://map.wowtools.org/giscat-server/DataSet/giscat_testdata_test_polygon/Nearest?properties=id,name&x=101.5&y=20.4&n=3'
#输入一条线,查询这条线穿过哪些省:
curl'https://map.wowtools.org/giscat-server/DataSet/giscat_testdata_test_polygon/Query?properties=id,name&expression=%5B%22geoIntersects%22%2C%22LINESTRING(100.2%2020.3%2C120.1%2030.4)%22%5D'
其中,expression参数是urlencode后的["geoIntersects","LINESTRING(100.2 20.3,120.1 30.4)"]
上述查询返回值均为geojson,形如:
{
"type":"FeatureCollection",
"features":[{
"type":"Feature",
"geometry":{
"type":"MultiPolygon",
"coordinates":[//....]
},
"properties":{
"name":"浙江省",
"id":11
}
},{
"type":"Feature",
"geometry":{
"type":"MultiPolygon",
"coordinates":[//....]
},
"properties":{
"name":"安徽省",
"id":12
}
}//...}
#构造一个矢量瓦片图层并在地图上显示:
在线演示地址 https://doc.giscat.top/assets/demo/mvttest.html
mapboxgl.accessToken = 'pk.eyJ1IjoiaW1saXV5dSIsImEiOiJjbDM4aHM4eXowMDBpM2RvZGdxdGZjeWMxIn0.mYtay02E_Z4iYOsDx3IdoA';
// 新建一个空白地图
const map = new mapboxgl.Map({
container: 'map',
style: {
"version": 8,
"sources": {},
"layers": []
},
refreshExpiredTiles: false,//瓦片过期后自动刷新,这里为了测试方便调整为false
center: [102.712251, 25.040609],
zoom: 4
});
map.on('load', function () {
//添加刚才发布的mvt数据源
map.addSource('tile', {
"type": "vector",
"tiles": [
'https://map.wowtools.org/giscat-server/Map/test_map/VectorTile/{z}/{x}/{y}'
],
"minZoom": 1,
"maxZoom": 22
})
//添加各图层
map.addLayer({
"id": "polygons",
"type": "fill",
"source": "tile",// 上一步添加的数据源id
"source-layer": "polygons",// source-layer和mvt服务中的图层名对应
"layout": {"visibility": "visible"},
"paint": {"fill-color": '#51bbd6', "fill-opacity": 0.3, "fill-outline-color": '#0000ff'}
})
// map.addLayer ...
//矢量瓦片图层可以被点击
map.on('click', 'polygons', (e) => {
console.log(e.features[0])
})
})
#小结
至此,我们已对giscat-server的能力有了大致的了解,它可以:
1、传入一个json格式的表达式查询数据,无论是属性查询还是空间过滤都可以,熟悉mapbox的小伙伴会发现,这个json表达式其实是mapbox expressions (opens new window),所以学习成本很低;
2、最邻近查询,同样可以用mapbox expressions表达式过滤;
3、生成矢量瓦片,矢量瓦片也是可以用mapbox expressions表达式过滤的。
另外,功能1、2中的返回结果可以指定参数f=pbf,使其返回ProtoFeature二进制格式,比默认的geojson格式具有更高的压缩率和更好的性能,对数据量较大的查询很有用处。 同时giscat配备了ProtoFeature字节码还原为json对象的java工具 (opens new window)以及js工具 (opens new window),方便大家快捷地在java和js中使用。
环境搭建
默认地,giscat-server需要postgis数据库和11及以上版本的jdk。 (其实,postgis数据库并不是必须的,您只需要一个关系型数据库来存储giscat-server的配置信息,oracle、mysql甚至sqlite都可以,然后再有一个数据集插件来获取您的gis数据即可,但是建议您对giscat-server有一定的了解后再考虑做这些事。)
#安装postgis
限于篇幅,本节使用docker安装,您也可以不用docker直接安装
mkdir-p /mydata/postgres/database_data
docker run --name postgis \-v /mydata/postgres/database_data:/var/lib/postgresql/data \-ePOSTGRES_PASSWORD=sde \-d--publish"0.0.0.0:5432:5432"\--privileged postgis/postgis:13-3.3
这里,生成了一个用户名是postgres、密码是sde、端口是5432的postgis容器,并把容器内的pg数据存储目录映射到了宿主机的/mydata/postgres/database_data。
#导入示例配置和测试数据到postgis中
点击这里下载文件并解压,得到示例配置giscat_config.dump、测试数据giscat_testdata.dump。
拷贝dump到容器映射出来的路径,这样在容器内就能看到这两个dump
cp giscat_config.dump /mydata/postgres/database_data/
cp giscat_testdata.dump /mydata/postgres/database_data/
进入容器并切换至postgres用户
# 进入容器dockerexec-it postgis bash# 切换postgres用户su postgres
cd /var/lib/postgresql/data
进入psql命令行,新建数据库giscat_config、giscat_testdata
psql
create database giscat_config;
create database giscat_testdata;exit
建库命令运行结果如下:
postgres@b59bbdec8e03:~/data$ psql
psql (13.10(Debian 13.10-1.pgdg110+1))
Type "help"for help.
postgres=# create database giscat_config;
CREATE DATABASE
postgres=# create database giscat_testdata;
CREATE DATABASE
postgres=# exit
postgres@b59bbdec8e03:~/data$
导入dump
psql -h127.0.0.1 -p5432-U postgres giscat_config <./giscat_config.dump
psql -h127.0.0.1 -p5432-U postgres giscat_testdata <./giscat_testdata.dump
至此,数据准备完毕,一路exit退出到宿主机即可。
注意,如果您为postgis设置的用户名、密码等不是默认的,请参考下列语句修改data_connect表
# 进入psql
psql
# 切到giscat_config库\c giscat_config
# 执行update语句
UPDATE public.data_connect
SET config ='{
"username": "postgres",
"password": "xxx",
"jdbcUrl": "jdbc:postgresql://localhost:5432/giscat_testdata",
"driverClassName": "org.postgresql.Driver",
"minimumIdle": 1,
"maximumPoolSize": 20
}
'
WHERE id LIKE 'giscat_testdata' ESCAPE '#';
#安装jdk11
giscat-server需要11及以上版本的jdk才能运行,由于版权的原因,建议使用openjdk。
下载并解压缩openjdk11到指定目录
wget https://download.java.net/java/GA/jdk11/9/GPL/openjdk-11.0.2_linux-x64_bin.tar.gz
tar-zxvf openjdk-11.0.2_linux-x64_bin.tar.gz
mkdir-p /mydata/java
mv jdk-11.0.2 /mydata/java/
配置环境变量,这步是可选的,如果您由于安装了其它版本jdk等原因而不想配环境变量,只需在启动时指定jdk11 java的绝对路径即可,例如/mydata/java/jdk-11.0.2/bin/java -jar xxx
vi ~/.bashrc,添加以下变量,注意不要写在第一行
exportJAVA_HOME=/mydata/java/jdk-11.0.2/
exportJAVA_BIN=$JAVA_HOME/bin
exportJAVA_LIB=$JAVA_HOME/lib
exportCLASSPATH=.:$JAVA_LIB/tools.jar:$JAVA_LIB/dt.jar
exportPATH=$JAVA_BIN:$PATH
:wq source ~/.bashrc使得环境变量生效即可
#安装并启动giscat-server
前往 https://github.com/codingmiao/giscat-server/releases/ 下载最新版的giscat-server.zip并解压到指定目录
#下载zip文件,注意选择版本号
https://github.com/codingmiao/giscat-server/releases/download/1.0.0/giscat-server.zip
unzip giscat-server.zip
mkdir-p /mydata/japps
mv giscat-server /mydata/japps/
cd /mydata/japps/giscat-server/
启动
java-jar giscat-server-main-1.0.0-STABLE.jar
或直接后台运行,日志文件在logs目录下
nohupjava-jar giscat-server-main-1.0.0-STABLE.jar >/dev/null &
随便挑个接口curl测试一下是否能查出数据:
curl'http://localhost:12331/giscat-server/DataSet/giscat_testdata_test_polygon/Nearest?properties=id,name&x=101.5&y=20.4&n=3'
至此,本地环境已经跑起来了,下一节我们介绍如何导入数据、修改配置,这样我们就能在giscat-server中使用自己的业务数据生成的图层了。