### 地图相关知识简介
在描述具体方案之前,先简单介绍一下地图相关知识。
#### 瓦片地图
为了达到更快的地图加载效率,地图资源大多以瓦片形式加载,即在不同的缩放等级下,在服务端获取相对应的瓦片资源,关于[瓦片原理的介绍](https://zhuanlan.zhihu.com/p/21344894)
#### 坐标系
现在常用的坐标系一般分为以下三种,这三个坐标系之间也是可以[相互转换](https://github.com/wandergis/coordtransform)的
* WGS84(mapbox、谷歌):即地球坐标系,国际上通用坐标系
* GCJ-02(高德、腾讯):即火星坐标系,WGS84坐标系经加密后的坐标系。
* BD-09(百度):即百度坐标系,GCJ-02坐标系经加密后的坐标系。
### 地图瓦片服务本地部署
#### 简介
使用 [FoxGIS Server Lite](https://github.com/jingsam/foxgis-server-lite/) 来搭建矢量瓦片地图服务
此项目基于 nodejs、Express搭建,是一款简单易用的矢量瓦片地图服务软件
其中处理瓦片数据使用了 mapbox 官方维护的 `@mapbox/mbtile` 库(通过 nodejs 和 tilelive.js 集成来处理 [MBTiles](https://github.com/mapbox/mbtiles-spec) 格式的数据),[更多关于 @mapbox/mbtile 介绍](https://github.com/mapbox/node-mbtiles)
#### 如何使用?
可以查看 [FoxGIS Server Lite 文档](https://jingsam.github.io/foxgis-server-lite/#/README)
#### MBTiles 格式数据获取
可以通过以下两种方式获取:
1、可以直接在 [download.geofabrik.de](https://download.geofabrik.de/) 获取开源且免费的 OSM(OpenStreetMap ) 数据
2、还可以在 [openmaptiles.org](https://openmaptiles.org/) 获取免费或者收费的 OSM 数据
##### 两者区别
相同点:
* 数据源都为 OSM(OpenStreetMap) 数据
不同点:
* 前者不提供地图的样式,后者提供完整的地图样式
* 前者提供不同层级的细粒度的瓦片数据(未进行图层合并或者数据优化),后者提供完整的世界地图瓦片数据(数据已经整合且优化)
* 前者数据更新及时,后者提供免费的数据为三年前瓦片数据(收费的数据则较新)
除了两者上的一些异同之外,结合目前情况,还有以下影响因素:
1、地图瓦片数据的合并及处理需要了解 GIS 的相关知识,学习成本比较大。
2、地图样式处理需要有较好的设计资源,因为地图本身的特性,如放大或缩小不同等级呈现出不同的内容或样式,所以说设计一个好的地图,不仅从宏观层面还是从微观层面都需要设计师的参与,维护成本太高。
最后选择采用第二种方式提供的地图数据及地图样式。
#### 瓦片服务搭建过程(本地开发环境 )
> 以下过程以 macOS 为例
1、准备阶段
* 下载 [FoxGIS Server Lite](https://jingsam.github.io/foxgis-server-lite/foxgis-server-lite-macos.tar.gz) 客户端
* 在[openmaptiles](openmaptiles.org)下载 [地图瓦片数据](https://openmaptiles.os.zhdk.cloud.switch.ch/v3.6.1/planet/vec2BifuH2N7N8EtXX4YOwASWZCD2eF3/2017-07-03_planet_z0_z14.mbtiles) (地图版本为 2017-07-03\_planet\_z0\_z14)
* 在 [maptiler-basic-gl-style](https://github.com/openmaptiles/maptiler-basic-gl-style) 中将此项目中的 `style.json` 文件下载到本地
2、将下载好的压缩包解压到指定目录下,并进入 `foxgis-server-lite-macos` 文件夹下
~~~bash
cd foxgis-server-lite-macos
复制代码
~~~
3、将之前下载好的地图放到 `foxgis-server-lite-macos/data/tilesets` 文件夹内,
4、将下载好的 `style.json`文件中相关内容进行替换如下
~~~bash
# 替换瓦片数据请求地址
# 将
"url": "https://api.maptiler.com/tiles/v3/tiles.json?key={key}"
# 替换为
"url": "http://localhost:1234/api/tilesets/2017-07-03_planet_z0_z14/tilejson"
# 替换字体文件并添加 sprite 图
# 将
"glyphs": "https://api.maptiler.com/fonts/{fontstack}/{range}.pbf?key={key}",
# 替换为
"sprite": "http://localhost:1234/api/sprites/streets/sprite",
"glyphs": "http://localhost:1234/api/fonts/{fontstack}/{range}.pbf",
复制代码
~~~
5、修改 `style.json` 文件中的字体名称
~~~bash
# 将所有 "text-font" 项的值替换为 ["Open Sans Regular"], 如:
"text-font": ["Noto Sans Regular"],
# 替换为
"text-font": ["Open Sans Regular"],
复制代码
~~~
6、将修改好的 `style.json` 文件添加到 `foxgis-server-lite-macos/data/styles` 文件夹内
7、直接运行或命令行启动`foxgis-server-lite-macos`文件夹下 `foxgis-server-lite-macos` 文件即可
~~~bash
# 启动瓦片服务
./foxgis-server-lite-macos
复制代码
~~~
8、紧接着会提示服务启动成功
~~~bash
# 默认服务端口号是1234
Listening on port 1234
# 如果需要更改端口号可以通过设置环境变量改变
export PORT=8080 && ./foxgis-server-lite-macos
复制代码
~~~
> 注:如果更改了服务端口号,也需要同步修改 style.json 中请求地址的端口号
完成以上步骤,就已经成功的运行起地图瓦片服务了,接下来结合 mapbox 就可以在页面上渲染出地图了。
### mapbox 简介
支持移动端、桌面端以及网页,灵活、快速的地理信息可视化工具。
#### 如何使用?
mapbox 提供了比较丰富的文档内容,我们应用的是 [Mapbox GL JS](https://docs.mapbox.com/mapbox-gl-js/api/)
推荐可以从 [Example](https://docs.mapbox.com/mapbox-gl-js/example/) 开始看
#### 简单示例
~~~html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style type="text/css">
*{
margin: 0;
padding: 0;
}
html,body,#map{
width: 100%;
height: 100%;
}
</style>
<link rel="stylesheet" href="http://localhost:1234/api/assets/mapbox-gl.css" />
<script src="http://localhost:1234/api/assets/mapbox-gl.js"></script>
</head>
<body>
<div id="map"></div>
</body>
<script>
var map = new mapboxgl.Map({
container: "map", // container id
style: "http://localhost:1234/api/styles/style", // style URL
center: [116.40, 39.9066], // starting position [lng, lat]
zoom: 13 // starting zoom
});
</script>
</html>
复制代码
~~~

- 首页
- pm2
- pm2
- pm2 离线安装
- pm2 使用指南
- node
- 正则
- web
- webpack
- 配置
- 优化代码体积
- plugin-proposal-decorators
- webpack 打包原理解析
- babel presets配置 babel7
- 配置路径别名
- 去除开发中的警告信息
- css
- 滚动条
- input自动填充背景色
- 颜色渐变
- scss
- 网页定制光标
- 超出文本显示省略号。。。
- calc兼容性写法
- box-sizing
- clip-path
- 苹果手机页面滑动卡顿
- 字体间距根据父级宽度自适应
- 纯css动态效果
- 清除浮动的三种方法
- 按钮增加闪烁效果
- 字体渐变
- react
- mobx
- 路由
- antd 表格在safari上卡顿
- 项目初始化
- react-antd-mobx-momnet
- 显示字符串中的标签
- antd Select 在搜索精准度
- 路由切换动态过渡效果
- css中图片打包后的路径出错
- antd upload 无法及时更新state
- antd DatePicker设置中文失败
- antd-pro 添加登录页面报错
- new Array创建新数组数据指向相同
- react 页面刷新渲染两次
- useEffect
- Hooks 闭包解决方案
- hooks 方法封装
- Plugin "react" was conflicted between "package.json » eslint-config-react-app
- javascript
- canvas
- 多张图片合成一张
- 排序
- js比较符号==、===
- 运动函数封装(简易、通用)
- 导出表格(excel )
- react使用demo
- xlsx导出excel
- js获取屏幕高度宽度
- toFixed 函数修改
- 获取cookie,url参数
- 奇怪的错误问题
- copy(深拷贝 浅拷贝)
- 导出pdf
- 解决图片失真
- 判断字符串长度(带中文)
- js中 文件、图片二进制和base64的互转
- 读取深度嵌套的json数据
- 手动实现Promise.all
- cookie 删除
- webpack 打包过后的文件报错 regeneratorRuntime is not defined
- 防抖与节流
- react hooks 中使用防抖节流
- 图片懒加载
- 重排和重绘
- 修复部分无法JASON.parse的数据
- react-native
- android-studio 打开调试工具
- 适配全面屏
- node
- 服务端 node + nginx 反向代理
- 生成文件夹目录列表
- mogodb常用操作
- 发布npm包
- cli工具
- 上传文件
- nodejs使用crypto进行加密/解密操作
- mongodb 加入验证之后连接失败
- nextjs使用问题
- node转发http请求
- mongodb 导入导出 备份
- node-sass 安装问题、安装失败等
- npm yarn 安装依赖太慢
- puppeteer 安装问题 centos
- mongoose
- 其他
- 禁止浏览器缓存
- chrome平滑滚动
- pdf预览
- 问题整理
- 资料
- 小程序
- fetch
- cookie 设置跨域资源共享
- taro 小程序
- taro request
- 设置npm镜像
- esbuild the service is no longer running
- 离线地图
- uniapp 转 vue-cli
- 工具
- Excel表格密码保护的解除方法
- vscode(插件)
- vscode 常用代码片段
- vscode 开启tab补全代码
- mac 百度网盘破解
- mysql 重置密码
- chrome 好用的扩展
- Mac/Linux/Windows通过命令调用浏览器打开某网页
- 小链接
- 数据库
- mongo
- sql文件导入
- join 用法
- sql 时间格式化 DATE_FORMAT
- 创建全文检索并分词查询
- 阿里云node-mysql 操作文档
- sql 时间查询
- mysql group查询结果合并为一行
- mysql 锁
- mysql count 同个字段多个结果合并到一行
- 解决Node.js mysql客户端不支持认证协议引发的“ER_NOT_SUPPORTED_AUTH_MODE”问题
- mysql 根据经纬度计算距离
- PHP
- 文件读取
- 接收前端json数据
- 自定义排序
- session 写入失败无法保存
- php 上传大文件$_FILES为空
- base64转图片
- composer.phar 安装东西太慢 切换国内镜像
- laravel sql查询记录
- 解决: Please provide a valid cache path.
- thinkphp开启多应用
- 上传文件报错 Filename cannot be empty
- php curl 报错 curl: (35) SSL connect error
- App
- android未授权错误(Flutter)
- uniapp
- 服务端
- mongodb 定时备份
- mysql 错误
- nginx 转发网络请求
- midwayjs 使用egg-mysql
- https 无法访问
- egg 配置跨域
- 算法实现
- 排序
- 全排列
- 无重复字符的最长子串
- 反转单向链表
- 斐波那契数列
- 有效的括号
- GIT
- git克隆大文件
- 面试整理
- 前端整理
- 大厂高级前端面试题
- 三年大厂面试题
- 面试经验
- 头条it技术工程师
- 每日学习
- 常见的数据结构
- 面试地址汇总
- 练习汇总
- 前端八股文
- mac环境配置
- mac nginx重启报错
- mac 安装redis
- fis配置
- 切换php版本
- Mac OS X下的Oh-My-ZSH安装与配置
- mac 查看端口进程 停止进程
- mac 配置ssh 免密码登录服务器
- navigate 中文破解
- 删除启动台无效文件夹
- 删除顶部图标(卸载后的软件还存在)
- 修复mac 下安装全局依赖失效
- navicate 完美破解 内有下载地址
- nginx 报错 500 "/usr/local/var/run/nginx/client_body_temp/0000000004" failed (13: Permission denied)
- 安装PHP redis扩展
- 安装zsh后 nvm node命令失效
- python
- python 在vscode中编辑,格式化文件总是提示There is no Pip installer available in the selected environment.
- 杂项
- 膝盖修复
- 微信打开网页链接反应巨慢
- chrome 显示http/https完整连接
- doracms
- pdfjs 中文无法显示
- docker
- go
- 指针、指针地址* &
- 脚本
- 京东疯狂的joy脚本
- 2021京东炸年兽
- LINUX
