java微信开发---获取微信经纬度/转化(google/百度)经纬度--并且得到地址详情

来源:互联网 发布:linux服务器编程模型 编辑:程序博客网 时间:2024/06/05 04:54

其实获取微信经纬度,很简单根据我前面的第一篇可以了解到进入要获取微信经纬度的页面时,我们只要先页面授权得到签名就可以了!

这里得到签名的方法网上很多,也可以看我的第一篇文档,直接复制就可以用了!

代码:
</pre><pre class="html" name="code"><%@ 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 lang="zh-CN"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"><title>获取微信经纬度</title><!-- 微信 js-sdk --><script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script><script src="https://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script><!-- 新 Bootstrap 核心 CSS 文件 --><link rel="stylesheet" href="//cdn.bootcss.com/bootstrap/3.3.5/css/bootstrap.min.css"> <!-- jQuery文件。务必在bootstrap.min.js 之前引入 --><script src="//cdn.bootcss.com/jquery/1.11.3/jquery.min.js"></script></style></head><body><br><div class="container">   <div class="form-group" ><label for="firstname" class="col-sm-2 control-label">地址:</label><div class="col-sm-10" id="item-ifo"><input type="text" value="" class="form-control" name="location.address"id="address" placeholder="正在获取地理位置" tabindex="1" autocomplete="off"/><div class="i-name ico" id="i-name"></div> </div></div> </div></body><script type="text/javascript">//alert(location.href.split('#')[0]);得到确定授权页面地址<pre class="html" name="code">//config接口权限配置  下面的如何得到参数可以看第一篇文档  或者---加群93472007咨询 (大神很多)wx.config({beta : true, // 开启内测接口调用,注入wx.invoke方法debug : false, // 开启调试模式appId : '${config.appId}', // 第三方app唯一标识timestamp : '${config.timestamp}', // 生成签名的时间戳nonceStr : '${config.nonce}', // 生成签名的随机串signature : '${config.signature}',// 签名jsApiList : [//添加使用的函数 ---这里的函数调用微信有说明'checkJsApi', 'openLocation', 'getLocation' ]});wx.checkJsApi({jsApiList : [ 'getLocation' ],success : function(res) {//alert(JSON.stringify(res));// alert(JSON.stringify(res.checkResult.getLocation));if (res.checkResult.getLocation == false) {alert('你的微信版本太低,不支持微信JS接口,请升级到最新的微信版本!');return;}}});var latitude;var longitude;var speed;var accuracy;//ready权限验证 --正确就得到微信经纬度wx.ready(function() {wx.invoke('getLocation', 'openLocation', {}, function(res) {//alert(res.err_msg + "唯一");});wx.getLocation({success : function(res) {latitude = res.latitude; // 纬度,浮点数,范围为90 ~ -90longitude = res.longitude; // 经度,浮点数,范围为180 ~ -180。speed = res.speed; // 速度,以米/每秒计accuracy = res.accuracy; // 位置精度//alert(latitude);//alert(longitude);submitOrderInfoClick();},cancel : function(res) {alert('用户拒绝授权获取地理位置');}});});wx.error(function(res) {alert("验证出错");});//这个事件是得到微信经纬度去后台获取百度经纬度,google经纬度或者其它的经纬度,要知道微信经纬度是gps的和我们要使用的地图定位不一样所以这里我们需要转化//转化 1.可以通过页面转化得到你要的地图经纬度-并且得到地址详情//转化 2.和我一样不喜欢写前台,可以直接在后台中得到 (目的都是一样的)function submitOrderInfoClick() {//alert(latitude);//alert(longitude);var url = "/task/details";$.post(url, {latitude : latitude,longitude : longitude}, function(data) {if (data != null) {var json = eval(data);$("#address").val(json[1]);$("#locationname").val(json[2]);} else {alert("获取地理位置失败是否重新获取");}});}</script></html>
这里的是得到微信的信息之后我们进入后台!
代码:
// 得到详情地址@ResponseBody@RequestMapping(value = "/details", method = RequestMethod.POST)public String details(Map<String, Object> model, HttpSession session) {String latitude = request.getParameter("latitude");String longitude = request.getParameter("longitude");System.out.println(latitude);System.out.println(longitude);if (latitude!=null & longitude!=null) {double lat = Double.valueOf(latitude).doubleValue();double lon = Double.valueOf(longitude).doubleValue();// 微信是GPS需要转化地图Gps gps = new Gps(lat, lon);Gps gcj = PositionUtil.gps84_To_Gcj02(gps.getWgLat(), gps.getWgLon());String jsonStr = GetLocationMsg.GetLocationMs(gcj.getWgLat(), gcj.getWgLon());// 因为嵌套太多先解析JSONObject jsonObj = JSONArray.parseObject(jsonStr);JSONArray jsonArray = (JSONArray) jsonObj.get("results");List list = new ArrayList();// 用list保存全部数据for (int i = 0; i < jsonArray.size(); i++) {Userdetails user = (Userdetails) JSONObject.toJavaObject(jsonArray.getJSONObject(i), Userdetails.class);// System.out.println(user.toString());list.add(user.getFormatted_address());}String json = JSON.toJSONString(list); // list转jsonSystem.out.println(json);// 页面上return json;}else {return null;}}
下面就算相关的类了 positionUtil
package xyz.ibenben.parttime.common.util;/** * 各地图API坐标系统比较与转换; * WGS84坐标系:即地球坐标系,国际上通用的坐标系。设备一般包含GPS芯片或者北斗芯片获取的经纬度为WGS84地理坐标系, * 谷歌地图采用的是WGS84地理坐标系(中国范围除外); * GCJ02坐标系:即火星坐标系,是由中国国家测绘局制订的地理信息系统的坐标系统。由WGS84坐标系经加密后的坐标系。 * 谷歌中国地图和搜搜中国地图采用的是GCJ02地理坐标系; BD09坐标系:即百度坐标系,GCJ02坐标系经加密后的坐标系; * 搜狗坐标系、图吧坐标系等,估计也是在GCJ02基础上加密而成的。 chenhua */public class PositionUtil {public static final String BAIDU_LBS_TYPE = "bd09ll";public static double pi = 3.1415926535897932384626;public static double a = 6378245.0;public static double ee = 0.00669342162296594323;/** * 84 to 火星坐标系 (GCJ-02) World Geodetic System ==> Mars Geodetic System *  * @param lat * @param lon * @return */public static Gps gps84_To_Gcj02(double lat, double lon) {if (outOfChina(lat, lon)) {return null;}double dLat = transformLat(lon - 105.0, lat - 35.0);double dLon = transformLon(lon - 105.0, lat - 35.0);double radLat = lat / 180.0 * pi;double magic = Math.sin(radLat);magic = 1 - ee * magic * magic;double sqrtMagic = Math.sqrt(magic);dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * pi);dLon = (dLon * 180.0) / (a / sqrtMagic * Math.cos(radLat) * pi);double mgLat = lat + dLat;double mgLon = lon + dLon;return new Gps(mgLat, mgLon);}/** * * 火星坐标系 (GCJ-02) to 84 * * @param lon * @param lat * @return * */public static Gps gcj_To_Gps84(double lat, double lon) {Gps gps = transform(lat, lon);double lontitude = lon * 2 - gps.getWgLon();double latitude = lat * 2 - gps.getWgLat();return new Gps(latitude, lontitude);}/** * 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换算法 将 GCJ-02 坐标转换成 BD-09 坐标 *  * @param gg_lat * @param gg_lon */public static Gps gcj02_To_Bd09(double gg_lat, double gg_lon) {double x = gg_lon, y = gg_lat;double z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * pi);double theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * pi);double bd_lon = z * Math.cos(theta) + 0.0065;double bd_lat = z * Math.sin(theta) + 0.006;return new Gps(bd_lat, bd_lon);}/** * * 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换算法 * * 将 BD-09 坐标转换成GCJ-02 坐标 * * @param * bd_lat * @param bd_lon * @return */public static Gps bd09_To_Gcj02(double bd_lat, double bd_lon) {double x = bd_lon - 0.0065, y = bd_lat - 0.006;double z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * pi);double theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * pi);double gg_lon = z * Math.cos(theta);double gg_lat = z * Math.sin(theta);return new Gps(gg_lat, gg_lon);}/** * (BD-09)-->84 * @param bd_lat * @param bd_lon * @return */public static Gps bd09_To_Gps84(double bd_lat, double bd_lon) {Gps gcj02 = PositionUtil.bd09_To_Gcj02(bd_lat, bd_lon);Gps map84 = PositionUtil.gcj_To_Gps84(gcj02.getWgLat(),gcj02.getWgLon());return map84;}public static boolean outOfChina(double lat, double lon) {if (lon < 72.004 || lon > 137.8347)return true;if (lat < 0.8293 || lat > 55.8271)return true;return false;}public static Gps transform(double lat, double lon) {if (outOfChina(lat, lon)) {return new Gps(lat, lon);}double dLat = transformLat(lon - 105.0, lat - 35.0);double dLon = transformLon(lon - 105.0, lat - 35.0);double radLat = lat / 180.0 * pi;double magic = Math.sin(radLat);magic = 1 - ee * magic * magic;double sqrtMagic = Math.sqrt(magic);dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * pi);dLon = (dLon * 180.0) / (a / sqrtMagic * Math.cos(radLat) * pi);double mgLat = lat + dLat;double mgLon = lon + dLon;return new Gps(mgLat, mgLon);}public static double transformLat(double x, double y) {double ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y+ 0.2 * Math.sqrt(Math.abs(x));ret += (20.0 * Math.sin(6.0 * x * pi) + 20.0 * Math.sin(2.0 * x * pi)) * 2.0 / 3.0;ret += (20.0 * Math.sin(y * pi) + 40.0 * Math.sin(y / 3.0 * pi)) * 2.0 / 3.0;ret += (160.0 * Math.sin(y / 12.0 * pi) + 320 * Math.sin(y * pi / 30.0)) * 2.0 / 3.0;return ret;}public static double transformLon(double x, double y) {double ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1* Math.sqrt(Math.abs(x));ret += (20.0 * Math.sin(6.0 * x * pi) + 20.0 * Math.sin(2.0 * x * pi)) * 2.0 / 3.0;ret += (20.0 * Math.sin(x * pi) + 40.0 * Math.sin(x / 3.0 * pi)) * 2.0 / 3.0;ret += (150.0 * Math.sin(x / 12.0 * pi) + 300.0 * Math.sin(x / 30.0* pi)) * 2.0 / 3.0;return ret;}public static void main(String[] args) {// 北斗芯片获取的经纬度为WGS84地理坐标 31.426896,119.496145Gps gps = new Gps(22.77479,113.73519);System.out.println("gps :" + gps);Gps gcj = gps84_To_Gcj02(gps.getWgLat(), gps.getWgLon());System.out.println("gcj :" + gcj);Gps star = gcj_To_Gps84(gcj.getWgLat(), gcj.getWgLon());System.out.println("star:" + star);Gps bd = gcj02_To_Bd09(gcj.getWgLat(), gcj.getWgLon());System.out.println("bd  :" + bd);Gps gcj2 = bd09_To_Gcj02(bd.getWgLat(), bd.getWgLon());System.out.println("gcj :" + gcj2);}}

我这里先用google的地图 有空再加百度的!其实百度的地图定位不是很好! getlocationMSG类
package xyz.ibenben.parttime.common.util;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.net.MalformedURLException;import java.net.URL;import java.net.URLConnection;import java.util.ArrayList;import java.util.List;import com.alibaba.fastjson.JSONArray;import com.alibaba.fastjson.JSONObject;/** * google地图得地址详情 * @author admin * */public class GetLocationMsg {public final static void main(String[] args) { /*//String jsonStr = GetLocationMs(22.329157, 114.203258);JSONObject jsonObj = JSONArray.parseObject(jsonStr);JSONArray jsonArray = (JSONArray) jsonObj.get("results");System.out.println(jsonArray);List list = new ArrayList();// 用list保存全部数据for (int i = 0; i < jsonArray.size(); i++) {Userdetails user = (Userdetails) JSONObject.toJavaObject(jsonArray.getJSONObject(i), Userdetails.class);// System.out.println(user.toString());list.add(user.getFormatted_address());}System.out.println(list);*/}public static String GetLocationMs(double d, double f) {String message = "";String url = String.format("http://ditu.google.cn/maps/api/geocode/json?latlng=%s,%s&language=CN",d, f);URL myURL = null;URLConnection httpsConn = null;try {myURL = new URL(url);} catch (MalformedURLException e) {e.printStackTrace();}try {httpsConn = (URLConnection) myURL.openConnection();if (httpsConn != null) {InputStreamReader insr = new InputStreamReader(httpsConn.getInputStream(), "UTF-8");BufferedReader br = new BufferedReader(insr);String data = null;while ((data = br.readLine()) != null) {message = message + data;}insr.close();}} catch (IOException e) {e.printStackTrace();}return message;}}

这个是解析的类
/** * json 类 * @author Administrator * */public class Userdetails {private String place_id;private String formatted_address;private String long_name;private String short_name;private String types;private String geometry;@Overridepublic String toString() {return "User{" + "formatted_address='" + formatted_address + '\'' + "" + ",geometry='" + geometry + '\''+ ",types='" + types + '\'' + '}';}public String getLong_name() {return long_name;}public void setLong_name(String long_name) {this.long_name = long_name;}public String getFormatted_address() {return formatted_address;}public void setFormatted_address(String formatted_address) {this.formatted_address = formatted_address;}public String getShort_name() {return short_name;}public void setShort_name(String short_name) {this.short_name = short_name;}public String getPlace_id() {return place_id;}public void setPlace_id(String place_id) {this.place_id = place_id;}public String getTypes() {return types;}public void setTypes(String types) {this.types = types;}public String getGeometry() {return geometry;}public void setGeometry(String geometry) {this.geometry = geometry;}}

经纬度类
/*** 经纬度类* * @author Administrator**/public class Gps {private double wgLat;private double wgLon;public Gps(double wgLat, double wgLon) {setWgLat(wgLat);setWgLon(wgLon);}public double getWgLat() {return wgLat;}public void setWgLat(double wgLat) {this.wgLat = wgLat;}public double getWgLon() {return wgLon;}public void setWgLon(double wgLon) {this.wgLon = wgLon;}@Overridepublic String toString() {return wgLat + "," + wgLon;}}




到这一步我们就看也在页面得到用户的地址信息了


0 0