常见的企业内部应用系统中,多少会需要用到地区管理和地址管理,特别是跟物联网沾边的企业。此时就很可能需要用到地理编码Geocoder服务,把结构化地址解析为经纬度坐标。

NewLife.Map 集成了百度地图接口 BaiduMap 类,提供地理编码、逆地理编码、路径规划和地址检索。源码内置了一个AppKey,可用于学习研究,正式使用请自行申请AppKey。码神工具提供地图接口小工具,依赖该接口类。

Nuget包:NewLife.Map

源码:https://github.com/NewLifeX/NewLife.Map/blob/master/NewLife.Map/BaiduMap.cs

视频:https://www.bilibili.com/video/BV1BV4y1L7Dg

地理编码

地理编码服务提供将结构化地址数据(如:北京市海淀区上地十街十号)转换为对应坐标点(经纬度)功能。

// 查询地址的经纬度坐标
async Task<IDictionary<String, Object>> GetGeocoderAsync(String address, String city = null);
// 查询地址获取坐标,并格式化地址
async Task<GeoAddress> GetGeoAsync(String address, String city = null, Boolean formatAddress = false);

GetGeocoderAsync将在指定城市查找地址,得到其经纬度,该接口比较原始。

GetGeoAsync在得到经纬度后,会再次调用逆地理编码接口,得到该经纬度的标准结构化地址。同一个地点,不同用户填写的地址各种不同,借助该接口将会得到一个相对完整的结构化地址。

在上海市搜索“虹梅路2588弄”,结果如下


逆地理编码

逆地理编码服务提供将坐标点(经纬度)转换为对应位置信息(如所在行政区划,周边地标点分布)功能。

async Task<IDictionary<String, Object>> GetGeocoderAsync(GeoPoint point);
async Task<GeoAddress> GetGeoAsync(GeoPoint point);

GetGeoAsync根据经纬度获取位置信息,包括结构化地址、可信度、行政区划编码、乡镇街道、门牌号等。

解析坐标“121.1025, 31.1795”,结果如下:

不仅得到了格式化地址,还有乡镇街道和门牌号等。

路径规划

百度地图算路服务用于计算两个坐标点之间的驾驶距离,在快递行业常用于计算两个站点之间距离以及行车时间。在中通快递做时效管控时,站点距离和行车时间是重要参考指标。

async Task<Driving> GetDistanceAsync(GeoPoint origin, GeoPoint destination, Int32 type = 13);

计算“华志路1685号”到“虹梅路2588弄”的距离,大概是23.4公里,行驶时间15分钟。

默认驾驶偏好13代表距离最短,不考虑路况。如果考虑路况,11比较合适:

此时距离25.4公里,耗时30分钟,跟百度地图推荐路线一致。

地址检索

服务提供多种场景的地点(POI)检索功能,包括城市检索、圆形区域检索、矩形区域检索。开发者可通过接口获取地点(POI)基础或详细地理信息。

async Task<GeoAddress> PlaceSearchAsync(String query, String tag, String region, Boolean formatAddress = true);

在上海搜索“腾云大厦”,得到以下多个POI点: