sql.Register("sqlite3_with_extensions",
&sqlite3.SQLiteDriver{
Extensions: []string{
"mod_spatialite",
},
})
db, err := sql.Open("sqlite3_with_extensions", "./map.gpkg")
if err != nil {
panic(err.Error())
}
query := "select AsText(geom) from level0"
rows, err := db.Query(query)
if err != nil {
panic(err.Error())
}
for rows.Next() {
var s []byte
rows.Scan(&s)
fmt.Print(s)
}
First of all, the code I wrote is as above, I want to receive the geom data as text like multipolygon((((......))) , but only an empty array is returned.
Below is what the database looks like, data is stored in multipolygon type
Loading this data into golang returns data like the picture below
I want text like multipolygon ((((......))) , not datatype like above, but I don't know how to do it,
I have loaded extended spatialite into sqlite3 and loaded data through astext, but an empty array is returned as [], [], [] . How can I return the multipolygon text I want? Any help would be appreciated
Try this:
package main
import (
"database/sql"
"log"
"github.com/twpayne/go-geom/encoding/wkb"
"github.com/twpayne/go-geom/encoding/wkt"
_ "github.com/mattn/go-sqlite3"
)
func main() {
db, err := sql.Open("sqlite3", "./gadm36_levels.gpkg")
if err != nil {
log.Fatal(err)
}
rows, err := db.Query("select geom from level0 limit 1")
if err != nil {
log.Fatal(err)
}
defer rows.Close()
for rows.Next() {
var b []byte
var mp wkb.MultiPolygon
if err := rows.Scan(&b); err != nil {
log.Fatal(err)
}
if err := mp.Scan(b[40:]); err != nil {
log.Fatal(err)
}
log.Printf("%+v", *mp.MultiPolygon)
text, err := wkt.Marshal(mp.MultiPolygon)
if err != nil {
log.Fatal(err)
}
log.Printf("%v\n", text)
}
}
40 is offset of WKB block.