該文章翻譯至ArcGIS官網教程Layers and data,采用了Google翻譯輔助,對不恰當的名稱和語句做了修改。有能力的建議直接閱讀英文原版。
1. 介紹
圖層是可以在Map
對象中使用的數據集合。可以在客戶端上創建圖層數據,由ArcGIS Online和ArcGIS Enterprise托管,或由外部服務器托管。
2. 數據——要素的集合
圖層通常用於管理和顯示大量要素。要素是地理位置或實體的記錄。每個要素都包含為幾何圖形(點,折線或多邊形)定義的空間坐標和存儲其他信息的屬性字段。這些要素集可以被認為是:
- 結構化:如果每個要素具有相同的幾何圖形和相同屬性的關鍵字
- 非結構化:如果任何要素具有不同幾何圖形或不同屬性的關鍵字
注意:有時會說要素有模式,而幾何圖形沒有模式。
使用一組要素時,一般的經驗法則是:
- 如果是結構化用於
FeatureLayer
顯示數據 - 如果非結構化用於
GraphicsLayer
顯示數據
3. 核心圖層的類型
ArcGIS JS API具有許多可用於訪問和顯示圖層數據的圖層類。所有類都繼承自Layer
。使用哪個類取決於數據的格式和數據的存儲位置。不同的圖層類型顯示出不同的功能。
下面是最常見的圖層類的列表。
Class | Data Storage | Capabilities |
---|---|---|
FeatureLayer |
存儲在ArcGIS Online或ArcGIS Enterprise中的地理數據 | Displaying, querying, filtering and editing large amounts of geographic features. |
GraphicsLayer |
臨時存儲在內存中的地理數據 | Displaying individual geographic features as graphics, visual aids or text on the map. |
CSVLayer /KMLLayer /GeoJSONLayer |
存儲在通過網絡訪問的外部文件中的地理或表格數據 | Displaying data stored in an external file format as a layer. |
TileLayer /VectorTileLayer |
數據集存儲在切片模式中用於快速渲染 | Displaying basemaps and other tiled datasets for geographic context. |
MapImageLayer |
地理數據存儲在ArcGIS Enterprise中並以圖像方式呈現 | Displaying layers dynamically rendered by an ArcGIS Server service. |
ImageryLayer |
存儲在ArcGIS Enterprise中的地理遙感圖像 | Displaying satellite or other imagery data. |
4. 使用FeatureLayer展示數據源
FeatureLayer
是引用地理要素集合的圖層。集合中的所有要素必須具有相同的幾何類型和屬性字段。
要素圖層數據源可以在應用程序加載的數據的內存中,也可以從ArcGIS Online或ArcGIS Enterprise上托管的REST API服務請求數據。在ArcGIS Online或ArcGIS Enterprise中托管數據是首選方法,尤其適用於訪問和顯示大量地理數據。要數圖層在客戶端和服務器上都經過高度優化,可以快速顯示並支持各種功能,包括:
ArcGIS for Developers和ArcGIS Online提供了用於導入GeoJSON,Excel,CSV,geodatabases和shapefile等數據的工具。導入數據會在ArcGIS Online中創建可用作服務器端數據源的要素圖層項目。
4.1 客戶端數據源
通常,圖層數據是從ArcGIS Online或ArcGIS Enterprise上托管的REST API服務加載的,但也可以直接從內存中的一組要素創建要素圖層。
例如,下面以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數據創建要素圖層的第一步是將兩個場所數據轉換為具有
attributes和
geometry屬性的
Graphic`對象。
Property | Type | Description |
---|---|---|
attributes |
Object |
Key-value 形式用於存儲有關要素的地理信息 |
geometry |
Geometry |
提供相對於坐標系的位置要素。可能的值是Point (點),Polygon (多邊形)和Polyline (多線段)對象 |
以下代碼示例將包含兩個場所數據的數組轉換為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
以下代碼示例將場所數組轉換為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
是實際創建一個FeatureLayer
對象,並至少指定下表中所所述的objectIdField
,fields
,renderer
,和source
屬性。
Property | Type | Description |
---|---|---|
source |
Collection<Graphic> |
Graphic 對象的集合用於創建要素圖層 |
renderer |
Renderer |
渲染器用於在要素的位置顯示符號 |
objectIdField |
String |
標識要素圖層的名稱 |
fields |
Object[] |
包含字段的名稱和值的JavaScript對象數組 |
popupTemplate |
PopupTemplate |
要素圖層中要素的彈出模板 |
以下代碼示例創建一個 FeatureLayer
並將該source
屬性顯式設置為graphics
。Autocasting用於設置的renderer
,popup
和fields
特性。
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);
了解有關自動 autocasting或從graphic數組創建要素圖層的詳細信息。探索如何在示例代碼中使用要素圖層的所有功能。
4.2 服務器端數據源
FeatureLayer
還支持從url
屬性指定的REST API服務返回的要素集合。這是訪問和顯示大型數據集的最有效方法。要素圖層將與要素服務一起使用,以盡可能高效地檢索要素,如果啟用,將提供對其他功能(如編輯)的訪問。
var layer = new FeatureLayer({
url: "https://services3.arcgis.com/GVgbJbqm8hXASVYi/arcgis/rest/services/Trailheads/FeatureServer/0"
});
map.layers.add(layer);
在 add a layer to a map教程中了解有關向地圖添加圖層的詳細信息。
除URL外,您還可以引用存儲在ArcGIS Online或ArcGIS Enterprise中的圖層項。這些項引用REST API服務,該服務存儲層的數據以及其他配置選項。
var layer = new FeatureLayer({
portalItem: {
id: "883cedb8c9fe4524b64d47666ed234a7",
portal: "https://www.arcgis.com" // Default: The ArcGIS Online Portal
}
});
map.layers.add(layer);
在adding a layer from an item教程中了解從項目中添加圖層的詳細信息。
5. 用GraphicsLayer(圖形層)顯示圖形
圖形通常用於將文本、形狀和具有不同幾何形狀的圖像添加到地圖中。創建圖形圖層的最簡單方法是將Graphic
對象創建為數組,並將此數組傳遞給GraphicsLayer
對象的屬性graphics
。
每個Graphic
類都包含以下屬性:
屬性 | 類型 | 描述 |
---|---|---|
attributes |
Object |
用於存儲有關要素的地理信息的鍵值對 |
geometry |
Geometry |
提供的位置相對於一個特征的坐標系 可能的值是Point ,Polygon 和Polyline 對象 |
popupTemplate |
PopupTemplate |
圖形的彈出模板 |
symbol |
Symbol |
定義圖形在圖層中的渲染方式 |
下面的代碼示例創建一個Graphic
,該對象具有Point
幾何類型、彈出窗口和符號的新對象。然后通過將一組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);
通過 displaying point, polyline, and polygon graphics教程了解更多向視圖添加圖形的信息,通過autocasting了解更多自動轉換的信息。
6. 使用外部數據源
其他類型的數據和文件由特定Layer
的子類直接支持。其中包括用於處理外部文件(如CSV或GeoJSON文件)或集成外部服務(如必應地圖)的特定類型的圖層。
圖層子類 | 數據源 | 數據類型 | 特征 | 限制 |
---|---|---|---|---|
CSVLayer |
CSV文件 | 矢量圖形作為點下載 | Client-side processing, popup templates, renderers with 2D and 3D symbols | 可能需要大量下載,具體取決於功能的數量 |
GeoRSSLayer |
GeoRSS feed | 矢量圖形作為點,折線和多邊形 | - Graphics storage - Popup templates |
- 無3D支持 不支持渲染器 |
GeoJSONLayer |
GeoJSON文件 | 矢量圖形作為點,折線和多邊形 | 從GeoJSON數據創建圖層 | - 每個GeoJSON層都接受單一幾何類型 - 數據必須符合RFC 7946規范 |
KMLLayer |
KML數據源 | N / A | N / A | N / A |
WMSLayer |
WMS Service Portal Item | 柵格數據導出為單個圖像 | OGC規范 | N / A |
WMTSLayer |
- WMTS tile services - Portal Item |
圖像切片 | OGC規范 | N / A |
OpenStreetMapLayer |
OpenStreetMap tile services | 圖像切片 | Displays OpenStreetMap tiled content | N / A |
BingMapsLayer |
Bing Spatial Data Service data | N / A | N / A | N / A |
每個層都需要不同的屬性,具體取決於它們的初始化方式。有關詳細信息,請參閱每個圖層類型。創建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)
通過 displaying point, polyline, and polygon graphics教程了解更多向視圖添加圖形的信息,通過autocasting了解更多自動轉換的信息。
7. 使用底圖和切片圖層
底圖用於通過顯示道路,邊界,建築物和其他數據來為地圖提供地理背景。底圖通常用切片方式提供服務以便更快地渲染。柵格底圖請求預先創建的圖像。矢量底圖以壓縮二進制格式請求數據並在客戶端上設置樣式。
可以使用 Vector Tile Style Editor自定義矢量底圖。自定義數據也可以使用ArcGIS Online或ArcGIS Enterprise作為矢量或柵格切片發布。
Map
可以使用basemap
屬性控制特定對象的底圖,該屬性可以是標識特定底圖或Basemap
對象的字符串。
var map = new Map({
basemap: "streets-navigation-vector"
})
在 Selecting a basemap的教程中了解更多信息。
8. 使用ArcGIS Enterprise中的地圖服務
MapImageLayer
用於在ArcGIS Enterprise中顯示地圖服務中的數據。地圖服務通常包含多個子圖層和復雜的制圖。Map Services將數據呈現為動態生成並在客戶端上顯示的服務器端圖像。
9. 使用柵格和圖像數據
ImageryLayer
用於顯示存儲在ArcGIS Enterprise 中的圖像服務中的圖像或其他基於柵格的數據。ImageryLayer
通常用於顯示和分析從無人機或衛星捕獲的原始圖像數據或用於顯示科學數據。