MySQL Spatial简化几何

时间:2014-12-09 09:54:22

标签: mysql geospatial

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

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

3 个答案:

答案 0 :(得分:3)

编辑:正如James指出的那样,自5.7以来,MySQL确实支持ST_Simplify。

我担心MySQL空间中没有简化功能。我五年前以feature request的身份提出这个问题,你可以看到它从那时起就没有受到关注。

您有多种选择,具体取决于您是想要一次性关闭,还是拥有动态数据。

1)。使用PointN function编写一个快速而脏的函数来访问您的点,只需每隔5点说一次,创建表示简化几何的WKT字符串,然后使用GeomFromText函数重新创建几何。

2)。将多边形转储为WKT,使用AsText(geom)输出到csv。使用COPY命令(相当于LOAD DATA INFILE)导入Postgres / Postgis,并在那里使用ST_Simplify函数,然后反转该过程以重新进入MySQL。

3)。使用ogr2ogr转储为shp格式,然后使用像mapshaper这样的工具来简化它,输出到shp然后再使用ogr2​​ogr导入。 Mapshaper很不错,因为您可以了解算法的工作原理,并可能使用它来实现您自己的算法,而不是选项1.

还有其他选项,例如在使用Java服务器端时使用Java Topology Suite,但我希望这可以让您了解如何继续。

对不起,最初的答案是,不,我在几年前经历了这个问题,并最终永久地转向Postgres / Postgis,因为它更适合空间工作。

答案 1 :(得分:3)

MySQL 5.7包含ST_Simplify函数,用于简化几何。

来自https://dev.mysql.com/doc/refman/5.7/en/spatial-convenience-functions.html

  

ST_Simplify(g, max_distance)

     

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

与5.6相比,MySQL 5.7包含了对空间功能的大修,现在处于5.7.9的通用可用性状态。

答案 2 :(得分:1)

我有一个用例,我想使用Get-Content -Tail 0 -Wait -Encoding "UTF8" $log | Select-String "Run Distance: (\d+)(\d{3})$" | % {"Total Distance `- $($_.matches.groups[1].value)km $($_.matches.groups[2].value)m"} | Write-SlowOutput -outputFile $output -waitFor $delay ,但是代码必须在MySQL 5.6(没有)上运行。因此,我开发了一种类似于John Powell在另一个答案中建议的解决方案。

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

以下是一个存储函数的示例,该函数接受ST_AddPoint,并通过仅保留每个 n 点来简化其中的每个MultiLineString,请确保起始位置和起始位置端点始终保持不变。这是通过以下方式完成的:遍历MultiLineString中的LineString,然后遍历每个点(根据需要跳过),并在WKT字符串中累积批次,最终使用LineString将其转换为几何。

ST_GeomCollFromText

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