使用PHP pack()将WKT转换为WKB

时间:2011-10-02 01:16:09

标签: php mysql polygon spatial wkt

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

INSERT INTO table(polygon)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

2 个答案:

答案 0 :(得分:2)

我看到两个问题。首先,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(?, ?)))))

答案 1 :(得分:0)

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