先ずは一番最小のpostGISのコード
// go get github.com/lib/pq を忘れずに
// go run main5.go
package main
import (
"database/sql"
"fmt"
"log"
_ "github.com/lib/pq"
)
func main() {
db, err := sql.Open("postgres", "user=postgres password=password host=localhost port=15432 dbname=utsu_db sslmode=disable")
if err != nil {
log.Fatal("OpenError: ", err)
}
defer db.Close()
rows, err := db.Query("SELECT gid,tag_id,x1 FROM ways")
if err != nil {
log.Fatal(err)
}
// 139.9182893339256, 36.573831584767085
defer rows.Close()
for rows.Next() {
var gid int
var tag_id int
var x1 float64
if err := rows.Scan(&gid, &tag_id, &x1); err != nil {
fmt.Println(err)
}
fmt.Println(gid, tag_id, x1)
}
if err := db.Ping(); err != nil {
log.Fatal("PingError: ", err)
}
}
さて
http://www.kobore.net/diary_techno/?date=20181101
の中の、点(139.9182893339256 36.573831584767085)から半径300メートル以内の全部のノードを、近い順に出せ
を、psqlで出力させると、こんな感じになります。
Golangで実施するとなると、こんなコードになります(select文のコピペで足ります)。
// go get github.com/lib/pq を忘れずに
// go run main5.go
package main
import (
"database/sql"
"fmt"
"log"
_ "github.com/lib/pq"
)
func main() {
db, err := sql.Open("postgres",
"user=postgres password=password host=localhost port=15432 dbname=utsu_db sslmode=disable")
if err != nil {
log.Fatal("OpenError: ", err)
}
defer db.Close()
rows, err := db.Query("SELECT source, x1 as longitude, y1 as latitude, ST_Distance('SRID=4326;POINT(139.9182893339256 36.573831584767085)'::GEOGRAPHY, the_geom) as dist FROM ways WHERE ST_DWithin(the_geom, ST_GeographyFromText('SRID=4326;POINT(139.9182893339256 36.573831584767085)'), 300.0) ORDER BY dist")
if err != nil {
log.Fatal(err)
}
defer rows.Close()
for rows.Next() {
var source int
var longitude float64
var latitude float64
var dist float64
if err := rows.Scan(&source, &longitude, &latitude, &dist); err != nil {
fmt.Println(err)
}
fmt.Println(source, longitude, latitude, dist)
}
if err := db.Ping(); err != nil {
log.Fatal("PingError: ", err)
}
}
出力結果は同じものになります。