http://dev.mysql.com/doc/refman/5.7/en/gis-data-formats.html

http://mysqlserverteam.com/mysql-5-7-and-gis-an-example/

最好的Spatial Database(空间数据库)当然是Oracle家的,可惜没用过。最好的开源的Spatial Database一般公认是PostGIS,以前用过一阵子,安装特别麻烦,不过各种功能很齐全。前段时间尝试了一下MySQL的spatial extensions,下面记录了一些使用心得:

1. MySQL Spatial Extensions(后面简称MySQL Spatial)功能不够完全。至少和PostGIS相比是这样的,它只支持了openGIS(一个标准)的一个子集,包涵有限的几种空间数据类型(比如Point,LineString,Polygon等),支持的函数也很少,比如,连计算两个点的distance函数都没有...
2. MySQL Spatial的安装配置非常的简单。其实,它根本不需要安装。默认的MySQL配置就能够使用这些空间数据类型。这和PostGIS很不一样,PostGIS是需要在PostgreSQL上再安装一个扩展包。
3. 不同的存储引擎有差别。MyISAM和InnoDB都支持spatial extensions,但差别在于:如果使用MyISAM,可以建立spatial index,而InnoDB是不支持的。这点差别在某些场景下很关键,后面会再详细说说spatial index。
4. POINT的使用。点是最基本也是最常用的一种空间数据类型。MySQL Spatial中用POINT表示点,比如,可以创建一个table:

mysql 5.7

CREATE TABLE address (address CHAR(80) NOT NULL,address_loc POINT NOT NULL,PRIMARY KEY(address),SPATIAL KEY(address_loc)
);

show craate table addressCREATE TABLE `address` (`address` char(80) NOT NULL,`address_loc` point NOT NULL,PRIMARY KEY (`address`),SPATIAL KEY `address_loc` (`address_loc`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8'

其中,address_loc就是一个point类型,说明address_loc是一个点。

插入一个点:

INSERT INTO address VALUES('Foobar street 12', GeomFromText('POINT(2671 2500)'));
INSERT INTO address VALUES('Foobar street 13', ST_GEOMFROMTEXT ('POINT(2670 2500)'));

读取一个点:

select  AsText(address_loc)  from address;

# AsText(address_loc)
'POINT(2671 2500)'
'POINT(2670 2500)'

分离点X,Y

set @p = GeomFromText('POINT(11 0)');
select x(@p), y(@p);

# x(@p) y(@p)
11     0

The OpenGIS Geometry Model

The Geometry Class HierarchyGeometry Class
Point Class
Curve Class
LineString Class
Surface Class
Polygon Class
GeometryCollection Class
MultiPoint Class
MultiCurve Class
MultiLineString Class
MultiSurface Class
MultiPolygon Class

Supported Spatial Data Formats

Two standard spatial data formats are used to represent geometry objects in queries:Well-Known Text (WKT) formatWell-Known Binary (WKB) format

mysql> SELECT ST_X(Point(15, 20));
+---------------------+
| ST_X(Point(15, 20)) |
+---------------------+
|                  15 |
+---------------------+
1 row in set (0.00 sec)

mysql> SELECT ST_Y(Point(15, 20));
+---------------------+
| ST_Y(Point(15, 20)) |
+---------------------+
|                  20 |
+---------------------+
1 row in set (0.00 sec)

Fetching Spatial Data

Geometry values stored in a table can be fetched in internal format. You can also convert them to WKT or WKB format.Fetching spatial data in internal format:Fetching geometry values using internal format can be useful in table-to-table transfers:CREATE TABLE geom2 (g GEOMETRY) SELECT g FROM geom;
Fetching spatial data in WKT format:The ST_AsText() function converts a geometry from internal format to a WKT string.SELECT ST_AsText(g) FROM geom;
Fetching spatial data in WKB format:The ST_AsBinary() function converts a geometry from internal format to a BLOB containing the WKB value.SELECT ST_AsBinary(g) FROM geom;

CREATE TABLE geom (g GEOMETRY);
insert into geom select point(1,2);
SELECT ST_AsText(g) FROM geom;
SELECT ST_AsBinary(g) FROM geom;

Populating Spatial Columns

After you have created spatial columns, you can populate them with spatial data.Values should be stored in internal geometry format, but you can convert them to that format from either Well-Known Text (WKT)or Well-Known Binary (WKB) format. The following examples demonstrate how to insert geometry values into a table by converting WKT values to internal geometry format:Perform the conversion directly in the INSERT statement:

INSERT INTO geom VALUES (ST_GeomFromText('POINT(1 1)'));SET @g = 'POINT(1 1)';
INSERT INTO geom VALUES (ST_GeomFromText(@g));
Perform the conversion prior to the INSERT:SET @g = ST_GeomFromText('POINT(1 1)');
INSERT INTO geom VALUES (@g);
The following examples insert more complex geometries into the table:SET @g = 'LINESTRING(0 0,1 1,2 2)';
INSERT INTO geom VALUES (ST_GeomFromText(@g));SET @g = 'POLYGON((0 0,10 0,10 10,0 10,0 0),(5 5,7 5,7 7,5 7, 5 5))';
INSERT INTO geom VALUES (ST_GeomFromText(@g));SET @g =
'GEOMETRYCOLLECTION(POINT(1 1),LINESTRING(0 0,1 1,2 2,3 3,4 4))';
INSERT INTO geom VALUES (ST_GeomFromText(@g));
The preceding examples use ST_GeomFromText() to create geometry values. You can also use type-specific functions:SET @g = 'POINT(1 1)';
INSERT INTO geom VALUES (ST_PointFromText(@g));SET @g = 'LINESTRING(0 0,1 1,2 2)';
INSERT INTO geom VALUES (ST_LineStringFromText(@g));SET @g = 'POLYGON((0 0,10 0,10 10,0 10,0 0),(5 5,7 5,7 7,5 7, 5 5))';
INSERT INTO geom VALUES (ST_PolygonFromText(@g));SET @g =
'GEOMETRYCOLLECTION(POINT(1 1),LINESTRING(0 0,1 1,2 2,3 3,4 4))';
INSERT INTO geom VALUES (ST_GeomCollFromText(@g));
A client application program that wants to use WKB representations of geometry values is responsible for sending correctly formed WKB in queries to the server. There are several ways to satisfy this requirement. For example:Inserting a POINT(1 1) value with hex literal syntax:mysql> INSERT INTO geom VALUES-> (ST_GeomFromWKB(0x0101000000000000000000F03F000000000000F03F));
An ODBC application can send a WKB representation, binding it to a placeholder using an argument of BLOB type:INSERT INTO geom VALUES (ST_GeomFromWKB(?))
Other programming interfaces may support a similar placeholder mechanism.

一个比较麻烦的问题是,如何计算两个POINT的距离?之前说过了,MySQL Spatial不提供distance这个函数。官方指南的做法是这样的:
GLength(LineStringFromWKB(LineString(point1, point2)))
这条语句大概的意思是用两个点产生一个LineString的类型,然后调用GLength得到line的长度。
这么做,也对也不对。
对是因为它确实计算的是距离,但是,这种方法计算的是欧式空间的距离。或者简单的说,它计算的是直线距离。如果两个点是地理坐标,比如point(116.34, 39.28),想计算地理位置的距离,那么这样做肯定就不对了。正确的做法应该是使用专门计算地理位置的公式。

5. MySQL Spatial Index的使用。使用这样的语句:

ALTER TABLE address ADD SPATIAL INDEX(address_loc); 

可以在空间数据类型上创建一个spatial index,这个功能只有MyISAM才支持。Index的本质实际上是一个R-TREE,这也是最常用来作为多维数据索引的数据结构。
那么,该如何使用这个index?

举例来说,假设需要查找某个矩形区域内所有的点,一种方法是这样:
select * from address where (X(address_loc) > 116.3952) AND (X(address_loc) < 116.4052) AND (Y(address_loc) > 39.8603) AND (Y(address_loc) < 39.8703);

假设我们已经在address_loc这个column上创建了spatial index,所以上述的查询应该很快。不幸的是,这不是事实。上述的查询会扫描table内的所有数据,挨个进行计算,建立的index完全不起作用。
正确的做法是,在查询中使用一些内建的和spatial有关的函数,只有这些函数能够有效的利用到index。比如,正确的查询应该是:
select AsText(address_loc) from address where MBRContains(GeomFromText(Polygon((115.3073 40.3821, 115.3173 40.3821, 115.3173 40.4021, 115.3073 40.4021, 115.3073 40.3821))),address_loc); 
这里用到了函数MBRContains,用于判断一个point是否在指定的polygon内部。这个函数就能够很好的使用之前创建的spatial index。可以做个试验,比较之前两个查询的处理时间,你会发现,后者的速度要快很多。

总的来说,如果只需要做一些简单的GIS或者LBS的应用,MySQL提供的spatial extensions能够满足。但如果需要的功能更复杂一些,MySQL spatial extensions提供的功能可能就不够用了,需要在MySQL之上自己实现更多的逻辑,或者换成PostGIS。

转载于:https://www.cnblogs.com/zengkefu/p/5684294.html

MySQL Spatial Extensions 地理信息相关推荐

  1. LeetCode MySQL 618. 学生地理信息报告(row_number)

    文章目录 1. 题目 2. 解题 1. 题目 一所美国大学有来自亚洲.欧洲和美洲的学生,他们的地理信息存放在如下 student 表中. | name | continent | |--------| ...

  2. MySQL Spatial Analysis Functions(空间计算方法)

    参考: https://dev.mysql.com/doc/refman/8.0/en/spatial-analysis-functions.html

  3. MySQL Spatial Data Types

    空间 参考: https://dev.mysql.com/doc/refman/8.0/en/spatial-types.html

  4. mysql空间扩展 VS PostGIS

    http://www.cnblogs.com/LBSer/p/3629149.html 功能 Mysql spatial extension  PostGIS 空间索引 仅MyISAM支持R树索引,I ...

  5. mysql gis vs postgis_mysql空间扩展VSPostGIS

    功能 Mysql spatial extension PostGIS 空间索引 仅MyISAM支持R树索引,InnoDB不支持 GIST树索引(R树的变种) 支持的空间类型 仅二维数据 二维.三维以及 ...

  6. 结合MongoDB开发LBS应用

    http://www.cnblogs.com/jifeng/p/4356052.html 然后列举一下需求: 1.实时性要高,有频繁的更新和读取 2.可按距离排序支持分页 3.支持多条件筛选(一个经纬 ...

  7. 结合MongoDB开发LBS应用(mongodb geo)

    简介 随着近几年各类移动终端的迅速普及,基于地理位置的服务(LBS)和相关应用也越来越多,而支撑这些应用的最基础技术之一,就是基于地理位置信息的处理.我所在的项目也正从事相关系统的开发,我们使用的是S ...

  8. 详解基于MongoDB的地理位置查询,结合Symfony2演示

    简介 随着近几年各类移动终端的迅速普及,基于地理位置的服务(LBS)和相关应用也越来越多,而支撑这些应用的最基础技术之一,就是基于地理位置信息的处理.我所在的项目也正从事相关系统的开发,我们使用的是S ...

  9. 结合MongoDB开发LBS应用(转)

    原文链接:结合MongoDB开发LBS应用 简介 随着近几年各类移动终端的迅速普及,基于地理位置的服务(LBS)和相关应用也越来越多,而支撑这些应用的最基础技术之一,就是基于地理位置信息的处理.我所在 ...

最新文章

  1. python数据库操作框架_python bottle 框架操作数据库
  2. DIV固定宽度和动态拉伸混合水平排列
  3. Python数模笔记-Sklearn (1)介绍
  4. WPF——创建可观察的枚举器
  5. kafka使用_Kafka 消费者的使用和原理
  6. 开源数据库再创里程碑,PingCAP 获 2.7 亿美元融资
  7. mysql中如何将一个表中的部分记录合并,mysql - 如何从一个表中获取所有产品并从另一个包含多行的表中合并一行? - SO中文参考 - www.soinside.com...
  8. eXeScope的应用
  9. C# ASCII码字符转换
  10. 推荐几款网页截图工具可以全屏截图,也可对图片编辑
  11. 小程序之仿小米商城Lite
  12. ps图层转css3代码,CSS3Ps:ps图层转CSS3代码之神器
  13. 5.Python格式化输出
  14. 干掉Session?这个跨域认证解决方案真的优雅
  15. Amoeba for Aladdin
  16. Oracle 参数文件(spfile和pfile)
  17. 首次曝光!唯一全域最高等级背后的阿里云云原生安全全景图
  18. 用shell手撸容器实现批量用openssl签证书
  19. 两种微型水泵介绍——微型电磁泵和微型隔膜泵
  20. 2022年京东NLP实习面试题7道

热门文章

  1. Spring mvc @SessionAttribute
  2. python os.system
  3. vscode extension
  4. 图解TCPIP-传输层 TCP
  5. Vue.js 入门案例
  6. python中如何导入图片,Unreal中的python如何导入图片资源到引擎
  7. mysql指令按顺序排列_MySQL 排序 | 菜鸟教程
  8. vcsa上RVC查看vsan状态的命令
  9. VMware vSphere 6.7配置最大更改
  10. Docker学习总结(17)——学会使用Dockerfile