Java实现根据地理位置获取经纬度

根据数据库中的地理位置信息,批量生成坐标信息,并插入新的表中。

import com.alibaba.fastjson.JSONObject;
import com.github.pagehelper.PageInfo;
import org.apache.ibatis.annotations.Param;
import org.omg.CORBA.Request;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.web.bind.annotation.*;

import java.io.IOException;
import java.net.*;
import java.text.DecimalFormat;
import java.util.*;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.List;
    @GetMapping("/tabmapperdictMapper")
    public  void tabmapperdictMapper() throws IOException {

        //获取地理信息表数据
        List<tab_farm> tab_farms = tabmapper.selectPigGmcDataAll();
        //获取地理坐标表的数据(初始为空)
        List<String>  Coordtransid=tabmapper.selectTabFarmCoordtransid();

        //遍历地理信息表数据
        for (int i = 0; i < tab_farms.size(); i++) {
            tab_farm s =tab_farms.get(i);
            int transid=s.getTransid();
            String licnum=s.getLicnum();
            String unitaddr=s.getUnitaddr();

            String Strtransid= Integer.toString(transid);


           //判断数据库是否存在此条数据
            if (exist(Coordtransid, Strtransid)) {
               // System.out.println("数据库存在此条数据:"+Strtransid);
            } else {
                System.out.println("数据库存不在此条数据:"+Strtransid);
                String coordinate = getCoordinate(unitaddr);
                String[] result = coordinate.split(",");
                if (result != null && !"".equals(result)) {
                    String Slng=result[0];
                    String Slat=result[1];
                    double lng=Double.parseDouble(Slng);
                    double lat=Double.parseDouble(Slat);

                    if(lng == 0){
                        System.out.println("配额超标×××××××××××××××××××××××××××××运行结束");
                        return;
                    }else if(lng == 1){
                        System.out.println("未找到地理位置信息*******************插入继续");
                        tabmapper.insertTab_farmCoord(transid,licnum,unitaddr,lng,lat);
                    }else{
                        System.out.println("成功插入地理位置信息√√√√√√√√√√√√√√√√√√√√√√√√√√√插入继续");
                        tabmapper.insertTab_farmCoord(transid,licnum,unitaddr,lng,lat);
                    }

                }
            }

        }

    };

 获取对应地址的坐标

    public static String getCoordinate(String Stringunitaddr) {

        System.out.println("要查询的地名:"+Stringunitaddr);

        //去掉中文地址中的空白字符
        String unitaddr=Stringunitaddr.replaceAll("\\s*", "");


       String url = "http://api.map.baidu.com/geocoder/v2/?output=json&ak=xxxxxx&address=" + unitaddr;
       //String url = "http://api.map.baidu.com/geocoder/v2/?output=json&ak=xxxxxx&address=" + unitaddr;

        String json = loadJSON(url);
        System.out.println("开始执行百度接口:"+url);
        System.out.println("百度返回的json:"+json);
        if (json != null && !"".equals(json)) {
            //先把String对象转换成json对象
            JSONObject obj= JSONObject.parseObject(json);
            if ("0".equals(obj .getString("status"))) {
                //查询成功情况
                System.out.println("成功返回的信息:"+obj);
                double lng = obj .getJSONObject("result").getJSONObject("location").getDouble("lng"); // 经度
                double lat = obj .getJSONObject("result").getJSONObject("location").getDouble("lat"); // 纬度
                DecimalFormat df = new DecimalFormat("#.######");
                System.out.println(df.format(lng) + "," + df.format(lat));

                return df.format(lng)+","+df.format(lat);

            }else {
                //查询失败情况
                if ("1".equals(obj .getString("status"))) {
                    //未找到地理位置信息
                    System.out.println("未找到地理位置返回的信息:"+obj);
                    return '1'+","+'1';
                }else if("302".equals(obj .getString("status"))){
                    System.out.println("配额超限返回的信息:"+obj);
                    //每天配额超标的情况
                    return '0'+","+'0';
                }
            }
        }

        return '1'+","+'1';
    }

 根据百度地图api路径,返回相关参数

    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(), "UTF-8"));
            String inputLine = null;
            while ((inputLine = in.readLine()) != null) {
                json.append(inputLine);
            }
            in.close();
        } catch (MalformedURLException e) {} catch (IOException e) {}
        return json.toString();
    }

判断id是否存在

    public static boolean exist(List<String> arr, String key) {

        for (int z = 0; z < arr.size();z++) {
            String qqq =arr.get(z);
            String www =key;
            if ( qqq.equals(www)) {
                return true;
            }
        }
        return false;

    }

下面是一些demo  

http://api.map.baidu.com/geocoder/v2/?output=json&ak=xxxxxxxxxxxxx&address=找不到地理位置信息情况

{"status":1,"msg":"Internal Service Error:无相关结果","results":[]}

http://api.map.baidu.com/geocoder/v2/?output=json&ak=xxxxxxxxxxxxx&address=成功返回位置信息情况

{"status":0,"result":{"location":{"lng":119.39791832517085,"lat":30.112109268949444},"precise":1,"confidence":75,"comprehension":100,"level":"宾馆"}}

http://api.map.baidu.com/geocoder/v2/?output=json&ak=xxxxxxxxxxxxx&address=配额超标情况

{"status":302,"message":"天配额超限,限制访问"}

 

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 撸撸猫 设计师:设计师小姐姐 返回首页