การเพิ่มประสิทธิภาพการสืบค้นฐานข้อมูล Postgis


10

ฉันมีชุด rasters ในรูปแบบ DTED ซึ่งฉันโหลดลงในฐานข้อมูล PostGIS โดยใช้เครื่องมือบรรทัดคำสั่ง raster2pgsql

แรสเตอร์แต่ละตัวจะถูกจัดเก็บไว้ในแถวและอธิบายด้วยค่าลบและค่าของรูปแบบแรสเตอร์

ตอนนี้ฉันต้องการสร้างฟังก์ชั่นฐานข้อมูลที่ใช้ลองจิจูดและละติจูดของจุดและส่งกลับค่าของพิกเซลที่สอดคล้องกับจุดนี้

ปัญหาที่ฉันมีคือมันใช้เวลาค่อนข้างมากในการทำเช่นนั้น (3-4 วินาที) เพราะฐานข้อมูลทำงานบนบอร์ด Odroid

ฉันรู้ว่าชุดข้อมูลที่ฉันดำเนินการค่อนข้างใหญ่ (rasters ครอบคลุมพื้นที่ทั้งหมดในสหราชอาณาจักร) แต่เนื่องจากฉันไม่คุ้นเคยกับ PostgreSQL และ PostGIS มากฉันสงสัยว่ามันสามารถทำได้เร็วกว่า

นี่คือสิ่งที่ฉันทำไปแล้ว:

SELECT ST_Value(rast, ST_GeomFromText(CONCAT('POINT(', $1, ' ', $2, ')'), 4326))
FROM (
    SELECT * FROM rasters
    WHERE rast && ST_GeomFromText(CONCAT('POINT(', $1, ' ', $2, ')'), 4326)
) x;

$1และ$2มีความยาวและ lat ตามลำดับ


2
คุณตัดแรสเตอร์ลงในไทล์เมื่อคุณนำเข้าสู่โพสกิ (พารามิเตอร์ -t width x height)?
mutolisp

ใช่ฉันทำ. มันปรับปรุงประสิทธิภาพเล็กน้อย ฉันควรจะเพิ่มว่าฐานข้อมูลอยู่บนบอร์ด Odroid ดังนั้นมันจึงทำงานช้ากว่าเดสก์ท็อปพีซีอย่างมาก ฉันแค่สงสัยว่าฉันสามารถเปลี่ยนวิธีการในการประมวลผล rasters เพื่อให้การคำนวณที่ไม่จำเป็นน้อยลงหรือไม่ ตัวอย่างเช่นในตอนแรกฉันเรียกใช้ฟังก์ชัน ST_Value บน rasters ทั้งหมดแล้วฉันจะค้นหาแถวที่มีค่าจริง มันเป็นวิธีที่ง่ายที่สุด แต่ทำงานช้าลงมาก
zedsdead

2
การใช้งานST_SetSRID(ST_MakePoint($1, $2),4326)concats string อาจช่วยคุณประหยัดเวลาหากมีการทำซ้ำมากพอ
Scro

1
ดูเหมือนจะไม่ได้ช่วยอะไรมากมาย แต่เป็นการขอบคุณ ฉันกำลังคิดที่จะเพิ่มคอลัมน์อื่นเมื่อสร้างตารางซึ่งจะมีเพียงกล่องที่มีขอบเขตสำหรับแรสเตอร์เดียว บางทีวิธีนี้จะสามารถพบแรสเตอร์ที่ถูกต้องได้เร็วขึ้น ... นอกจากนี้ฉันยังสงสัยว่าการคำนวณตำแหน่งของพิกเซลในแรสเตอร์ล่วงหน้าตามพิกัดมุมและขั้นตอนพิกเซลใน lon / lat อาจช่วยได้ ... ถ้าใครมี ความคิดเกี่ยวกับว่าผมจะขอบคุณสำหรับการแบ่งปันให้ :)
zedsdead

2
บางทีคุณอาจลองใช้“ อธิบาย” เพื่อตรวจสอบว่าคอขวดอยู่ที่ไหน
mutolisp

คำตอบ:


1

คุณสามารถลองสิ่งนี้:

--calculate and store geom point just One time
WITH point_geom AS 
(
    SELECT ST_setsrid(ST_GeomFromText('POINT('|| $1 || ' '|| $2 || ')'), 4326) as geom
)
-- Your subquery is maybe useless , alias "x" isn't used
SELECT ST_Value( rast, point_geom.geom )
FROM rasters
WHERE rast && point_geom.geom;

แต่ปัญหาที่แท้จริงคือการแรสเตอร์ queriing; การเรียงชุดข้อมูลควรเร่งการสืบค้น คุณสามารถลองใช้ PostGIS WKT Raster และทำตามบทช่วยสอนนี้

ฉันหวังว่ามันจะเป็นประโยชน์อย่างเต็มที่

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