未分類

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を使わない奴は、"死ぬ" ―― 文字通りの意味で。

2023,未分類,江端さんの技術メモ

>osm2pgrouting -f tsuzuki.osm -c mapconfig_for_cars_rail.xml -d tsuzuki_rail -U postgres -h 192.168.0.23 -p 15432 -W password

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <tag_name name="highway" id="1">
    <tag_value name="motorway"          id="101" priority="1.0" maxspeed="130" />
    <tag_value name="motorway_link"     id="102" priority="1.0" maxspeed="130" />
    <tag_value name="motorway_junction" id="103" priority="1.0" maxspeed="130" />
    <tag_value name="trunk"             id="104" priority="1.05" maxspeed="110" />
    <tag_value name="trunk_link"        id="105" priority="1.05" maxspeed="110" />    
    <tag_value name="primary"           id="106" priority="1.15" maxspeed="90" />
    <tag_value name="primary_link"      id="107" priority="1.15" maxspeed="90" />    
    <tag_value name="secondary"         id="108" priority="1.5" maxspeed="90" />
    <tag_value name="secondary_link"    id="109" priority="1.5" maxspeed="90"/>  
    <tag_value name="tertiary"          id="110" priority="1.75" maxspeed="90" />
    <tag_value name="tertiary_link"     id="111" priority="1.75" maxspeed="90" />  
    <tag_value name="residential"       id="112" priority="2.5" maxspeed="50" />
    <tag_value name="living_street"     id="113" priority="3" maxspeed="20" />
    <tag_value name="service"           id="114" priority="2.5" maxspeed="50" />
    <tag_value name="unclassified"      id="117" priority="3" maxspeed="90"/>
    <tag_value name="road"              id="100" priority="5" maxspeed="50" />
  </tag_name> 
  <tag_name name="railway" id="1">
    <tag_value name="subway"              id="101" priority="1.0" maxspeed="40" />
    <tag_value name="rail"              id="101" priority="1.0" maxspeed="40" />
  </tag_name> 
</configuration>

とりあえず、ちゃんと、JRと市営地下鉄が加えられている。

この後は、osmファイルを手作業で加工

街の中に道路を作って、ダイクストラ計算ができるか試してみた件 ―― JOSMを使った道路追加の方法を試す

がんばれ > 自分

 

未分類

JOSMを立ち上げる → osmファイルをドラッグする → 下の図の赤丸の部分をクリックする

下の図の赤丸をクリックする

カラムに、railway=subway と記入する

全部にチェックを入れる

こういう表示になる

ただ、この路線情報のみのセーブができていない
(未完)

未分類

鉄道路線の位置情報が欲しい場合

で、エディタに張りつける。

wkt_geom osm_id name highway waterway aerialway barrier man_made z_order other_tags
LineString (139.646476100000001 35.55342160000000007, 139.64405429999999342 35.55400130000000303, 139.64320960000000582 35.55409010000000336, 139.64267359999999485 35.55411110000000008, 139.64220109999999409 35.55405509999999936, 139.64194380000000706 35.55401379999999989, 139.64170240000001399 35.55397510000000239, 139.63902089999999134 35.55321440000000166, 139.63803740000000175 35.55292430000000081, 139.63748190000001159 35.55269659999999732, 139.63718030000001136 35.55254620000000187, 139.63689350000001355 35.55236419999999953, 139.63660690000000386 35.55215530000000257, 139.63493339999999421 35.55077779999999876, 139.63391659999999206 35.55019589999999852, 139.63362749999998869 35.55004329999999868, 139.63279969999999253 35.54961260000000323, 139.63221790000000055 35.54929349999999744, 139.63160369999999944 35.54899890000000084, 139.63125759999999786 35.54887020000000319, 139.63085000000000946 35.54871740000000102, 139.630045999999993 35.54843460000000022, 139.62955180000000155 35.54831149999999695, 139.62913320000001249 35.54824239999999946, 139.62852749999998991 35.54819439999999986, 139.62814629999999738 35.54818490000000253, 139.62771179999998594 35.54821979999999826, 139.62689000000000306 35.54832940000000008, 139.62461239999998952 35.54861619999999789, 139.6228170999999918 35.54887699999999739, 139.62208190000001196 35.54897940000000034, 139.621440199999995 35.54912439999999663, 139.62113059999998654 35.54921850000000205, 139.62073699999999121 35.54935820000000035, 139.62002659999998855 35.54965870000000194, 139.61967559999999366 35.54979120000000137, 139.61773930000001087 35.55062470000000019, 139.61604349999998931 35.55129320000000348, 139.61544639999999617 35.55153250000000043, 139.61400649999998791 35.55211620000000039, 139.61367699999999559 35.55227090000000345, 139.61328370000001087 35.55248559999999713, 139.61185470000000919 35.55324699999999893, 139.61138819999999328 35.55344060000000184, 139.61112099999999714 35.5535199999999989, 139.61089590000000271 35.55356050000000323, 139.61073719999998843 35.55360360000000242, 139.61040380000000027 35.55367590000000177, 139.60871710000000689 35.55388539999999864, 139.60811019999999871 35.55395479999999964, 139.60749329999998736 35.55399839999999756, 139.60640879999999697 35.55402310000000199, 139.60553089999999088 35.55406709999999748, 139.60464600000000246 35.55415109999999856, 139.604049300000014 35.55422970000000049, 139.60341280000000097 35.55433450000000306, 139.60273129999998787 35.55454660000000189, 139.60238100000000827 35.55471419999999938, 139.60221730000000662 35.55483360000000204, 139.60197869999998943 35.55500659999999868, 139.60174100000000408 35.55521579999999915, 139.60153339999999389 35.55542990000000003, 139.60133149999998636 35.55568569999999795, 139.60023530000000846 35.55735479999999882, 139.59981210000000829 35.55783720000000159, 139.59957539999999199 35.55808329999999984, 139.59932749999998691 35.55827450000000312, 139.59904430000000275 35.5584891999999968, 139.59858829999998875 35.55877279999999985, 139.597627899999992 35.55933660000000174, 139.59693609999999353 35.55972859999999969, 139.59623609999999871 35.56005269999999996, 139.59570759999999723 35.56026099999999701, 139.59530820000000517 35.56040039999999891, 139.59489759999999592 35.56054460000000006, 139.59435049999999023 35.56065370000000314, 139.59350760000000946 35.56081749999999886, 139.59251140000000646 35.56100130000000092, 139.59232270000001108 35.56102899999999778, 139.59212709999999902 35.5610691999999986, 139.59167899999999918 35.56116870000000318, 139.59126240000000507 35.5611801000000014, 139.5906812000000059 35.56112069999999648, 139.59032650000000331 35.56103509999999801, 139.5901608000000067 35.56098539999999986, 139.58982359999998835 35.56086419999999748, 139.58665070000000696 35.55936580000000191, 139.58363769999999704 35.55796550000000167, 139.58301539999999363 35.55764250000000004, 139.5822108000000128 35.55715810000000232, 139.58148120000001313 35.55673920000000265, 139.58096409999998855 35.55639310000000108, 139.58066579999999135 35.55618929999999978, 139.58024739999999042 35.55579379999999645, 139.57973240000001169 35.55525970000000058, 139.57922490000001403 35.55446140000000099) 230124642 讓ェ豬懷クょ霧蝨ー荳矩延?泌捷邱 -25 "colour"=>"#048D58","electrified"=>"contact_line","frequency"=>"0","layer"=>"-2","name:en"=>"Green Line of Yokohama Municipal Subway","name:es"=>"Lテュnea Verde del Metro Municipal de Yokohama","name:ja"=>"讓ェ豬懷クょ霧蝨ー荳矩延?泌捷邱?","name:zh"=>"讓ェ貊ィ蟶り是4蜿キ郤ソ","operator"=>"讓ェ豬懷ク?","railway"=>"subway","tunnel"=>"yes","voltage"=>"1500"

と、こんな感じで座標は得られる。

 

未分類

最近、イレクターパイプを切断したりしていたのは、実は、「立ちながらパソコンで仕事ができるテーブル」を作成する為でした。

パイプカッター、1500円程度で手に入りました。

リモートワークで運動不足なのですが、今、ウォーキングをすれば、熱中症で死亡しかねません。

「ならば、夜歩けばいい」と思う方も多いと思いますが、それでは「歩き読書」ができません。

彼は実践的なウォーキングリーダーでした。

とすれば、自宅内での運動ですが、現在、「懸垂」「腹筋」はやっているのですが、「歩行」が足りていないです。

そこで、スタンディングワークです。

幸いなことに、私のオフィスは、ディスプレイで一杯ですので、スタンディングワークができる環境になっています。

で、こんな感じに机の上に机を置いて、立ったままで仕事をしています(現在は、一日、1~2時間程度ですが)。

購入したものは以下の、ミニテーブルです。

ところが、この机で作業してみると、実際に4~5cmほど高さが足りず、キーボードの操作に難があることが分かりました。

で、机の上に木板を重ねたりしていたのですが、動かしにくく不便でした。

で、そこで、脚を長くしてやろう、と考えて、

を購入し、

を購入し、さらに、

も購入して、先程、完成しました。

脚部は、私の十八番である「結束バンド」を使っています(色を黒いしておけば、もっと見栄えよかったのですが、手元になかったので)。

意匠(デザイン、見栄え)完全無視の、コスト(値段)と効果のみを追求した、私に相応しい「スタンディングデスク」の完成です。

以上

未分類

未分類

電気代が高い昨今、冷房代や(おそらく今年は冬も寒いだろうから)暖房代を節約する為に、リビングの半分を分ける容量で、カーテンレールを作ってみました。

要領は、こっちと同じです。

部屋に鉄棒を作ってみた

ただ、今、天井裏に上がると高い確率で熱中死する、という確信がありましたので、今回は、こちらを使いました。

壁のネダ(根太)の探す

(ネダ(根太)ではなく、間柱というらしいです)

探知機の方は、あまり役に断たず。針でぶっさす奴の方で、天井をブスブス差していました。

このようにして、ピンで天井の間柱の場所にアタリをつけて、今回はイレクターパイプを用いて、カーテンレールとして使用しました。

しかし、全長、4.5メートルのカーテンレールを、まともに作っていたら、とんでもない金額になるので、ここは工夫で乗り切ることとしました

今回は、1.5メートルのパイプと、3.0メートルのパイプを用いたのですが、3.0メートルのパイプの運搬が大変でした。

我が家のN-BOXには収まり切らず、嫁さんにパイプを手で握ってもらって、バックドアを開けっぱなしにしたまま運搬しました。

 

カーテンレールの変りとなるリングと布を掴むクリップは、ダイソーで手に入れて、カーテンは、こちらの布をAmazonから3つ購入しました(1つを先行購入、のこりの2つは明日届く予定です)。

イレクターパイプは連結せずに、敢えて交差させることにしました。カーテンの開閉部であることと、パイプは連結すると、後でパイプを抜いて、リングとクリップ(の数)を後で交換することができなくなるからです。

パイプの両端は、結束バンドを使って固定しています(結束バンドを切れば、直ぐに外せます)

現在、こんな感じになっています。

本日、完成しました。

敢えて床に接触するようにしました。空気の流れを妨げる為です。

 

イレクターパイプ2本 2700円
内クローム横受け32MMトオシ4つ 3024円
リング15個、クリップ15個  600円
布3枚 5700円
----
合計 12,024円


さて、この金額、何年でペイするか分かりませんが ――

(嫁さんや、娘が)テレビを見るためだけに、リビング全体を冷やしたり温めたりする「うしろめたさ」を払拭する手段としては、悪くない、と思っています。


遮熱効果が思ったほど良くないように思いました。

予算確保ができたら、以下の購入を検討したいと思います。

https://item.rakuten.co.jp/soraciel/p-sheers-002/?scid=af_pc_etc&sc2id=af_109_1_10000237

https://item.rakuten.co.jp/thousandleafshop/lsdgdka03-200/