package main import ( "encoding/binary" "fmt" ) const sridFlag = 0x20000000 func wkbToEwkbWithSrid(geometry []byte, srid int) []byte { if len(geometry) < 5 { return geometry } var byteOrder binary.ByteOrder if geometry[0] == 0 { byteOrder = binary.BigEndian } else { byteOrder = binary.LittleEndian } wkbType := byteOrder.Uint32(geometry[1:5]) if wkbType&sridFlag != 0 { return geometry } ewkbType := wkbType | sridFlag result := make([]byte, len(geometry)+4) result[0] = geometry[0] byteOrder.PutUint32(result[1:5], ewkbType) byteOrder.PutUint32(result[5:9], uint32(srid)) copy(result[9:], geometry[5:]) return result } func main() { shape := []byte{ 1, 3, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 217, 61, 121, 88, 168, 57, 83, 192, 60, 78, 209, 145, 92, 222, 39, 192, 232, 106, 43, 246, 151, 57, 83, 192, 60, 78, 209, 145, 92, 222, 39, 192, 232, 106, 43, 246, 151, 57, 83, 192, 174, 182, 98, 127, 217, 221, 39, 192, 217, 61, 121, 88, 168, 57, 83, 192, 174, 182, 98, 127, 217, 221, 39, 192, 217, 61, 121, 88, 168, 57, 83, 192, 60, 78, 209, 145, 92, 222, 39, 192, } srid := 4326 result := wkbToEwkbWithSrid(shape, srid) fmt.Printf("WKB Original (len): %d\n", len(shape)) fmt.Printf("EWKB Result (len): %d\n", len(result)) fmt.Printf("Primeros bytes (original): %v\n", shape[:10]) fmt.Printf("Primeros bytes (resultado): %v\n", result[:10]) }