高德地图:地理/逆地理编码
高德API:http://lbs.amap.com/api/webservice/guide/api/georegeo/
http://restapi.amap.com/v3/geocode/geo?key=7de8697669288fc848e12a08f58d995e&s=rsv3&city=杭州市&address=杭州市天成路87号现代大厦
这里边的key是别人开放的key,用起来感觉还可以。基本上没有太大的限制,使用上边的接口获取经纬度是基本上100%成功,但是这个坐标系是GCJ02坐标。
按照上边的接口可以返回的结果信息为:
{"status":"1","info":"OK","infocode":"10000","count":"1","geocodes":[{"formatted_address":"浙江省杭州市江干区现代大厦","province":"浙江省","citycode":"0571","city":"杭州市","district":"江干区","township":[],"neighborhood":{"name":[],"type":[]},"building":{"name":[],"type":[]},"adcode":"330104","street":[],"number":[],"location":"120.204319,30.287145","level":"兴趣点"}]}
根据GPS格式的经纬度,调用高德API返回具体地址信息:
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Text; namespace ConsoleApp1 { class Program { static void Main(string[] args) { string address = GetAddressByGcjLngLat("120.204319", "30.287145"); Console.WriteLine(address); Console.ReadKey(); } /// <summary> /// 根据GPS经纬度,返回对应位置的地址信息。 /// 请求API:http://restapi.amap.com/v3/geocode/regeo?output=json&location=120.204319,30.287145&key=7de8697669288fc848e12a08f58d995e&radius=100&extensions=base /// </summary> /// <param name="longitude"></param> /// <param name="latitude"></param> /// <returns></returns> public static string GetAddressByGcjLngLat(string longitude, string latitude) { Tuple<bool, string, string> gcjLngLat = TransformGPS2GCJ(longitude, latitude); // Console.WriteLine("{0}:{1}:{2}", gcjLngLat.Item1, gcjLngLat.Item2, gcjLngLat.Item3); if (false == gcjLngLat.Item1) return string.Empty; string address = string.Empty; try { // 格式:http://restapi.amap.com/v3/geocode/regeo?output=json&location=120.204319,30.287145&key=7de8697669288fc848e12a08f58d995e&radius=100&extensions=base string content = HttpGet("http://restapi.amap.com/v3/geocode/regeo?output=json&location=" + gcjLngLat.Item2 + "," + gcjLngLat.Item3 + "&key=7de8697669288fc848e12a08f58d995e&radius=200&extensions=base"); // 返回值格式:{"status":"1","info":"OK","infocode":"10000","regeocode":{"formatted_address":"浙江省杭州市江干区闸弄口街道万家花园(天城路)","addressComponent":{"country":"中国","province":"浙江省","city":"杭州市","citycode":"0571","district":"江干区","adcode":"330104","township":"闸弄口街道","towncode":"330104007000","neighborhood":{"name":"万家花园(天城路)","type":"商务住宅;住宅区;住宅小区"},"building":{"name":[],"type":[]},"streetNumber":{"street":"天城路","number":"87号","location":"120.204319,30.2871444","direction":"南","distance":"0.0617778"},"businessAreas":[{"location":"120.20604745161295,30.28125106451613","name":"火车东站","id":"330104"}]}}} string[] adddressItems = content.Replace("\"", string.Empty).Split(new char[] { '{', ',', '}', '[', ']' }); if (adddressItems != null && adddressItems.Length > 0) { foreach (string addressItem in adddressItems) { if (addressItem.StartsWith("formatted_address:", StringComparison.OrdinalIgnoreCase)) { address = addressItem.Replace("formatted_address:", string.Empty); break; } } } } catch (Exception ex) { // 出现异常,返回转化失败且不扑捉异常信息。 } // Console.WriteLine(address); return address; } /// <summary> /// 接口地址 /// http://api.zdoz.net/transmore.ashx /// 接口说明 /// 批量纠偏,一次最大可纠偏1000个坐标点 /// 参数 /// lats:维度,多个维度用“;”隔开 /// lngs:经度,多个经度用“;”隔开(要注意经纬度个数相等) /// type:转换类型 【1.WGS -> GCJ】 【2.GCJ -> WGS】 【3.GCJ -> BD】 【4.BD -> GCJ】 【5.WGS -> BD】 【6.BD -> WGS】 /// 返回值JSON /// 根据次序返回一个json格式的数组 /// 演示 /// 参数:lats=34.123;34.332;55.231&lngs=113.123;112.213;115.321&type=1 /// 返回:[{"Lng":113.12942937312582,"Lat":34.121761850760855},{"Lng":112.21911710957568,"Lat":34.3306763095054}, {"Lng":115.33036232125529,"Lat":55.232930158541052}] /// </summary> /// <param name="lngGPS">gps格式的经度,将会被转化为GCJ02格式的经度</param> /// <param name="latGPS">gps格式的纬度,将会被转化为GCJ02格式的纬度</param> /// <returns>(bool:是否转化成功,string:gcj02格式的经度,string:gcj02格式的纬度)</returns> public static Tuple<bool, string, string> TransformGPS2GCJ(string lngGPS, string latGPS) { Tuple<bool, string, string> result = new Tuple<bool, string, string>(false, string.Empty, string.Empty); try { // 格式:http://api.zdoz.net/transmore.ashx?lats=34.123&lngs=113.123&type=1 string content = HttpGet("http://api.zdoz.net/transmore.ashx?lats=" + latGPS + "&lngs=" + lngGPS + "&type=1"); // 返回值格式:[{"Lng":113.12942937312582,"Lat":34.121761850760855}] content = content.Replace("[{", string.Empty).Replace("}]", string.Empty).Replace("\"", string.Empty); string[] lngLatItems = content.Split(new char[] { ',' }); if (lngLatItems != null && lngLatItems.Length == 2 && lngLatItems[0].StartsWith("lng", StringComparison.OrdinalIgnoreCase) && lngLatItems[1].StartsWith("lat", StringComparison.OrdinalIgnoreCase)) { result = new Tuple<bool, string, string>(true, lngLatItems[0].ToLower().Replace("lng:", string.Empty), lngLatItems[1].ToLower().Replace("lat:", string.Empty)); } } catch (Exception ex) { // 出现异常,返回转化失败且不扑捉异常信息。 } return result; } /// <summary> /// Get访问uri并反回请求响应内容。 /// </summary> /// <param name="uri"></param> /// <param name="timeout">请求超时时间,默认:30s超时</param> /// <returns></returns> public static string HttpGet(string uri, int timeout = 30 * 1000) { string result = string.Empty; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri); request.Method = "GET"; request.ContentType = "text/html;charset=UTF-8"; request.Timeout = timeout; using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) { using (Stream myResponseStream = response.GetResponseStream()) { using (StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.UTF8)) { result = myStreamReader.ReadToEnd(); } } } return result; } } }
感谢您的阅读,如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮。本文欢迎各位转载,但是转载文章之后必须在文章页面中给出作者和原文连接。
基础才是编程人员应该深入研究的问题,比如:
1)List/Set/Map内部组成原理|区别
2)mysql索引存储结构&如何调优/b-tree特点、计算复杂度及影响复杂度的因素。。。
3)JVM运行组成与原理及调优
4)Java类加载器运行原理
5)Java中GC过程原理|使用的回收算法原理
6)Redis中hash一致性实现及与hash其他区别
7)Java多线程、线程池开发、管理Lock与Synchroined区别
8)Spring IOC/AOP 原理;加载过程的。。。
【+加关注】。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· [翻译] 为什么 Tracebit 用 C# 开发
· Deepseek官网太卡,教你白嫖阿里云的Deepseek-R1满血版
· 2分钟学会 DeepSeek API,竟然比官方更好用!
· .NET 使用 DeepSeek R1 开发智能 AI 客户端
· 刚刚!百度搜索“换脑”引爆AI圈,正式接入DeepSeek R1满血版