arcgis for android 学习 - (5) 在地图指定位置添加“标记“,并尝试选中它

2023-11-18

 我做一个例子。

   

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();
    }

}

 

 源代码下载

 

转载于:https://www.cnblogs.com/vir56k/archive/2012/06/05/2536065.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

arcgis for android 学习 - (5) 在地图指定位置添加“标记“,并尝试选中它 的相关文章

随机推荐

  • 确知信号分析

    写在前面 现代通信原理是电子系的一门专业必修课 介绍了通信原理系统的基本概念 基本原理 基本技术以及设计和分析的方法 俗话说得好 实践出真知 要想学好这门课 必要的动手实践是必不可少的 实践是基于Matlab上实现仿真的 Matlab具有函
  • Access denied for user XX

    解决方法 将pom xml中的mysql connector java降低版本 直接去maven仓库复制 https mvnrepository com 比如
  • python+flask+mysql实现数据可视化

    准备工作 1 Python3 2 Echarts 下载地址 echarts 3 Flask 项目结构 创建DB 使用sqlite数据库 coding utf 8 author liudinglong software pycharm fil
  • 1.R语言基础知识

    目录 一 R语言的介绍 R语言的下载与按照 Rstudio R包的安装 工作空间管理 基本运算 二 R的数据结构 1 数据类型 2 数据类型的转换和判断 3 数据结构 三 导入 导出数据 获取内置数据集 获取其他格式的数据 四 数据框的常用
  • AI绘画指南:在CentOS7中安装Stable Diffusion WebUI

    一 安装GPU驱动 1 1 购买云服务器 在腾讯云选购一台GPU型的服务器 最好的境外的 境外的服务器后面关于镜像加速的步骤都可以跳过 购买成功之后腾讯的站内信会发送初始的密码给你 登录成功后会自动帮我们安装相关的驱动 提示整个过程大概需要
  • LeetCode-283. 移动零【数组,双指针】

    LeetCode 283 移动零 数组 双指针 题目描述 解题思路一 首先想到的是双指针 但是不行 非零元素的位置会改变 解题思路二 改进的是每次从当前0元素的位置取后面第一个非0元素替换过来 替换之和那个break非常重要 解题思路三 优
  • Future 和 Callable

    一 Runnable 缺陷 不能返回一个返回值 不能抛出 checked Execption 二 Callable接口 类似于Runnable 被其他线程执行的任务 实现call方法 有返回值 三 Future的作用 Callable和Fu
  • 【infiniband】 MAD、 uMAD、Verbs、RDMACM

    1 MAD Management Datagram MAD是InfiniBand网络中用于管理和配置的数据报文 它包含了各种类型的管理操作 如查询端口状态 配置端口参数等 MAD通常用于执行网络管理任务 2 uMAD User MAD uM
  • 模板类 通用数组的实现

    实现自定义数组 重载 lt lt 运算符 并且数组可以使用自定义类 头文件 ifndef MYARRAY H define MYARRAY H include
  • pandas datetime与时间戳互相转换,字符串转换datetime

    参考pandas to datetime的api 字符串转换为pandas datetime 通过to datetime函数可以把字符串转换为pandas datetime df pd DataFrame date 2011 04 24 0
  • python的xlrd、xlwt模块/pymsql使用

    xlrd模块 https www cnblogs com machangwei 8 p 10736528 html label0 xlwt模块https www cnblogs com machangwei 8 p 10738244 htm
  • Filter过滤器实现权限拦截

    一 要求 用户登陆之后才能进入主页 用户注销之后不能进入首页 二 思路 用户登陆之后 向session中放入用户的数据 进入主页的时候要判断用户是否已经登陆 在过滤器中实现 public void doFilter ServletReque
  • 电脑怎样连接打印机?分享4个简单操作!

    为了更方便学习 我买了一个打印机来打印需要用的资料 但是操作了半天还是没连接上 想请问一下有经验的朋友是怎么将打印机与电脑进行连接的呢 在现代人的工作和生活中 打印机是一个重要的设备 我们可以利用打印机进行资料 文件等的打印 但是也会有很多
  • SpringBoot调用PageHelper.startPage(Object params)报错:分页查询缺少必要的参数:XXX

    问题描述 项目中使用了MyBatis分页插件 调用以下方法实现分页 无论传入JavaBean还是Map都报错 分页查询缺少必要的参数 XXX Map
  • 【Docker】云原生利用Docker确保环境安全、部署的安全性、安全问题的主要表现和新兴技术产生

    前言 Docker 是一个开源的应用容器引擎 让开发者可以打包他们的应用以及依赖包到一个可移植的容器中 然后发布到任何流行的Linux或Windows操作系统的机器上 也可以实现虚拟化 容器是完全使用沙箱机制 相互之间不会有任何接口 云原生
  • Python学习 第二章 数据类型

    Python学习 第二章 数据类型上 1 数字 1 1 整型 int 1 2 浮点型 float 1 3 布尔类型 bool 1 4 代码实现 1 5 复数 2 字符串 string 2 1 如果字符串内容中出现了引号 2 2 代码实现 2
  • pandas生成excel文件

    可以使用pandas中的to excel 函数将DataFrame数据写入Excel文件 例如 import pandas as pd 创建测试数据 data name Mike John Bob age 25 32 45 city New
  • STM-32:SPI通信协议/W25Q64简介—软件SPI读写W25Q64

    目录 一 SPI简介 1 1电路模式 1 2通信原理 1 3SPI时序基本单元 1 3 1起始和终止 1 3 2交换字节 二 W25Q64 2 1W25Q64简介 2 2W25Q64硬件电路 2 3W25Q64框图 2 4Flash操作注意
  • double类型精度丢失问题以及解决方法

    double类型精度丢失问题 1 加法运算 public static void main String args double number1 1 double number2 20 2 double number3 300 03 dou
  • arcgis for android 学习 - (5) 在地图指定位置添加“标记“,并尝试选中它

    我做一个例子 1 首先显示一个地图 2 点击 添加要素 按钮后再次点击地图 将会在地图上添加 红色的位置标记 3 再次点击按钮后 这时 就可以点击刚刚添加的 红色的位置标记 就可以查看到 该标记关联到得属性值 布局