【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;
}