การจัดเก็บพื้นผิว GML ใน PostGIS


9

ฉันใช้ PostGIS 2.0.0 และต้องการเก็บ GML Surface ในวิธีที่อนุญาตให้คำนวณการแยกระหว่างพื้นผิวนั้นกับจุดและเส้นต่าง ๆ ในกรณีของฉัน Surface จะมี PolygonPatch หนึ่งอันซึ่งไม่มีวงแหวนภายในและวงแหวนภายนอกซึ่งอาจเป็น LineStringSegment, Geodesic, Arc หรือ Circle ระยะทางสามารถอยู่ในลำดับหลายสิบถึงหลายร้อยไมล์ ผมเห็นว่ามี PostGIS CIRCULARSTRINGและCURVEPOLYGONซึ่งดูเหมือนจะเป็นวิธีที่ดีในการจัดเก็บ Arc ยกเว้นว่าพวกเขาไม่ได้รับการสนับสนุนโดยประเภทเท่านั้นgeography geometryอะไรจะเป็นวิธีที่ดีที่สุดในการจัดเก็บสิ่งนี้ (ฉันค่อนข้างใหม่สำหรับ PostGIS และ GIS โดยทั่วไปดังนั้นจึงเป็นไปได้โดยสิ้นเชิงว่าฉันไม่มีอะไรที่ชัดเจน)


คุณสามารถเก็บ GML ในตำแหน่งที่ต้องการได้ postgis.refractions.net/documentation/manual-svn/…
Mapperz

มีคำอธิบายบางอย่างเกี่ยวกับรูปทรงเรขาคณิตและภูมิศาสตร์ของ PostGIS ที่นี่postgis.refractions.net/docs/…
canisrufus

คำตอบ:


4

ST_GeomFromGML

คุณสามารถจัดเก็บคุณลักษณะ GML ของคุณเป็นประเภทข้อมูล PostGIS Geometry ได้โดยใช้ฟังก์ชัน ST_GeomFromGMLซึ่งจะแปลง GML ของคุณเป็นประเภทข้อมูลเรขาคณิต FYI: มีฟังก์ชั่นที่คล้ายกันสำหรับ KML, WKT และอื่น ๆ

ทำอะไรที่ชอบ:

INSERT into myTable (mygeomField) values (ST_GeomFromGML('
    <gml:LineString srsName="EPSG:4269">
        <gml:coordinates>
            -71.16028,42.258729 -71.160837,42.259112 -71.161143,42.25932
        </gml:coordinates>
    </gml:LineString>'));

เมื่อคุณมีมันในฟิลด์เรขาคณิตคุณสามารถทำทุกสิ่งที่สนุกและสิ่งที่คุณต้องการทำใน PostGIS

จากนั้นคุณสามารถแยกผลลัพธ์ออกเป็นรูปแบบ GML โดยใช้ST_AsGML

แก้ไข # 1 ฉันเชื่อว่าคุณกำลังมองหา:

http://postgis.net/docs/ST_Distance_Sphere.html

http://postgis.net/docs/ST_Distance_Spheroid.html

แก้ไข # 2

ฉันใช้ "POSTGIS =" 1.5.2 "(เวอร์ชั่นเก่ากว่าคุณ) และคำสั่งต่อไปนี้ใช้งานได้ดี:

select ST_GeomFromText('CIRCULARSTRING(220268 150415,220227 150505,220227 150406)')

คุณต้องใช้การรวมกันของฟังก์ชั่นเพื่อให้ได้สิ่งที่คุณต้องการ

distance_spheroid ไม่รองรับ CIRCULARSTRING เพราะมันใช้กับชนิดข้อมูลเรขาคณิต

โปรดเพิ่มการแก้ไขในคำถามเดิมของคุณด้วยชิ้นตัวอย่าง GML ที่คุณมีปัญหาและฉันจะเขียนข้อความให้คุณ


ขอบคุณ แต่การนำเข้าจาก GML ไม่ใช่ปัญหาหลักจริงๆ คำถามหลักคือวิธีการจัดเก็บข้อมูลในลักษณะที่ช่วยให้การคำนวณที่แม่นยำ ดังที่ฉันเข้าใจประเภทเรขาคณิตนั้นใช้งานได้ไม่ดีนักเนื่องจากมันขึ้นอยู่กับระนาบและประเภทภูมิศาสตร์ไม่รองรับเส้นโค้ง
EM0

@EM: ตรวจสอบการแก้ไขของฉัน # 1
CaptDragon

ขอบคุณลองเหล่านั้น แต่น่าเสียดายที่พวกเขาไม่สนับสนุน CIRCULARSTRING
EM0

@EM: ตรวจสอบการแก้ไขของฉัน # 2
CaptDragon

ใช่คำสั่งเพื่อสร้างงาน CIRCULARSTRING แต่การคำนวณระยะทางในสายนั้นใช้ระนาบที่ฉันเข้าใจเพราะมันเป็น "เรขาคณิต" ประเภท อย่างไรก็ตามฉันจะพยายามจัดเก็บข้อมูลในสองวิธี - ค่าที่แน่นอนเป็น CIRCULARSTRING (เรขาคณิต) และค่าโดยประมาณ (ภูมิศาสตร์) ที่สร้างขึ้นโดยใช้ ST_CurveToLine
EM0

2

ในที่สุดฉันก็ยอมแพ้ในการเก็บส่วนโค้ง "ที่แน่นอน" หรือวงกลม เมื่อนำเข้า GML Arc (ซึ่งถูกกำหนดโดย 3 คะแนนบนส่วนโค้ง) ฉันสร้างเรขาคณิตชั่วคราวCIRCULARSTRINGจากนั้นแปลงเป็นภูมิศาสตร์เช่นนี้

ST_RemoveRepeatedPoints(ST_CurveToLine(ST_GeomFromText('CIRCULARSTRING(...)', 4326)))::geography

เมื่อนำเข้า GML ArcByCenterPoint (ซึ่งถูกกำหนดโดยจุดกึ่งกลางรัศมีและมุมเริ่มต้นและจุดสิ้นสุด) ฉันประมาณมันโดยตรงโดยการฉายจุดที่ช่วง 1 องศาจากมุมเริ่มต้นไปยังมุมปลาย สิ่งนี้ทำในรูปทรงกลมไม่ใช่รูปทรงกลมดังนั้นจึงไม่ถูกต้องทั้งหมด แต่มีตั๋ว PostGIS ที่จะใช้มุมราบและจุดฉายสำหรับประเภทภูมิศาสตร์ เหมือนกันกับวงกลม

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