`
chenhaodejia
  • 浏览: 114589 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Android地图开发中的地理编码与地理反编码

阅读更多

地理编码(Geocoding)与地理反编码(Reverse Geocoding)是地图操作中的常见操作,前者表示通过街道地址请求空间坐标,后者表示通过空间坐标请求街道地址。通俗的说,二者就是街道地址与经纬度的转换。举例来说,前者就是输入查询"上海市杨浦区四平路1239号"得到(31.285207060526762, 121.50546412914991),而后者则表示这个反过程。

在实际的移动开发过程中,地图相关的操作对于地理编码与地理反编码的使用都是十分普遍。幸运的是,Android的MapView控件中对于这两者都进行了封装,因此可以方便的利用Google Map Service进行二者查询。下面将对开发过程做一个简单介绍。

首先必须进行MapKey的申请,任何地图的显示都需要申请一个MapKey。具体的申请步骤可见

http://code.google.com/intl/zh-CN/android/maps-api-signup.html

然后可以建立一个基于Google APIs的程序,并且在AndroidManifest.xml中加入地图API的支持。

view plaincopy to clipboardprint?
01.<?xml version="1.0" encoding="utf-8"?> 
02.<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
03.      package="net.learn2develop.GoogleMaps" 
04.      android:versionCode="1" 
05.      android:versionName="1.0.0"> 
06.    <application android:icon="@drawable/icon" android:label="@string/app_name"> 
07.    <uses-library android:name="com.google.android.maps" />    
08.        <activity android:name=".MapsActivity" 
09.                  android:label="@string/app_name"> 
10.            <intent-filter> 
11.                <action android:name="android.intent.action.MAIN" /> 
12.                <category android:name="android.intent.category.LAUNCHER" /> 
13.            </intent-filter> 
14.        </activity> 
15.    </application> 
16.   
17.    <uses-permission android:name="android.permission.INTERNET" /> 
18.</manifest> 
19.</xml> 
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="net.learn2develop.GoogleMaps"
      android:versionCode="1"
      android:versionName="1.0.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
    <uses-library android:name="com.google.android.maps" /> 
        <activity android:name=".MapsActivity"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

    <uses-permission android:name="android.permission.INTERNET" />
</manifest>
</xml>

接着可以在主Layout文件中加入对于地图的显示,这里需要加入刚才申请的MapKey,否则地图将无法正常显示。

view plaincopy to clipboardprint?01.<?xml version="1.0" encoding="utf-8"?>  02.<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    03.    android:layout_width="fill_parent"    04.    android:layout_height="fill_parent">  05.    06.    <com.google.android.maps.MapView    07.        android:id="@+id/mapView"  08.        android:layout_width="fill_parent"  09.        android:layout_height="fill_parent"  10.        android:enabled="true"  11.        android:clickable="true"  12.        android:apiKey="MapKey"  13.        />  14.    15.</RelativeLayout>  <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <com.google.android.maps.MapView
        android:id="@+id/mapView"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:enabled="true"
        android:clickable="true"
        android:apiKey="MapKey"
        />

</RelativeLayout>

接着在主Activity的JAVA文件进行修改,支持地图显示。

view plaincopy to clipboardprint?
01.import com.google.android.maps.MapActivity;  
02.import com.google.android.maps.MapView;  
03.import android.os.Bundle;  
04.   
05.public class MapsActivity extends MapActivity   
06.{      
07.    /** Called when the activity is first created. */ 
08.    @Override 
09.    public void onCreate(Bundle savedInstanceState)  
10.    {  
11.        super.onCreate(savedInstanceState);  
12.        setContentView(R.layout.main);  
13.    MapView mapView = (MapView) findViewById(R.id.mapView);  
14.    mapView.setBuiltInZoomControls(true);  
15.    }  
16.} 
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapView;
import android.os.Bundle;

public class MapsActivity extends MapActivity
{   
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
MapView mapView = (MapView) findViewById(R.id.mapView);
mapView.setBuiltInZoomControls(true);
    }
}

此时运行程序,地图应该就可以正常显示了,见下图。







此时我们再向程序中加入地理编码与地理反编码的功能,其参考代码如下。

地理编码:

view plaincopy to clipboardprint?
01.Geocoder geoCoder = new Geocoder(this, Locale.getDefault());      
02.try {  
03.    List<Address> addresses = geoCoder.getFromLocationName(  
04.        "上海市杨浦区四平路1239号", 5);  
05.    String add = "";  
06.    if (addresses.size() > 0) {  
07.        p = new GeoPoint(  
08.                (int) (addresses.get(0).getLatitude() * 1E6),   
09.                (int) (addresses.get(0).getLongitude() * 1E6));  
10.        mc.animateTo(p);      
11.        mapView.invalidate();  
12.    }      
13.} catch (IOException e) {  
14.    e.printStackTrace();  
15.} 
        Geocoder geoCoder = new Geocoder(this, Locale.getDefault());   
        try {
            List<Address> addresses = geoCoder.getFromLocationName(
                "上海市杨浦区四平路1239号", 5);
            String add = "";
            if (addresses.size() > 0) {
                p = new GeoPoint(
                        (int) (addresses.get(0).getLatitude() * 1E6),
                        (int) (addresses.get(0).getLongitude() * 1E6));
                mc.animateTo(p);   
                mapView.invalidate();
            }   
        } catch (IOException e) {
            e.printStackTrace();
        }

地理反编码,其中MapOverlay为地图图层上的叠加图层,用于标识的显示以及点击事件的捕捉。


view plaincopy to clipboardprint?
01.class MapOverlay extends com.google.android.maps.Overlay  
02.    {  
03.        @Override 
04.        public boolean draw(Canvas canvas, MapView mapView,   
05.        boolean shadow, long when)   
06.        {  
07.          //...  
08.        }  
09.   
10.        @Override 
11.        public boolean onTouchEvent(MotionEvent event, MapView mapView)   
12.        {     
13.            //---when user lifts his finger---  
14.            if (event.getAction() == 1) {                  
15.                GeoPoint p = mapView.getProjection().fromPixels(  
16.                    (int) event.getX(),  
17.                    (int) event.getY());  
18.   
19.                Geocoder geoCoder = new Geocoder(  
20.                    getBaseContext(), Locale.getDefault());  
21.                try {  
22.                    List<Address> addresses = geoCoder.getFromLocation(  
23.                        p.getLatitudeE6()  / 1E6,   
24.                        p.getLongitudeE6() / 1E6, 1);  
25.   
26.                    String add = "";  
27.                    if (addresses.size() > 0)   
28.                    {  
29.                        for (int i=0; i<addresses.get(0).getMaxAddressLineIndex();   
30.                             i++)  
31.                           add += addresses.get(0).getAddressLine(i) + "\n";  
32.                    }  
33.   
34.                    Toast.makeText(getBaseContext(), add, Toast.LENGTH_SHORT).show();  
35.                }  
36.                catch (IOException e) {                  
37.                    e.printStackTrace();  
38.                }     
39.                return true;  
40.            }  
41.            else                  
42.                return false;  
43.        }          
44.    } 
class MapOverlay extends com.google.android.maps.Overlay
    {
        @Override
        public boolean draw(Canvas canvas, MapView mapView,
        boolean shadow, long when)
        {
          //...
        }

        @Override
        public boolean onTouchEvent(MotionEvent event, MapView mapView)
        {  
            //---when user lifts his finger---
            if (event.getAction() == 1) {               
                GeoPoint p = mapView.getProjection().fromPixels(
                    (int) event.getX(),
                    (int) event.getY());

                Geocoder geoCoder = new Geocoder(
                    getBaseContext(), Locale.getDefault());
                try {
                    List<Address> addresses = geoCoder.getFromLocation(
                        p.getLatitudeE6()  / 1E6,
                        p.getLongitudeE6() / 1E6, 1);

                    String add = "";
                    if (addresses.size() > 0)
                    {
                        for (int i=0; i<addresses.get(0).getMaxAddressLineIndex();
                             i++)
                           add += addresses.get(0).getAddressLine(i) + "\n";
                    }

                    Toast.makeText(getBaseContext(), add, Toast.LENGTH_SHORT).show();
                }
                catch (IOException e) {               
                    e.printStackTrace();
                }  
                return true;
            }
            else               
                return false;
        }       
    }
最终实现结果如下图所示,地理编码,查询“上海市杨浦区四平路1239号”,结果其实略有偏差。中国的地址与邮编比较混乱,所以结果有些地方无法做到完全准确。




地理反编码


  • 大小: 217.4 KB
  • 大小: 166.6 KB
  • 大小: 246.6 KB
分享到:
评论
1 楼 床头捉刀人 2011-11-28  
你好,我使用geocoder.getFromLocation(latitude, longitude, 1)方法,报异常java.io.IOException: Service not Available。
请问这是为什么呢?

相关推荐

    android地理编码与反编码

    在Android开发中,地理编码(Geocoding)和反地理编码(Reverse Geocoding)是两个重要的地理位置处理概念。地理编码是指将人类可读的地址转换为经纬度坐标,而反地理编码则相反,它将经纬度转换为具体的地理位置...

    Android-Verso-离线反向地理编码

    在Android开发中,地理编码和反向地理编码是两个重要的概念。地理编码是将地址转换为经纬度坐标的过程,而反向地理编码则是相反的过程,即将经纬度坐标转换为具体的地址信息。对于移动应用而言,尤其在离线环境中,...

    高德地图显示、定位、地理编码和地图点击事件(Android)

    在Android开发中,集成高德地图API可以实现丰富的地图功能,包括地图的显示、定位、地理编码和反地理编码,以及地图上的点击事件处理。以下将详细解释这些知识点。 1. 地图显示: 首先,需要在AndroidManifest.xml...

    Android百度地图个人开发demo 源码程序,包括地图图层展示,覆盖物添加,地理编码+反地理编码.zip

    通过阅读和分析这些代码,你可以深入理解如何在Android应用中集成百度地图SDK,从而开发出具有类似功能的地图应用。这个示例项目是一个宝贵的学习资源,适合初学者和有经验的开发者用来提升技能或作为项目参考。

    Android studio 百度地图开发:触摸选点、地理编码、定位和导航

    在Android应用开发中,集成百度地图API是一项常见的需求,它能提供丰富的地图功能,如触摸选点、地理编码、定位和导航。以下是对这个主题的详细解析: 首先,`BaiDuMapActivity.java`是主活动类,它包含了对百度...

    AMap.Geocoder高德地图逆向地理编码(JS代码+对应数据展示前段代码)附带效果图

    不包含开发者Key,地图标点等其他高德地图API提供接口技术功能,只适用加进自身开发中项目,添加逆向地理编码功能。个别地方加了注释,不懂自行搜索或遇到问题联系楼主。(跟另一个内容相同,添加了效果图)。当点击...

    Android-Android百度地图POI检索行政区边界公交线路规划查询地理编码介绍

    四、地理编码与反地理编码 地理编码是将地址转换为经纬度坐标的过程,而反地理编码则相反,将坐标转换为可读的地址。在Android百度地图SDK中,GeoCodeSearch类提供了这两项功能。通过geocode方法进行地理编码,...

    Android-用百度地图实现了关键字搜索定位反地理编码搜索移动地图获取地图中间的经纬度

    本项目“Android-用百度地图实现了关键字搜索定位反地理编码搜索移动地图获取地图中间的经纬度”着重讲解了如何利用百度地图SDK来实现一系列关键操作,如关键字搜索、定位、反地理编码以及移动地图并获取地图中心点...

    打车功能(百度地图定位 + 反地理编码)

    以下将详细介绍“打车功能(百度地图定位 + 反地理编码)”的知识点。 1. **百度地图API集成**: - 百度地图SDK是实现地图功能的基础,开发者需要在项目中引入百度地图Android SDK,注册获取API密钥,并在...

    Android地图展示,定位,地理编码,标注,离线地图等Demo

    阅读和理解代码注释,逐步运行各个示例,这将有助于深入理解Android地图开发的各种技术。 总之,这个Demo覆盖了Android地图应用开发的核心部分,包括地图展示、定位、地理编码、标注和离线地图。对于初学者来说,这...

    android地图应用(路径规划,地理编码,公交查询,活动轨迹)

    综上所述,开发一款具备路径规划、地理编码、公交查询和活动轨迹功能的Android地图应用,需要对Android系统、地图API以及地理信息系统有深入的理解。通过学习和实践,开发者可以创建出功能丰富、用户体验优秀的地图...

    android百度地图开发案例

    在Android平台上,百度地图API为...总的来说,"Android百度地图开发案例"涵盖了从基础的地图显示到高级的路径规划、定位服务等多方面内容。通过深入学习和实践,开发者能够构建出功能完备、用户体验优秀的地图应用。

    Android 百度地图开发.zip

    5. **地理编码和反地理编码**:地理编码将地址转换为经纬度坐标,反地理编码则相反。百度地图API提供了GeocodingApi和ReverseGeoCodeApi来实现这两个功能。 6. **地图事件监听**:可以监听地图的移动、缩放、点击等...

    地图app合集Android开发

    在MyMapTest和BaiduMapsForAS中,可能包含了起点到终点的路径规划算法,这通常涉及到地理编码(将地址转化为经纬度坐标)和反地理编码(将经纬度转化为地址)。百度地图API提供了丰富的导航服务,可以计算出公交、...

    百度地图android 开发API 含demo

    - **地理编码与反地理编码**:将地址转换为坐标(地理编码),或将坐标转换为地址(反地理编码)。 - **地图事件处理**:监听用户的点击、拖动等交互行为,实现更丰富的交互体验。 总的来说,"百度地图Android开发...

    android百度地图开发实例APIjar包文档

    7. **地理编码与反地理编码**:将地址转换为经纬度坐标称为地理编码,反之为反地理编码。百度地图API提供了Geocoding和ReverseGeocoding接口,方便开发者进行地址与坐标之间的转换。 8. **事件处理**:开发者可以...

    android百度地图开发api

    5. **地理编码与反地理编码**:地理编码是将地址转换为经纬度坐标,反地理编码则是将坐标转换为地址。这两个功能在处理地址信息时非常有用。 6. **事件监听**:地图上的各种操作和交互,如点击、拖动等,都可以设置...

    基于android的百度地图应用

    4. **地理编码与反地理编码**: - **地理编码**:将地址转换为经纬度坐标。 - **反地理编码**:将经纬度坐标转换为实际地址。 5. **地图事件监听**: - 地图拖动、缩放、双击等事件的监听,可用于实现特定功能,...

Global site tag (gtag.js) - Google Analytics