0

プリペアドステートメントを使用してデータベースにデータを挿入していますが、問題は使用できないことです。

INSERT INTOテーブル(ポリゴン)VALUES(GeomFromText(POLYGON((?、?、?、?、?、?))))

なぜ?そうですね、GeomFromText自体はテキストとして解釈されるようです:/代わりに、純粋なWKB文字列をdbにプッシュしてみようと思いました。問題は、WKTをWKBにパックする方法がわからないことです。

誰かがこのフォーマットの説明でこれを行うのを手伝ってもらえますか:http://dev.mysql.com/doc/refman/5.0/en/gis-wkb-format.html およびpack()のドキュメント: http:// php.net/manual/en/function.pack.php

4

2 に答える 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

これは非常に簡単です。仕様を取得し、フォーマット文字列でバイトに「C」、uint32に「V」、doubleに「d」を使用しますpackしかし、私のアドバイスはそうしないことです。まず、組み込み関数を書き直すのは時間の無駄です。次に、SQLを使用してバイナリデータを転送するとエラーが発生しやすくなります(たとえば、エンコーディングの問題を考えてみてください)。そして第3に、http://dev.mysql.com/doc/refman/5.0/en/creating-spatial-values.htmlGeomFromTextによると、mysqlは引用符で囲まれていないwktをすでにバイナリとして扱っているため、必要ありません。

于 2011-10-02T08:11:15.550 に答える