下文爲收集資料整理後,並測試後結果
當前只有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。
參考鏈接1:https://blog.csdn.net/chaiqi/article/details/23099407
參考鏈接2:https://blog.csdn.net/long535/article/details/75714781