根据地址获取经纬度

有时候在开发中我们会需要根据模糊地址获取经纬度,国家信息中心的天地图api可以帮助我们实现这个功能,通过模糊地址获取经纬度直接上代码:

/**
     * 通过地址获取经纬度
     *
     * @param address
     * @return
     */
    public static Map<String, String> getLngAndLag(String address) {
        Map<String, String> lngLat = new HashMap<>();
        String url = " http://api.tianditu.gov.cn/geocoder?ds={'keyWord':'" + address + "'}&tk=您的密钥";
        String json = loadJSON(url);
        JSONObject jsonObject = JSONObject.fromObject(json);
        String status = getJsonValue("status", jsonObject);
        String backMsg = getJsonValue("msg", jsonObject);
        if ("0".equals(status) && "ok".equalsIgnoreCase(backMsg)) {
            if (StringUtils.isEmpty(getJsonValue("resultType", jsonObject))) {
                DecimalFormat dFormat = new DecimalFormat("#.00");
                String lon = dFormat.format(Double.valueOf(jsonObject.getJSONObject("location").getString("lon")));
                String lat = dFormat.format(Double.valueOf(jsonObject.getJSONObject("location").getString("lat")));
                lngLat.put("lng", lon);
                lngLat.put("lat", lat);
            }
            if (StringUtils.isNotEmpty(getJsonValue("resultType", jsonObject))) {
                DecimalFormat dFormat = new DecimalFormat("#.00");
                String admin = jsonObject.getString("admin");
                String s = admin.replaceAll("\\[", "").replaceAll("]", "");
                JSONObject JsonMiddle = JSONObject.fromObject(s);
                String lon = dFormat.format(Double.valueOf(JsonMiddle.getJSONObject("location").getString("lon")));
                String lat = dFormat.format(Double.valueOf(JsonMiddle.getJSONObject("location").getString("lat")));
                lngLat.put("lng", lon);
                lngLat.put("lat", lat);
            }
        }

        if ("101".equals(status) || "404".equals(status)) {

            lngLat = null;
        }
        return lngLat;
    }

网页转换为json字符串代码:

/**
     * 请求网页消息转换为Json字符串
     *
     * @param url
     * @return
     */
    public static String loadJSON(String url) {

        StringBuffer json = new StringBuffer();
        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();
    }

剔除json key为空的情况:

    //剔除json key为空的情况
    public static String getJsonValue(String jsonKey, JSONObject jsonObject) {
        String condition = "";
        if (jsonObject.containsKey(jsonKey)) {
            condition = String.valueOf(jsonObject.get(jsonKey));
        }
        return condition;
    }

根据经纬度获取省市县代码:

    public static Map<String, String> getArea(String lng, String lat) {
        Map<String, String> area = new HashMap<>();
        String url = "http://api.tianditu.gov.cn/geocoder?postStr={'lon':" + lng + ",'lat':" + lat + ",'ver':1}&type=geocode&tk=您的key";
        String json = loadJSON(url);
        JSONObject jsonObject = JSONObject.fromObject(json);
        String status = getJsonValue("status", jsonObject);
        String backMsg = getJsonValue("msg", jsonObject);
        Map<String, String> lngLat = new HashMap<>();

        if ("0".equals(status) && "ok".equalsIgnoreCase(backMsg)) {
            String address = jsonObject.getJSONObject("result").getJSONObject("addressComponent").getString("city");
            area = addressResolution(address);
            area.put("lng", lng);
            area.put("lat", lat);
        }

        if ("101".equals(status) || "404".equals(status)) {

            area = null;
        }
        return area;
    }

解析地址代码:

/**
     * 解析地址
     *
     * @param address
     * @return
     */
    public static Map<String, String> addressResolution(String address) {

        String[] cityName = {"上海", "北京", "天津", "重庆"};

        String[] cityArr = address.split("市", -1);

        if (ArrayUtils.contains(cityName, cityArr[0])) {
            address = cityArr[0] + "市市辖区" + cityArr[1];
        }

        String regex = "(?<province>[^省]+自治区|.*?省|.*?行政区|.*?市)(?<city>[^市]+自治州|.*?地区|.*?行政单位|.+盟|市辖区|.*?市|.*?县)(?<county>[^县]+县|.+区|.+市|.+旗|.+海域|.+岛)?(?<town>[^区]+区|.+镇)?(?<village>.*)";
        Matcher m = Pattern.compile(regex).matcher(address);
        String province = null, city = null, county = null, town = null, village = null;
        Map<String, String> row = null;
        while (m.find()) {
            row = new LinkedHashMap<String, String>();
            province = m.group("province").replaceAll("省|市|自治区|壮族|维吾尔|回族", "");
            row.put("province", province == null ? "" : province.trim());
            city = m.group("city").replaceAll("市|自治州|地区|自治市", "");
            row.put("city", city == null ? "" : city.trim());
            county = m.group("county");
            row.put("county", county == null ? "" : county.trim());
            town = m.group("town");
            row.put("town", town == null ? "" : town.trim());
            village = m.group("village");
            row.put("village", village == null ? "" : village.trim());
        }
        return row;
    }

 

### 地址经纬度API接口 对于根据地址获取经纬度的需求,存在多种地图服务提供商可以满足这一需求。百度地图提供了地理编码服务,通过向特定URL发送请求并附带待查询的地址参数,能够返回该地址对应的经纬度信息[^1]。 #### 百度地图API示例 要使用百度地图API来实现地址经纬度转换功能,可以通过GET方法访问如下所示的RESTful API: ```plaintext https://api.map.baidu.com/geocoding/v3/?address={具体地址}&output=json&ak={您的应用密钥} ``` 其中`{具体地址}`替换为目标地理位置描述,而`{您的应用密钥}`则需替换成开发者申请得到的应用程序接口密钥(AK)。此接口支持JSON和XML两种数据格式作为输出选项,在上述例子中选择了更常用的JSON格式。 另外,高德开放平台也提供相似的服务,并且其官方文档详细介绍了如何调用地理位置解析接口完成从结构化地址到坐标点之间的相互转化过程[^2]。 #### 高德地图API示例 以下是采用PHP语言编写的一个简单实例,用于演示怎样借助于高德Web Service API执行逆地理编码操作从而获得指定地点的确切经度纬度值: ```php <?php $address = urlencode("北京市朝阳区阜通东大街6号"); $key = "您自己的key"; $url = "https://restapi.amap.com/v3/geocode/geo?address=$address&key=$key"; $response = file_get_contents($url); $data = json_decode($response, true); if ($data['status'] == '1' && $data['info'] == 'OK') { echo "Location: " . $data['geocodes'][0]['location']; } else { echo "Error occurred."; } ?> ``` 腾讯地图同样具备此类能力,只需在HTML页面内的`<head>`部分加入相应的JavaScript SDK加载语句即可快速上手开发基于浏览器端的地图应用程序[^3]。 以上三种方案均能有效地帮助开发者实现在互联网环境中依据自然语言表述的位置名称检索出精确的空间定位信息的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值