发布和使用 ArcGIS Server 服务之--要素服务(feature server)

tech2022-11-28  141

发布和使用 ArcGIS Server 服务之--要素服务(Feature Server)

1、什么是要素服务和托管要素服务有什么区别吗?1.1 要素服务官方定义1.2 什么是托管要素服务1.3 要素服务和托管要素服务有什么区别?1.4、为什么要发布要素服务? 2、要素服务数据源适用要求2.1无论数据源存储在数据库、工作组级地理数据库还是企业级地理数据库,以下要求均适用:2.2 企业级或工作组级地理数据库特定要求 4、使用要素服务方式和客户端4.1 ArcGIS API for JavaScript 客户端4.2 ArcGIS Desktop4.3 与要素服务保持同步( ArcGIS REST API ) 5、要素服务准备/注册/发布---操作实例5.1 arcmap发布要素服务5.2 arcgis pro发布地图服务 6、ArcGIS API for JavaScript调用服务

前面写了mapserver和imageserver的,一直想着写一篇 ArcGIS Server 发布要素服务(featureserver)的操作教程,但是一直没腾出手,最近又细致的梳理一下从要素服务的定义、数据制作以及最后如何发布要素服务的理解简介;

还是按原来的方式,我们先来总结为什么要写这篇博文,然后对要素服务的原理和操作进行介绍;

为什么要写这篇博文:

大家常常对arcgis的各种服务搞得很蒙圈:地图服务:发布和使用ArcGIS Server 服务之–地图服务(Mapserver) 要素服务:发布和使用 ArcGIS Server 服务之–要素服务(feature server) 影像服务:发布和使用 ArcGIS Server 服务之–影像服务(image server) OGC 服务:发布和使用 ArcGIS Server 服务之–OGC服务(WMS/WMTS/WFS/WCS/WPS) 缓存服务:发布和使用 ArcGIS Server 服务之–缓存服务(TileServer)(一) 缓存服务:管理和迁移ArcGIS Server服务和缓存服务(TileServer)(二) 地理处理服务、矢量切片服务、场景服务 、地理数据服务、以及几何服务、KML 服务、地理编码服务、定位器Maritime Server、路径服务、Schematics 服务、流服务、公共设施网络服务、Workflow Manager 服务等;本篇文章就是梳理Feature Server的操作;

本文使用软件环境为:ArcGIS 10.8.1版本,PostgreSql 9.4 ; 对于要素服务定义和概念等知识不关心的小伙伴,可以直接跳到 5、要素服务准备/注册/发布—操作实例 和 6、ArcGIS API for JavaScript调用服务 进行发布和调用;

如果想对arcgis server的服务有个更全面的了解,请移步链接:arcgis server的各种服务类型简要介绍

1、什么是要素服务和托管要素服务有什么区别吗?

1.1 要素服务官方定义

首先了解Feature Service要素服务是运行于 ArcGIS GIS Server 站点上的一种服务类型。

要素服务允许您在 Internet 或 Intranet 中使用存储在数据库中的要素数据和非空间表。

Feature Service的数据存储于通过ArcSDE访问的数据库中(如PostgreSQL、SQL Server 或 Oracle),创建数据前需要在arcmap中配置SDE连接,然后即可操作企业级地理数据库进行创建要素类(feature class)。

1.2 什么是托管要素服务

托管要素服务,顾名思义,就是将数据存储在ArcGIS Data store的托管库中,并发布成为要素服务;

什么是ArcGIS Data store呢? 其里面有三个库:关系库,切片库,时空库,其中一个就是关系型数据库,本质仍是PG库,用来存放portal发布的托管要素服务; 具体介绍可以参考: 点击 ArcGIS Data Store之空间数据库(关系库/切片库/时空库)爱之初体验的一点小事儿

1.3 要素服务和托管要素服务有什么区别?

共同点:

都是属于要素服务的范畴,都是可以实现允许您在 Internet 或 Intranet 中使用和修改存储在数据库中的要素数据和非空间表。

不同点:

两者都是数据存储在数据库中,要素服务是通过arcmap进行注册SDE然后发布sde中的要素类;

而托管要素服务可以通过arcgis Pro、arcmap或者portal进行发布,发布后数据是存储在ArcGIS Data store中的,调用托管要素服务实现编辑和修改,其修改的是存储在ArcGIS Data store中的要素类;

当然发布托管要素服务 支持多个源,允许您完成此操作。 可通过以下任意方式来发布托管要素图层:

包含坐标或地址的逗号分隔值 (CSV) 文件 包含坐标或地址的 Microsoft Excel 文件(.xlsx 或 .xls) GeoJSON 文件或压缩 shapefile 要素集合 压缩文件地理数据库 ArcGIS Pro 地图和 ArcMap 文档 模板或现有要素图层

1.4、为什么要发布要素服务?

当web端进行操作各种各种类型服务的url的时候,每种服务的功能和定位是不同的;但是如果需要实现ArcGIS Server在线编辑功能而编辑和修改完本机数据可以实时保存的功能的话,这个时候我们就需要使用Feature Service了;

下面简介的了为什么要使用要素服务:

我需要将我的数据保留在我的源企业级地理数据库或数据库中,因为其他应用程序访问的是我的记录系统。

我想快速共享通过数据库连接文件访问的所有要素类和表,以允许我的 ArcGIS —Enterprise 门户的其他成员查看数据。

图层中不会立即需要自定义符号系统和范围。

编辑人员将在数据源中直接更新数据,而我希望这些更改可反映在要素服务中。 提示: 如果想要访问企业级地理数据库或数据库中作为只读要素的数据,您可以选择仅发布一个地图服务。

除了先前的要求之外,我还希望其他人员通过要素服务来编辑数据,并且在他们通过其他客户端进行访问时,我也可以看到数据源的更改。

其他人员需要在断开网络连接时编辑要素服务,但是我希望他们所做的离线编辑可与我的记录系统同步。

我具有文件数据源(如 CSV、Microsoft Excel 电子表格和 shapefile),并且希望利用这些数据源创建要素服务。

我的地理数据库或数据库中存在数据,但我还想创建一份数据副本与公众共享并供社区输入使用。

我的地理数据库或数据库中具有数据,但我还想创建一份数据副本与组织或组织中部分成员共享。

我使用 ArcGIS GeoEvent Server 实现实时数据的流式传输,但希望可以本地归档其中部分数据。

2、要素服务数据源适用要求

2.1无论数据源存储在数据库、工作组级地理数据库还是企业级地理数据库,以下要求均适用:

(1)发布到要素服务的数据必须来自单个源地理数据库或数据库。无法在单个地图中发布来自多个数据库连接中的数据。

(2)必须为数据定义有效的空间参考。如未定义,则于发布前在 ArcMap 或 ArcGIS Pro 中进行指定。如果未定义空间参考,则不能发布数据。

(3)基于视图的图层不支持要素服务。由于无法使用 ArcGIS 客户端编辑视图,因此系统不支持发布包含视图的要素服务,但可以启用要素服务进行编辑。如需使用视图中的数据以便在地图或应用程序中参考,可在地图服务中发布视图。

(4)与注册到 GIS Server 站点的数据库连接文件存储在一起的数据库帐户必须具有访问数据所需的权限。如果要素服务将保持只读,则帐户只需选择数据的访问权限。如果要使用要素服务进行编辑,必须授予对数据的编辑权限。如果注册到站点的数据库连接使用操作系统身份验证,则必须向 ArcGIS Server 帐户授予这些权限。

(5)建议在发布为可编辑要素服务的地图中仅包含要编辑的数据。将底图图层等不想编辑的数据发布为另一服务。

2.2 企业级或工作组级地理数据库特定要求

此处列出的要素服务要求特定于企业级或工作组级地理数据库中存储的数据。您的数据需要满足以上部分所述要求,同时也需要满足本部分所述要求。

(1)可以发布未在地理数据库中注册的表或要素类;但不支持发布视图。

(2)如果允许对要素服务进行编辑,并且要素服务包含参与几何网络的要素类,则要素类数据必须与编辑客户端应用程序处于相同的投影和坐标参考系中。例如,如果计划将要素服务添加到 Map Viewer 进行编辑,则数据必须存储在 WGS 1984 Web 墨卡托 (Auxiliary Sphere) 中。在发布之前不能只改变在 ArcMap 中的投影或 ArcGIS Pro 地图;数据必须使用与编辑客户端相同的投影或坐标参考系。

(3)要素服务中支持版本化(传统和分支)和非版本化地理数据库数据。建议您在要素服务中使用非版本化数据,因为非版本化数据比例范围更利于编辑。还有一些复杂数据类型(例如,网络边),但是,必须对其进行版本化才能通过要素服务对其进行编辑。 要编辑分支版本化数据,您必须在参考已注册数据的 ArcGIS Pro 中发布要素图层。

(4)如果地图中存在下列任意一种图层,则不能通过 ArcMap 文档发布启用要素访问的地图服务,也不能通过 ArcGIS Pro 发布参考已注册数据的要素图层: (尺寸/图层组/基于视图的图层和表/包括虚拟列、where 子句或连接的查询图层/栅格/Terrain)

(5)通过 ArcGIS Pro 发布参考已注册数据的图层时,您可以在地图中包括注记图层。而通过 ArcMap 地图文档发布启用要素访问的地图服务时,则无法包括注记图层。 通过要素服务访问宗地结构时,宗地结构始终为只读。

(6)可以发布属于复杂类型(如几何网络和网络数据集)的图层,但是要素服务不会返回类型本身。例如,您可以查询参与网络数据集的图层,但无法查询网络。

(7)从 10.8.1 开始,您可以在要素服务中包括包含分支版本化要素类的拓扑。因为您只能通过要素服务编辑分支版本化数据,所以您可在要素服务中包括拓扑以便在编辑后验证拓扑,并纠正由编辑引起的任何拓扑错误。

(8)仅当关系是通过地理数据库关系类定义时,要素服务才允许对相关数据进行查询。如果发布的地图文档具有通过地理数据库关系类相关联的图层和表,要素服务允许对图层进行查询以返回关联表中的对象。要支持返回关联对象的查询,关系类中涉及的表和图层必须包含在发布的地图文档中。如果原始或目标图层或表未包含在地图文档中,则要素服务将忽略该关系。 注: 对于属性关系类,需要在地图文档中包含关系类表。

(9)要维护公共设施网络,您必须通过 ArcGIS Pro 将其发布为要素图层。

4、使用要素服务方式和客户端

4.1 ArcGIS API for JavaScript 客户端

ArcGIS API for JavaScript 提供了最先进的 Web 编辑功能和自定义选项。如果您喜欢使用此 API 进行编程,可通过针对特定目的、目标或组织策略定制您的编辑方案,从而为 Web 用户提供尖端体验。例如,可使用 ArcGIS API for JavaScript 执行以下操作:

编辑“仅选择”图层 追踪编辑内容(针对企业级地理数据库,数据库中不可用。) 使用基于所有权的访问控制来控制对要素的访问 阻止用户编辑要素几何 动态创建、删除和更改地理数据库版本 编辑制图表达 获取要素服务的 REST 端点 可通过浏览至 ArcGIS Server 服务目录中的服务获得要素服务的 REST 端点或 URL 链接。例如,服务目录中某要素服务的默认 URL 是 http://gisserver.domain.com:6080/arcgis/rest/services/folder/service/FeatureServer。可将从零开始的整数追加到该 URL 来引用该服务中的特定图层。例如,如果 URL 链接以 /0 结束,则会引用服务中的第一个图层。

4.2 ArcGIS Desktop

ArcGIS Desktop 允许您编辑要素服务中的数据。在 ArcGIS Desktop 中编辑的工作流与通过 Web 应用程序编辑要素服务具有本质上的区别。

4.3 与要素服务保持同步( ArcGIS REST API )

要素服务中包含支持离线编辑工作流的操作。在离线环境中,客户端(例如,运行时或移动设备)可进行本地编辑,并在客户端重新连接要素服务后将内容更改与服务器进行同步。此功能称为同步,通过 ArcGIS REST API 可使用该功能。

注:以下是未完成部分,有待下周我一鼓作气给他截图操作一下,写个详细流程;

5、要素服务准备/注册/发布—操作实例

5.1 arcmap发布要素服务

arcmap发布要素服务,首先需要有个企业级地理数据库,那么有的小伙伴就会问,这样做企业级地理数据库和普通的数据库区别是什么呢? 首先空间数据库分为三种:个人地理数据库(.mdb)、文件地理书库(.gdb)、企业级地理数据库(.sde);而我们的sde就是企业级地理数据,其实存在于普通数据库SQL Server、Oracle、PostgreSQL等数据库内的,一种空间类型的关系型数据库;

那么我们有了这个企业级地理数据库就可以将我们的shp数据,导入到sde中变为feature class(要素类);

接下来只需要将企业级地理数据库注册到server上,然后即可发布为要素服务了; (1)在ArcGIS desktop中创建企业级地理数据库。 创建sde前,电脑必须得安装PG,小编本机安装的是PG9.6;

那么有了sde后,我们就可以使用工具箱中的Create Enterprise Geodatabase在PG中,创建自己的空间数据库了;

1)数据库平台:PostgreSQL

2)实例:指的是你连接的数据库地址,我是本地IP是192.168.0.173

3)数据库:qw,是在PG中为ArcGIS准备的企业级地理数据库名称

4)数据库管理员:PG的管理员账号

5)地理数据库管理员:ArcGIS管理员的账号,默认为sde

6)授权文件: 这个许可文件有两个可以授权,

一个是arcgis server的.ecp许可文件;一个是arcgis server许可写入到计算机的位置,我的位置如下: C:\Program Files (x86)\ESRI\License10.7\sysgen C:\Program Files\ESRI\License10.7\sysgen 本例创建了一个名为qw的空间型关系数据库;

(2)在ArcGIS desktop中连接数据库

(3) 注册企业级地理数据库到server 有两种注册方法: 其一,在发布前,将企业级地理数据注册到server上: 点击ok: 其二: 再发布的时候,analysis的时候会报错:直接点击注册就行;即如下图:

(4) arcmap发布要素服务 由于我是采用第一种注册,发布前先将企业级地理数据库注册到server上; 所以我们直接新建数据发布即可;

下图展示了,我们可以对自己的企业级地理数据库进行导入已有的shp数据,新建自己的数据;

下图展示了,我们在自己的企业级地理数据库中,新建数据,然后在点击文件->共享于->服务 打开共享为服务面板,点击发布服务:发布feature class为feature server的整个操作过程: 发布完后,我们去server中查看:

5.2 arcgis pro发布地图服务

(1)在ArcGIS Pro中创建企业级地理数据库。 此步骤可以在arcmap中完成;也可以在arcgis Pro中完成;那么接下来我们一起来看看这些工具箱和链接的位置在何处,工具的参数都是一样的,就不一一操作了; 首先创建企业级地理数据库,同样是在数据管理工具箱内: (2)在ArcGIS Pro中连接数据库 那么链接创建好的sde,可以在catalog中: 也可以在菜单栏内:

链接好的sde是这样的:

(3) arcgis pro注册和发布要素服务

(4)去portal上核验发布的要素服务; 注:由于地图服务是基础,所以发布的时候,会默认自带的发布地图服务;也就是说我们发布要素服务的时候,在portal和server上都是有两个服务的,一个是要素服务,一个是地图服务; 我们在JS开发的时候只需要调用对应服务的URL即可;

6、ArcGIS API for JavaScript调用服务

JS的layer设定了对应不同服务的class进行处理: ElevationLayer FeatureLayer ImageryLayer IntegratedMeshLayer MapImageLayer MapNotesLayer PointCloudLayer SceneLayer StreamLayer TileLayer VectorTileLayer CSVLayer GeoRSSLayer GraphicsLayer GroupLayer KMLLayer OpenStreetMapLayer WebTileLayer WMSLayer WMTSLayer

我们定位到要素服务的图层级别: ,然后复制url:https://t460p.esrichina.com/server/rest/services/test1010/FeatureServer/0

在JS中调用要素服务的时候,使用的是featurelayer这个类,下面这个是我的测试代码;

<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <meta name="viewport" content="initial-scale=1,maximum-scale=1,user-scalable=no" /> <title> Intro to FeatureLayer | Sample | ArcGIS API for JavaScript 4.17 </title> <link rel="stylesheet" href="https://js.arcgis.com/4.17/esri/themes/light/main.css" /> <script src="https://js.arcgis.com/4.17/"></script> <style> html, body, #viewDiv { padding: 0; margin: 0; height: 100%; width: 100%; } </style> <script> require([ "esri/Map", "esri/views/MapView", "esri/layers/FeatureLayer" ], function (Map, MapView, FeatureLayer) { var map = new Map({ basemap: "topo" }); var view = new MapView({ container: "viewDiv", map: map, extent: { // autocasts as new Extent() xmin: -47.628, ymin: -7.808, xmax: -0.269, ymax: 29.76570000, spatialReference: 102100 } }); /******************** * Add feature layer ********************/ // Carbon storage of trees in Warren Wilson College. var featureLayer = new FeatureLayer({ url: "https://t460p.esrichina.com/server/rest/services/test1010/FeatureServer/0" }); map.add(featureLayer); }); </script> </head> <body> <div id="viewDiv"></div> </body> </html>

如果需要测试的话,定位到自己的rest服务,修改一下extent即可:

JS调用的具体展示效果如下:

最新回复(0)