WebGIS开发0基础必看教程:矢量查询

news2025/1/23 3:28:41

1.前言

在第七章里我们知道了WebGIS中要素的本质是UIComponent,而矢量图层的本质是包含了n(n>=0)个UIComponent的Canvas。我们在UIComponent的graphics中,根据矢量数据画出矢量的形状(shape),并且将矢量数据的属性(attributes)赋予该UIComponent。

在接下来进行要素和矢量图层的设计前,我们有必要了解这四个问题

(1)矢量数据是什么?

(2)矢量数据从何而来?

(3)矢量数据如何组织的?

(4)矢量数据得到后如何使用?

在这一章里,我将着重回答第1、2、3个问题,第四个问题涉及到一些算法知识,我们将专门在下一章进行讲解。

2.矢量数据的本质

矢量数据跟一般性数据最大的差别在于矢量数据是包含了空间(geometry)信息的。我们知道要素是由有序的空间坐标连接组成,而这个空间信息中便包含了该序列坐标。如果geometry为空,说明此要素不存在。同时矢量数据还包含一般性数据所有的信息,即属性数据。不过属性数据并不是必须的,只要geometry信息存在,attributes信息没有,要素也是同样存在的。

3.矢量数据的来源

我将矢量数据的来源分为两种:

(1)非向后台请求获得。

这些数据是已经存在于前台代码中,或者由第三方调用者通过参数在前台调用我们系统时本身通过参数传递进来。

(2)向后台请求获得。

向后台请求获得又要分为两种:

a.向业务服务器请求获得。

b.向地图服务器请求获得。

向业务服务器请求获得矢量数据跟一般的请求并没有区别,业务服务器只要按照一定的规范,组织好矢量数据,返回即可。本章的重点是向大家介绍后者,如何向地图服务器请求矢量数据。

3.1通过ArcGIS Server获得矢量数据

3.1.1 AGS中几种服务的介绍

在我们发布地图服务时,如果勾选了Mapping(必须勾选),我们将能发布一个MapServer服务。当然,我们的AGS还能发布多个其他种类服务,比如NAServer、GeometryServer、FeatureServer、GPServer。其中NAServer可以用来进行路径分析,GeometryServer服务中包含了一系列拓扑操作的服务,FeatureServer可以用来进行要素编辑,GPServer则可以利用发布的模型来进行复杂的空间操作。下面两张图分别是10.0中发布的几种服务,以及Geometry服务中提供的一些功能(在10.1和10.2中Geometry服务的默认地址有变化)。

img

img

这一章里,我主要讲的是MapServer中的Query服务。其他服务在我们以后的功能设计模块中,如果涉及,会跟大家再一起探讨。

3.1.2MapServer的详解

首先MapServer支持两种请求方式,并且支持一些查询操作。具体如下:

img

在MapServer的页面中,我们还可以看到该服务中所包含的图层的具体信息:

img

点击具体图层,进入该图层页面后,能看到该图层的详细信息,同样此页面中也详细的描述了可以支持的操作。如下图所示:

img

点击Query后便可以进入该图层空间查询的具体页面:

img

在此页面中,我们可以通过对各个查询参数的设置来获取想要的查询结果。

3.1.3 Query查询的具体URL

MapServer中图层提供的查询服务是只支持rest样式的。通过上面的Query截图我们可以知道,Query查询的参数为:objectIds、where、geometry、geometryType、spatialRel、outFields、returnGeometry、returnIdsOnly、f、time。

这些参数所代表的实际含义如下:

objectIds:要素的ObjectID号。比如:objectIds=37, 462。

where:查询条件,支持标准sql中的where写法。比如:where=POP2000 > 350000。

geometry:geometry中为要查询的范围。其与Geometrytype应保持一致。geometry中,有点、线、面三种写法。这里给出接口API中的描述:

img

geometryType:它的内容与geometry中的内容是对应的,它可以选择的值有:esriGeometryPoint 、 esriGeometryMultipoint 、 esriGeometryPolyline 、esriGeometryPolygon 、 esriGeometryEnvelope。

spatialRel:为空间参考参数。

outFields:为需要返回的属性字段。

returnGeometry:是否范围几何信息。默认是ture。

returnIdsOnly:是否只范围ObjectID。默认是false。

f:返回数据的格式。有html、json 、kmz 、 amf。对我们开发者来说,返回json是最适合的。

time:赋为一个随机值即可,设置了此参数,可以避免查询读缓存。

这里给出一个URL示例的截图:

img

注意:我在这里将where设置为1=1,此表示能够返回我们在发布服务时已经设置好的返回的最大数据个数。默认为返回1000个数据。outFields设置为*是返回数据中所有关键字段的信息。另外,对于URL还想做进一步了解的读者,可以参考ArcGIS Server中的API Reference。

我们在程序中,向AGS服务器发送请求,查询某个关键字段时,便可以仿照这个URL的样式来进行请求。AGS的Query服务支持GET和POST两种请求方式。

3.2通过GeoServer获得矢量数据

3.2.1Geoserver的简介

GeoServer作为开源的地图服务工具,由于其易扩展性、开源性、功能完整性等等优点,被越来越多的实际项目所使用。Geoserver支持OGC中的WMS、WFS等标准,且Geoserver的请求方式同样支持Rest和Soap两种协议。GeoServer本身是由Maven进行组织的,内部使用了struts和Spring框架,这里我跟大家展示一下GeoServer的源码内部构造,让大家对GeoServer的本质有个稍微清晰的认识:

img

如何开发GeoServer并不是我们这个系列的重点,我们这个系列是跟大家一起探索WebGIS的一些原理知识,设计并实现一些基于原理知识的模型和功能。如果大家对Geoserver有兴趣,我将在以后的其他系列里和大家一起研究。

Geoserver发布成功后,便可以登陆、进入如下页面:

img

回到正题上,如何用GeoServer来实现如AGS中的Query查询呢?

3.1.2 详解Query查询

查询图层信息为WFS服务中的getFeature服务,其请求方式与标准的WFS请求方式是一样的。但是,与AGS相比,Geoserver的Query查询条件编写是相对复杂的,并且一般有两种方式。

3.1.2.1第一种方式,URL方式

http://www.someserver.com/wfs?SERVICE=WFS& VERSION=1.1.0& REQUEST=GetFeature& PROPERTYNAME=InWaterA_1M/wkbGeom,InWaterA_1M/tileId& TYPENAME=InWaterA_1M& FILTER=InWaterA_1M/wkbGeom gml:Envelopegml:lowerCorner10,10</gml:lowerCorner> gml:upperCorner20 20</gml:upperCorner></gml:Envelope>

3.1.2.2第二种:连接后发送XML方式

在连接到http://www.someserver.com/wfs 后,向其发送下面的XML:

img

3.1.2.3对两种请求方式的小结

这两种方式中,Filter均是编写重点。Filter本身是一种基于XML的并且符合OGC规范的语言。WFS在所有需要定位操作对象的地方都会使用Filter。Filter的作用是构建一个表达式,返回值就是Feature的集合,换句话说Filter就如它的名字一般为我们从一个集合中过滤出一个满足我们要求的子集。而过滤的方法就是Filter定义的操作符。Filter定义了三种操作符:地理操作符(Spatial operators),比较操作符(Comparison operators)和逻辑操作符(Logical operators)。

Spatial operators定义了地理属性的操作方式,他们有:Equals、Disjoint、Touches、Within、Overlaps、Crosses、Intersects、Contains、Dwithin、Beyond、BBOX。

Comparison operators定义了标量属性的操作方式,他们有:PropertyIsEqualTo、PropertyIsNotEqualTo、PropertyIsLessThan、PropertyIsGreaterThan、PropertyIsLessThanOrEq、PropertyIsLike、PropertyIsNull、PropertyIsBetween。

Logical operators逻辑操作符,定义了组合这些操作的方式,他们有:And、Or、Not。

在Query编写中,Geometry参数的编写也很重要,同时也有一定的难度,他需要我们对GML语言有一定的了解。这里给出GML的三个例子,分别对应point、box、Polygon:

img

img

img

如果我们希望前台直接向Geoserver发送请求,可以选择第一种URL方式。如果我们是通过我们的业务服务器转发对Geoserver的请求,建议使用第二种方式。第二种可以发送的数据量更大,并且易于形成标准请求。

4.矢量数据的组织

矢量数据本身的组织方式并没有规定的格式,可以视具体的项目而定。不过对于AGS和Geoserver返回的数据,是有固定格式的。这里我们分别给出例子。

4.1AGS的矢量数据组织格式

下图便为一个AGS标准的矢量数据格式:

img

它由attributes和geometry组成。Attributes中包含了查询得到的属性结果,geometry中则包含了查询所得要素的空间信息。针对不同的要素,返回的geometry的组织是各不相同的。Geometry对线和面分别有paths和rings两种数据组织格式。

4.2Geoserver的矢量数据组织格式

Geoserver中返回的矢量数据组织格式与AGS的差不多,需要注意的是两点:

(1)表示点、线、面的字段名称有不同之处。在Geoserver中线和面的字段名分别是:Line、Polygon| MultiPolygon。

(2)返回的坐标,相对于AGS中的坐标(X,Y),Geoserver中的是相反的,即为(Y,X)。

5.总结

在这一章里,我们对AGS和Geoserver中的WFS服务进行了详细的讲解。实际项目中,矢量图层的数据大多是来源于此服务所返回的数据的。

矢量数据中的Geometry数据为地理坐标数据,我们在前端表现矢量图层时,是在要素(UIComponent)中画出Geometry的形状,所以这里就涉及到,如何将得到的地理坐标转换为对应的屏幕坐标,让前端的UIComponent上可以画出该要素形状。

免费领取更多GIS开发学习教程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1494102.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C及C++每日练习(1)

一.选择&#xff1a; 1.以下for循环的执行次数是&#xff08;&#xff09; for(int x 0, y 0; (y 123) && (x < 4); x); A.是无限循环 B.循环次数不定 C.4次 D.3次 对于循环&#xff0c;其组成部分可以四个部分&#xff1a; for(初始化;循环进行条件;调整) …

信息安全是什么

信息安全&#xff0c;也称为信息安全或数据安全&#xff0c;是防止未经授权的访问、更改、中断和破坏信息。 信息安全本身包括的范围很大&#xff0c;大到国家军事政治等机密安全&#xff0c;小范围的当然还包括如防范商业企业机密泄露&#xff0c;防范青少年对不良信息的浏览…

词嵌入向量和位置编码向量的整合

词嵌入向量和位置编码向量的整合 flyfish 文本序列 -> 输入词嵌入向量&#xff08;Word Embedding Vector&#xff09;-> 词向量 位置编码向量&#xff08;Positional Encoding Vector&#xff09; Embedding 的维度使用了3 可以输出打印看结果 from collections im…

sylar高性能服务器-日志(P57-P60)内容记录

文章目录 P57-P60&#xff1a;序列化模块Varint&#xff08;编码&#xff09;Zigzag&#xff08;压缩&#xff09;class ByteArrayNode&#xff08;链表结构&#xff09;成员变量构造函数写入读取setPositionaddCapacity 测试 P57-P60&#xff1a;序列化模块 ​ 序列化模块通常…

【Java EE】文件内容的读写⸺数据流

目录 &#x1f334;数据流的概念&#x1f338;数据流分类 &#x1f333;字节流的读写&#x1f338;InputStream&#xff08;从文件中读取字节内容)&#x1f33b;示例1&#x1f33b;示例2&#x1f33b;利用 Scanner 进行字符读取 &#x1f338;OutputStream(向文件中写内容&…

当CV遇上transformer(一)ViT模型

当CV遇上transformer(一)ViT模型 我们知道计算机视觉(Computer Vision)&#xff0c;主要包括图像分类、目标检测、图像分割等子任务。 自AlexNet被提出以来&#xff0c;CNN成为了计算机视觉领域的主流架构。CNN网络结构主要由卷积层、池化层以及全连接层3部分组成&#xff0c;其…

Uni-ControlNet: All-in-One Control toText-to-Image Diffusion Models——【论文笔记】

本文发表于NeurIPS 2023 项目官网&#xff1a;Uni-ControlNet: All-in-One Control to Text-to-Image Diffusion Models 一、Introduction 近两年来&#xff0c;扩散模型在图像合成任务中表现优异&#xff0c;尤其是文本到图像&#xff08;T2I&#xff09;扩散模型已成为合成高…

腾达路由器检测环境功能破解MISP基础

在虚拟机上用qemu运行腾达路由器的网站固件会遇到无法识别网络的问题&#xff0c;这篇主要是破解这个功能&#xff0c;使腾达路由器成功在虚拟机上运行&#xff0c;方便漏洞复现 本次用到的腾达路由器版本&#xff1a; https://www.tenda.com.cn/download/detail-3683.html下…

Python 开发图形界面程序

用 Python 语言开发图形界面的程序&#xff0c;有2种选择&#xff1a; Tkinter 基于Tk的Python库&#xff0c;这是Python官方采用的标准库&#xff0c;优点是作为Python标准库、稳定、发布程序较小&#xff0c;缺点是控件相对较少。 PySide2/PySide6 基于Qt 的Python库&#x…

玩家至上:竞技游戏设计如何满足现代玩家的需求?

文章目录 一、现代玩家需求分析二、以玩家体验为核心的游戏设计三、个性化与定制化服务四、强化社交互动与社区建设五、持续更新与优化《游戏力&#xff1a;竞技游戏设计实战教程》亮点编辑推荐内容简介目录获取方式 随着科技的飞速发展和游戏产业的不断壮大&#xff0c;现代玩…

软件测试之Web自动化测试

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号【互联网杂货铺】&#xff0c;回复 1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、自动化测试基本介绍 1、自动化测试概述&#xff1a; 什么…

Android布局优化之include、merge、ViewStub的使用,7年老Android一次坑爹的面试经历

前言 开发10年&#xff0c;老码农&#xff0c;曾经是爱奇艺架构 点击领取完整开源项目《安卓学习笔记总结最新移动架构视频大厂安卓面试真题项目实战源码讲义》 师&#xff0c;东芝集团高级工程师&#xff0c;三星架构师。5年之内频繁被辞退。内心拔凉拔凉的&#xff0c;在这五…

Android大厂高级面试题灵魂100问,带你彻底弄明白

“2020年技术没有成长&#xff0c;我今年一定要好好努力学习&#xff01;” “在现在这个公司都工作了3年了&#xff0c;一毛钱工资都没有涨…” “年前真倒霉&#xff0c;老板嫌我工资高&#xff0c;被优化了&#xff0c;年后又遇到了疫情&#xff0c;现在都还没有找到合适的工…

141.乐理基础-男声女声音域、模唱、记谱与实际音高等若干问题说明

上一个内容&#xff1a;140.乐理基础-音程的转位-CSDN博客 上一个内容练习的答案&#xff1a;红色箭头指向的是转为&#xff0c;比如第一个只要写成c低g高都是正确的&#xff0c;不一定非要和图中一样 首先在 12.音域、1C到底是那一组的C 里面写了人声的音域&#xff0c;大致默…

最强照片AI无损放大工具

使用人工智能的能力来放大图像&#xff0c;同时为惊人的结果添加自然的细节。 使用深度学习技术&#xff0c;A.I.GigaPixEL可以放大图像并填满其他调整大小的产品所遗漏的细节。 下载地址&#xff1a;最强照片AI无损放大工具.zip

dolphinscheduler试用(一)(边用边修bug。。。。create tenant error)

&#xff08;作者&#xff1a;陈玓玏&#xff09; 前提&#xff1a;部署好了dolphinscheduler&#xff0c;部署篇见https://blog.csdn.net/weixin_39750084/article/details/136306890?spm1001.2014.3001.5501 官方文档见&#xff1a;https://dolphinscheduler.apache.org/…

MyBatis操作数据库(SQL注入)

本文主要来讲解6大标签&#xff0c;以便更好的MyBatis操作数据库&#xff01; <if>标签<trim>标签<where>标签<set>标签<foreach>标签<include>标签 前提需求&#xff1a; MyBatis是一个持久层框架&#xff0c;和Spring没有任何关系&…

【LeetCode】升级打怪之路 Day 14:二叉树的遍历

今日题目&#xff1a; 144. 二叉树的前序遍历94. 二叉树的中序遍历145. 二叉树的后序遍历102. 二叉树的层序遍历107. 二叉树的层序遍历 II199. 二叉树的右视图637. 二叉树的层平均值429. N 叉树的层序遍历515. 在每个树行中找最大值116. 填充每个节点的下一个右侧节点指针117. …

Fiddler入门:下载、安装、配置、抓包、customize rules

一、fiddler下载安装 安装包下载链接&#xff1a;https://www.telerik.com/download/fiddler 随便选个用途&#xff0c;填写邮箱&#xff0c;地区选择China&#xff0c;勾选“I accept the Fiddler End User License Agreement”&#xff0c;点击“DownLoad for windows”&…

⭐每天一道leetcode:28.找出字符串中第一个匹配项的下标(简单;暴力解;KMP算法,有难度)

⭐今日份题目 给你两个字符串 haystack 和 needle &#xff0c;请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标&#xff08;下标从 0 开始&#xff09;。如果 needle 不是 haystack 的一部分&#xff0c;则返回 -1 。 示例1 输入&#xff1a;haystack &q…