java获取经纬度和地址等工具类

此工具类是, 模拟请求去调用百度地图api,来根据输入的地址获取相关信息、或者根据经纬度确定地址等。

注意看下面代码的注解,注解写的很清楚。

注意:需要申请百度key

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import org.apache.commons.lang.StringUtils;
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.HashMap;
import java.util.List;
import java.util.Map;

    /**
     * @function: 输入地名获取经纬度, 以及详细地址工具类
     * @auther: Create by wyf
     * @date: 2018/5/22
     * @version: v1.0
     */
    public class LngAndLatUtil {

        /**
         * 功能:传入地址,返回字符串经纬度和详细地址和邮政编码
         *
         * @param address
         * @return
         */
        public static String getLngAndLatAndAddress(String address) {

            Map<String, Double> map = getLngAndLat(address);
            String info = "";
            if (map.size() != 0) {
                String addressInfo = getAddress(String.valueOf(map.get("lng")), String.valueOf(map.get("lat")));
                //String psotCode = getPostCode(addressInfo);
                info = map.get("lng") + "," + map.get("lat") + "," + addressInfo;
            }
            return info;
        }

        /**
         * 通过模糊地址获取经纬度
         *
         * @param address
         * @return
         */
        public static Map<String, Double> getLngAndLat(String address) {
            Map<String, Double> map = new HashMap<String, Double>();
            String url = "http://api.map.baidu.com/geocoder/v2/?address=" + address + "&output=json&ak=自己的key";
            String json = loadJSON(url);
            JSONObject obj = null;
            try {
                obj = JSONObject.fromObject(json);
                if (obj.get("status").toString().equals("0")) {
                    double lng = obj.getJSONObject("result").getJSONObject("location").getDouble("lng");
                    double lat = obj.getJSONObject("result").getJSONObject("location").getDouble("lat");
                    map.put("lng", lng);
                    map.put("lat", lat);
                    //System.out.println("经度:" + lng + "---纬度:" + lat);
                } else {

           /* System.out.println("未找到相匹配的经纬度!");
            Integer lng[] = {113, 114, 119, 115};
            Integer lat[] = {34, 38, 26, 28};
            int random = CreateDataUtil.getGaussianRandom(0, 3);
            map.put("lng", lng[random].doubleValue());
            map.put("lat", lat[random].doubleValue());*/
                }
            } catch (Exception e) {
                e.printStackTrace();
                Integer lng[] = {113, 114, 119, 115};
                Integer lat[] = {34, 38, 26, 28};
                int random = CreateDataUtil.getGaussianRandom(0, 3);
                map.put("lng", lng[random].doubleValue());
                map.put("lat", lat[random].doubleValue());
            }

            return map;
        }

        public static String loadJSON(String url) {
            StringBuilder json = new StringBuilder();
            try {
                URL oracle = new URL(url);
                URLConnection yc = oracle.openConnection();
                BufferedReader in = new BufferedReader(new InputStreamReader(
                        yc.getInputStream()));
                String inputLine = null;
                while ((inputLine = in.readLine()) != null) {
                    json.append(inputLine);
                }
                in.close();
            } catch (MalformedURLException e) {
            } catch (IOException e) {
            }
            return json.toString();

        }

        /**
         * 功能:通过经纬度获取地址
         *
         * @param lng
         * @param lat
         * @return
         */
        public static String getAddress(String lng, String lat) {
            String add = getAdd(lng, lat);
            JSONObject jsonObject = JSONObject.fromObject(add);
            JSONArray jsonArray = JSONArray.fromObject(jsonObject.getString("addrList"));
            JSONObject j_2 = JSONObject.fromObject(jsonArray.get(0));
            String allAdd = j_2.getString("admName");
            String address_road = "";
            if (j_2.containsKey("addr")) {
                address_road = j_2.getString("addr");
            }
            String addressInfo = allAdd.replaceAll(",", "") + address_road;
            return addressInfo;
        }

        public static String getAdd(String log, String lat) {
            //lat 小  log  大
            //参数解释: 纬度,经度 type 001 (100代表道路,010代表POI,001代表门址,111可以同时显示前三项)
            String urlString = "http://gc.ditu.aliyun.com/regeocoding?l=" + lat + "," + log + "&type=010";
            String res = "";
            try {
                URL url = new URL(urlString);
                java.net.HttpURLConnection conn = (java.net.HttpURLConnection) url.openConnection();
                conn.setDoOutput(true);
                conn.setRequestMethod("POST");
                java.io.BufferedReader in = new java.io.BufferedReader(new java.io.InputStreamReader(conn.getInputStream(), "UTF-8"));
                String line;
                while ((line = in.readLine()) != null) {
                    res += line + "\n";
                }
                in.close();
            } catch (Exception e) {
                System.out.println("error in wapaction,and e is " + e.getMessage());
            }
            return res;
        }

        /**
         * 通过地名获取邮政编码
         *
         * @param address
         * @return
         */
        public static String getPostCode(String address) {
            String postCode = "";
            String urlString = "http://cpdc.chinapost.com.cn/web/index.php?m=postsearch&c=index&a=ajax_addr&searchkey=" + address;
            String json = loadJSON(urlString);
            JSONObject obj = JSONObject.fromObject(json);

            if ((Integer) obj.get("now_num") > 0) {
                List list = (List) obj.get("rs");
                for (Object result : (List) obj.get("rs")) {
                    JSONObject fromObject = JSONObject.fromObject(result);
                    if (Integer.valueOf(fromObject.get("POSTCODE").toString()) != -1) {
                        postCode = fromObject.get("POSTCODE").toString();
                        break;
                    }
                }
            } else {
                System.out.println("未找到相匹配的邮编地址!");
            }

            if (StringUtils.isEmpty(postCode)) {
                postCode = "000000";
            }
            return postCode;
        }

猜你喜欢

转载自blog.csdn.net/qq_18769269/article/details/81559400
今日推荐