今年7月刚刚发布的ArcGIS 10.2为GIS的web开发带来了一个很实在的功能,JSON转要素。以往GIS图层外部数据(如文本数据,数据库数据)动态地写入地图服务中的图层是一件不可想象的事情,如今可以用JSON动态地生成图层中的要素了,在这重新整理分享一个实战经验。

饮水思源,转载勿删:http://www.cnblogs.com/evkchina/p/3478999.html,请支持关注北京易维清www.evkchina.com

首先谈谈需要解决的一个问题,以数据库的形式存了一批点的数据,包括点的经纬度,及相关的信息,如水体的污染物浓度,而且这些点每天都有一套数据,我需要在WEB上根据时间把这些点查询并显示在相应的地图上,不能每天都从数据库中取数做成图层发布一次吧,这会累死不可,这就需要一个自动查询数据库点并动态形成GIS图层加载到的相应的地图上。好,下面就来解决这个问题。

1.创建ArcGIS模型:用转换工具》JSON》JSON转要素,设置JSON文件(PDATA)和输出图层(PointResult.shp)为模型参数,输出图层(PointResult.shp)勾选添加至显示。

ArcGIS使用的JSON文件是比较复杂的,可以先做一个规范的要素图层然后使用 要素转JSON 工具生成一个JSON,在根据生成的JSON格式,制作动态的JSON数据。

2.把模型发布为地理处理服务:关闭模型编辑编辑窗口,双击运行模型,在结果窗口中把模型运行结果共享为地理处理服务,注意勾选参数》异步》查看含地图服务的结果。

发布完成后,可查看服务的submitJob界面,这里的PDATA(GPDataFile)需要一个JSON文件的路径作为参数,形式为"{'url': 'json文件路径'}"。

3.在Asp.net MVC中使用地理处理服务:View代码(.cshtml)的关键脚本为(由于时间问题没有重新整理,粘贴了之前的代码,代码里有一个DZ的参数,是地理处理服务的另一个参数可以忽略),

可以参照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/R3/GPServer/R3",
mapserviceurl = "http://localhost:6080/arcgis/rest/services/dianchi/R3/MapServer/jobs",
legend; parser.parse(); var map = new Map("map", {
basemap: "satellite",
center: [102.7038, 24.8270],
logo: false,
zoom: 11
}); var dituLayer = new ArcGISDynamicMapServiceLayer("http://huang-pc:6080/arcgis/rest/services/dianchi/ditu/MapServer", {
"id": "ditu00"
});
map.addLayers([dituLayer]); 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);
}
} var jobs = 0;
var jobstatus = "";
var interval; function mysubmitJob() {
var dzdata = $("#dzData").val();
var thedate = $("#theDate").val();
var wq = $("#dataType").val();
var pdata = "{'url': '" + "http://localhost:5907/Home/R3GISViewJSON/" + thedate + "/" + wq + "/JSONTEMP.JSON'}"
var submitjoburl = gpServiceUrl + "/submitJob";
$.ajax({
type: 'get',
dataType: "jsonp",
url: submitjoburl,
data: { DZ: dzdata, PDATA: pdata, 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]);
legend = new Legend({
map: map
}, "legendDiv");
legend.startup();
}
app = {
findHotspot: findHotspot
};
return app;
});
function hidediv() {
var ditu00div = $("#legendDiv_ditu00");
if (ditu00div.html() == "") {
return;
}
$("#legendDiv_ditu00").html("");
hidediv();
}
</script>

生成JSON的Controller代码为:

        public ActionResult R3GISViewLSWQJSON(string dt, string wq)
{
var cultureInfo = CultureInfo.CreateSpecificCulture("zh-CN");
string format = "yyyy-M-d";
var datetime = System.DateTime.ParseExact(dt, format, cultureInfo);
var pointjson = new POINTJSON().getjsonfile(datetime, wq, "历史数据");
JsonResult jsonData = new JsonResult
{
Data = pointjson
};
return Json(jsonData.Data, "application/json", JsonRequestBehavior.AllowGet);
}

new POINTJSON().getjsonfile()返回一个JSON结构的类,

JsonResult jsonData = new JsonResult             {                 Data = pointjson             };

将类转化为JSON结构数据。

这里有一个很重要的技巧,这是使用Asp.net MVC的一个特点,View代码中 var pdata = "{'url': '" + "http://localhost:5907/Home/R3GISViewLSWQJSON/" + thedate + "/" + wq + "/JSONTEMP.JSON'}" 作为PDATA(GPDataFile)的参数(一个JSON文件的路径"{'url': 'json文件路径'}"),但是这里没有用到临时文件,而是直接输出JSON数据,后面是有一个路由作为支撑的,代码为:

routes.MapRoute(
"GetJson", // Route name
"{controller}/{action}/{dt}/{wq}/{json}", // URL with parameters
new { controller = "Home", action = "Index", dt = UrlParameter.Optional, wq = UrlParameter.Optional, id = UrlParameter.Optional } // Parameter defaults
);

这里有3个参数,前两个由Controller的方法 public ActionResult R3GISViewLSWQJSON(string dt, string wq) 接收了,而第3个在这个方法里是没有出现的,但是它非常重要,它是用来欺骗ArcGIS服务用的,PDATA(GPDataFile)是一个文件的路径,带.json后缀,这个参数刚好用来.json结尾,让ArcGIS服务当做服务来处理了,省去了临时文件的繁琐工作。

到此为止,问题就结局了。

由于时间关系,很多具体的细节没有在这里说到,请见谅,欢迎在本文评论中交流学习。

饮水思源,转载勿删:http://www.cnblogs.com/evkchina/p/3478999.html,请支持关注北京易维清www.evkchina.com 最后,卖一个关子,就是JSON数据转换成较多的线要素和面要素时,JSON文件特别大,这种方法失效了,所以线要素和面要素的动态数据还得用别的方法,后面会继续跟大家分享,敬请关注。

 

ArcGIS Server 10.2 实战(一)Asp.net MVC与JSON数据妙用实现动态生成要素图层的更多相关文章

  1. ArcGIS Server 10.2 实战(二)动态修改要素数据的地理处理服务

    上一篇<ArcGIS Server 10.2 实战(一)Asp.net MVC与JSON数据妙用实现动态生成要素图层>介绍了如何用JSON转要素的地理处理服务,实现了动态创建点要素并加载到 ...

  2. ArcGIS Server 10.2 实战(三)图层标注及图例中文显示乱码的解决

    发布的图层中不可避免的使用到中文来标注,默认设置下,ArcGIS Server不支持中文的,中文标注显示成乱码,主要是编码的问题,需要把手动把编码改为UTF-8. ArcGIS Server 10.2 ...

  3. ArcGIS Server 10.2 实战(五)spatial etl tool 格式转换服务

    上不同的地图服务平台对地图文件格式的要求多种多样,arcgis使用的文件很难应用于其他平台上,因此需要有格式转换的服务来克服这种使用不同平台带来的麻烦,下面以TIFF格式转GEOTIFF格式为例. 首 ...

  4. ArcGIS Server 10.2 实战(四)格栅动态配色服务

    当你的地理处理服务输出的是格栅,那个不可避免地需要为格栅的各类型数据添加不同色彩进行区分,而默认时格栅的色彩是随机的,或者固定死一套着色方案是也显得不够人性化,难以满足多样的客户需求,下面谈谈如何解决 ...

  5. 分享ArcGIS Server 10.0修复安装心得

    最近,捣腾了一阵子在xp系统上安装ArcGIS Server10.0(下方均简称server),解决了一些初学者可能面临的problem,给大家贴出来, 希望能够给初学者一些有益的帮助. 我的系统环境 ...

  6. Arcgis Server 10.2默认服务端口号修改方法

    本人安装Arcgis Server 10.2之后发布了一个地图服务,该服务默认使用的端口号是6080,本人使用的是教育网,使用教育网均能正常使用该服务,但是使用电信或者移动网络均不能正常访问该网站. ...

  7. arcgis server 10.2安装后,忘记Manager的用户名和密码

    arcgis server 10.2安装完毕后,需要创建站点,创建站点时,填写管理站点的用户名和密码.自己不小心,创建完毕后,给忘记了用户名和密码.求助Esri,解决方法如下: (1)找到arcgis ...

  8. ArcGIS Server 10.0 安装及使用完整攻略

    引言 ArcGIS Server 10.0在使用和安装的过程中,需要进行比较全面的学习,才能正确使用.缺乏正确的指引,用户很容易在安装及使用中遇到问题.所以笔者在此总结Server 10.0的安装及使 ...

  9. ArcGIS Server 10 Java 版的Rest服务的部署方法

    使用ArcGIS Server 10 Java版发布GIS服务,当使用ArcGIS Manager创建好服务后,然后打开“ArcGIS Services Directory”的链接时发现网页报出了找不 ...

随机推荐

  1. java动态代理与老式AOP实现

    JAVA的动态代理 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会 ...

  2. socket.io的抽象实现:engine.io

    engine.io是一个socket.io的抽象实现,作为socket.io的服务器和浏览器之间交换的数据的传输层.它不会取代Socket.IO,它只是抽象出固有的复杂性,支持多种浏览器,设备和网络的 ...

  3. append some buttons to the standard datagrid pager bar

    <script type="text/javascript">  $(function(){   var pager = $('#dg').datagrid('getP ...

  4. Tomcat中配置JNDI数据源

    准备工作: Tomcat版本:tomcat6.0以上 下例中均使用MySQL数据库 将对应数据源的jar包和MySQL的驱动包拷贝至tomcat的lib文件夹下 一.全局数据源 1步骤一:配置 在to ...

  5. poj 2349 Arctic Network

    http://poj.org/problem?id=2349 Arctic Network Time Limit: 2000MS   Memory Limit: 65536K Total Submis ...

  6. codeforces 630D Hexagons!

    D. Hexagons! time limit per test 0.5 seconds memory limit per test 64 megabytes input standard input ...

  7. POJ 3667 Hotel (线段树区间合并)

    题目链接:http://poj.org/problem?id=3667 最初给你n间空房,m个操作: 操作1 a 表示检查是否有连续的a间空房,输出最左边的空房编号,并入住a间房间. 操作2 a b ...

  8. POJ 1151 Atlantis (扫描线+线段树)

    题目链接:http://poj.org/problem?id=1151 题意是平面上给你n个矩形,让你求矩形的面积并. 首先学一下什么是扫描线:http://www.cnblogs.com/scau2 ...

  9. CodeForces 589D Boulevard (数学,相遇)

    题意:给定 n 个的在 x 轴上的坐标,和开始时间,结束坐标,从起点向终点走,如果和其他人相遇,就互相打招乎,问你每人打招乎的次数. 析:其实这一个数学题,由于 n 比较小,我们就可以两两暴力,这两个 ...

  10. qemu 模拟-arm-mini2440开发板-启动u-boot,kernel和nfs文件系统

    qemu 本文介绍了如何编译u-boot.linux kernel,然后用qemu启动u-boot和linux kernel,达到与开发板上一样的学习效果! 虽然已经买了2440开发板,但是在实际学习 ...