作者:yyy
地图图例是地图上表示地理事物的符号,是地图上各种符号和颜色所代表内容与指标的说明,集中于地图一角或一侧。图例应符合完备性和一致性的原则。图例具有双重任务,在编图时作为图解表示地图内容的准绳,用图时作为必不可少的阅读指南。它有助于用户更方便的使用地图、理解地图内容。
目前在SuperMap iServer11i新版本中地图服务新增了legend子资源,支持一次获取地图所有图层的图例信息,也可以返回指定范围、指定图层的图例信息,接下来我们就通过试用SuperMap 11i Beta版本的系列产品来实现对图例的应用。
通过SuperMap iDesktop产品制作地图时我们在“图层管理器”中新建图层组,图层控制,修改图层风格、制作专题图等的方式来构建一个默认的或自定义图例地图;然后保存地图、保存工作空间即可。下图是通过SuperMap iDesktop 11i Beta版本制作的两个地图,其中一个是通过自定义图层组、图例、专题图的方式制作的地图;另一个是只设置了图层组,图例使用默认方式制作的地图,两个地图显示效果如下:
当制作好地图后我们就可以通过SuperMap iServer 11i Beta版本将上述的工作空间发布为地图服务,然后在地图服务“支持以下操作”列表中会有一个“legend”图例子资源,当点击访问“legend”后我们就可以看到在“图层图例列表”中将当前地图中所有图层的图例对象都一一展示出来了,这里就可以发现当前展示出来的图例对象中的效果跟在iDesktop中“图层管理器”中的效果一致,都包含了图层组内容。
当我们得到图例信息后又该怎么去获取其具体样式并使用呢?下面就告诉大家如何通过请求来获取图例详细信息和样式内容。通过上述的服务地址,我们可以看到图例对象的请求头格式是有一个默认的固定内容,如:"地图服务地址"+"legend"+"?"+"bbox=xmin,ymin,xmax,ymax";在通过更换图例对象的表述格式为rjson后,我们可以更清晰的看到在默认情况下一个图例对象的表述内容:
{"layerLegends": [{
"subLayerLegends": [
{
"subLayerLegends": [{
"subLayerLegends": null,
"layerType": "UGC",
"legends": [{
"imageData": "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAJUlEQVQ4jWNMS0v7z0ABYAERVZk1ZBvARIntowaMGjBqABUNAABexQOygF8COgAAAABJRU5ErkJggg==",
"values": null,
"width": 16,
"label": "Countries@testworld",
"contentType": "image/png",
"url": "http://localhost:8091/iserver/output/resources/testcountries/SYMBOLFILL/0_-58026551.png",
"height": 16
}],
"maxScale": 0,
"layerName": "Countries@testworld",
"minScale": 0
}],
"layerType": "UGC",
"legends": [{
"imageData": "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAVElEQVR42mNgGBRA3rP2CBD/x4LPKLtVyxJjwH88+D4QG1JiABquO0yhAbVHcBog51lrTW4ggg0gEKC4vYJmANHeGWYGHIFFD1kGwAAoGilKDwMCAG1C9/N/2myFAAAAAElFTkSuQmCC",
"values": null,
"width": 16,
"label": "LayerGroup#1",
"contentType": "image/png",
"url": "http://localhost:8091/iserver/manager/static/Theme/image/layerGroup.png",
"height": 16
}],
"maxScale": 0,
"layerName": "LayerGroup#1",
"minScale": 0
},
{
"subLayerLegends": null,
"layerType": "UGC",
"legends": [{
"imageData": "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAJUlEQVQ4jWNMS0v7z0ABYAERPT0hZBvARIntowaMGjBqABUNAACQNAO/KgaADgAAAABJRU5ErkJggg==",
"values": null,
"width": 16,
"label": "world@testworld",
"contentType": "image/png",
"url": "http://localhost:8091/iserver/output/resources/testcountries/SYMBOLFILL/0_858832806.png",
"height": 16
}],
"maxScale": 0,
"layerName": "world@testworld",
"minScale": 0
}
],
"layerType": "UGC",
"legends": [{
"imageData": "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAVElEQVR42mNgGBRA3rP2CBD/x4LPKLtVyxJjwH88+D4QG1JiABquO0yhAbVHcBog51lrTW4ggg0gEKC4vYJmANHeGWYGHIFFD1kGwAAoGilKDwMCAG1C9/N/2myFAAAAAElFTkSuQmCC",
"values": null,
"width": 16,
"label": "LayerGroup",
"contentType": "image/png",
"url": "http://localhost:8091/iserver/manager/static/Theme/image/layerGroup.png",
"height": 16
}],
"maxScale": 0,
"layerName": "LayerGroup",
"minScale": 0
}]}
通过请求得到了图例的json格式内容,那下面就详细介绍下其每个参数都具体代表什么含义。其中url参数即为我们需要用到的图例图片。
Response Schema: application/json
{
layerLegends //Array of object各图层图例信息
Array [
layerName //string 图层名称
layerType //string 图层类型
minScale //number 图层最小可见比例尺
maxScale //number 图层最大可见比例尺
legends //Array of object 图层的各图例项信息
Array [
label //string 图例的标签
imageData //string 图例图片内容的base64表示。
url //string 图例图片的url
contentType //string 图例图片的类型,暂时只支持png
width //string 图例图片的宽度,默认16像素
height //string 图例图片的高度,默认16像素
values //object如果是分段专题图,values={start:startValue,end:endValue},分段范围默认是[start,end);如果是单值专题图,values={unique:uniqueValue}
]
subLayerLegends LayerLegend[] //各子图层的图例。subLayerLegends 的类型是 LayerLegend[]。
]
}
那么对于其他情况下,又该如何自定义请求头方式来获取满足条件的图例信息呢?根据帮助文档描述,通过“mapLegend”资源表示地图各图层图例信息的集合来获取地图各图层图例信息。
path Parameters(路径参数) |
mapname (必填)(string) |
地图名 |
query Parameters(请求参数) |
bbox (string) |
查询与此矩形框有交集的图层的图例,当 layers 参数未设置时,bbox 是必填参数。格式:bbox=xmin,ymin,xmax,ymax |
layers (string) |
图层过滤,当 bbox 参数未设置时,layers 是必填参数。语法:layers=[show|hide]:[layerName]@@[layerGroupName]@@[mapName]。show 表示只返回指定图层的图例,hide 表示指定图层图例不返回,其他查询出来的图层图例都返回。支持多个图层,各图层间以英文逗号间隔。如 show:country@World@@World,表示只返回 World 地图 country@World 图层的图例。 | |
transparent (boolean) |
图例图片是否背景透明。默认为true。 | |
returnVisibleOnly (boolean) |
是否只返回当前地图范围内可见要素的图例。默认为 false。 | |
mapScale (number) |
地图比例尺。当 returnVisibleOnly 为 true 时,mapScale 是必填参数。 | |
width (integer) |
返回图例的宽度。默认 16 像素。 | |
height (integer) | 返回图例的高度。默认 16 像素。 |
通过上述的请求头请求参数,我们就可以自定义请求内容,来返回满足自定义要去的图例信息了,比如这里我们返回指定图层"world"和"LayerGroup#1中的Countries"的两个图例,那么请求头的内容就应该是这样的:
http://localhost:8091/iserver/services/map-testmap/rest/maps/testcountries/legend?layers=show:world@testworld@@LayerGroup@@testcountries,Countries@testworld@@LayerGroup.1@@LayerGroup@@testcountries
其中“world@testworld@@LayerGroup@@testcountries”和“Countries@testworld@@LayerGroup.1@@LayerGroup@@testcountries”为地图子图层集中的内容,我们可以通过在"layers"对象中获取到,通过自定义“layers”对象,我们可以获取到指定图层集的图例信息,获取结果如下:
在图例使用过程中需要注意的内容:
1、在11i beta之前的版本中,我们也可以通过在地图服务的layers对象中获取到单个图层的图例,如:http://localhost:8091/iserver/services/map-testmap/rest/maps/testworld/layers/Capitals@testone@@LayerGroup.1@@LayerGroup@@testworld/legend,其中“Capitals@testone@@LayerGroup.1@@LayerGroup@@testworld”为图层名,但由于这里只能一次获取到一个图例,而且对于专题图图层来说也并不能获取到某个具体值或范围的图例;
2、对于图例来说,只有工作空间发布的地图服务的图例对象才有内容,因为图例信息是保存在地图中的,对于瓦片发布的地图服务,其图例为空;
3、在图层图例列表中,每个图例的显示顺序和层级都是和地图在iDesktop的图层管理器中显示的一致,如果显示有问题,请更新iServer到最新版。