空间数据库概述

空间数据库存储的不是单一性质的数据,而是涵盖了几乎所有与地理相关的数据类型,这些数据类型主要可以分为 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));

========

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。

========