ทำให้มุมมองเชิงพื้นที่ใน PostGIS และเพิ่มเป็นเลเยอร์ใน QGIS?


49

ใน PostGIS 2.0 ฉันกำลังมองหาวิธีที่มีประสิทธิภาพในการสร้างมุมมองที่เปิดใช้งานเชิงพื้นที่ที่สามารถดูได้ใน QGIS

ฉันติดตามบริบทของส่วนที่ 2 ของ @Mike Toews เพื่อตอบคำถามวิธีสร้างตารางจากตารางที่มีอยู่ (ใช้ schema ใหม่) ใน postgis DB และมุมมองจะปรากฏเป็นเลเยอร์จุด (ในกรณีของฉัน) ในกล่องโต้ตอบ "เพิ่มเลเยอร์ PostGIS" แต่หลังจากสร้างมุมมองและเปิดใช้งานเชิงพื้นที่ฉันได้รับข้อผิดพลาดต่อไปนี้เมื่อพยายามเพิ่มมุมมองใน QGIS:

คุณต้องเลือกตารางเพื่อเพิ่มเลเยอร์

บางคนสามารถอธิบายได้ว่าทำไมมุมมองเชิงพื้นที่จะไม่โหลดลงใน QGIS และสิ่งที่ฉันต้องทำเพื่อให้สามารถโหลดได้เป็นเลเยอร์ใน QGIS

ปัจจุบันฉันใช้ QGIS v1.8 จากตัวติดตั้ง OSGEO

ฉันดูถูกสร้างขึ้นจากฐานข้อมูล geonames ซึ่งโหลดลงใน PostGIS ตาราง geoname / ข้อมูลเชิงพื้นที่สามารถเลือก / ดูใน QGIS ได้ดี

เมื่อฉันพยายามเลือก " mt_view " QGIS จะเห็นมุมมองในกล่องโต้ตอบ แต่จะไม่ให้ฉันเลือก มันให้กล่องประรอบพื้นที่ แต่ไม่เน้นและเลือกมุมมอง

QGIS ไม่สามารถเลือก mt_view เป็นเลเยอร์


ฉันเพิ่งสังเกตเห็นว่าเมื่อฉันเรียกใช้แบบสอบถามแรกของฉัน:

CREATE OR REPLACE VIEW data.test AS
SELECT * FROM data.geoname
WHERE admin1='MT'

มุมมองจะปรากฏขึ้นใน QGIS Add Layer Dialog แต่ไม่สามารถเลือกได้ จากนั้นเมื่อฉันวิ่ง:

SELECT Populate_Geometry_Columns('data.test'::regclass);

ฉันได้รับผลลัพธ์ของ "0" ซึ่งตามเอกสารฉันคิดว่ามันควรจะส่งคืน "1"


1
ฉันยืนยันปัญหา ด้วย QGIS 1.8, PostGIS 2.0 และมุมมองที่สร้างจากตารางที่มีคีย์หลักมุมมอง tha จะแสดงรายการในเลเยอร์ avaiable แต่ข้อความแสดงข้อผิดพลาด "คุณต้องเลือกตารางเพื่อเพิ่มเลเยอร์" ปรากฏขึ้น
giohappy

2
มีวิธีอื่นในการตั้งค่า de primary key โดยอัตโนมัติในหน้าต่าง Postgis Add Layer หรือไม่เมื่อเราทำงานกับมุมมอง? มันยากมากที่จะเลือกฟิลด์คีย์หลักในหน้าจอนี้สำหรับเลเยอร์ / มุมมองใด ๆ หากคุณนึกว่าผู้ใช้ GIS ปกติและมุมมองมีฟิลด์จำนวนเต็มจำนวนมาก

@Pgimenez ฉันขอแนะนำให้เริ่มต้นคำถามใหม่กับสิ่งที่คุณระบุไว้ข้างต้นแล้วอ้างอิงคำถามนี้ด้วยตัวคุณเอง นั่นจะทำให้มองเห็นได้กว้างขึ้นมาก
RyanDalton

ไม่มีวิธีใดที่จะเห็นภาพนูนออกมาใน qgis 1.8 lisboa? ฉันได้ลอง vievs ดังต่อไปนี้ใน Postgis 1.5 ฉันถูกบอกให้ใช้คอลัมน์ id เพื่อเผยแพร่ใน Qgis หากคุณไม่ได้ใช้คอลัมน์ id คุณไม่สามารถโหลดได้เนื่องจากข้อผิดพลาด 1. สร้างหรือแทนที่มุมมอง con_hull_baeume3 (ราคาเสนอ) เป็นเลือก '0', ST_ConvexHull (ST_Collect (geom)) จาก baeume; 2. สร้างหรือแทนที่มุมมอง con_hull_baeume4 (ราคาเสนอ) เป็นการเสนอราคาแบบเลือก ST_ConvexHull (ST_Collect (geom)) จากกลุ่ม baeume ตามราคาเสนอ แต่สิ่งนี้ทำให้นูนออกมาในแต่ละจุดเรขาคณิต ฉันหมายถึงเพียงใช้ 'select ST_ConvexHull (ST_Collect (geom)) จาก baeume;' ทำงาน
ulan

1
ยินดีต้อนรับ! โปรดโพสต์คำถามนี้เป็นคำถามใหม่เนื่องจากดูเหมือนว่าจะไม่ตอบคำถามเดิม อย่างน้อยถ้าเป็นคำถามเนื่องจากข้อความล่าสุดไม่ชัดเจนว่าคุณทำสำเร็จหรือไม่
lynxlynxlynx

คำตอบ:


54

ฉันสามารถยืนยันได้ว่าเป็นไปไม่ได้ที่จะเพียงแค่เลือกมุมมองที่ระบุไว้

ดูเหมือนว่าจำเป็นต้องเลือก "คอลัมน์คีย์หลัก" ก่อน จากนั้นตารางจะสามารถเลือกได้:

ป้อนคำอธิบายรูปภาพที่นี่


1
ว้าวฉันจะไม่เคยเห็นอย่างนั้น ขอบคุณมาก! ฉันได้แก้ไขชื่อเพื่อสะท้อนถึงปัญหาที่เกิดขึ้นกับ QGIS ไม่ใช่มุมมอง PostGIS
RyanDalton

ดูเหมือนว่านี่เป็นปัญหาสำหรับ QGIS 1.8 (ซึ่งฉันยังไม่ได้ใช้) ขั้นตอนเหล่านี้ไม่จำเป็นสำหรับ 1.7
Mike T

ถูกต้อง 1.7 พยายามเดาคีย์หลัก แต่มันก็ใช้งานไม่ได้
underdark

ในหมายเหตุด้าน @underdark QGIS ยอมรับ PKs ประเภทอื่นหรือไม่?
George Silva

1
ใน QGIS3 คอลัมน์มุ่งหน้าไปที่ "feature id" ไม่ใช่ "คอลัมน์คีย์หลัก" และ (อย่างน้อยสำหรับฉัน) มันอยู่นอกขอบของหน้าต่างเริ่มต้น (เช่นไม่สามารถมองเห็นได้) และไม่มีข้อบ่งชี้ว่ามีคอลัมน์มากขึ้น! ฉันคิดว่าฉันจะบันทึกคำขอคุณลักษณะที่ได้รับพร้อมต์สำหรับรายละเอียดเหล่านี้ (ถ้าจำเป็น) หลังจากการเลือก ดูเหมือนว่านักพัฒนาสันนิษฐานว่าคนจะทำให้แน่ใจว่ามีคีย์ที่ไม่ซ้ำกันในคอลัมน์แรก
รัสเซลฟุลตัน

5

(อัปเดตคำตอบของฉันเล็กน้อย)

ตราบใดที่ฟิลด์ OBJECTID (row_number) เป็นอันดับแรกในการกำหนดคอลัมน์ของมุมมอง QGIS จะรับมันโดยไม่ขอให้คุณเพิ่มจากเมนู 'เพิ่มเวกเตอร์เลเยอร์'

CREATE OR REPLACE VIEW dqmt.addressverify AS 
 SELECT row_number() OVER (ORDER BY newaddresses.addressid) AS objectid,
    newaddresses.addressid
  , geom
   FROM dqmt.newaddresses;

ฉันเพิ่งแก้ไขมุมมองเก่าที่แตกตามคำถามเดิม แต่ย้ายฟิลด์ OBJECTID ไปที่จุดเริ่มต้นของมุมมองช่วยแก้ไขปัญหา!


ฉันใช้ไวยากรณ์ "row_number () over ()" สำหรับหลาย ๆ มุมมองเช่นกัน ฉันมักจะใช้ "gid" สำหรับฟิลด์คีย์หลักของฉัน มุมมองอื่นของคุณทั้งหมดใช้ "objectid" เป็นคีย์หลักหรือไม่
RyanDalton

มักจะ objectid - ซึ่งทำงานในตัวอย่างด้านบน - แต่จะลอง gid ... นั่นเป็นสิ่งที่ QGIS รู้จักก่อนฟิลด์ 'id' อื่น ๆ หรือไม่?
DPSSpatial

GID ไม่มีผลกระทบใด ๆ กับสิ่งนี้ ...
DPSSpatial

แค่ฝันถึงความเป็นไปได้ ขอบคุณสำหรับการตรวจสอบ
RyanDalton

(สายนี้ แต่ ... ) ที่เดาฉันคิดว่าถ้าตารางที่ถูกโหลดมีการPRIMARY KEYกำหนด QGIS เป็นประจำหยิบมันขึ้นมา: มันไม่เคยล้มเหลวในการ 'เลือก' PK บนตารางใด ๆ ของฉันที่มี PK แม้ว่าเกือบ PKs VARCHARของฉันทั้งหมดที่มี ที่ไม่สามารถเกิดขึ้นกับVIEWเพราะ PostgreSQL VIEWไม่สามารถมีCONSTRAINTs ค่อนข้างแน่ใจว่าเป็นเหตุผลว่าทำไมจึงจำเป็นต้องเลือก PK สำหรับVIEWมือเมื่อนำเข้า QGIS ผ่านปุ่ม 'เพิ่มเลเยอร์ PostGIS' ซึ่งเป็นเหตุผลที่ฉันนำเข้าพวกเขาโดยใช้สคริปต์ Python
GT

4

มุมมองของคุณปรากฏในgeometry_columnsตารางหรือไม่ ตามคู่มือมุมมองควรปรากฏขึ้นโดยอัตโนมัติใน 2.0 แต่ฉันไม่ได้ลองเลย

ลองเรียกใช้สิ่งต่อไปนี้เพื่อตรวจสอบ:

SELECT f_geometry_column As col_name, type, srid, coord_dimension As ndims 
FROM geometry_columns
WHERE f_table_name = 'my_spatial_table' AND f_table_schema = 'my_schema';

ใช่การเรียกใช้การตรวจสอบนี้กับมุมมองของฉันจะกลับมา: the_geom, Point, 4269,2
RyanDalton

3

มุมมองของคุณใช้ฟิลด์จำนวนเต็มที่ไม่ซ้ำกันเช่น "gid" หรือ PK เทียบเท่าจากหนึ่งในตารางในมุมมองของคุณหรือไม่

ฉันรู้ว่าใน QGIS รุ่นก่อนหน้าฉันมีปัญหาเกี่ยวกับมุมมองที่เพิ่มเข้าไปในแผนที่เมื่อไม่มีเขตข้อมูลจำนวนเต็มที่ไม่ซ้ำกัน อย่างไรก็ตามฉันได้รับข้อความแสดงข้อผิดพลาดที่แตกต่างกันซึ่งชี้ให้เห็นว่าปัญหานั้นออกมา แต่มันอาจคุ้มค่าที่จะตรวจสอบเพื่อปกปิดฐานทั้งหมด


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