使用ArcGIS GP服務之五 JavaScript的調用


使用前的了解

    

    這是上一個博客留下的最后一張圖,GP的服務目錄,我們通過點擊Tasks下面的一個鏈接地址進入。這個地址,需要記住,這將是GP服務的地址,需要寫在代碼里面的。

   

  • 幫助說明,這個是在發布服務的時候,手動輸入的。也就是說,如果我們想要別人來使用我們的工具,發布服務的時候,盡量讓這個幫助寫的清楚一些,現在很多懶人都不願意寫。
  • 參數列表,會列出所有的參數,參數名字是需要記住的,到時候需要寫在代碼里面的。
  • 數據類型,這是GP服務的數據類型。每一個GP服務數據類型和JS數據類型進行對應。
    Data Type JavaScript Type Example
    GPString String "MyString"
    GPDouble Number (float) 12.56
    GPLong Number (int) 345
    GPBoolean Boolean true
    GPDate Date  
    GPLinearUnit <LinearUnit>  
    GPDataFile <DataFile>  
    GPRasterData <RasterData>  
    GPRecordSet <FeatureSet>  
    GPRasterDataLayer <RasterData>  
    GPFeatureRecordSetLayer <FeatureSet>  
    GPMultiValue String[] ["Parcels", "Street Lights"]

 

  • 默認值,如果我們沒有傳數據的話,將會使用默認值。

    這些我們都了解后,上代碼。

JavaScript的調用

dojo.require("dijit.layout.BorderContainer");
dojo.require("dijit.layout.ContentPane");
dojo.require("esri.map");
dojo.require("esri.toolbars.draw");
dojo.require("esri.tasks.gp");
var map, toolbar, gp;
function init() {
	map = new esri.Map("map");
	basemap = new esri.layers.ArcGISDynamicMapServiceLayer("http://localhost:6080/arcgis/rest/services/basemap2/MapServer");
	map.addLayer(basemap);
	dojo.connect(map, 'onLoad', function(theMap) {
		dojo.connect(dijit.byId('map'), 'resize', map, map.resize);
		toolbar = new esri.toolbars.Draw(map);
		dojo.connect(toolbar, 'onDrawEnd', drawEnd);
	});
	var button = dojo.byId("polygon");
	dojo.connect(button, 'onclick', drawPolygon);

}

function drawPolygon() {
	toolbar.activate(esri.toolbars.Draw.POLYGON);

}

function drawEnd(geometry) {
	toolbar.deactivate();
	var 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);
}

function tojob(graphic) {
	//第一步構造GP
	var gpUrl = 'http://localhost:6080/arcgis/rest/services/GP/ContaminatedAreas/GPServer/ContaminatedAreas';
	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 = 1;
	Dis.units = esri.Units.DECIMAL_DEGREES;
	//Distance__value_or_field_,后悔當時參數名字沒有改
	var parms = {
		ContaminatedAreas : featureset,
		Distance__value_or_field_ : Dis
	};
	//這里函數是異步的,使用函數是submitJob,同步的使用的是execute。
	//成功之后,調用jobResult,建議看一下這個參數。
	gp.submitJob(parms, jobResult);
}

function jobResult(result) {
	var jobId = result.jobId;
	var status = result.jobStatus;
	if(status === esri.tasks.JobInfo.STATUS_SUCCEEDED) {
		//成功之后,將其中的結果取出來,當然這也是參數名字。
		//在模型中,想要取出中間結果,需要設置為模型參數
		gp.getResultData(jobId, "polygon_Buffer", addResults);
		gp.getResultData(jobId, "resultCity", addResults);
	}
}
//將緩沖添加到地圖上
function addBufferResults(results) {
	console.log(results);
	var features = results.value.features;
	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);
	}
}
//將受污染的城市,添加到地圖上
function addResults(results) {
	console.log(results);
	var features = results.value.features;
	for(var f = 0, fl = features.length; f < fl; f++) {
		var feature = features[f];
		var polySymbolRed = new esri.symbol.SimpleMarkerSymbol(esri.symbol.SimpleMarkerSymbol.STYLE_SQUARE, 12, new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_SOLID, new dojo.Color([204, 102, 51]), 1), new dojo.Color([158, 184, 71, 1]));
		feature.setSymbol(polySymbolRed);
		map.graphics.add(feature);
	}
}

dojo.addOnLoad(init);

  

最后的結果

    每一個Job,都會保存下來,中間和最后的結果數據都會保存下來。

    

GP服務“調試”技巧

    其實不應該叫做調試,應該是怎么來找出問題的所在,是代碼的原因,還是模型的問題。

    打開瀏覽器的調試窗口,進入Network界面。

    

    其實我們從這里就可以看出來,異步,就是提交之后,每隔一段時間,來查詢整個Job的完成過程,如果是完成了,然后給你返回你一個結果。每一個Ajax請求,都會有相應的結果在里面,可以點擊這個請求,在Response頁面中找到。

    現在假如說,我的服務總是返回失敗,有可能是我們的參數提交的不對。點擊上圖SubmitJob,在右側,我們會找到提交的參數。

    

    這些參數可以拷貝下來,我們打開另外一個窗口,看這篇博文的第二張圖,最下面,會有一個Submit Job按鈕,打開它。

    

    把參數輸入進去,然后點擊Get。在不斷的Check Job,還是不正確,那極有可能是參數不正確。

    

    

    這是正確的結果,這個頁面更多的用於初期的GP服務發布之后,檢測結果是否和在ArcMap運行的一樣。

    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM