第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

PostGis 查詢在使用 Go 執(zhí)行時返回?zé)o效的幾何錯誤

PostGis 查詢在使用 Go 執(zhí)行時返回?zé)o效的幾何錯誤

Go
智慧大石 2022-12-19 18:18:25
我嘗試使用 pgx 庫從一些帶有 Go 的 PostGis (x,y) 1 公里以內(nèi)id的表中選擇它們。steps我測試了以下返回錯誤的代碼:parse error - invalid geometry (SQLSTATE XX000)func search(lat float32, lng float32) return (string, error){    searchQuery   = "SELECT DISTINCT(id) FROM steps WHERE ST_Distance('SRID=4326;POINT($1 $2)'::geography, location) < 1000"    // GetSession returns *pgxpool.Pool    rows, err := postgres.GetSession().Query(context.Background(), searchQuery,    lat,    lng)    if err != nil {        // ERROR: parse error - invalid geometry (SQLSTATE XX000)        return nil, err    }    defer rows.Close()    ...}然后,我剛剛使用ST_SetSRID和ST_MakePoint更改了查詢searchQuery   = "SELECT DISTINCT(id) FROM steps WHERE ST_Distance(ST_SetSRID(ST_MakePoint($1, $2), 4326)::geography, location) < 1000"... 但 ...1)我仍然不知道為什么我的第一版查詢"SELECT DISTINCT(id) FROM steps WHERE ST_Distance('SRID=4326;POINT($1 $2)'::geography, location) < 1000"返回一個幾何錯誤,而當(dāng)我直接將它測試到pgadmin時它正在工作,用隨機坐標(biāo)值替換 $1 和 $2,例如"SELECT DISTINCT(id) FROM steps WHERE ST_Distance('SRID=4326;POINT(0.44 3.40)'::geography, location) < 1000"2) 我不確定將ST_Distance與 ST_SetSRID 和 ST_MakePoint 一起使用是否是檢查一個點是否靠近另一個點的最有效方法。
查看完整描述

1 回答

?
米琪卡哇伊

TA貢獻1998條經(jīng)驗 獲得超6個贊

查詢問題

SELECT DISTINCT(id) FROM steps WHERE ST_Distance('SRID=4326;POINT($1 $2)'::geography, location) < 1000


注意 $1 是 lng 而 $2 應(yīng)該是 lat


為什么會發(fā)生?

'SRID=4326;POINT($1 $2)'是一個字符串文字,postgres 的序數(shù)參數(shù)占位符不應(yīng)該在字符串文字中。這不是圍棋的問題。這就是 postgres 處理字符串文字的方式。即'$1' != $1,一個是純字符串,另一個是postgres(不是 Go)將替換為客戶端發(fā)送到服務(wù)器的數(shù)據(jù)的參數(shù)占位符。


解決方案

..如果你想將字符串文字與參數(shù)占位符結(jié)合起來,請使用字符串連接:


ST_Distance(('SRID=4326;POINT(' || $1::text || ' ' || $2::text || ')')::geometry, location)

請注意字符串文字及其連接是如何包裹在額外的括號中的,這只是為了強制執(zhí)行正確的評估順序,即強制強制轉(zhuǎn)換::geometry應(yīng)用于連接后的文本。


優(yōu)化

您最有可能使用st_dwithin和利用空間索引,您可以使用您的位置值和地理來構(gòu)建它,他在帖子的結(jié)尾解釋道。請參閱blog.cleverelephant.ca/2021/05/indexes-and-queries.html


固定 SQL 查詢

SELECT DISTINCT(id) FROM steps WHERE ST_DWithin(('SRID=4326;POINT(' || $1::text || ' ' || $2::text || ')')::geometry, location, 1000);

固定圍棋功能

func search(lat float32, lng float32) return (string, error){

    searchQuery   = "SELECT DISTINCT(id) FROM steps WHERE ST_DWithin(('SRID=4326;POINT(' || $1::text || ' ' || $2::text || ')')::geometry, location, 1000);"


    // GetSession returns *pgxpool.Pool

    rows, err := postgres.GetSession().Query(context.Background(), searchQuery,

    lng,

    lat)

    if err != nil {

        return nil, err

    }

    defer rows.Close()

    ...

}


查看完整回答
反對 回復(fù) 2022-12-19
  • 1 回答
  • 0 關(guān)注
  • 232 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號