Использование PHP pack () для преобразования WKT в WKB - PullRequest
0 голосов
/ 02 октября 2011

Я использую подготовленные операторы для вставки данных в свою базу данных, проблема в том, что я не могу использовать

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 ]

2 голосов
/ 03 апреля 2012

Я вижу две проблемы. Во-первых, функция 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(?, ?)))))
0 голосов
/ 02 октября 2011

Это довольно просто. Возьмите спецификацию и используйте "C" для байтов, "V" для uint32 и "d" для двойников в строках формата pack. Однако мой совет не делать этого. Во-первых, переписать встроенную функцию - пустая трата времени. Во-вторых, передача двоичных данных с помощью sql подвержена ошибкам (например, подумайте о проблемах кодирования). И, в-третьих, согласно http://dev.mysql.com/doc/refman/5.0/en/creating-spatial-values.html вам даже не нужно GeomFromText, потому что mysql уже рассматривает не цитируемый wkt как двоичный файл.

...