不管是在 导航开发 还是其他寻路开发,为了方便我们对目的地的最优线路规划,我们调用API时,通常需要定义空间坐标,
也就是经纬度,但是如果我们不知道该目的地经纬度,我们该怎么办呢? 今天我就讲讲怎么来解决这个问题
掌握了此篇博客所说到的这些技巧,可以更进一步的开发一些多功能的应用,比如我们反编译成功一个目的地地址,获取到了目的地的经纬度,我们就可以以你当前的位置,这个需要定位自己的功能,规划去往地的线路选择,有驾车检索,步行检索,公交检索,然后又可以在这个基础上开发一套GPS,也就是电子狗导航,更高端点的,可以使用导航TTS,大家可能不知道TTS是啥,它就是语音播报导航,还可以就此百度提供的jar和SDK,我们完全可以自己开发一套离线导航APP,很多的是相互结合的
上一篇日志我们成功引入了百度地图,今天就来讲讲在引入地图里反编译空间坐标和地址信息,因为我手头目前有个项目有一个功能模块,就是根据二维码、条形码扫描获取快件单号,远程数据库抓取收件人地址和收件人号码,然后根据收件人地址,选择驾车派件最优路线,那就是地址编译问题,然后检索优化路线,需要用到的包跟第一篇博客一样,因为里面我下载了所有的包,下面直接切入主题
我在布局xml里添加了一些控件来获取需要编译的信息,代码:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" >
<!-- 添加地图控件 -->
<com.baidu.mapapi.map.MapView
android:id="@+id/bmapView"
android:layout_width="fill_parent"
android:layout_height="320dp"
android:clickable="true" />
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<EditText
android:id="@+id/city"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="长沙" />
<EditText
android:id="@+id/geocodekey"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="雨花区路桥集团" />
<Button
android:id="@+id/geocode"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/button_style"
android:onClick="SearchButtonProcess"
android:text="地理位置编译空间坐标" />
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<EditText
android:id="@+id/lat"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="28.548656" />
<EditText
android:id="@+id/lon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="121.450240" />
<Button
android:id="@+id/reversegeocode"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/button_style"
android:onClick="SearchButtonProcess"
android:text="空间坐标编译地理位置" />
</LinearLayout>
</LinearLayout>
主活动 MainActivity 代码:
package com.example.engineerjspmap;
/**
* BMap地图测试示例
* @author Engineer-Jsp
* @date 2014.10.16
* */
import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MarkerOptions;
import com.baidu.mapapi.model.LatLng;
import com.baidu.mapapi.search.core.SearchResult;
import com.baidu.mapapi.search.geocode.GeoCodeOption;
import com.baidu.mapapi.search.geocode.GeoCodeResult;
import com.baidu.mapapi.search.geocode.GeoCoder;
import com.baidu.mapapi.search.geocode.OnGetGeoCoderResultListener;
import com.baidu.mapapi.search.geocode.ReverseGeoCodeOption;
import com.baidu.mapapi.search.geocode.ReverseGeoCodeResult;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
// 在应用程序创建时初始化 SDK引用的Context 全局变量
public class MainActivity extends Activity implements
OnGetGeoCoderResultListener {
MapView mMapView = null;
GeoCoder mSearch = null; // 搜索模块,也可去掉地图模块独立使用
BaiduMap mBaiduMap = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//在使用SDK各组件之前初始化context信息,传入ApplicationContext
//注意该方法要再setContentView方法之前实现
SDKInitializer.initialize(getApplicationContext());
setContentView(R.layout.activity_main);
// CharSequence titleLable = "地理编码功能";//设置标题的
// setTitle(titleLable);
//获取地图控件引用
mMapView = (MapView) findViewById(R.id.bmapView);
mBaiduMap = mMapView.getMap();
// 初始化搜索模块,注册事件监听
mSearch = GeoCoder.newInstance();
mSearch.setOnGetGeoCodeResultListener(this);
}
//在SDK各功能组件使用之前都需要调用
//SDKInitializer.initialize(getApplicationContext());,因此我们建议该方法放在Application的初始化方法中
// 创建地图Activity,管理地图生命周期
@Override
protected void onDestroy() {
super.onDestroy();
//在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
mMapView.onDestroy();
}
@Override
protected void onResume() {
super.onResume();
//在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
mMapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
//在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理
mMapView.onPause();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// menu.getItem(R.id.action_settings).setVisible(false);
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
/**
* 发起搜索
*/
public void SearchButtonProcess(View v) {
if (v.getId() == R.id.reversegeocode) {
EditText lat = (EditText) findViewById(R.id.lat);
EditText lon = (EditText) findViewById(R.id.lon);
LatLng ptCenter = new LatLng((Float.valueOf(lat.getText()
.toString())), (Float.valueOf(lon.getText().toString())));
// 反Geo搜索
mSearch.reverseGeoCode(new ReverseGeoCodeOption()
.location(ptCenter));
} else if (v.getId() == R.id.geocode) {
EditText editCity = (EditText) findViewById(R.id.city);
EditText editGeoCodeKey = (EditText) findViewById(R.id.geocodekey);
// Geo搜索
mSearch.geocode(new GeoCodeOption().city(
editCity.getText().toString()).address(
editGeoCodeKey.getText().toString()));
}
}
public void onGetGeoCodeResult(GeoCodeResult result) {
if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
Toast.makeText(MainActivity.this, "抱歉,未能找到结果", Toast.LENGTH_LONG)
.show();
return;
}
mBaiduMap.clear();
mBaiduMap.addOverlay(new MarkerOptions().position(result.getLocation())
.icon(BitmapDescriptorFactory
.fromResource(R.drawable.icon_marka)));
mBaiduMap.setMapStatus(MapStatusUpdateFactory.newLatLng(result
.getLocation()));
String strInfo = String.format("纬度:%f 经度:%f",
result.getLocation().latitude, result.getLocation().longitude);
Toast.makeText(MainActivity.this, strInfo, Toast.LENGTH_LONG).show();
}
@Override
public void onGetReverseGeoCodeResult(ReverseGeoCodeResult result) {
if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
Toast.makeText(MainActivity.this, "抱歉,未能找到结果", Toast.LENGTH_LONG)
.show();
return;
}
mBaiduMap.clear();
mBaiduMap.addOverlay(new MarkerOptions().position(result.getLocation())
.icon(BitmapDescriptorFactory
.fromResource(R.drawable.icon_marka)));
mBaiduMap.setMapStatus(MapStatusUpdateFactory.newLatLng(result
.getLocation()));
Toast.makeText(MainActivity.this, result.getAddress(),
Toast.LENGTH_LONG).show();
}
}
未执行操作的原始模拟器图:
地理位置编译成空间坐标示例图:
空间坐标反编译成地理位置示例图,这里我是随便填的的经纬度:
内容就这么多,大部分都是官方SDK的方法,没什么难度,多看看Dome就可以轻松掌握的