百度地图纠偏

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值