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) 在地图指定位置添加“标记“,并尝试选中它 的相关文章

  • Java:无法从同一包中的不同类访问静态变量

    这很奇怪 因为我有一个可以访问 Frame dimension getWidth 的 Character 类 及其伙伴 getHeight 但是当我想在 Map 类中使用它时 Eclipse 强调了它并且无法给我反馈 运行该程序最终会出现
  • 打印星号的 ASCII 菱形

    我的程序打印出这样的钻石 但只有当参数或菱形的每一面为4 例如如果我输入6 底部三角形的间距是错误的 我一直在试图找出答案 当参数改变时 底部的三角形不会改变 只有顶部的三角形会改变 它只适用于输入4 public static void
  • 不同类型的数组

    是否可以有一个包含两种不同类型数据的数组 我想要一个包含双精度型和字符串的数组 我尝试过 ArrayList
  • Spring Data JPA 选择不同

    我有一个情况 我需要建立一个select distinct a address from Person a 其中地址是 Person 内的地址实体 类型的查询 我正在使用规范动态构建我的 where 子句并使用findAll Specifi
  • org.hibernate.QueryException:无法解析属性:文件名

    我正在使用休眠Criteria从列中获取值filename在我的桌子上contaque recording log 但是当我得到结果时 它抛出异常 org hibernate QueryException 无法解析属性 文件名 com co
  • 是否可以使用 Flying Saucer (XHTML-Renderer) 将 css 解析为类路径资源?

    我正在尝试将资源打包到 jar 中 但我无法让 Flying Saucer 在类路径上找到 css 我无法轻松构建 URL 来无缝解决此问题 https stackoverflow com questions 861500 url to l
  • 如何将 Mat (opencv) 转换为 INDArray (DL4J)?

    我希望任何人都可以帮助我解决这个任务 我正在处理一些图像分类并尝试将 OpenCv 3 2 0 和 DL4J 结合起来 我知道DL4J也包含Opencv 但我认为它没什么用 谁能帮我 如何转换成 INDArray 我尝试阅读一些问题here
  • Java Swing For mac 中的 DJ Native Swing 浏览器

    我有一个用 Swing 制作的 Java 应用程序 并且使用了一个 DJ Native Swing 浏览器 当我尝试在 OS X 上使用它时 它抛出了一个NoClassDefFoundError尽管我添加了 swt jar 但始终如此 有人
  • 如何避免 ArrayIndexOutOfBoundsException 或 IndexOutOfBoundsException? [复制]

    这个问题在这里已经有答案了 如果你的问题是我得到了java lang ArrayIndexOutOfBoundsException在我的代码中 我不明白为什么会发生这种情况 这意味着什么以及如何避免它 这应该是最全面的典范 https me
  • 在 SWT/JFace RCP 应用程序中填充巨大的表

    您将如何在 SWT 表中显示大量行 巨大是指超过 20K 行 20 列的东西 不要问我为什么需要展示那么多数据 这不是重点 关键是如何让它尽可能快地工作 这样最终用户就不会厌倦等待 每行显示某个对象的实例 列是其属性 一些 我想使用 JFa
  • QuerySyntaxException:无法找到类

    我正在使用 hql 生成 JunctionManagementListDto 类的实际 Java 对象 但我最终在控制台上出现以下异常 org hibernate hql internal ast QuerySyntaxException
  • java库维护数据库结构

    我的应用程序一直在开发 所以偶尔 当版本升级时 需要创建 更改 删除一些表 修改一些数据等 通常需要执行一些sql代码 是否有一个 Java 库可用于使我的数据库结构保持最新 通过分析类似 db structure version 信息并执
  • 返回 Java 8 中的通用函数接口

    我想写一种函数工厂 它应该是一个函数 以不同的策略作为参数调用一次 它应该返回一个函数 该函数根据参数选择其中一种策略 该参数将由谓词实现 嗯 最好看看condition3为了更好的理解 问题是 它没有编译 我认为因为编译器无法弄清楚函数式
  • 使用布尔值进行冒泡排序以确定数组是否已排序

    我有以下用于冒泡排序的代码 但它根本不排序 如果我删除布尔值那么它工作正常 我知道 由于我的 a 0 小于所有其他元素 因此没有执行交换 任何人都可以帮助我解决这个问题 package com sample public class Bub
  • JMenu 中的文本居中

    好吧 我一直在网上寻找有关此问题的帮助 但我尝试的任何方法似乎都不起作用 我想让所有菜单文本都集中在菜单按钮上 当我使用setHorizontalTextPosition JMenu CENTER 没有变化 事实上 无论我使用什么常量 菜单
  • Hamcrest Matchers - 断言列表类型

    问题 我目前正在尝试使用 Hamcrest Matchers 来断言返回的列表类型是特定类型 例如 假设我的服务调用返回以下列表 List
  • OpenCSV:将嵌套 Bean 映射到 CSV 文件

    我正在尝试将 bean 映射到 CSV 文件 但问题是我的 bean 具有其他嵌套 bean 作为属性 所发生的情况是 OpenCSV 遍历属性找到一个 bean 然后进入其中并映射该 bean 内的所有数据 如果找到另一个 bean 它就
  • 如何使用play框架上传多个文件?

    我在用play framework 2 1 2 使用java我正在创建视图来上传多个文件 我的代码在这里 form action routes upload up enctype gt multipart form data
  • org.apache.commons.net.io.CopyStreamException:复制时捕获 IOException

    我正在尝试使用以下方法中的代码将在我的服务器中创建的一些文件复制到 FTP 但奇怪的是我随机地低于错误 我无法弄清楚发生了什么 Exception org apache commons net io CopyStreamException
  • Spring表单ModelAttribute字段验证避免400 Bad Request错误

    我有一个ArticleFormModel包含正常发送的数据html form由 Spring 使用注入 ModelAttribute注释 即 RequestMapping value edit method RequestMethod PO

随机推荐

  • 确知信号分析

    写在前面 现代通信原理是电子系的一门专业必修课 介绍了通信原理系统的基本概念 基本原理 基本技术以及设计和分析的方法 俗话说得好 实践出真知 要想学好这门课 必要的动手实践是必不可少的 实践是基于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 再次点击按钮后 这时 就可以点击刚刚添加的 红色的位置标记 就可以查看到 该标记关联到得属性值 布局