arcgis for android 學習 - (5) 在地圖指定位置添加“標記“,並嘗試選中它


 我做一個例子。

   

1.首先顯示一個地圖。

2. 點擊”添加要素“按鈕后再次點擊地圖,將會在地圖上添加”紅色的位置標記“。 

 

3.再次點擊按鈕后,這時,就可以點擊剛剛添加的” 紅色的位置標記“,就可以查看到”該標記關聯到得屬性值“

 

布局:

 <?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"
    
>
     < LinearLayout
        
android:layout_width ="fill_parent"
        android:layout_height
="wrap_content"   >

         < Button
            
android:id ="@+id/btn1"
            android:layout_width
="wrap_content"
            android:layout_height
="wrap_content"
            android:text
="添加一個要素"   />
     </ LinearLayout >

     <!--  MapView layout and initial extent  -->
     < com.esri.android.map.MapView
          
android:id ="@+id/map"
          android:layout_width
="fill_parent"
          android:layout_height
="fill_parent"
          
>
       </ com.esri.android.map.MapView >
</ LinearLayout >

代碼:

 package demo.GraphicsLayerLib;


import java.util.HashMap;
import java.util.Map;

import android.app.Activity;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

import com.esri.android.map.GraphicsLayer;
import com.esri.android.map.InfoTemplate;
import com.esri.android.map.Layer;
import com.esri.android.map.MapView;
import com.esri.android.map.event.OnSingleTapListener;
import com.esri.core.geometry.Envelope;
import com.esri.core.geometry.Geometry;
import com.esri.core.geometry.Point;
import com.esri.core.map.Graphic;
import com.esri.core.renderer.SimpleRenderer;
import com.esri.core.symbol.PictureMarkerSymbol;
import com.esri.core.symbol.Symbol;

public  class GraphicsLayerDemoActivity  extends Activity {
    Button btn1;
    MapView mMapView;
     final String URL_STREET_COLD = "http://cache1.arcgisonline.cn/ArcGIS/rest/services/ChinaOnlineStreetCold/MapServer";
    GraphicsLayer mGraphicsLayer;
     final  int STATE_ADD_GRAPHIC = 1;  //  進入 “添加graphics狀態,這時候單擊地圖時操作就添加graphics
     final  int STATE_SHOW = 2; //  “選中graphics狀態“,這時候單擊地圖時操作就
                                
//  選擇一個graphics,並顯示該graphics的附加信息”
     int m_State; //  狀態

     /**  Called when the activity is first created.  */
    @Override
     public  void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        m_State = STATE_SHOW;

        btn1 = (Button) findViewById(R.id.btn1);
        btn1.setText("准備添加要素");
        btn1.setOnClickListener( new OnClickListener() {

            @Override
             public  void onClick(View arg0) {
                 //  切換按鈕狀態,第一次點擊本按鈕后進入 “添加graphics狀態,這時候單擊地圖時操作就添加graphics”
                
//  第一次點擊本按鈕后進入 “選中graphics狀態“,這時候單擊地圖時操作就
                
//  選擇一個graphics,並顯示該graphics的附加信息”
                m_State = m_State == STATE_ADD_GRAPHIC ? STATE_SHOW
                        : STATE_ADD_GRAPHIC;
                 if (m_State == STATE_ADD_GRAPHIC) {
                    btn1.setText("單擊地圖將添加要素,單擊本按鈕結束");
                }  else {
                    btn1.setText("准備添加要素");
                }
            }
        });

        mMapView = (MapView) findViewById(R.id.map);
         //  Add layer to MapView
        mMapView.addLayer( new com.esri.android.map.ags.ArcGISTiledMapServiceLayer(
                URL_STREET_COLD));

        Envelope initextext =  new Envelope(12899459.4956466, 4815363.65520802,
                13004178.2243971, 4882704.67712717);
        mMapView.setExtent(initextext);

         //  設定單擊事件
        mMapView.setOnSingleTapListener(m_OnSingleTapListener);
    }

    OnSingleTapListener m_OnSingleTapListener =  new OnSingleTapListener() {
         int m_Char = 65;

         public  void onSingleTap( float x,  float y) {
             if (!mMapView.isLoaded()) {
                 return;
            }
             if (m_State == STATE_ADD_GRAPHIC) {
                 //  獲得圖層
                AddNewGraphic(x, y);
            }  else { //  選中 Graphics
                SelectOneGraphic(x, y);
            } //  end if else
        } //  end method

        
         private  void SelectOneGraphic( float x,  float y) {
             //  獲得圖層
            GraphicsLayer layer = GetGraphicLayer();
             if (layer !=  null && layer.isInitialized() && layer.isVisible()) {
                Graphic result =  null;
                 //  檢索當前 光標點(手指按壓位置)的附近的 graphic對象
                result = GetGraphicsFromLayer(x, y, layer);
                 if (result !=  null) {
                     //  獲得附加特別的屬性
                    String msgTag = (String) result
                            .getAttributeValue("tag");
                     //  顯示提示
                    AlertMsg(msgTag);
                } //  end if
            } //  end if
        }

         private  void AddNewGraphic( float x,  float y) {
            GraphicsLayer layer = GetGraphicLayer();
             if (layer !=  null && layer.isInitialized() && layer.isVisible()) {
                 //  轉換坐標
                Point pt = mMapView.toMapPoint( new Point(x, y));
                 //  附加特別的屬性
                Map<String, Object> map =  new HashMap<String, Object>();
                map.put("tag", "" + ( char) (m_Char++));
                 //  創建 graphic對象
                Graphic gp1 = CreateGraphic(pt, map);
                 //  添加 Graphics 到圖層
                layer.addGraphic(gp1);
            }
        }
    };

     /*
     * 從一個圖層里里 查找獲得 Graphics對象. x,y是屏幕坐標,layer
     * 是GraphicsLayer目標圖層(要查找的)。相差的距離是50像素。
     
*/
     private Graphic GetGraphicsFromLayer( double xScreen,  double yScreen,
            GraphicsLayer layer) {
        Graphic result =  null;
         try {
             int[] idsArr = layer.getGraphicIDs();
             double x = xScreen;
             double y = yScreen;
             for ( int i = 0; i < idsArr.length; i++) {
                Graphic gpVar = layer.getGraphic(idsArr[i]);
                 if (gpVar !=  null) {
                    Point pointVar = (Point) gpVar.getGeometry();
                    pointVar = mMapView.toScreenPoint(pointVar);
                     double x1 = pointVar.getX();
                     double y1 = pointVar.getY();
                     if (Math.sqrt((x - x1) * (x - x1) + (y - y1) * (y - y1)) < 50) {
                        result = gpVar;
                         break;
                    }
                }
            }
        }  catch (Exception e) {
             return  null;
        }
         return result;
    }

     /*
     * 創建一個Graphic , 參數geometry是屏幕坐標位置,map是附加的屬性參數
     
*/
     private Graphic CreateGraphic(Point geometry, Map<String, Object> map) {
        GraphicsLayer layer = GetGraphicLayer(); //  獲得圖層
        Drawable image = GraphicsLayerDemoActivity. this.getBaseContext()
                .getResources().getDrawable(R.drawable.pop);
        PictureMarkerSymbol symbol =  new PictureMarkerSymbol(image);

         //  構建graphic
        
//  Graphic g = new Graphic(geometry, symbol);
        Graphic g =  new Graphic(geometry, symbol, map,  null);
         return g;
    }

     /*
     * 獲得 GetGraphicLayer
     
*/
     private GraphicsLayer GetGraphicLayer() {
         if (mGraphicsLayer ==  null) {
            mGraphicsLayer =  new GraphicsLayer();
            mMapView.addLayer(mGraphicsLayer);
        }
         return mGraphicsLayer;
    }

     void AlertMsg(String str, Object... arg) {
        String msg = String.format(str, arg);
        Toast.makeText( this, msg, 2).show();
        Log.i("AlertMsg", msg);
    }

    @Override
     protected  void onDestroy() {
         super.onDestroy();
    }

    @Override
     protected  void onPause() {
         super.onPause();
        mMapView.pause();
    }

    @Override
     protected  void onResume() {
         super.onResume();
        mMapView.unpause();
    }

}

 

 源代碼下載

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM