0

I'm using prepared statements to insert data into my database, problem is I'm not able to use

INSERT INTO table (polygon) VALUES (GeomFromText(POLYGON((?,?,?,?,?,?))))

why? well, seems the GeomFromText itself is interpreted as text :/ so I figured I'd try pushing pure WKB strings into the db instead, problem is I can't really figure out how to pack a WKT into WKB.

Could someone help me do this with this format description: http://dev.mysql.com/doc/refman/5.0/en/gis-wkb-format.html and the doc for pack() over at: http://php.net/manual/en/function.pack.php

4

2 回答 2

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(?, ?)))))
于 2012-04-02T23:54:50.193 回答
0

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

于 2011-10-02T08:11:15.550 回答