三、分级色彩专题图
1、引言
分级色彩专题图,即将要素属性值按照一定的分级方法分成若干级别,并用不同的颜色来表示。每个级别代表了数值的一个范围,从而明确地反映专题要素之间的数值差异。
分级色彩专题图制作的关键在于分级方法的选择和色彩的搭配。合理的配色和分级方法可以将地理地理现象的分布规律清晰、明确地体现出来。分级色彩专题图常用来渲染面状要素,多用于表达人口密度分布、农作物产量分布等。
如下图所示,为1990年墨西哥分级色彩人口分布专题图。
2、ClassBreaksRenderer
分级色彩专题图的绘制需要使用esri/renderers/ClassBreaksRenderer类,它的构造方法为:
new ClassBreaksRenderer(defaultSymbol, attributeField)
- defaultSymbol为渲染器默认符号;
attributeField为指定渲染的字段名。
代码实例:
//设置默认符号样式
var symbol = new SimpleFillSymbol();
symbol.setColor(new Color([150, 150, 150, 0.5]));
//基于"POP1990"属性值进行分级
var renderer = new ClassBreaksRenderer(symbol, "POP1990");
常用方法:
addBreak(minValueOrInfo, maxValue?, symbol?)
- minValueOrInfo:可以是单个最小值参数,或一个对象
- maxValue:级别的最大值
- symbol:分级的渲染符号
代码实例:
//参数形式
renderer.addBreak(2, 5, symbol);
//对象形式
renderer.addBreak({
minValue: 2,
maxValue: 5,
symbol: symbol,
label: "Low Density"
});
添加要素图层并渲染:
var infoTemplate = new InfoTemplate("${NAME}", "${*}");
var featureLayer = new FeatureLayer("http://localhost:6080/arcgis/rest/services/test/moxica/MapServer/2", {
mode: FeatureLayer.MODE_SNAPSHOT,
outFields: ["*"],
infoTemplate: infoTemplate
});
featureLayer.setRenderer(CBrenderer);
map.addLayer(featureLayer);
添加图例:
var legend = new Legend({ //设置专题信息
map: map,
layerInfos: [{
layer: featureLayer,
title: " 1990年墨西哥人口分布图"
}]
}, "legend");
legend.startup();
3、完整代码:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="viewport" content="initial-scale=1, maximum-scale=1,user-scalable=no">
<meta http-equiv="Access-Control-Allow-Origin" content="*">
<title>分级色彩专题图</title>
<link rel="stylesheet" type="text/css" href="http://localhost/arcgis_js_api/library/3.17/3.17/dijit/themes/claro/claro.css" />
<link rel="stylesheet" type="text/css" href="http://localhost/arcgis_js_api/library/3.17/3.17/esri/css/esri.css" />
<script type="text/javascript" src="http://localhost/arcgis_js_api/library/3.17/3.17/init.js"></script>
<style>
html, body, #map{
height: 100%;
margin: 0;
padding: 0;
}
#info {
position: absolute;
left: 0;
bottom: 0;
padding: 1em 1em 0 1em;
background: #fff;
font: 14px sans-serif;
width: 250px;
text-align: center;
border-radius: 0 10px 0 0;
border: 1px solid #000;
}
</style>
<script type="text/javascript">
var map;
require([
"esri/map",
"esri/layers/ArcGISDynamicMapServiceLayer",
"esri/layers/FeatureLayer",
"esri/InfoTemplate",
"esri/symbols/SimpleFillSymbol",
"esri/renderers/ClassBreaksRenderer",
"esri/dijit/Legend",
"esri/Color",
"dojo/dom-style",
"dojo/on",
"dojo/domReady!"],
function(Map, ArcGISDynamicMapServiceLayer, FeatureLayer, InfoTemplate, SimpleFillSymbol, ClassBreaksRenderer, Legend, Color, domStyle, on) {
map = new Map("map", {
basemap:"topo",
center: [-102.12, 23.09],
zoom: 5,
logo:false
});
var moxico= ArcGISDynamicMapServiceLayer("http://localhost:6080/arcgis/rest/services/test/moxico/MapServer");
map.addLayer(moxico);
var symbol = new SimpleFillSymbol(); //设置默认符号样式
symbol.setColor(new Color([150, 150, 150, 0.5]));
var CBrenderer = new ClassBreaksRenderer(symbol, "POP1990");
CBrenderer.addBreak(0, 1000000, new SimpleFillSymbol().setColor(new Color([0, 159, 255, 0.5])));
CBrenderer.addBreak(1000000, 3000000, new SimpleFillSymbol().setColor(new Color([0, 209, 56, 0.5])));
CBrenderer.addBreak(3000000, 5000000, new SimpleFillSymbol().setColor(new Color([255, 255, 0, 0.5])));
CBrenderer.addBreak(5000000, 7000000, new SimpleFillSymbol().setColor(new Color([255, 128, 0, 0.5])));
CBrenderer.addBreak(7000000, 9000000, new SimpleFillSymbol().setColor(new Color([255, 0, 255, 0.5])));
CBrenderer.addBreak(9000000, Infinity, new SimpleFillSymbol().setColor(new Color([255, 0, 0, 0.5])));
var infoTemplate = new InfoTemplate("${NAME}", "${*}"); //新建信息模板
var featureLayer = new FeatureLayer("http:// localhost:6080/arcgis/rest/services/test/moxico/MapServer/2", {
mode: FeatureLayer.MODE_SNAPSHOT,
outFields: ["*"],
infoTemplate: infoTemplate
});
featureLayer.setRenderer(CBrenderer); //渲染器应用到特征图层
map.addLayer(featureLayer); //加载特征图层到地图
featureLayer.on("load", function(e) {
var legend = new Legend({ //设置专题信息
map: map,
layerInfos: [{
layer: featureLayer,
title: " 1990年墨西哥人口分布图"
}]
}, "legend");
legend.startup();
});
});
</script>
</head>
<body class = "claro">
<div id="map"></div>
<div id="info">
<div id="legend" style="width=200px;"></div>
</div>
</body>
</html>
想了解更多关于ClassBreaksRenderer的相关属性方法可访问官方文档。
四、分级符号专题图
1、引言
分级符号专题图,即根据不同级别的要素属性值,采用大小不同的符号对其进行渲染而得到的地图。符号的形状取决于专题要素的特征,符号的大小取决于级别的高低或者等级数值的大小。分级符号一般用于表示点状、线状要素,如表达人口分级图、道路分级图等。
在ArcGIS API for Javascript中,没有专门用于分级符号专题图制作的类,对于点要素、线要素图层,可以通过调用渲染器类的setSizeInfo(info)方法实现渲染;对于面要素图层,可使用ClassBreaksRenderer类来分级实现。
2、点要素图层分级符号专题图
如下图所示,为墨西哥城市人口点要素分级专题图。
在调用setSizeInfo(info)方法之前,首先应该实例化一个sizeInfo信息对象,常用属性如下:
- Field:包含属性值的属性字段名或返回数据值的公式;
- valueUnit:若数据表示长度时,则该属性的单位为长度单位,如inches、feet、yards、miles、nautical-miles、millimeters、centimeters、decimeters、meters、kilometers、decimal-degrees、unknown等,若不代表长度则需将该属性设置为“unknown”;
- maxDataValue:属性值的最大值。
- minDataValue:属性值的最小值。当valueUnit设置为“unknown”时,则必须指定该属性。
- maxSize:符号最大值,单位为像素。
- minSize:符号最大值,单位为像素。当valueUnit设置为“unknown”时,则必须指定该属性。
示例代码:
var sizeInfo = {
field: "POPULATION",
valueUnit: "unknown",
minSize: 5,
maxSize: 50,
minDataValue: 100000,
maxDataValue: 500000
};
3、完整代码:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="viewport" content="initial-scale=1, maximum-scale=1,user-scalable=no">
<meta http-equiv="Access-Control-Allow-Origin" content="*">
<title>点要素分级符号专题图</title>
<link rel="stylesheet" type="text/css" href="http://localhost/arcgis_js_api/library/3.17/3.17/dijit/themes/claro/claro.css" />
<link rel="stylesheet" type="text/css" href="http://localhost/arcgis_js_api/library/3.17/3.17/esri/css/esri.css" />
<script type="text/javascript" src="http://localhost/arcgis_js_api/library/3.17/3.17/init.js"></script>
<style>
html, body, #map{
height: 100%;
margin: 0;
padding: 0;
}
#info {
position: absolute;
left: 0;
bottom: 0;
padding: 1em 1em 0 1em;
background: #fff;
font: 14px sans-serif;
width: 250px;
text-align: center;
border-radius: 0 10px 0 0;
border: 1px solid #000;
}
</style>
<script type="text/javascript">
var map;
require([
"esri/map",
"esri/layers/ArcGISDynamicMapServiceLayer",
"esri/layers/FeatureLayer",
"esri/InfoTemplate",
"esri/symbols/SimpleFillSymbol",
"esri/renderers/ClassBreaksRenderer",
"esri/dijit/Legend",
"esri/Color",
"dojo/on",
"dojo/domReady!"],
function(Map, ArcGISDynamicMapServiceLayer, FeatureLayer, InfoTemplate, SimpleFillSymbol, ClassBreaksRenderer, Legend, Color, on) {
map = new Map("map", {
basemap:"topo",
center: [-102.12, 23.09],
zoom: 5,
logo:false
});
var moxico= ArcGISDynamicMapServiceLayer("http://localhost:6080/arcgis/rest/services/test/moxico/MapServer");
map.addLayer(moxico);
var sizeInfo = {
field: "POPULATION",
valueUnit: "unknown",
minSize: 5,
maxSize: 50,
minDataValue: 100000,
maxDataValue: 500000 };
var infoTemplate = new InfoTemplate("${NAME}", "${*}"); //新建信息模板
var featureLayer = new FeatureLayer("http://localhost:6080/arcgis/rest/services/test/moxico/MapServer/0", {
mode: FeatureLayer.MODE_SNAPSHOT,
outFields: ["*"],
infoTemplate: infoTemplate
});
featureLayer.on("load", function(e) {
featureLayer.renderer.setSizeInfo(sizeInfo); //调用渲染器类的.setSizeInfo方法
map.addLayer(featureLayer);
var legend = new Legend({ //设置专题信息
map: map,
layerInfos: [{
layer: featureLayer,
title: " The population of city(1990)"
}]
}, "legend");
legend.startup();
});
});
</script>
</head>
<body class = "claro">
<div id="map"></div>
<div id="info">
<div id="legend" style="width=150px;"></div>
</div>
</body>
</html>
4、面要素图层分级符号专题图
面要素分级专题图,可使用ClassBreaksRenderer类来分类实现,在多边形中显示指定的符号。这种方法设置的符号大小与分级字段的属性值不成比例。
如下图所示,为墨西哥各州面积分级专题图。
定义符号:
//定义符号属性
var outline = new SimpleLineSymbol().setWidth(1.5).setColor(new Color("#76EEC6"));
var color = new Color([50, 205, 100, 0.75]);
新建ClassBreaksRenderer并分级:
var renderer = new ClassBreaksRenderer(null, "AREA");
//基于"AREA"属性值进行分级
var classBreaks = [
{ minValue:0, maxValue:10000, size:10 },
{ minValue:10000, maxValue:30000, size:20 },
{ minValue:30000, maxValue:50000, size:30 },
{ minValue:50000, maxValue:70000, size:40 },
{ minValue:70000, maxValue:90000, size:50 },
{ minValue:90000, maxValue:1000000, size:60}
];
array.forEach(classBreaks, function (classBreak) {
renderer.addBreak(classBreak.minValue, classBreak.maxValue, new SimpleMarkerSymbol(SimpleMarkerSymbol.STYLE_DIAMOND, classBreak.size, outline, color));
});
5、完整代码:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="viewport" content="initial-scale=1, maximum-scale=1,user-scalable=no">
<meta http-equiv="Access-Control-Allow-Origin" content="*">
<title>面要素分级符号专题图</title>
<link rel="stylesheet" type="text/css" href="http://localhost/arcgis_js_api/library/3.17/3.17/dijit/themes/claro/claro.css" />
<link rel="stylesheet" type="text/css" href="http://localhost/arcgis_js_api/library/3.17/3.17/esri/css/esri.css" />
<script type="text/javascript" src="http://localhost/arcgis_js_api/library/3.17/3.17/init.js"></script>
<style>
html, body, #map{
height: 100%;
margin: 0;
padding: 0;
}
#info {
position: absolute;
left: 0;
bottom: 0;
padding: 1em 1em 0 1em;
background: #fff;
font: 14px sans-serif;
width: 230px;
text-align: center;
border-radius: 0 10px 0 0;
border: 1px solid #000;
}
</style>
<script type="text/javascript">
var map;
require([
"esri/map",
"esri/layers/ArcGISDynamicMapServiceLayer",
"esri/layers/FeatureLayer",
"esri/InfoTemplate",
"esri/symbols/SimpleMarkerSymbol",
"esri/symbols/SimpleLineSymbol",
"esri/symbols/SimpleFillSymbol",
"esri/renderers/ClassBreaksRenderer",
"dojo/_base/array",
"esri/dijit/Legend",
"esri/Color",
"dojo/domReady!"],
function(Map, ArcGISDynamicMapServiceLayer, FeatureLayer, InfoTemplate, SimpleMarkerSymbol, SimpleLineSymbol, SimpleFillSymbol, ClassBreaksRenderer, array, Legend, Color, on) {
map = new Map("map", {
basemap:"topo",
center: [-102.12, 23.09],
zoom: 5,
logo:false
});
var moxico = ArcGISDynamicMapServiceLayer("http://localhost:6080/arcgis/rest/services/test/moxico/MapServer");
map.addLayer(moxico);
var outline = new SimpleLineSymbol().setWidth(1.5).setColor(new Color("#76EEC6"));
var color = new Color([50, 205, 100, 0.75]);
var renderer = new ClassBreaksRenderer(null, "AREA"); //基于"AREA"属性值进行分级
var classBreaks = [
{ minValue:0, maxValue:10000, size:10 },
{ minValue:10000, maxValue:30000, size:20 },
{ minValue:30000, maxValue:50000, size:30 },
{ minValue:50000, maxValue:70000, size:40 },
{ minValue:70000, maxValue:90000, size:50 },
{ minValue:90000, maxValue:1000000, size:60}
];
var infoTemplate = new InfoTemplate("${NAME}", "${*}"); //新建信息模板
var featureLayer = new FeatureLayer("http://localhost:6080/arcgis/rest/services/test/moxico/MapServer/2", {
mode: FeatureLayer.MODE_SNAPSHOT,
outFields: ["*"],
infoTemplate: infoTemplate
});
array.forEach(classBreaks, function (classBreak) {
renderer.addBreak(classBreak.minValue, classBreak.maxValue, new SimpleMarkerSymbol(SimpleMarkerSymbol.STYLE_DIAMOND, classBreak.size, outline, color));
});
featureLayer.setRenderer(renderer); //渲染器应用到要素图层
map.addLayer(featureLayer); //显示要素图层
featureLayer.on("load", function(e) {
var legend = new Legend({ //设置专题信息
map: map,
layerInfos: [{
layer: featureLayer,
title: " The area of state(1990)"
}]
}, "legend");
legend.startup();
});
});
</script>
</head>
<body class = "claro">
<div id="map"></div>
<div id="info">
<div id="legend" style="width=150px;"></div>
</div>
</body>
</html>