介绍
Layers 是可以在Map类中使用的数据集合。Layer 的数据可以在客户端创建,由ArcGIS Online和ArcGIS Enterprise托管,也可以由外部服务器托管。
数据作为集合的特征
Layers经常被用来管理和展示大量的集合数据。这些特征是记录的地理位置或键值对。每个特征包含空间坐标定义给一个集合上的集合(点,相交线,多边形)并且属性域还存储其他的信息。通常被定义为:
Structured if every feature has the same geometry type and the same attributes keys
Unstructured if any features have different geometry types or different attributes keys
结构化的就是每个特征的几何类型相同和属性的键相同
非结构化的就是每个特征的几何类型不同和属性的键不同
If the data is structured use FeatureLayer to display the data
If unstructured use GraphicsLayer to display the data
如果数据是结构化的使用FeatureLayer展示数据
如果是非结构化的用GraphicsLayer来展示数据
核心的层类型
ArcGIS JS API有许多layer类,可以用来访问和显示layer数据。所有类都继承自Layer类。使用的类取决于数据的格式和数据存储的位置。每个layer类型还公开一组不同的功能。
通过FeatureLayer展示数据源
一个FeatureLayer相关联一个地理特征的集合。所有的特征在集合中都要有相同的几何类型和属性键。
FeatureLayer的数据源数据能够通过应用从内存中加载,也能够从ArcGIS Online or ArcGIS Enterprise通过REST API service请求数据。ArcGIS Online or ArcGIS Enterprise通过相关的方法来掌管数据,尤其是访问和展示大量的地理数据。Feature layers最佳化的在客户端和服务端访问和提供不同的特征。ArcGIS for Developers and ArcGIS Online 提供工具去导入数据就像 GeoJSON, Excel, CSV,地理数据类型文件和电子地图文件。导入的数据创建一个feature layer菜单在ArcGIS Online 就能够作为服务端数据源来使用。
客户端数据源
Typically layer数据通过REST API service 被 ArcGIS Online or ArcGIS Enterprise掌管,并且也能在内存中通过一个特征的集合直接的创建一个feature layer。
举个栗子,下面是一个加利福尼亚JSON格式的特征集合。这个数据能够被转换成FeatureLayer能够接收的格式进行展示
{
"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数据创建一个feature layer的第一步就是转换每个Graphic对象和attributes、geometry 属性
下面是代码样例去转换数组中的Graphic对象
var graphics = places.map(function (place) {
return new Graphic({
attributes: {
ObjectId: place.id,
address: place.address
},
geometry: {
longitude: place.longitude,
latitude: place.latitude
}
});
});
第二步就是创建一个FeatureLayer对象,并且至少声明objectIdField,fields,renderer和source属性
下面的代码示例去创建了一个FeatureLayer并且明确的设置了source属性到graphics。自动的设置了renderer,popup和field属性。
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 service的url属性返回。这是最有效的方式去访问和展示大的数据集。这个feature layer作业在feature service去尽可能高效的取回特征,并且如果可以,将提供额外的功能比如编辑。
var layer = new FeatureLayer({
url: "https://services3.arcgis.com/GVgbJbqm8hXASVYi/arcgis/rest/services/Trailheads/FeatureServer/0"
});
map.layers.add(layer);
除了URL外,还可以参考存储在ArcGIS Online or ArcGIS Enterprise 的项。这些项与REST API service相关,去存储layer的数据文件也添加配置选项。
var layer = new FeatureLayer({
portalItem: {
id: "883cedb8c9fe4524b64d47666ed234a7",
portal: "https://www.arcgis.com" // Default: The ArcGIS Online Portal
}
});
map.layers.add(layer);
展示图形通过GraphicsLayer
图形通常用于向地图添加具有不同几何形状的文本、形状和图像。创建图形层的最简单方法是将图形对象创建为数组,并将该数组传递给新的GraphicsLayer对象的graphics属性。
每一个Graphic类包含这些属性
下面的代码示例创建一个新的图形对象,该对象具有点几何类型、弹出窗口和符号。然后,它通过向graphics属性传递一个图形数组来创建一个新的GraphicsLayer。
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);
通过其他的数据源来工作
层的特定子类直接支持其他类型的数据和文件。其中包括用于处理CSV或GeoJSON等外部文件或集成Bing Maps等外部服务的特定类型的层
根据初始化的方式,每个层都需要不同的属性。有关详细信息,请参考每个层类型。下面是创建csvLayer层的一个示例。
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)
使用basemaps和tile layers
Basemaps通过显示道路、边界建筑物和其他数据来为地图提供地理上下文。为了更快地呈现,Basemaps通常用作tile。光栅基图请求预先创建的图像。Vector basemaps以压缩的二进制格式请求数据,并在客户机上设置数据样式。ArcGIS包含一组精心设计的基本图。可以使用Vector Tile样式编辑器定制Vector basemaps。自定义数据也可以通过ArcGlS Online或ArcGIS Enterprise以矢量或栅格形式发布。可以使用basemap属性控制特定映射对象的basemap,该属性可以是标识特定basemap或basemap对象的字符串。
var Map = new Map({
basemap: "streets-navigation-vector"
})
ArcGIS Enterprise获取Map Services进行工作
MapImageLayer用于显示ArcGIS企业地图服务中的数据。地图服务通常包含多个子层和复杂的制图。Map服务将数据呈现为服务器端映像,并在客户机上动态生成和显示。
使用光栅和图像数据
mageryLayer用于显示ArcGIS企业中存储在图像服务中的图像或其他基于栅格的数据。ImageryLayer通常用于显示和分析从无人机或卫星捕获的原始图像数据,或用于显示科学数据。