SuperMap iClient for JavaScript 之关联查询

人们常说,计划赶不上变化。同样的,在项目中,使用的数据也是在不断变化的,尤其是属性信息的改变。就比如说,地图上的地物,它的空间信息在比较长的时间内,都不会发生变化,他的属性信息在初期不完整或者与后来的信息不符合,这时就可以使用SuperMap iClient for JavaScript 的关联查询。 
      那如何进行关联查询呢?不急,我们先在iClient for JavaScript中去找找与关联查询相关的类或接口。 
      首先,JavaScript客户端内,查询从分布的服务类别可区分为两类,一是基于地图服务的查询,一种是基于数据服务的查询;按照查询参数的不同有可分为SQL,几何,范围,距离,缓冲区查询。这里主要给大家分享一下基于地图服务的查询。 
      基于地图服务的查询参数基类为SuperMap.REST.QueryParameters,下图展示了该类的属性接口

 
     通过上面的图表,我们能够直观地了解到每个属性参数所代表的意义,这里就不一一讲解了,主要说一下红框所标示的queryParams所对应的查询过滤条件参数类–SuperMap.REST.FilterParameter。首先,我们同样通过一张图表来看看该类包含了哪些属性接口 
 
      没错,关联查询所要用到的接口,就出现在这里了。那我们就来好好研究研究JoinItemLinkItem吧。

待查询数据集与外部表属于同一数据源

SuperMap.REST.JoinItem,连接信息类。 该类用于定义矢量数据集与外部表的连接信息。 外部表可以为另一个矢量数据集(其中纯属性数据集中没有空间几何信息)所对应的 DBMS(Database Management System,数据库管理系统)表, 也可以是用户自建的业务表。需要注意的是,矢量数据集与外部表必须属于同一数据源。 用于连接两个表的字段的名称不一定相同,但类型必须一致。即同为整型,或同为字符型等。

 
      这样看这张图表,可能会觉得有的繁琐,那我们就直接通过下面的一段代码,直观的感受下JoinItem的用法, 代码所用到的数据是iserver自带的map-world。

 1 function queryBySQL() {
 2                 vectorLayer.removeAllFeatures();
 3                 //设置外部表的连接信息
 4                 var joinitem=new SuperMap.REST.JoinItem({
 5                 //外部表的名称
 6                  foreignTableName: "Capitals",
 7                  //建立查询数据与外部表之间的连接字段
 8                  joinFilter: "Capitals.SmID = Countries.SmID",
 9                  //有两种连接类型 一是左连接("LEFTJOIN")二是等值连接("INNERJOIN")
10                  joinType: "LEFTJOIN"
11                  });
12                 var queryParam, queryBySQLParams, queryBySQLService;
13                 queryParam = new SuperMap.REST.FilterParameter({
14                     //待查询图层名
15                     name: "[email protected]",
16                     attributeFilter: "Countries.SmID=5",
17                     joinItems:[joinitem]
18                     //可设置返回的字段数组 这里不进行设置 即返回所有属性字段
19                     //fields:[]
20                 });
21                 queryBySQLParams = new SuperMap.REST.QueryBySQLParameters({
22                     queryParams: [queryParam]
23                 });
24                 queryBySQLService = new SuperMap.REST.QueryBySQLService(url, {
25                     eventListeners: {
26                     "processCompleted": processCompleted,
27                     "processFailed": processFailed}});
28                 queryBySQLService.processAsync(queryBySQLParams);
29             }

这里需要提醒大家一下,当外部表也是数据源内的矢量数据集时,不要混淆foreignTableName这个参数和查询参数queryParam内name这个属性的写法,foreignTableName即是数据集名,而非地图内所对应的图层名,因此上面的代码中,外部表为Capitals,而非[email protected]。 
      查询成功后,返回的结果中的地物不仅有地物本身的属性信息,还包含外部表所包含的属性信息。

待查询数据集与外部表属于不同数据源

SuperMap.REST.LinkItem关联信息类,该类用于定义矢量数据集与外部表之间的关联信息。使用 LinkItem 的约束条件:空间数据和属性数据必须有关联条件,即主空间数据集与外部属性表之间存在关联字段。 主空间数据集:用来与外部表进行关联的数据集。下面两张图表为LinkItem所用到的参数信息。 

同样的,我们直接通过代码来理解LinkItem这个类

 1 function queryBySQL() {
 2     // 设置关联的外部数据库信息,alias表示数据库别名
 3     var dc = new SuperMap.REST.DatasourceConnectionInfo({
 4         dataBase: "RelQuery",
 5         server: "192.168.168.39",
 6         user: "sa",
 7         password: "map",
 8         driver: "SQL Server",
 9         connect: true,
10         OpenLinkTable: false,
11         alias: "RelQuery",
12         engineType: SuperMap.REST.EngineType.SQLPLUS,
13         readOnly: false,
14         exclusive: false
15     });
16    // 设置关联信息
17     var linkItem = new SuperMap.REST.LinkItem({
18         datasourceConnectionInfo: dc,
19         foreignKeys: ["name"],
20         foreignTable: "Pop_2011",
21         linkFields: ["SmID as Pid","pop"],
22         name: "link",
23         primatryKeys: ["name"],
24     });
25     // 设置查询参数,在查询参数中添加linkItem关联条件信息
26     var queryParam, queryBySQLParams, queryBySQLService;
27     queryParam = new SuperMap.REST.FilterParameter({
28         name: "[email protected]",
29         fields: ["SmID","name"],
30         attributeFilter: "SmID<7",
31         linkItems: [linkItem]
32      }),
33     queryBySQLParams = new SuperMap.REST.QueryBySQLParameters({
34          queryParams: [queryParam]
35             }),
36     queryBySQLService = new SuperMap.REST.QueryBySQLService(url, {
37         eventListeners: {
38             "processCompleted": processCompleted,
39             "processFailed": processFailed
40             }
41     });
42     queryBySQLService.processAsync(queryBySQLParams);
43 }

这里需要注意server以及driver这两个参数 
 

除了使用linkItem关联查询不同数据源的数据,其实也可使用joinItem,这时,你可能会说,这和前面所介绍的joinItem必须在同一数据源内有冲突。然而并没有,使用joinItem时,是需要在待查询数据集所在的数据源内新建视图,故查询的是视图,而非其他数据源内的表。那么如何创建视图,可能很多朋友都已经知道了,这里以oracle数据库为例,给大家简要介绍一下。在sqlplus窗口,输入以下代码:

1 create or replace view link as //创建或替换一个名为link的视图
2 select * //查找的字段
3 from    //外部表
4 where   //查找条件   

建立视图后,就可以直接使用joinItem进行关联查询,请看以下代码

1 var joinitem=new SuperMap.REST.JoinItem({
2          foreignTableName: "LINK", //填写视图名
3                  joinFilter: "LINK.SMID = SamplesP.SmID", //关联字段
4                  joinType: "INNERJOIN"
5                  }); 

到这里,你就已经学会如何使用SuperMap iClient for JavaScript 的关联查询了。赶快去你的项目中,实践一下吧。

时间: 2024-10-12 18:40:34

SuperMap iClient for JavaScript 之关联查询的相关文章

SuperMap iClient for JavaScript image出图

SuperMap iClient for JavaScript 客户端基于openlayers 开发. 目前最高版本为811,9D产品后推荐客户使用leaflet.openlayers客户端开发. 问题说明: iClient for JavaScript(classic)在客户端做动态出图选择SuperMap.Layer.TiledDynamicRESTLayer,对接 SuperMap iServer 的 REST 地图服务的分块动态栅格图层.简单说就是加载iServer发布的地图服务在客户端

浅谈Supermap iClient for JavaScript 弹窗类

地图作为信息的载体和呈现方式,是GIS的重要组成部分,它是一个浏览信息的窗口,在信息日益发达的今天 ,各种地图应用如雨后春笋一般出现在大众眼前,而不是像以往一样太过局限于专业的领域.而弹窗,是作为地图信息的补充说明和描述的重要呈现方式,也广泛应用于各种地图应用中.一个好的前端界面的设计要灵活地使用空间,也要生动地完成与用户的交互,而在地图应用中,弹窗使用得好,不但会让人感觉舒适也会方便和增加与用户的交互,提升用户体验.如何使用和如何更好地使用iClient for JavaScript的弹窗(P

mongodb操作之使用javaScript实现多表关联查询

一.数据控制 mongodb操作数据量控制,千万控制好,不要因为操作的数据量过多而导致失败. 演示一下发生此类错误的错误提示: 二.多表关联查询实现 /* 声明变量bridge,用来记录两个集合所连接的桥梁. 相当于sql语句中的Join on语句,on后边跟的条件. 有了桥梁以后,再进行关联那就是易如反掌的事情啦. 关联桥梁所存储的数据是什么样的类型就需要根据你自己的需求来进行创建了. 我这里用一个对象来作为桥梁,然后调用对象中的属性. */ var bridge = db.info.find

关联映射、关联查询

1 什么叫关联映射 通过数据库对象之间的关联关系(一对一.一对多.多对多),反映到实体对象上之间的引用. 举例 用户实体类(User):user_id user_name user_token 笔记本实体类(Book):book_id user_id book_name 一个笔记本对应一个用户(一对一).一个用户对应多个笔记本(一对多) 案例:根据用户ID去查询用户信息以及该用户所有的笔记信息时就需要用到关联查询,所以就需要用到关联映射 关联查询实体类:user_id user_name use

RDIFramework.NET 中多表关联查询分页实例

RDIFramework.NET 中多表关联查询分页实例 RDIFramework.NET,基于.NET的快速信息化系统开发.整合框架,给用户和开发者最佳的.Net框架部署方案.该框架以SOA范式作为指导思想,作为异质系统整合与互操作性.分布式应用提供了可行的解决方案. 分页非常的常见,基本任何项目都会涉及到分页,这没什么好谈的,大多数我们分页对单表的分页比较多,对多表的分页我们可以通过视图来实现,当然还有其他的方式,在这儿,我以一个实例展示下使用我们的RDIFramework.NET来实现多表

Mongoose如何实现统计查询、关联查询

[问题]Mongoose如何实现统计查询.关联查询 发布于 4 年前  作者 a272121742  13025 次浏览 最近业务上提出一个需求,要求能做统计,我们设计的文档集,统计可能跨越的文档会比较多,想问一下,mongoose能实现统计查询和关联查询吗? 例如student文档对象有subject文档对象,subject文档对象有score属,查询所有学员的成绩.我个人的思路就是一般的解决方案,先查询所有学员,再查询所有分数,然后遍历做累加统计 StudentDao.find().sele

mybatis中的关联查询

1>在实体映射层中引入关联对象 package com.jinglin.hotelsup.model; import java.io.Serializable; public class Goodsinfo implements Serializable{ private Integer goodsid; private Integer companyid; private Integer goodstypeid; private Integer unitid; private String c

Hibernate-多表关联查询结果的处理方法

Hibernate多表查询结果处理 (2014-07-06 20:45:40) 转载▼ 标签: hibernate 多表查询 结果集处理 分类: Java 如果我们在Hibernate中需要查询多个表的不同字段,那么如何来获取Hibernate多表查询的结果呢?有两种方式: 1. 对各个字段分别转化成对应类型,如下: Java代码: Query q = session.createQuery(" select members, classInfo.className " + "

MyBatis:学习笔记(3)——关联查询

MyBatis:学习笔记(3)--关联查询 关联查询 理解联结 SQL最强大的功能之一在于我们可以在数据查询的执行中可以使用联结,来将多个表中的数据作为整体进行筛选. 模拟一个简单的在线商品购物系统,如果我们将用户信息和订单信息都保存在user表中,这样就不存在联结关系,因为我们仅仅操作一张表就好. 但是这是非常不明智的选择,举例来说,一个用户可以拥有多个订单,如果保存在一个表中,势必会导致用户信息的多次出现,因为每个订单绑定的用户信息都是相同的. 所以我们尽量要将不同的信息存储与不同的表中,但