A. android 鎬庝箞鎵歸噺璋冪敤鐧懼害鍦板浘鐨勫湴鐞嗙紪鐮佸姛鑳
濡備綍鎵歸噺璋冪敤鐧懼害鍦板浘鐨勫湴鐞嗙紪鐮佸姛鑳斤紝浠ヤ笅鏄鍏蜂綋姝ラわ細1.鎵撳紑鐧懼害鍦板浘寮鏀懼鉤鍙幫紝娉ㄥ唽璐﹀彿錛屽苟鍒涘緩搴旂敤銆2.鍦ㄥ壋寤虹殑搴旂敤涓錛屽紑鍚鍦扮悊緙栫爜API鐨勬潈闄愩3.鍦ㄨ嚜宸辯殑Android宸ョ▼涓錛屽紩鍏ョ櫨搴﹀湴鍥維DK銆4.鍦ㄤ唬鐮佷腑榪涜岃皟鐢ㄥ湴鐞嗙紪鐮丄PI鐨勬搷浣滐紝鍙浠ヤ嬌鐢℉ttpURLConnection鎴栬匟ttpClient鍙戦丠TTP璇鋒眰銆傝鋒眰鐨刄RL濡備笅鎵紺猴細http://api.map..com/geocoder/v2/?address=鍦板潃u0026output=jsonu0026ak=浣犵殑AK鍏朵腑錛宎ddress涓鴻佽繘琛屽湴鐞嗙紪鐮佺殑鍦板潃錛沷utput涓鴻繑鍥炴牸寮忥紙json鎴杧ml錛夛紱ak涓轟綘鍒涘緩搴旂敤鏃剁敓鎴愮殑AK銆傚湪榪欎釜URL涓錛宎ddress鍙浠ユ槸鍗曚釜鍦板潃錛屼篃鍙浠ユ槸澶氫釜鍦板潃鐢ㄥ垎鍙烽殧寮鐨勭粍鍚堛備緥濡傦細http://api.map..com/geocoder/v2/?address=鍖椾含甯;涓婃搗甯俓u0026output=jsonu0026ak=浣犵殑AK榪欐牱灝卞彲浠ュ悓鏃跺瑰寳浜甯傚拰涓婃搗甯傝繘琛屽湴鐞嗙紪鐮佷簡銆5.灝嗚幏鍙栧埌鐨勭粨鏋滆繘琛岃В鏋愶紝鍙浠ヤ嬌鐢℅son鎴栬匜astJson絳夌涓夋柟JSON搴撹繘琛岃В鏋愩傞氳繃浠ヤ笂鐨勬ラわ紝灝卞彲浠ユ壒閲忚皟鐢ㄧ櫨搴﹀湴鍥劇殑鍦扮悊緙栫爜鍔熻兘浜嗐B. android 輸入一個地址 轉成經緯度 為什麼第二次就不進ongetaddrresult
如果打算寫一些LBS方面的的應用,可能用到地址與經緯度的互相轉換。android.location.Geocoder類提供了此功能。實際上,Geocoder既提供了前向轉換,也提供了後向轉換——它可以獲取地址並返回經緯度,也可以將經緯度對轉換為一組地址。
可以通過各種方式來描述位置。例如,getFromLocationName() 方法可以獲得地方的名稱、物理地址和機場編號,或者該位置的流行名稱。這些方法提供了一個地址列表(List<Address>),而不是一個地址。因為這些方法返回多個結果,官方建議最好提供1~5的maxResults 值來限制結果集,下面我們來看一個查詢地址的例子,和上次一樣我們得自己定義一個類繼承MapActivity。
我們可以試著寫一個輸入地名返回經緯度的程序。
在XML中定義一個輸入框,一個按鈕,一個MapView.
用戶輸入一個地名點擊按鈕,返回經緯度。
這是按鈕的OnCliclk方法,其他省略。
public void onClick(View v) {
try {
EditText loc = (EditText) findViewById(R.id.location);
String locationName = loc.getText().toString();
List<Address> addressList = geocoder.getFromLocationName(
locationName, 5);
if (addressList != null && addressList.size() > 0) {
int lat = (int) (addressList.get(0).getLatitude() * 1E6);
int lng = (int) (addressList.get(0).getLongitude() * 1E6);
GeoPoint pt = new GeoPoint(lat, lng);
mapView.getController().setZoom(15);
mapView.getController().setCenter(pt);
}
} catch (Exception e) {
e.printStackTrace();
}
}
這樣寫感覺是沒什麼錯,實際測試時發現,如果輸入「tian an men」就可以返回經緯度,但輸入「天安門」就會拋異常,說服務不可以用什麼的,網上也有遇到這問題的人,eoe上邊也有,但都不了了之了。國外也有輸入英文拋異常的,http://code.google.com/p/android/issues/detail?id=8816,
在21樓發現了新的方法,完全放棄了getFromLocationName方法,用的是The Google Geocoding API
這個API整合可以代替先前的方法,輸入地名返回JSON或者XML格式的文件,包含一對地址信息。
XML為http://maps.googleapis.com/maps/api/geocode/xml?address=北京交通大學&sensor=false
JSON為http://maps.googleapis.com/maps/api/geocode/json?address=北京交通大學&sensor=false
現在需要自己寫一個靜態方法去解析XML或者JSON,以JSON為例:
public class MapUtility {
public static JSONObject getLocationInfo(String address) {
HttpGet httpGet = new HttpGet("http://maps.google."
+ "com/maps/api/geocode/json?address=" + address
+ "&sensor=false");
HttpClient client = new DefaultHttpClient();
HttpResponse response;
StringBuilder stringBuilder = new StringBuilder();
try {
response = client.execute(httpGet);
HttpEntity entity = response.getEntity();
InputStream stream = entity.getContent();
int b;
while ((b = stream.read()) != -1) {
stringBuilder.append((char) b);
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
JSONObject jsonObject = new JSONObject();
try {
jsonObject = new JSONObject(stringBuilder.toString());
} catch (JSONException e) {
e.printStackTrace();
}
return jsonObject;
}
// converts JSONObject into a GeoPoint.
public static GeoPoint getGeoPoint(JSONObject jsonObject) {
Double lon = new Double(0);
Double lat = new Double(0);
try {
lon = ((JSONArray) jsonObject.get("results")).getJSONObject(0)
.getJSONObject("geometry").getJSONObject("location")
.getDouble("lng");
lat = ((JSONArray) jsonObject.get("results")).getJSONObject(0)
.getJSONObject("geometry").getJSONObject("location")
.getDouble("lat");
} catch (JSONException e) {
e.printStackTrace();
}
return new GeoPoint((int) (lat * 1E6), (int) (lon * 1E6));
}
}
第一個方法根據地址取得JSON,第二個方法從JSON提取坐標。
最後程序效果如下:
Android地址與經緯度轉換
最後,應該考慮在不同於UI線程的線程中執行地理編碼操作。很明顯:這項操作很耗時,而且你一定不希望UI在進行地理編碼時停頓,如果停頓會阻塞整個用戶界面。當在執行一些耗時的操作的時候,不能及時地分發 事件,包括用戶界面重繪事件。從用戶的角度來看,應用程序看上去像掛掉了。更糟糕的是,如果阻塞應用程序的時間過長,Android會向用戶提示 一些信息,即打開一個「應用程序沒有相應(application not responding)」 的對話框。
C. Android涓閫氳繃Geocoder瀵硅薄鏉ュ疄鐜癓ocation瀹氫綅鐨勯棶棰
鏃犳硶鎺ュ彈鍦扮悊淇℃伅 浣犵湅絎涓鍙ヨ瘽 鏃犳硶鍝嶅簲server 鍗硆esponse鏃犳硶鑾峰緱
D. 百度地圖android中怎麼通過地址獲取經緯度
在網路地圖開發的時候,我們經常會通過地址去得到當前地址的經緯度,方法如下:
方法一、
public GeoPoint getGeoPointBystr(String str) {
GeoPoint gpGeoPoint = null;
if (str!=null) {
Geocoder gc = new Geocoder(MyMapActivity.this,Locale.CHINA);
List<Address> addressList = null;
try {
addressList = gc.getFromLocationName(str, 1);
if (!addressList.isEmpty()) {
Address address_temp = addressList.get(0);
//計算經緯度
double Latitude=address_temp.getLatitude()*1E6;
double Longitude=address_temp.getLongitude()*1E6;
System.out.println("經度:"+Latitude);
System.out.println("緯度:"+Longitude);
//生產GeoPoint
gpGeoPoint = new GeoPoint((int)Latitude, (int)Longitude);
}
} catch (IOException e) {
e.printStackTrace();
}
}
return gpGeoPoint;
}
此方法只需傳入一個地址即可(當然,這里應該說是一個合法的地址)
此方法得到一個GeoPoint對象,通過GeoPoint對象.getLatitude()/getLongitude()就可以得到對應的經緯度
但是值得注意的是,以上方法存在API版本問題,2.2版本的不可以用
方法二、(個人比較推薦這種方法)
mkSearch.geocode("詳細地址", "城市");
這里的詳細地址可以通過MKSuggestionInfo對象.key得到,而城市也可以根據MKSuggestionInfo對象.city得到
調用以上方法後,就會在執行實現MKSearchListener介面類中的以下方法
public void onGetAddrResult(MKAddrInfo info, int error) {
// TODO Auto-generated method stub
System.out.println("經緯度:"+info.geoPt.getLatitudeE6()+" "+info.geoPt.getLongitudeE6());
}
這樣就可以得到了經緯度