因爲個人應用在獲取到經緯度後在Android8.0不能使用以下代碼獲取位置信息。只好使用百度地圖 WEB服務API 經過調接口的方式獲取位置信息。php
Geocoder geocoder = new Geocoder(context, Locale.getDefault()); List<Address> addresses = geocoder.getFromLocation(latitude, longitude, 1);
首先須要有百度開發者帳戶,以便獲取key/ak,這個很簡單略過。請求地址:git
String url = String.format( "http://api.map.baidu.com/geocoder/v2/?ak=qmalblOI3MvyturtOgNw0pvp********" + "&location=%s,%s&output=json&pois=1&coordtype=wgs84ll" + "&mcode=E2:AE:A4:FA:64:56:E4:B8:08:25:70:6A:E5:55:B8:E2:BD:**:**:**;com.myapp", latitude, longitude);
其中ak爲用戶申請註冊的key。mcode爲安全碼,在百度開發者平臺的「個人應用」進入建立的應用便可看到安全碼。coordtype爲參數中經緯度座標類型,默認爲百度的座標類型。web
官方文檔 請仔細查看官方文檔json
參數名 | 參數含義 | 類型 | 舉例 | 默認值 | 是否必須 |
---|---|---|---|---|---|
location | 根據經緯度座標獲取地址。 | float | 38.76623,116.43213 lat<緯度>,lng<經度>後端 |
無 | 是 |
coordtype | 座標的類型,目前支持的座標類型包括:bd09ll(百度經緯度座標)、bd09mc(百度米制座標)、gcj02ll(國測局經緯度座標,僅限中國)、wgs84ll( GPS經緯度) 座標系說明 | string | bd09ll、gcj02ll | bd09ll | 否 |
_coordtype | 可選參數,添加後返回國測局經緯度座標或百度米制座標 座標系說明 | string | gcj02ll(國測局座標,僅限中國)、bd09mc(百度墨卡託座標) | bd09ll(百度經緯度座標) | 否 |
pois | 是否召回傳入座標周邊的poi,0爲不召回,1爲召回。當值爲1時,默認顯示周邊1000米內的poi。 注意:若需訪問海外POI,需申請「逆地理編碼海外POI」服務權限,請提交工單申請。 |
int | 0 | 0 | 否 |
radius | poi召回半徑,容許設置區間爲0-1000米,超過1000米按1000米召回。 | int | 500 | 1000 | 否 |
ak | 用戶申請註冊的key,自v2開始參數修改成「ak」,以前版本參數爲「key」 申請ak | string | E4805d16520de693a3fe70 | 無 | 是 |
sn | 若用戶所用ak的校驗方式爲sn校驗時該參數必須 sn生成 |
string | 無 | 否 | |
output | 輸出格式爲json或者xml | string | json或xml | xml | 否 |
callback | 將json格式的返回值經過callback函數返回以實現jsonp功能 | string | callback=showLocation(JavaScript函數名) | 無 | 否 |
extensions_poi | 區別於pois參數,pois=0,不召回pois數據,但後端仍訪問poi相應服務;extensions_poi=null時,後端不調用poi相關服務,可減小服務訪問時延。 注意:若需訪問海外POI,需申請「逆地理編碼海外POI」服務權限,請提交工單申請。 |
string | null | 無 | 否 |
extensions_road | 當取值爲true時,召回座標周圍最近的3條道路數據。區別於行政區劃中的street參數(street參數爲行政區劃中的街道,和普通道路不對應)。 | string | false、true | false | 否 |
extensions_town | 當取值爲true時,行政區劃返回鄉鎮級數據(僅國內召回鄉鎮數據)。默認不訪問。 | string | true | 無 | 否 |
language | 指定召回的新政區劃語言類型。 召回行政區劃語言list(全量支持的語言見示例)。 當language=local時,根據請求中座標所對應國家的母語類型,自動選擇對應語言類型的行政區劃召回。 目前支持多語言的行政區劃區劃包含country、provence、city、district 注意:多語言需申請「逆地理編碼海外POI」服務權限,請提交工單申請。 |
string | el gu en vi ca it iw sv eu ar cs gl id es en-GB ru sr nl pt tr tl lv en-AU lt zh-TW th ro fil ta fr bg hr bn de hu fa hi pt-BR fi da ja te pt-PT ml ko kn sk zh-CN pl uk sl mr local |
en,國內默認zh-CN | 否 |
language_auto | 是否自動填充行政區劃。 1填充,0不填充。 填充:當服務按某種語言類別召回時,若某一行政區劃層級數據未覆蓋,則按照「英文→中文→本地語言」類別行政區劃數據對該層級行政區劃進行填充,保證行政區劃數據召回完整性。 注意:多語言需申請「逆地理編碼海外POI」服務權限,請提交工單申請。 |
int | 0、1 | 無 | 否 |
latest_admin | 是否訪問最新版行政區劃數據(僅對中國數據生效),1(訪問),0(不訪問) | int | 0、1 | 0 | 否 |
名稱 | 含義 | 類型 | |
---|---|---|---|
status | 返回結果狀態值, 成功返回0,其餘值請查看下方返回碼狀態表。 | int | |
location | 經緯度座標 | object | |
lat | 緯度值 | float | |
lng | 經度值 | float | |
formatted_address | 結構化地址信息 | string | |
business | 座標所在商圈信息,如 "人民大學,中關村,蘇州街"。最多返回3個。 | string | |
addressComponent (注意,國外行政區劃,字段僅表明層級) |
country | 國家 | string |
province | 省名 | string | |
city | 城市名 | string | |
district | 區縣名 | string | |
town | 鄉鎮名 | string | |
street | 街道名(行政區劃中的街道層級) | string | |
street_number | 街道門牌號 | string | |
adcode | 行政區劃代碼 adcode映射表 |
int | |
country_code | 國家代碼 | int | |
direction | 相對當前座標點的方向,當有門牌號的時候返回數據 | string | |
distance | 相對當前座標點的距離,當有門牌號的時候返回數據 | string | |
pois(周邊poi數組) | addr | 地址信息 | string |
cp | 數據來源(已廢棄) | string | |
direction | 和當前座標點的方向 | string | |
distance | 離座標點距離 | int | |
name | poi名稱 | string | |
poiType | poi類型,如’ 辦公大廈,商務大廈’ | string | |
point | poi座標{x,y} | float | |
tel | 電話 | int | |
uid | poi惟一標識 | string | |
zip | 郵編 | int | |
parent_poi | poi對應的主點poi(如,海底撈的主點爲上地華聯,該字段則爲上地華聯的poi信息。如無,該字段爲空),包含子字段和pois基礎召回字段相同。 | ||
poiRegions | direction_desc | 請求中的座標與所歸屬區域面的相對位置關係 | string |
name | 歸屬區域面名稱 | string | |
tag | 歸屬區域面類型 | string | |
sematic_description | 當前位置結合POI的語義化結果描述。 | string | |
cityCode | 百度定義的城市id(正常更新與維護,但建議使用adcode) | int |
返回碼 | 英文描述 | 定義 | 常見緣由 |
---|---|---|---|
0 | ok | 正常 | 服務請求正常召回 |
1 | 服務器內部錯誤 | ||
2 | Parameter Invalid | 請求參數非法 | 必要參數拼寫錯誤或漏傳(如query和tag請求中均未傳入) |
3 | Verify Failure | 權限校驗失敗 | |
4 | Quota Failure | 配額校驗失敗 | 服務當日調用次數已超限,請前往API控制檯提高(請優先進行開發者認證) |
5 | AK Failure | ak不存在或者非法 | 未傳入ak參數;ak已被刪除(可前往回收站恢復); |
101 | 服務禁用 | ||
102 | 不經過白名單或者安全碼不對 | ||
2xx | 無權限 | ||
3xx | 配額錯誤 |
PS:不一樣座標系之間轉換 http://bbs.lbsyun.baidu.com/forum.php?mod=viewthread&tid=10923&logout=success api
public class CoordinatesTransformation { static double pi = 3.14159265358979324; static double a = 6378245.0; static double ee = 0.00669342162296594323; public final static double x_pi = 3.14159265358979324 * 3000.0 / 180.0; public static double[] wgs2bd(double lat, double lon) { double[] wgs2gcj = wgs2gcj(lat, lon); double[] gcj2bd = gcj2bd(wgs2gcj[0], wgs2gcj[1]); return gcj2bd; } public static double[] gcj2bd(double lat, double lon) { double x = lon, y = lat; double z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * x_pi); double theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * x_pi); double bd_lon = z * Math.cos(theta) + 0.0065; double bd_lat = z * Math.sin(theta) + 0.006; return new double[] { bd_lat, bd_lon }; } public static double[] bd2gcj(double lat, double lon) { double x = lon - 0.0065, y = lat - 0.006; double z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * x_pi); double theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * x_pi); double gg_lon = z * Math.cos(theta); double gg_lat = z * Math.sin(theta); return new double[] { gg_lat, gg_lon }; } public static double[] wgs2gcj(double lat, double 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; double[] loc = { mgLat, mgLon }; return loc; } private static double transformLat(double lat, double lon) { double ret = -100.0 + 2.0 * lat + 3.0 * lon + 0.2 * lon * lon + 0.1 * lat * lon + 0.2 * Math.sqrt(Math.abs(lat)); ret += (20.0 * Math.sin(6.0 * lat * pi) + 20.0 * Math.sin(2.0 * lat * pi)) * 2.0 / 3.0; ret += (20.0 * Math.sin(lon * pi) + 40.0 * Math.sin(lon / 3.0 * pi)) * 2.0 / 3.0; ret += (160.0 * Math.sin(lon / 12.0 * pi) + 320 * Math.sin(lon * pi / 30.0)) * 2.0 / 3.0; return ret; } private static double transformLon(double lat, double lon) { double ret = 300.0 + lat + 2.0 * lon + 0.1 * lat * lat + 0.1 * lat * lon + 0.1 * Math.sqrt(Math.abs(lat)); ret += (20.0 * Math.sin(6.0 * lat * pi) + 20.0 * Math.sin(2.0 * lat * pi)) * 2.0 / 3.0; ret += (20.0 * Math.sin(lat * pi) + 40.0 * Math.sin(lat / 3.0 * pi)) * 2.0 / 3.0; ret += (150.0 * Math.sin(lat / 12.0 * pi) + 300.0 * Math.sin(lat / 30.0 * pi)) * 2.0 / 3.0; return ret; } }