前言
动态地图图层是即时生成的图片,而不是在服务器上预先缓存的图片。当用户向服务器请求地图服务时,服务器根据接收到的参数调用底层服务。服务器根据接收到的参数调用底层服务,底层服务经过参数计算,实时地生成像素点,这些像素点构成图片,返回服务器,服务器再传递给用户端。动态图层的优点在于当用户需要实时数据(如某地段的交通流量分析)时,数据更新及时;缺点是显示效果较差,整个服务出图较慢。
动态地图图层类包括MapImageLayer、ImageryLayer与WMSLayer三个,分别用于访问ArcGIS Server发布的动态地图服务、ArcGIS Server发布的影像服务以及其他符合WMS规则的地图服务。
1. 使用场景
当动态图层服务的subLayer(子图层)包含的几何数据与空间数据库的某些表的数据相对应(可以是主外键或者某个字段之间的联系),我们需要通过结合空间表的数据和对应的子图层的几何数据进行渲染可视化展示时,我们可以适用本文要介绍的MapImageLayer动态图层服务链接空间表数据源使用。
图示一(“企业地块”地图服务)
图示二(“企业信息”数据库表)
当我要在地图上显示MapImageLayer动态图层服务的时候,从 图示一 可以看到服务里面只有几何的数据,所以我们可以渲染几何数据,但是我们现在需要根据“评价结果”的不同,渲染地图服务里面的地块。这时我们发现以现在地图服务里面的数据是不能实现的,因为地图服务里面没有“评价结果”的字段储存数据。我们从 图示二 可以看到表里面有pjjg_tr、pjjg_dxs、pjjg_dbs这些关于“评价结果”的字段。于是就可以用带有几何数据的地图服务连接带有其他属性的数据库表,生成新的地图服务。这样就能满足上述的,通过评价结果进行区别渲染地块的需求。
2. 数据源连接步骤
数据表必须存在于地图服务器中已注册的动态工作空间中(所以下面配置中需要workspaceId)。举个例子,我们从包含地区所有“企业地块”几何数据的地图服务创建一个 MapImageLayer。在注册的工作区中发布了一个“企业信息”表,其中包含企业的具体信息。要通过使用表连接(table join)方式创建动态层,将包含企业信息的数据在地图上可视化,就要将“企业信息”表连接到“企业地块”地图服务层。
因此,必须执行以下操作:
2.1 构建具有一个子图层的 MapImageLayer
由于子图层将从服务目录中不可见的数据动态创建,因此我们需要指定数据源。在这种情况下,它是一个“join-table”。
source: {
type: "data-layer",
dataSource: {
type: "join-table"
}
}
2.2 定义连接的数据来源
需要定义连接的来源:左表(leftTableSource)和右表(rightTableSource )。 通常,左表将是包含几何图形的表。 在这种情况下,它是在服务目录中可见的map-layer地图服务层。
动态服务的企业地块子图层服务信息
由于它的层 ID 为 2,因此我们需要在 leftTableSource 的对象中指明这一点。
source: {
type: "data-layer",
dataSource: {
type: "join-table",
leftTableSource: {
type: "map-layer",
mapLayerId: 2 //动态服务图层的子图层的id
}
}
}
rightTableSource 是包含各个“企业信息”的表格。 由于这个表不是地图服务图层,而是单个数据表,我们应该将其指示为具有table数据源的数据层。table数据源必须指示表所在的工作空间 ID (workspaceId)和表的名称(dataSourceName)。
source: {
type: "data-layer",
dataSource: {
type: "join-table",
leftTableSource: {
type: "map-layer",
mapLayerId: 3
},
rightTableSource: {
type: "data-layer",
dataSource: {
type: "table",
workspaceId: "ADS_SOIL_GROUENDWATER",
dataSourceName: "public.ads_query_qydk"
}
}
}
}
因为rightTableSource 是另一个数据层,所以可以通过将那个对象的dataSource 设置为另一个table join 来创建一个嵌套的table join。
2.3 指定连接的类型(joinType)
在本例中,它是左外部连接,因此我们可以保留地图服务层中不匹配的记录。 在 MapImageLayer 的上下文中,最终的源对象应该如下所示:
const layer = new MapImageLayer({
url: "https://192.168.1.81:6443/arcgis/rest/services/YNSG_DCDX/EnvironmentalSurvey1/MapServer",
sublayers: [
{
// 此 ID 可以与服务层 ID 无关
// 可以任意填写
id: 0,
renderer: renderer,
opacity: 0.75,
source: {
type: "data-layer",
dataSource: {
type: "join-table",
leftTableSource: {
type: "map-layer",
mapLayerId: 2
},
rightTableSource: {
type: "data-layer",
dataSource: {
type: "table",
workspaceId: "ADS_SOIL_GROUENDWATER",
dataSourceName: "public.ads_query_qydk"
}
},
leftTableKey: "hid",//主键或字段名
rightTableKey: "hid",//外键或字段名
joinType: "left-outer-join"
}
}
}
]
});
完成此连接操作,必须提供左表中的主键或字段名以及右表中的外键或字段名(使两种数据产生对应关系)。 这会将非地理“企业信息”表中的记录与包含几何图形的“企业地块”地图服务层相匹配。
“企业地块”地图服务
“ads_query_qydk”企业信息表
如图所示两种数据源中都有“hid”的字段,所以这个例子以“hid”为“leftTableKey”和“leftTableKey”从而实现连接两种数据源。
3. 浏览器访问对服务器的请求
您可以通过浏览器开发人员工具中的网络流量(Network)访问对服务器的请求,从而在服务目录中查看此动态连接。 查看此表连接并注意目录中存在的两个表中的字段。 您可以像查询任何其他图层一样查询动态图层。
3.1 获取table join后的动态服务请求链接地址
点击f12键进入开发者页面,在根据上图步骤进行点击,进入表链接后的服务
3.2 进入动态服务请求链接
表连接后生成的地图服务
3.3 属性查询
通过添加查询条件在服务中进行属性的查询,比如添加where属性为1=1,Out Fields属性为*,这样就能查询到所有的图层要素,返回所有字段信息。
通过观察查询到的要素数据会发现数据记录返回的字段属性不仅包含“企业信息”的字段信息,还有“企业地块”地图服务包含的_Polygon_几何信息。