1. ArcGIS pro包含了ArcMap功能。
2. 4.x和3.x版本区别
项目中如果有三维相关希求,选择4.x版本;如果没有三维相关需求,选择3.x版本(二维操作更多)。
3.arcgis api本地部署
https://blog.csdn.net/qq_36792085/article/details/87897245
4.本地运行(在nginx服务中):
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no" />
<title>ArcGIS API for JavaScript Tutorials: Display a map</title>
<style>
html,
body,
#viewDiv {
padding: 0;
margin: 0;
height: 100%;
width: 100%;
}
</style>
<!-- <link rel="stylesheet" href="./4.2/main.css"> -->
<!-- <script src="./4.2/init.js"></script> -->
<link rel="stylesheet" href="http://localhost/arcgis_js_api/library/4.19/esri/css/main.css">
<script src="http://localhost/arcgis_js_api/library/4.19/init.js"></script>
<script>
require(["esri/Map","esri/views/MapView"],function(Map,MapView){
var map = new Map({
basemap:'streets'
});
const view = new MapView({
map:map,
center:[114,22],
zoom:8,
container:'viewDiv'
})
})
</script>
</head>
<body>
<div id="viewDiv"></div>
</body>
</html>
5.加载自定义底图(TileLayer, FeatureLayer, MapImageLayer, ImageryLayer)
1)公网上自定义底图地址:http://map.geoq.cn/arcgis/rest/services
2) //1.MapServer结尾的是动态服务,如果没有切片,需要用MapImageLayer实例化,有切片用TileLayer实例化
//2.如果是FeatureServer结尾的,用FeatureLayer类实例化
//3.如果zoom和center没有生效,证明是自定义图层api用错了
3)代码:
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no" />
<title>添加服务图层</title>
<style>
html,
body,
#viewDiv {
padding: 0;
margin: 0;
height: 100%;
width: 100%;
}
</style>
<link rel="stylesheet" href="http://localhost/4.19/esri/css/main.css">
<script src="http://localhost/4.19/init.js"></script>
<script>
require(["esri/Map", "esri/views/MapView",
"esri/layers/TileLayer", "esri/layers/FeatureLayer",
"esri/layers/MapImageLayer", "esri/layers/ImageryLayer"
], function(Map, MapView, TileLayer, FeatureLayer, MapImageLayer, ImageryLayer) {
var map = new Map({
basemap: 'osm'
});
let layer01 = new TileLayer({
url: "http://map.geoq.cn/arcgis/rest/services/ChinaOnlineStreetPurplishBlue/MapServer"
});
map.add(layer01, 0) //添加到底图上边,index越大越在顶层
let layer02 = new ImageryLayer({
url: "https://landsat2.arcgis.com/arcgis/rest/services/Landsat8_Views/ImageServer"
});
map.add(layer02, 1)
let layer03 = new MapImageLayer({
url: "https://sampleserver6.arcgisonline.com/arcgis/rest/services/Census/MapServer"
});
map.add(layer03, 2)
let layer04 = new FeatureLayer({
url: "https://sampleserver6.arcgisonline.com/arcgis/rest/services/USA/MapServer/0"
});
map.add(layer04, 3)
const view = new MapView({
map: map,
center: [-120, 30],
zoom: 4,
container: 'viewDiv'
})
})
</script>
</head>
<body>
<div id="viewDiv"></div>
</body>
</html>
6.实例化底图控件
1)控件所在目录:esri/widgets
2)控件包含的有:Home、Legend、ScaleBar、Zoom
3)用法1:实例化、添加到view:
let homeWidget = new Home({
view: view,
});
view.ui.add(homeWidget, "top-left");
方法2:控件设置自定义位置:
<style>
...
#zoomWiget{
position: absolute;
top: 50px;
left: 50px;
}
</style>
<script>
//zoom1不自定义位置
let zoom1 = new Zoom({
view: view
});
view.ui.add(zoom1, "top-right");
//zoom2自定义位置
let zoom2 = new Zoom({
view: view,
container: document.getElementById('zoomWiget')
});
view.ui.add(zoom2);
</script>
...
<div id="zoomWiget"></div>
4)全部代码:
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no" />
<title>添加控件</title>
<style>
html,
body,
#viewDiv {
position: relative;
padding: 0;
margin: 0;
height: 100%;
width: 100%;
}
#zoomWiget{
position: absolute;
top: 50px;
left: 50px;
}
</style>
<link rel="stylesheet" href="http://localhost/4.19/esri/css/main.css">
<script src="http://localhost/4.19/init.js"></script>
<script>
require(["esri/Map","esri/views/MapView",
"esri/Basemap","esri/layers/MapImageLayer",
"esri/layers/TileLayer","esri/widgets/Home",
"esri/widgets/Legend","esri/widgets/ScaleBar",
"esri/widgets/Zoom"],
function(Map,MapView,Basemap,MapImageLayer,TileLayer,Home,Legend,ScaleBar,Zoom){
var basemap = new Basemap({
baseLayers:[
new TileLayer({
url: "http://map.geoq.cn/arcgis/rest/services/ChinaOnlineStreetPurplishBlue/MapServer"
}),
],
title:'basemap',
id:'20001'
});
var map = new Map({
basemap:basemap //或者外层写map.add(layer);
});
const view = new MapView({
map:map,
center:[114,22],
zoom:8,
container:'viewDiv'
})
view.ui.components = [];//清空zoom组件
//Home控件
let homeWidget = new Home({
view: view,
});
view.ui.add(homeWidget, "top-left");
//图例控件
let legend = new Legend({
view: view,
});
view.ui.add(legend, "bottom-right");
//比例尺
let scaleBar = new ScaleBar({
view: view,
unit:'metric'
});
view.ui.add(scaleBar, {
position: "bottom-left"
});
//zoom1不自定义位置
let zoom1 = new Zoom({
view: view
});
view.ui.add(zoom1, "top-right");
//zoom2自定义位置
let zoom2 = new Zoom({
view: view,
container: document.getElementById('zoomWiget')
});
view.ui.add(zoom2);
})
</script>
</head>
<body>
<div id="viewDiv"></div>
<div id="zoomWiget"></div>
</body>
</html>
7.地图符号化(样式、标注)
代码:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
html,body {
padding: 0;
width: 100%;
height: 100%;
}
#mapDiv {
margin: 10px auto;
width: 90%;
height: 90%;
border: 2px solid #999;
}
</style>
<link rel="stylesheet" href="http://localhost/4.18api/esri/themes/light/main.css">
<script src="http://localhost/4.18api/init.js"></script>
<script>
require(["esri/Map", "esri/views/MapView", "esri/layers/FeatureLayer"],
function(Map, MapView, FeatureLayer) {
var map = new Map({
basemap: 'topo-vector',
});
//点样式
var trailheadersRenderer = {
type: 'simple',
symbol: {
type: 'picture-marker',
url: 'http://static.arcgis.com/images/Symbols/NPS/npsPictograph_0231b.png',
width: '18px',
height: '18px'
}
};
//点标注,标注TRL_NAME字段
var trailheadsLabels = {
symbol: {
type: "text",
color: "#FFFFFF",
haloColor: "#5E8D74",
haloSize: "2px",
font: {
size: "12px",
family: "Noto Sans",
style: "italic",
weight: "normal"
}
},
labelPlacement: "above-center",
labelExpressionInfo: {
expression: "$feature.TRL_NAME"
}
};
//点图层
var trailheadsLayer = new FeatureLayer({
url: 'https://services3.arcgis.com/GVgbJbqm8hXASVYi/ArcGIS/rest/services/Trailheads/FeatureServer/0',
renderer: trailheadersRenderer,
labelingInfo: [trailheadsLabels]
});
map.add(trailheadsLayer)
//线图层样式,根据海拔ELEV_GAIN设置线宽,海拔0设置3px,海拔2300设置7px
var trailsRenderer = {
type: "simple",
symbol: {
color: "#BA55D3",
type: "simple-line",
style: "solid"
},
visualVariables: [{
type: "size",
field: "ELEV_GAIN",
minDataValue: 0,
maxDataValue: 2300,
minSize: "3px",
maxSize: "7px"
}]
};
var trailsLayer = new FeatureLayer({
url: 'https://services3.arcgis.com/GVgbJbqm8hXASVYi/arcgis/rest/services/Trails/FeatureServer/0',
renderer: trailsRenderer,
opacity: .75
})
map.add(trailsLayer, 0)
//设置自行车专用路线
var bikeTrailsRenderer = {
type: "simple",
symbol: {
type: "simple-line",
style: "short-dot",
color: "#FF91FF",
width: "1px"
}
};
var bikeTrails = new FeatureLayer({
url: "https://services3.arcgis.com/GVgbJbqm8hXASVYi/arcgis/rest/services/Trails/FeatureServer/0",
renderer: bikeTrailsRenderer,
definitionExpression: "USE_BIKE = 'YES'"
});
map.add(bikeTrails, 1);
//为每种类型的公园区域使用不同的符号
function createFillSymbol(value, color) {
return {
"value": value,
"symbol": {
"color": color,
"type": "simple-fill",
"style": "solid",
"outline": {
"style": "none"
}
},
"label": value
};
};
var openSpacesRenderer = {
type: "unique-value",
field: "TYPE",
uniqueValueInfos: [
createFillSymbol("Natural Areas", "#FF0000"),
// createFillSymbol("Natural Areas", "#9E559C"),
createFillSymbol("Regional Open Space", "#A7C636"),
createFillSymbol("Local Park", "#149ECE"),
createFillSymbol("Regional Recreation Park", "#ED5151")
]
};
var parksLayer = new FeatureLayer({
url: "https://services3.arcgis.com/GVgbJbqm8hXASVYi/arcgis/rest/services/Parks_and_Open_Space/FeatureServer/0",
renderer: openSpacesRenderer,
opacity: .2,
});
map.add(parksLayer, 0)
var view = new MapView({
container: 'mapDiv',
map: map,
zoom: 13,
center: [-118.80543, 34.02700],
});
}
)
</script>
</head>
<body>
<div id="mapDiv"></div>
</body>
</html>
8.ArcGIS API绘制点线面
方法1:通过控件的方法实现绘制"esri/widgets/Sketch", "esri/layers/GraphicsLayer"
方法2:通过代码实现绘制:"esri/Graphic"
两种方法实现代码:
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no" />
<title>绘制点线面</title>
<style>
html,
body,
#viewDiv {
padding: 0;
margin: 0;
height: 100%;
width: 100%;
}
</style>
<link rel="stylesheet" href="http://localhost/4.19/esri/css/main.css">
<script src="http://localhost/4.19/init.js"></script>
<script>
require(["esri/Map", "esri/views/MapView",
"esri/widgets/Sketch", "esri/layers/GraphicsLayer",
"esri/Graphic"
], function(Map, MapView, Sketch, GraphicsLayer, Graphic) {
let graphicLayer = new GraphicsLayer()
var map = new Map({
basemap: 'osm',
layers: [graphicLayer]
});
const view = new MapView({
map: map,
center: [114, 22],
zoom: 8,
container: 'viewDiv'
})
//方法1:通过控件的方法实现绘制
const sketch = new Sketch({
layer: graphicLayer,
view: view,
creationMode: "update"
});
view.ui.add(sketch, "top-right")
//方法2:通过代码的方法实现绘制,以画线为例,点线面类似
let polyline = {
type: "polyline", // autocasts as new Polyline()
paths: [
[114, 23],
[114.2, 23.3],
[114.4, 23]
]
};
let polylineSymbol = {
type: "simple-line", // autocasts as SimpleLineSymbol()
color: [226, 119, 40],
width: 4
};
let polylineAtt = {
Name: "Keystone Pipeline",
Owner: "TransCanada"
};
let polylineGraphic = new Graphic({
geometry: polyline,
symbol: polylineSymbol,
attributes: polylineAtt
});
view.graphics.add(polylineGraphic);
})
</script>
</head>
<body>
<div id="viewDiv"></div>
</body>
</html>
9.ArcGIS API弹窗
- 用到的类:"esri/PopupTemplate"
- 弹窗可以放不局限域API的东西,放的就是div:
10.属性查询,并定位到查询的结果
- 用到的类:"esri/tasks/QueryTask", "esri/tasks/support/Query"
- 代码:
-
<html> <head> <meta charset="utf-8" /> <meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no" /> <title>属性查询</title> <style> html, body, #viewDiv { padding: 0; margin: 0; height: 100%; width: 100%; } </style> <link rel="stylesheet" href="http://localhost/4.19/esri/css/main.css"> <script src="http://localhost/4.19/init.js"></script> <script> require(["esri/Map", "esri/views/MapView", "esri/layers/FeatureLayer", "esri/tasks/QueryTask", "esri/tasks/support/Query" ], function(Map, MapView, FeatureLayer, QueryTask, Query) { var map = new Map({ basemap: 'osm' }); const view = new MapView({ map: map, center: [114, 25], zoom: 4, container: 'viewDiv' }) let queryTask = new QueryTask({ url: 'http://localhost:6080/arcgis/rest/services/province/MapServer/0' }); let query = new Query(); query.returnGeometry = true; query.outFields = ["*"]; // query.where = "BOU2_4M_ > 910"; query.where = "NAME= '黑龙江省'"; // When resolved, returns features and graphics that satisfy the query. queryTask.execute(query).then(function(results) { console.log(results.features); x = results.features[0].geometry.extent.center.longitude y = results.features[0].geometry.extent.center.latitude console.log(x, y); setTimeout(() => { view.goTo({ center: [x, y], zoom: 8, }) .catch(function(error) { if (error.name != "AbortError") { console.error(error); } }); }, 2000); }); }) </script> </head> <body> <div id="viewDiv"></div> </body> </html>