【问题标题】:Using PHP pack() to Convert WKT into WKB使用 PHP pack() 将 WKT 转换为 WKB
【发布时间】:2023-03-11 09:25:01
【问题描述】:

我正在使用准备好的语句将数据插入到我的数据库中,问题是我无法使用

INSERT INTO 表(多边形)VALUES (GeomFromText(POLYGON((?,?,?,?,?,?))))

为什么?好吧,似乎 GeomFromText 本身被解释为文本:/ 所以我想我会尝试将纯 WKB 字符串推送到数据库中,问题是我真的不知道如何将 WKT 打包到 WKB 中。

有人可以用这种格式描述帮我做这件事吗:http://dev.mysql.com/doc/refman/5.0/en/gis-wkb-format.html 和 pack() 的文档在: http://php.net/manual/en/function.pack.php

【问题讨论】:

    标签: php mysql polygon spatial wkt


    【解决方案1】:

    我看到了两个问题。首先,GeomFromText 函数接受一个字符串,所以它应该看起来像 GeomFromText('POLYGON((0, 1, 2))')(注意引号)。其次,由于 POLYGON... 文本是字符串文字,因此应将其替换为通配符,而不是单个部分。您的查询应如下所示:

    INSERT INTO areas (name, polygon)
    VALUES (?, GeomFromText(?))
    

    然后您将在应用程序中构建POLYGON((?, ?, ?, ?, ?, ?)) 字符串,而不是在语句中。由于 PHP 具有安全的字符串处理,我建议使用 sprintf('POLYGON((%d, %d, %d, %d, %d, %d))', $var1, $var2, $var3, $var4, $var5, $var6)(sprintf 在 C 中很危险)。

    或者,您可以使用 MySQL 的空间函数来生成点。我认为这就是你想要做的,但你不会通过 GeomFromText 传递它们。要使用 MySQL 的空间函数构建多边形,文档建议您需要这样做:

    INSERT INTO areas (name, polygon)
    VALUES (?, Polygon(LineString(Point(?, ?), Point(?, ?), Point(?, ?))))
    

    在 MySQL 5.1.35 之前,您需要这样做:

    INSERT INTO areas (name, polygon)
    VALUES (?, GeomFromWKB(Polygon(LineString(Point(?, ?), Point(?, ?), Point(?, ?)))))
    

    【讨论】:

    • 干杯,我早就解决了这个问题,甚至不记得我是如何解决它的,但我很确定我恢复到单独转义值并通过连接字符串来构建查询。无论如何,这个答案是一个很好的答案,如果我有机会这样做,我会对其进行测试并接受它 - 所以与此同时,它是我的赞成票,看起来不错,而且我会尝试解决这个问题手头:)
    • 是的,我发现这个话题太晚了。我试图查找有关 PHP WKT 处理的信息并最终回答了一个与 MySQL 相关的旧问题,因为这是唯一一个与我正在寻找的问题相似的问题。
    【解决方案2】:

    这很简单。在pack 格式字符串中获取specification 并使用“C”表示字节,“V”表示uint32,“d”表示双精度。但是,我的建议是不要这样做。首先,重写内置函数是浪费时间。其次,使用 sql 传输二进制数据很容易出错(例如考虑编码问题)。第三,根据http://dev.mysql.com/doc/refman/5.0/en/creating-spatial-values.html,您甚至不需要GeomFromText,因为mysql已经将未引用的wkt视为二进制。

    【讨论】:

    • 谢谢,但是,目前删除 GeomFromText 对我没有帮助。 “插入区域(名称,多边形)值(?,POLYGON((?,?,?,?,?,?)))”触发以下错误:“操作数应包含1列”知道为什么发生了什么?
    • 似乎这属于它自己的问题,你的回答对原来的问题就足够了 =)
    猜你喜欢
    • 2021-11-07
    • 2021-09-02
    • 2016-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-15
    • 2023-03-26
    • 2018-09-29
    相关资源
    最近更新 更多