使用地图

使用Web地图URL

ArcGISMap map = new ArcGISMap("URL/to/webmap");

使用Web地图门户项目

  1. 通过向门户网站提供URL字符串来创建门户网站对象。在下面的示例中,可以从ArcGIS Online(www.arcgis.com)访问公共地图。
Portal portal = new Portal("http://www.arcgis.com");
  1. 通过提供门户网站和地图的项目ID字符串来构造门户网站项目对象。
PortalItem mapPortalItem = new PortalItem(portal, "e229d715f7ca4fa980308549fb288165");
  1. 将门户项目传递给地图构造函数。
ArcGISMap map = new ArcGISMap(mapPortalItem);

从移动地图包创建地图对象

移动地图包是在ArcGIS Pro中创建的文件对象(.mmpk)。它是地图,其图层,数据,网络和定位器的传输机制。

每个移动地图包都可以包含一个或多个可以在地图视图中显示的地图。

  1. 获取移动地图包的文件路径。
File mmpkFile = new File(Environment.getExternalStorageDirectory(), dataPath + "CaliforniaNevada.mmpk");
String mmpkPath = mmpkFile.getAbsolutePath();
  1. 使用文件路径构造移动地图包对象。
final MobileMapPackage mobileMapPackage = new MobileMapPackage("path/to/file/.mmpk");
  1. 必须先将移动地图包加载到应用程序中,然后才能访问地图本身。加载移动地图包后,可以将其任何地图分配给要显示的地图视图。
mobileMapPackage.addDoneLoadingListener(() -> {
  if (mobileMapPackage.getLoadStatus() == LoadStatus.LOADED) {
    System.out.println("Number of maps = " + mobileMapPackage.getMaps().size());
    // In this case the first map in the array is obtained
    ArcGISMap mobileMap = mobileMapPackage.getMaps().get(0);
  } else {
    // If loading failed, deal with failure depending on the cause...
  }
});
mobileMapPackage.loadAsync();

在地图视图中显示地图

mapView.setMap(map);

监控图层加载

mapView.addLayerViewStateChangedListener(new LayerViewStateChangedListener() {
  @Override
  public void layerViewStateChanged(LayerViewStateChangedEvent layerViewStateChangedEvent) {
    
    StringBuilder layerStatuses = new StringBuilder();
    for (LayerViewStatus status : layerViewStateChangedEvent.getLayerViewStatus()) {
      if (layerStatuses.length() > 0) {
        layerStatuses.append(",");
      }
      layerStatuses.append(status.name());
    }
// 显示所有图层的加载状态
    showMessage(String.format("Layer '%s' status=%s", layerViewStateChangedEvent.getLayer().getName(),
        layerStatuses.toString()));
  }
});

监控地图绘制

mMapView.addDrawStatusChangedListener(new DrawStatusChangedListener() {
    @Override
    public void drawStatusChanged(DrawStatusChangedEvent drawStatusChangedEvent) {
        if(drawStatusChangedEvent.getDrawStatus() == DrawStatus.IN_PROGRESS){
            progressBar.setVisibility(View.VISIBLE);
            Log.d("drawStatusChanged", "spinner visible");
        }else if (drawStatusChangedEvent.getDrawStatus() == DrawStatus.COMPLETED){
            progressBar.setVisibility(View.INVISIBLE);
        }
    }
});

导航地图

Polygon polygon = mapView.getVisibleArea();

通过 setPointView方法,可以

  • 将地图旋转到指定的角度。
  • 将地图缩放到指定的比例。
  • 缩放或平移地图,以使给定的几何体适合地图视图的可见区域。
  • 将地图缩放或平移到指定位置。
  • 将地图缩放或平移到特定视点。您可以使用以下命令定义视点:
    • 中心和规模
    • 中心,比例和旋转
    • 纬度,经度和比例
    • 目标范围
    • 目标范围和轮换
      设备位置
LocationDisplay locationDisplay = mapView.getLocationDisplay();
locationDisplay.addDataSourceStatusChangedListener(new LocationDisplay.DataSourceStatusChangedListener() {
  @Override
  public void onStatusChanged(LocationDisplay.DataSourceStatusChangedEvent dataSourceStatusChangedEvent) {
    if (dataSourceStatusChangedEvent.getSource().getLocationDataSource().getError() == null) {
      showMessage("Location Display Started=" + dataSourceStatusChangedEvent.isStarted());
    } else {
      // Deal with problems starting the LocationDisplay...
    }
  }
});
locationDisplay.startAsync();

启用环绕

mapView.setWrapAroundMode(WrapAroundMode.ENABLE_WHEN_SUPPORTED);

旋转地图

// 旋转90度
final ListenableFuture<Boolean> viewpointSetFuture = mapView.setViewpointRotationAsync(90);
viewpointSetFuture.addDoneListener(new Runnable() {
  @Override
  public void run() {
    try {
      boolean completed = viewpointSetFuture.get();
      if (completed)
        showMessage("Rotation completed successfully");
    } catch (InterruptedException e) {
      showMessage("Rotation interrupted");
    } catch (ExecutionException e) {
      // Deal with exception during animation...
    }
  }
});

触摸监听

  1. 创建 DefaultMapViewOnTouchListener的子类
class MapSingleTapListener extends DefaultMapViewOnTouchListener {
···
}
  1. 处理回掉方法
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
  Point mapPoint = mapView.screenToLocation(new android.graphics.Point((int)e.getX(), (int)e.getY()));
  showMessage(String.format("User tapped on the map at (%.3f,%.3f)", mapPoint.getX(), mapPoint.getY()));
  return true;
}
  1. 添加监听
mapView.setOnTouchListener(new MapSingleTapListener(context, mapView));

拍摄地图的快照(屏幕截图)

final ListenableFuture<Bitmap> exportImageFuture = mapView.exportImageAsync();
exportImageFuture.addDoneListener(new Runnable() {
  @Override
  public void run() {
    try {
      // Get the resulting Bitmap from the future
      Bitmap bitmap = exportImageFuture.get();

      if (bitmap != null) {
        // Create a File to write the Bitmap into
        File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "map.png");
        FileOutputStream fileOutputStream;
        try {
          // Write the Bitmap into the file and close the file stream.
          fileOutputStream = new FileOutputStream(file);
          bitmap.compress(Bitmap.CompressFormat.PNG, 100, fileOutputStream);
          fileOutputStream.close();
        } catch (IOException e) {
          // Deal with exception writing file...
        }
      }

    } catch (InterruptedException | ExecutionException e) {
      // Deal with exception during export...
    }
  }
});

设置在线底图

ArcGISTiledLayer tiledLayer = new ArcGISTiledLayer("http://services.arcgisonline.com/arcgis/rest/services/Canvas/World_Dark_Gray_Base/MapServer");
Basemap basemap = new Basemap(tiledLayer);

map = new ArcGISMap();
map.setBasemap(basemap);

将图层组合到一个底图中

ArcGISTiledLayer tiledLayer = new ArcGISTiledLayer("http://services.arcgisonline.com/arcgis/rest/services/World_Imagery/MapServer");
ArcGISMapImageLayer censusLayer = new ArcGISMapImageLayer("http://sampleserver6.arcgisonline.com/arcgis/rest/services/Census/MapServer");

map = new ArcGISMap();
map.getBasemap().getBaseLayers().add(tiledLayer);
map.getBasemap().getBaseLayers().add(censusLayer);

添加操作图层

ArcGISMapImageLayer censusLayer = new ArcGISMapImageLayer("http://sampleserver6.arcgisonline.com/arcgis/rest/services/Census/MapServer");
// Add layer to the map (by default, added as top layer)
map.getOperationalLayers().add(censusLayer);

插入指定层图层

ArcGISMapImageLayer usaLayer = new ArcGISMapImageLayer("http://sampleserver6.arcgisonline.com/arcgis/rest/services/USA/MapServer");
// Insert layer at position 0 (added as bottom layer of the map)
map.getOperationalLayers().add(0, usaLayer);

加载地图及其图层

map.loadAsync();
map.addDoneLoadingListener(new Runnable() {

    @Override
    public void run() {
        //code here to check for error status
        if (map.getLoadStatus() == LoadStatus.FAILED_TO_LOAD) {
            showMessage("map failed to load : " + map.getLoadError().getMessage());

        }
    }});

或者在地图中设置

mapView = new MapView(context);
mapView.setMap(map);

保存到门户网站(略)

环绕地图

启用或禁用环绕

默认情况下,当用户向东和向西平移地图时,地图视图会尝试包裹地图以获得连续体验。要禁用地图视图的环绕行为(或重新启用它),可以将环绕模式设置为适当的值。如果满足以下要求,则环绕只能应用于地图视图。

  • 地图的全部范围涵盖了整个世界。
  • 地图的空间参考是WGS 84(WKID = 4326)或Web墨卡托(WKID = 102113,102100或3857)。这意味着地图中的所有平铺图层都必须属于这些空间参考之一。但是,动态图层可以位于任何空间参考中,因为它们能够重新投影其数据。
  • 地图中的动态图层基于ArcGIS Server 10.0或更高版本的服务。早期版本的REST API不支持用于空间参考的已知文本(WKT)值,这是使动态地图服务支持环绕所必需的。

如果不满足上面的要求,则启动环绕会失败,并且不会报错。
使用用例:如果启用环绕,则关闭;如果关闭,设为启用

if (mapView.getWrapAroundMode() == WrapAroundMode.DISABLED) {
  // 启用环绕
  mapView.setWrapAroundMode(WrapAroundMode.ENABLE_WHEN_SUPPORTED);
  if (!mapView.isWrapAroundEnabled()) {

  }
} else {
  // 禁用环绕
  mapView.setWrapAroundMode(WrapAroundMode.DISABLED);
}

添加图层

图层有两个常见角色:

  • 底图图层 - 为您的数据提供上下文(背景)
  • 操作层 - 正在使用的地图数据

操作层

地图和场景公开了一个可操作的图层属性,它是一个图层集合。您可以在地图的操作层中添加和删除图层。

ArcGISMap map = new ArcGISMap();
map.getOperationalLayers().add(someLayer);
map.getOperationalLayers().remove(someLayer);

底图图层

底图显示“基础图层”属性,该属性包含底图中的所有图层。该getBaseLayers方法可以通过地图和场景的底图进行访问。请注意,如果有合适的地图,建议您使用所有地图的底图。可以使用静态工厂方法创建的底图的一些示例是:

  • 世界意象
  • 世界街头
  • 国家地理
  • 世界导航(矢量)
  • 世界街头(矢量)
ArcGISMap map = new ArcGISMap(Basemap.createNavigationVector());
// or
map.setBasemap(Basemap.createNavigationVector());
// or
map.getBasemap().getBaseLayers().add(someBasemapLayer);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,723评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,485评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,998评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,323评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,355评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,079评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,389评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,019评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,519评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,971评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,100评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,738评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,293评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,289评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,517评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,547评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,834评论 2 345

推荐阅读更多精彩内容