home > GIS > GIS Science >

空間數據庫-msyql空間數據大綱

author:zhoulujun    hits:

空間數據庫,提到空間數據庫,首先想到的一定是Esri公司的ArcSDE(SDE即Spatial Database Engine,空間數據庫引擎),ArcSDE主要支持的數

空間數據庫,

提到空間數據庫,首先想到的一定是Esri公司的ArcSDE(SDE即Spatial Database Engine,空間數據庫引擎),ArcSDE主要支持的數據庫包括Oracle,SQL Server,IBM DB2。功能好,性能好,但是收費

ArcGIS 空間數據庫官方學習資料非常齊全,網上資料也很多

開源MySql,PostgreSQL等數據庫才是主流——反正程序員不啥錢


空間數據庫支持類型說嘛

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,可以放入點、線、面。

空間數據操作

使用示例

# 創建表
CREATE DATABASE geodatabase;
USE geodatabase;
DROP TABLE IF EXISTS test;

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;

空間數據插入

用通行的GEOMFROMTEXT函數實現WKT到數據庫內部幾何格式的轉換。而GEOMFROMWKB函數用于轉換WKB。

# 插入測試數據
INSERT INTO points VALUES (1,'天安門',POINT(116.397389,39.908149));
INSERT INTO points VALUES (2,'頤和園',POINT(116.273106,39.992634));

等價對比

INSERT INTO `points` 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))'));

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))'))

空間數據查詢

用以下SQL從數據表中獲得空間數據

SELECT id,name,ASTEXT(pnt),ASTEXT(line),ASTEXT(pgn) from `test`;
STEXT函數的功能與GEOMFROMTEXT的功能恰好相反,就是將數據從內部格式轉換為WKT;相應的ASBINARY可以轉換為WKB。

# 定義多邊形
SET @rect = CONCAT('POLYGON((116.373871 39.915786,116.417645 39.916444,116.41816 39.900841,116.374214 39.900182,116.373871 39.915786))');
# 使用變量
select name,X(location),Y(location),Astext(location) from points where INTERSECTS( location, GEOMFROMTEXT(@rect) ) ;

常用查詢語句案列

st_distance兩點之間地理距離: 求兩點之間的直線距離

select st_distance(ST_GEOMFROMTEXT("POINT(0 0)"),p.pot),p.`name` from Points p;

AREA計算面積

select AREA(tp.pgn),tp.`name `FROM `t_polygon` tp

ST_Intersects 圖形是否有交叉重疊:

SELECT ST_Intersects(tp.pgn,ST_GEOMFROMTEXT("POLYGON((0 0,2 0,2 2,0 2,0 0))")),tp.`name` FROM `Points` tp;

查找指定矩形范圍內的點:

SET @bbox = 'POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))';
SELECT name, AsText(location) FROM Points WHERE Intersects( location, GeomFromText(@bbox) );


查找圓形區域內的點

這一步介紹如何查詢圓形區域(通常用一個中心點和半徑來表示)內的幾何對象。

您首先想到的語句可能是:

SET @point = 'POINT(10 10)';

SET @radius = 20;

SELECT name, AsText(location) FROM Points WHERE Distance(location, GeomFromText(@point)) < @radius;

但是這條語句運行會出錯,因為Distance函數還沒有實現。MySql空間擴展文檔說明中已經說明他們只實現了OpenGis標準的一部分。

一個替代的方式是使用intersect函數。

MySql空間擴展文檔中已經指明各種幾何對象可以使用intersect函數來判斷幾何對象是否和一個矩形相交。

這樣在取得近似范圍后我們可以再使用距離估算來過濾出正確的結果。

SET @center = GeomFromText('POINT(10 10)');

SET @radius = 30;

SET @bbox = CONCAT('POLYGON((',X(@center) - @radius, ' ', Y(@center) - @radius, ',',X(@center) + @radius, ' ', Y(@center) - @radius, ',',

X(@center) + @radius, ' ', Y(@center) + @radius, ',',X(@center) - @radius, ' ', Y(@center) + @radius, ',',X(@center) - @radius, ' ', Y(@center) - @radius, '))');

MBRWithin(g1,g2)

現在我需要的功能是查找一輛車在某一段時間內是否在一段區域內經過,用點來說明的話,就是一個空間坐標點在一個特定時間段內是否包含在一個特定的矩形區域內。下面這個函數應該能達到這個功能:

SELECT AsText(pnt) FROM `gis` WHERE MBRWithin(pnt,GeomFromText('Polygon(1 1,0 30,30 30,30 0,1 )'))



參考資料:

MySQL空間數據庫 https://blog.csdn.net/gaojingyuan/article/details/79004990

Mysql gis 空間數據庫功能詳解學習 https://blog.csdn.net/chaiqi/article/details/23099407

MySql GIS 空間數據庫使用體驗 https://blog.csdn.net/long535/article/details/75714781




轉載本站文章《空間數據庫-msyql空間數據大綱》, 請注明出處:http://www.qsexmk.tw/html/GIS/GIS-Science/8162.html