图层和数据

简介

图层是在 Map 中使用的数据集合。图层数据可在客户端上创建,然后托管到 GeoScene Online 和 GeoScene Enterprise 中,也可直接托管在其他服务器上。

要素集合数据

大量要素集合通常通过图层来管理和显示。要素是地理位置或实体的记录。每个要素都包含几何类型(点、折线或多边形)定义的空间坐标和存储其他信息的属性字段。这些要素集合分为两类:

  • 结构化要素集合,每个要素都具有相同的 geometry 类型和相同的 attributes
  • 非结构化要素集合,要素具有不同的 geometry 类型或不同的 attributes

注:有时,要素具有模式,而图形没有模式

使用要素集合时,一般的经验法则是:

  • 如果数据为结构化的,则使用 FeatureLayer 显示数据
  • 如果数据为非结构化的,则使用 GraphicsLayer 显示数据

核心图层类型

GeoScene Maps SDK for JavaScript 具有很多可用于访问和显示图层数据的图层类。所有类都继承自 Layer。所使用的类取决于数据的格式和数据的存储位置。每种图层类型都有不同的功能。

下面是最常见图层类。

数据存储功能
FeatureLayer存储在 GeoScene Online 或 GeoScene Enterprise 中的地理数据。显示、查询、过滤和编辑大量地理要素。
GraphicsLayer临时存储在内存中的地理数据。在地图上以图形、视觉辅助或文本的形式显示各个地理要素。
CSVLayer/KMLLayer/GeoJSONLayer存储在通过网络访问的外部文件中的地理数据或表格数据。将以外部文件格式存储的数据显示为图层。
TileLayer/VectorTileLayer数据集存储在切片方案中,以实现快速渲染。显示地理环境的底图和其他切片数据集。
MapImageLayer存储在 GeoScene Enterprise 中的地理数据,渲染为图像。显示通过 GeoScene Server 服务动态渲染的图层。
ImageryLayer存储在 GeoScene Enterprise 中的地理配准影像。显示卫星影像或其他影像数据。

使用 FeatureLayer 显示数据源

FeatureLayer 是引用地理要素集合的图层。集合中的所有要素都必须具有相同的几何类型和属性键。

要素图层数据源可以是应用程序加载在内存中的数据,也可以是通过 REST API 服务从 GeoScene Online 或 GeoScene Enterprise 请求的托管图层数据。将数据托管在 GeoScene Online 或 GeoScene Enterprise 返中是首选方法,尤其是在访问和显示大量地理数据时。为了快速显示,要素图层在客户端和服务器上都经过了高度优化,并支持各种其他功能,包括:

客户端数据源

通常,图层数据是通过 REST API 服务加载的托管在 GeoScene Online 或 GeoScene Enterprise 上的服务,但也可直接从内存中的要素集合创建要素图层。

例如,以下为 JSON 格式的点要素集合,接下来我们将演示如何利用此数据创建要素图层。这些数据会被转换为可在 FeatureLayer 中显示的格式。

代码块使用深色复制
                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
  "places": [
    {
      "id": 1,
      "address": "200 N Spring St, Los Angeles, CA 90012",
      "longitude": -118.24354,
      "latitude": 34.05389
    },
    {
      "id": 2,
      "address": "419 N Fairfax Ave, Los Angeles, CA 90036",
      "longitude": -118.31966,
      "latitude": 34.13375
    }
  ]
} 

从上述 JSON 数据创建要素图层的第一步是将每个地点转换为具有 attributesgeometry 属性的 Graphic 对象。

属性类型说明
attributesObject键值对,用于存储有关要素的地理信息
geometryGeometry提供要素相对于坐标系的位置。可能值是 PointPolygonPolyline 对象

以下代码示例可将位置数组转换为 Graphic 对象数组。

代码块使用深色复制
                       
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
var graphics = places.map(function (place) {
  return new Graphic({
    attributes: {
      ObjectId: place.id,
      address: place.address
    },
    geometry: {
      type: "point",
      longitude: place.longitude,
      latitude: place.latitude
    },
    symbol: {
      // autocasts as new SimpleMarkerSymbol()
      type: "simple-marker",
      color: [226, 119, 40],
      outline: {
        // autocasts as new SimpleLineSymbol()
        color: [255, 255, 255],
        width: 2
      }
    }
  });
}); 

创建 FeatureLayer 的第二步是创建一个 FeatureLayer 对象,并至少指定 objectIdFieldfieldsrenderersource 属性,如下表所示。

属性类型说明
sourceCollection<Graphic>Graphic 对象集合,用于创建要素图层
rendererRenderer用于在要素位置处显示符号的渲染器
objectIdFieldString标识要素的字段名称
fieldsObject[]包含字段名和值的 JavaScript 对象数组
popupTemplatePopupTemplate要素的弹出窗口模板

以下代码示例创建了一个新的 FeatureLayer,并显式地将 source 属性设置为 graphics自动转换用于设置 rendererpopupfields 属性。

代码块使用深色复制
                                          
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
var featureLayer = new FeatureLayer({
  source: graphics,
  renderer: {
    type: "simple",                    // autocasts as new SimpleRenderer()
    symbol: {                          // autocasts as new SimpleMarkerSymbol()
      type: "simple-marker",
      color: "#102A44",
      outline: {                       // autocasts as new SimpleLineSymbol()
        color: "#598DD8",
        width: 2
      }
    }
  },
  popupTemplate: {                     // autocasts as new PopupTemplate()
    title: "Places in Los Angeles",
    content: [{
      type: "fields",
      fieldInfos: [
        {
          fieldName: "address",
          label: "Address",
          visible: true
        }
      ]
    }]
  },
  objectIdField: "ObjectID",           // This must be defined when creating a layer from `Graphic` objects
  fields: [
    {
      name: "ObjectID",
      alias: "ObjectID",
      type: "oid"
    },
    {
      name: "address",
      alias: "address",
      type: "string"
    }
  ]
});

map.layers.add(featureLayer); 

了解有关自动转换从图形数组创建要素图层的更多信息。

服务器端数据

FeatureLayer 还支持指定REST API 服务的 url 而返回的要素集合。这是访问和显示大型数据集的最好方式。要素图层与要素服务结合使用,尽可能地高效检索要素,如果服务启用了一些功能,图层也可以提供额外的功能(例如编辑)。

代码块使用深色复制
     
1
2
3
4
5
var layer = new FeatureLayer({
  url: "https://www.geosceneonline.cn/arcgis/rest/services/Trailheads/FeatureServer/0"
});

map.layers.add(layer); 

将图层添加至地图教程中了解有关向地图添加图层的更多信息。

除了 URL,还可以引用存储在 GeoScene Online 或 GeoScene Enterprise 中的图层类项目。这些项目指向 REST API 服务,服务中存储了图层的数据以及附加配置选项。

代码块使用深色复制
        
1
2
3
4
5
6
7
8
var layer = new FeatureLayer({
  portalItem: {
    id: "883cedb8c9fe4524b64d47666ed234a7",
    portal: "https://www.geosceneonline.cn/geoscene"               // Default: The GeoScene Online Portal
  }
});

map.layers.add(layer); 

使用 GraphicsLayer 显示图形

图形通常用于向地图添加具有不同几何的文本、形状和图像。创建图形图层的最简单方法是将 Graphic 对象创建为数组,并将此数组传递给新 GraphicsLayer 对象的 graphics 属性。

每个 Graphic 类都包含以下属性:

属性类型说明
attributesObject键值对,用于存储有关要素的地理信息
geometryGeometry提供要素相对于坐标系的位置。可能值为 PointPolygonPolyline 对象
popupTemplatePopupTemplate图形的弹出窗口模板
symbolSymbol定义图形在图层中的渲染方式

以下代码示例创建了一个新的 Graphic 对象,该对象具有 Point 几何类型、弹出窗口和符号。然后通过将图形数组传递给 graphics 属性来创建一个新的 GraphicsLayer

代码块使用深色复制
                                           
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
var pointGraphic = new Graphic({
  attributes: {
    name: "LA City Hall",
    address: "200 N Spring St, Los Angeles, CA 90012"
  },
  geometry: {
    type: "point",                     // autocasts as new Point()
    longitude: -118.24354,
    latitude: 34.05389
  },
  symbol: {
    type: "simple-marker",             // autocasts as new SimpleMarkerSymbol()
    color: [ 226, 119, 40 ],
    outline: {                         // autocasts as SimpleLineSymbol()
      color: [ 255, 255, 255 ],
      width: 2
    }
  },
  popupTemplate: {                     // autocasts as new PopupTemplate()
    title: "Places in Los Angeles",
    content: [{
      type: "fields",
      fieldInfos: [
        {
          fieldName: "name",
          label: "Name",
          visible: true
        },
        {
          fieldName: "address",
          label: "Address",
          visible: true
        }
      ]
    }]
  },
});

var graphicsLayer = new GraphicsLayer({
  graphics: [ pointGraphic ]
});

map.layers.add(graphicsLayer); 

有关自动转换和向视图添加图形的更多信息,请参阅添加点、折线和多边形教程。

使用外部数据源

Layer 的特定子类支持其他类型的数据和文件类型。如 CSV 、 GeoJSON 文件或其他外部服务。

图层子类数据源数据类型功能局限性
CSVLayerCSV 文件- 下载为点的矢量图形客户端处理、弹出模板、带有 2D 和 3D 符号的渲染器可能需要大量下载,具体取决于要素的数量
GeoRSSLayerGeoRSS 源作为点、折线和面的矢量图形- 图形存储
- 弹出窗口模板
- 不支持 3D
不支持渲染器
GeoJSONLayerGeoJSON 文件作为点、折线和面的矢量图形基于 GeoJSON 数据创建图层- 每个 GeoJSON 图层均接受单一几何类型
- 数据必须符合 RFC 7946 规范
KMLLayerKML 数据源N/AN/AN/A
OGCFeatureLayerOGC API - 要素点、折线、多边形渲染器、标注、弹出窗口数据必须符合 RFC 7946 规范,其声明坐标采用 SpatialReference WGS84
WFSLayer- WFS 服务
门户项目
点、多点、折线、多边形渲染器、标注、弹出窗口数据必须为 GeoJSON 格式,仅支持版本 2.0.0。
WMSLayer- WMS 服务
门户项目
导出为单个影像的栅格数据OGC 规范N/A
WMTSLayer- WMTS 切片服务
- 门户项目
影像切片OGC 规范N/A
OpenStreetMapLayerOpenStreetMap 切片服务影像切片显示 OpenStreetMap 切片内容N/A
BingMapsLayerBing 空间数据服务数据N/AN/AN/A

决于它们的初始化方式。有关详细信息,请参阅每种图层类型。创建 CSVLayer 图层的示例如下所示。

代码块使用深色复制
        
1
2
3
4
5
6
7
8
var earthquakesLayer = new CSVLayer({
  url: "https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/2.5_week.csv",
  copyright: "USGS Earthquakes",
  latitudeField: "latitude", // Defaults to "latitude"
  longitudeField: "longitude" // Defaults to "longitude"
});

map.layers.add(earthquakesLayer) 

使用底图和切片图层

底图通过显示道路、边界、建筑物和其他数据为地图提供地理环境。底图通常以切片格式提供,以便加快渲染速度。栅格底图需要预先创建图像。矢量底图需要压缩为二进制格式的数据并可在客户端设置样式。 。

还可使用 GeoScene Online 或 GeoScene Enterprise 将自定义数据发布为矢量或栅格切片。

可使用 basemap 属性控制特定 Map 对象的底图,该属性可以是标识特定底图或 Basemap 对象的字符串。

代码块使用深色复制
   
1
2
3
var Map = new Map({
  basemap: "geoscene-blue"
}) 

更改底图图层的教程中了解更多信息。

使用 GeoScene Enterprise 中的地图服务

MapImageLayer 用于在 GeoScene Enterprise 中显示来自地图服务中的数据。地图服务通常包含多个子图层和复杂的制图。地图服务可将数据渲染为服务器端图像,以在客户端动态生成和显示。

使用栅格和影像数据

ImageryLayer 用于在 GeoScene Enterprise 中显示存储在影像服务中的影像或其他基于栅格的数据。ImageryLayer 通常用于显示和分析从无人机或卫星捕获的原始图像数据或用于显示科学数据。

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