Android 百度地图开发 地理位置与空间坐标互编译 源码示例 ——2

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Engineer-Jsp

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值