我正在尝试创建一个包含大型多边形数据集的Web地图。为了提高性能,我希望在缩小时减少多边形细节。
MySQL是否能够将多边形和其他几何图形简化为查询的一部分?
答案 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然后再使用ogr2ogr导入。 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
(通过将位提取到单独的函数中,这可能会更漂亮。)