如何使用MySQL查找多边形地理围栏中包含的点

Publish: October 15, 2020 Category: 编程 No Comments

与其他数据库(如Postgres)相比,MySQL在地理空间方面的应用有点晚,但随着5.6和5.7版本的发布,许多新的GIS功能最终得以实现。例如,在5.7中,我们得到了:

  • ST_Distance_Sphere可计算球体上两点之间的距离。
  • InnoDB空间索引
  • GeoJSON集成,引用RFC的话,“一种基于JSON的地理空间数据交换格式。”

有很多有趣的事情我们现在可以完成使用这些新的情势。今天我将展示一个非常简单的例子,说明如何使用多边形和点进行搜索。这里的目标是回答“这一点在这个城市吗?”?”.

定义点

首先,让我们创建一个带有名称和一组坐标的“places”表。但是,我将使用一个点,而不是将纬度和经度存储为两个不同的浮动。

CREATE TABLE `places` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(256) DEFAULT NULL,
  `coordinates` point DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

阅读剩余部分...

在Laravel中使用laravel-mysql-spatial处理geometry空间类型数据

Publish: July 13, 2020 Category: 编程 No Comments

接之前一篇文章,我们使用mysql来处理geometry相关数据。用到了laravel-mysql-spatial来处理geometry数据。今天正好有时间整理了laravel-mysql-spatial完整的使用方法。机器翻译为主哈,使用通俗易懂的文字加以描述。原文在这里 https://github.com/grimzy/laravel-mysql-spatial

开始之前必须要了解的概念: SRID (空间引用识别号, 坐标系)
地球并不是平的,也不是正圆形,而是一个非标准的椭圆,在不同的经纬度位置,计算两点的距离没有一个完美的公式(即快速、有准确)。
所以坐标系应运而生,SRID是指数据的坐标系,例如: 在PostGIS中可以查到支持的SRID。查询与北京、中国有关的坐标系。
postgres=# select from spatial_ref_sys where srtext ~ 'beijing';
postgres=# select from spatial_ref_sys where srtext ~ 'china';

数据可以在不同的坐标系之间转换,在进行GIS计算时,一定要在同一个坐标系中进行。

Laravel 包可轻松使用MySQL 空间数据类型和 MySQL 空间函数。
请检查 MySQL 版本的文档。MySQL 的空间数据扩展在 MySQL 5.5 中添加,但许多空间函数在 5.6 和 5.7 中已更改。
版本

  • 1.x.x: MySQL 5.6 (也支持 MySQL 5.5, 但不是所有空间分析函数)
  • 2.x.x: MySQL 5.7
  • 3.x.x: MySQL 8.0,支持 SRID(当前分支)
    此包还适用于 MariaDB。有关兼容性,请参阅 MySQL/MariaDB空间支持矩阵。







阅读剩余部分...

MySQL地理围栏数据处理实践

Publish: April 15, 2020 Category: 编程,代码分享 1 Comment

我们本次实践的主要内容

  • 地理围栏数据构建
  • mysql 如何使用geo相关字段类型
  • 围栏算法计算

地理围栏数据构建

使用DDL创建一个数据库模式:

CREATE TABLE `geo_1` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `fence_point` point NOT NULL COMMENT '中心点',
  `fence_polygon` polygon NOT NULL COMMENT '单个围栏',
  `fence_multipolygon` multipolygon NOT NULL COMMENT '多围栏',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4

使用原生sql语句插入几条数据

INSERT INTO `geo_1`(
    `id`,
    `fence_point`,
    `fence_polygon`,
    `fence_multipolygon`
)
VALUES(
    NULL,
    GEOMFROMTEXT('POINT(117.134516 36.672215)'),
    GEOMFROMTEXT(
        'POLYGON((117.147711 36.692958,117.152174 36.664804,117.120588 36.659434,117.116297 36.678848,117.147711 36.692958))'
    ),
    GEOMFROMTEXT(
        'MULTIPOLYGON(((117.143528 36.678686,117.144215 36.676758,117.142927 36.67669,117.142412 36.677997,117.143528 36.678686)),((117.144837 36.675829,117.144794 36.674487,117.143743 36.674659,117.14385 36.675881,117.144837 36.675829)),((117.127574 36.670235,117.124227 36.668858,117.124785 36.666448,117.13075 36.667412,117.127574 36.670235)))'
    )
);

特别要注意的几点:

  • POINT类型是单个点,构建只需要一个POINT类型数据即可
  • POLYGON类型或者MULTIPOLYGON中的数据必须是首位相连,也就是第一组数据和最后一组数据是相同的,以构成一个闭合的多边形。

阅读剩余部分...

mysql bin-log日志占满磁盘问题解决

Publish: April 7, 2020 Category: 运维 No Comments

开启MySQL binlog日志的服务器,如果不设置自动清理日志,默认binlog日志一直保留着,最终导致服务器磁盘空间被binlog日志占满,导致MySQL数据库出错。

正常情况下(磁盘没有被完全占满)我们按照此情况处理即可,直接修改日志过期时间,重启服务

/etc/my.cnf  #配置文件位置

expire_logs_days = 3  #自动删除3天前的日志。默认值为0,表示从不删除。

log-bin=mysql-bin   #注释掉之后,会关闭binlog日志

binlog_format=mixed   #注释掉之后,会关闭binlog日志

:wq!  #保存退出

如果磁盘已经完全被占满,这时候mysql服务可能起不来。
需要手动删除一部分日志数据。

比如我们的日志目录在:

root@iZ8vbbdf6epai4kh5einddZ:/usr/local/mysql/var#

删掉一个比较旧的日志文件

rm mysql-bin.000051
 
然后启动服务
/etc/init.d/mysql start

再用df命令看下磁盘空间

df -h

此方法只适用于单机部署下的mysql日志清理。集群请参考其他文章。

MySql位置轨迹数据存储已经应用探索之地理位置类型分析

Publish: March 3, 2020 Category: 计算机基础 No Comments

先来了解下MySql中空间类型字段

point
数据类型:point
数据类型说明:空间点(如车站位置)
存储案例:(Binary/Image)
具体数据形式:POINT(1 1)
SQL语句 :

set @g = “POINT(1 1)”;

Insert into user (test1) values (GeomFromText(@g));

lineString
数据类型:lineString
数据类型说明: 空间线(如河流、街道)
存储案例:
具体数据形式:LINESTRING(0 0, 1 1, 2 2)
SQL语句:

set @g = “LINESTRING(0 0, 1 1, 2 2)”

insert into user (test2) values (GeomFromText(@g));











阅读剩余部分...