Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL空间简化几何体_Mysql_Geospatial - Fatal编程技术网

MySQL空间简化几何体

MySQL空间简化几何体,mysql,geospatial,Mysql,Geospatial,我正在尝试创建一个包含大型多边形数据集的web地图。为了提高性能,我希望缩小时减少多边形细节 MySQL能够将多边形和其他几何图形简化为查询的一部分吗?编辑:正如已经指出的,自5.7以来,MySQL确实支持ST_simplify 恐怕MySQL spatial中没有simplify函数。我在五年前提交了这个文件,你可以看到,从那时起,它就没有受到关注 您有许多选项,这取决于您是想一次性完成,还是有动态数据 1) 。使用编写一个快速且脏的函数来访问点,只取第五个点,例如,创建一个表示简化几何体的W

我正在尝试创建一个包含大型多边形数据集的web地图。为了提高性能,我希望缩小时减少多边形细节

MySQL能够将多边形和其他几何图形简化为查询的一部分吗?

编辑:正如已经指出的,自5.7以来,MySQL确实支持ST_simplify

恐怕MySQL spatial中没有simplify函数。我在五年前提交了这个文件,你可以看到,从那时起,它就没有受到关注

您有许多选项,这取决于您是想一次性完成,还是有动态数据

1) 。使用编写一个快速且脏的函数来访问点,只取第五个点,例如,创建一个表示简化几何体的WKT字符串,然后使用GeomFromText函数重新创建几何体

2) 。使用AsText(geom)输出到csv,将多边形转储为WKT。使用COPY命令导入Postgres/Postgis(相当于LOAD DATA infle),并使用那里的函数,然后反转过程将其带回MySQL

3) 。使用转储为shp格式,然后使用类似于简化格式的工具,输出为shp,然后使用ogr2ogr再次导入。Mapshaper很不错,因为您可以了解算法的工作原理,并且可以使用它来实现您自己的算法,而不是选项1

还有其他选择,例如如果您使用的是Java服务器端,则使用,但我希望这能让您了解如何继续


很抱歉,最初的答案是否定的。我在几年前经历了这一过程,最终永久性地切换到Postgres/Postgis,因为它更适合空间工作。

MySQL 5.7包含用于简化几何图形的
ST_Simplify
函数

发件人:

ST\u简化(g,最大距离)

使用Douglas Peucker算法简化几何体,并返回相同类型的简化值,如果任何参数为NULL,则返回NULL


与5.6相比,MySQL 5.7对空间功能进行了巨大的改进,从5.7.9开始,它现在处于通用状态。

我有一个用例,我想使用
ST_Simplify
,但代码必须在MySQL 5.6上运行(它没有)。因此,我制定了一个解决方案,就像在另一个答案中所建议的那样

不幸的是,MySQL不提供任何聚合,因此您可以通过逐步向其添加点来创建几何体(即,没有
ST_AddPoint
或类似内容)。编写几何图形的唯一方法是逐步将其构建为WKT字符串,然后最终将完成的字符串转换为几何图形

下面是一个存储函数的示例,该函数接受一个
多行字符串
,并通过仅保留每个第n点来简化其中的每个
行字符串
,确保始终保留起点和终点。这是通过循环多行线中的线串来完成的,然后循环每个线串的点(根据需要跳过),并将地块累积到WKT字符串中,最后使用
ST_GeomCollFromText
将地块转换为几何图形

--geometryCollection:简化多行集合
--跳过:每两点之间要删除的点数
创建函数'sp_CustomSimplify`(gc geometrycollection,skip INT)返回geometrycollection
开始
声明i,j,numlinestring,numPoints INT;
声明ls行字符串;
申报pt、lastPt点;
声明ls行字符串;
宣布最后一点;
声明txt VARCHAR(20000);
声明数字INT;
设置数字=4;
--开始WKT字符串:
SET txt='多行字符串(';
--循环几何图形中的线串(这是多线串)
设置i=1;
设置numLineStrings=ST_NumGeometries(gc);
loopLineStrings:LOOP
如果i>numlinestring,则保留loopLineStrings;如果结束;
设置ls=ST_GeometryN(gc,i);
--将第一个点添加到LineString:
设置pt=ST_起点(ls);
设置txt=CONCAT(txt,,(,TRUNCATE(ST_X,pt,digits),“”,TRUNCATE(ST_Y,pt,digits));
--对于每个线串,循环通过点,跳过
--点,将它们添加到运行的文本字符串中:
设置numPoints=ST_numPoints(ls);
设置j=跳过;
循环点:循环
如果j>numPoints,则留下循环点;如果结束,则结束;
设置pt=ST_点n(ls,j);
--对于每个点,将其添加到文本字符串中:
设置txt=CONCAT(txt,,,,TRUNCATE(ST_X,pt,digits),“”,TRUNCATE(ST_Y,pt,digits));
设置j=j+跳过;
末端回路回路点;
--将最后一点添加到LineString:
设置lastPt=ST_端点(ls);
设置txt=CONCAT(txt,,),TRUNCATE(ST_X(lastPt),digits),“”,TRUNCATE(ST_Y(lastPt),digits));
--关闭行字符串WKT:
设置txt=CONCAT(txt“)”);
如果(i

(通过将位提取到单独的函数中,这可能会漂亮得多。)

谢谢。我还没有尝试,但我不认为这真的会有什么关系,如果我只是采取每5点,因为分辨率将增加时,映射放大,使它更清晰。然而,我正在考虑将我的数据存储在PostGIS数据库中。不过现在,我还是坚持选择1。谢谢,不客气。我在MySQL上工作了几年(是一名测试人员,负责测试正确的MBR功能,而不仅仅是几年前引入的MBR功能)。最后,我因缺乏进展而感到沮丧(公平地说,优先事项在别处),于是转向了Postgis/Postgres。无论是在空间方面还是在非空间方面,这都是一次绝对积极的体验,值得一试。