Golangで、以下のXML分の中から、<tag k="route" v="bus"/>を発見した時に、refの要素を参照にして位置情報を取り出すプログラムを書いて
<osm>
<node id="2197214759" lat="35.5714149" lon="139.5880043" version="1" timestamp="2013-03-12T09:31:19Z" changeset="15336763" uid="1258339" user="k___0e0">
<tag k="highway" v="bus_stop"/>
<tag k="name" v="有馬第二団地前"/>
</node>
<node id="2197214762" lat="35.5715628" lon="139.5875429" version="1" timestamp="2013-03-12T09:31:19Z" changeset="15336763" uid="1258339" user="k___0e0">
<tag k="highway" v="bus_stop"/>
<tag k="name" v="有馬第二団地前"/>
</node>
<relation id="2814953" version="38" timestamp="2023-06-14T08:20:58Z" changeset="137316398" uid="1687166" user="U20">
<member type="node" ref="2197214759" role="backward_stop"/>
<member type="node" ref="2197214762" role="forward_stop"/>
<tag k="route" v="bus"/>
</relation>
</osm>
ChatGPTの回答
指定されたXMLデータから を検出し、それに対応する ref 要素を参照にして位置情報を取得するGolangのプログラムを以下に示します。このプログラムは、encoding/xml パッケージを使用してXMLを解析します。
package main
import (
"encoding/xml"
"fmt"
"log"
"strings"
)
type OSM struct {
XMLName xml.Name `xml:"osm"`
Nodes []Node `xml:"node"`
Relations []Relation `xml:"relation"`
}
type Node struct {
ID int64 `xml:"id,attr"`
Lat float64 `xml:"lat,attr"`
Lon float64 `xml:"lon,attr"`
Tags []Tag `xml:"tag"`
}
type Relation struct {
ID int64 `xml:"id,attr"`
Members []Member `xml:"member"`
Tags []Tag `xml:"tag"`
}
type Member struct {
Type string `xml:"type,attr"`
Ref string `xml:"ref,attr"`
Role string `xml:"role,attr"`
}
type Tag struct {
K string `xml:"k,attr"`
V string `xml:"v,attr"`
}
func main() {
xmlData := `
<osm>
<node id="2197214759" lat="35.5714149" lon="139.5880043" version="1" timestamp="2013-03-12T09:31:19Z" changeset="15336763" uid="1258339" user="k___0e0">
<tag k="highway" v="bus_stop"/>
<tag k="name" v="有馬第二団地前"/>
</node>
<node id="2197214762" lat="35.5715628" lon="139.5875429" version="1" timestamp="2013-03-12T09:31:19Z" changeset="15336763" uid="1258339" user="k___0e0">
<tag k="highway" v="bus_stop"/>
<tag k="name" v="有馬第二団地前"/>
</node>
<relation id="2814953" version="38" timestamp="2023-06-14T08:20:58Z" changeset="137316398" uid="1687166" user="U20">
<member type="node" ref="2197214759" role="backward_stop"/>
<member type="node" ref="2197214762" role="forward_stop"/>
<tag k="route" v="bus"/>
</relation>
</osm>
`
var osmData OSM
err := xml.Unmarshal([]byte(xmlData), &osmData)
if err != nil {
log.Fatal(err)
}
for _, relation := range osmData.Relations {
for _, tag := range relation.Tags {
if tag.K == "route" && tag.V == "bus" {
for _, member := range relation.Members {
if member.Type == "node" {
node := getNodeByID(member.Ref, osmData.Nodes)
if node != nil {
fmt.Printf("Bus Stop: %s\n", getNodeName(node))
fmt.Printf("Coordinates: Lat %f, Lon %f\n\n", node.Lat, node.Lon)
}
}
}
}
}
}
}
func getNodeByID(ref string, nodes []Node) *Node {
for _, node := range nodes {
if fmt.Sprintf("%d", node.ID) == ref {
return &node
}
}
return nil
}
func getNodeName(node *Node) string {
for _, tag := range node.Tags {
if tag.K == "name" {
return tag.V
}
}
return ""
}
このプログラムは、与えられたXMLデータから を見つけ、それに関連する ref 要素を参照してバス停の位置情報を取得して表示します。XMLデータは xmlData 変数に直接格納されていますが、実際のプログラムではファイルから読み込むこともできます。コード内のコメントに従って、XMLデータ構造やタグを調整してください。
世界が変わる
生成AIを使わない奴は、"死ぬ" ―― 文字通りの意味で。