不管是在 导航开发 还是其他寻路开发,为了方便我们对目的地的最优线路规划,我们调用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>
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就可以轻松掌握的