- 浏览: 114589 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
liubang201010:
可看看此文:http://www.goodu.info/gc/ ...
基于Android手机开发平台的移动数字图书馆服务系统研究 -
chenhaodejia:
hbxflihua 写道你好,在加载xml的时候能不能像htm ...
android自定义Spinner下拉菜单样式并获得选项的值 -
chenhaodejia:
心灵花园2010 写道你好,问下服务端该怎么去搭建?
什么意思 ...
基于Android手机开发平台的移动数字图书馆服务系统研究 -
心灵花园2010:
你好,问下服务端该怎么去搭建?
基于Android手机开发平台的移动数字图书馆服务系统研究 -
hbxflihua:
你好,在加载xml的时候能不能像html页面的select标签 ...
android自定义Spinner下拉菜单样式并获得选项的值
地理编码(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号”,结果其实略有偏差。中国的地址与邮编比较混乱,所以结果有些地方无法做到完全准确。
地理反编码
评论
1 楼
床头捉刀人
2011-11-28
你好,我使用geocoder.getFromLocation(latitude, longitude, 1)方法,报异常java.io.IOException: Service not Available。
请问这是为什么呢?
请问这是为什么呢?
发表评论
-
我今天打算推荐一下近期自己制作的一款app-吃惑
2016-07-13 17:12 460你是否有这样的习惯 ... -
android listview优化几种写法详细介绍
2015-02-18 14:58 747这篇文章只是总结下getView里面优化视图的几种写法,就像 ... -
利用convertView优化ListView性能
2015-02-18 14:26 683这里提到的ListView只是作为一个典型代表 其实在A ... -
Android之ListView原理学习与优化总结
2015-02-05 15:50 715在整理前几篇文章的时候有朋友提出写一下ListView的性 ... -
sleep()和wait()有什么区别
2015-02-04 09:38 773sleep就是正在执行的线程主动让出cpu,cp ... -
线程与进程的区别
2015-01-27 20:12 684线程是指进程内的一个执行单元,也是进程内的可调度实体.与进程 ... -
线程同步的几种方式(转)
2015-01-27 19:58 860进程中线程同步的四种常用方式: 1、 临界区(CCrit ... -
Eclipse提示No java virtual machine
2014-12-15 16:22 1008当你启动eclipse时出现... No java v ... -
解决客户端向服务器端传输中文乱码问题
2014-10-24 09:59 953客户端加码 Java code? ... -
重要通告
2012-02-05 11:36 900博客涉及到的所有源码,包括网站源码、Android源码等均在千 ... -
关于Android发送邮件
2011-09-11 08:40 3337Google 在发表 Android 手机平台时,强调的是超强 ... -
ImageButton点击背景切换事件
2011-08-23 14:30 2495问题:imagebutton初始显示图片1,当单击该image ... -
Android中ImageButton的运用详解
2011-08-23 14:13 2298ImageButton在Android的运用非常灵活,既可以在 ... -
Android拍照、录像、录音代码范例
2011-08-19 09:17 1251package com.cons.dcg.collect; i ... -
Android的Menu状态动态设置方法onPrepareOptionsMenu(Menu menu)
2011-08-12 11:49 2042覆盖onPrepareOptionsMenu(Menu men ... -
ArrayAdapter和BaseAdapter的区别是什么
2011-08-11 18:10 2137近期很多Android开发者来函表示对ArrayAdapt ... -
有关代码结构的优化若干
2011-08-11 18:08 1006避免建立对象 世界上没有免费的对象。虽然GC为每个线程都建立 ... -
ArrayAdapter和List的关系
2011-08-11 18:00 21551、使用ArrayAdapter(数组适配器)顾名思义,需要把 ... -
Manifest权限大全
2011-08-09 17:38 1040<uses-permission android:nam ... -
Android中创建自己的ContentProvider
2011-08-09 17:37 1364Android是如何实现应用程序之间数据共享的?我们以 ...
相关推荐
在Android开发中,地理编码(Geocoding)和反地理编码(Reverse Geocoding)是两个重要的地理位置处理概念。地理编码是指将人类可读的地址转换为经纬度坐标,而反地理编码则相反,它将经纬度转换为具体的地理位置...
在Android开发中,地理编码和反向地理编码是两个重要的概念。地理编码是将地址转换为经纬度坐标的过程,而反向地理编码则是相反的过程,即将经纬度坐标转换为具体的地址信息。对于移动应用而言,尤其在离线环境中,...
在Android开发中,集成高德地图API可以实现丰富的地图功能,包括地图的显示、定位、地理编码和反地理编码,以及地图上的点击事件处理。以下将详细解释这些知识点。 1. 地图显示: 首先,需要在AndroidManifest.xml...
通过阅读和分析这些代码,你可以深入理解如何在Android应用中集成百度地图SDK,从而开发出具有类似功能的地图应用。这个示例项目是一个宝贵的学习资源,适合初学者和有经验的开发者用来提升技能或作为项目参考。
在Android应用开发中,集成百度地图API是一项常见的需求,它能提供丰富的地图功能,如触摸选点、地理编码、定位和导航。以下是对这个主题的详细解析: 首先,`BaiDuMapActivity.java`是主活动类,它包含了对百度...
不包含开发者Key,地图标点等其他高德地图API提供接口技术功能,只适用加进自身开发中项目,添加逆向地理编码功能。个别地方加了注释,不懂自行搜索或遇到问题联系楼主。(跟另一个内容相同,添加了效果图)。当点击...
四、地理编码与反地理编码 地理编码是将地址转换为经纬度坐标的过程,而反地理编码则相反,将坐标转换为可读的地址。在Android百度地图SDK中,GeoCodeSearch类提供了这两项功能。通过geocode方法进行地理编码,...
本项目“Android-用百度地图实现了关键字搜索定位反地理编码搜索移动地图获取地图中间的经纬度”着重讲解了如何利用百度地图SDK来实现一系列关键操作,如关键字搜索、定位、反地理编码以及移动地图并获取地图中心点...
以下将详细介绍“打车功能(百度地图定位 + 反地理编码)”的知识点。 1. **百度地图API集成**: - 百度地图SDK是实现地图功能的基础,开发者需要在项目中引入百度地图Android SDK,注册获取API密钥,并在...
阅读和理解代码注释,逐步运行各个示例,这将有助于深入理解Android地图开发的各种技术。 总之,这个Demo覆盖了Android地图应用开发的核心部分,包括地图展示、定位、地理编码、标注和离线地图。对于初学者来说,这...
综上所述,开发一款具备路径规划、地理编码、公交查询和活动轨迹功能的Android地图应用,需要对Android系统、地图API以及地理信息系统有深入的理解。通过学习和实践,开发者可以创建出功能丰富、用户体验优秀的地图...
在Android平台上,百度地图API为...总的来说,"Android百度地图开发案例"涵盖了从基础的地图显示到高级的路径规划、定位服务等多方面内容。通过深入学习和实践,开发者能够构建出功能完备、用户体验优秀的地图应用。
5. **地理编码和反地理编码**:地理编码将地址转换为经纬度坐标,反地理编码则相反。百度地图API提供了GeocodingApi和ReverseGeoCodeApi来实现这两个功能。 6. **地图事件监听**:可以监听地图的移动、缩放、点击等...
在MyMapTest和BaiduMapsForAS中,可能包含了起点到终点的路径规划算法,这通常涉及到地理编码(将地址转化为经纬度坐标)和反地理编码(将经纬度转化为地址)。百度地图API提供了丰富的导航服务,可以计算出公交、...
- **地理编码与反地理编码**:将地址转换为坐标(地理编码),或将坐标转换为地址(反地理编码)。 - **地图事件处理**:监听用户的点击、拖动等交互行为,实现更丰富的交互体验。 总的来说,"百度地图Android开发...
7. **地理编码与反地理编码**:将地址转换为经纬度坐标称为地理编码,反之为反地理编码。百度地图API提供了Geocoding和ReverseGeocoding接口,方便开发者进行地址与坐标之间的转换。 8. **事件处理**:开发者可以...
5. **地理编码与反地理编码**:地理编码是将地址转换为经纬度坐标,反地理编码则是将坐标转换为地址。这两个功能在处理地址信息时非常有用。 6. **事件监听**:地图上的各种操作和交互,如点击、拖动等,都可以设置...
4. **地理编码与反地理编码**: - **地理编码**:将地址转换为经纬度坐标。 - **反地理编码**:将经纬度坐标转换为实际地址。 5. **地图事件监听**: - 地图拖动、缩放、双击等事件的监听,可用于实现特定功能,...