GolangでOSMファイルから、<tag k="highway" v="bus_stop"/>が入っているnode情報と、その中にあるtag k="name"の情報を出して
と、ChatGPTに頼んだら、サクッと作ってくれました。
package main
import (
"encoding/xml"
"fmt"
"io/ioutil"
"log"
"os"
)
type Osm struct {
XMLName xml.Name `xml:"osm"`
Nodes []Node `xml:"node"`
}
type Node struct {
XMLName xml.Name `xml:"node"`
Lat string `xml:"lat,attr"`
Lon string `xml:"lon,attr"`
Tags []Tag `xml:"tag"`
}
type Tag struct {
XMLName xml.Name `xml:"tag"`
Key string `xml:"k,attr"`
Value string `xml:"v,attr"`
}
func main() {
// XMLファイルの読み込み
xmlFile, err := os.Open("tsuzuki.osm")
if err != nil {
log.Fatal(err)
}
defer xmlFile.Close()
// XMLデータの読み込み
xmlData, err := ioutil.ReadAll(xmlFile)
if err != nil {
log.Fatal(err)
}
var osm Osm
// XMLデータのUnmarshal
err = xml.Unmarshal(xmlData, &osm)
if err != nil {
log.Fatal(err)
}
// <tag k="highway" v="bus_stop"/> のノード情報を表示
for _, node := range osm.Nodes {
hasBusStopTag := false
var busStopName string
// ノード内のタグ情報を探索
for _, tag := range node.Tags {
if tag.Key == "highway" && tag.Value == "bus_stop" {
hasBusStopTag = true
}
if tag.Key == "name" {
busStopName = tag.Value
}
}
if hasBusStopTag {
fmt.Printf("Bus Stop Name: %s, Lat: %s, Lon: %s\n", busStopName, node.Lat, node.Lon)
//fmt.Printf("%s, %s,%s\n", busStopName, node.Lat, node.Lon)
}
}
}
>go run bus_stop2.go
Bus Stop Name: 川和町, Lat: 35.5341695, Lon: 139.5461286
Bus Stop Name: 川和町, Lat: 35.5344793, Lon: 139.5458792
Bus Stop Name: 東名江田, Lat: 35.5628753, Lon: 139.5577658
Bus Stop Name: 石橋, Lat: 35.5209186, Lon: 139.5571699
Bus Stop Name: 桜通り, Lat: 35.5677990, Lon: 139.5446995
Bus Stop Name: 鶴蒔橋, Lat: 35.5496160, Lon: 139.5451910
Bus Stop Name: 鶴蒔橋, Lat: 35.5491291, Lon: 139.5461293
Bus Stop Name: 泉公園, Lat: 35.5480514, Lon: 139.5475269
Bus Stop Name: 市ヶ尾中学校前, Lat: 35.5468751, Lon: 139.5464900
Bus Stop Name: 市ヶ尾中学校前, Lat: 35.5468380, Lon: 139.5466080