sharpファイルで得られたバスルートのデータを力づくでosmファイルにする

2023年8月17日

神奈川県のバスルートのsharpファイルをpostGISにインポートする

をやってから、試しに、1つのバスルートのみを、ここから取り出して、

select文の出力をローカルのテキストで保存する方法

とした後、このプログラムで、なんちゃってosmファイルを作成する。

/* 


前処理
bus_route=# \o output.txt
bus_route=# select ST_AsText(geom) from bus_route where gid = 1488;
bus_route=# \o

f:/しゅらばしゅう/有吉先生データ/Transfer(2018)/N07-11_14_GML/
sharp2osm.go

>go run sharp2osm.go ichi-61.txt 20000 > ichi-61.osm

ichi-61.txtの形式は、以下の感じ

MultiLineStringM ((139.53708861000001207 35.55222889000000208 0, 139.5370455599999957 35.55227666999999769 0, 139.53649416999999744 35.55299193999999829 0, 139.53643777999999998 35.55307056000000188 0, 139.53636917000000039 35.55315000000000225 0, 139.53559056000000282 35.55415305999999731 0, 139.53552528000000166 35.5542358300000032 0, 139.53547499999999104 35.5543083299999978 0, 139.53475943999998776 35.55520943999999872 0, 139.53468250000000239 35.55528333000000174 0, 139.53507944000000407 35.55541443999999984 0, 139.53518278000001374 35.55545389000000256 0, 139.53539638999998829 35.55552139000000267 0, 139.53575471999999991 35.55565666999999763 0, 139.5360763600000098 35.55570185999999921 0))

*/

package main

import (
	"bufio"
	"fmt"
	"os"
	"strings"
	"strconv"
)

func main() {

	// ファイルを開く
	filePath := "output.txt" // 実際のファイルパスに置き換えてください
	file, err := os.Open(filePath)
	if err != nil {
		fmt.Println("ファイルを開けませんでした:", err)
		return
	}
	defer file.Close()


	fmt.Println("<?xml version='1.0' encoding='UTF-8'?>")
	fmt.Println("<osm version='0.6' generator='JOSM'>")

	node_id := 20000

	// ファイルを行ごとに読み込み、カンマとスペースでパースする
	scanner := bufio.NewScanner(file)
	for scanner.Scan() {
		line_org := scanner.Text()
		prefix := " MULTILINESTRING M ((" // 切り捨てる最初の文字列
		line := strings.TrimPrefix(line_org, prefix)

		fields := strings.FieldsFunc(line, func(r rune) bool {
			return r == ',' || r == ' ' 
		})



		var lon,lat float64


		// 取得したフィールドを表示
		for i, field := range fields {

			num, _ := strconv.ParseFloat(field, 64)
			// fmt.Println(i, i%3, num)
			
			if i % 3 == 0 {
			   lon = num
			}else if i % 3 == 1{
			   lat = num
			} else if i % 3 == 2{
			   fmt.Printf("  <node id='%d' visible='true'  version='5' lat='%f' lon='%f' />\n", node_id, lat, lon) 
			   node_id++
			   //fmt.Println(lat,",",lon)
			}	

		}
	}

	fmt.Println("  <way id='180000' visible='true' version='5'>")	

	for i:=20000; i<node_id; i++{
		fmt.Printf("    <nd ref='%d' />\n",i) 
	}
	fmt.Printf("        <tag k='highway' v='residential' />")
		
	fmt.Println("  </way>")	
	fmt.Println("</osm>")	



	if err := scanner.Err(); err != nil {
		fmt.Println("ファイル読み込みエラー:", err)
	}
}

で、以下のようなファイルができる。

<?xml version='1.0' encoding='UTF-8'?>
<osm version='0.6' generator='JOSM'>
<node id='20000' visible='true' version='5' lat='35.560912' lon='139.606144' />
<node id='20001' visible='true' version='5' lat='35.561252' lon='139.606062' />
<node id='20002' visible='true' version='5' lat='35.561646' lon='139.605835' />
<node id='20003' visible='true' version='5' lat='35.561736' lon='139.60575' />
(中略)
<way id='180000' visible='true' version='5'>
<nd ref='20000' />
<nd ref='20001' />
<nd ref='20002' />
<nd ref='20003' />
(中略)
<nd ref='20189' />
<tag k='highway' v='residential' />
</way>
</osm>

JOSMでの表示

QGISでの表示

とりあえず、忘れないうちにメモを作成しました。

以上

2023年8月17日2023,江端さんの技術メモ

Posted by ebata