Использование PHP pack() для преобразования WKT в WKB

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

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


person Bisa    schedule 02.10.2011    source источник


Ответы (2)


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

person user187291    schedule 02.10.2011
comment
Спасибо, однако, удаление GeomFromText мне пока не помогает. ВСТАВИТЬ В области (имя, многоугольник) ЗНАЧЕНИЯ (?, ПОЛИГОН((?,?,?,?,?,?))) вызывает следующую ошибку: Операнд должен содержать 1 столбец (столбцы), есть идеи, почему это происходит? - person Bisa; 02.10.2011
comment
Кажется, это отдельный вопрос, вашего ответа достаточно на исходный вопрос =) - person Bisa; 02.10.2011

Я вижу две проблемы. Во-первых, функция 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(?, ?)))))
person meustrus    schedule 02.04.2012
comment
ура, я давно прошел эту проблему, даже не могу вспомнить, как я ее решил, но я почти уверен, что вернулся к индивидуальному экранированию значений и построению запроса путем объединения строк. в любом случае, этот ответ хороший, и я бы проверил его и принял, если бы у меня была возможность сделать это, так что тем временем это голосование от меня, выглядит хорошо и определенно я бы попробовал решить проблему. под рукой :) - person Bisa; 03.04.2012
comment
Да, я слишком поздно заметил, что это старая тема. Я пытался найти информацию об обработке PHP WKT и в итоге ответил на старый вопрос, связанный с MySQL, потому что это единственный вопрос, который показался похожим на то, что я искал. - person meustrus; 03.04.2012