[置顶] arcgis api for js入门开发系列十二 GP服务 实现缓冲区及运算分析(含源代码)
2017-03-03 02:20
537 查看
概述:
GP服务的存在使得在Web端使用ArcGIS 提供的空间分析,而这些分析的能力是和桌面中的一样的。因此,是Arcgis for js的一个重点,也是一个难点。因此,在本文讲述如何发布并在代码中调用GP服务,实现缓冲区的分析计算。
简介:
框架介绍参考文章:http://www.cnblogs.com/HPhone/archive/2012/11/05/2755833.html
服务发布参考文章:http://www.cnblogs.com/HPhone/archive/2012/11/18/2775492.html
模型参数:
[plain] view
plain copy
print?
Parameters:
Parameter: input
Data Type: GPFeatureRecordSetLayer
Display Name input
Description: input buffer
Direction: esriGPParameterDirectionInput
Default Value:
Geometry Type: esriGeometryPoint
HasZ: false
HasM: false
Spatial Reference: 4326 (4326)
Fields:
FID ( type: esriFieldTypeOID , alias: FID )
name ( type: esriFieldTypeString , alias: name , length: 100 )
id ( type: esriFieldTypeDouble , alias: id )
Features: None.
Parameter Type: esriGPParameterTypeRequired
Category:
Parameter: output
Data Type: GPFeatureRecordSetLayer
Display Name output
Description: ouput feature
Direction: esriGPParameterDirectionOutput
Default Value:
Geometry Type: esriGeometryPolygon
HasZ: false
HasM: false
Spatial Reference: 4326 (4326)
Fields:
FID ( type: esriFieldTypeOID , alias: FID )
name ( type: esriFieldTypeString , alias: name , length: 100 )
id ( type: esriFieldTypeDouble , alias: id )
BUFF_DIST ( type: esriFieldTypeDouble , alias: BUFF_DIST )
Shape_Length ( type: esriFieldTypeDouble , alias: Shape_Length )
Shape_Area ( type: esriFieldTypeDouble , alias: Shape_Area )
Features: None.
Parameter Type: esriGPParameterTypeRequired
Category:
Parameter: Distance__value_or_field_
Data Type: GPLinearUnit
Display Name Distance
Description: Distance
Direction: esriGPParameterDirectionInput
Default Value: 50.0 (esriKilometers)
Parameter Type: esriGPParameterTypeRequired
Category:
说明:
模型中有三个参数:1、输入;2、输出;3、缓冲距离单位或者字段。
代码实现:
1、添加绘制工具并定义事件
[javascript] view
plain copy
print?
toolbar = new Draw(map);
dojo.connect(toolbar, 'onDrawEnd', drawEnd);
$("#point").on("click",function(){
map.graphics.clear();
toolbar.activate(esri.toolbars.Draw.POINT);
});
$("#polyline").on("click",function(){
map.graphics.clear();
toolbar.activate(esri.toolbars.Draw.POLYLINE);
});
$("#polygon").on("click",function(){
map.graphics.clear();
toolbar.activate(esri.toolbars.Draw.POLYGON);
});
2、绘制结束后提交计算
[javascript] view
plain copy
print?
/**
* 绘制结束
* @param geometry
*/
function drawEnd(geometry) {
$.messager.prompt('提示信息', '请输入缓冲区范围:', function(dist){
if (dist){
$.messager.progress({
text:"计算中,请稍后..."
});
toolbar.deactivate();
var symbol = null;
if(geometry.type==="point"){
symbol = new esri.symbol.SimpleMarkerSymbol(esri.symbol.SimpleMarkerSymbol.STYLE_SQUARE, 10,
new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_SOLID,
new esri.Color([255,0,0]), 1),
new esri.Color([0,255,0,0.25]));
}
else if(geometry.type==="polyline"){
symbol=new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_DASHDOT, new dojo.Color([255, 0, 0]), 2);
}
else{
symbol = new esri.symbol.SimpleFillSymbol(esri.symbol.SimpleFillSymbol.STYLE_SOLID, new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_DASHDOT, new dojo.Color([255, 0, 0]), 2), new dojo.Color([255, 255, 0, 0.25]));
}
var graphic = new esri.Graphic(geometry, symbol);
map.graphics.add(graphic);
tojob(graphic,dist);
}
});
}
function tojob(graphic,distance) {
//第一步构造GP
var gpUrl = 'http://localhost:6080/arcgis/rest/services/buffer/GPServer/buffer';
gp = new esri.tasks.Geoprocessor(gpUrl);
//第二步,构造参数
//我们通过上面,了解到GPFeatureRecordSetLayer对应FeatureSet
var features = [];
features.push(graphic);
var featureset = new esri.tasks.FeatureSet();
featureset.features = features;
//构造缓冲长度,这里的单位是可以更改的,我使用的是度,简单一些
var Dis = new esri.tasks.LinearUnit();
Dis.distance = distance;
Dis.units = esri.Units.KILOMETERS;
var parms = {
input : featureset,
Distance__value_or_field_ : Dis
};
//这里函数是异步的,使用函数是submitJob,同步的使用的是execute。
//成功之后,调用jobResult,建议看一下这个参数。
gp.submitJob(parms, jobResult);
}
3、计算成功将结果绘制出来
[javascript] view
plain copy
print?
/**
* 计算完成
* @param result
*/
function jobResult(result) {
var jobId = result.jobId;
var status = result.jobStatus;
if(status === esri.tasks.JobInfo.STATUS_SUCCEEDED) {
//成功之后,将其中的结果取出来,当然这也是参数名字。
//在模型中,想要取出中间结果,需要设置为模型参数
gp.getResultData(jobId, "output", addResults);
}
}
function addResults(results){
$.messager.progress('close');
var features = results.value.features;
if(features.length>0) {
for (var i = 0, length = features.length; i != length; ++i) {
var feature = features[i];
var polySymbolRed = new esri.symbol.SimpleFillSymbol();
polySymbolRed.setOutline(new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_SOLID, new dojo.Color([0, 0, 0, 0.5]), 1));
polySymbolRed.setColor(new dojo.Color([255, 0, 0, 0.5]));
feature.setSymbol(polySymbolRed);
map.graphics.add(feature);
}
$.messager.alert("提示","计算成功!");
}
else{
$.messager.alert("提示","计算失败!");
}
}
实现后效果:
输入距离
点计算成功
线缓冲
GP服务的存在使得在Web端使用ArcGIS 提供的空间分析,而这些分析的能力是和桌面中的一样的。因此,是Arcgis for js的一个重点,也是一个难点。因此,在本文讲述如何发布并在代码中调用GP服务,实现缓冲区的分析计算。
简介:
框架介绍参考文章:http://www.cnblogs.com/HPhone/archive/2012/11/05/2755833.html
服务发布参考文章:http://www.cnblogs.com/HPhone/archive/2012/11/18/2775492.html
模型参数:
[plain] view
plain copy
print?
Parameters:
Parameter: input
Data Type: GPFeatureRecordSetLayer
Display Name input
Description: input buffer
Direction: esriGPParameterDirectionInput
Default Value:
Geometry Type: esriGeometryPoint
HasZ: false
HasM: false
Spatial Reference: 4326 (4326)
Fields:
FID ( type: esriFieldTypeOID , alias: FID )
name ( type: esriFieldTypeString , alias: name , length: 100 )
id ( type: esriFieldTypeDouble , alias: id )
Features: None.
Parameter Type: esriGPParameterTypeRequired
Category:
Parameter: output
Data Type: GPFeatureRecordSetLayer
Display Name output
Description: ouput feature
Direction: esriGPParameterDirectionOutput
Default Value:
Geometry Type: esriGeometryPolygon
HasZ: false
HasM: false
Spatial Reference: 4326 (4326)
Fields:
FID ( type: esriFieldTypeOID , alias: FID )
name ( type: esriFieldTypeString , alias: name , length: 100 )
id ( type: esriFieldTypeDouble , alias: id )
BUFF_DIST ( type: esriFieldTypeDouble , alias: BUFF_DIST )
Shape_Length ( type: esriFieldTypeDouble , alias: Shape_Length )
Shape_Area ( type: esriFieldTypeDouble , alias: Shape_Area )
Features: None.
Parameter Type: esriGPParameterTypeRequired
Category:
Parameter: Distance__value_or_field_
Data Type: GPLinearUnit
Display Name Distance
Description: Distance
Direction: esriGPParameterDirectionInput
Default Value: 50.0 (esriKilometers)
Parameter Type: esriGPParameterTypeRequired
Category:
说明:
模型中有三个参数:1、输入;2、输出;3、缓冲距离单位或者字段。
代码实现:
1、添加绘制工具并定义事件
[javascript] view
plain copy
print?
toolbar = new Draw(map);
dojo.connect(toolbar, 'onDrawEnd', drawEnd);
$("#point").on("click",function(){
map.graphics.clear();
toolbar.activate(esri.toolbars.Draw.POINT);
});
$("#polyline").on("click",function(){
map.graphics.clear();
toolbar.activate(esri.toolbars.Draw.POLYLINE);
});
$("#polygon").on("click",function(){
map.graphics.clear();
toolbar.activate(esri.toolbars.Draw.POLYGON);
});
2、绘制结束后提交计算
[javascript] view
plain copy
print?
/**
* 绘制结束
* @param geometry
*/
function drawEnd(geometry) {
$.messager.prompt('提示信息', '请输入缓冲区范围:', function(dist){
if (dist){
$.messager.progress({
text:"计算中,请稍后..."
});
toolbar.deactivate();
var symbol = null;
if(geometry.type==="point"){
symbol = new esri.symbol.SimpleMarkerSymbol(esri.symbol.SimpleMarkerSymbol.STYLE_SQUARE, 10,
new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_SOLID,
new esri.Color([255,0,0]), 1),
new esri.Color([0,255,0,0.25]));
}
else if(geometry.type==="polyline"){
symbol=new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_DASHDOT, new dojo.Color([255, 0, 0]), 2);
}
else{
symbol = new esri.symbol.SimpleFillSymbol(esri.symbol.SimpleFillSymbol.STYLE_SOLID, new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_DASHDOT, new dojo.Color([255, 0, 0]), 2), new dojo.Color([255, 255, 0, 0.25]));
}
var graphic = new esri.Graphic(geometry, symbol);
map.graphics.add(graphic);
tojob(graphic,dist);
}
});
}
function tojob(graphic,distance) {
//第一步构造GP
var gpUrl = 'http://localhost:6080/arcgis/rest/services/buffer/GPServer/buffer';
gp = new esri.tasks.Geoprocessor(gpUrl);
//第二步,构造参数
//我们通过上面,了解到GPFeatureRecordSetLayer对应FeatureSet
var features = [];
features.push(graphic);
var featureset = new esri.tasks.FeatureSet();
featureset.features = features;
//构造缓冲长度,这里的单位是可以更改的,我使用的是度,简单一些
var Dis = new esri.tasks.LinearUnit();
Dis.distance = distance;
Dis.units = esri.Units.KILOMETERS;
var parms = {
input : featureset,
Distance__value_or_field_ : Dis
};
//这里函数是异步的,使用函数是submitJob,同步的使用的是execute。
//成功之后,调用jobResult,建议看一下这个参数。
gp.submitJob(parms, jobResult);
}
3、计算成功将结果绘制出来
[javascript] view
plain copy
print?
/**
* 计算完成
* @param result
*/
function jobResult(result) {
var jobId = result.jobId;
var status = result.jobStatus;
if(status === esri.tasks.JobInfo.STATUS_SUCCEEDED) {
//成功之后,将其中的结果取出来,当然这也是参数名字。
//在模型中,想要取出中间结果,需要设置为模型参数
gp.getResultData(jobId, "output", addResults);
}
}
function addResults(results){
$.messager.progress('close');
var features = results.value.features;
if(features.length>0) {
for (var i = 0, length = features.length; i != length; ++i) {
var feature = features[i];
var polySymbolRed = new esri.symbol.SimpleFillSymbol();
polySymbolRed.setOutline(new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_SOLID, new dojo.Color([0, 0, 0, 0.5]), 1));
polySymbolRed.setColor(new dojo.Color([255, 0, 0, 0.5]));
feature.setSymbol(polySymbolRed);
map.graphics.add(feature);
}
$.messager.alert("提示","计算成功!");
}
else{
$.messager.alert("提示","计算失败!");
}
}
实现后效果:
输入距离
点计算成功
线缓冲
相关文章推荐
- [置顶] arcgis api for js入门开发系列十三 通过Ajax的调用执行GP服务 (含源代码)
- [置顶] arcgis api for js入门开发系列十四 GP服务一框架介绍
- [置顶] arcgis api for js入门开发系列十八 GP服务五 JavaScript API调用GP服务
- BlogEngine.Net架构与源代码分析系列part9:开发扩展(上)——Extension与管理上的实现
- J2EE Web服务开发系列之十二: 实现安全的AXIS Web服
- [置顶] Spring Boot系列十二 通过redis实现Tomcat集群的Session同步及从源码分析其原理
- arcgis api for js入门开发系列十二地图打印(GP服务)
- J2EE Web服务开发系列之十二: 实现安全的AXIS Web服务,第1部分
- J2EE Web服务开发系列之十二: 实现安全的AXIS Web服务,第1部分
- arcgis api for js入门开发系列十二地图打印(GP服务)
- [置顶] arcgis api for js入门开发系列十七 GP服务四GP服务发布
- [置顶] arcgis api for js入门开发系列九 自写算法实现地图量算工具(含源代码)
- J2EE Web服务开发系列之十二: 实现安全的AXIS Web服务,第1部分
- arcgis api for js入门开发系列十二地图打印(GP服务)
- J2EE Web服务开发系列之十二: 实现安全的AXIS Web服务,第1部分
- [置顶] arcgis api for js入门开发系列二不同地图服务展示(含源代码)
- [置顶] arcgis api for js入门开发系列十六 GP服务三发布前的准备
- 利用Python分析GP服务运行结果的输出路径 & 实现服务输出路径的本地化
- 基于ArcGIS API For JavaScript调用GP服务实现动态插值分析实现
- 利用Python分析GP服务运行结果的输出路径 & 实现服务输出路径的本地化 分类: Python ArcGIS for desktop ArcGIS for server 2015-08-06 19:49 3人阅读 评论(0) 收藏