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());
}
这样就可以得到了经纬度