ArcGIS API For JavaScript 利用GP服务生成等值线、等值面(一)之生成等值线

笔者需要做一个利用arcgis平台生成等值线、等值面的功能,苦于不会算法,想要借助现有arcmap工具辅助生成,网上例子很多,但有些都报错,特此记录,或许能给大家启发!


先说明一下大体需求吧,需要做一个生成(水位、雨情)等值线、等值面的功能,行政区内分布有若干个测站点提供数据,根据测站数据动态生成等值线、等值面,其中等值线、等值面以固定数值(10、25、50、100、200)分隔。下面按照等值线、等值面顺序,从建模、发布服务、调用GP等内容开始说明。

注意:这里我要说明一下,由于这里的等值面是以固定数值区分的,所以可以用一种比较笨的办法,具体方法可以看等值面建模,只能给各位提供一些思路,不能代表此方法通用,事先声明!


一、等值线

等值线生成分别依赖"Spatial Analyst Tools"—"Interpolation"下的"IDW"、"Kriging"和"Surface"下的"Contour"、"Contour List"、"Contour with Barriers"


这里就不详细介绍了,可以参考http://help.arcgis.com/zh-cn/arcgisdesktop/10.0/help/index.html#/na/009z000000ts000000/

IDW是反距离权重法插值工具

Kriging是克里金法插值工具

扫描二维码关注公众号,回复: 11007375 查看本文章

两者都是根据点要素插值生成栅格,但我个人感觉Kriging法比IDW生成的栅格过度性好,不至于太死板。但某些情况下(如其中一个点数据为0),Kriging容易出错。因此我推荐IDW,比较稳定。


Contour是固定数值间隔的等值线工具,可以指定初始数值和相邻两条线之间的数值差。

Contour List是可以指定一个列表,按列表给出的数值生成等值线。

Contour with Barriers顾名思义可以框定边界,但这里我尝试过好像没有效果。


1.建模

工具选定好了,下面开始建模:

1.1设置工作环境、准备数据

在建模开始之前,还需要设定当前工作环境中的输出范围,由于插值算法不能无限的生成栅格范围,如果不指定输出范围,则会默认以点要素的最小外接矩形为范围,因此我们可以设置一个稍大的范围,再根据自己需要截取。

可能有些人会有疑问:这里设置输出范围,会不会对以后其他工作造成影响?答案是不会的,当前设置的输出范围在下次打开arcMap就无效了。但对发布的工具是一直有效的。

在arcmap菜单栏点击Groprocessing—Environments


在这之前也可以先把我们设定的输出范围要素放到左侧图层栏,这样可以在Environment Settings—Pricessing Extent中直接选择,如下图,我们选择最后一个就好。


同时要预先准备点数据和输出范围,点数据需要带有表明其水位(或雨量或高程等)信息,这个字段可以是Z值,也可以是普通字段(这里我新建了个"zvalue"字段)。输出范围可以设置工作环境的输出范围,也可以放在建模中自己控制。放在建模中的应用后面再说。

1.2建模

直接拖动工具进入Model,重命名IDW的两个参数和Contour List的输出参数名称(方便传入GP参数),并右键设置“Model Parameter”,这里输出也需要设置!IDW无需进行设置什么内容,Contour List设置我们的分隔值(10,25,50,100,200),如下图:


我们可以在Model中运行测试看看,如果成功,先别急着发布,将Model中的数据清空,让它变成白色,可以避免不必要麻烦,我们再从外部双击Model运行。运行看到如下结果:


可以看到输出的结果没有超出我们设置的工作环境范围,且等值线数值为10、25、50、100、200。虽然数据造的有些差,效果比较抽象。这样我们就可以发布了。

2.发布GP服务

在Result中找到运行成功的Model过程,右键Share As Geoprocessing Service。详细发布方法也可参照https://www.cnblogs.com/mumu122GIS/p/6097687.html


设置好服务名和存放文件夹后,可以看到如下界面:


这里我们要注意的左侧栏目有Parameters和模型的参数。其中Parameters—Synchronous表示同步调用,Asyn表示异步调用,View results with a map service勾选会在服务文件夹中出现同名的仅供查看输出图形的服务,具体可参考https://www.cnblogs.com/mumu122GIS/p/6097687.html

模型的参数需要填写Descriptior,为的是他人调用时方便了解。Input mode选择用户自定义值。




确认完毕后发布。

3.调用GP服务

登录Server,在设置的文件夹下找到服务,点击服务—功能—REST URL,进入到如下界面:


可以看到之前设置的输入输出参数。参数详解可参考http://www.cnblogs.com/HPhone/archive/2012/11/18/2775860.html

JS调用代码如下:

require([
	"esri/map",
	"esri/layers/ArcGISTiledMapServiceLayer",
	"esri/layers/ArcGISDynamicMapServiceLayer",
	"esri/geometry/Point",
	"esri/SpatialReference",

	"esri/symbols/SimpleMarkerSymbol",
	"esri/symbols/TextSymbol",
	"esri/layers/LabelClass",
	"esri/renderers/SimpleRenderer",
	"esri/layers/FeatureLayer",
	"esri/Color",
	"esri/symbols/SimpleLineSymbol",
	"esri/layers/GraphicsLayer",
	"esri/graphic",
	"esri/tasks/FeatureSet",
	"esri/geometry/geometryEngine",
	"esri/tasks/Geoprocessor",
	"dojo/domReady!"],
function(Map, ArcGISTiledMapServiceLayer,ArcGISDynamicMapServiceLayer, Point, SpatialReference,
SimpleMarkerSymbol,TextSymbol, LabelClass,SimpleRenderer,FeatureLayer,Color,SimpleLineSymbol,
GraphicsLayer,Graphic,FeatureSet,geometryEngine,Geoprocessor) {
	
	var features = [];
	var map = new Map("map", {
//          center: new Point(1.3091608700115489E7, 4273624.108445918, new SpatialReference({ wkid: 3857 })),
		autoResize:true,
		sliderStyle: "small",
		logo: false,
		showLabels : true
	});
	var baseSpatialRef = new SpatialReference({"wkt":'GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["degree",0.0174532925199433]]'});

	var tiled = new ArcGISDynamicMapServiceLayer("http://localhost:6080/arcgis/rest/services/sishui/sishuifeature/MapServer");
	map.addLayer(tiled);


	var gp = new Geoprocessor("http://localhost:6080/arcgis/rest/services/test/dengzhixianModel/GPServer/dengzhixian2");

	var graphicLayer = new GraphicsLayer({id:"dengzhixian"});
	var markerSymbol = new SimpleMarkerSymbol({//模拟测站点数据的渲染
		"color": [255,255,255,64],
		"size": 12,
		"angle": -30,
		"xoffset": 0,
		"yoffset": 0,
		"type": "esriSMS",
		"style": "esriSMSCircle",
		"outline": {
			"color": [0,0,0,255],
			"width": 1,
			"type": "esriSLS",
			"style": "esriSLSSolid"
		}
	});
	
	//模拟测站点数据
	var graphic1 = new Graphic(new Point(117.320358,35.725506,baseSpatialRef),markerSymbol,{"zvalue":10});
	var graphic2 = new Graphic(new Point(117.251434,35.699341,baseSpatialRef),markerSymbol,{"zvalue":30});
	var graphic3 = new Graphic(new Point(117.522662,35.618930,baseSpatialRef),markerSymbol,{"zvalue":400});
	var graphic4 = new Graphic(new Point(117.275685,35.564684,baseSpatialRef),markerSymbol,{"zvalue":28});
	var graphic5 = new Graphic(new Point(117.447444,35.755972,baseSpatialRef),markerSymbol,{"zvalue":70});
	var graphic6 = new Graphic(new Point(117.155146,35.627075,baseSpatialRef),markerSymbol,{"zvalue":100});
	var graphic7 = new Graphic(new Point(117.404478,35.651812,baseSpatialRef),markerSymbol,{"zvalue":0});
	var graphic8 = new Graphic(new Point(117.105020,35.770945,baseSpatialRef),markerSymbol,{"zvalue":180});
	
	//用于比对效果
	graphicLayer.add(graphic1);
	graphicLayer.add(graphic2);
	graphicLayer.add(graphic3);
	graphicLayer.add(graphic4);
	graphicLayer.add(graphic5);
	graphicLayer.add(graphic6);
	graphicLayer.add(graphic7);
	graphicLayer.add(graphic8);
	
	//用于生成等值线的参数
	features.push(graphic1);
	features.push(graphic2);
	features.push(graphic3);
	features.push(graphic4);
	features.push(graphic5);
	features.push(graphic6);
	features.push(graphic7);
	features.push(graphic8);

	var featureset = new FeatureSet();
	featureset.features = features;
	var para = {
		inputpoints:featureset,
		zvalue:"zvalue"
//          clipfeature:"xian1"
	}

	gp.submitJob(para,function(result){
		var slsymbol = new SimpleLineSymbol(//标识等值线的渲染
				SimpleLineSymbol.STYLE_DASH,
				new Color([255,0,0]),3
		);
		var jobId = result.jobId;
		var status = result.jobStatus;
		if(status == esri.tasks.JobInfo.STATUS_SUCCEEDED) {
			gp.getResultData(jobId, "output", function(jobInfo){
				var features = jobInfo.value.features;
				dojo.forEach(features,function(graphic){
					graphic.setSymbol(slsymbol);
					graphicLayer.add(graphic);
				});
				map.addLayer(graphicLayer);
			});
		}
	});
}
);

运行后截取部分效果如下:


调用GP服务时,需要注意的是,

1.如果GP服务的参数是GPFeatureRecordSetLayer,对应的JS类型为FeatureSet,这时需要引用"esri/tasks/FeatureSet"。

2.异步提交用submitJob方法,返回提示运行成功后,获取要素用gp.getResultData()方法,获取栅格用gp.getResultImageLayer()方法,其中jobId为本次执行结果返回的唯一结果Id,output为GP服务的输出参数名称。

3.如果运行成功,但返回feature为空,一定要检查一下数据!我用360、480这样的数值做10、25、50、100、200的等值线,肯定结果为空的,我还傻傻的以为输入参数不对!这得被笑死!


到这里,生成等值线的任务基本算完成了。

当然等值线功能还可以继续完善,例如显示标注:


关于显示标注和等值面的文章有时间再继续写,今天先到这里吧。

生成等值面的文章点击跳转


参考文章:

https://www.cnblogs.com/mumu122GIS/p/6097687.html

http://www.cnblogs.com/HPhone/archive/2012/11/18/2775860.html

http://help.arcgis.com/zh-cn/arcgisdesktop/10.0/help/index.html#/na/009z000000ts000000/

发布了27 篇原创文章 · 获赞 29 · 访问量 13万+

猜你喜欢

转载自blog.csdn.net/rrrrroy_Ha/article/details/79451614