今年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),但由于遇到跨域问题,代码改动的比较多。

  1. <script type="text/javascript">
  2. require([
  3. "dojo/dom",
  4. "dojo/_base/array",
  5. "dojo/date/locale",
  6. "dojo/parser",
  7. "dijit/registry",
  8.  
  9. "esri/domUtils",
  10. "esri/map",
  11. "esri/graphic",
  12. "esri/layers/ArcGISDynamicMapServiceLayer",
  13. "esri/layers/FeatureLayer",
  14. "esri/tasks/Geoprocessor",
  15. "esri/dijit/Legend",
  16.  
  17. "dijit/form/DateTextBox",
  18. "dijit/layout/BorderContainer",
  19. "dijit/layout/ContentPane"],
  20. function (dom, array, locale, parser, registry,
  21. domUtils, Map, Graphic, ArcGISDynamicMapServiceLayer, FeatureLayer, Geoprocessor, Legend) {
  22. var gpServiceUrl = "http://huang-pc:6080/arcgis/rest/services/dianchi/R3/GPServer/R3",
  23. mapserviceurl = "http://localhost:6080/arcgis/rest/services/dianchi/R3/MapServer/jobs",
  24. legend;
  25.  
  26. parser.parse();
  27.  
  28. var map = new Map("map", {
  29. basemap: "satellite",
  30. center: [102.7038, 24.8270],
  31. logo: false,
  32. zoom: 11
  33. });
  34.  
  35. var dituLayer = new ArcGISDynamicMapServiceLayer("http://huang-pc:6080/arcgis/rest/services/dianchi/ditu/MapServer", {
  36. "id": "ditu00"
  37. });
  38. map.addLayers([dituLayer]);
  39.  
  40. function findHotspot() {
  41. //cleanup any results from previous runs
  42. cleanup();
  43. mysubmitJob();
  44. }
  45.  
  46. function cleanup() {
  47. //hide the legend and remove the existing hotspot layer
  48. // domUtils.hide(dom.byId('legendDiv'));
  49. var hotspotLayer = map.getLayer('HotspotLayer');
  50. if (hotspotLayer) {
  51. map.removeLayer(hotspotLayer);
  52. }
  53. }
  54.  
  55. var jobs = 0;
  56. var jobstatus = "";
  57. var interval;
  58.  
  59. function mysubmitJob() {
  60. var dzdata = $("#dzData").val();
  61. var thedate = $("#theDate").val();
  62. var wq = $("#dataType").val();
  63. var pdata = "{'url': '" + "http://localhost:5907/Home/R3GISViewJSON/" + thedate + "/" + wq + "/JSONTEMP.JSON'}"
  64. var submitjoburl = gpServiceUrl + "/submitJob";
  65. $.ajax({
  66. type: 'get',
  67. dataType: "jsonp",
  68. url: submitjoburl,
  69. data: { DZ: dzdata, PDATA: pdata, f: "pjson" },
  70. jsonpCallback: "jsonpCallback",
  71. success: function (data) {
  72. jobs = 0;
  73. if (data.jobStatus == "esriJobSucceeded") {
  74. doMapJob(data);
  75. }
  76. else {
  77. getJobStatus(data.jobId);
  78. }
  79. }
  80. });
  81. }
  82.  
  83. function getJobStatus(sjobid) {
  84. clearTimeout(interval);
  85. domUtils.show(dom.byId('status'));
  86. if (jobs < 60) {
  87. var sjoburl = gpServiceUrl + "/jobs/" + sjobid;
  88. $.ajax({
  89. type: "get",
  90. dataType: "jsonp",
  91. url: sjoburl,
  92. data: { f: "pjson" },
  93. jsonpCallback: "jsonpCallback",
  94. success: function (data) {
  95. switch (data.jobStatus) {
  96. case 'esriJobSubmitted':
  97. jobstatus = '已提交...';
  98. dom.byId('status').innerHTML = jobstatus;
  99. jobs = jobs + 1;
  100. interval = setTimeout(function () { getJobStatus(data.jobId) }, 1000);
  101. break;
  102. case 'esriJobExecuting':
  103. jobstatus = '处理中...';
  104. dom.byId('status').innerHTML = jobstatus;
  105. jobs = jobs + 1;
  106. interval = setTimeout(function () { getJobStatus(data.jobId) }, 1000);
  107. break;
  108. case 'esriJobSucceeded':
  109. clearTimeout(interval);
  110. domUtils.hide(dom.byId('status'));
  111. doMapJob(data);
  112. break;
  113. case 'esriJobFailed':
  114. clearTimeout(interval);
  115. jobstatus = '查询失败';
  116. dom.byId('status').innerHTML = jobstatus;
  117. gpJobFailed();
  118. }
  119. }
  120. });
  121. }
  122. else {
  123. clearTimeout(interval);
  124. jobstatus = '查询失败';
  125. dom.byId('status').innerHTML = jobstatus;
  126. gpJobFailed();
  127. }
  128. }
  129.  
  130. function gpJobFailed() {
  131. //domUtils.hide(dom.byId('status'));
  132. }
  133.  
  134. function doMapJob(jobinfo) {
  135. //construct the result map service url using the id from jobinfo we'll add a new layer to the map
  136. var mapurl = mapserviceurl + "/" + jobinfo.jobId;
  137. var hotspotLayer = new ArcGISDynamicMapServiceLayer(mapurl, {
  138. "id": "HotspotLayer",
  139. "opacity": 1
  140. });
  141.  
  142. //add the hotspot layer to the map
  143. map.addLayers([hotspotLayer]);
  144. legend = new Legend({
  145. map: map
  146. }, "legendDiv");
  147. legend.startup();
  148. }
  149. app = {
  150. findHotspot: findHotspot
  151. };
  152. return app;
  153. });
  154. function hidediv() {
  155. var ditu00div = $("#legendDiv_ditu00");
  156. if (ditu00div.html() == "") {
  157. return;
  158. }
  159. $("#legendDiv_ditu00").html("");
  160. hidediv();
  161. }
  162. </script>

生成JSON的Controller代码为:

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

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数据,后面是有一个路由作为支撑的,代码为:

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

这里有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. [转]python起步之卡尔曼滤波

    原文地址:http://www.niwozhi.net/demo_c65_i50946.html 关于卡尔曼滤波的理论这里不打算讲了,就是那个5个基本的公式,这里直接给出公式: 公式1:X(k|k-1 ...

  2. AHOI2013 Round2 Day1 简要题解

    第一题,好吧这是个dp.(搜素也能在BZOJ上卡过). 第二题,BFS搜索碰到的立方体面数,智硬没有想到... 第三题,其实一看就有思路,但关键是求x坐标不交的矩形对数+y坐标不交的矩形对数 - x, ...

  3. Spark Streaming 架构

    图 1   Spark Streaming 架构图 组件介绍:‰ Network Input Tracker : 通 过 接 收 器 接 收 流 数 据, 并 将 流 数 据 映 射 为 输 入DSt ...

  4. Cocos2dx游戏源码合集(BY懒骨头+持续更新+2014.02.21)

    转自:http://blog.csdn.net/iamlazybone/article/details/19612941 声明: <萝莉快跑><喵汪大战>两个demo的原作者b ...

  5. JDBC学习笔记(7)——事务的隔离级别&批量处理

    数据库事务的隔离级别 对于同时运行的多个事务, 当这些事务访问数据库中相同的数据时, 如果没有采取必要的隔离机制, 就会导致各种并发问题:脏读: 对于两个事务 T1, T2, T1 读取了已经被 T2 ...

  6. POj3268 Silver Cow Party

    http://poj.org/problem?id=3268 题目大意:求到x距离与从x返回和的最大值 从x点到各个点最短路好求,直接用Dijkstar,但从各个点到x点却不好求,只要把路向翻转过来也 ...

  7. 汇总:Linux下svn命令大全

    svn(subversion)是近年来崛起的版本管理工具,svn服务器有2种运行方式:独立服务器和借助apache.2种方式各有利弊.不管是那种方式,都需要使用各种命令来实现.在本文中,haohtml ...

  8. Nginx反向代理 负载均衡 页面缓存 URL重写及读写分离

    大纲 一.前言 二.环境准备 三.安装与配置Nginx 四.Nginx之反向代理 五.Nginx之负载均衡 六.Nginx之页面缓存 七.Nginx之URL重写 八.Nginx之读写分离 注,操作系统 ...

  9. 在JS和.NET中使用JSON (以及使用Linq to JSON定制JSON数据)

    转载原地址: http://www.cnblogs.com/mcgrady/archive/2013/06/08/3127781.html 阅读目录 JSON的两种结构 认识JSON字符串 在JS中如 ...

  10. POJ 2762 Going from u to v or from v to u? (强连通分量缩点+拓扑排序)

    题目链接:http://poj.org/problem?id=2762 题意是 有t组样例,n个点m条有向边,取任意两个点u和v,问u能不能到v 或者v能不能到u,要是可以就输出Yes,否则输出No. ...