ArcGIS for Android 100.3.0(14):移动地图包MMPK的使用

介绍了移动地图包(MMPK)的概念及其在ArcGIS Pro中的应用,MMPK是一种离线地图数据格式,支持地图加载、空间查询等功能,并且能够保留所有要素信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MobileMapPackage

移动地图包是ArcGIS Pro里新推出的一种离线地图数据,配合ArcGIS Runtime 100使用。

移动地图包是一个以“.mmpk”结尾的单独文件扩展,它可以将你的组织的maps、资源、道路网、或者坐标集成到一个文件。根据这些数据你的用户就可以清楚自己的方向,知道什么是他们所需要的,探索它们的附近的区域、有效的利用他们的资源去工作。地图数据包格式是面向当前手机设备的最佳格式,它小而快速,因为它是被压缩的且容易分享。相比于传统的地图包(tpk、vtpk等),它保存所有的feature要素。

mmpk可以将各种地图和数据资源打包,其中也包括矢量切片数据,同时这种格式地图包可轻松部署到终端使用,由于数据是存储于压缩的mobile GDB中,底图上展示的内容都是要素,可供查询和分析,同时支持路径规划、地址编码等高级分析应用。移动地图包支持离线应用。移动地图包既解决了移动端符号渲染问题,又结合矢量切片底图解决了地图包过大的问题,支持离线的查询、分析等各种应用场景。

MMPK文件里,我们可以直接读取的是ArcGISMap,也就是整个地图内容。就比如在桌面端渲染好的地图,无论是多少层,都可以直接打包在MMPK文件里,而我们在移动端可以直接读取出整个地图内容,直接加载就可以。

移动地图包的加载

   mMapView = (MapView) findViewById(R.id.mapview);

        final String mmpkPath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/SanFrancisco.mmpk";
        final MobileMapPackage mobileMapPackage = new MobileMapPackage(mmpkPath);
        mobileMapPackage.loadAsync();
        mobileMapPackage.addDoneLoadingListener(new Runnable() {
            @Override
            public void run() {
                if (mobileMapPackage.getLoadStatus() == LoadStatus.LOADED) {
                    List<ArcGISMap> maps = mobileMapPackage.getMaps();
                    ArcGISMap arcGISMap = maps.get(0); //地图里包含了的一个底图层和两个业务图层
                    mMapView.setMap(arcGISMap);

                    Basemap basemap = arcGISMap.getBasemap();
                    LayerList operationalLayers = arcGISMap.getOperationalLayers();
                }
            }
        });

这个地图里包含了的一个底图层和两个业务图层,通过我们的移动地图包数据,直接一步就加载好,因为移动数据包不仅包含地图展示所需的所有图层,也包含他们图层的顺序,因此使用起来非常方便。

如果要获取这里面的每个图层也很方便,只需要用ArcGISMap.getBaseMap()或者ArcGISMap.getOperationalLayers()即可。

移动地图包的空间查询

对于移动地图包,它的另一个特点就是保存了所有的feature要素,因此也可以进行空间查询。以空间查询举个例子:

  //查询
        mMapView.setOnTouchListener(new DefaultMapViewOnTouchListener(this, mMapView) {
            @Override
            public boolean onSingleTapConfirmed(MotionEvent e) {

                final Point mapPoint = mMapView.screenToLocation(new android.graphics.Point(Math.round(e.getX()), Math.round(e.getY())));
                QueryParameters parameters = new QueryParameters();
                parameters.setGeometry(mapPoint);
                FeatureLayer featureLayer = (FeatureLayer) mMapView.getMap().getOperationalLayers().get(0);
                FeatureTable featureTable = featureLayer.getFeatureTable();
                final ListenableFuture<FeatureQueryResult> future = featureTable.queryFeaturesAsync(parameters);
                future.addDoneListener(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            FeatureQueryResult featureQueryResult = future.get();
                            for (Feature feature : featureQueryResult) {
                                if (feature instanceof Feature) {
                                    Feature mFeatureGrafic = (Feature) feature;

                                    Geometry geometry = mFeatureGrafic.getGeometry();
                                    GraphicsOverlay graphicsOverlay = new GraphicsOverlay();
                                    SimpleMarkerSymbol pointSymbol = new SimpleMarkerSymbol(SimpleMarkerSymbol.Style.DIAMOND, Color.RED, 10);
                                    SimpleLineSymbol lineSymbol = new SimpleLineSymbol(SimpleLineSymbol.Style.DASH, Color.GREEN, 10);
                                    Graphic pointGraphic = new Graphic(mapPoint, pointSymbol);
                                    Graphic fillGraphic = new Graphic(geometry, lineSymbol);
                                    graphicsOverlay.getGraphics().add(pointGraphic);
                                    graphicsOverlay.getGraphics().add(fillGraphic);
                                    mMapView.getGraphicsOverlays().add(graphicsOverlay);

                                    Map<String, Object> mQuerryString = mFeatureGrafic.getAttributes();
                                    for (String key : mQuerryString.keySet()) {
                                        Log.e("xyh" + key, String.valueOf(mQuerryString.get(key)));
                                    }
                                }
                            }
                        } catch (InterruptedException e1) {
                            e1.printStackTrace();
                        } catch (ExecutionException e1) {
                            e1.printStackTrace();
                        }
                    }
                });
                return true;
            }
        });
    }

由这两个例子,我们看出为啥说MMPK是当前手机设备最佳数据格式了。

首先加载非常方便,其渲染效果和桌面端完全一致,无需在移动端里再多次调整;

其次它支持切片,所以加载渲染速度快,又保留了fearture信息,支持空间属性查询,可谓是集成了TPK和geodatabase两种数据的有点;

最后采用了新的压缩方式,所以数据量很小,我刚举例的两个数据也才分别不过30M和6M。

资源下载链接为: https://pan.quark.cn/s/1bfadf00ae14 “STC单片机电压测量”是一个以STC系列单片机为基础的电压检测应用案,它涵盖了硬件电路设计、软件编程以及数据处理等核心知识点。STC单片机凭借其低功耗、高性价比和丰富的I/O接口,在电子工程领域得到了广泛应用。 STC是Specialized Technology Corporation的缩写,该公司的单片机基于8051内核,具备内部振荡器、高速运算能力、ISP(在系统编程)和IAP(在应用编程)功能,非常适合用于各种嵌入式控制系统。 在源代码方面,“浅雪”风格的代码通常简洁易懂,非常适合初学者学习。其中,“main.c”文件是程序的入口,包含了电压测量的核心逻辑;“STARTUP.A51”是启动代码,负责初始化单片机的硬件环境;“电压测量_uvopt.bak”和“电压测量_uvproj.bak”可能是Keil编译器的配置文件备份,用于设置编译选项和项目配置。 对于3S锂电池电压测量,3S锂电池由三节锂离子电池串联而成,标称电压为11.1V。测量时需要考虑电池的串联特性,通过分压电路将高电压转换为单片机可接受的范围,并实时监控,防止过充或过放,以确保电池的安全和寿命。 在电压测量电路设计中,“电压测量.lnp”文件可能包含电路布局信息,而“.hex”文件是编译后的机器码,用于烧录到单片机中。电路中通常会使用ADC(模拟数字转换器)将模拟电压信号转换为数字信号供单片机处理。 在软件编程方面,“StringData.h”文件可能包含程序中使用的字符串常量和数据结构定义。处理电压数据时,可能涉及浮点数运算,需要了解STC单片机对浮点数的支持情况,以及如何高效地存储和显示电压值。 用户界面方面,“电压测量.uvgui.kidd”可能是用户界面的配置文件,用于显示测量结果。在嵌入式系统中,用
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值