上一篇《ArcGIS Server 10.2 实战(一)Asp.net MVC与JSON数据妙用实现动态生成要素图层》介绍了如何用JSON转要素的地理处理服务,实现了动态创建点要素并加载到相应的地图上,但是对于线、面要素,由于动态生成时需要较大的JSON数据,这个方法就不太合适了,下面介绍另一个可行的方法,用动态的方法修改现有面要素的指定字段数据。
首先还是先谈谈问题的背景,需要制作一个专题地图,用于对于各块地域的数据进行分级填色,每天都有一套数据对应有一个专题地图,同样不可能每天都制作图层和发布,因此需要图层中的数据可根据从外部数据源的查询到的数据动态的变化。好,下面就来解决这个问题。
饮水思源,转载勿删:http://www.cnblogs.com/evkchina/p/3435573.html,请支持关注北京易维清www.evkchina.com
1.创建ArcGIS模型:用数据管理工具》字段》计算字段,设置输入表、字段名、表达式、表达式类型(采用PYTHON_9.3)和代码块,其中表达式(expressionP)和代码块(codeblockP)为模型参数,流域排放总量等级作为模型参数并勾选添加至显示。
2.地理处理服务的发布在《ArcGIS Server 10.2 实战(一)Asp.net MVC与JSON数据妙用实现动态生成要素图层》中已经略有介绍,就不细说了。
3.在javascript中使用地理处理服务:调用发布的javascript代码为,具体代码解读可以参照Arcgis官网给出的例子(https://developers.arcgis.com/en/javascript/jssamples/gp_resultmapservice.html)。
<script type="text/javascript">
require([
"dojo/dom",
"dojo/_base/array",
"dojo/date/locale",
"dojo/parser",
"dijit/registry", "esri/domUtils",
"esri/map",
"esri/graphic",
"esri/layers/ArcGISDynamicMapServiceLayer",
"esri/layers/FeatureLayer",
"esri/tasks/Geoprocessor",
"esri/dijit/Legend", "dijit/form/DateTextBox",
"dijit/layout/BorderContainer",
"dijit/layout/ContentPane"],
function (dom, array, locale, parser, registry,
domUtils, Map, Graphic, ArcGISDynamicMapServiceLayer, FeatureLayer, Geoprocessor, Legend) {
var gpServiceUrl = "http://huang-pc:6080/arcgis/rest/services/dianchi/liuyuZL/GPServer/liuyuZL",
mapserviceurl = "http://huang-pc:6080/arcgis/rest/services/dianchi/liuyuZL/MapServer/jobs",
legend; parser.parse(); var map = new Map("map", {
basemap: "satellite",
center: [102.7038, 24.8270],
logo: false,
zoom: 11
}); var riversLayer = new ArcGISDynamicMapServiceLayer("http://huang-pc:6080/arcgis/rest/services/dianchi/rivers/MapServer", {
"id": "rivers"
}); //Run the gp task when the app loads to display default incidents
// map.on("load", findHotspot); function findHotspot() {
//cleanup any results from previous runs
cleanup();
mysubmitJob();
} function cleanup() {
//hide the legend and remove the existing hotspot layer
domUtils.hide(dom.byId('legendDiv'));
var hotspotLayer = map.getLayer('HotspotLayer');
if (hotspotLayer) {
map.removeLayer(hotspotLayer);
map.removeLayer(map.getLayer('rivers'));
}
} var jobs = 0;
var jobstatus = "";
var interval; function mysubmitJob() {
var thedate = $("#theDate").val();
var wq = $("#dataType").val();
$.ajax({
type: "POST",
url:"@Url.Action("R2GISViewLYcodeblockP", "Home")",
data:{"year" : thedate, "wq" : wq},
success:function (data) {
var codeblockp = data.codeblockP;
$("#lastdate").text("当年总量累加至" + data.lastDate);
var submitjoburl = gpServiceUrl + "/submitJob";
$.ajax({
type: 'get',
dataType: "jsonp",
url: submitjoburl,
data: { codeblockP: codeblockp, expressionP: "setData ( !DSN! )", f: "pjson" },
jsonpCallback: "jsonpCallback",
success: function (data) {
jobs = 0;
if (data.jobStatus == "esriJobSucceeded") {
doMapJob(data);
}
else {
getJobStatus(data.jobId);
}
}
});
}
});
} function getJobStatus(sjobid) {
clearTimeout(interval);
domUtils.show(dom.byId('status'));
if (jobs < 60) {
var sjoburl = gpServiceUrl + "/jobs/" + sjobid;
$.ajax({
type: "get",
dataType: "jsonp",
url: sjoburl,
data: { f: "pjson" },
jsonpCallback: "jsonpCallback",
success: function (data) {
switch (data.jobStatus) {
case 'esriJobSubmitted':
jobstatus = '已提交...';
dom.byId('status').innerHTML = jobstatus;
jobs = jobs + 1;
interval = setTimeout(function () { getJobStatus(data.jobId) }, 1000);
break;
case 'esriJobExecuting':
jobstatus = '处理中...';
dom.byId('status').innerHTML = jobstatus;
jobs = jobs + 1;
interval = setTimeout(function () { getJobStatus(data.jobId) }, 1000);
break;
case 'esriJobSucceeded':
clearTimeout(interval);
domUtils.hide(dom.byId('status'));
doMapJob(data);
break;
case 'esriJobFailed':
clearTimeout(interval);
jobstatus = '查询失败';
dom.byId('status').innerHTML = jobstatus;
gpJobFailed();
}
}
});
}
else {
clearTimeout(interval);
jobstatus = '查询失败';
dom.byId('status').innerHTML = jobstatus;
gpJobFailed();
}
} function gpJobFailed() {
//domUtils.hide(dom.byId('status'));
} function doMapJob(jobinfo) {
//construct the result map service url using the id from jobinfo we'll add a new layer to the map
var mapurl = mapserviceurl + "/" + jobinfo.jobId;
var hotspotLayer = new ArcGISDynamicMapServiceLayer(mapurl, {
"id": "HotspotLayer",
"opacity": 1
}); //add the hotspot layer to the map
map.addLayers([hotspotLayer]);
map.addLayers([riversLayer]);
map.on("layers-add-result", function (evtObj) {
domUtils.show(dom.byId('legendDiv'));
if (!legend) {
//add the legend to show the resulting layer.
var layerInfo = array.map(evtObj.layers, function (layer, index) {
return {
layer: layer.layer,
title: "结果图层"
};
}); legend = new Legend({
map: map,
layerInfos: layerInfo
}, "legendDiv");
legend.startup();
}
});
} app = {
findHotspot: findHotspot
};
return app;
});
</script>
其中,function mysubmitJob()中的"@Url.Action("R2GISViewLYcodeblockP", "Home")"是Asp.net MVC中的写法,是异步调用URL home/R2GISViewLYcodeblockP,返回代码块的内容,而且这里不必要使用跨域的写法,一般ajax异步就可以,方法代码如下
public ActionResult R2GISViewLYcodeblockP(int year, string wq)
{
var codeblockp = new LiuYUData().getZLData(year, wq);
JsonResult jsonData = new JsonResult
{
Data = codeblockp
};
return Json(jsonData.Data);
}
另外,代码块内容(string)的生成代码为,强调一下,经过实践,这里面的空格对代码块的影响比较大,可能是PYTHON_9.3的问题,需要大家严重注意。
public LYData getZLData(int year, string wq)
{
var lydata = new LYData();
lydata.lastDate = "(无数据累加)";
string zldata = "";
var zls = db.R2_WQs.Where(m => m.DateTime.Value.Year == year && m.Object == wq + " 年总量").ToList();
if (zls.Count > )
{
zldata = "def setData ( dsn ):\n";
foreach (var zl in zls)
{
zldata = zldata + " if dsn == " + "\"" + zl.DSNID.Substring(, zl.DSNID.Length - ) + "\":\n" + " return " + zl.ZLWarn.ToString() + "\n";
}
zldata = zldata + " else:\n return 0";
lydata.codeblockP = zldata;
lydata.lastDate = zls[].DateTime.Value.ToString("yyyy年MM月dd日", DateTimeFormatInfo.InvariantInfo);
}
return lydata;
}
饮水思源,转载勿删:http://www.cnblogs.com/evkchina/p/3429793.html,请支持关注北京易维清www.evkchina.com
到此为止,问题就结束了。
由于时间关系,很多具体的细节没有在这里说到,请见谅,欢迎在本文评论中交流学习。
这里是用计算字段的代码块来对图层要素进行动态修改数据内容,感觉这种方法很笨重奇怪,但是寻找了很久也没有一个好的接口根据外部数据动态修改图层要素数据,有没有别的更简便的方法呢,请各位大神指教。
ArcGIS Server 10.2 实战(二)动态修改要素数据的地理处理服务的更多相关文章
-
ArcGIS Server 10.2 实战(五)spatial etl tool 格式转换服务
上不同的地图服务平台对地图文件格式的要求多种多样,arcgis使用的文件很难应用于其他平台上,因此需要有格式转换的服务来克服这种使用不同平台带来的麻烦,下面以TIFF格式转GEOTIFF格式为例. 首 ...
-
ArcGIS Server 10.2 实战(三)图层标注及图例中文显示乱码的解决
发布的图层中不可避免的使用到中文来标注,默认设置下,ArcGIS Server不支持中文的,中文标注显示成乱码,主要是编码的问题,需要把手动把编码改为UTF-8. ArcGIS Server 10.2 ...
-
ArcGIS Server 10.2 实战(一)Asp.net MVC与JSON数据妙用实现动态生成要素图层
今年7月刚刚发布的ArcGIS 10.2为GIS的web开发带来了一个很实在的功能,JSON转要素.以往GIS图层外部数据(如文本数据,数据库数据)动态地写入地图服务中的图层是一件不可想象的事情,如今 ...
-
ArcGIS Server 10.2 实战(四)格栅动态配色服务
当你的地理处理服务输出的是格栅,那个不可避免地需要为格栅的各类型数据添加不同色彩进行区分,而默认时格栅的色彩是随机的,或者固定死一套着色方案是也显得不够人性化,难以满足多样的客户需求,下面谈谈如何解决 ...
-
ArcGIS Server 10.1新特性系列---动态图层
ArcGIS Server 10.1新特性里面有几个新功能是非常棒的,其中有一个就是动态图层.动态图层不是一种新发明的图层,而是说在arcgis server的web应用中可以动态的配置其渲染和内容功 ...
-
Arcgis Server 10.2默认服务端口号修改方法
本人安装Arcgis Server 10.2之后发布了一个地图服务,该服务默认使用的端口号是6080,本人使用的是教育网,使用教育网均能正常使用该服务,但是使用电信或者移动网络均不能正常访问该网站. ...
-
【转】ArcGIS Server 10.1 动态图层—添加栅格
本文将介绍如何通过arcgisserver10.1动态图层添加栅格影像.与添加矢量数据不同的是,天际栅格用到了RasterDataSource接口,如下所示 <esri:DynamicLayer ...
-
arcgis server 10.2安装后,忘记Manager的用户名和密码
arcgis server 10.2安装完毕后,需要创建站点,创建站点时,填写管理站点的用户名和密码.自己不小心,创建完毕后,给忘记了用户名和密码.求助Esri,解决方法如下: (1)找到arcgis ...
-
ArcGIS Server 10 Java 版的Rest服务的部署方法
使用ArcGIS Server 10 Java版发布GIS服务,当使用ArcGIS Manager创建好服务后,然后打开“ArcGIS Services Directory”的链接时发现网页报出了找不 ...
随机推荐
-
纯CSS实现图片水平垂直居中于DIV(图片未知宽高)
<div class="demo"><a href="#"><img src="http://nec.netease.c ...
-
RabbitMQ 声明Queue时的参数们的Power
参数们的Power 在声明队列的时候会有很多的参数 public static QueueDeclareOk QueueDeclare(this IModel model, string queue ...
-
SQLServer用sql语句怎么返回一个月所有的天数
可用如下sql语句: select convert(varchar(10),dateadd(DAY,t2.number,t1.day),120) day from (select '2015-07'+ ...
-
SQL手工注入
site:xx.cn inurl:asp?id= //找文章 xx.cn/pth/onews.asp?id=243' //试注入 xx.cn/pth/onews.asp?id=243 order b ...
-
HDFS的shell操作
bin/hadoop命令操作: namenode -format 格式化文件系统 fs(缩写:FileSystem) 运行一个文件系统的用户客户端 bin/hadoop fs常用命令操作: -ls h ...
-
【转】jQuery教程
“jQuery风暴” 推荐及配套代码下载 ziqiu.zhang 2011-03-24 00:28 阅读:15339 评论:100 从零开始学习jQuery(剧场版) 你必须知道的javascri ...
-
Linux-VPN安装配置方法
VNP服务器IP地址为:192.168.6.6 一.编译安装: 注意:可能需要ppp.libcap.libcap-devel ncurses-devel RPM 包支持,如果没有请安装 libca ...
-
Android SharedPreferences基本用法
使用SharedPreferences SharedPreferences是Android平台上一个轻量级的存储类, 用来保存应用的一些常用配置. SharedPreferences与Editor简介 ...
-
●BZOJ 3566 [SHOI2014]概率充电器
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3566题解: 概率dp,树形dp 如果求出每个点被通电的概率t, 那么期望答案就是t1×1+t ...
-
002.Oracle安装部署-ASM
一 环境准备 图形界面:略 安装包: linux.x64_11gR2_database_1of2.zip linux.x64_11gR2_database_2of2.zip 二 安装ASM-Oracl ...