Reputation: 107
I'm using github.com/paulmach/orb v0.11.0
to select geometry from my postgres post-gis database with go.
I defined a custom type Geometry
and made a Scan
method.
// Scan implements the Scanner interface for database/sql.
func (g *Geometry) Scan(value any) error {
bin, ok := value.([]byte)
if !ok {
return fmt.Errorf("invalid binary value for geometry: expected []bytes, got %T", value)
}
geom, err := wkb.Unmarshal(bin)
if err != nil {
log.Printf("Raw WKB data: %x, %s", bin, string(bin))
return fmt.Errorf("geometry scan error: unable to unmarshal WKB, %v", err)
}
*g = Geometry{geom}
return nil
}
where log.Printf("Raw WKB data: %x, %s", bin, string(bin))
gives me
2024/03/20 19:02:46 Raw WKB data: 30313033303030303230453631303030303030313030303030303237303030303030313846333533374338444245354634304545444334443836393243383432343046324339323034323933424535463430323733333634433639324338343234303246343944353846394442453546343037363039464635303933433834323430433531443631423739444245354634304446454238423535393343383432343039374546314438413946424535463430454532303934323139334338343234303244464345343332413042453546343034434433424630453933433834323430374637423746383741304245354634303946393132374645393243383432343036393833303842434134424535463430313546393446323339324338343234304635323238413239413842453546343035443232443339373931433834323430423231414342413141384245354634303238324142463632393043383432343039464631364545324138424535463430353833443245423438464338343234303644463434434631413842453546343042313946344438323846433834323430384636384646454541384245354634303437353239424536384543383432343043454243413546304138424535463430314344443542424438434338343234303434313337304633413842453546343042363031364234463839433834323430313635384339463341384245354634303144423034374532383843383432343038413934373746394138424535463430374641463938453538314338343234303530424639393943413742453546343035303637454346373746433834323430353637364444413541374245354634304436383842353533374443383432343033333939333941394137424535463430354231333434363037434338343234304638423430463741413742453546343044344437354142313742433834323430454535303933464441364245354634303331363736344134374143383432343043433037393941374136424535463430463536314136413937414338343234303431364244314630413542453546343046434244454142343741433834323430434244453343344241344245354634303130324343314345374143383432343042323338433743424132424535463430374630333742383437384338343234304639304134304138413042453546343031353032353238453738433834323430423735434342363241304245354634304536303339343846373843383432343036303643373834413945424535463430434242433331393937384338343234303530353532414345394242453546343041334145374139443738433834323430334243364141363539424245354634304334313745383934373743383432343030444334453230323941424535463430363736384133413437374338343234303237343838434344393442453546343041414330443044463737433834323430363936333134444639334245354634304335454135384630373743383432343046323445424533313930424535463430343942453441314137384338343234303138413142334445384642453546343041414131363834453738433834323430353741453242433038444245354634303646453445314136374343383432343038394544444539393844424535463430383337464232303038394338343234303138463335333743384442453546343045454443344438363932433834323430, 0103000020E6100000010000002700000018F3537C8DBE5F40EEDC4D8692C84240F2C9204293BE5F40273364C692C842402F49D58F9DBE5F407609FF5093C84240C51D61B79DBE5F40DFEB8B5593C8424097EF1D8A9FBE5F40EE20942193C842402DFCE432A0BE5F404CD3BF0E93C842407F7B7F87A0BE5F409F9127FE92C84240698308BCA4BE5F4015F94F2392C84240F5228A29A8BE5F405D22D39791C84240B21ACBA1A8BE5F40282ABF6290C842409FF16EE2A8BE5F40583D2EB48FC842406DF44CF1A8BE5F40B19F4D828FC842408F68FFEEA8BE5F4047529BE68EC84240CEBCA5F0A8BE5F401CDD5BBD8CC84240441370F3A8BE5F40B6016B4F89C842401658C9F3A8BE5F401DB047E288C842408A9477F9A8BE5F407FAF98E581C8424050BF999CA7BE5F405067ECF77FC842405676DDA5A7BE5F40D688B5537DC84240339939A9A7BE5F405B1344607CC84240F8B40F7AA7BE5F40D4D75AB17BC84240EE5093FDA6BE5F40316764A47AC84240CC0799A7A6BE5F40F561A6A97AC84240416BD1F0A5BE5F40FCBDEAB47AC84240CBDE3C4BA4BE5F40102CC1CE7AC84240B238C7CBA2BE5F407F037B8478C84240F90A40A8A0BE5F401502528E78C84240B75CCB62A0BE5F40E603948F78C84240606C784A9EBE5F40CBBC319978C8424050552ACE9BBE5F40A3AE7A9D78C842403BC6AA659BBE5F40C417E89477C842400DC4E2029ABE5F406768A3A477C8424027488CCD94BE5F40AAC0D0DF77C84240696314DF93BE5F40C5EA58F077C84240F24EBE3190BE5F4049BE4A1A78C8424018A1B3DE8FBE5F40AAA1684E78C8424057AE2BC08DBE5F406FE4E1A67CC8424089EDDE998DBE5F40837FB20089C8424018F3537C8DBE5F40EEDC4D8692C84240
Using python
from shapely.wkb import loads
import binascii
# Your WKB data as a hex string
wkb_hex = "30313033303030303230453631303030303030313030303030303237303030303030313846333533374338444245354634304545444334443836393243383432343046324339323034323933424535463430323733333634433639324338343234303246343944353846394442453546343037363039464635303933433834323430433531443631423739444245354634304446454238423535393343383432343039374546314438413946424535463430454532303934323139334338343234303244464345343332413042453546343034434433424630453933433834323430374637423746383741304245354634303946393132374645393243383432343036393833303842434134424535463430313546393446323339324338343234304635323238413239413842453546343035443232443339373931433834323430423231414342413141384245354634303238324142463632393043383432343039464631364545324138424535463430353833443245423438464338343234303644463434434631413842453546343042313946344438323846433834323430384636384646454541384245354634303437353239424536384543383432343043454243413546304138424535463430314344443542424438434338343234303434313337304633413842453546343042363031364234463839433834323430313635384339463341384245354634303144423034374532383843383432343038413934373746394138424535463430374641463938453538314338343234303530424639393943413742453546343035303637454346373746433834323430353637364444413541374245354634304436383842353533374443383432343033333939333941394137424535463430354231333434363037434338343234304638423430463741413742453546343044344437354142313742433834323430454535303933464441364245354634303331363736344134374143383432343043433037393941374136424535463430463536314136413937414338343234303431364244314630413542453546343046434244454142343741433834323430434244453343344241344245354634303130324343314345374143383432343042323338433743424132424535463430374630333742383437384338343234304639304134304138413042453546343031353032353238453738433834323430423735434342363241304245354634304536303339343846373843383432343036303643373834413945424535463430434242433331393937384338343234303530353532414345394242453546343041334145374139443738433834323430334243364141363539424245354634304334313745383934373743383432343030444334453230323941424535463430363736384133413437374338343234303237343838434344393442453546343041414330443044463737433834323430363936333134444639334245354634304335454135384630373743383432343046323445424533313930424535463430343942453441314137384338343234303138413142334445384642453546343041414131363834453738433834323430353741453242433038444245354634303646453445314136374343383432343038394544444539393844424535463430383337464232303038394338343234303138463335333743384442453546343045454443344438363932433834323430"
# Convert the hex string to binary
wkb_bin = binascii.unhexlify(wkb_hex)
# Attempt to load the geometry
try:
geom = loads(wkb_bin)
print(f"Geometry loaded successfully: {geom}")
except Exception as e:
print(f"Error loading geometry: {e}")
I was able to successfully decode Hex value into Polygon. geometry.
But My Golang function failed to do so with error message like so;
2024/03/20 19:02:46 failed to query: sql: Scan error on column index 5, name "geometry": geometry scan error: unable to unmarshal WKB, wkb: invalid data
How should I fix my Go Scan
function in order to successfully retrieve geometry?
Upvotes: 1
Views: 167