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

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

Nuget包:NewLife.Map

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

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


地理编码

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

// 查询地址的经纬度坐标
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.396096, 31.174178”,结果如下:

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

路径规划

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

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

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

跟高德地图推荐路线一致。

行政区划查询

行政区域查询是一类简单的HTTP接口,根据用户输入的搜索条件可以帮助用户快速的查找特定的行政区域信息。查询可得到下级地区的城市代码、行政区划代码、中心经纬度等。

async Task<IList<GeoArea>> GetAreaAsync(String keywords, Int32 subdistrict = 1, Int32 code = 0);

搜索“玉林”这个城市的行程区划,得到以下多个地址: