|
# NewLife.WeiXin - 地图组件库





地图组件库
æºç : https://github.com/NewLifeX/NewLife.WeiXin
Nuget:`NewLife.WeiXin`
## 功能特性
- ç»Ÿä¸€æŽ¥å£ IMap,å±è”½ç™¾åº¦ / 高德 / 腾讯 / 天地图 / ä¼ä¸šè‡ªå»º(NewLifeMap) 差异
- 地ç†ç¼–ç (地å€â†’åæ ‡ï¼‰/ 逆地ç†ç¼–ç ï¼ˆåæ ‡â†’地å€ï¼‰
- 路径è·ç¦»/驾车时间(ä¸åŒåނ商ç–ç•¥å‚æ•°å·®å¼‚已抽象)
- 行政区划查询(高德)
- POI / è¯ä¹‰ä¿¡æ¯èžåˆï¼Œè‡ªåŠ¨è¡¥å……åœ°å€ç»„ä»¶
- IP 定ä½ï¼ˆç™¾åº¦ï¼‰
- 多 Key è½®è¯¢ä¸Žè‡ªåŠ¨ç†”æ– + 定时æ¢å¤ï¼ˆå†…ç½®é™æµ/失效关键å—识别)
- åæ ‡ç³»äº’转:WGS84 / GCJ02 / BD09(内置常用转æ¢å…¬å¼ï¼‰åŠåŽ‚å•†åœ¨çº¿æ‰¹é‡è½¬æ¢ï¼ˆç™¾åº¦ç‰¹æ®Š from/to æ˜ å°„ï¼‰
- å¯é€‰æŠ›å‡ºå¼‚常 `ThrowException`,便于上层统一处ç†
- å¤šç›®æ ‡æ¡†æž¶ï¼šnet45 / net461 / netstandard2.0 / netstandard2.1(兼容è€é¡¹ç›®ä¸Žçް代 .NET)
- 强命åç¾å,适åˆå射与æ’件体系
- Stardust 注册ä¸å¿ƒé›†æˆï¼ˆ`NewLifeMap` æä¾›è€…ï¼‰æ”¯æŒæœåŠ¡å‘现与多实例地å€è‡ªåŠ¨åˆ·æ–°
## 安装
```bash
# 稳定版
dotnet add package NewLife.WeiXin
# 预览版(带日期)
dotnet add package NewLife.WeiXin --prerelease
```
## 快速开始
```csharp
using NewLife.WeiXin;
using NewLife.Data;
// 选择一个具体地图æä¾›è€…(BaiduMap / AMap / TencentMap / TianDiMap / NewLifeMap)
var map = new BaiduMap { AppKey = "<BAIDU_AK>" }; // 多个 key 用逗å·åˆ†éš”
// 1. æ£å‘地ç†ç¼–ç ï¼šåœ°å€ -> åæ ‡
var geo = await map.GetGeoAsync("北京市海淀区上地åè¡—10å·", city: "北京", coordtype: "bd09ll", formatAddress: true);
Console.WriteLine($"Point: {geo?.Location} è¯ä¹‰:{geo?.Title}");
// 2. 逆地ç†ç¼–ç ï¼šåæ ‡ -> 地å€
var addr = await map.GetReverseGeoAsync(new GeoPoint(116.30815, 40.056885), "bd09ll");
Console.WriteLine(addr?.Address);
// 3. è·ç¦»ï¼ˆé©¾è½¦ï¼‰
var d = await map.GetDistanceAsync(new GeoPoint(116.30815, 40.056885), new GeoPoint(116.39745, 39.909187), "bd09ll");
Console.WriteLine($"Distance={d?.Distance}m Duration={d?.Duration}s");
// 4. åæ ‡è½¬æ¢ï¼ˆç¦»çº¿å…¬å¼ï¼‰
var list = await map.ConvertAsync(new List<GeoPoint> { new(116.30815, 40.056885) }, from: "wgs84", to: "bd09");
Console.WriteLine(list[0]);
```
> åæ ‡ç³»éœ€ä½¿ç”¨çƒé¢åæ ‡ï¼ˆç»çº¬åº¦ï¼‰ï¼Œè¾“出为 BD09 åæ ‡ç³»çš„点。
## 通过工厂动æ€åˆ›å»º
```csharp
var m1 = Map.Create("Baidu"); // è‡ªåŠ¨åŒ¹é… *Map åŽç¼€
var m2 = Map.Create("AMap"); // 高德
var m3 = Map.Create("NewLifeMap");
```
> `AppKey` 在实例化åŽè®¾ç½®ï¼›å¤šä¸ª key 以逗å·åˆ†éš”,内部轮询使用。
## æä¾›è€…说明
| æä¾›è€… | ç±»å | 主è¦èƒ½åŠ› | 备注 |
| ------ | ---- | -------- | ---- |
| 百度地图 | `BaiduMap` | 地ç†/逆地ç†/è·ç¦»/POI检索/IP定ä½/åæ ‡è½¬æ¢(在线+离线) | `KeyName=ak` |
| 高德地图 | `AMap` | 地ç†/逆地ç†/è·ç¦»/行政区划/åæ ‡è½¬æ¢(离线) | `KeyName=key` |
| 腾讯地图 | `TencentMap` | (若实现) 地ç†/逆地ç†/è·ç¦» | åŒæ¨¡å¼ |
| 天地图 | `TianDiMap` | (若实现) 地ç†/é€†åœ°ç† | |
| æ–°ç”Ÿå‘½åœ°å›¾å¹³å° | `NewLifeMap` | ä¼ä¸šèšåˆæŽ¥å£ï¼ˆåŽç«¯å¾®æœåŠ¡ç»Ÿä¸€å°è£…) | 通过 Stardust æœåŠ¡å‘现 |
`TencentMap.cs` / `TianDiMap.cs` è‹¥ä¸ºç©ºæˆ–æœªå®žçŽ°ï¼Œå¯æŒ‰ AMap/BaiduMap æ¨¡å¼æ‰©å±•。
## NewLifeMap & 星尘集æˆ
```csharp
// æ–¹å¼1:直接指定æœåŠ¡ç«¯
var map = new NewLifeMap("http://mapapi.company.local") { AppKey = "<KEY>" };
// æ–¹å¼2:ä¾èµ–注入 + Stardust Registry 自动解æžåœ°å€
services.AddSingleton<IMap, NewLifeMap>();
// NewLifeMap(IServiceProvider) æž„é€ å‡½æ•°ä¸ä¼šå°è¯•:IRegistry -> StarFactory
```
当åŽç«¯ NewLife.WeiXinWeb 节点列表å˜åŒ–时,绑定的 `ApiHttpClient` 会自动更新,å¯åœ¨å¤šå‰¯æœ¬/è“绿å‘å¸ƒä¸æ— 感切æ¢ã€‚
## AppKey 多 Key 轮询与熔æ–
- ä¼ å…¥ `AppKey="k1,k2,k3"`
- æ¯æ¬¡è¯·æ±‚递增索引å–ä½™
- è‹¥å“åº”å‘½ä¸æ— 效关键å—(如:`TOO_FREQUENT`, `LIMIT`, `INVALID` ç‰ï¼‰ï¼Œè°ƒç”¨ `RemoveKey()` 将其暂时下线
- 下线 key 会放入 `_pendingKeys`,定时器到期åŽè‡ªåЍæ¢å¤
- æ¢å¤æ—¶é—´ç–略:当å‰å®žçŽ°ä¸ºè°ƒç”¨å¤„è‡ªè¡Œä¼ å…¥ï¼ˆä¾‹å¦‚ 1 å°æ—¶ï¼‰
## åæ ‡ç³»è¯´æ˜Ž
| åç§° | 说明 | 常è§åނ商 |
| ---- | ---- | -------- |
| WGS84 | 国际通用 GPS | è®¾å¤‡åŽŸå§‹å®šä½ |
| GCJ02 | å›½æµ‹å±€åŠ å | 高德 / 腾讯 / ç»å¤§å¤šæ•°å›½å†…在线地图 |
| BD09 | ç™¾åº¦åŠ å | 百度 |
调用示例:
```csharp
var rs = await map.ConvertAsync(new [] { new GeoPoint(lng, lat) }, from:"wgs84", to:"gcj02");
```
百度在线转æ¢éœ€è¦ from/to 索引值,本库已å°è£…。
## 常用 API 一览
```csharp
Task<GeoAddress?> GetGeoAsync(string address, string? city=null, string? coordtype=null, bool formatAddress=false);
Task<GeoAddress?> GetReverseGeoAsync(GeoPoint point, string? coordtype);
Task<Driving?> GetDistanceAsync(GeoPoint origin, GeoPoint destination, string? coordtype, int type=0);
Task<IList<GeoPoint>> ConvertAsync(IList<GeoPoint> points, string from, string to);
```
扩展(BaiduMap / AMap 特有):
```csharp
Task<GeoAddress?> PlaceSearchAsync(...); // BaiduMap POI / 区域检索
Task<IList<GeoArea>> GetAreaAsync(...); // AMap 行政区划
Task<IDictionary<string, object?>> IpLocationAsync(...); // BaiduMap IP 定ä½
```
## 错误处ç†
- 默认:接å£è¿”å›žéžæˆåŠŸçŠ¶æ€ä¸ä¼šæŠ›å¼‚常,方法返回 null
- 设置 `map.ThrowException = true;` åŽæŠ›å‡º `Exception`,便于外层统一æ•获
- 最近一次请求调试信æ¯ï¼š`LastUrl` / `LastString` / `LastResult` / `LastKey`
## 扩展一个新地图æä¾›è€…æ¥éª¤
1. 新建类 `XXXMap : Map, IMap`
2. 设置 `Server` / `KeyName`
3. é‡å†™ `InvokeAsync<T>` è§£æžè¯¥åŽ‚å•†ç»Ÿä¸€è¿”å›žç»“æž„ & 错误ç
4. 实现 `GetGeoAsync` / `GetReverseGeoAsync` / 其它所需能力
5. è‹¥æœ‰ä¸“å±žé™æµ/失效特å¾ï¼Œé‡å†™ `IsValidKey` 返回 true 触å‘临时下线
6. æäº¤å•元测试覆盖主è¦åŠŸèƒ½ä¸Žè¾¹ç•Œ
## å•元测试
ä»“åº“åŒ…å« `XUnitTest` 工程:
- `*MapTests`:针对ä¸åŒæä¾›è€…的编ç /é€†ç¼–ç æµ‹è¯•
- 请将真实 Key 放入本地用户机密或环境å˜é‡ï¼Œä¸è¦æäº¤åˆ°ä»“库
è¿è¡Œï¼š
```bash
dotnet test -c Release
```
## 构建
```bash
dotnet build -c Release
```
输出(多框架编译)ä½äºŽ `Bin/`。
## Roadmap / TODO
- [ ] 补全 `TencentMap` / `TianDiMap` 具体实现(若ä»ä¸ºç©ºï¼‰
- [ ] 为 `NewLifeMap` èšåˆå¹³å°è¡¥å……æ£å‘地ç†ç¼–ç 与è·ç¦»è®¡ç®—接å£
- [ ] å¢žåŠ å¹¶å‘é™é€Ÿï¼ˆä»¤ç‰Œæ¡¶ï¼‰å¯é€‰é€‚é…,é¿å…密钥整体å°ç¦
- [ ] æ·»åŠ Benchmark 基准对比(批é‡åæ ‡è½¬æ¢ï¼‰
- [ ] 丰富故障统计 / Metrics(æˆåŠŸçŽ‡ã€å¹³å‡è€—æ—¶ã€Key 命ä¸çŽ‡ï¼‰
## 版本ç–ç•¥
主版本 = å…¼å®¹æ€§å˜æ›´ï¼›æ¬¡ç‰ˆæœ¬ = æ–°åŠŸèƒ½ï¼›ä¿®è®¢å· = ä¿®å¤ / 优化。`VersionSuffix` å¸¦æ—¥æœŸï¼Œä¾¿äºŽå¿«é€Ÿå®šä½æž„建。
## 贡献
欢迎 Issue / PR:Bugã€æ€§èƒ½ä¼˜åŒ–ã€æ”¯æŒæ›´å¤šåœ°å›¾ã€è¡¥å……文档与测试。æäº¤å‰è¯·é˜…读 `.github/copilot-instructions.md` ä»¥ä¿æŒä»£ç é£Žæ ¼ä¸€è‡´ã€‚
## 许å¯è¯
MIT,ä¿ç•™ç‰ˆæƒå£°æ˜Žå³å¯è‡ªç”±ä½¿ç”¨äºŽå•†ä¸š / å¼€æºé¡¹ç›®ã€‚
---
## NewLifeMap
地图æä¾›è€…NewLifeMap指å‘内置MapApi地图接å£å¹³å°ï¼Œå±è”½å„家接å£å·®å¼‚,支æŒè‡ªå®šä¹‰ä¿®æ”¹ã€‚
NewLifeMap 坿˜Žæ–‡åˆ¶å®šæœåŠ¡ç«¯åœ°å€ï¼Œä¹Ÿå¯ä»¥å€ŸåŠ©ä¾èµ–注入自动从星尘注册ä¸å¿ƒèŽ·å–。
## 新生命项目矩阵
å„项目默认支æŒnet9.0/netstandard2.1/netstandard2.0/net4.62/net4.5,旧版(2024.0801)支æŒnet4.0/net2.0
| 项目 | 年份 | 说明 |
| :--------------------------------------------------------------: | :---: | ------------------------------------------------------------------------------------------- |
| 基础组件 | | 支撑其它ä¸é—´ä»¶ä»¥åŠäº§å“项目 |
| [NewLife.Core](https://github.com/NewLifeX/X) | 2002 | æ ¸å¿ƒåº“ï¼Œæ—¥å¿—ã€é…ç½®ã€ç¼“å˜ã€ç½‘络ã€åºåˆ—化ã€APM性能追踪 |
| [NewLife.XCode](https://github.com/NewLifeX/NewLife.XCode) | 2005 | 大数æ®ä¸é—´ä»¶ï¼Œå•表百亿级,MySql/SQLite/SqlServer/Oracle/PostgreSql/达梦,自动分表,读写分离 |
| [NewLife.Net](https://github.com/NewLifeX/NewLife.Net) | 2005 | ç½‘ç»œåº“ï¼Œå•æœºåƒä¸‡çº§åžå率(2266万tpsï¼‰ï¼Œå•æœºç™¾ä¸‡çº§è¿žæŽ¥ï¼ˆ400万Tcp长连接) |
| [NewLife.Remoting](https://github.com/NewLifeX/NewLife.Remoting) | 2011 | å议通信库,æä¾›CS应用通信框架,支æŒHttp/RPC通信框架,高åžå,物è”网设备低开销易接入 |
| [NewLife.Cube](https://github.com/NewLifeX/NewLife.Cube) | 2010 | 锿–¹å¿«é€Ÿå¼€å‘å¹³å°ï¼Œé›†æˆäº†ç”¨æˆ·æƒé™ã€SSO登录ã€OAuthæœåŠ¡ç«¯ç‰ï¼Œå•表100äº¿çº§é¡¹ç›®éªŒè¯ |
| [NewLife.Agent](https://github.com/NewLifeX/NewLife.Agent) | 2008 | æœåŠ¡ç®¡ç†ç»„件,把应用安装æˆä¸ºæ“作系统守护进程,WindowsæœåŠ¡ã€Linuxçš„Systemd |
| [NewLife.Zero](https://github.com/NewLifeX/NewLife.Zero) | 2020 | Zero零代脚手架,基于NewLife组件生æ€çš„项目模æ¿NewLife.Templates,Webã€WebApiã€Service |
| ä¸é—´ä»¶ | | 对接知åä¸é—´ä»¶å¹³å° |
| [NewLife.Redis](https://github.com/NewLifeX/NewLife.Redis) | 2017 | Redis客户端,微秒级延迟,百万级åžå,丰富的消æ¯é˜Ÿåˆ—,百亿级数æ®é‡é¡¹ç›®éªŒè¯ |
| [NewLife.RocketMQ](https://github.com/NewLifeX/NewLife.RocketMQ) | 2018 | RocketMQ纯托管客户端,支æŒApache RocketMQ和阿里云消æ¯é˜Ÿåˆ—,å亿级项目验 |
| [NewLife.MQTT](https://github.com/NewLifeX/NewLife.MQTT) | 2019 | 物è”网消æ¯å议,MqttClient/MqttServer,客户端支æŒé˜¿é‡Œäº‘物è”网 |
| [NewLife.IoT](https://github.com/NewLifeX/NewLife.IoT) | 2022 | IoTæ ‡å‡†åº“ï¼Œå®šä¹‰ç‰©è”网领域的å„ç§é€šä¿¡åè®®æ ‡å‡†è§„èŒƒ |
| [NewLife.Modbus](https://github.com/NewLifeX/NewLife.Modbus) | 2022 | ModbusTcp/ModbusRTU/ModbusASCII,基于IoTæ ‡å‡†åº“å®žçŽ°ï¼Œæ”¯æŒZeroIoTå¹³å°å’ŒIoTEdge网关 |
| [NewLife.Siemens](https://github.com/NewLifeX/NewLife.Siemens) | 2022 | 西门åPLCå议,基于IoTæ ‡å‡†åº“å®žçŽ°ï¼Œæ”¯æŒIoTå¹³å°å’ŒIoTEdge |
| [NewLife.WeiXin](https://github.com/NewLifeX/NewLife.WeiXin) | 2022 | 地图组件库,å°è£…百度地图ã€é«˜å¾·åœ°å›¾ã€è…¾è®¯åœ°å›¾ã€å¤©åœ°å›¾ |
| [NewLife.Audio](https://github.com/NewLifeX/NewLife.Audio) | 2023 | 音频编解ç 库,PCM/ADPCMA/G711A/G722U/WAV/AAC |
| 产å“å¹³å° | | 产å“å¹³å°çº§ï¼Œç¼–译部署å³ç”¨ï¼Œä¸ªæ€§åŒ–自定义 |
| [Stardust](https://github.com/NewLifeX/Stardust) | 2018 | æ˜Ÿå°˜ï¼Œåˆ†å¸ƒå¼æœåС平å°ï¼ŒèŠ‚ç‚¹ç®¡ç†ã€APM监控ä¸å¿ƒã€é…ç½®ä¸å¿ƒã€æ³¨å†Œä¸å¿ƒã€å‘布ä¸å¿ƒ |
| [AntJob](https://github.com/NewLifeX/AntJob) | 2019 | èš‚èšè°ƒåº¦ï¼Œåˆ†å¸ƒå¼å¤§æ•°æ®è®¡ç®—å¹³å°ï¼ˆå®žæ—¶/ç¦»çº¿ï¼‰ï¼Œèš‚èšæ¬å®¶åˆ†ç‰‡æ€æƒ³ï¼Œä¸‡äº¿çº§æ•°æ®é‡é¡¹ç›®éªŒè¯ |
| [NewLife.ERP](https://github.com/NewLifeX/NewLife.ERP) | 2021 | ä¼ä¸šERP,产å“管ç†ã€å®¢æˆ·ç®¡ç†ã€é”€å”®ç®¡ç†ã€ä¾›åº”å•†ç®¡ç† |
| [CrazyCoder](https://github.com/NewLifeX/XCoder) | 2006 | ç 神工具,众多开å‘者工具,网络ã€ä¸²å£ã€åŠ è§£å¯†ã€æ£åˆ™è¡¨è¾¾å¼ã€Modbusã€MQTT |
| [EasyIO](https://github.com/NewLifeX/EasyIO) | 2023 | 简易文件å˜å‚¨ï¼Œæ”¯æŒåˆ†å¸ƒå¼ç³»ç»Ÿä¸æ–‡ä»¶é›†ä¸å˜å‚¨ã€‚ |
| [XProxy](https://github.com/NewLifeX/XProxy) | 2005 | 产å“级åå‘代ç†ï¼ŒNAT代ç†ã€Httpä»£ç† |
| [HttpMeter](https://github.com/NewLifeX/HttpMeter) | 2022 | Http压力测试工具 |
| [GitCandy](https://github.com/NewLifeX/GitCandy) | 2015 | Gitæºä»£ç 管ç†ç³»ç»Ÿ |
| [SmartOS](https://github.com/NewLifeX/SmartOS) | 2014 | åµŒå…¥å¼æ“作系统,完全独立自主,支æŒARM Cortex-M芯片架构 |
| [SmartA2](https://github.com/NewLifeX/SmartA2) | 2019 | 嵌入å¼å·¥ä¸šè®¡ç®—机,物è”网边缘网关,高性能.NET8主机,应用于工业ã€å†œä¸šã€äº¤é€šã€åŒ»ç–— |
| FIoT物è”ç½‘å¹³å° | 2020 | 物è”网整体解决方案,建ç‘ã€çޝä¿ã€å†œä¸šï¼Œè½¯ç¡¬ä»¶åŠå¤§æ•°æ®åˆ†æžä¸€ä½“åŒ–ï¼Œå•æœºå万级点ä½é¡¹ç›®éªŒè¯ |
| UWBé«˜ç²¾åº¦å®¤å†…å®šä½ | 2020 | 厘米级(10~20cm)高精度室内定ä½ï¼Œè½¯ç¡¬ä»¶ä¸€ä½“化,与其它系统è”åŠ¨ï¼Œå¤§åž‹å±•åŽ…é¡¹ç›®éªŒè¯ |
## 新生命开å‘团队

新生命团队(NewLife)æˆç«‹äºŽ2002年,是新时代物è”网行业解决方案æä¾›è€…,致力于æä¾›è½¯ç¡¬ä»¶åº”用方案咨询ã€ç³»ç»Ÿæž¶æž„è§„åˆ’ä¸Žå¼€å‘æœåŠ¡ã€‚
团队主导的80多个开æºé¡¹ç›®å·²è¢«å¹¿æ³›åº”用于å„行业,Nuget累计下载é‡é«˜è¾¾400余万次。
团队开å‘的大数æ®ä¸é—´ä»¶NewLife.XCodeã€èš‚èšè°ƒåº¦è®¡ç®—å¹³å°AntJobã€æ˜Ÿå°˜åˆ†å¸ƒå¼å¹³å°Stardustã€ç¼“å˜é˜Ÿåˆ—组件NewLife.Redis以åŠç‰©è”网平å°FIoTï¼Œå‡æˆåŠŸåº”ç”¨äºŽç”µåŠ›ã€é«˜æ ¡ã€äº’è”网ã€ç”µä¿¡ã€äº¤é€šã€ç‰©æµã€å·¥æŽ§ã€åŒ»ç–—ã€æ–‡åšç‰è¡Œä¸šï¼Œä¸ºå®¢æˆ·æä¾›äº†å¤§é‡å…ˆè¿›ã€å¯é ã€å®‰å…¨ã€é«˜è´¨é‡ã€æ˜“扩展的产å“å’Œç³»ç»Ÿé›†æˆæœåŠ¡ã€‚
æˆ‘ä»¬å°†ä¸æ–通过æœåŠ¡çš„æŒç»æ”¹è¿›ï¼Œæˆä¸ºå®¢æˆ·é•¿æœŸä¿¡èµ–çš„åˆä½œä¼™ä¼´ï¼Œé€šè¿‡ä¸æ–的创新和å‘展,æˆä¸ºå›½å†…优秀的IoTæœåŠ¡ä¾›åº”å•†ã€‚
`新生命团队始于2002年,部分开æºé¡¹ç›®å…·æœ‰20年以上漫长历å²ï¼Œæºç 库ä¿ç•™æœ‰2010å¹´ä»¥æ¥æ‰€æœ‰ä¿®æ”¹è®°å½•`
网站:https://newlifex.com
å¼€æºï¼šhttps://github.com/newlifex
QQ群:1600800/1600838
微信公众å·ï¼š

|