GpsAndMap 4.0.0
提供了一个封装了GPS坐标值与坐标系数据的GSP类，提供了一个基于 folium 二次封装的地图类
Requires Python: >=3.8

# GpsAndMap

## 介绍

整合了GPS坐标和坐标系数据的GPS坐标类，提供了不同坐标系之间的转换方法，提供了不同GPS坐点球面距离的计算方法。
二次封装了 folium 库，提供了常用 Map 及相关 folium对象及 plugins对象的方法/属性接口，提供了便利的图层管理接口。

## 模块结构
- GpsModule.py 
  - 【GPS坐标系类型】枚举定义
  - 【GPS坐标系类】定义 
  - 【常用坐标】对象
- MapModule.py
  - 【颜色名】枚举定义
  - 【热力点类】定义
  - 【图标样式类】定义
  - 【提示样式类】定义
  - 【消息样式类】定义
  - 【封闭图形样式类】定义
  - 【线条样式类】定义
  - 【线上文本样式类】定义
  - 【网页标题样式类】定义
  - 【图标标记类】定义
  - 【圆圈标记类】定义
  - 【正多边形标记类】定义
  - 【蚂蚁路径标记类】定义
  - 【矩形标记类】定义
  - 【多边形标记类】定义
  - 【折线类】定义
  - 【参考线类】定义
  - 【热力层类】定义
  - 【图层类】定义
  - 【地图类】定义


## 依赖说明
本模块依赖以下库:
- DebugInfo
- folium
- 其它标准库


## 安装教程
```bash
pip install GpsAndMap
```

## 使用说明
### GpsAndMap.GpsModule 模块
👉**GPS坐标系类型**定义了常用的坐标系: gcj02, wgs84, bd09

👉**GPS坐标类**定义了一个类,该类封装了GPS坐标的经纬度值,以及坐标系信息,以及不同坐标系的转换方法
```python
from GpsAndMap.GpsModule import *

# 下面实例化了一个GPS坐标类, 该坐标经纬度值以 gcj02坐标系下取得
上海坐标: GPS坐标类 = GPS坐标类(121.5681254, 31.98545896, GPS坐标系类型.gcj02)  # 此处经纬度值为杜撰值,非真实值

# 下面取得并使用gcj02坐标系下的坐标值
print(上海坐标.gcj02坐标)

# 下面取得并使用wgs84坐标系下的坐标值, 类内部会自动进行坐标系转换
print(上海坐标.wgs84坐标)

# 下面取得并使用bd09坐标系下的坐标值, 类内部会自动进行坐标系转换
print(上海坐标.bd09坐标)

# 下面传入坐标系参数,取得对应坐标系下的坐标值
目标坐标系: GPS坐标系类型 = GPS坐标系类型.wgs84
print(上海坐标.目标坐标(目标坐标系=目标坐标系))
```

👉**常用坐标**对象集成了350+个常用地市的GPS坐标信息(gcj09坐标系),为日常使用提供了便利
```python
from GpsAndMap.GpsModule import *

# 打印上海市坐标
print(常用坐标.上海市)

# 打印西安市在wgs84下的坐标
print(常用坐标.西安市.wgs84坐标)

# 打印常州市在bd09下的坐标
print(常用坐标.常州市.bd09坐标)

# 打印指定坐标系下的合肥市坐标
目标坐标系: GPS坐标系类型 = GPS坐标系类型.gcj02
print(常用坐标.合肥市.目标坐标(目标坐标系=目标坐标系))
```
👉以下代码打印了常用坐标对象内的地市列表, 方便查看
```python
from DebugInfo.DebugInfo import *
from GpsAndMap.GpsModule import *

画板 = 打印模板()

画板.添加多行(list(常用坐标.常用坐标字典.keys()), 拆分列数=8).展示表格()
```
打印截图一角如下:  
![img.png](img.png)
---
### GpsAndMap.MapModule 模块
👉**MapModule**模块主要基于**GPS坐标类**, 对**folium**模块进行了二次封装, 以使对**folium**对象的操作是基于**GPS坐标类**对象的.

👉**MapModule**模块支持folium.Map对象生成与对应的html文档生成,支持简单的图层管理

👉**MapModule**模块支持添打点(Marker)标记, 圆圈(Circle)标记, 多边形/正多边形(Polygon)标记,折线(PolyLine)标记,以及这些标记上附带的弹窗消息,提示消息,以及样式信息

👉**MapModule**模块支持添加热力图,支持添加经度参考线,支持添加纬度参考线

👉**MapModule**模块支持添加坐标拾取,鼠标打点,鼠标绘图,蚂蚁路径等folium.plugins功能

👉**MapModule**模块支持直接添加和使用10+种瓦片底图,包括google, 高德系列, 智图GeoQ系列

👇 以代码演示了如何向地图中添加指定的瓦片底图, 并将Map对象保存为html以供阅览
```python
# -*- coding:UTF-8 -*-

# region 引入必要依赖
from src.GpsAndMap.MapModule import *

# endregion

地图 = 地图类(中心点=常用坐标.北京市).添加瓦片.高德地图().智图GeoQ().地图

地图.保存html(目标路径='.')

```
以上生成的html地图如下,可以看到有**高德地图**和**智图GeoQ**两个瓦片图层
![img_1.png](img_1.png)

👇 以下代码添加了所有支持的瓦片图，可以看到当前总共支持直接添加13种不同的瓦片底图。
```python
# -*- coding:UTF-8 -*-

# region 引入必要依赖
from src.GpsAndMap.MapModule import *

# endregion

地图 = 地图类().添加瓦片.添加所有.地图

地图.保存html(目标路径='.')
```
![img_2.png](img_2.png)  

👇下面的代码,我们在北京市位置添加一个基地图标
```python
# -*- coding:UTF-8 -*-

# region 引入必要依赖
from src.GpsAndMap.MapModule import *

# endregion

地图 = 地图类().添加瓦片.智图GeoQ().地图

地图.添加基地(常用坐标.北京市)

地图.保存html(目标路径='.').打开()
```
![img_3.png](img_3.png)  

👇下面的代码中,我们通过**图标标记类**来添加基地图标,在**图标标记类**中,我们通过**消息样式**,**图标样式**,**提示样式**, 详细的定义了所添加的图标标记的样式
```python
# -*- coding:UTF-8 -*-

# region 引入必要依赖
from src.GpsAndMap.MapModule import *

# endregion

地图 = 地图类().添加瓦片.智图GeoQ().地图

地图.添加基地(图标标记类(位置=常用坐标.北京市,
              消息=消息样式类(消息='我是北京,中国欢迎您!', 默认显示=True),
              图标=图标样式类(名称='glyphicon-arrow-right', 颜色=颜色名.蓝, 角度_度=-45),
              提示=提示样式类(消息='45度仰望天窗', 粘性=True)
              ))

# 图标的名称,你可以在这里找到一些常用的图标
# https://v3.bootcss.com/components/

地图.保存html(目标路径='.').打开()
```
![img_4.png](img_4.png)  

👇下面的代码中, 我们添加了一个图层(我的图层), 在这个图层上, 我们分别在上海的位置添加了一个圆圈,在常州的位置添加了一个正三角形,在南通的位置添加了一个图标,在南京的位置添加了一个正方形.这些标记分别使用了不同的颜色样式和线条样式
```python
# -*- coding:UTF-8 -*-

# region 引入必要依赖
from src.GpsAndMap.MapModule import *

# endregion

地图 = 地图类().添加瓦片.高德地图().地图

地图.添加基地(常用坐标.北京市)

我的图层 = 地图.添加图层(图层名称='我的图层', 默认显示=True)

# 在上海位置添加一个圆圈标记
上海的圆圈 = 圆圈标记类(位置=常用坐标.上海市, 半径px=15, 圆圈=封闭图形样式类(线条宽度=3, 线条颜色=颜色名.蓝))
地图.添加标记(我的图层, 上海的圆圈)

# 在常州位置添加一个正三角形标记
常州的三角形 = 正多边形标记类(位置=常用坐标.常州市, 边数=3, 半径px=25, 图形=封闭图形样式类(线条宽度=3, 填充色=颜色名.红, 填充透明度=0.5))
地图.添加标记(我的图层, 常州的三角形)

# 在南通位置添加一个图标(Marker)标记
南通的图标 = 图标标记类(位置=常用坐标.南通市, 图标=图标样式类(名称='glyphicon-fire', 颜色=颜色名.绿))
地图.添加标记(我的图层, 南通的图标)

# 在南京位置添加一个正方形标记
南京的正方形 = 正多边形标记类(位置=常用坐标.南京市, 边数=4, 半径px=25, 角度deg=45, 图形=封闭图形样式类(线条宽度=3, 填充色=颜色名.蓝, 填充透明度=0.5))
地图.添加标记(我的图层, 南京的正方形)

地图.保存html(目标路径='.').打开()
```
![img_5.png](img_5.png)

👇下面的代码中, 我们将上海,常州,南通和南京的这些标记点添加到折线类中,在地图上绘制一条折线
```python
# -*- coding:UTF-8 -*-

# region 引入必要依赖
from src.GpsAndMap.MapModule import *

# endregion

地图 = 地图类().添加瓦片.高德地图().地图

地图.添加基地(常用坐标.北京市)

我的图层 = 地图.添加图层(图层名称='我的图层', 默认显示=True)

# 在上海位置添加一个圆圈标记
上海的圆圈 = 圆圈标记类(位置=常用坐标.上海市, 半径px=15, 圆圈=封闭图形样式类(线条宽度=3, 线条颜色=颜色名.蓝))

# 在常州位置添加一个正三角形标记
常州的三角形 = 正多边形标记类(位置=常用坐标.常州市, 边数=3, 半径px=25, 图形=封闭图形样式类(线条宽度=3, 填充色=颜色名.红, 填充透明度=0.5))

# 在南通位置添加一个图标(Marker)标记
南通的图标 = 图标标记类(位置=常用坐标.南通市, 图标=图标样式类(名称='glyphicon-fire', 颜色=颜色名.绿))

# 在南京位置添加一个正方形标记
南京的正方形 = 正多边形标记类(位置=常用坐标.南京市, 边数=4, 半径px=25, 角度deg=45, 图形=封闭图形样式类(线条宽度=3, 填充色=颜色名.蓝, 填充透明度=0.5))

# 生成一个折线类对象
折线 = 折线类(线条样式=线条样式类(颜色=颜色名.深绿, 宽度=3, 透明度=0.75))

# 把以上位置的标记添加到折线中来
折线.添加路径点(上海的圆圈)
折线.添加路径点(常州的三角形)
折线.添加路径点([南通的图标, 南京的正方形])

# 把折线添加到图层上
地图.添加标记(我的图层, 折线)

地图.保存html(目标路径='.').打开()
```
![img_6.png](img_6.png)  
👆以上代码中,我们在折线类中,定义蚂蚁路径样式,就可以在这条折线上显示蚂蚁如下效果了,修改代码如下:
```python
# -*- coding:UTF-8 -*-

# region 引入必要依赖
from src.GpsAndMap.MapModule import *

# endregion

# 生成一个折线类对象, 并在这个折线上显示蚂蚁路径
折线 = 折线类(线条样式=线条样式类(颜色=颜色名.深绿, 宽度=3, 透明度=0.75), 蚂蚁路径=蚂蚁路径标记类(显示=True))
```
![img_7.png](img_7.png)  
👇依然是上海,常州,南通,南京,下面的代码在这几个位置之间绘制了一个多边形,并定义了这个多边形的样式
```python
# -*- coding:UTF-8 -*-

# region 引入必要依赖
from src.GpsAndMap.MapModule import *

# endregion

地图 = 地图类().添加瓦片.高德地图().地图

地图.添加基地(常用坐标.北京市)

我的图层 = 地图.添加图层(图层名称='我的图层', 默认显示=True)

# 在上海位置添加一个圆圈标记
上海的圆圈 = 圆圈标记类(位置=常用坐标.上海市, 半径px=15, 圆圈=封闭图形样式类(线条宽度=3, 线条颜色=颜色名.蓝))

# 在常州位置添加一个正三角形标记
常州的三角形 = 正多边形标记类(位置=常用坐标.常州市, 边数=3, 半径px=25, 图形=封闭图形样式类(线条宽度=3, 填充色=颜色名.红, 填充透明度=0.5))

# 在南通位置添加一个图标(Marker)标记
南通的图标 = 图标标记类(位置=常用坐标.南通市, 图标=图标样式类(名称='glyphicon-fire', 颜色=颜色名.绿))

# 在南京位置添加一个正方形标记
南京的正方形 = 正多边形标记类(位置=常用坐标.南京市, 边数=4, 半径px=25, 角度deg=45, 图形=封闭图形样式类(线条宽度=3, 填充色=颜色名.蓝, 填充透明度=0.5))

# 生成一个多边形象,
多边形 = 多边形标记类(图形=封闭图形样式类(线条颜色=颜色名.紫, 线条宽度=3, 填充色=颜色名.红, 填充透明度=0.8))

# 把以上位置的标记添加到多边形中来
多边形.添加角点(上海的圆圈)
多边形.添加角点(常州的三角形)
多边形.添加角点([南通的图标, 南京的正方形])

# 把折线添加到图层上
地图.添加标记(我的图层, 多边形)

地图.保存html(目标路径='.').打开()
```
![img_8.png](img_8.png)  
👆同样的,在上面的代码中, 我们在多边形样式中添加蚂蚁路径样式,即可实现蚂蚁路径的效果
```python
# -*- coding:UTF-8 -*-

# region 引入必要依赖
from src.GpsAndMap.MapModule import *

# endregion

# 生成一个多边形象, 并在这个多边形上定义蚂蚁路径样式
多边形 = 多边形标记类(图形=封闭图形样式类(线条颜色=颜色名.紫, 线条宽度=3, 填充色=颜色名.红, 填充透明度=0.8), 蚂蚁路径=蚂蚁路径标记类(显示=True))
```
![img_9.png](img_9.png)  

👇下面的代码在以上海,南京为对角线,添加了一个矩形
```python
# -*- coding:UTF-8 -*-

# region 引入必要依赖
from src.GpsAndMap.MapModule import *

# endregion

地图 = 地图类().添加瓦片.高德地图().地图

地图.添加基地(常用坐标.北京市)

我的图层 = 地图.添加图层(图层名称='我的图层', 默认显示=True)

# 在上海位置添加一个圆圈标记
上海的圆圈 = 圆圈标记类(位置=常用坐标.上海市, 半径px=15, 圆圈=封闭图形样式类(线条宽度=3, 线条颜色=颜色名.蓝))

# 在南京位置添加一个正方形标记
南京的正方形 = 正多边形标记类(位置=常用坐标.南京市, 边数=4, 半径px=25, 角度deg=45, 图形=封闭图形样式类(线条宽度=3, 填充色=颜色名.蓝, 填充透明度=0.5))

# 生成一个矩形对象,
矩形 = 矩形标记类()

# 把以上位置的标记添加到矩形中来
矩形.添加角点(上海的圆圈)
矩形.添加角点(南京的正方形)

# 把折线添加到图层上
地图.添加标记(我的图层, 矩形)

地图.保存html(目标路径='.').打开()
```
![img_10.png](img_10.png)  
👇 下面的代码,我们在太湖的中心,绘制了一个半径为 31km 的圆圈, 可以看到太湖的大概半径为31km. 我们在定义圆圈时,使用了**半径m**这个参数,这个参数使得所绘制的圆圈半径是真实的地理半径值,单位是m
```python
# -*- coding:UTF-8 -*-

# region 引入必要依赖
from src.GpsAndMap.MapModule import *

# endregion

地图 = 地图类().添加瓦片.高德地图().地图

地图.添加基地(常用坐标.北京市)

我的图层 = 地图.添加图层(图层名称='我的图层', 默认显示=True)

# 在高德地图上拾取太湖中心的坐标
太湖中心坐标 = GPS坐标类(120.2601, 31.2132, GPS坐标系类型.高德地图坐标)

地图.添加基地(太湖中心坐标)

# 在上海位置添加一个圆圈标记
太湖中心 = 圆圈标记类(位置=太湖中心坐标, 半径m=31000, 圆圈=封闭图形样式类(线条宽度=3, 线条颜色=颜色名.蓝))

# 把折线添加到图层上
地图.添加标记(我的图层, 太湖中心)

地图.保存html(目标路径='.').打开()
```
![img_11.png](img_11.png)  

👇下面的代码模拟了长三角几个地市的经济数据,通过热力图绘制在地图上,以演示热力层的使用方法
```python
# -*- coding:UTF-8 -*-

# region 引入必要依赖
from src.GpsAndMap.MapModule import *

# endregion

地图 = 地图类().添加瓦片.高德地图().地图

地图.添加基地(常用坐标.北京市)

# 在地图上添加一个热力层图层
热力层 = 地图.添加热力层(图层名称='演示经济数据', 默认显示=True)

# 以下模拟几个地市的经济数据,以演示热力图效果
地图.添加热力点(热力层, 热力点类(常用坐标.上海市, 1250))
地图.添加热力点(热力层, 热力点类(常用坐标.昆山市, 1000))
地图.添加热力点(热力层, 热力点类(常用坐标.苏州市, 1200))
地图.添加热力点(热力层, 热力点类(常用坐标.无锡市, 870))
地图.添加热力点(热力层, 热力点类(常用坐标.南通市, 650))
地图.添加热力点(热力层, 热力点类(常用坐标.常州市, 700))
地图.添加热力点(热力层, 热力点类(常用坐标.泰州市, 500))
地图.添加热力点(热力层, 热力点类(常用坐标.镇江市, 580))
地图.添加热力点(热力层, 热力点类(常用坐标.杨州市, 754))
地图.添加热力点(热力层, 热力点类(常用坐标.南京市, 1100))


地图.保存html(目标路径='.').打开()
```
![img_12.png](img_12.png)  
![img_13.png](img_13.png)  

👇下面的代码中,我们分别在北京位置添加了参考纬线(北纬39.89度线), 在上海位置添加了参考经线(东经121.48度线), 在西安位置添加了参考经纬线(东经108.94, 北纬34.34)
```python
# -*- coding:UTF-8 -*-

# region 引入必要依赖
from src.GpsAndMap.MapModule import *

# endregion

地图 = 地图类().添加瓦片.智图GeoQ水系().地图

地图.添加基地(常用坐标.北京市)
地图.添加基地(常用坐标.上海市)
地图.添加基地(常用坐标.西安市)

地图.添加参考经线(常用坐标.上海市)
地图.添加参考纬线(常用坐标.北京市)
地图.添加参考经纬线(常用坐标.西安市)

地图.保存html(目标路径='.').打开()
```
![img_14.png](img_14.png)  


---
#### 参与贡献

1. Fork 本仓库
2. 新建 Feat_xxx 分支
3. 提交代码
4. 新建 Pull Request

#### 特技

1. 使用 Readme\_XXX.md 来支持不同的语言，例如 Readme\_en.md, Readme\_zh.md
2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com)
3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目
4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目，是综合评定出的优秀开源项目
5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help)
6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)