2011-10-02 73 views
0

我使用預處理語句將數據插入到我的數據庫,問題是我不能夠使用使用PHP包()來轉換成WKT WKB

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

爲什麼?好吧,似乎GeomFromText本身被解釋爲文本:/ 所以我想我會嘗試推入純數據庫字符串到數據庫,而問題是我真的不知道如何打包WKT到WKB。

可能有人能幫我解決這個格式描述這樣做:http://dev.mysql.com/doc/refman/5.0/en/gis-wkb-format.html 和用於包裝的文檔()在: http://php.net/manual/en/function.pack.php

回答

0

這是非常簡單的。抓住一個specification並使用「C」作爲字節,「V」作爲uint32作爲「d」作爲您的pack格式字符串中的雙作用。但是,我的建議是不要這樣做。首先,重寫內置函數是浪費時間。其次,使用sql傳輸二進制數據很容易出錯(例如,考慮編碼問題)。第三,根據http://dev.mysql.com/doc/refman/5.0/en/creating-spatial-values.html,您甚至不需要GeomFromText,因爲mysql已將未引用的wkt視爲二進制文件。

+0

謝謝你,然而,除去GeomFromText目前沒有幫助我。 「INSERT INTO區域(名稱,多邊形)VALUES(???????,POLYGON((,,,,,)))」 觸發以下錯誤: 「操作數應包含1列(S )「 任何想法爲什麼會發生這種情況? – Bisa

+0

似乎這屬於一個自己的問題,你的答案是足夠的原始qiestion =) – Bisa

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(?, ?))))) 
+0

歡呼聲,我很久以來移動過去這個問題,甚至不記得我是如何解決它,但我敢肯定,我回到了逐個轉義值並通過連接字符串來構建查詢。 任何方式,這個答案是一個很好的答案,我會測試它,並接受它,如果我有機會這樣做 - 所以在此期間,它是從我upvote,看起來不錯,並def someting我會試着與手頭的問題:) – Bisa

+0

是的,我注意到太晚了,這是一個老話題。我試圖找到有關PHP WKT處理的信息,並最終回答了一個與MySQL有關的舊問題,因爲這是唯一出現類似於我所尋找的問題。 – meustrus