sqlserver空间数据 + c# 实现查询附近的设备
前言
一个小需求的实现,做一个备忘,个人理解,可能存在错误。
客户有很多设备,这些设备分散在不同的地方,现在需要通过小程序获取附近的(比如1000米)之类的设备列表,以距离排序
第一个想到的的是找百度/腾讯等地图,看有没有提供相应的开放api,先将我们的设备id以及对应的经纬度存储到地图中,再调用某个api,传入我当前坐标经纬度,然后返回附近的设备列表。最后没找到这个接口。应该是有,但是我没找到
第二个想能不能通过c#用啥算法实现,太菜搞不定
最后想到sqlserver有个空间数据的概念,最终勉强实现。
参考:空间数据 (SQL Server) efcore中使用空间数据
概述
空间对象其实就是点、线、面之类的意思,我们希望对其进行一些操作,如:查询得到两个面之间的交集/差集/并集;以一个点为中心,设置半径得到一个面;查询两个点之间的距离;等等。这些操作如果我们自己用算法来实现想想有点怕。
c#提供了相应的库来表示这些空间对象,也提供了相应的方法来执行针对空间对象的操作 ->NetTopologySuite(从java的JTS移植来的)由于这次小需求只是依赖了数据库对空间数据的支持,所以没有详细研究NetTopologySuite(资料少)
sqlserver2008开始支持空间数据,它也提供了相应的类型来表示空间对象,也提供相应的函数来操作这些对象,当然其它数据也支持
估计还有单独的空间数据引擎,以文档形式存储空间对象
这些点/线/面可以放在一个普通平面中,这时把他们看成几何对象,比如一个点就可以用XY坐标来表示、一个线就可以用两个点来表示...;
也可以将这些空间对象放在地球环境中来看,那么点就对象就用经纬度来表示、线就用两个点来表示
几何图形与地理位置
同一个空间对象,比如一个点 可以把它放在一个普通的平面坐标中来看待,用XY坐标来表示,也可以放进地球环境中用经纬度来表示。
- Geometry 类型表示欧几里得(平面)坐标系中的数据。
- Geography 类型表示圆形地球坐标系中的数据。
以点来说,可以创建Geometry类型的点,也可以创建Geography类型的点。数据库和c#都有对象的创建方式。同理 线、面 都分为这两种类型
空间数据类型
就是说的上面的点、线、面 当然还有更多类型。NetTopologySuite库提供了相应的类型来表示。sqlserver中也有相应的类型,但是sqlserver存储空间对象的字段的类型只分为Geography和Geometry,只是在插入值的时候会创建不同的对象
空间引用标识符 (SRID)
文档的说明看不太懂,反正对我们的限制就是 若我们使用Geography类型的空间对象,那么必须为每个空间对象设置SRID,对多个空间进行操作(比如看距离)时,这些空间对象的SRID必须一样。
感觉就像是有多个地球,每个地球有一个编号。同一个点(经纬度)在不同的地球(SRID)中其实位置不一样。不晓得这样理解对不。
在当前需求中反正写死4326,文档中经常用这个。
各种函数
实例方法:一个空间对象就是一个实例。在sql语句中可以实例化一个空间对象,数据表那个存储空间对象的单元格中存储的就是一个具体的空间对象实例
静态方法:不属于空间对象实例的,通过字符串创建空间对象,这个方法放实例上不合适
其实跟c#中的实例和静态一个意思
OGC:应该是个什么标准,定义了空间数据的通用操作,当然分为实例OGC方法和静态OGC方法
微软对标准进行了扩展,实例和静态都有扩展
原始SQL和EFCore实现
efcore不熟 又是第一次用空间数据,所以没用efcore来实现,本身用的abp 默认是用的efcore,用这个方式本来应该更方便。efcore中使用空间数据
原始sql就简单了。

没有用文档中的空间索引。也没有直接存储空间对象,而是查询时构建
烂尾....
sqlserver空间数据 + c# 实现查询附近的设备的更多相关文章
- 【SqlServer系列】子查询
1 概述 1.1 已发布[SqlServer系列]文章 [SqlServer系列]SQLSERVER安装教程 [SqlServer系列]数据库三大范式 [SqlServer系列]表单查询 [Sq ...
- 【转载】C#常用数据库Sqlserver通过SQL语句查询数据库以及表的大小
在Sqlserver数据库中,一般我们查看数据库的大小可以通过查找到数据库文件来查看,但如果要查找数据表Table的大小的话,则不可通过此方法,在Sqlserver数据库中,提供了相应的SQL语句来查 ...
- OpenCL 查询平台和设备
▶ 查询平台和设备的代码以结果,放在这里方便以后逐渐扩充和查询(没有营养) #include <stdio.h> #include <stdlib.h> #include &l ...
- PowerDesigner创建表 拷贝创建表语句 SQLSERVER创建数据库 使用查询 创建表 并且添加数据
PowerDesigner创建表 : 1.双击打开PowerDesigner 2.双击打开Create model 3左键点击Model types,再点击Physical Data m ...
- SQLServer数据库之连接查询
SQLServer数据库之连接查询 表的连接查询的几种方法介绍: inner join on内连接,left join on 左连接 , rigth join on 右连接, full join on ...
- c#程序如何从海康ipserver查询获取DVR设备ip地址
海康威视提供的ipserver可以记录DVR设备的IP地址,并提供一个7071的端口给客户端查询用,我们在c#程序中可以用海康SDK包中的NET_DVR_GetDVRIPByResolveSvr函数来 ...
- 关于SQLSERVER中用SQL语句查询的一些个人理解
作为一个编程菜鸟说真的很难有什么见解,也就是写给一些刚学习编程的人,希望能给他们一些帮助吧! SQLSERVER作为刚开始入门学习的数据库,SQL语句也并不算太难!说白了也就是建库,建表,建约束,对数 ...
- SqlServer性能优化 即席查询(十三)
执行计划,查询类别: 1.即席查询 2.预定义查询 select c.EnglishProductCategoryName,p.EnglishProductName,p.Color,p.Siz ...
- Java如何连接SQLServer,并实现查询、修改、删除方法
场景:A:在UI自动化时,删除数据时候,在界面UI提示“该XX已被使用,无法删除”. 这时候我们有需要做数据初始化的操作,需要把历史数据做删除,来确脚本运行的重复执行,和稳定性质. B: 在做新增操作 ...
- sqlserver 2005范例代码查询辞典文摘
第1章 select 1.显示指定想要获取的列要比使用select *更好 2.where not m.MemberCode = 1000 3.select * into aaa from Membe ...
随机推荐
- CUDA编程学习 (2)——CUDA并行性模型
1. 基于 kernel 的 SPMD 并行编程 1.1 向量加法 kernel(device 代码) // Device Code // Compute vector sum C = A + B / ...
- 23.Kubernetes中的CRI
Kubernetes中的CRI 前言 Kubernetes 节点的底层由一个叫做容器运行时的软件进行支撑,它主要负责启停容器. Docker 是目前最广为人知的容器运行时软件,但是它并非唯一.在这几年 ...
- 一文搞懂 ARM 64 系列: PACISB
1 PAC AMR64提供了PAC(Pointer Authentication Code)机制. 所谓PAC,简单来说就是使用存储在芯片硬件上的「密钥」,一个「上下文」,与「指针地址」进行加密计算, ...
- ABP 接口访问变慢,缓存清理,请求超时
发布后过一个小时或者不久访问过慢 第一次访问慢,第二次访问变快 总结 发布后IIS 访问 过慢的原因考虑,IIS回收.缓存清理.去host项目里面配置缓存过期时间再去试验
- 鸿蒙NEXT开发案例:计数器
[引言](完整代码在最后面) 本文将通过一个简单的计数器应用案例,介绍如何利用鸿蒙NEXT的特性开发高效.美观的应用程序.我们将涵盖计数器的基本功能实现.用户界面设计.数据持久化及动画效果的添加. [ ...
- 关于免费笔记软件Obsidian和免费同步,长文,保存观看
前言 这段可以略过 最早使用的笔记软件(应该说是网页摘录软件)是网文快捕 CyberArticle ,但不停换电脑后当年保存的资料基本都遗失了,那可是我翻阅众多涩涩网站的精华文章. 后来网文快捕推出了 ...
- TP5的项目能正常返回数据,但是状态码是500
翻出来以前一个很老的TP5项目,忘记是什么功能系统了,就本地启动了一下,发现返回状态码500,开始以为是index.php被我隐藏后rewrite导致的,后来搜索了一下,发现大家也有这个问题,然后看到 ...
- MySQL 主从复制之多线程复制
目录 一.MySQL 多线程复制的背景 二.MySQL 5.5 主从复制 1.原理 2.部署主从复制 2.1.主节点安装配置MySQL 5.5 2.2.从节点安装配置MySQL 5.5 3.检查主从库 ...
- UML 基础:类图
这是关于统一建模语言.即UML 里采用的基本图的一系列文章的一部分.在我 先前关于序列图的文章 里,我把重点从 UML 1.4 版,转移到 OMG的采用UML 2.0版草案规范(又称为UML 2).在 ...
- javascript 实现参数重载
1.概要 在java中,同一个函数签名,比如 getUser,我们可以根据参数的不同,调用不同功能的方法.这也就是参数重载,如何在javascript也实现参数重载呢? 2.实现方法 function ...