試用 SpatiaLite(二):進一步測試

2024-01-21 05:48

本文主要是介绍試用 SpatiaLite(二):進一步測試,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

之前試過 SpatiaLite 的基本指令,現在我會創建兩個表,一個儲存一些點,另一個儲存多邊形,然後進行操作。在點的表裡面,有兩點在富亨邨裡面,另一點則是九龍坑山。在多邊形的表裡面,我儲存了富亨邨的範圍。它們皆以平面及 WGS 84 為基準儲存。

創建點表:
spatialite> CREATE TABLE PointTable(
id INTEGER PRIMARY KEY AUTOINCREMENT,
Name TEXT NOT NULL);
spatialite> SELECT AddGeometryColumn('PointTable', 'Geometry', 4326, 'POINT', 'XY');
spatialite> SELECT CreateSpatialIndex('PointTable', 'Geometry');

加入資料:
spatialite> INSERT INTO PointTable(Name, Geometry) VALUES ("Cloudy Hill", MakePoint(114.17052,22.475837,4326));
spatialite> INSERT INTO PointTable(Name, Geometry) VALUES ("Fu Heng Sports Centre", MakePoint(114.17134, 22.45822,4326));
spatialite> INSERT INTO PointTable(Name, Geometry) VALUES ("Fu Heng Neighbourhood Community Centre", MakePoint(114.17192, 22.45978,4326));

創建多邊形表:
spatialite> CREATE TABLE PolygonTable(
id INTEGER PRIMARY KEY AUTOINCREMENT,
Name TEXT NOT NULL);
spatialite> SELECT AddGeometryColumn('PolygonTable', 'Geometry', 4326, 'POLYGON', 'XY');
spatialite> SELECT CreateSpatialIndex('PolygonTable', 'Geometry');

加入資料:
spatialite> insert into PolygonTable(Name, Geometry) VALUES ("Fu Heng Estate", ST_GeomFromText("POLYGON ((114.172035 22.456101, 114.172215 22.457397, 114.172390 22.458743, 114.173090 22.460372, 114.173073 22.460731, 114.172988 22.460920, 114.172693 22.461163, 114.172263 22.461304, 114.171984 22.461336, 114.171558 22.461314, 114.171220 22.461232, 114.170882 22.461051, 114.170536 22.460751, 114.170297 22.460357, 114.170056 22.459269, 114.170026 22.457333, 114.169745 22.456726, 114.170751 22.456232, 114.170952 22.456165, 114.172035 22.456101))" ,4326));

利用 ST_Within 選取在富亨邨內的點:
spatialite> SELECT a.id, a.Name, b.Name FROM PointTable a JOIN PolygonTable b ON ST_Within(a.Geometry, b.Geometry);
2|Fu Heng Sports Centre|Fu Heng Estate
3|Fu Heng Neighbourhood Community Centre|Fu Heng Estate

利用 ST_Within 選取在富亨邨外的點及拉一條直線:
spatialite> SELECT a.id, a.Name, AsText(ST_ShortestLine(a.Geometry, b.Geometry)) FROM PointTable a JOIN PolygonTable b ON ST_Within(a.Geometry, b.Geometry) = 0;
1|Cloudy Hill|LINESTRING(114.17052 22.475837, 114.171558 22.461314)

將富亨邨輸出為 KML:
spatialite> SELECT AsKml("Fu Heng Estate", "description", Geometry) FROM PolygonTable;
<Placemark><name>Fu Heng Estate</name><description>description</description><Polygon><outerBoundaryIs><LinearRing><coordinates>114.1720349999999,22.456101 114.1722149999999,22.457397 114.1723899999999,22.45874299999999 114.17309,22.460372 114.173073,22.46073099999999 114.172988,22.46092 114.1726929999999,22.46116299999999 114.172263,22.46130399999999 114.1719839999999,22.46133599999999 114.171558,22.461314 114.17122,22.46123199999999 114.170882,22.461051 114.1705359999999,22.46075099999999 114.170297,22.46035699999999 114.170056,22.45926899999999 114.1700259999999,22.45733299999999 114.169745,22.456726 114.1707509999999,22.456232 114.170952,22.45616499999999 114.1720349999999,22.456101</coordinates></LinearRing></outerBoundaryIs></Polygon></Placemark>

利用 Google Earth 打開:
fuheng1  
將富亨邨的經緯度數據,轉成 UTM 座標:
spatialite> SELECT AsText(ST_Transform(Geometry,32650)) FROM PolygonTable;
POLYGON((208953.438359 2486057.474384, 208974.683325 2486200.706368, 208995.517737 2486349.487494, 209071.004741 2486528.60177, 209070.004524 2486568.407811, 209061.646822 2486589.511938, 209031.777666 2486617.006648, 208987.794009 2486633.463344, 208959.131436 2486637.550767, 208915.218906 2486635.941392, 208880.242496 2486627.513759, 208845.058955 2486608.118139, 208808.802586 2486575.554312, 208783.367602 2486532.368361, 208756.274535 2486412.299078, 208749.134927 2486197.870821, 208718.928648 2486131.168617, 208821.489912 2486074.483122, 208842.048155 2486066.669576, 208953.438359 2486057.474384))

計算富亨邨的面積,以平方米為單位(先要將它轉成 UTM 計算):
spatialite> SELECT ST_Area(ST_Transform(Geometry,32650)) FROM PolygonTable;
135880.53978552

計算富亨邨的中心點:
spatialite> SELECT AsText(ST_Centroid(Geometry)) FROM PolygonTable;
POINT(114.171362 22.458814)

在 Google Earth 上標示:
fuheng2  
計算富亨邨和九龍坑山的最接近距離:
spatialite> SELECT a.Name, b.Name, ST_Distance(ST_Transform(a.Geometry,32650), ST_Transform(b.Geometry,32650)) FROM PointTable a JOIN PolygonTable b ON ST_Within(a.Geometry, b.Geometry) = 0;
Cloudy Hill|Fu Heng Estate|1612.81591309232

計算富亨邨和九龍坑山的最大距離:
spatialite> SELECT a.Name, b.Name, ST_MaxDistance(ST_Transform(a.Geometry,32650), ST_Transform(b.Geometry,32650)) FROM PointTable a JOIN PolygonTable b ON ST_Within(a.Geometry, b.Geometry) = 0;
Cloudy Hill|Fu Heng Estate|2192.47093811504

計算不同點之間的距離:
spatialite> SELECT a.Name, b.Name, ST_Distance(ST_Transform(a.Geometry,32650), ST_Transform(b.Geometry,32650)) FROM PointTable a JOIN PointTable b ON a.id != b.id;
Cloudy Hill|Fu Heng Sports Centre|1953.93589287626
Cloudy Hill|Fu Heng Neighbourhood Community Centre|1785.08117583597
Fu Heng Sports Centre|Cloudy Hill|1953.93589287626
Fu Heng Sports Centre|Fu Heng Neighbourhood Community Centre|182.891290344748
Fu Heng Neighbourhood Community Centre|Cloudy Hill|1785.08117583597
Fu Heng Neighbourhood Community Centre|Fu Heng Sports Centre|182.891290344748

計算不同點之間的角度,例如由富亨鄰里社區中心到富亨體育館的角度為 200 度:
spatialite> SELECT a.Name, b.Name, Degrees(ST_Azimuth(a.Geometry, b.Geometry)) FROM PointTable a JOIN PointTable b ON a.id != b.id;
Cloudy Hill|Fu Heng Sports Centre|177.335036974734
Cloudy Hill|Fu Heng Neighbourhood Community Centre|175.017017424819
Fu Heng Sports Centre|Cloudy Hill|357.335036974734
Fu Heng Sports Centre|Fu Heng Neighbourhood Community Centre|20.3948760820543
Fu Heng Neighbourhood Community Centre|Cloudy Hill|355.017017424819
Fu Heng Neighbourhood Community Centre|Fu Heng Sports Centre|200.394876082054

利用 R* Index,找出在 22.46N 114.17E 和 22.44N 114.18E 內的點。由於用了 R* Index,所以在大量數據時,效率會高於 ST_Within,但就只能用長方形查詢:
spatialite> SELECT id, Name FROM PointTable WHERE ROWID IN (SELECT pkid FROM idx_PointTable_Geometry WHERE pkid MATCH RTreeIntersects(114.17,22.46,114.18,22.44));
2|Fu Heng Sports Centre
3|Fu Heng Neighbourhood Community Centre

也可利用 R* Index 找出範圍內的多邊形:
spatialite> SELECT id, Name FROM PolygonTable WHERE ROWID IN (SELECT pkid FROM idx_PolygonTable_Geometry WHERE pkid MATCH RTreeIntersects(114.17,22.46,114.18,22.44));
1|Fu Heng Estate

利用長方形框起富亨邨:
spatialite> SELECT AsText(ST_Envelope(Geometry)) FROM PolygonTable WHERE id = 1;
POLYGON((114.169745 22.456101, 114.17309 22.456101, 114.17309 22.461336, 114.169745 22.461336, 114.169745 22.456101))

意義跟上一句相近:
spatialite> SELECT ST_MinX(Geometry),ST_MaxY(Geometry),ST_MaxX(Geometry),ST_MinY(Geometry) FROM PolygonTable WHERE id = 1;
114.169745|22.461336|114.17309|22.456101

利用這長方形,配合 R* Index,找出富亨邨內的點,但由於用了長方形,可能有些其他邨外的點跌入此範圍:
spatialite> SELECT a.id, a.Name FROM PointTable a LEFT JOIN PolygonTable b WHERE b.id = 1 AND a.ROWID IN (SELECT pkid FROM idx_PointTable_Geometry WHERE pkid MATCH RTreeIntersects(ST_MinX(b.Geometry),ST_MaxY(b.Geometry),ST_MaxX(b.Geometry),ST_MinY(b.Geometry)));
2|Fu Heng Sports Centre
3|Fu Heng Neighbourhood Community Centre

这篇关于試用 SpatiaLite(二):進一步測試的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/628534

相关文章

一步一步将PlantUML类图导出为自定义格式的XMI文件

一步一步将PlantUML类图导出为自定义格式的XMI文件 说明: 首次发表日期:2024-09-08PlantUML官网: https://plantuml.com/zh/PlantUML命令行文档: https://plantuml.com/zh/command-line#6a26f548831e6a8cPlantUML XMI文档: https://plantuml.com/zh/xmi

2024年高教社杯数学建模国赛最后一步——结果检验-事关最终奖项

2024年国赛已经来到了最后一天,有必要去给大家讲解一下,我们不需要过多的去关注模型的结果,因为模型的结果的分值设定项最多不到20分。但是如果大家真的非常关注的话,那有必要给大家讲解一下论文结果相关的问题。很多的论文,上至国赛优秀论文下至不获奖的论文并不是所有的论文都可以进行完整的复现求解,大部分数模论文都为存在一个灰色地带。         白色地带即认为所有的代码均可运行、公开

LiveQing视频点播流媒体RTMP推流服务功能-支持大疆等无人机RTMP推流支持OBS推流一步一步搭建RTMP视频流媒体服务示例

LiveQing支持大疆等无人机RTMP推流支持OBS推流一步一步搭建RTMP视频流媒体服务示例 1、流媒体服务搭建2、推流工具准备3、创建鉴权直播间4、获取推流地址5、配置OBS推流6、推流及播放7、获取播放地址7.1 页面查看视频源地址7.2 接口查询 8、相关问题8.1、大疆无人机推流花屏 9、RTMP推流视频直播和点播流媒体服务 1、流媒体服务搭建 Windows/Lin

Word快速重复上一步操作的三种高效方法

在日常工作、学习和生活中,我们经常需要执行一系列重复性的操作。这些操作可能简单如复制粘贴、调整图片大小,也可能复杂如编辑文档、处理数据等。为了提高效率,掌握快速重复上一步操作的方法显得尤为重要。本文将介绍三种高效的方法,帮助你在各种场景下迅速完成重复性任务。 方法1:利用“格式刷”功能 如果需要重复操作的是规范文本或段落的格式,很多人知道可以使用Word文档里的“格式刷”功能。 但点

孙宇晨:区块链领域的时代先锋,每一步引领未来趋势

​孙宇晨,这位在区块链领域崭露头角的青年企业家,凭借着敏锐的洞察力和坚定的决心,成为了数字经济时代的领航者。他的每一步,都走在技术创新的最前沿,推动着区块链技术的发展与应用,给全球经济带来了深远的影响。 从创业初期到现在,孙宇晨始终紧跟时代脉搏,勇敢地探索未知的领域。他对区块链技术的热情源于他对去中心化理念的深刻理解和认同。在区块链技术还处于初期发展阶段时,孙宇晨便看到了它将如何改变世界。区

【对线面试官】阿里面试经历,有些人走一步看一步就挂了

点击上方蓝色字体,选择“设为星标” 回复”资源“获取更多资源 这个其实说来就话长了。是小编曾经面试阿里妈妈的经历。 这次面试最终在HR面挂掉,以至于后面回忆起来,仍然是一桩美谈。 这次面试长达一个月之久,共经历了4轮技术面,1轮HR。前四轮面试过关斩将,简直开了挂一般,跟面试官正面对线,丝毫不虚。听我一一道来。 第一轮 第一面是电话面试,晚上10点半。我特么一脸问号?你们这是刚加完班吧?事实上我

JVM为什么要多一步翻译成class文件的理由之一

简单说:因为Java的想法很伟大,并不只是想给Java语言用,而是脚踏多只船,只要其他语言能翻译成class文件他也能执行 Java虚拟机(JVM)不仅限于执行Java编写的程序,还支持执行其他编译成JVM字节码(即.class文件)的语言。这种能力使得JVM成为一个多语言的平台,因为任何语言只要能编译成JVM字节码,就可以在JVM上运行。这种设计具有很大的灵活性和扩展性,允许不同编程语言

【C++】【数据结构】一步一步写平衡二叉树[AVL]

转载:有修正,原作者存在一些错误,这里进行了更正。/* 平衡二叉树(Balanced Binary Tree)是二叉查找树的一个进化体第一个引入平衡概念的二叉树。特点:对于每一个结点,它的左右子树的高度之差不能超过1,若插入或删除一个节点之后使得高度之差大于1,就要进行节点之间的旋转,将二叉树重新维持在一个平衡状态。这个方案很好的解决的了二叉查找树退化成链表的问题,把插入,查找,删除的时间复杂度

谷歌seo优化有能一步提升的方法吗?

网站优化的方法有很多,但没有一刀切的解决方案。 谷歌SEO绝对不是一项廉价的服务。任何声称能以低价实现显著效果的承诺都值得怀疑。 谷歌SEO是一项需要人力、技术和资源的工作,如果你打算自己做 最少需要一个人的年薪,还要考虑域名、服务器、网站构建、安全维护和SEO理论。 再加上外链资源的建设 这并不是一个可以通过购买廉价外链资源来解决的问题。尤其是在Fiverr上购买那些来自印度和巴基斯坦的

Java一步一步构建web系统 在IDEA下用Maven搭建多模块项目

http://www.toutiao.com/a6332937025343226114/?tt_from=mobile_qq&utm_campaign=client_share&app=explore_article&utm_source=mobile_qq&iid=5215874113&utm_medium=toutiao_ios