zoukankan      html  css  js  c++  java
  • [转]大话企业级Android应用开发实战 与Google Map整合

                          41  Android与Google Map整合 

    41.3.2  风景区展示实例

    3.完成功能清单AndroidManifest.xml文件

        <?xml version="1.0" encoding="utf-8"?>

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"

          package="com.sharpandroid.ScenicDisplay"

          android:versionCode="1"

          android:versionName="1.0">

        <application android:icon="@drawable/icon" android:label="@string/

    app_name">

            <activity android:name=".SciencDisplayActivity"

                      android:label="@string/app_name">

                <intent-filter>

                    <action android:name="android.intent.action.MAIN" />

                    <category android:name="android.intent.category.LAUNCHER" />

                </intent-filter>

            </activity>

            <uses-library android:name="com.google.android.maps" />

        </application>

        <uses-sdk android:minSdkVersion="7" />

           

         <uses-permission android:name="android.permission.ACCESS_COARSE_

    LOCATION"/>

         <uses-permission android:name="android.permission.ACCESS_FINE_

    LOCATION"/>

         <uses-permission android:name="android.permission.INTERNET">

    </uses-permission>

         <uses-permission android:name="com.google.android.maps">

    </uses-permission>

    </manifest>

    4.main.xml文件

    在此布局文件中我们需要三个组件,分别为MapView组件、zoom 界面组件、TextView控件。

         <?xml version="1.0" encoding="utf-8"?>

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/

    android"

                     android:orientation="vertical"

                     android:layout_width="fill_parent"

                     android:layout_height="fill_parent"

              >

            <TextView 

                    android:id="@+id/textview"

                    android:layout_width="fill_parent"

                    android:layout_height="50px"

                    android:background="#F0FFFF"

                    android:textColor="#0000CD"

                    android:padding="8dip"

                    android:text=""

          />

        <com.google.android.maps.MapView

                    android:id="@+id/map"

                    android:layout_width="fill_parent"

                    android:layout_height="fill_parent"

                    android:layout_below="@id/textview"

        android:apiKey="0msHaq9AU6OJwZR3mN1DstI-wNKx9p4Yio_bncQ"

                     android:clickable="true"

                     />

    <LinearLayout

                     android:id="@+id/zoom"

                     android:layout_width="wrap_content"

                     android:layout_height="wrap_content"

                     android:layout_alignParentBottom="true"

                     android:layout_centerHorizontal="true"

         ></LinearLayout>

    </RelativeLayout>

    5.ScenicDisplay.java中的代码

     package com.sharpandroid.ScenicDisplay;

     import java.util.ArrayList;

     import java.util.List;

     import android.app.AlertDialog;

     import android.content.DialogInterface;

     import android.graphics.Canvas;

     import android.graphics.Color;

     import android.graphics.Paint;

     import android.graphics.Point;

     import android.graphics.RectF;

     import android.graphics.drawable.Drawable;

     import android.os.Bundle;

     import android.view.Menu;

     import android.view.MenuItem;

     import android.widget.TextView;

     import android.widget.Toast;

     import com.google.android.maps.GeoPoint;

     import com.google.android.maps.ItemizedOverlay;

     import com.google.android.maps.MapActivity;

     import com.google.android.maps.MapController;

     import com.google.android.maps.MapView;

     import com.google.android.maps.MyLocationOverlay;

     import com.google.android.maps.Overlay;

     import com.google.android.maps.OverlayItem;

     import com.google.android.maps.Projection;

     

    public class ScenicDisplay extends MapActivity {

        private MapView mapView;

        private MapController mapController;

      

        @Override

        public void onCreate(Bundle savedInstanceState) {

            super.onCreate(savedInstanceState);

            setContentView(R.layout.main);

            mapView = (MapView) this.findViewById(R.id.map);

                                            //取得mapView 控件

            mapController = mapView.getController();

            mapController.setZoom(17);

            mapView.setTraffic(true);

            mapView.setBuiltInZoomControls(true);

          

        }

          protected static final int MENU_CC = Menu.FIRST;

          protected static final int MENU_SUN = Menu.FIRST+1;

          protected static final int MENU_TYHJ = Menu.FIRST+2;

         

     @Override

        public boolean onCreateOptionsMenu(Menu menu) {

            menu.add(0, MENU_CC, 0,"八达岭长城")

            .setIcon(R.drawable.imagescc)

            .setAlphabeticShortcut('a');

            menu.add(0, MENU_SUN, 0, "太阳岛")

            .setIcon(R.drawable.imagessun)

            .setAlphabeticShortcut('b');

            menu.add(0, MENU_TYHJ, 0, "天涯海角")

            .setIcon(R.drawable.imagesty)

            .setAlphabeticShortcut('c');

            return super.onCreateOptionsMenu(menu);

        }

       

        GeoPoint position_cc = new GeoPoint(  

                (int) (40.362643 * 1000000),

                (int) (116.019793 * 1000000)

            );

        GeoPoint position_sun = new GeoPoint(

                (int) (45.789361 * 1000000),

                (int) (126.600048 * 1000000)

            );

        GeoPoint position_ty = new GeoPoint( 

                (int) (18.292023 * 1000000),

                (int) (109.347711 * 1000000)

            );

         

    @Override

        public boolean onOptionsItemSelected(MenuItem item) {

             switch (item.getItemId()) {

            case MENU_CC:

                mapController.animateTo(position_cc);

                break;

            case MENU_SUN:

                 mapController.animateTo(position_sun);

            break;

            case MENU_TYHJ:

                mapController.animateTo(position_ty);

            }

            return super.onOptionsItemSelected(item);

        }

     

        @Override

        protected boolean isRouteDisplayed() {

            // TODO Auto-generated method stub

            return false;

             }

    }

    6.风景区图标、绘图的添加

    首先我们想在Map上添加我们想要的图标信息,实现代码如下:

    private class positionOverlay extends ItemizedOverlay<OverlayItem>{

          private final int mRadius = 5;

          private List<OverlayItem> items = new ArrayList<OverlayItem>();

       

           public positionOverlay(Drawable drawable) {

            super(boundCenter(drawable));

            items.add(

                    new OverlayItem(position_cc, "中国八达岭长城", "21度"));

            items.add(

                    new OverlayItem(position_sun, "中国首批5A", "16度"));

            items.add(

    new OverlayItem(position_ty, "中国名旅", "32度"));

            populate();

        }

         

        @Override

        protected OverlayItem createItem(int i) {

            // TODO Auto-generated method stub

            return items.get(i);

        }

     

        @Override

        public int size() {

            // TODO Auto-generated method stub

            return items.size();

        }

     

        @Override

    public boolean onTap(int index) {

            Toast.makeText(SciencDisplayActivity.this, "今天的气温是"+items.

    get(index).getSnippet(),Toast.LENGTH_SHORT).show();

            return true;

        }

     

    public void draw(Canvas canvas, MapView mapView, boolean shadow) {

                Projection projection = mapView.getProjection();

                for (int index = size() - 1; index >= 0; index--) {

                OverlayItem overLayItem = getItem(index);

                String title = overLayItem.getTitle();

           Point point = projection.toPixels(overLayItem.getPoint(), null);

                RectF oval = new RectF(point.x - mRadius,point.y - mRadius,

                                       point.x + mRadius,point.y + mRadius);

               

                Paint paint = new Paint();

                paint.setColor(Color.CYAN);

                paint.setAntiAlias(true);

                paint.setFakeBoldText(true);

               

                Paint backPaint = new Paint();

                backPaint.setColor(Color.RED);

                backPaint.setAntiAlias(true);

               

                RectF backRectF = new RectF(

                point.x + 40+ mRadius,point.y  - 3*mRadius,

                point.x +65,point.y + 2*mRadius

                );

           

                /* 文字设置 */

                Paint paintText = new Paint();

                paintText.setColor(Color.BLUE);

                paintText.setTextSize(25);

               

                canvas.drawOval(oval, paint);

                canvas.drawRoundRect(backRectF, 10, 10, backPaint);

                canvas.drawText(title, point.x, point.y, paintText);

                }

                super.draw(canvas, mapView, shadow);

                }

    }

            

    7.风景区简介添加

    关键代码实现:

    public boolean onOptionsItemSelected(MenuItem item) {

         switch (item.getItemId()) {

        case MENU_CC:

            mapController.animateTo(position_cc);

           

                showDialog("世界文化遗产、国家5A级景区、国家重点文物保护单位、国家重

    点风景名胜区" +"中国旅游胜地四十佳"之首、全国文明旅游风景示范区.");

     

            break;

        case MENU_SUN:

             mapController.animateTo(position_sun);

            textView.setText("是国内最大的城市中心江漫滩湿地景观,周边栽植北方特有的有

    菩提树之称的糠椴…");

        break;

        case MENU_TYHJ:

            if (textView.getText().toString()!=null) {

                textView.setText("有热带海滩花岗岩风景区、购物区和度假村组成集成热带

    海洋风光…." );

              }

            mapController.animateTo(position_ty);

        }

        return super.onOptionsItemSelected(item);

    }

    41.4  Google Map卫星导航——出行好帮手

    41.4.2  GPS旅游导航仪实例

    1.第一部分,功能实现

    AndroidManifest.xml中的代码:

    <?xml version="1.0" encoding="utf-8"?>

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"

          package="com.sharpandroid.navigation"

          android:versionCode="1"

          android:versionName="1.0">

        <application android:icon="@drawable/icon" android:label=

    "@string/app_name">

            <activity android:name=".TravelTracks"

                      android:label="@string/app_name">

                <intent-filter>

                    <action android:name="android.intent.action.MAIN" />

                    <category android:name="android.intent.category.LAUNCHER" />

                </intent-filter>

            </activity>

            <activity android:name="com.sharpandroid.navigation.

    DirectionTracks" android:label="Navigation">

                <intent-filter>

                    <category android:name="android.intent.category.

    LAUNCHER"></category>

                    <action android:name="android.intent.action.MAIN"></action>

                </intent-filter>

           </activity>

           <uses-library android:name="com.google.android.maps" />

           <activity android:name="com.sharpandroid.navigation.

    PositionConvert" android:label="Navigation">

                <intent-filter>

                    <category android:name="android.intent.category.LAUNCHER">

    </category>

                    <action android:name="android.intent.action.MAIN"></action>

                </intent-filter>

           </activity>

           <uses-library android:name="com.google.android.maps" />

        </application>

        <uses-sdk android:minSdkVersion="7" />

         <uses-permission android:name="android.permission.INTERNET">

    </uses-permission>

         <uses-permission android:name="com.google.android.maps">

    </uses-permission>

         <uses-permission

         android:name="android.permission.ACCESS_COARSE_LOCATION"/>

      <uses-permission

         android:name="android.permission.ACCESS_FINE_LOCATION"/>

    </manifest>

    TravelNavigation/res/values中定义了两个文件。

    (1)string.xml文件在这个文件中定义了整个项目中用到的资源文字串。

    <?xml version="1.0" encoding="utf-8"?>

    <resources>

          <string name="hello">Hello World, DaoTracks!</string>

          <string name="app_name">旅游导航仪</string>

          <string name="Resolvebutton">位置解析</string>

          <string name="NavigationButton">路况导航仪</string>

          <string name="str_longitude">经度(Longitude):</string>

          <string name="str_latitude">纬度(Latitude):</string>

          <string name="str_default_address">八达岭长城</string>

          <string name="str_button1">规划路径</string>

          <string name="str_button2">+</string>

          <string name="str_button3">-</string>

          <string name="str_button4">查询</string>

          <string name="str_button5">卫星视图(开)</string>

          <string name="str_button6">卫星视图(关)</string>

          <string name="str_to">前往:</string>

          <string name="str_my_location">目前所在地址:</string>

    </resources>

    (2)color.xml文件在这个文件中定义了整个项目中用到的颜色。

    <?xml version="1.0" encoding="utf-8"?>

    <resources>

      <drawable name="darkgray">#808080</drawable>

      <drawable name="white">#FFFFFF</drawable>

      <drawable name="blue">#0000FF</drawable>

    </resources>

    TravelNavigation/res/layout中定义了三个文件。

    (1)main.xml,在主页面中定义了一个TextView 控件和两个Button控件,分别作为进入两个功能的“入口”。

        <?xml version="1.0" encoding="utf-8"?>

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

        android:orientation="vertical"

        android:layout_width="fill_parent"

        android:layout_height="fill_parent"

          android:gravity="center_horizontal"

        >

    <TextView 

        android:layout_width="fill_parent"

        android:layout_height="wrap_content"

        android:text="出行好帮手"

         android:gravity="center"

      

        />

       <Button android:id="@+id/Resolvebutton"

               android:layout_width="200px"

               android:layout_height="wrap_content"

               android:text="@+string/Resolvebutton"

              

       ></Button>

    <Button android:id="@+id/NavigationButton"

               android:layout_width="200px"

               android:layout_height="wrap_content"

               android:gravity="center"

               android:text="@+string/NavigationButton"

    ></Button>

    </LinearLayout>

    (2)navigation.xml,在此文件中定义了一个TextView控件、一个EditText控件、三个Button控件、一个MapView控件并且用LinearLayout布局方式进行横向排列。

       <?xml version="1.0" encoding="utf-8" ?>

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

            android:background="@drawable/white"

            android:orientation="vertical"

            android:layout_width="fill_parent"

            android:layout_height="fill_parent">

    <!--  建立一个TextView

      -->

      <TextView android:id="@+id/myTextView1"

             android:layout_width="fill_parent"

             android:layout_height="wrap_content"

             android:textColor="@drawable/blue"

             android:text="@string/hello" />

    - <!--  建立一个EditText

      -->

      <EditText android:id="@+id/myEditText1"

              android:layout_width="180px"

              android:layout_height="wrap_content"

              android:text="" />

    - <LinearLayout android:orientation="horizontal"

       android:layout_width="wrap_content"

       android:layout_height="wrap_content">

    - <!--  建立第一个Button

      -->

      <Button android:id="@+id/myButton1"

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:text="@string/str_button1" />

    - <!--  建立第二個Button

      -->

      <Button android:id="@+id/myButton2"

           android:layout_width="wrap_content"

           android:layout_height="wrap_content"

           android:text="@string/str_button2" />

    - <!--  建立第三個Button

      -->

      <Button android:id="@+id/myButton3"

           android:layout_width="wrap_content"

           android:layout_height="wrap_content"

           android:text="@string/str_button3" />

      </LinearLayout>

      <com.google.android.maps.MapView

           android:id="@+id/myMapView1"

           android:layout_width="fill_parent"

           android:layout_height="fill_parent"

           android:enabled="true"

           android:clickable="true"

           android:apiKey="0msHaq9AU6OJwZR3mN1DstI-wNKx9p4Yio_bncQ" />

      </LinearLayout>

    (3)resolve.xml,在这个文件中用关系型布局方式AbsoluteLayout定义了两个TextView、三个Button、两个EditText、一个ToggleButton和一个MapView控件。

    <?xml version="1.0" encoding="utf-8"?>

    <AbsoluteLayout

          android:id="@+id/layout1"

          android:layout_width="fill_parent"

          android:layout_height="fill_parent"

          android:background="@drawable/white"

      xmlns:android="http://schemas.android.com/apk/res/android"

      <!--  建立第一个EditText

      -->

      <EditText

          android:id="@+id/myEdit1"

          android:layout_width="105px"

          android:layout_height="40px"

          android:textSize="16sp"

          android:layout_x="130px"

          android:layout_y="12px"

          android:numeric="decimal"

      >

      </EditText>

      <!--  建立第二个EditText

      -->

     

      <EditText

         android:id="@+id/myEdit2"

         android:layout_width="105px"

         android:layout_height="40px"

         android:textSize="16sp"

         android:layout_x="130px"

         android:layout_y="52px"

         android:numeric="decimal"

      >

      </EditText>

      <!--  建立第一个TextView

      -->

    <TextView

         android:id="@+id/myText1"

         android:layout_width="wrap_content"

         android:layout_height="wrap_content"

         android:text="@string/str_longitude"

         android:textColor="@drawable/blue"

         android:layout_x="10px"

         android:layout_y="22px"

      >

      </TextView>

    <!--  建立第一个TextView

      -->

    <TextView

         android:id="@+id/myText2"

         android:layout_width="wrap_content"

           android:layout_height="wrap_content"

           android:text="@string/str_latitude"

           android:textColor="@drawable/blue"

           android:layout_x="10px"

           android:layout_y="62px"

      >

      </TextView>

    <!--  建立第一个Button

      -->

    <Button

           android:id="@+id/myButton1"

           android:layout_width="77px"

           android:layout_height="45px"

           android:text="@string/str_button4"

           android:layout_x="240px"

           android:layout_y="12px"

      >

      </Button>

    <!--  建立第二个Button

      -->

    <Button

          android:id="@+id/myButton2"

          android:layout_width="40px"

          android:layout_height="40px"

          android:text="@string/str_button2"

          android:textSize="20sp"

          android:layout_x="277px"

          android:layout_y="55px"

      >

      </Button>

    <!--  建立第三个Button

      -->

    <Button

          android:id="@+id/myButton3"

          android:layout_width="40px"

          android:layout_height="40px"

          android:text="@string/str_button3"

          android:textSize="20sp"

          android:layout_x="240px"

          android:layout_y="55px"

      >

      </Button>

    <!--  建立第一个ToggleButton

      -->

    <ToggleButton

          android:id="@+id/myButton4"

          android:layout_width="wrap_content"

          android:layout_height="wrap_content"

          android:textOff="@string/str_button5"

          android:textOn="@string/str_button6"

          android:layout_x="30px"

          android:layout_y="92px"

      ></ToggleButton>

    <!--  建立第三个TextView

      -->

      <TextView

          android:id="@+id/myText3"

          android:layout_width="200sp"

          android:layout_height="50sp"

          android:text="欢迎使用"

          android:textSize="10sp"

          android:padding="12dip"

          android:background="#FFE4C4"

          android:textColor="#0000CD"

          android:layout_x="125px"

          android:layout_y="92px"

       ></TextView>

     

     

      <!-- Google MapView Widget -->

      <com.google.android.maps.MapView

         android:id="@+id/myMapView1"

         android:layout_width="fill_parent" 

         android:layout_height="fill_parent"

         android:layout_x="0px"

         android:layout_y="142px"

         android:enabled="true"

         android:clickable="true"

         android:apiKey="0msHaq9AU6OJwZR3mN1DstI-wNKx9p4Yio_bncQ"

      >

      </com.google.android.maps.MapView>

    </AbsoluteLayout>

    2.第二部分,位置解析功能代码实现

    编写PositionConvert.java:

        package com.sharpandroid.navigation;

     

    /* import相关class */

    import java.util.List;

    import java.util.Locale;

    import android.app.AlertDialog;

    import android.content.DialogInterface;

    import android.graphics.Canvas;

    import android.graphics.Paint;

    import android.graphics.Point;

    import android.location.Address;

    import android.location.Geocoder;

    import android.os.Bundle;

    import android.view.KeyEvent;

    import android.view.View;

    import android.widget.Button;

    import android.widget.CompoundButton;

    import android.widget.EditText;

    import android.widget.TextView;

    import android.widget.ToggleButton;

    import android.widget.CompoundButton.OnCheckedChangeListener;

    import com.google.android.maps.GeoPoint;

    import com.google.android.maps.MapActivity;

    import com.google.android.maps.MapController;

    import com.google.android.maps.MapView;

    import com.google.android.maps.Overlay;

    import com.google.android.maps.Projection;

     

     

    public class PositionConvert extends MapActivity

    {

      private MapController mapController;

      private MapView mapView;

      private Button Button01,Button02,Button03;

      private ToggleButton Button4;

      private EditText EditText01;

      private EditText EditText02;

      private TextView textView;

      private int intZoomLevel;

     

      /* Map启动时的默认坐标:八达岭长城 */

      private double dLat=40.362643;

      private double dLng=116.019793;

     

      @Override

      protected void onCreate(Bundle savedInstanceState)

      {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.resolve);

     

        /* 创建MapView对象 */

        mapView = (MapView)findViewById(R.id.myMapView1);

        /*通过MapView对象得到mapView的控制器*/

        mapController = mapView.getController();

        /*将默认位置定位到地图上*/

        GeoPoint geoPoint = new GeoPoint((int)(dLat*1E6), (int)(dLng*1E6));

        mapController.animateTo(geoPoint);

        /* 设置MapView的显示选项(卫星、街道) */

        mapView.setSatellite(false);

        mapView.setStreetView(true);

        /* 默认放大的层级 */

       intZoomLevel = 17;

       /*设值mapView此时的放大级别*/

        mapController.setZoom(intZoomLevel);

        /*得到显示地址详细信息的TextView控件*/

        textView =  (TextView) this.findViewById(R.id.myText3);

        /* 更新MapView*/

    refreshMapView();

     

         /* 得到查询的EditText控件 */

    EditText01 = (EditText)findViewById(R.id.myEdit1);

         EditText02 = (EditText)findViewById(R.id.myEdit2);

       

        /* 得到查询的Button控件 */

        Button01 = (Button)findViewById(R.id.myButton1);

        Button01.setOnClickListener(new Button.OnClickListener()

        {

          @Override

          public void onClick(View v)

          {

            /* 经纬度空白检查 */

            if(EditText01.getText().toString().equals("")||

               EditText02.getText().toString().equals(""))

            {

              showDialog("经度或纬度填写不正确!");

            }

            else

            {

              /* 取得输入的经纬度 */

              dLng=Double.parseDouble(EditText01.getText().toString());

              dLat=Double.parseDouble(EditText02.getText().toString());

              GeoPoint p = new GeoPoint((int)(dLat* 1E6), (int)(dLng* 1E6));

              /*得到坐标定位标示层*/

              readPoint rPoint = new readPoint(p);

              /*得到MapView中的所有的图层*/

              List<Overlay> overlays =mapView.getOverlays();

              /*清空MapView中的图层*/

              overlays.clear();

               /*将图标的图层加到MapView的图层中*/

              overlays.add(rPoint);

              /*通过自定义方法得到GeoPoint对应的地址*/

              String pa =getAddressbyGeoPoint(p);

              /*将得到的内容以Dialog形式显示出来*/

              showDialog(pa);

              /*将得到的内容以TextView形式显示出来*/

              textView.setText(pa);

              /*刷新MapView页面*/

              refreshMapView();

            }

          }

        });

        

        /* 放大Map的Button */

        Button02 = (Button)findViewById(R.id.myButton2);

        Button02.setOnClickListener(new Button.OnClickListener()

        {

          @Override

          public void onClick(View v)

          {

          intZoomLevel++;

            if(intZoomLevel>mapView.getMaxZoomLevel())

            {

              intZoomLevel = mapView.getMaxZoomLevel();

            }

            mapController.setZoom(intZoomLevel);

          }

        });

        

        /* 缩小Map的Button */

        Button03 = (Button)findViewById(R.id.myButton3);

        Button03.setOnClickListener(new Button.OnClickListener()

        {

          @Override

          public void onClick(View v)

          {

            intZoomLevel--;

            if(intZoomLevel<1)

            {

              intZoomLevel = 1;

            }

            mapController.setZoom(intZoomLevel);

          }

        });

        /*添加卫星试图切换Button*/

        Button4 =  (ToggleButton) this.findViewById(R.id.myButton4);

        Button4.setOnCheckedChangeListener(new OnCheckedChangeListener() {

           

            @Override

            public void onCheckedChanged(CompoundButton buttonView, boolean

    isChecked) {

                if (isChecked == true) {

                    mapView.setSatellite(true);

                }else {

                    mapView.setSatellite(false);

                }

            }

        });

     

      }

     

     

      /*添加按键控制*/

    @Override

      public boolean onKeyDown(int keyCode, KeyEvent event) {

          if(keyCode == KeyEvent.KEYCODE_A){

              mapController.setZoom(intZoomLevel+1);

              return true;

          }else if (keyCode == KeyEvent.KEYCODE_D) {

            mapController.setZoom(intZoomLevel-1);

            return true;

        }else if (keyCode == KeyEvent.KEYCODE_W) {

            mapView.setSatellite(true);

            mapView.setTraffic(false);

            return true;

        }else if (keyCode == KeyEvent.KEYCODE_S) {

            mapView.setSatellite(false);

            mapView.setTraffic(true);

            return true;

        }

          

        return false;

      }

      /*创建MapView的图标层*/

       protected class readPoint extends Overlay{

           

           private GeoPoint g;

           public readPoint(GeoPoint geo){

              

               super();

               g = geo;

           }

        @Override

        public boolean draw(Canvas canvas, MapView mapView, boolean shadow,

                long when) {

            if (shadow == false) {

                Projection projection = mapView.getProjection();

                Point p  = new Point();

                projection.toPixels(g, p);

               

                 Paint paint = new Paint();

                 paint.setARGB(255, 255, 0, 0);

                 paint.setAntiAlias(true);

                 

                 canvas.drawCircle(p.x, p.y, 5, paint);

            }

            return super.draw(canvas, mapView, shadow, when);

        }

    }

     

      /* 刷新Map的method */

      public void refreshMapView()

      {

       GeoPoint gp= new GeoPoint((int)(dLng*1E6),(int)(dLng*1E6));

        mapView.displayZoomControls(true);

        /* 将Map的中点移至GeoPoint */

        mapController.animateTo(gp);

        mapController.setZoom(intZoomLevel);

        mapView.setTraffic(true);

        mapView.setSatellite(false);

       

        }

     

      @Override

      protected boolean isRouteDisplayed()

      {

        return false;

      }

     

      /* 显示Dialog的method */

      private void showDialog(String mess){

        new AlertDialog.Builder(PositionConvert.this).setTitle("Message")

        .setMessage(mess)

        .setNegativeButton("确定", new DialogInterface.OnClickListener()

        {

          public void onClick(DialogInterface dialog, int which)

          {

         

          }

        })

        .show();

      }

      public String getAddressbyGeoPoint(GeoPoint gp)

      {

        String strReturn = "";

        try

        {

          /* 当GeoPoint不等于null */

          if (gp != null)

          {

            /* 创建Geocoder对象 */

            Geocoder gc = new Geocoder

            (PositionConvert.this, Locale.getDefault());

           

            /* 取出地理坐标经纬度 */

            double geoLatitude = (int)gp.getLatitudeE6()/1E6;

            double geoLongitude = (int)gp.getLongitudeE6()/1E6;

           

            /* 自经纬度取得地址(可能有多行地址) */

            List<Address> lstAddress =

            gc.getFromLocation(geoLatitude, geoLongitude, 1);

           

            StringBuilder sb = new StringBuilder();

           

            /* 判断地址是否为多行 */

            if (lstAddress.size() > 0)

            {

              Address adsLocation = lstAddress.get(0);

     

              for(int i=0;i<adsLocation.getMaxAddressLineIndex();i++)

              {

                sb.append(adsLocation.getAddressLine(i)).append(" ");

              }

              sb.append(adsLocation.getLocality()).append(" ");

              sb.append(adsLocation.getPostalCode()).append(" ");

              sb.append(adsLocation.getCountryName());

            }

           

            /*

            * 将获取到的地址

            * 组合后放在StringBuilder对象中输出用

            */

            strReturn = sb.toString();

          }

        }

        catch(Exception e)

        {

          e.printStackTrace();

        }

        return strReturn;

      }

    }

    3.第三部分,实现两地理位置在MapView上路径导航

    编写DirectionTracks.java:

     package com.sharpandroid.navigation;

     

    import java.util.List;

    import java.util.Locale;

    import com.google.android.maps.GeoPoint;

    import com.google.android.maps.MapActivity;

    import com.google.android.maps.MapController;

    import com.google.android.maps.MapView;

    import android.content.Context;

    import android.content.Intent;

    import android.location.Address;

    import android.location.Criteria;

    import android.location.Geocoder;

    import android.location.Location;

    import android.location.LocationListener;

    import android.location.LocationManager;

    import android.net.Uri;

    import android.os.Bundle;

    import android.view.View;

    import android.widget.Button;

    import android.widget.EditText;

    import android.widget.TextView;

     

    public class DirectionTracks extends MapActivity {

        private MapView mapView;

        private MapController mapController;

        private TextView textView;

        private EditText editText;

        private int intzoomlevel;

        private Location mlocation = null;

        private LocationManager locationManager;

        private String strLocationPrivider = "";

        private GeoPoint fromGeoPoint ,toGeoPoint;

        private Button button1;

        private Button button2;

        private Button button3;

       

         @Override

        public void onCreate(Bundle savedInstanceState) {

            super.onCreate(savedInstanceState);

            setContentView(R.layout.navigation);

            /*得到*/

             textView = (TextView) this.findViewById(R.id.myTextView1);

             /*得到输入目的地址的EditText控件*/

             editText = (EditText) this.findViewById(R.id.myEditText1);

             /*在editText中得到默认的地址*/

             editText.setText(getResources().getText(R.string.str_default_

    address).toString());

             /*创建MapView对象*/

             mapView = (MapView) this.findViewById(R.id.myMapView1);

             /*通过MapView对象得到mapView的控制器*/

             mapController =  mapView.getController();

             /* 设置MapView的显示选项(卫星、街道) */

            mapView.setTraffic(true);

            mapView.setSatellite(false);

            mapView.setStreetView(true);

            /* 默认放大的层级 */

            intzoomlevel = 15;

            /*设值mapView此时的放大级别*/

            mapController.setZoom(intzoomlevel);

            /*通过系统服务得到定位服务管理器*/

           locationManager =  (LocationManager) getSystemService

    (Context.LOCATION_SERVICE);

           /*得到定位提供者*/

          getLocationProvider();

          /*得到当前位置即出发位置 */

          fromGeoPoint = getGeoByLocation(mlocation);

          /*实时更新MapView*/

          refreshMapViewByGeoPoint(fromGeoPoint, mapView, intzoomlevel);

          /*更新位置状态*/

          locationManager.requestLocationUpdates(strLocationPrivider, 2000,

    10, listener);

          /*触发导航事件*/

          button1  =  (Button) this.findViewById(R.id.myButton1);

          button1.setOnClickListener(new View.OnClickListener() {

           

            @Override

            public void onClick(View v) {

                if(editText.getText().toString()!=null){

                   

                    toGeoPoint = getGeoByAddress(editText.getText().

    toString());

                    Intent intent = new Intent();

                    intent.setAction(android.content.Intent.ACTION_VIEW);

                   

                    intent.setData(

                      Uri.parse("http://maps.google.com/maps?f=d&saddr=

    "+geoPointToString(fromGeoPoint)+

                            "&daddr="+geoPointToString(toGeoPoint)+"&h1=cn")

                    );

                    startActivity(intent);

            }

               

            }

        });

          /* 放大Map的Button */

          button2 =  (Button) this.findViewById(R.id.myButton2);

          button2.setOnClickListener(new View.OnClickListener() {

           

            @Override

            public void onClick(View v) {

                intzoomlevel ++;

                if (intzoomlevel > mapView.getMaxZoomLevel()) {

                    intzoomlevel = mapView.getMaxZoomLevel();

                }

                mapController.setZoom(intzoomlevel);

            }

        });

          /* 缩小Map的Button */

          button3 = (Button) this.findViewById(R.id.myButton3);

          button3.setOnClickListener(new View.OnClickListener() {

           

            @Override

            public void onClick(View v) {

                intzoomlevel --;

                if (intzoomlevel < 1) {

                    intzoomlevel = 1;

                }

                mapController.setZoom(intzoomlevel);

            }

        });

           

          }

         /**

          *

          * 将 geopoint里的经纬度以“String ,String”返回

          * @param gp

          * @return

          */

         private String geoPointToString(GeoPoint gp){

         String strturn ="";

         try {

                if(gp!=null){

                     double geoLatitude = (int)gp.getLatitudeE6()/1E6;

                     double geoLongitude = (int)gp.getLongitudeE6()/1E6;

                     strturn = String.valueOf(geoLatitude)+","+String.valueOf

    (geoLongitude);

                 }

            } catch (Exception e) {

               

                e.printStackTrace();

            }

         return strturn;

         }

         /**

          * 传入geopoint更新mapview里的google map

          * @param geoPoint

          * @param mapView

          * @param zoomLevel

          */

         public void refreshMapViewByGeoPoint

         (GeoPoint geoPoint ,MapView mapView ,int zoomLevel){

        try {

                mapView.displayZoomControls(true);

                mapController = mapView.getController();

                mapController.animateTo(geoPoint);

                mapController.setZoom(zoomLevel);

                mapView.setSatellite(false);

            } catch (Exception e) {

                e.printStackTrace();

            }

         

         }

         /**

          *

          * 通过文本框输入的地址得到其经纬度坐标

          * @param strSearchAddress

          * @return

          */

         private GeoPoint getGeoByAddress(String strSearchAddress){

         GeoPoint gp = null;

            try {

                    if(strSearchAddress != null){

                         Geocoder geocoder = new Geocoder

    (DirectionTracks.this,Locale.getDefault());

                         List<Address> listAddresses = geocoder.

    getFromLocationName

                            (strSearchAddress, 1);

                         if(!listAddresses.isEmpty()){

                             Address addressLocation = listAddresses.get(0);

                             double geolatitude = addressLocation.

    getLatitude()*1E6;

                             double geolongitude = addressLocation.

    getLongitude()*1E6;

                             gp = new GeoPoint((int)geolatitude, (int)

    geolongitude);

                        }

                    }

                } catch (Exception e) {

                    e.printStackTrace();

                }

         

         return gp;

         }

         /**

          * 得到当手机GPS坐标更新时的事件

          */

         public LocationListener listener = new LocationListener() {

           

            @Override

            public void onStatusChanged(String provider, int status, Bundle

    extras) {

               

            }

           

            @Override

            public void onProviderEnabled(String provider) {

                // TODO Auto-generated method stub

               

            }

           

            @Override

            public void onProviderDisabled(String provider) {

                // TODO Auto-generated method stub

               

            }

           

            @Override

            public void onLocationChanged(Location location) {

                mlocation= location;

                fromGeoPoint = getGeoByLocation(location);

                refreshMapViewByGeoPoint(fromGeoPoint, mapView, intzoomlevel);

            }

        };

        /**

         * 传入location对象,取回其GeoPoint对象

         * @param location

         * @return

         */

         private GeoPoint getGeoByLocation(Location location){

         GeoPoint geoPoint =null;

          try {

                if (location != null) {

                    double geoLatitude = location.getLatitude()*1E6;

                    double geoLongitude = location.getLongitude()*1E6;

                    geoPoint = new GeoPoint((int)geoLatitude,

    (int)geoLongitude);

                   

                }

            } catch (Exception e) {

               e.printStackTrace();

            }

         return geoPoint;

         }

         /**

          * 取得LocationProvider

          */

         public void getLocationProvider(){

            

         try {

                Criteria criteria = new Criteria();

                 criteria.setAccuracy(Criteria.ACCURACY_FINE);

                 criteria.setAltitudeRequired(false);

                 criteria.setBearingRequired(false);

                 criteria.setCostAllowed(true);

                 criteria.setPowerRequirement(Criteria.POWER_LOW);

                 criteria.setSpeedRequired(true);

                strLocationPrivider =  locationManager.getBestProvider

    (criteria, true);

                mlocation = locationManager.getLastKnownLocation

    (strLocationPrivider);

            } catch (Exception e) {

                textView.setText(e.toString());

                e.printStackTrace();

            }

       

         }

     

        @Override

        protected boolean isRouteDisplayed() {

            // TODO Auto-generated method stub

            return false;

        }

    }

    4.第四部分,功能整合

    编写TravelTracks.java:

     package com.sharpandroid.navigation;

     

    import android.app.Activity;

    import android.content.Intent;

    import android.os.Bundle;

    import android.view.View;

    import android.widget.Button;

     

    public class TravelTracks extends Activity {

       private Button button1;

       private Button button2;

        @Override

        public void onCreate(Bundle savedInstanceState) {

            super.onCreate(savedInstanceState);

            setContentView(R.layout.main);

            button1 = (Button) this.findViewById(R.id.Resolvebutton);

            button1.setOnClickListener(new View.OnClickListener() {

               

                @Override

                public void onClick(View v) {

                   Intent intent = new Intent (TravelTracks.this,

    PositionConvert.class);

                   startActivity(intent);

                }

            });

           

           button2 =  (Button) this.findViewById(R.id.NavigationButton);

           button2.setOnClickListener(new View.OnClickListener() {

           

            @Override

            public void onClick(View v) {

                Intent intent = new Intent(TravelTracks.this,

    DirectionTracks.class);

                 startActivity(intent);

            }

        });

        }

    }

  • 相关阅读:
    iOS Sprite Kit最新特性Physics Field虚拟物理场Swift測试
    java中接口的定义与实现
    2014年百度之星程序设计大赛
    MyEclipse7.0破解下载
    C++中的explicitkeyword
    抽象工厂模式
    《Head First 设计模式》学习笔记——策略模型
    MFC原创:三层架构01(人事管理系统)DAL
    Design Pattern Singleton 单一模式
    C学习笔记之预处理指令
  • 原文地址:https://www.cnblogs.com/fx2008/p/3132179.html
Copyright © 2011-2022 走看看