您的位置:首页 > 移动开发 > Android开发

百度Android地图SDK地理编码及标注

2015-11-02 10:25 387 查看

解决问题:

在百度地图上标注大量地址,如“海淀区上地十街10号”

工具:

eclipse+ADT,百度Android地图SDK v3.6.0

效果展示:

图中包含绿色的标记“起”以及红色标记“A”,从而可以在地图上直观的查看“起”与其他标注之间的位置关系,支持缩放。




问题分解:

1、地理编码,将地址转换为经纬度

第一步,创建地理编码检索实例;

mSearch = GeoCoder.newInstance();


第二步,创建地理编码检索监听者;

OnGetGeoCoderResultListener listener = new OnGetGeoCoderResultListener() {
public void onGetGeoCodeResult(GeoCodeResult result) {
if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
//没有检索到结果
}
//获取地理编码结果
}

@Override
public void onGetReverseGeoCodeResult(ReverseGeoCodeResult result) {
if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
//没有找到检索结果
}
//获取反向地理编码结果
}
};


第三步,设置地理编码检索监听者;

mSearch.setOnGetGeoCodeResultListener(listener);


第四步,发起地理编码检索;

mSearch.geocode(new GeoCodeOption()
.city(“北京”)
.address(“海淀区上地十街10号”);


1、标注,在地图上根据经纬度添加图标

//定义Maker坐标点
LatLng point = new LatLng(39.963175, 116.400244);
//构建Marker图标
BitmapDescriptor bitmap = BitmapDescriptorFactory
.fromResource(R.drawable.icon_marka);
//构建MarkerOption,用于在地图上添加Marker
OverlayOptions option = new MarkerOptions()
.position(point)
.icon(bitmap);
//在地图上添加Marker,并显示
mBaiduMap.addOverlay(option);


常见错误:

(a)



通常是因为AK码有误,按照官网教程仔细填写即可。

(b)onGetCodeResult报错

OnGetGeoCoderResultListener geoListener = new OnGetGeoCoderResultListener() {
public void onGetGeoCodeResult(GeoCodeResult result) {
if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
// 没有检索到结果
Log.e(LOGSTR, "adress to LatLng error!" + result.error);
} else {
// 获取地理编码结果
LatLng addressTemp = result.getLocation();
Log.w(LOGSTR, "ADDRESS:" + addressTemp.latitude + ";"
+ addressTemp.longitude);
posList.add(addressTemp);
Log.w(LOGSTR, "size of list1:"+ posList.size());

}
}

@Override
public void onGetReverseGeoCodeResult(ReverseGeoCodeResult result) {
if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
// 没有找到检索结果
}
// 获取反向地理编码结果
}
};




通常是由于程序在SDK初始化之后立即触发了监听器,而此时权鉴还没完成,所以要在地图SDK初始化完成过一段时间之后再触发监听器。

SDKInitializer.initialize(getApplicationContext());


(c)GeoCoder连续触发OnGetGeoCoderResultListener监听器结果返回的地理位置信息错误,原因是所有的search接口,都必须完成一次后再发起第二次,如果有几个并发的需求,就需要new几个对象分别做。

程序主要代码:

public class MainActivity extends Activity {
GeoCoder mSearch = null; // 搜索模块,也可去掉地图模块独立使用
BaiduMap mBaiduMap = null;
MapView mMapView = null;
private static final String LOGSTR = "Jerry";
BitmapDescriptor bitmapA = null;
BitmapDescriptor bitmapStart = null;
ArrayList<LatLng> posList = null;
ArrayList<String> addressList = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 在使用SDK各组件之前初始化context信息,传入ApplicationContext
// 注意该方法要再setContentView方法之前实现
SDKInitializer.initialize(getApplicationContext());

setContentView(R.layout.activity_main);

if (savedInstanceState == null) {
getFragmentManager().beginTransaction()
.add(R.id.container, new PlaceholderFragment()).commit();
}

posList = new ArrayList<LatLng>();
addressList = new ArrayList<String>();
initializeAddressList();

// 获取地图控件引用
mMapView = (MapView) findViewById(R.id.bmapView);
Log.w(LOGSTR, "initialize view success!");
mBaiduMap = mMapView.getMap();
Log.w(LOGSTR, "initialize baidumap success!");
// 初始化搜索模块,注册事件监听
mSearch = GeoCoder.newInstance();
Log.w(LOGSTR, "initialize GeoCoder success!");
bitmapA = BitmapDescriptorFactory.fromResource(R.drawable.icon_marka);
bitmapStart = BitmapDescriptorFactory.fromResource(R.drawable.icon_st);

Log.w(LOGSTR, "initialize bitmap success!");
mSearch.setOnGetGeoCodeResultListener(geoListener);
Log.w(LOGSTR, "add listener success!");

//在MenuItem中显示地址标注,见onOptionsItemSelected
}

OnGetGeoCoderResultListener geoListener = new OnGetGeoCoderResultListener() { public void onGetGeoCodeResult(GeoCodeResult result) { if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) { // 没有检索到结果 Log.e(LOGSTR, "adress to LatLng error!" + result.error); } else { // 获取地理编码结果 LatLng addressTemp = result.getLocation(); Log.w(LOGSTR, "ADDRESS:" + addressTemp.latitude + ";" + addressTemp.longitude); posList.add(addressTemp); Log.w(LOGSTR, "size of list1:"+ posList.size()); } } @Override public void onGetReverseGeoCodeResult(ReverseGeoCodeResult result) { if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) { // 没有找到检索结果 } // 获取反向地理编码结果 } };

@Override
public boolean onCreateOptionsMenu(Menu menu) {

// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}

private void littleSleep(){
try {
Thread.sleep(300);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_show){
Log.w(LOGSTR, "meu item Show");
mBaiduMap.clear();
int len = posList.size();
MarkerOptions option = new MarkerOptions().position(posList.get(0)).icon(bitmapStart).visible(true);
//掉下动画
option.animateType(MarkerAnimateType.drop);
// 在地图上添加Marker,并显示
mBaiduMap.addOverlay(option);

littleSleep();
for(int i=1; i<len; i++){
MarkerOptions option1 = new MarkerOptions().position(posList.get(i)).icon(bitmapA).visible(true).zIndex(2);
//掉下动画
option1.animateType(MarkerAnimateType.drop);
mBaiduMap.addOverlay(option1);
}

return true;
}

if (id == R.id.action_settings) {
//显示地址
posList.clear();
int len = addressList.size();
// 初始化搜索模块,注册事件监听
GeoCoder searchTemp1 = GeoCoder.newInstance();
searchTemp1.setOnGetGeoCodeResultListener(geoListener);
searchTemp1.geocode(new GeoCodeOption().city("北京").address(addressList.get(0)));
littleSleep();

for(int i=1; i<len; i++){
// 初始化搜索模块,注册事件监听
GeoCoder searchTemp = GeoCoder.newInstance();
searchTemp.setOnGetGeoCodeResultListener(geoListener);
searchTemp.geocode(new GeoCodeOption().city("北京").address(addressList.get(i)));
}
return true;
}
return super.onOptionsItemSelected(item);
}

private void initializeAddressList(){
addressList.add("房山区良乡西路2号中大瑞祥市场一层+地下一层");
addressList.add("房山区良乡地区拱辰大街家乐福首层北侧");
addressList.add("房山区拱辰街道东羊庄村18号一层");
addressList.add("丰台区西三环南路10号一层");
addressList.add("丰台区太平桥西里甲1号");
addressList.add("朝阳区甜水园北里16号楼一层");
addressList.add("朝阳区甘露园南里25号朝阳园三期商业一层");
addressList.add("北京市朝阳区姚家园路东口甲1号活力东方家乐福");
addressList.add("海淀区清华东路2号金码大厦A座首层");
addressList.add("海淀区双清路88号华源世纪商务楼一二层");
addressList.add("海淀区学清路甲8号一层");
addressList.add("海淀区宝盛北里西区28号楼一层和二层");
addressList.add("海淀区清河镇华润五彩城商业一层");
addressList.add("海淀区清河永泰庄路甲1号");
addressList.add("海淀区清河毛纺路南甲36号金五星商业大厦");
addressList.add("昌平区西三旗环岛东北角上 奥世纪中心商业办公楼2#A座一层+二层");
addressList.add("昌平区回龙观东大街1号楼-1至2层的01的一层和二层");
addressList.add("昌平区回龙观镇黄土店黄平路泰华龙旗广场3#商业楼一层");
addressList.add("海淀区阜成路51-2");
addressList.add("海淀区花园北路44号");
addressList.add("海淀区西三环北路70号");
addressList.add("海淀区学院南路50号首层及二层");
addressList.add("海淀区花园路2号首层");
addressList.add("海淀区学院路17号一,二层");
addressList.add("海淀区学院路甲38号长城电脑大厦");
addressList.add("海淀区北三环中路49号");
addressList.add("海淀区北三环西路48号1#楼FA8商铺");
addressList.add("海淀区上地东里一区4号楼一层西厅中部");
addressList.add("海淀区成府路28号优盛大厦一层09号,二层019号");
addressList.add("海淀区农大南路与信息路交叉口东北角华联F1+F2");
addressList.add("海淀区万泉河路68号紫金大厦一层北侧");
addressList.add("海淀区北洼路4号");
addressList.add("海淀区海淀南路13号楼亿方大厦一、二层");
addressList.add("海淀区亮甲店危改小区(南区)3号楼地上部分家乐福定慧桥店首层西侧");
addressList.add("海淀区中关村大街19号新中关大厦B1");
addressList.add("海淀区海淀大街3号鼎好电子大厦A座B1");
addressList.add("海淀区中关村大街11号1层C1580号商铺");
addressList.add("海淀区魏公村路5号");
addressList.add("海淀区远大路远大居住区二期世纪金源大酒店一层东南角");
addressList.add("海淀区远大路1号首层");
addressList.add("海淀区巴沟路2号北京华联万柳购物中心一层");
addressList.add("海淀区白石桥路甲54号家乐福超市一层西侧");
addressList.add("海淀区复兴路12号恩菲科技大厦");
addressList.add("海淀区五棵松路35号北京欧尚超市F1、B1");
addressList.add("海淀区永定路88号长银大厦一层");
addressList.add("海淀区知春路29号F1+F2");
addressList.add("海淀区阜成路23号一层、二层");
addressList.add("海淀区西直门北大街32号枫蓝国际中心商场B座一层 ");
addressList.add("海淀区北三环西路大钟寺国际广场一层+二层");
addressList.add("海淀区复兴路23号二层");
addressList.add("海淀区复兴路甲23号");
addressList.add("海淀区复兴路69号商场地下一层B1——111号及A1-05西南侧");
addressList.add("海淀区复兴路32号院一区");
addressList.add("宣武区宣武门外大街32号");
addressList.add("西城区新街口北大街50号");
addressList.add("西城区西外大街德宝新园14号");
addressList.add("西城区复兴门外大街8号楼裙楼二层");
addressList.add("西城区地安门外大街178号");
addressList.add("西城区月坛南街乙71号");
addressList.add("宣武区前门西大街正阳市场1号楼中部");
addressList.add("宣武区宣武门东大街24号越秀饭店西配楼一层");
addressList.add("宣武区马莲道路11号");
addressList.add("宣武区白广路北口综合服务楼2楼首层");
addressList.add("宣武区建功南里3号楼首层");
addressList.add("宣武区广安门外大街甲180号中国新纪元大厦一层");
addressList.add("西城区西单北大街堂子胡同9号地下一层");
addressList.add("西城区新街口北大街1号1号楼一层");
addressList.add("西城区西直门南大街甲15-6");
addressList.add("西城区西直门外大街132号一层+地下一层");
addressList.add("西城区车公庄大街丙4号一层+二层");
addressList.add("西城区阜成门大街2号万通新世界商城地下一层");
addressList.add("丰台区方庄芳古园一区商住楼8幢B1+F1");
addressList.add("丰台区樊家村甲3号1层");
addressList.add("丰台区丰管路16号11号楼首层十二号");
addressList.add("丰台区西四环路甲88号");
addressList.add("丰台区西四环南路8号-1号楼首层+二层");
addressList.add("大兴区黄村卫星城兴丰街15号星城商厦一层北侧");
addressList.add("大兴区黄村镇兴丰大街东侧火神庙商业中心F座商业楼一层");
addressList.add("大兴区绿地中央广场乐购超市一层");
addressList.add("大兴区西红门京良路南侧乐家商业中心西侧一层");
addressList.add("通州区马驹桥镇9号百尚生活广场一层");
addressList.add("北京经济开发区西环北路18号F1+F2");
addressList.add("经济技术开发区天宝园五里二区A1+A2户一层");
addressList.add("经济技术开发区文化园东路6号北京经开汇展中心1-2层");
addressList.add("丰台区马家堡居住区中区公建(时帆大厦)1、2层");
addressList.add("丰台区海户屯北京新世纪服装商贸城一层南侧");
addressList.add("丰台区南四环中路城南嘉园益城园14号楼一、二层");
addressList.add("北京丰台区南三环东路成寿寺路2号分钟寺阳光新生活购物广场");
addressList.add("丰台区风格与林苑甲9号楼1层102");
addressList.add("丰台区大红门西路26号银泰百货B1");
addressList.add("朝阳区朝外大街东大桥路1号楼");
addressList.add("朝阳区朝阳门外大街19号(一层东侧)");
addressList.add("朝阳区金台里甲15号");
addressList.add("朝阳区呼家楼京广中心首层");
addressList.add("朝阳区工体北路11-1号");
addressList.add("朝阳区团结湖路7号");
addressList.add("朝阳区安慧里二区4号1、2、3层");
addressList.add("朝阳区和平西街21号天丰利市场首层北侧F1");
addressList.add("朝阳区小营东路3号北京凯基伦购物中心一层西侧");
addressList.add("朝阳区惠新西街23号");
addressList.add("朝阳区樱花园东街5号新化信北侧一、二层");
addressList.add("延庆县东外大街4号首层大门西侧");
addressList.add("北京市延庆县延庆镇妫水北街39号A座1层");
addressList.add("门头沟区门头沟路1号首层");
addressList.add("北京市门头沟区双峪环岛东南角熙旺中心一层");
addressList.add("北京市门头沟区新桥大街80号京客隆一层+二层");
addressList.add("朝阳区洼里乡北苑路东易初莲花超市一层");
addressList.add("朝阳区安立路68号阳光广场一层西门北侧");
addressList.add("朝阳区北苑路158号首层");
addressList.add("平谷区新平北路世纪广场东侧祥和宾馆首层");
addressList.add("密云县鼓楼南大街10号");
addressList.add("密云县鼓楼南大街5号");
addressList.add("怀柔区开放路东侧下元市场南侧京客隆一二层");
addressList.add("西城区北三环中路18号");
addressList.add("朝阳区左家庄新源街24号");
addressList.add("朝阳区霄云路27号中国庆安大厦首层西侧");
addressList.add("北京市朝阳区西坝河西里23号一层部分");
addressList.add("朝阳区静安西街10号国展宾馆一层");
addressList.add("北京市朝阳区曙光西里甲5号凤凰置地广场凤凰新天地B104号商铺");
addressList.add("朝阳区劲松4区401楼");
addressList.add("朝阳区松榆里28号楼松榆里商场一层北侧");
addressList.add("朝阳区广渠路31号");
addressList.add("北京市朝阳区潘家园东里甲30号楼");
addressList.add("朝阳区东三环中路65号一层+地下一层");
addressList.add("朝阳区广渠路南侧44号F1+F2");
addressList.add("北京市朝阳区天辰东路8-10-12号");
addressList.add("朝阳区林萃西里16号楼北京华润万家超市1层");
addressList.add("朝阳区黄寺大街15号北京城乡黄寺商厦");
addressList.add("北京市朝阳区祁家豁子8号");
addressList.add("朝阳区胜古南里甲34号一层和二层");
addressList.add("东四环路大郊亭商业街5号院东侧");
addressList.add("朝阳区百子湾12号大成国际中心1号楼1层");
addressList.add("朝阳区朝阳路十里堡5号云柏商厦一层西侧");
addressList.add("朝阳区石佛营东里117号楼首层");
addressList.add("朝阳区八里庄西里99号楼-1层106,107号");
addressList.add("朝阳区南四环成寿寺路308号北京城外诚家居广场停车广场");
}

/**
* A placeholder fragment containing a simple view.
*/
public static class PlaceholderFragment extends Fragment {

public PlaceholderFragment() {
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_main, container,
false);
return rootView;
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: