ใส่จุดลงใน PostGIS หรือไม่


49

ฉันสร้างตารางหนึ่งตัวใน PostGIS nut ของฉันฉันไม่สามารถแทรกจุดได้

เกิดอะไรขึ้นกับข้อความค้นหาของฉัน

CREATE TABLE app ( 
  p_id INTEGER PRIMARY KEY

);

SELECT AddGeometryColumn('app','the_geom','4326','POINT',2);

INSERT INTO app(p_id, the_geom) VALUES(2, POINT(-71.060316, 48.432044));

หลังจากการสอบถามครั้งล่าสุดมันแสดงข้อผิดพลาดบางอย่าง ..

ERROR:  column "the_geom" is of type geometry but expression is of type point
LINE 1: ...SERT INTO app(p_id, the_geom) VALUES(2, POINT(-71....
                                                             ^
HINT:  You will need to rewrite or cast the expression.


********** Error **********

ERROR: column "the_geom" is of type geometry but expression is of type point
SQL state: 42804
Hint: You will need to rewrite or cast the expression.
Character: 53

ฉันตรวจสอบรุ่น PostGIS ของฉันแล้ว

SELECT PostGIS_full_version();

ฉันได้ผลลัพธ์ต่อไปนี้ ..

"POSTGIS="1.5.3" GEOS="3.3.1-CAPI-1.7.1" PROJ="Rel. 4.7.1, 23 September 2009" LIBXML="2.7.3" USE_STATS"

คำตอบ:


84

คุณกำลังสับสนSQLและWKT ( ข้อความที่รู้จักกันดี) WKT เป็นเหมือนภาษาเรขาคณิตเพื่ออธิบายรูปร่าง แต่ไม่ใช่ SQL ซึ่งเป็นภาษาที่ใช้สืบค้นและจัดการฐานข้อมูล เมื่อทำงานกับ WKT ในแบบสอบถาม SQL จะต้องเป็นข้อความและไม่ได้ผสมกับ SQL

แบบสอบถามของคุณจะทำงานหากคุณจัดรูปแบบ WKT อย่างถูกต้อง (ลบ ",") และตั้งค่า SRID สำหรับวิธีนี้ใช้ST_GeomFromText(wkt, srid)งานได้ดี:

INSERT INTO app(p_id, the_geom)
VALUES(2, ST_GeomFromText('POINT(-71.060316 48.432044)', 4326));

หากคุณมีคอลัมน์ที่มีลองจิจูด / ละติจูดที่เป็นตัวเลขคุณสามารถสร้างเรขาคณิต POINT ได้โดยตรง:

ST_SetSRID(ST_MakePoint(long, lat), 4326);

ตรวจสอบการก่อสร้างรูปทรงเรขาคณิตอื่น ๆในคู่มือ


สำหรับคำขอของ @ vik86 the_geomสามารถอัปเดตในตารางappจากคอลัมน์ตัวเลขlongและlatใช้:

UPDATE app SET
  the_geom = ST_SetSRID(ST_MakePoint(long, lat), 4326);

คุณช่วยอธิบายรายละเอียดเกี่ยวกับการใช้คุณสมบัตินี้ได้ไหม "ถ้าคุณมีคอลัมน์ที่มีละติจูดลองจิจูดเป็นตัวเลขคุณสามารถสร้างรูปทรงเรขาคณิตของจุดได้โดยตรง: ST_SetSRID (ST_MakePoint (ยาว, lat)) 4326)" ตอนนี้ฉันมีตารางที่มีละติจูดและลองจิจูด เพื่อใช้ PostGIS api ฉันต้องการมันในรูปแบบจุด ดังนั้นอยากทราบว่าฉันจะอัพเดทคอลัมน์จุดอย่างไรโดยใช้คุณสมบัตินี้ ขอบคุณ Vikram
Vik86

@ Vik86 ดูคำตอบที่ปรับปรุงแล้ว
Mike T

1

หากคุณกำลังทำงานกับไคลเอนต์ Java แล้วคำแนะนำของฉันคือการใช้ชนิดไบนารีในการถ่ายโอนข้อมูล จากหน่วยความจำฉันบันทึกการปรับปรุงประสิทธิภาพ 10% เมื่อฉันทำการเปลี่ยนแปลงนี้กับวิธี ST_AsEWKT

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.