您的位置:首页 > 其它

根据经纬度获取所在城市以及根据地点获取经纬度

2016-08-29 20:03 459 查看
什么是Geocoding?
Geocoding API是一个供程序员调用的、http形式的地图服务接口。主要服务那些非网页程序的调用。例如C#、C++、Java等开发语言都能发送http请求且能接收返回数据。
用户只需在请求的url字串中拼接好关键字或者经纬度信息,即可获取到相应的百度经纬度或者结构化地理信息。
Geocoding API有哪些功能?
Geocoding API包括地址解析和逆地址解析功能。
·        地址解析是指,由详细到街道的结构化地址得到百度经纬度信息,且支持名胜古迹、标志性建筑名称直接解析返回百度经纬度。例如:“北京市海淀区中关村南大街27号”地址解析的结果是“lng:116.31985,lat:39.959836”,“百度大厦”地址解析的结果是“lng:116.30815,lat:40.056885”
·        逆地址解析是指,由百度经纬度信息得到结构化地址信息。例如:“lat:31.325152,lng:120.558957”逆地址解析的结果是“江苏省苏州市虎丘区塔园路318号”。


使用限制
目前无任何使用限制。请申请key,然后使用该接口。
如何使用
第一步,申请key,点击这里获取密钥,申请key需要注册百度账号;
第二步,拼写发送http请求的url,注意需使用第一步申请的key;
第三步,接收http请求返回的数据(支持json和xml格式)。
服务地址

服务地址
·        地址解析:根据地址获取坐标
http://api.map.baidu.com/geocoder?address=地址&output=输出格式类型&key=用户密钥&city=城市名
·        逆地址解析:根据坐标获取地址
http://api.map.baidu.com/geocoder?location=纬度,经度&output=输出格式类型&key=用户密钥
备注:
1. city属于可选参数,通常情况可以不使用,若解析无结果,请尝试增加此字段。
2. 支持名胜古迹、标志性建筑物名称解析返回百度经纬度坐标,如address=“百度大厦”。
3. 支持使用“*路与*路交叉口”方式解析返回百度经纬度坐标,若地址库中存在该地址描述,返回百度经纬度坐标。
4. 若解析status字段为OK,若结果内容为空,原因分析及可尝试方法:
·       地址库里无此数据,本次结果为空。
·       加入city字段重新解析;
·       将过于详细或简单的地址更改至省市区县街道重新解析;
5. 特别提醒:逆地址解析location参数传入的参数格式是(纬度lat,经度lng)。
接口参数
参数
是否必须
默认值
格式举例
含义
output

json
json或xml
输出格式为json或者xml
address


北京市海淀区上地十街10号
根据指定地址进行坐标的反定向解析
location


38.76623,116.43213

lat<纬度>,lng<经度>
根据指定坐标来进行地址的解析
city

“北京市”
“广州市”
地址所在的城市名
key


8cb976834235d8cbcde2dce4835ae191
用户申请注册的key
上表中address和location两个字段如果同时出现,则优先选择address执行地理编码功能。对于address字段可能会出现中文或其它一些特殊字符(如:空格),所以对于类似的字符都要进行编码处理,编码成 UTF-8 字符的二字符十六进制值,凡是不在下表中的字符都要进行编码。
字符集合
字符
URL非保留字
a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9 - _ . ~
URL保留字
! * ' ( ) ; : @ & = + $ , / ? % # [ ]
附注:
(1)javascript中一般采用encodeURIComponent函数对特殊字符进行编码。
(2) Java中可以使用函数URLEncoder.encode对特殊字符进行编码。
(3) C#中可以使用函数HttpUtility.UrlEncode对特殊字符进行编码。
(4) php中可以使用函数urlencode对特殊字符进行编码。
返回数据说明
返回结果(地址解析的结果)

 {status: '字符串状态常量', 取值如下:
 //OK成功
 INVILID_KEY 非法密钥
 INVALID_PARAMETERS 非法参数,参数错误时候给出。
 result: {   
 location: {
 lat:纬度:数值,
 lng:经度:数值
 },
 precise:’位置的附加信息,是否精确查找’(1为精确查找,0为不精确查找),
 confidence: 可信度,
 level:'级别'
 },
 }

返回结果(反地址解析的结果)

 {status: '字符串状态常量', 取值如下:
 //OK 成功
 INVILID_KEY 非法密钥  
 INVALID_PARAMETERS 非法参数,参数错误时候给出。
 result: {   
 location: {
 lat: 纬度:数值,
 lng: 经度:数值
 },
 formatted_address: ‘详细地址描述’,
 business: '周围商圈',
 addressComponent:{
 city:’城市名称’,
 district: ‘区县名称’,
 province:’省份名称’,
 street: ‘街道名称’,
 streetNumber: '门牌号码'
 },
 cityCode: '城市代码'
 }
 }
 

接口示例
根据详细地址获取坐标

http://api.map.baidu.com/geocoder?address=%E4%B8%8A%E5%9C%B0%E5%8D%81%E8%A1%9710%E5%8F%B7&output=json&key=37492c0ee6f924cb5e934fa08c6b1676
//根据“上地十街10号”返回坐标“lng:116.307175,
lat:40.057098”,以json格式输出
http://api.map.baidu.com/geocoder?address=%E4%B8%8A%E5%9C%B0%E5%8D%81%E8%A1%9710%E5%8F%B7&output=xml&key=37492c0ee6f924cb5e934fa08c6b1676
//根据“上地十街十号”返回坐标“lng:116.307175,
lat:40.057098”,以xml格式输出

 
在指定城市内检索详细地址的坐标

http://api.map.baidu.com/geocoder?address=%E4%B8%8A%E5%9C%B0%E5%8D%81%E8%A1%9710%E5%8F%B7&output=json&key=37492c0ee6f924cb5e934fa08c6b1676&city=%E5%8C%97%E4%BA%AC%E5%B8%82
// 在北京市内根据“上地十街10号”返回坐标“lng:116.307175,
lat:40.057098”,以json格式输出
http://api.map.baidu.com/geocoder?address=%E4%B8%8A%E5%9C%B0%E5%8D%81%E8%A1%9710%E5%8F%B7&output=xml&key=37492c0ee6f924cb5e934fa08c6b1676&city=%E5%8C%97%E4%BA%AC%E5%B8%82
// 在北京市内根据“上地十街10号”返回坐标“lng:116.307175,
lat:40.057098”,以json格式输出

 
根据特定建筑物获取它的坐标

http://api.map.baidu.com/geocoder?address=%E7%99%BE%E5%BA%A6%E5%A4%A7%E5%8E%A6&output=json&key=37492c0ee6f924cb5e934fa08c6b1676  //根据“百度大厦”名称返回坐标“lng:116.307175,
lat:40.057098”,以json格式输入

http://api.map.baidu.com/geocoder?address=%E7%99%BE%E5%BA%A6%E5%A4%A7%E5%8E%A6&output=xml&key=37492c0ee6f924cb5e934fa08c6b1676  //根据“百度大厦”名称返回坐标“lng:116.307175,
lat:40.057098”,以xml格式输入

 
根据“*路与*路交叉路口”类型地址描述获得它的坐标

http://api.map.baidu.com/geocoder?address=%E5%8C%97%E4%B8%80%E7%8E%AF%E8%B7%AF%E5%92%8C%E9%98%9C%E9%98%B3%E8%B7%AF%E7%9A%84%E4%BA%A4%E5%8F%89%E8%B7%AF%E5%8F%A3&output=json&key=37492c0ee6f924cb5e934fa08c6b1676
//根据“北一环路和阜阳路的交叉路口”名称返回坐标“lng:117.294364,
lat:31.885558”,以json格式输入
http://api.map.baidu.com/geocoder?address=%E5%8C%97%E4%B8%80%E7%8E%AF%E8%B7%AF%E5%92%8C%E9%98%9C%E9%98%B3%E8%B7%AF%E7%9A%84%E4%BA%A4%E5%8F%89%E8%B7%AF%E5%8F%A3&output=xml&key=37492c0ee6f924cb5e934fa08c6b1676
//根据“北一环路和阜阳路的交叉路口”名称返回坐标“lng:117.294364,
lat:31.885558”,以xml格式输入

 
根据坐标获取它的地址

http://api.map.baidu.com/geocoder?output=json&location=39.983424,%20116.322987&key=37492c0ee6f924cb5e934fa08c6b1676
//解析“lat:39.983424, lng:116.322987”坐标返回“北京市海淀区中关村大街27号1101-08室”,以json格式输出
http://api.map.baidu.com/geocoder?output=xml&location=39.983424,%20116.322987&key=37492c0ee6f924cb5e934fa08c6b1676
//解析“lat:39.983424, lng:116.322987”坐标返回“北京市海淀区中关村大街27号1101-08室”,以xml格式输出



[html] view
plain copy

根据经纬度获取所在城市  

public staticString getCity(Stringlongitude,String latitude) {  

        HttpURLConnectionconnection = null;  

        BufferedReaderreader = null;  

        try {  

            URL getUrl = newURL("http://api.map.baidu.com/geocoder?output=json&location="+latitude+",%20"+longitude+"&key=sO6GQc18t1BZrY1gWbMhgOOa");  

            connection= (HttpURLConnection) getUrl.openConnection();  

            connection.setConnectTimeout(5000);  

            connection.setReadTimeout(5000);  

            connection.connect();  

            reader= newBufferedReader(newInputStreamReader(connection.getInputStream()));  

            StringBuilderbuilder = newStringBuilder();  

            Stringline;  

            while ((line =reader.readLine()) !=null) {  

                builder.append(line);  

            }  

            if (log.isDebugEnabled())  

                log.debug(builder.toString());  

            //net.sf.json.JSONObject jsonObj =net.sf.json.JSONObject.fromObject(builder.toString());  

            net.sf.json.JSONArray newArray =net.sf.json.JSONArray.fromObject("["+builder.toString()+"]");  

            net.sf.json.JSONObjectobj = (net.sf.json.JSONObject)newArray.get(0);  

           //System.out.println("newArray:"+newArray);  

            //System.out.println("obj:"+obj);  

            net.sf.json.JSONObjectresult = (net.sf.json.JSONObject)obj.get("result");  

            net.sf.json.JSONObjectaddressComponent =(net.sf.json.JSONObject)result.get("addressComponent");  

             String city =(String)addressComponent.get("city");  

            return city;  

             

        }catch(Exception e) {  

            e.printStackTrace();  

            log.error(e.getMessage());  

        }finally{  

            try {  

                reader.close();  

            }catch(IOException e) {  

                e.printStackTrace();  

            }finally{  

                connection.disconnect();  

            }  

        }  

        return null;  

    }  

   

   

/**  

     * 根据地点获取经纬度  

     *  

     * @param address:地址   

     * @param city:城市名如: 北京市  

     * @return  

     */  

    //http://api.map.baidu.com/geocoder?address=%E4%B8%8A%E5%9C%B0%E5%8D%81%E8%A1%9710%E5%8F%B7&output=json&key=37492c0ee6f924cb5e934fa08c6b1676&city=%E5%8C%97%E4%BA%AC%E5%B8%82  

    public staticString getLonandLat(String address,String city) {  

        HttpURLConnection connection= null;  

        BufferedReader reader = null;  

        try {  

            //URL getUrl = newURL("http://api.map.baidu.com/geocoder?output=json&location="+latitude+",%20"+longitude+"&key=sO6GQc18t1BZrY1gWbMhgOOa");  

            URL getUrl = newURL("http://api.map.baidu.com/geocoder?address="+address+"&output=json&key=sO6GQc18t1BZrY1gWbMhgOOa&city="+city);  

            connection =(HttpURLConnection) getUrl.openConnection();  

            connection.setConnectTimeout(5000);  

            connection.setReadTimeout(5000);  

            connection.connect();  

            reader = new BufferedReader(newInputStreamReader(connection.getInputStream()));  

            StringBuilder builder = new StringBuilder();  

            String line;  

            while ((line = reader.readLine()) != null) {  

                builder.append(line);  

            }  

            if (log.isDebugEnabled())  

                log.debug(builder.toString());  

            //net.sf.json.JSONObjectjsonObj = net.sf.json.JSONObject.fromObject(builder.toString());  

            net.sf.json.JSONArray  newArray =net.sf.json.JSONArray.fromObject("["+builder.toString()+"]");  

            net.sf.json.JSONObjectobj = (net.sf.json.JSONObject)newArray.get(0);  

            System.out.println("newArray:"+newArray);  

            System.out.println("obj:"+obj);  

            net.sf.json.JSONObjectresult = (net.sf.json.JSONObject)obj.get("result");  

            net.sf.json.JSONObjectlocation = (net.sf.json.JSONObject)result.get("location");  

            Double Lon =(Double)location.get("lng");  

            Double Lat =(Double)location.get("lat");  

            System.out.println("result:"+result);  

            System.out.println("location:"+location);  

            System.out.println("Lon:"+ Lon);  

            System.out.println("Lat:"+Lat);  

            return Lon + "," + Lat;  

             

        }catch(Exception e) {  

            e.printStackTrace();  

            log.error(e.getMessage());  

        }finally{  

            try {  

                reader.close();  

            }catch(IOException e) {  

                e.printStackTrace();  

            }finally{  

                connection.disconnect();  

            }  

        }  

        return null;  

    }  

     

    @Test  

    public static void main(String args[]){  

        /*  

        Stringcity=WeixinUtil.getCity("116.322987","39.983424");  

        System.out.println("city="+city);  

        */  

        //String lonlat=WeixinUtil.getLonandLat("北京市海淀区中关村大街27号1101-08室", "北京市");  

        Stringlonlat=WeixinUtil.getLonandLat("北京市海淀区西土城路10号北京邮电大学学29","北京市");  

        System.out.println("hello lulu lonlat="+lonlat);  

    }  

文章来源:http://blog.csdn.net/lululove19870526/article/details/40741909
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  经纬度