<!--
 * @Description: 
 * @Author: luojun1
 * @Date: 2021-10-28 14:16:18
 * @LastEditTime: 2021-12-15 16:18:30
-->
# 一、瓦片服务
支持tif、geojson、shapefile、postgis数据源，支持生成png、mvt格式的瓦片
先创建地图样式配置文件xml，通过制定xml文件的id进行地图渲染，并返回指定瓦片

创建地图样式： 支持多图层、多样式配置文件的生成
获取瓦片： 支持多图层一起渲染，返回一个瓦片， 支持png、mvt两种瓦片格式， 支持本地磁盘瓦片缓存


## API 
创建地图样式POST接口: http://localhost:5000/style

获取瓦片GET：  http://localhost:5000/tiles/{id}/{x}/{y}/{z}.{format}

示例：
```
http://localhost:5000/tiles/styletemplate_postgis/107879/51369/17.png
http://localhost:5000/tiles/styletemplate_postgis/107879/51369/17.mvt
http://localhost:5000/tiles/styletemplate_postgis/107879/51369/17.mvt?Cache=/luojun
http://localhost:5000/tiles/styletemplate_postgis/107879/51369/17.png?Cache=/luojun
```

详细接口说明： http://10.53.5.163:9000/project/124/interface/api/3258


## 服务启动

node test/index.js





# 二、geotile-sdk
A tile sdk for Cloud Optimised Geotiff and shapefile "

<center class = "half">
<img src = "./flow1.png"  height = "700px" width = "350px" > "瓦片请求事件循环 与 后台预加载任务循环"  <img src = "./flow2.png"  height = "700px" width = "350px" >
</center>




- 瓦片请求事件循环（繁忙时）
  
  即时相应瓦片请求并返回结果



- 后台预加载任务循环（空闲时）：   通过setTimeout实现非阻塞循环，不会影响事件循环处理瓦片请求
  繁忙时关闭(有瓦片请求时)，空闲时唤醒。
  唤醒方式：设置请求完成时的回调函数， 判断是否有正在处理的请求，若无，则唤醒闲时任务循环

    a、检测是否是闲时，如是忙碌状态，则结束循环，如是空闲状态，执行b

    b、空闲状态下， 执行一次闲时任务

    c、闲时任务执行结束，重新执行a


## 代码结构

|  代码文件   | 功能  |
|  ----  | ----  |
|index.js       |  外部接口:获取瓦片 |
|orderList.js   |  将当前瓦片请求以及横向相关区域加入orderList(快队列), 立即处理orderList中的瓦片请求, 调用map.js获取瓦片 |
|regionCache.js |  将当前瓦片请求的纵向相关区域加入slowList(慢队列), 空闲时(无瓦片请求时)加入orderList, 获取瓦片 |
|map.js         |  地图渲染和瓦片提取, png编码 |
|SRS.js         |  SRS空间参考系的转换 |


```
|-- src
|   |-- index.js
|   |-- orderList.js
|   |-- regionCache.js
|   |-- map.js
|   |-- SRS.js
|-- test
    |-- index.js
    |-- utils.js
    |-- data
    |   |-- clip2.rs
    |   |-- clip2.tif
    |-- routes
        |-- index.js
        |-- style.js
        |-- tile.js
|-- style
|   |-- styletemplate_json.xml
|   |-- styletemplate_shp.xml
|   |-- test.xml
|   |-- test2.xml
|   |-- test3.xml
|   |-- test4.xml
|   |-- test5.xml
```




## 主要功能：
* generateXML： 生成地图xml配置文件（包括地图样式和图层），返回xml文件的uuid
* setMapnikDir： 设置路径，包括xml的存放路径和mapnikDir的路径
* fetchTile：    根据xml文件和xyz提取指定瓦片
* fetchTilefetchTileOptimized：  优化后的瓦片提取接口


## Example
````
var geotile_sdk = require("geotile_sdk");

//设置样式文件路径和mapnik的input plugin
var styleDir=".../style"
var mapnikDir=".../node_modules/mapnik/lib/binding/"
geotile_sdk.setMapnikDir(styleDir,mapnikDir)

//根据json生成栅格的地图样式xml文件
var styleJson_raster = {
  "style":{
    "Type": "Raster"
  },
  "layer":{
    "path":"/luojun/github/geotiff-server/test/data/clip2.rs",
    "SRS":"3857"
  }
}
const style_str_raster= JSON.stringify(styleJson_raster)
geotile_sdk.generateXML(style_str, (err,uuid)=>{ if(!!err)var xmlUUID=uuid })

//根据json生成面要素的地图样式xml文件
var styleJson_polygon = {
  "style":{
    "Type": "Polygon",
    "Color": "black",
    "LineWidth": 1,
    "FillColor": "#bee826"
  },
  "layer":{
    "path":"/luojun/github/geotiff-server/test/data/clip2.rs",
    "SRS":"3857"
  }
}
const style_str_polygon= JSON.stringify(styleJson_polygon)
geotile_sdk.generateXML(style_str_polygon, (err,uuid)=>{ if(!!err)var xml_uuid_polygon=uuid })

//根据json生成线要素的地图样式xml文件
var styleJson_line={
  "style":{
    "Type":"Line",
    "Color":"#bee826", 
    "LineWidth":1
  },
  "layer":{
    "path":"/luojun/github/geotiff-server/test/data/clip2.rs",
    "SRS":"3857"
  }
}
const style_str_line= JSON.stringify(styleJson_line)
geotile_sdk.generateXML(style_str_line, (err,uuid)=>{ if(!!err)var xml_uuid_line=uuid })

//根据json生成点要素的地图样式xml文件
var styleJson_point={
  "style":{
    "Type":"Point", 
  },
  "layer":{
    "path":"/luojun/github/geotiff-server/test/data/clip2.rs",
    "SRS":"3857"
  }
}
const style_str_point= JSON.stringify(styleJson_point)
geotile_sdk.generateXML(style_str_point, (err,uuid)=>{ if(!!err)var xml_uuid_point=uuid })
  
//获取瓦片： 传入参数（瓦片的xyz，数据源路径，数据的空间参考系，结果处理回调函数，地图样式文件的uuid）
geotile_sdk.fetchTile(109195, 51561, 17, xml_uuid_raster, (err,tile_png) => {});
geotile_sdk.fetchTile(109195, 51561, 17, xml_uuid_polygon, (err,tile_png) => {});
geotile_sdk.fetchTile(109195, 51561, 17, xml_uuid_line, (err,tile_png) => {});

//优化后的获取瓦片接口 （基于事件驱动的瓦片缓存）
//获取瓦片： 传入参数（瓦片的xyz，数据源路径，数据的空间参考系，结果处理回调函数，地图样式文件的uuid）
geotile_sdk.fetchTilefetchTileOptimized(109195, 51561, 17, xml_uuid_raster, (err,tile_png) => {});
geotile_sdk.fetchTilefetchTileOptimized(109195, 51561, 17, xml_uuid_polygon, (err,tile_png) => {});
geotile_sdk.fetchTilefetchTileOptimized(109195, 51561, 17, xml_uuid_line, (err,tile_png) => {});

}

````
