开源空间数据库学习
空間數據庫概述
空間數據庫存儲的不是單一性質的數據,而是涵蓋了幾乎所有與地理相關的數據類型,這些數據類型主要可以分為 3 類:
(1)屬性數據:與通用數據庫基本一致,主要用來描述地學現象的各種屬性,一般包括數字、文本、日期類型。
(2)圖形圖像數據:與通用數據庫不同,空間數據庫系統中大量的數據借助于圖形圖像來描述。
(3)空間關系數據:存儲拓撲關系的數據,通常與圖形數據是合二為一的。
空間數據庫還具有以下特點。
? ? 屬性數據和空間數據聯合管理。
? ? 空間實體的屬性數據和空間數據可隨時間而發生相應變化。
? ? 空間數據的數據項長度可變,包含一個或多個對象,需要嵌套記錄。
? ? 一種地物類型對應一個屬性數據表文件。多種地物類型共用一個屬性數據表文件。
? ? 具有空間多尺度性和時間多尺度性。
Esri公司的ArcSDE,SDE即Spatial Database Engine,空間數據庫引擎。ArcSDE主要支持的數據庫包括Oracle,SQL Server,IBM DB2。
https://baike.baidu.com/item/空間數據庫/8275107?fr=aladdin
2 MySQL空間數據庫
PostgreSQL由于具備PostGIS擴展而在開源GIS中有廣泛地應用,可視化工具包括pgAdmin、Quantum GIS(類似ArcGIS Desktop)。?
從MySQL4.1開始,也對空間數據庫進行了支持。
1) 常用使用場景?
矩形查詢:
? ? 通過API獲取顯示屏4角的坐標點,順序連接生成矩形,空間數據庫提供查詢矩形范圍內坐標功能。?
圓型查詢:?
? ? 根據當前所在位置為中心點,根據給定的里程數為半徑生成圓形,搜索圓形范圍內的數據。
2) MySql支持的類型?
點 POINT(15 20)?
線 LINESTRING(0 0, 10 10, 20 25, 50 60)?
面 POLYGON((0 0,10 0,10 10,0 10,0 0),(5 5,7 5,7 7,5 7, 5 5))?
多個點 MULTIPOINT(0 0, 20 20, 60 60)?
多個線 MULTILINESTRING((10 10, 20 20), (15 15, 30 15))?
多個面 MULTIPOLYGON(((0 0,10 0,10 10,0 10,0 0)),((5 5,7 5,7 7,5 7, 5 5)))?
集合 GEOMETRYCOLLECTION(POINT(10 10), POINT(30 30), LINESTRING(15 15, 20 20)),簡稱GEOMETRY,可以放入點、線、面。
3) 測試?
以存儲坐標點為例
DROP TABLE IF EXISTS points;
CREATE TABLE `points` (
? `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
? `name` varchar(20) NOT NULL DEFAULT '',
? `location` point NOT NULL,
? PRIMARY KEY (`id`),
? SPATIAL KEY `sp_index` (`location`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
插入測試數據
# 天安門
INSERT INTO points VALUES (1,'aaaa',POINT(116.397389,39.908149));
https://blog.csdn.net/gaojingyuan/article/details/79004990
========
Mysql gis 空間數據庫功能學習
當前只有MyISAM引擎的數據表支持地理空間數據的存儲
建表:
CREATE DATABASE geodatabase;
USE geodatabase;
CREATE TABLE test(
? id INT PRIMARY KEY AUTO_INCREMENT,
? name VARCHAR(128) NOT NULL,
? pnt POINT,
? line LINESTRING,
? pgn POLYGON
)ENGINE=MyISAM;
添加空間列,在geom表里添加可以存儲point類型數據
ALTER TABLE geom ADD pt POINT;
用以下SQL插入一條空間數據
INSERT INTO `test` VALUES(
null,
'a test string',
POINTFROMTEXT('POINT(15 20)'),
LINESTRINGFROMTEXT('LINESTRING(0 0, 10 10, 20 25, 50 60)'),
POLYGONFROMTEXT('POLYGON((0 0,10 0,10 10,0 10,0 0),(5 5,7 5,7 7,5 7, 5 5))')
);
這里也可以用通行的GEOMFROMTEXT函數實現WKT到數據庫內部幾何格式的轉換。而GEOMFROMWKB函數用于轉換WKB。
INSERT INTO `gis` VALUES(
null,
'a test strin222g',
GEOMFROMTEXT('POINT(15 20)'),
GEOMFROMTEXT('LINESTRING(0 0, 10 10, 20 25, 50 60)'),
GEOMFROMTEXT('POLYGON((0 0,10 0,10 10,0 10,0 0),(5 5,7 5,7 7,5 7, 5 5))')
)
這個函數很有用:Envelope
Envelope(g)?
返回幾何值g的最小邊界矩形(MBR)。結果以Polygon值的形式返回。
多邊形(polygon)是由邊界框的頂點定義的:
POLYGON((MINX MINY, MAXX MINY, MAXX MAXY, MINX MAXY, MINX MINY))
mysql> SELECT AsText(Envelope(GeomFromText('LineString(1 1,2 2)')));
+-------------------------------------------------------+
| AsText(Envelope(GeomFromText('LineString(1 1,2 2)'))) |
+-------------------------------------------------------+
| POLYGON((1 1,2 1,2 2,1 2,1 1)) ? ? ? ? ? ? ? ? ? ? ? ?|
+-------------------------------------------------------+
或者多個點面集合:
SELECT AsText( Envelope( GeomFromText('GeometryCollection(Point(10 2),Point(9 9),LineString(2 2, 3 30),LineString(200 200, 3 30),Polygon((400 300,10 0,10 10,0 10,400 300)),Point(100 100))' ) ) ) ;
用以下SQL從數據表中獲得空間數據
SELECT id,name,ASTEXT(pnt),ASTEXT(line),ASTEXT(pgn) from `test`;
ASTEXT函數的功能與GEOMFROMTEXT的功能恰好相反,就是將數據從內部格式轉換為WKT;相應的ASBINARY可以轉換為WKB。
https://blog.csdn.net/weixin_42056745/article/details/102588906
========
這些是網上看的,我還沒操作過mysql是否直接支持?POINT 等這些類型的數據類型,或者額外要安裝什么組件;
總結
- 上一篇: C++ 引用 Demo - Win32
- 下一篇: DirectX 视口学习