Google Mapを頼らずに住所から位置情報を自力で取得できないか調べてみたら簡単にできそうだった。
国土交通省国土政策局が公開しているので、そこから取得したらよさそうです。
GIS
http://nlftp.mlit.go.jp/cgi-bin/isj/dls/_choose_method.cgi
こんな感じ
面倒そうなので、ダウンローダを作ってみた。
上記のスクリーンショットの版数(赤枠のところ)だけ覚えておいてください
以下で、全国の位置情報をダウンロードできるようにしました。
go run main.go 版数 保存先
コードは以下の通り。
ref. https://github.com/usk81/til/tree/master/go/download-japan-gis-data
package main
import (
"fmt"
"io"
"net/http"
"os"
"path/filepath"
)
const urlTemplate = "http://nlftp.mlit.go.jp/isj/dls/data/%s/%02d000-%s.zip"
// e.g. go run main.go 17.0a /home/xxx/gis
func main() {
args := os.Args[1:]
if len(args) <= 1 {
panic(fmt.Errorf("arguments are not enough"))
}
if err := bulkDownload(args[0], args[1]); err != nil {
panic(err)
}
fmt.Println("download finished")
}
func bulkDownload(ver, p string) (err error) {
if ver == "" {
return fmt.Errorf("version is empty")
}
if p == "" {
return fmt.Errorf("download path is empty")
}
for i := 1; i <= 47; i++ {
u := getURL(ver, i)
fp := filepath.Join(p, fmt.Sprintf("%02d000-%s.zip", i, ver))
if err = downloadFile(u, fp); err != nil {
return fmt.Errorf("fail to request : %s", u)
}
}
return nil
}
func downloadFile(u, p string) (err error) {
// Create the file
out, err := os.Create(p)
if err != nil {
return err
}
defer out.Close()
// Get the data
resp, err := http.Get(u)
if err != nil {
return err
}
defer resp.Body.Close()
// Write the body to file
_, err = io.Copy(out, resp.Body)
if err != nil {
return err
}
return nil
}
func getURL(ver string, no int) string {
return fmt.Sprintf(urlTemplate, ver, no, ver)
}