地图和视图

简介

地图是对图层和底图引用管理的容器。视图是用来显示地图图层,处理用户交互、弹出窗口、微件和地图定位等功能的类。

使用地图

地图由 Map 类创建。Map 对象传递给 View 对象。有两个 View 类可用于显示地图:用于 2D 地图的 MapView 类和用于 3D 地图的 SceneView 类。

新建地图

创建地图的一种方法是创建 Map 类的一个新实例,并指定底图和可选的图层集合

代码块使用深色复制
         
1
2
3
4
5
6
7
8
9
const myMap = new Map({                // Create a Map object
  basemap: "tianditu-vector",
  layers: additionalLayers             // Optionally, add additional layers collection
});

const mapView = new MapView({          // The View for the Map object
  map: myMap,
  container: "mapDiv"
}); 

了解可以添加到地图中的不同类型的图层

从 Web 地图或 Web 场景创建地图

创建地图的另一种方法是加载 Web 地图 (用于 2D 地图) 或 Web 场景 (用于 3D 地图)。

Web 地图和 Web 场景是包含地图或场景设置的 JSON 结构。它们包含了对底图、图层、图层样式、弹出窗口、图例、标注等的定义。它们通常是使用地图查看器场景查看器交互创建的。GeoScene Online 或 GeoScene Enterprise 会为它们分配一个唯一的ID,并将其存储为门户项目

WebMapWebScene 类可通过其唯一 ID 来访问和加载。项目 ID 可在地图查看器和场景查看器或项目页面的 URL 中标识。默认门户为 GeoScene Online,其 URL 为 https://www.geosceneonline.cn/geoscene。如果使用 GeoScene Enterprise,则需指定门户 URL。

示例:https://www.geosceneonline.cn/geoscene/webapps/item?id=2a78a76e9a4144f9873355367ae76e26

WebMapWebScene 对象加载 web 地图和 web 场景时,所有设置都会自动应用到 MapScene 中。例如,设置底图和图层,应用图层样式,并为每个图层定义弹出窗口。

注:交互创建 web 地图和 web 场景并通过唯一 ID 加载它们是配置 MapScene 的最快方法。

从 WebMap 创建地图

代码块使用深色复制
           
1
2
3
4
5
6
7
8
9
10
11
const webMap = new WebMap({                        // Define the web map reference
  portalItem: {
    id: "2a78a76e9a4144f9873355367ae76e26",
    portal: "https://www.geosceneonline.cn/geoscene"               // Default: The GeoScene Online Portal

  }
});

const view = new MapView({
  map: webMap,                                     // Load the web map
  container: "viewDiv"
}); 

显示 web 地图教程中了解更多信息。

从 WebScene 创建场景

代码块使用深色复制
           
1
2
3
4
5
6
7
8
9
10
11
const webScene = new WebScene({                    // Define the web scene reference
  portalItem: {
    id: "b463bfabddc94c8598c43d9190d20c98",
    portal: "https://www.geosceneonline.cn/geoscene"               // Default: The GeoScene Online Portal

  }
});

const view = new SceneView({                       // Load the web scene
  map: webScene,
  container: "viewDiv"
}); 

显示 web 场景教程中了解更多信息。

使用视图

视图的主要作用是显示图层、弹出窗口和 UI 微件,处理与用户的交互,并指定地图应关注世界的哪一部分 (即地图的“范围”)。

创建视图

用于创建地图视图和场景视图的类分别是:MapViewSceneView 类。MapView 显示 Map 对象的 2D 视图,SceneView 显示 3D 视图。

要使地图可见,视图对象需要一个 Map 对象和一个用于标识 div 元素或 div 元素引用的 id 属性的 String

代码块使用深色复制
    
1
2
3
4
const mapView = new MapView({          // Create MapView object
  map: myMap,
  container: "mapViewDiv"
}); 
代码块使用深色复制
    
1
2
3
4
const sceneView = new SceneView({      // Create SceneView object
  map: myMap,
  container: "sceneViewDiv"
}); 

设置地图的可见部分

MapViewSceneView 的初始位置可在创建视图时通过设置 centerzoomscale 属性来设置。

代码块使用深色复制
    
1
2
3
4
const view = new MapView({
  center: [ 116, 39 ],          // The center of the map as lon/lat
  zoom: 13                      // Sets the zoom level of detail (LOD) to 13
}); 

注:视图位置也可在初始化后通过编程方式更新属性来更新。

使用 SceneView (3D) 时,可通过定义 camera 的属性来设置观察者的位置。

代码块使用深色复制
           
1
2
3
4
5
6
7
8
9
10
11
var view = new SceneView({
  camera: {
    position: [
      122, // lon
      38, // lat
      50000  // elevation in meters
    ],
    heading: 95, // direction the camera is looking
    tilt: 65 // tilt of the camera relative to the ground
  }
}); 

显示地图显示场景教程中,了解如何创建 2D 和 3D 视图。

将视图动画到一个新位置

MapViewgoTo 方法还可更改视图的位置,但提供了额外的选项来平滑过渡。这种技术通常用于从表面上的一个位置“飞”到另一个位置,或缩放到搜索结果的范围。

goTo 方法可接受 GeometryGraphicViewpoint 对象。其他选项可以控制动画。

代码块使用深色复制
       
1
2
3
4
5
6
7
view.goTo({                            // go to point with a custom animation duration
  target: {
      center: [ 114, 39 ]
    }, {
      duration: 5000
  });
}); 

与视图交互

视图还负责处理用户交互和显示弹出窗口。视图为用户交互提供了多个事件处理程序,例如鼠标单击、键盘输入、触摸屏交互、操纵杆和其他输入设备。

当用户单击地图时,默认行为是显示已在图层中预先配置的任何弹出窗口。也可通过监听 click 事件并使用 hitTest() 方法查找用户单击处的要素,使用以下代码手动地模拟此行为。

代码块使用深色复制
             
1
2
3
4
5
6
7
8
9
10
11
12
13
view.popup.autoOpenEnabled = false;  // Disable the default popup behavior

view.on("click", function(event) { // Listen for the click event
  view.hitTest(event).then(function (hitTestResults){ // Search for features where the user clicked
    if(hitTestResults.results) {
      view.popup.open({ // open a popup to show some of the results
        location: event.mapPoint,
        title: "Hit Test Results",
        content: hitTestResults.results.length + "Features Found"
      });
    }
  })
}); 

了解有关视图事件手动配置弹出窗口的更多信息。

将微件和 UI 组件添加至视图

视图也是覆盖微件HTML 元素的容器。view.ui 提供了一个 DefaultUI 容器,用于显示视图的默认微件。也可使用 view.ui.add 方法将其他微件和 HTML 元素添加至视图。以下代码段演示了添加允许用户搜索地址或地点的微件。

代码块使用深色复制
        
1
2
3
4
5
6
7
8
  var searchWidget = new Search({
    view: view
  });

  // Add the search widget to the top right corner of the view
  view.ui.add(searchWidget, {
    position: "top-right"
  }); 

了解有关将添加微件到视图的更多信息。

您的浏览器不再受支持。请升级您的浏览器以获得最佳体验。