【Android论文栏目提醒】:本文主要为网学会员提供“Android UCMap研究结果-包含客户端基本功能 doc - 讲义教程”,希望对需要Android UCMap研究结果-包含客户端基本功能 doc - 讲义教程网友有所帮助,学习一下!
UCMap研究结果汇报 1. UCMap基础简介 2. 使用UCMap在线和离线显示Google Maps 3. 通过shape数据生成矢量地图并显示即UCMap地图配置过程并显示 4. 矢量地图 与 Google Maps 瓦片地图叠加显示 5. 在矢量地图 与 瓦片地图叠加显示之后进行添加元素、移动元素、修改元素属性查看属性信息关键字查询路径查询开启捕捉关闭捕捉导出图层为shape数据。
6. UCMap常用API和功能方法封装 7. 研究过程中遇到的问题 1. UCMap基础简介 ucmap 是一款面向3G、支持 OGC 标准的移动GIS开发平台延伸了GIS 在手机端的应用它采用先进的SOA 架构支持WMS、WFS、WFS-T、WPS 等OGC 标准。
支持的主要功能 地图浏览支持地图的放大、缩小、平移 地图渲染支持地图样式的配置、矢量要素的查询渲染 地图查询支持属性查询、空间查询、以及属性和空间的混合查询 要素编辑支持要素的添加、删除、修改其中包括要素几何的节点编辑、属性编辑修改等 数据缓存支持瓦片服务器缓存、瓦片更新、客户端缓存、以及矢量数据的本地存储 影像叠加支持遥感影像数据的叠加并在其上采集、编辑数据 数据同步支持移动GIS、WEBGIS、桌面GIS的数据同步及时获取更新过的最新数据 空间分析支持空间查询分析 基站定位支持手机基站定位 GPS定位支持获取手机GPS定位数据实现GPS定位监控 动态图层支持动态图层在底图上叠加动态要素点比如GPS等动态刷新的点 报表分析支持表格、折线图、饼图、柱状图等统计报表 扩展定制高可扩展性视频、图象等采集、显示、上传与移动MIS、移动OA的无缝集成以及各种其他服务的组合 跬步API和开发文档下载地址http://www.creable.cn/kuibu/xiazai.asp 2. 使用UCMap在线显示Google Maps 1.新建一个
Android工程UCMapProgect将UCMap的API包libs./libs添加到UCMapProgect工程目录通过Eclipse导入UCMapProgect 2.新建OpenSourceMap.xml./sdcard/OpenSourceMap.xml将其拷贝到手机的sdcard根目录 ltxml versionquot1.0quot encodingquotUTF-8quotgt ltmap maxExtentquot033554432033554432quot numberOfLayersquot1quot centerquot102.7103525.045914quotgt // 地图被加载显示时的初始中心点 ltlayergt lttypegtOpenSourceMaplt/typegt // InitZoomIndex 表示地图加载之后直接从第8 层开始显示google 的显示比例等级数为19 层bing 为18 层从0 开始 ltInitZoomIndexgt8lt/InitZoomIndexgt // InitMapType为“0”表示地图加载时以google 地图为数据源为“1”表示地图加载时以bing 地图为数据源。
在程序中也可以通过OpenSourceMap的setMapMode方法来实现数据源的切换。
ltInitMapTypegt0lt/InitMapTypegt ltMapTypegt ltTypeNamegtGOOGLElt/TypeNamegt ltGoogleMapVersiongtm169000000lt/GoogleMapVersiongt ltGoogleSatelliteVersiongts104lt/GoogleSatelliteVersiongt ltGoogleLabelsVersiongth169000000lt/GoogleLabelsVersiongt lt/MapTypegt ltMapTypegt ltTypeNamegtBINGlt/TypeNamegt ltBingMapVersiongt69lt/BingMapVersiongt ltBingSatelliteVersiongtlt/BingSatelliteVersiongt ltBingLabelsVersiongtlt/BingLabelsVersiongt lt/MapTypegt lt/layergt lt/mapgt 3.在UCMapProgect中可以通过以下代码来加载地图数据 boolean re MapLoader.loadMapXMLmapView.getMapControl quot/sdcard/OpenSourceMap.xmlquot 3. 通过shape数据生成矢量地图并显示即UCMap地图配置过程并显示 1. UCMap地图配置软件的介绍 ./ UCMap地图配置程序 A导入所有的图层即shape矢量数据选择配置好的矢量地图的存放路径 B如果生成的矢量地图要与瓦片地图叠加显示那么必须创建一个假的图层为了避免再叠加之后显示出来的图层会少掉第一个图层的情况如果矢量地图是单独显示的那么可以不用添加这个假图层如昆明电力矢量地图假图层在实际的现实中没有任何的效果 C对各个矢量数据进行分别配置 部分参数表示的意义 自动标注字段在地图上会将你选择的字段对应的值显示在该要素旁边 最小显示比例显示比例越小地图越大即当地图的显示比例小于4.139293e-05时变电设备不可见 最大显示比例显示比例越大地图越小即当地图的显示比例大于1.415978e-04时变电设备显示可见 Google Maps 的显示比例分为19级即262144.00 131072.01 65536.02 32768.03 16384.04 8192.05 4096.06 2048.07 1024.08 512.09 256.010 128.011 64.012 32.013 16.014 8.015 4.016 2.017 1.018括号里的是显示比例对应的缩放级别。
最大最小显示比例与Google Maps地图的显示比例的换算方法 Google Maps 的显示比例 最大小显示比例/0.00001f其中0.00001f为UCMap设置的地图 zoom rate 1.415978e-04 x 1e5 14.15978 即在地图缩放级别为15级的时候开始显示 设置个图层显示的不同比例是为了让不同的图层在不同的缩放级别显示这样看上去更直观而不会一下子都显示导致地图加载显示太慢或内存过大程序崩溃。
D配置好之后点击生成地图就会在指定的目录下生成三个矢量地图 Lib中存放的是矢量地图中各层所使用到的图片信息map.dat为地图数据map.ini为各层的参数信息 2.在手机sdcard中新建目录cache/kmnx/将上面生成的矢量地图数据拷贝到kmnx文件夹中。
3.通过以下代码在程序中加载生成的矢量地图并显示 MapControl mapControlgetMapControl if mapControl.getMapnull mapControl.loadMapquotsdcard/kmnx/map.iniquot byte0 mapControl.setPanTool 4. 矢量地图 与 Google Maps 瓦片地图叠加显示 1.使用TileMaker工具抓取Google Maps瓦片地图数据。
A打开TileMaker.exe所在目录./TileMaker从地址栏中复制TileMaker.exe所在的路径如E:complany工作记录UCMap研究结果汇报TileMaker Bcmd打开电脑的命令行窗口粘贴路径进到TileMaker.exe所在目录 C使用以下命令抓取Google Maps 卫星地图数据 TileMaker 102.415237 102.985153 24.83348 25.19935 1 2 17 命令行说明如下 TileMaker最小经度 最大经度 最小纬度 最大纬度 种类0表示普通地图1表示卫星地图 起始缩放等级从0开始 结束缩放等级建议别超过16 D命令行执行结束之后会在TileMaker.exe所在目录生成一个cache文件夹将http://www.creable.cn/kuibu/xiazai.asp 下载下来的cache文件夹中的offset.dat和offset.ind文件拷贝到这个生成的cache文件夹中。
2.将步骤1中的cache复制到手机的sdcard根目录中 3.新建OpenSourceMapWithLocal.xml./sdcard/OpenSourceMapWithLocal.xml将其拷贝到手机的sdcard根目录 ltxml versionquot1.0quot encodingquotUTF-8quotgt ltmap maxExtentquot033554432033554432quot numberOfLayersquot1quot centerquot102.7103525.045914quotgt // 地图被加载显示时的初始中心点 ltlayergt lttypegtOpenSourceMaplt/typegt // InitZoomIndex 表示地图加载之后直接从第8 层开始显示google 的显示比例等级数为19 层bing 为18 层从0 开始 ltInitZoomIndexgt8lt/InitZoomIndexgt // InitMapType为“0”表示地图加载时以google 地图为数据源为“1”表示地图加载时以bing 地图为数据源。
在程序中也可以通过OpenSourceMap的setMapMode方法来实现数据源的切换。
ltInitMapTypegt0lt/InitMapTypegt ltMapTypegt ltTypeNamegtGOOGLElt/TypeNamegt ltGoogleMapVersiongtm169000000lt/GoogleMapVersiongt ltGoogleSatelliteVersiongts104lt/GoogleSatelliteVersiongt ltGoogleLabelsVersiongth169000000lt/GoogleLabelsVersiongt lt/MapTypegt ltMapTypegt ltTypeNamegtBINGlt/TypeNamegt ltBingMapVersiongt69lt/BingMapVersiongt ltBingSatelliteVersiongtlt/BingSatelliteVersiongt ltBingLabelsVersiongtlt/BingLabelsVersiongt lt/MapTypegt ltLocalMapgt/sdcard/kmnx/map.inilt/LocalMapgt // 加载矢量地图所在的路径 lt/layergt lt/mapgt 4.在程序中叠加矢量地图和瓦片地图数据并显示 / 加载地图 第一个参数 MapControl 对象 第二个参数xml文件所在路径 第三个参数 如果你的离线地图缓存不叫cache比如叫做abc那这个参数就是quotabcquot传入null表示google缓存文件夹名不变还是默认的cache 第四个参数0表示电子地图模式1表示卫星模式 第五个参数设置地图的zoom rate google坐标不是经纬度必须设置Zoom Rate才能显示出被叠加的矢量地图 第五个参数true表示启用离线地图模式false表示启用在线地图模式 / MapLoader.loadMapXMLmapView.getMapControl quot/sdcard/OpenSourceMapWithLoca.xmlquotnull10.00001ftrue // 启用GPS mapView.getMapControl.setCustomDrawnew GPSCustomDrawmapView.getMapControl mapView.getMapControl.setPanTool 5.UCMap离线显示Google Maps MapLoader.loadMapXMLmapView.getMapControl quot/sdcard/OpenSourceMap.xmlquotnull10.00001ftrue // 启用GPS mapView.getMapControl.setCustomDrawnew GPSCustomDrawmapView.getMapControl mapView.getMapControl.setPanTool 5. 在矢量地图 与 瓦片地图叠加显示之后进行添加元素、移动元素、修改元素属性查看属性信息关键字查询路径查询开启捕捉关闭捕捉导出图层为shape数据。
主要都是代码的实现详见UCmap_demo这里只做结果演示 A 添加要素变电设备可以添加点要素如变电设备线要素如电线杠面要素如湖泊 B 移动要素变电设备将设备从延安医院移到天恒大酒店附近 C修改要素变电设备将新添加的变电设备改GB为更名新添加的变电设备 C 查看要素信息 D 删除要素变电设备选中之后长按屏幕即可删除该要素 E 关键字查询关键字为“云南大学” F 路经查询查询从白塔路昆明饭店附近到昆明火车站的路径 G 属性定位即根据属性的某一个标注字段的值定位该属性的位置以变电设备的CODEtttt为例加载地图之后直接定位到这个设备 H 开启捕捉在几个电线杆直接连上电力线点击添加电力线之后再点击开启捕捉即可在地图上出现很多绿色的待捕捉点也就是标注出电杆所在的位置 I导出shape文件可以讲任何一个图层直接导出为shape的文件当时不能实现对一个图层的局部进行单独导出 注意 在叠加的地图上查询属性时不能使用 mapView.getMapControl.getDisplay.getDisplayTransformation.setZoom15 直接缩放到对应的级别因为setZoom是直接指定显示比例只有纯矢量才可以。
对于叠加的地图需要计算获得对应的缩放级别。
计算代码 byte current_zoomIndex mapView.getMapControl.getDisplay.getDisplayTransformation.getZoomIndex Layer searchLayer LayermapView.getMapControl.getMap.getLayer1 byte target_zoomIndex current_zoomIndexfloat zoom searchLayer.getMaximumScale/0.00001f / 计算searchLayer.getMaximumScale对应的级别 zooms:262144.0 131072.0 65536.0 32768.0 16384.0 8192.0 4096.0 2048.0 1024.0 512.0 256.0 128.0 64.0 32.0 16.0 8.0 4.0 2.0 1.0 19个比例显示地图显示由小到大下标从0-18对应缩放级别 / float zooms mapView.getMapControl.getDisplay.getDisplayTransformation.getZooms if zoomsnull byte countZooms bytezooms.length byte i0 for iltcountZoomsi if zoomsiltzoom target_zoomIndex i break 6.UCMap常用API和功能方法封装 1.在xml中添加MapView组建 ltcn.creable.gridgis.controls.MapView
android:idquotid/mapViewquot
android:layout_widthquotfill_parentquot
android:layout_heightquotwrap_contentquot /gt 2.功能一地图加载方法封装 / 加载地图 第一个参数 MapControl 对象 第二个参数xml文件所在路径 第三个参数 如果你的离线地图缓存不叫cache比如叫做abc那这个参数就是quotabcquot传入null表示google缓存文件夹名不变还是默认的cache 第四个参数0表示电子地图模式1表示卫星模式 第五个参数设置地图的zoom rate 第五个参数true表示启用离线地图模式false表示启用在线地图模式 / MapView mapViewMapViewfindViewByIdR.id.mapView boolean re MapLoader.loadMapXMLmapView.getMapControl quot/sdcard/OpenSourceMapWithLocal.xmlquotnull10.00001ftrue Log.dquotdebugquotquotre------:quotre 2.功能二 点击按钮放大地图方法封转 mapView.getMapControl.setZoomInTool mapView.getMapControl.getCurrentTool.action mapView.getMapControl.setPanTool 3.功能三点击按钮缩小地图方法封装 mapView.getMapControl.setZoomOutTool mapView.getMapControl.getCurrentTool.action mapView.getMapControl.setPanTool 4.功能四查询指定地点的相关信息的方法封装 if mapView.getMapControl.getMap.getLayerCountgt0 OpenSourceMapLayer oslayerOpenSourceMapLayermapView.getMapControl.getMap.getLayer0 oslayer.setLocalSearchListenernew ILocalSearchListener Override public void localSearchFinishedVector pois if poisnull return int sizepois.size StringBuilder sbnew StringBuilder for int i0iltsizei cn.creable.ucmap.OpenSourceMapLayerPOI poicn.creable.ucmap.OpenSourceMapLayerPOIpois.geti sb.appendpoi.title sb.appendquotnquot sb.appendquot所在城市quotpoi.city sb.appendquotnquot sb.appendquot详细地址quotpoi.address sb.appendquotnquot sb.appendquot电话号码quotpoi.phoneNumbers sb.deleteCharAtsb.length-1 //利用Toast显示查询到的信息点的名字 Bundle bnew Bundle b.putStringquotstringquotsb.toString Message msgnew Message msg.what1 msg.setDatab handler.sendMessagemsg sbnull oslayer.localSearchquot昆明云南大学quot 0 //显示等待界面 dlg new ProgressDialogact dlg.setProgressStyleProgressDialog.STYLE_SPINNER dlg.setTitlequot提示quot dlg.setMessagequot正在进行关键字查询请稍后quot dlg.setIconR.drawable.icon dlg.setIndeterminatefalse dlg.setCancelabletrue dlg.setButtonquot取消 quot new DialogInterface.OnClickListener Override public void onClickDialogInterface dialog int which OpenSourceMapLayer oslayerOpenSourceMapLayermapView.getMapControl.getMap.getLayer0 oslayer.cancel dlg.show 5.功能五Google Maps于Bing Maps地图数据源的切换使用方法封装 if mapView.getMapControl.getMap.getLayerCountgt0 OpenSourceMapLayer oslayerOpenSourceMapLayermapView.getMapControl.getMap.getLayer0 oslayer.getMapMode switch oslayer.getMapMode case GOOGLE: oslayer.setMapMode1break case BING: oslayer.setMapMode0break mapView.getMapControl.refresh 6.功能六地图模式切换方法封装 if mapView.getMapControl.getMap.getLayerCountgt0 OpenSourceMapLayer oslayerOpenSourceMapLayermapView.getMapControl.getMap.getLayer0 switch oslayer.getMode case 0: oslayer.setMode1 // 1表示卫星模式 break case 1: oslayer.setMode0 // 0表示电子地图模式 break mapView.getMapControl.refresh 7.功能七在地图上添加要素方法封装 // 创建一个Dialog用来显示所有的图层列表供用户选择 AlertDialog.Builder builder new AlertDialog.Builderact builder.setTitlequot请选择图层:quot layers.clear VectorltStringgt strsnew VectorltStringgt // 获得所有的图层添加才layers向量中 int countmapView.getMapControl.getMap.getLayerCount for int i0iltcounti ILayer layermapView.getMapControl.getMap.getLayeri if layer instanceof ShapefileLayer strs.addElementlayer.getName layers.addElementShapefileLayerlayer String layerNamesnew Stringstrs.size // 将layers向量中的图层名称复制到数组layerNames中 strs.copyIntolayerNames strsnull builder.setSingleChoiceItemslayerNames -1new DialogInterface.OnClickListener Override public void onClickDialogInterface dialog int which dialog.cancel if DisplayTransformationmapView.getMapControl. getDisplay.getDisplayTransformation.getFilternull DisplayTransformationmapView.getMapControl.getDisplay .getDisplayTransformation.getFilter.beginZoomRate // 判断当前所在地图级别上是否可以添加用户选择的添加的要素 float currentZoommapView.getMapControl.getDisplay.getDisplayTransformation.getZoom if layers.elementAtwhich.getMinimumScalegtcurrentZoom currentZoomgtlayers.elementAtwhich.getMaximumScale layers.elementAtwhich.getVisiblefalse Toast.makeTextApp.getInstance.getApplicationContext quot不能在这个图层上添加要素quot Toast.LENGTH_LONG.show // 注意您选择的图层当前未显示您会看不到添加之后的要素 if DisplayTransformationmapView.getMapControl. getDisplay.getDisplayTransformation.getFilternull DisplayTransformationmapView.getMapControl.getDisplay. getDisplayTransformation.getFilter.endZoomRate // 创建AddFeatureTool对象这个类是一个添加要素工具主要用来向图层中添加要素 AddFeatureTool toolnew AddFeatureToolmapView.getMapControllayers.elementAtwhich editTooltool tool.setOffset0 60 editTool.setListeneract // 设置当前的工具为添加要素工具 mapView.getMapControl.setCurrentTooltool AlertDialog dialogbuilder.create dialog.show 8.功能八删除要素方法封装 DeleteFeatureTool delToolnew DeleteFeatureToolmapView.getMapControl delTool.selector.setOffset0 60 editTooldelTool editTool.setListeneract mapView.getMapControl.setCurrentTooldelTool 调用之后即可长按地图选择将要删除的要素 9.功能九编辑要素方法封装 EditFeatureAttTool editTool2 new EditFeatureAttToolmapView.getMapControl editTool2.selector.setOffset0 60 editTooleditTool2 editTool.setListeneract mapView.getMapControl.setCurrentTooleditTool2 调用之后即可长按地图选择将要编辑的要素即可对要素的属性进行修改 10.功能10移动要素方法封装 EditFeatureTool editTool1 new EditFea.