iClient对接区域汇总分析
作者:互联网
作者:LX
在SuperMap iServer分布式分析服务中,提供了针对海量数据的区域汇总分析功能。本文将介绍如何通过iClient对接分布式分析服务中的区域汇总分析服务并将结果在前端展示。
一、 区域汇总是为什么?
区域汇总分析,指的是针对线数据集和面数据集制作聚合图的一种空间分析作业。指通过网格面或多边形对地图线或面要素进行划分,然后,以标准属性字段或权重字段对每个网格单元内线或面要素进行统计,将统计结果作为该网格单元的统计值。最后按照网格单元统计值的大小进行排序,通过色带对网格单元进行色彩填充。
两种统计形式:
标准属性字段统计:即对通过网格单元内的线或面对象的原有属性字段信息进行统计。
权重字段统计:即对通过网格单元内的线或面对象与网格单元相交部分的对象属性信息进行统计,相交部分的属性信息由标准属性字段的值加权计算得出。
以下图为例进行解释:图中是以四边形网格进行的区域汇总分析,高亮显示的网格单元里有两个线对象,线对象A和线对象B。其中线对象A的总长是从A1至A4点,但只有A2至A3部分在网格单元内;线对象B的总长是B1至B3点,但只有B1至B2部分在网格单元内。我们现在对线数据集的“length”字段,进行"sum"统计。
以标准属性字段统计:
• 线对象A的length属性值(即A1至A4点的总长度)为364.11
• 线对象B的length属性值(即B1至B3点的总长度)为165.01
• 以“sum”的统计模式进行统计,该网格单元的统计值结果为364.11+165.01=529.12
以权重字段统计:
• 分析算法将线对象A在A2点和A3点处打断,计算A2A3部分在整个线对象A中所占的比重,通过线对象A的length属性值(即A1至A4点的总长度)364.11,计算出A2A3的属性值为79.70;
• 分析算法将线对象B在B2处打断,计算B1B2部分在整个线对象B中所占的比重,通过线对象B的length属性值(即B1至B3点的总长度)165.01,计算出B1B2的属性值为31.72
• 以“sum”的统计模式进行统计,则该网格单元的统计值结果为79.70+31.72=111.42
二、 开发准备
1、搭建分布式分析环境并发布分布式分析服务,参考博客《快速搭建iServer大数据分布式空间分析服务》进行分布式分析环境的搭建以及服务的发布;
2、服务端进行区域汇总分析(验证服务有效性)
1)发布分布式分析服务,然后进入到服务的jobs资源下,选中区域汇总
2)创建分析任务
3)分析成功
3、iClient开发包,可以通过官网地址下载: http://support.supermap.com.cn/DownloadCenter/ProductPlatform.aspx
三、 iClient开发代码
SuperMap提供了多个GIS前端开发地图库,我们在这以iClient for Openlayers为例来对接。
1、引入js文件
需要引入openlayers的css和js文件,以及iclient9-openlayers的css,js文件;
我们的iclient包中只需要引入include-openlayers.js就可以加载以上全部文件
<script type="text/javascript" src="http://iclient.supermap.io/dist/openlayers/include-openlayers.js"></script>
2、定义服务url并创建底图
//分布式分析服务
var processingsUrl ="http://localhost:8090/iserver/services/distributedanalyst/rest/v1/jobs";
//地图服务
var mapURL ="http://localhost:8090/iserver/services/map-world/rest/maps/World";
var map = new ol.Map({
target: 'map',
view: new ol.View({
center: [-73.95, 40.75],
zoom: 12,
projection: 'EPSG:4326'
})
});
map.addLayer(new ol.layer.Tile({
source: new ol.source.TileSuperMapRest({
url: mapURL,
}),
}));
3、安全验证
//安全验证
var token=” I5OZZxPYAZIJvL7tCQCZB6qMHrG8hMw0a0hOqvCRlm7sMA_5MyRZSoLZxNbPXHevAvDniCJgtSOiCzx466HPjA..”;
SuperMap.SecurityManager.registerToken(processingsUrl, token);
4、设置区域汇总分析参数(以标准属性字段统计)
//区域汇总参数
var summaryRegionJobParameter = new SuperMap.SummaryRegionJobParameter({
datasetName:"samples_processing_newyorkZone_R",//数据集名称
type:"SUMMARYMESH",//网格面汇总
meshType:"0",//四边形网格
query:[-74.05,40.65,-73.85,40.85],//分析范围
standardSummaryFields: true,//以标准属性字段统计
standardStatisticModes: "max",//统计模式
standardFields:"LocationID",//字段名称
resolution: "1000",//格网大小
meshSizeUnit:"Meter",//网格大小单位
sumShape:true //统计面积
});
5、区域汇总分析
//定义分布式分析服务
var processingService = new ol.supermap.ProcessingService(processingsUrl);
//执行区域汇总分析
processingService.addSummaryRegionJob(summaryRegionJobParameter, function (serviceResult) {
//获取分布式分析结果
serviceResult.result.setting.serviceInfo.targetServiceInfos.map(function (info) {
if (info.serviceType === 'RESTMAP') {
SuperMap.FetchRequest.get(info.serviceAddress + '/maps').then(function (
response) {
return response.json();
}).then(function (result) {
//将结果展示在地图上
var mapUrl = result[0].path;
new ol.supermap.MapService(mapUrl).getMapInfo(function (
mapInfo) {
layer = new ol.layer.Tile({
source: new ol.source.ImageSuperMapRest(
ol.source.ImageSuperMapRest
.optionsFromMapJSON(mapUrl,
mapInfo.result))
});
map.addLayer(layer);
});
});
}
});
});
6、结果展示
附上完整代码:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title data-i18n="resources.title_SummaryRegionJobService"></title>
<script type="text/javascript" src="../../dist/openlayers/include-openlayers.js"></script>
</head>
<body style=" margin: 0;overflow: hidden;background: #fff;width: 100%;height:100%;position: absolute;top: 0;">
<div id="map" style="width: 100%;height:100%"></div>
<script type="text/javascript" include="bootstrap,jquery,widgets" src="../js/include-web.js"></script>
<script type="text/javascript">
var layer,
processingsUrl ="http://localhost:8090/iserver/services/distributedanalyst/rest/v1/jobs",
mapURL ="http://localhost:8090/iserver/services/map-world/rest/maps/World",
map = new ol.Map({
target: 'map',
view: new ol.View({
center: [-73.95, 40.75],
zoom: 12,
projection: 'EPSG:4326'
})
});
map.addLayer(new ol.layer.Tile({
source: new ol.source.TileSuperMapRest({
url: mapURL,
})
}));
var processingService = new ol.supermap.ProcessingService(processingsUrl);
SuperMap.SecurityManager.registerToken(processingsUrl, "I5OZZxPYAZIJvL7tCQCZBxiYOPOK8EZwixXh7nTdlfhJ1_cDuVyoHaA1pgUKEG2vJsjHxX1bRvMAf6l6yqzGug..");
//区域汇总参数
var summaryRegionJobParameter = new SuperMap.SummaryRegionJobParameter({
datasetName:"samples_processing_newyorkZone_R",//数据集名称
type:"SUMMARYMESH",//网格面汇总
meshType:"0",//四边形网格
query:[-74.05,40.65,-73.85,40.85],//分析范围
standardSummaryFields: true,//以标准属性字段统计
standardStatisticModes: "max",//统计模式
standardFields:"LocationID",//字段名称
resolution: "1000",//格网大小
meshSizeUnit:"Meter",//网格大小单位
sumShape:true //统计面积
});
processingService.addSummaryRegionJob(summaryRegionJobParameter, function (serviceResult) {
//获取分布式分析结果
serviceResult.result.setting.serviceInfo.targetServiceInfos.map(function (info) {
if (info.serviceType === 'RESTMAP') {
SuperMap.FetchRequest.get(info.serviceAddress + '/maps').then(function (
response) {
return response.json();
}).then(function (result) {
//将结果展示在地图上
var mapUrl = result[0].path;
new ol.supermap.MapService(mapUrl).getMapInfo(function (
mapInfo) {
layer = new ol.layer.Tile({
source: new ol.source.ImageSuperMapRest(
ol.source.ImageSuperMapRest
.optionsFromMapJSON(mapUrl,
mapInfo.result))
});
map.addLayer(layer);
});
});
}
});
});
</script>
</body>
</html>
标签:map,iClient,汇总,对接,网格,ol,new,统计 来源: https://blog.csdn.net/supermapsupport/article/details/100045063