ArcGIS Maritime Server 开发教程(六)Maritime Service 开发技巧

本章导读:GIS 开发人员基于 Maritime Service 开发海图应用时总会遇到与海图数据相关的问题,而对于数据的了解不足,往往给开发带来不少的困难。本章通过 ArcGIS 的几个工具进行辅助,让开发人员很好的从 GIS 向海图过渡,降低海图应用开发的门槛。 By 李远祥

巧妙使用 ArcGIS S-57 Viewer

S-57 Viewer 是 ArcGIS Desktop 的一个免费插件,通过扩展 ArcMap 的功能,让 ArcMap 能够直接读取 S-57 数据。S-57 Viewer 可以在 ArcGIS 的官方网站中下载。S-57 Viewer官方下载地址点击,目前最新版本为 2.2.0.9 。

单独将 S-57 Viewer 这个免费的插件拿出作为浏览 .000 数据的话,笔者认为它比不过免费的 CARIS Easy View 产品。但从 GIS 开发者的角度来看,它是一个协助 GIS 人员向海图技术过渡的利器。因为它能够从 GIS 的角度来解析数据。更有甚者,它是 Maritime Server 出现之间已经存在的东西, Maritime Server 的海图引擎都是从它的渲染引擎中演化过来的。

为什么说 S-57 Viewer 是 GIS 开发者的利器?从上面的图片可以看出,S-57 Viewer 对.000数据的对象进行了分组,并且将同组的对象归为了同一个图层,并且标准命名了。其图层和要素类(看起来像要素类,实际上还是松散的对象)的名称都是按照 S-57 物标的标准命名,只是在不同的类型后面加上了下划线,标明点线面类型,例如 _A 为面要素,_P为点要素。

所以,S-57 Viewer 对于开发者来说,它提供的海图显示并不是重点,对数据的解析才是最重要的,它为 GIS 开发者打开了 .000 数据的盒子,让他们能够以 GIS 人员的角度看清楚里面的结构内容。

以水深点为例,通过 S-57 Viewer 进行解析,可以看到其属性表里面的属性情况。

从这个对数据的解析来看,ArcGIS 软件对 S-57 数据的解析更像对 CAD 数据的解析,将同一组的对象解析为一个图层,将对象的一些说明写入到属性中,而并非图层要素的属性字段。这些都是解析性出来的结构,并不是真实逻辑结构。

在《ArcGIS Maritime Server 开发教程(四)Maritime Service 开发实践》提及到的 FindTask 和 IdentifyTask 的例子中提及到查询出来的结果,如何判别是哪一类型的对象,主要是通过 graphic 的 attributes 来确定的,而非图层名称。attributes 里面的其中一个属性是 objectType ,它对应的是解析出来的图层下划线前半部分名称,如 SOUNDG_P, objectType 输出则为 SOUNDG 。但从 SOUNDG_P 的属性表中根本就找不到 objectType 的字段。 所以,这个属性表里面的属性与 Maritime Service 的对象的属性是不一样的。objectType 是标识物标类型的唯一属性,它是与 S-57 物标对象命名是一致的。 在开发过程中,这个属性字段使用频率非常高。

对之前的 IdentifyTask 代码进行改造,点选查询水深点,并将查询的水深点的所有属性输出来。其代码片段如下

var soundg = "";
//获取物标所有的属性,其中objectType(固定标识) 为物标的唯一标识
var featureAttributes = gra.attributes;
for (var attr in featureAttributes) {if (attr == "objectType") {var oType = featureAttributes[attr];if (oType == "SOUNDG") {//输出所有的属性for (var attr in featureAttributes) {soundg = soundg + attr + ":" + featureAttributes[attr] + "   ";}alert(soundg);//对点线面图形设置符号if (gra.geometry.type == "point") {gra.symbol = pointSym;} else if (gra.geometry.type == "polyline") {gra.symbol = lineSym;} else if (gra.geometry.type == "polygon") {gra.symbol = polySym;}map.graphics.add(gra);//跳转到地图位置jumptoMap(gra);}}
}

最终的测试效果如下图所示,弹出框内容为水深点所有的字段名称及属性值。如下图所示

输出结果与 S-57 Viewer 的属性表对比,还是有一些差异的。如 OBJL、GRUP 等字段根本不存在。可以看出, S-57 Viewer 除了将对象的属性解析出来之外,还对其结构划分追加了一些内容。这部分内容可以给制作桌面工具例如 .000 转 GDB 的小工具提供了比较好的依据。

Maritime Service 中的图层

Maritime Service 在严格意义上是没有图层的概念的,但通过 Maritime Service 的 rest 页面,可以看到其分组显示。

如果在 Maritime Service 的服务地址添加索引号的话,是不能像传统图层那样跳转到有效的动态图层的,而是直接报“无效的URL”,并显示 400 的错误。如下图所示

如果单纯的将 Maritime Service 作为底图显示,那么这个图层分组没有什么太大的必要。但如果比较关注海图数据本身的应用,这样的分组是可以用作图层显示控制的。

S-57 数据的物标对象有上百种类型,如果想 S-57 Viewer 解析那样,将每一种都解析成一个图层,那么上百个图层对于图层控制来说没有多大的意义。Esri 根据自己对海图的理解,将 .000 数据归类为 8 个图层组,每个图层组实现对一组关联物标的控制。

对于传统的动态图层来说,通过图层索引的方式是可以加载的。但 Maritime Service 却不能通过类似的以下的 URL 方式来加载,如:

var enc84 = new DynamicLayer("http://localhost:6080/arcgis/rest/services/SampleWorldCities/MapServer/exts/MaritimeChartService/MapServer/4")

Maritime Service 必须完整加载服务之后,通过 setVisibleLayers 方法进行控制显示。例如要显示第3和第5个图层组的内容,可以参考以下代码:

<!DOCTYPE html>
<html>
<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta name="viewport" content="initial-scale=1, maximum-scale=1,user-scalable=no" /><title>加载海图图层组服务</title><link rel="stylesheet" href="http://localhost/arcgis_js_api/3.19/esri/css/esri.css"><style>html,body,#map {height: 100%;margin: 0;padding: 0;}</style><script src="http://localhost/arcgis_js_api/3.19/init.js"></script><script>var map;require(["esri/map","esri/layers/ArcGISDynamicMapServiceLayer","esri/geometry/Extent","dojo/domReady!"], function (Map, DynamicLayer,Extent) {var initexten = new Extent({ "xmin": 113.42, "ymin": 22.15, "xmax": 113.58, "ymax": 22.26, "spatialReference": { "wkid": 4326 } });map = new Map("map", { extent: initexten });//加载 WGS 84 服务var basemap = new DynamicLayer("http://localhost:6080/arcgis/rest/services/SampleWorldCities/MapServer");map.addLayer(basemap);//加载海图服务var enc84 = new DynamicLayer("http://localhost:6080/arcgis/rest/services/SampleWorldCities/MapServer/exts/MaritimeChartService/MapServer");//选择要显示的图层组enc84.setVisibleLayers([2,4]);map.addLayer(enc84);});</script>
</head>
<body><div id="map"></div>
</body>
</html>

其显示效果如下

如果需要实现图层显示控制,只能通过 setVisibleLayers 方法来完成。

总结

本章是针对 GIS 开发人员向海图应用开发的过渡,利用 S-57 Viewer 对海图数据的解析,来了解 S-57 数据的结构以及在 GIS 中数据的组织方式。毕竟海图数据不是以图层的形式进行组织,因此在开发过程中“海图图层”与 GIS 图层有着比较大的区别。通过一些基本的测试,基本上可以了解到 S-57 数据与传统图层的异同,并通过 JavaScript API 进行有效的操作。

更多的GIS主流和非主流技术,可以持续关注CSDN的GIS制图乐园,以及微信公众号【GIS制图乐园】。BY 李远祥

ArcGIS Maritime Server 开发教程(六)Maritime Service 开发技巧相关推荐

  1. Android项目驱动式开发教程 第2版,《Android项目驱动式开发教程》第一章开发入门.ppt...

    <Android项目驱动式开发教程>第一章开发入门 1.4 项目框架分析 4 android:versionName="1.0" > 5 8 第9行代码andro ...

  2. pythoncad二次开发视频_revit二次开发|bim软件二次开发|revit二次开发教程|Revit二次开发技术文档...

    二次开发 revit二次开发|bim软件二次开发|revit二次开发教程|Revit二次开发技术文档2019-07-08赞( 0 ) 记录一下CAD二次开发的一些简单实例. 1.helloworld ...

  3. AutoCAD 开发文档,AutoLISP 教程,.Net AutoCAD开发教程,VB AutoCAD开发教程,ObjectARX 开发指南,VBA AutoCAD开发教程,ActiveX 开发指南

    AutoCAD 开发文档, CAD开发者社区 - AutoCAD二次开发文档,CAD二次开发,CAD插件开发,中文CAD文档 - 中文CAD开发文档,CAD二次开发问题交流,优秀插件分享 AutoLI ...

  4. 微信公众号开发教程(六)获取微信用户信息-网页授权

    作者:陈惠,叩丁狼教育高级讲师.原创文章,转载请注明出处. 在学习网页授权之前,我们先来了解下这次的需求: 我们的应用中有一个用来显示个人信息的页面,当微信用户在微信app中打开这个页面,希望可以获取 ...

  5. php7扩展开发教程,Laravel 7 扩展开发教程

    下面由Laravel入门教程栏目给大家介绍Laravel 7 扩展开发教程,希望对需要的朋友有所帮助! 步骤 1. 创建一个新项目 我更喜欢使用 Laravel 安装程序.laravel new la ...

  6. python做exe开发教程_python做exe开发教程

    python做exe开发教程内容摘要 python做exe开发教程其他方法无效时可用免疫抑制剂,交通部监理员教程证,6.客户端的异常测试.6.机费用械性能(1)抗拉试验:酒店入职教程内容,6.9l-8 ...

  7. python web 开发教程下载_Python Web开发从入门到精通

    Python Web开发从入门到精通循序渐进地讲解了Python Web开发的核心知识,并通过具体实例的实现过程演示了Web开发程序的流程.Python Web开发从入门到精通共15章,内容包括Pyt ...

  8. MP地面站二次开发教程(一)开发环境搭建和编译

    目录 基于Mavlink的上位机地面站开发教程 第一节 开发环境搭建 1.预编译 (源码尽量放到非中文目录下面) 2.初次编译 ​ 3.删除这个speech引用,重新引用这个speech包(每个人的环 ...

  9. Android开发教程PDF,安卓开发教程PDF免费版

    2019独角兽企业重金招聘Python工程师标准>>> Android开发教程(完全免费版).pdf 某500强android的内部学习资料.pdf Cocos2d-x高级开发教程. ...

  10. Android 日历开发教程[六]

    代码应该是比较简单的,如果下载了源文件,理解起来会比较容易.而且贴出代码,显得太累赘,为此我做了下面这张图,其实就是对第一节那个简图的增加版: 使用 ViewPager 是因为我在官方教程里看到了这篇 ...

最新文章

  1. 从换脸到换姿势,AI 在图像处理的道路上越走越魔幻
  2. linux运维实战练习及linux shell脚本、awk、sed工具命令学习总结
  3. 杭州 |《PMCAFF产品经理第一课》阿里国际CRM、LinkedIn、丁香园、网易邮箱等一线大咖私房干货免费奉送!...
  4. 小米高管否认鸿蒙,小米参加华为鸿蒙系统实验?小米高管终于回应,网友评论炸了!...
  5. [读书笔记] - 《深度探索C++对象模型》第3章 Data语意学
  6. Android Studio设置,鼠标放上去有提示
  7. 学习Web前端,前景无限光明?
  8. word如何打出取整符号
  9. SSH和SSM对比(学完后的总结)
  10. 八种常见的防盗链方法总结及分析 (转自http://www.cnblogs.com/uubox)
  11. Java讯序_java使用顺序表制作电子通讯录,实现添加,删除和排序的功能.
  12. 为 iOS 建立 Travis CI
  13. 微信小程序之一本地图片处理--按屏幕尺寸插入图片
  14. idea debug报错无法调试 Disconnected from the target VM
  15. ::设计·创意·插画::相关网站巨集!
  16. EMNLP 2021中预训练模型最新研究进展
  17. VL102+IT6563替代方案|TYPEC转HDMI带PD方案|AG9311MAQ设计方案
  18. 范德堡大学排名计算机,【usnews世界大学排名2019】2019范德堡大学排名(USNews排名)...
  19. 冥想|平静与自由之路,给初学者的冥想教程
  20. 除了加班、掉头发,程序员还在承受些什么?

热门文章

  1. html onblur 函数执行了2次,JavaScript“onblur事件”调用函数失效 原因与解决方法
  2. 徐州哪个技校学计算机,徐州技校,徐州技术学校哪个好,徐州技术学校哪个知名度高一点 - IT教育频道...
  3. java httpclient 进度条_SpringBoot如何实现一个实时更新的进度条的示例代码
  4. python清空画布_关于python:如何清除Tkinter画布?
  5. 怎么购买企业邮箱,才不被坑?
  6. linux内存回收 内核参数
  7. Linux命令解释之df
  8. 团伙 并查集_BZOJ 1370 Baltic2003 Gang团伙 并查集
  9. spring cloud gateway Unhandled failure: Only one connection receive subscriber allowed.
  10. 使用kNN算法实现简单的手写文字识别