我有一個帶有線的大層,以及一個需要計算這些線的長度而不計算它們的重疊的視圖
完成一半作業的作業查詢(但沒有考慮重疊,因此高估了數量)
select name, sum(st_length(t.geom)) from mytable t where st_isvalid(t.geom) group by name
回傳 SQL 錯誤 [XX000] 的預期查詢:錯誤:GEOSUnaryUnion:TopologyException:在 LINESTRING (446659 422287, 446661 422289) 和 LINESTRING (446659 422288, 44624626595985959595959595959595959595959595959604222860422260422260422260422260422287862860462686559659596595965959628604626287600000046262876762876287628762287, 446661 422287, 446661 422289)
select name,st_length(st_union(t.geom)) from mytable t where st_isvalid(t.geom) group by name
問題是后者對前 200 行作業正常,只有當我嘗試匯出整個視圖時才會出現錯誤
有沒有辦法先使用首選查詢,如果它在一行上回傳錯誤,請使用另一個?就像是:
case when st_length(st_union(t.geom)) = error then sum(st_length(t.geom))
else st_length(st_union(t.geom)) end
uj5u.com熱心網友回復:
- 確保你的幾何形狀是有效的工會之前在包裝他們
ST_MakeValid()。您還可以查詢他們的個人有效性,select id, ST_IsValid(t.geom) from mytable;以便過濾或糾正受影響的人。如果其中一個幾何圖形本身以這種方式無效,它會有所幫助。這仍然會留下在將多個有效幾何圖形組合在一起后出現無效的情況。 - 看看有
ST_UnaryUnion(ST_Collect(ST_MakeValid(t.geom)))沒有什么變化。它將嘗試分解和節點組件線串。 - 當真的很絕望時,您可以圍繞您的兩個函式制作一個 PL/pgSQL 包裝器,然后切換到例外塊中的備份函式。
- 以犧牲一些精度為代價并獲得更高性能的好處,您可以嘗試將它們捕捉到網格
ST_Union(ST_SnapToGrid(t.geom,1e-7)),逐漸將網格大小增加到1e-6,1e-5。一些幾何圖形實際上可能并不相交,但如此接近,PostGIS 無法分辨其運行的精度。您也可以嘗試僅將其應用于有問題的幾何圖形,如果您可以確定它們。
這是一個相關的執行緒。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/366799.html
標籤:sql PostgreSQL的 路口 地理
