【1】.根据经纬度获取当前位置
【2】.根据地名获取经纬度
上述两个都好解决,百度地图给出许多API,网上也有许多实例,这里提供两个方便大家在开发中使用(具体坐标准确性请自行测试)
package com.proem.util; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.URL; import java.net.URLEncoder; import java.util.HashMap; import java.util.Map; import org.apache.commons.lang.StringUtils; public class BaiDuMapUtils { public static final String KEY_1 = "百度Key"; /** * 返回输入地址的经纬度坐标 key lng(经度),lat(纬度) */ public static Map<String, String> getGeocoderLatitude(String address) { BufferedReader in = null; try { // 将地址转换成utf-8的16进制 address = URLEncoder.encode(address, "UTF-8"); // 如果有代理,要设置代理,没代理可注释 // System.setProperty("http.proxyHost","192.168.1.188"); // System.setProperty("http.proxyPort","3128"); URL tirc = new URL("http://api.map.baidu.com/geocoder?address=" + address + "&output=json&key=" + KEY_1); in = new BufferedReader(new InputStreamReader(tirc.openStream(), "UTF-8")); String res; StringBuilder sb = new StringBuilder(""); while ((res = in.readLine()) != null) { sb.append(res.trim()); } String str = sb.toString(); Map<String, String> map = null; if (StringUtils.isNotEmpty(str)) { int lngStart = str.indexOf("lng\":"); int lngEnd = str.indexOf(",\"lat"); int latEnd = str.indexOf("},\"precise"); if (lngStart > 0 && lngEnd > 0 && latEnd > 0) { String lng = str.substring(lngStart + 5, lngEnd); String lat = str.substring(lngEnd + 7, latEnd); map = new HashMap<String, String>(); map.put("lng", lng); map.put("lat", lat); return map; } } } catch (Exception e) { e.printStackTrace(); } finally { try { in.close(); } catch (IOException e) { e.printStackTrace(); } } return null; } /** * 根据经纬度 获取 实时 de 地址 */ public static String getGeocoderAddress(String gpsLatitude, String gpsLongitude) { BufferedReader in = null; try { // 将地址转换成utf-8的16进制 //address = URLEncoder.encode(address, "UTF-8"); // 如果有代理,要设置代理,没代理可注释 // System.setProperty("http.proxyHost","192.168.1.188"); // System.setProperty("http.proxyPort","3128"); URL tirc = new URL("http://api.map.baidu.com/geocoder?location=" + gpsLatitude + "," + gpsLongitude + "&output=json&key=" + KEY_1); in = new BufferedReader(new InputStreamReader(tirc.openStream(), "UTF-8")); String res; StringBuilder sb = new StringBuilder(""); while ((res = in.readLine()) != null) { sb.append(res.trim()); } String str = sb.toString(); if (StringUtils.isNotEmpty(str)) { int address = str.indexOf("formatted_address\":"); int addressEnd = str.indexOf("\",\"business"); if (address > 0 && addressEnd > 0) { String returnAddres = str.substring(address + 20, addressEnd); return returnAddres; } } } catch (Exception e) { e.printStackTrace(); } finally { try { in.close(); } catch (IOException e) { e.printStackTrace(); } } return null; } public static void main(String args[]) { // Map<String, String> json = BaiDuMapUtils // .getGeocoderLatitude("舟定海区市"); // System.out.println("lng : " + json.get("lng")); // System.out.println("lat : " + json.get("lat")); } }
【3】.根据经纬度在百度地图展示当前位置
在项目开发中,经纬度是第三方基站返回的经纬度,直接用第三方返回的经纬度调用百度地图会出现偏移,使用google地图根据经纬度查询就是好的
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta name="viewport" content="initial-scale=1.0, user-scalable=no" /> <style type="text/css"> body, html,#allmap {width: 100%;height: 100%;margin:0;font-family:"微软雅黑";} #l-map{height:100%;width:100%;} #r-result{width:100%;} </style> <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=NbRqvoTCvnec3xV8bKd34FuN"></script> <title>xxxx系统</title> </head> <body> <div id="l-map"></div> </body> <script type="text/javascript"> var lng = '<%=request.getAttribute("lng")%>'; var lat = '<%=request.getAttribute("lat")%>'; // 百度地图API功能 var map = new BMap.Map("l-map"); var point = new BMap.Point(lng,lat); map.centerAndZoom(point, 15); var marker = new BMap.Marker(point);// 创建标注 map.addOverlay(marker); // 将标注添加到地图中 marker.disableDragging(); // 不可拖拽 //setTimeout(function(){ // map.setZoom(14); //}, 2000); //2秒后放大到14级 map.enableScrollWheelZoom(true); </script> </html>
解决思路:
1.纠偏
2.使用google地图API(不提供解决方案,请自行百度)
纠偏解决:
下列为第三方API接口,这里只提供思路,在实际项目中请自行选择解决方法。(请参考API来实现)
http://www.gpsspg.com/maps.htm访问下列网站,根据输入的经纬度在不同的地图上获取坐标,发现可以达到纠偏后效果,该网站又提供了API,故调用第三方API来进行纠偏(请参考API来实现)
将下列返回的经纬度在百度地图js上使用接口(纠偏后结果准确性请自行测试)
@RequestMapping("/baiduShow") public String initBaidu(HttpServletRequest request, HttpServletResponse response, HttpSession session, ModelMap model) throws IOException{ String lng = request.getParameter("lng"); String lat = request.getParameter("lat"); //账号密码申请:http://www.gpsspg.com/my/api/order.aspx //地图坐标转换兼容 //oid= //key= //http://www.gpsspg.com/api/convert/latlng/ String paramURL = "http://api.gpsspg.com/convert/latlng/?oid=111111&from=0&to=2&latlng="+lat+","+lng+""; String returnValue = sendPost(paramURL, null); if (returnValue.indexOf("200") > -1){ String lat2 = returnValue.substring(returnValue.indexOf("lat")+5,returnValue.indexOf("lng")-2); String lng2 = returnValue.substring(returnValue.indexOf("lng")+5,returnValue.indexOf("match")-4); if (!"0".equals(lat2) && !"0".equals(lng2)){ lat = lat2; lng = lng2; } } request.setAttribute("lat", lat); model.put("lat", lat); request.setAttribute("lng", lng); model.put("lng", lng); return "baiduMap"; }
/** * 向指定 URL 发送POST方法的请求 * * @param url * 发送请求的 URL * @param param * 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。 * @return 所代表远程资源的响应结果 */ public static String sendPost(String url, String param) { PrintWriter out = null; BufferedReader in = null; String result = ""; try { URL realUrl = new URL(url); // 打开和URL之间的连接 URLConnection conn = realUrl.openConnection(); // 设置通用的请求属性 conn.setRequestProperty("accept", "*/*"); conn.setRequestProperty("connection", "Keep-Alive"); conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); // 发送POST请求必须设置如下两行 conn.setDoOutput(true); conn.setDoInput(true); // 获取URLConnection对象对应的输出流 out = new PrintWriter(conn.getOutputStream()); // 发送请求参数 out.print(param); // flush输出流的缓冲 out.flush(); // 定义BufferedReader输入流来读取URL的响应 in = new BufferedReader( new InputStreamReader(conn.getInputStream())); String line; while ((line = in.readLine()) != null) { result += line; } } catch (Exception e) { System.out.println("发送 POST 请求出现异常!"+e); e.printStackTrace(); } //使用finally块来关闭输出流、输入流 finally{ try{ if(out!=null){ out.close(); } if(in!=null){ in.close(); } } catch(IOException ex){ ex.printStackTrace(); } } return result; }