// c:\users\ebata\tomioka3b\src\others\main45.go
/*
このプログラムは、与えられた複数の地点の中からランダムに1つを選択し、その地点を中心として半径500メートルの円内にランダムな地点を生成します。
Point 構造体: 緯度と経度を表す構造体です。
main 関数:
与えられた複数の地点のリストを作成します。
ランダムに1つの地点を選択します。
選択された地点を中心として、generateRandomPointInCircle 関数を使用して半径500メートルの円内にランダムな地点を生成します。
生成されたランダムな地点の緯度と経度を出力します。
generateRandomPointInCircle 関数:
中心となる地点と半径を受け取ります。
ランダムな角度と距離を生成し、それらを使用して円内のランダムな地点の緯度と経度を計算します。
計算された緯度と経度を持つ地点を返します。
degToRad 関数:
度をラジアンに変換するためのユーティリティ関数です。
このプログラムは、与えられた地点の中からランダムに1つを選択し、その地点を中心として半径500メートルの円内にランダムな地点を生成することで、地理空間データを扱うための基本的な方法を示しています。
*/
package main
import (
"fmt"
"math"
"math/rand"
"time"
)
type Point struct {
Name string
Latitude float64
Longitude float64
min2Tomioka float64
}
func main() {
// 与えられた複数の点(駅の座標)
points := []Point{
{"日暮里", 35.72810551475649, 139.77065214505967, 73}, // 日暮里
{"鶯谷", 35.72147285483459, 139.77803484630024, 63}, // 鶯谷
{"上野", 35.71419330617392, 139.7774413019538, 57}, // 上野
{"御徒町", 35.70752513412557, 139.7748544863164, 67}, // 御徒町
{"秋葉原", 35.6983999333567, 139.77290571388025, 65}, // 秋葉原
{"お茶の水", 35.69977763102643, 139.76447338219248, 61}, // お茶の水
{"水道橋", 35.7020483726974, 139.75337286940393, 66}, // 水道橋
{"神田", 35.691843953947895, 139.77075286750426, 63}, // 神田
{"東京", 35.68127103173912, 139.76691023873528, 57}, // 東京
{"有楽町", 35.67504451109795, 139.7629009441794, 59}, // 有楽町
{"新橋", 35.6663876890884, 139.7580715945385, 55}, // 新橋
{"浜松町", 35.65538959029243, 139.75707527127187, 54}, // 浜松町
{"田町", 35.64573607270807, 139.7475731442898, 54}, // 田町
{"品川", 35.628479993237924, 139.73869534241823, 43}, // 品川
{"北品川", 35.62204337901307, 139.73929378869565, 50}, // 北品川
{"青物横丁", 35.616530476669595, 139.74147241132803, 49}, // 新馬場
{"青物横丁", 35.6089113073848, 139.74314516357873, 45}, // 青物横丁
{"鮫洲", 35.60505014227371, 139.74226998316405, 50}, // 鮫洲
{"立会川", 35.598565208786674, 139.73893538884946, 50}, // 立会川
{"大森海岸", 35.58770513004266, 139.73546417819148, 51}, // 大森海岸
{"平和島", 35.578786612348516, 139.7348957122944, 40}, // 平和島
{"大森町", 35.572470928220454, 139.73209389290315, 53}, // 大森町
{"梅屋敷", 35.56680589146817, 139.7282405712228, 53}, // 梅屋敷
{"京急蒲田", 35.561346378009084, 139.72413782845052, 33}, // 京急蒲田
{"雑色", 35.549501628543595, 139.71492252305998, 38}, // 雑色
{"六郷土手", 35.540534565682265, 139.70758227692838, 34}, // 六郷土手
{"糀谷", 35.55475500818507, 139.72947450479222, 40}, // 糀谷
{"大鳥居", 35.55230710920823, 139.74016209480337, 45}, // 大鳥居
{"穴守稲荷", 35.550433498630504, 139.7467475129522, 46}, // 穴守稲荷
{"天空橋", 35.549323611239814, 139.75367380680967, 46}, // 天空橋
{"京急川崎", 35.5330130222155, 139.70085261643172, 30}, // 京急川崎
{"小島新田", 35.53497952289224, 139.74753015189842, 42}, // 小島新田
{"八丁畷", 35.523294588264044, 139.69182471487903, 41}, // 八丁畷
{"鶴見市場", 35.51795110131048, 139.68654897642313, 40}, // 鶴見市場
{"京急鶴見", 35.507313116366205, 139.67793452856546, 34}, // 京急鶴見
{"花月総持寺", 35.50045335293103, 139.67299835084395, 31}, // 花月総持寺
{"生麦", 35.49532037586162, 139.66697084291033, 30}, // 生麦
{"京急新子安", 35.48709301222138, 139.6554644900453, 29}, // 京急新子安
{"子安", 35.484595747125226, 139.64499414507037, 32}, // 子安
{"神奈川新町", 35.48089584236831, 139.63961808116608, 26}, // 神奈川新町
{"京急東神奈川", 35.47728484644749, 139.63437152522133, 30}, // 京急東神奈川
{"神奈川", 35.471042823081326, 139.62708525622278, 32}, // 神奈川
{"京急横浜", 35.465974566273886, 139.6218737093478, 20}, // 京急横浜
{"戸部", 35.45669353999209, 139.61954391949988, 27}, // 戸部
{"日ノ出町", 35.445535830399635, 139.62677764713118, 25}, // 日ノ出町
{"黄金町", 35.4398051861557, 139.6228192707623, 24}, // 黄金町
{"南太田", 35.43704871593425, 139.61413963595152, 18}, // 南太田
{"井土ヶ谷", 35.434049908914936, 139.6013697675809, 16}, // 井土ヶ谷
{"弘明寺", 35.424392517088215, 139.59679056178064, 17}, // 弘明寺
{"上大岡", 35.409119230795824, 139.59658257505384, 14}, // 上大岡
{"屏風浦", 35.394628914972444, 139.61025512796533, 10}, // 屏風浦
{"杉田", 35.38359625400674, 139.6158614781421, 3}, // 杉田
{"京急富岡", 35.36713079862617, 139.6298755067998, 0}, // 京急富岡
{"能見台", 35.36088096572114, 139.62943901110575, 1}, // 能見台
{"京急金沢文庫", 35.34283976967888, 139.62161382892742, 3}, // 京急金沢文庫
{"金沢八景", 35.33143644664979, 139.62019186432977, 6}, // 金沢八景
{"野島公園", 35.33057520638215, 139.63154448609114, 17}, // 野島公園
{"海の公園南口", 35.337221851530074, 139.63203843792144, 18}, // 海の公園南口
{"海の公園芝口", 35.34207978297347, 139.6357948657779, 18}, // 海の公園芝口
{"八景島", 35.34081263381398, 139.64082413734104, 20}, // 八景島
{"六浦", 35.32276335943298, 139.61123194142903, 13}, // 六浦
{"神武寺", 35.306362422782364, 139.59316695868543, 19}, // 神武寺
{"逗子・葉山", 35.29593435944306, 139.5811992373588, 31}, // 逗子・葉山
{"追浜", 35.3158514243523, 139.62481670534095, 15}, // 追浜
{"京急田浦", 35.30091271311823, 139.62553483073157, 16}, // 京急田浦
{"安針塚", 35.28681218160922, 139.64296751736376, 17}, // 安針塚
{"逸見", 35.28064334099864, 139.6528184088048, 21}, // 逸見
{"汐入", 35.280307747849356, 139.6624959442711, 19}, // 汐入
{"横須賀中央", 35.27868971431925, 139.6700294865965, 20}, // 横須賀中央
{"県立大学", 35.27046934794596, 139.6765472421848, 26}, // 県立大学
{"堀ノ内", 35.263578813428, 139.68674190193195, 23}, // 堀ノ内
{"新大津", 35.25692239324099, 139.69014415109714, 23}, // 新大津
{"北久里浜", 35.2497686048071, 139.68628696286345, 25}, // 北久里浜
{"浦賀", 35.250938172839675, 139.71498764424754, 30}, // 浦賀
{"京急久里浜", 35.231585086558596, 139.7022284815838, 29}, // 京急久里浜
{"YRP野比", 35.21207247285571, 139.68500815775707, 33}, // YRP野比
{"京急長沢", 35.20555570645748, 139.67414472893097, 44}, // 京急長沢
{"津久井浜", 35.19868000571067, 139.66570472891374, 37}, // 津久井浜
{"三浦海岸", 35.188117336673066, 139.65328211521543, 39}, // 三浦海岸
{"三崎口", 35.17752001890131, 139.633171976671, 42}, // 三崎口
}
// ランダムな点を選択
rand.Seed(time.Now().UnixNano())
for i := 0; i < 1000; i++ {
randomIndex := rand.Intn(len(points))
center := points[randomIndex]
// 中心点から半径500メートルの円内にランダムな点を生成
randomPoint := generateRandomPointInCircle(center, 500)
//fmt.Printf("Random Point in Circle: Latitude=%f, Longitude=%f\n", randomPoint.Latitude, randomPoint.Longitude)
fmt.Printf("%f, %f\n", randomPoint.Latitude, randomPoint.Longitude)
}
}
func generateRandomPointInCircle(center Point, radius float64) Point {
// ランダムな角度を生成
randAngle := rand.Float64() * 2 * math.Pi
//fmt.Printf("randAngle=%f\n", randAngle)
// ランダムな距離を生成
randDistance := math.Sqrt(rand.Float64()) * radius
//fmt.Printf("randDistance=%f\n", randDistance)
// ランダムな点の座標を計算
randLat := center.Latitude + (randDistance/6371000.0)*(180/math.Pi)*(math.Cos(randAngle))
randLon := center.Longitude + (randDistance/6371000.0)*(180/math.Pi)*(math.Sin(randAngle))/(math.Cos(degToRad(center.Latitude)))
return Point{Latitude: randLat, Longitude: randLon}
}
func degToRad(deg float64) float64 {
return deg * (math.Pi / 180)
}
与えられた複数の地点の中からランダムに1つを選択し、その地点を中心として半径500メートルの円内にランダムな地点を生成します
sudo update、sudo upgradeでコケたときは、時刻を疑ってみる。
sudo apt update
をやったのですが、
E: Release file for http://ports.ubuntu.com/ubuntu-ports/dists/jammy-updates/InRelease is not valid yet (invalid for another 8時間 53分 33秒). Updates for this repository will not be applied.
E: Release file for http://ports.ubuntu.com/ubuntu-ports/dists/jammy-security/InRelease is not valid yet (invalid for another 9時間 9分 22秒). Updates for this repository will not be applied.
などと言われてしまいました。
で、しらべてみたら、
- システム時刻を確認する: 時々、システムの時刻が間違っている場合にもこのエラーが発生することがあります。システムの時刻が正しいことを確認してください
てなことをいわれたので、以下の処理で対応しました。
sudo timedatectl set-timezone Asia/Tokyo
sudo apt install ntp
とりあえず、今回は、これで上手く対応できたようです。
「Raspberry Pi 4でUbuntuデスクトップを動かして遊ぶ」を参考にしてvscodeをインストールしてみた件
昨夜、8台目のディスプレイと6台目のカメラが搬入されました。個人デートレーダに匹敵する環境になったような気がします。
気分は、学生のころは、研究室に寝袋持ち込んで、コーディングしたいたものですが −− リタイアを目前としたシニアエンジニアとは思えない状況です(と、この内容を打ち込んでいる最中も、バックエンドで、”sudo apt upgrade”が動き続けています)。
で、
Raspberry Pi 4でUbuntuデスクトップを動かして遊ぶ
を、参考にさせていただいて、vscodeをインストールしてみたのですが、普通に動く。
結構びっくりしています。
これからは、ディスプレイがあるところ(会社とか研究室)なら、ラズパイ4を持ち歩くだけで、十分かもしれません。
とりあえず拡張機能として、当然に
Japanese Language Pack for Visual Studio Code
をインストール。
で、文章作成環境も必須なので、こちらもインストールしておく
vscodeでMarkdownを使って文章を書いている時、図面のコピペを文書の中にサクっと入れることができるアドイン "Paste Image"
2台目のラズパイ用にメモとして残しています。
ChatGPTに頼んで、CSVファイルからPostgresqlのテーブルのスキーマーを作って貰う方法
postgresql 漢字
PostgreSQLで漢字を使えるようにするには、いくつかのステップがあります。
- データベースのエンコーディングを設定する: データベースのエンコーディングをUTF-8に設定します。UTF-8は、多言語の文字をサポートするための広く使われているエンコーディングです。データベースを作成する際に、以下のように指定します。
sql
CREATE DATABASE your_database_name ENCODING 'UTF8';
- csvファイルもUTF8にして、
tomioka_pt2018=# \copy stn from 'stn.csv' delimiter ',' csv header encoding 'UTF-8';
にする。 - で、
oid | name | folderpath | popupinfo | point_x | point_y | zoneflag
-----+--------------------------+------------+-----------+-------------+------------+----------
1 | □□□}□x□□ | Code_Stn | 700001 | 139.6298946 | 35.3670993 | 2
2 | □V□□□c | Code_Stn | 700002 | 139.619429 | 35.386768 | 2
3 | □□□c | Code_Stn | 700003 | 139.6159047 | 35.3835577 | 2
4 | □\□□□□ | Code_Stn | 700004 | 139.629443 | 35.3608848 | 2
5 | □w□|□□□w | Code_Stn | 700005 | 139.685247 | 35.628743 | 1とこんなザマになるんだけど、SQL(shell)を使うと、
oid | name | folderpath | popupinfo | point_x | point_y | zoneflag
-----+--------------------------+------------+-----------+-------------+------------+----------
1 | 京急富岡 | Code_Stn | 700001 | 139.6298946 | 35.3670993 | 2
2 | 新杉田 | Code_Stn | 700002 | 139.619429 | 35.386768 | 2
3 | 杉田 | Code_Stn | 700003 | 139.6159047 | 35.3835577 | 2
4 | 能見台 | Code_Stn | 700004 | 139.629443 | 35.3608848 | 2
5 | 学芸大学 | Code_Stn | 700005 | 139.685247 | 35.628743 | 1
6 | 旗の台 | Code_Stn | 700006 | 139.7027206 | 35.6048821 | 1
7 | 恵比寿 | Code_Stn | 700007 | 139.7101065 | 35.6467334 | 1
8 | 国立競技場 | Code_Stn | 700008 | 139.7143886 | 35.6797457 | 1と、ちゃんと出るんだな、
これが。クライアントの問題だけならいいんだど
に解決策が書いてありました。
yoko_db=# set client_encoding to utf8;
SET
yoko_db=# \encoding
UTF8
As:SQL でも表示されました。
csvファイルの中にすでに緯度、経度情報が含まれている場合にDBを作成する方法
SAIで白黒反転させるにはどうしたらいいですか?
「レイヤ」→「輝度を透明度に変換」→不透明度保護にチェック → 白で塗りつぶし(バケツ)
上記のレイヤーの下に新規レイヤー→黒で塗りつぶし
tcの基本的コマンド
■tcを使って帯域を10Mbpsに制限する"だけ"のコマンド
sudo tc qdisc add dev eth0 root tbf rate 10mbit burst 10kb latency 100ms
(burst 10kb latency 100msを付けないと、エラーになる)
■tcを使って遅延を500msに制限するだけのtcコマンド
sudo tc qdisc add dev eth0 root netem delay 500ms
■tcを使ってパケットロスを10%に制限する"だけ"のコマンド
sudo tc qdisc add dev eth0 root netem loss 10%
■tcを使ってパケットを保持できるキューの最大数を1000に制限する"だけ"のコマンド
sudo tc qdisc change dev eth0 root handle 1: pfifo limit 1000
change
: 既存のキューイング方式を変更する際に使用されるオプションです。dev eth0
: 変更を加える対象となるネットワークインターフェースを指定します。この場合はeth0
です。root
: ルートキュー(ルートディスクリプタ)に変更を加えることを示します。handle 1:
: ルートキューを特定するためのハンドルを指定します。1:
は一般的にルートキューを表します。pfifo
: パケットを先入先出順で処理する単純なキューイング方式です。limit 1000
: パケットを保持できるキューの最大数を指定します。ここでは1000としています。
分類 | qdiscの名前 | カーネルソースファイルの場所 | 概要 |
---|---|---|---|
クラスレス qdisc | pfifo_fast | net/sched/sch_generic.c | デフォルトのqdiscです。FIFOのキューが3つあります |
pfifo | net/sched/sch_fifo.c | FIFOのキューが1つあります。キュー長の最大値はパケット数で表します | |
bfifo | 同上 | FIFOのキューが1つあります。 キュー長の最大値はバイト数で表します | |
sfq(Stochastic Fairness Queueing) | net/sched/sch_sfq.c | フローにもとづいてパケットをスケジューリングします。フローとは送信元/送信先のIPアドレス、ポート番号の組です | |
tbf(Token Bucket Filter) | net/sched/sch_tbf.c | パケットシェーピング機能を提供します。制限レートを超えたパケットはキューに保留されます | |
netem(Network Emulator) | net/sched/sch_netem.c | 送信パケットに対して、パケット廃棄、遅延等の操作をするためのqdiscです | |
fq(Fair Queue Packet Schedule) | net/sched/sch_fq.c | Fair Queue Packet Scheduler (per flow pacing) | |
クラスフル qdisc | prio | net/sched/sch_prio.c | ルールにしたがってパケットを分類(class)します。デフォルトでは3つのクラスがあります。それぞれのクラスにqdisc(sfq,tbf等)を設定することができます。 |
htb(Hierarchy Token Bucket) | net/sched/sch_htb.c | 1つのリンクを複数のサービス(www,ftp等)で共有する場合、各サービスに最低限必要な帯域を割り当てることができます |
計測は、iperf3で行う
■sudo tc qdisc add dev eth0 root tbf rate 10mbit burst 10kb latency 100ms このコマンドにパケットロス10%を追加して下さい
指定されたファイルから時刻表を読み込み、最も近い未来の時刻を取得します。
/*
c:\Users\ebata\tomioka3b\others\main42.go
指定されたファイルから時刻表を読み込み、最も近い未来の時刻を取得します。
*/
package main
import (
"bufio"
"fmt"
"os"
"strings"
"time"
)
func main() {
// 指定されたファイル名
fileName := "To_Sengakuzi_weekdays.csv" // ここにファイル名を入力してください
// 指定されたファイルから時刻表を読み込む
schedule, err := readScheduleFromFile(fileName)
if err != nil {
fmt.Println("Error:", err)
return
}
//fmt.Println("時刻表:", schedule)
// 現在時刻を取得
now := time.Now().Format("15:04:05")
now = "12:29:00"
// 最も近い未来の時刻を取得
nextTime := getNextTime(schedule, now)
// 結果を出力
fmt.Println("最も近い未来の時刻:", nextTime)
}
func readScheduleFromFile(fileName string) ([]time.Time, error) {
// ファイルを開く
file, err := os.Open(fileName)
if err != nil {
return nil, err
}
defer file.Close()
var schedule []time.Time
// ファイルから時刻を読み取る
scanner := bufio.NewScanner(file)
for scanner.Scan() {
line := scanner.Text()
times := strings.Split(line, ",")
for _, t := range times {
//fmt.Println("時刻:", t)
t1, err := time.Parse("15:04:05", t)
if err != nil {
fmt.Println("時刻のパースに失敗しました:", err)
return nil, err
}
schedule = append(schedule, t1)
}
}
// fmt.Println("pass4")
// fmt.Println("schedule: ", schedule)
return schedule, nil
}
// 指定された時刻表から最も近い未来の時刻を取得する関数
func getNextTime(schedule []time.Time, inputTime string) string {
// 入力時刻のパース
input, err := time.Parse("15:04:05", inputTime)
if err != nil {
panic(err)
}
// 時刻表の各時刻との差を計算し、最小の差を見つける
minDiff := time.Hour * 24
var nextTime string
for _, t := range schedule {
// 時刻の差を計算
diff := t.Sub(input)
// 負の差(過去の時刻)を無視
if diff < 0 {
continue
}
// 最小の差を更新
if diff < minDiff {
minDiff = diff
nextTime = t.Format("15:04:05")
}
}
return nextTime
}
To_Sengakuzi_weekdays.csv
4:53:00
5:08:00,5:23:00,5:32:00,5:44:00,5:55:00
6:03:00,6:14:00,6:26:00,6:33:00,6:40:00,6:44:00,6:49:00,6:53:00,6:59:00
7:04:00,7:09:00,7:14:00,7:19:00,7:26:00,7:30:00,7:37:00,7:46:00,7:52:00,7:58:00
8:06:00,8:14:00,8:21:00,8:26:00,8:33:00,8:41:00,8:47:00,8:54:00
9:02:00,9:10:00,9:21:00,9:31:00,9:41:00,9:53:00
10:03:00,10:13:00,10:24:00,10:33:00,10:44:00,10:53:00
11:04:00,11:13:00,11:24:00,11:32:00,11:44:00,11:53:00
12:04:00,12:13:00,12:24:00,12:33:00,12:44:00,12:53:00
13:04:00,13:13:00,13:24:00,13:33:00,13:44:00,13:53:00
14:04:00,14:13:00,14:24:00,14:33:00,14:43:00,14:52:00
15:02:00,15:12:00,15:22:00,15:31:00,15:41:00,15:52:00
16:01:00,16:10:00,16:20:00,16:31:00,16:42:00,16:53:00
17:02:00,17:13:00,17:23:00,17:34:00,17:43:00,17:53:00,17:59:00
18:12:00,18:19:00,18:28:00,18:38:00,18:48:00,18:57:00
19:08:00,19:18:00,19:26:00,19:36:00,19:46:00,19:55:00
20:06:00,20:16:00,20:27:00,20:36:00,20:46:00,20:56:00
21:08:00,21:15:00,21:18:00,21:29:00,21:39:00,21:50:00
22:01:00,22:11:00,22:21:00,22:26:00,22:38:00,22:53:00
23:12:00,23:33:00,23:54:00
2次元スプライン関数を使用して、緯度と経度のペアに対応する目的地までの時間を計算
/*
c:\users\ebata\tomioka3b\src\others\main41.go
2次元スプライン関数を使用して、緯度と経度のペアに対応する目的地までの時間を計算します。
*/
package main
import (
"fmt"
"sort"
)
// スプライン補間用の関数
func splineInterpolation(dataSet [][]float64) func(float64, float64) float64 {
n := len(dataSet)
// xの値を昇順にソートする
sort.Slice(dataSet, func(i, j int) bool {
return dataSet[i][0] < dataSet[j][0]
})
// トリディアゴナル行列を作成
h := make([]float64, n-1)
for i := 0; i < n-1; i++ {
h[i] = dataSet[i+1][0] - dataSet[i][0]
}
// 2階微分の値を計算
delta := make([]float64, n)
for i := 1; i < n-1; i++ {
delta[i] = (dataSet[i+1][1]-dataSet[i][1])/h[i] - (dataSet[i][1]-dataSet[i-1][1])/h[i-1]
}
// トリディアゴナル行列を解く
m := make([]float64, n)
l := make([]float64, n)
zArray := make([]float64, n)
l[0] = 1
for i := 1; i < n-1; i++ {
l[i] = 2*(dataSet[i+1][0]-dataSet[i-1][0]) - h[i-1]*m[i-1]
m[i] = h[i] / l[i]
zArray[i] = (delta[i] - h[i-1]*zArray[i-1]) / l[i]
}
l[n-1] = 1
zArray[n-1] = 0
c := make([]float64, n)
b := make([]float64, n)
d := make([]float64, n)
for j := n - 2; j >= 0; j-- {
c[j] = zArray[j] - m[j]*c[j+1]
b[j] = (dataSet[j+1][1]-dataSet[j][1])/h[j] - h[j]*(c[j+1]+2*c[j])/3
d[j] = (c[j+1] - c[j]) / (3 * h[j])
}
// 補間関数を返す
return func(xVal, yVal float64) float64 {
// xの範囲を確認
if xVal < dataSet[0][0] || xVal > dataSet[n-1][0] {
panic("x value is out of range")
}
// 対応するiを探す
i := 0
for i < n-1 && dataSet[i+1][0] <= xVal {
i++
}
// スプライン補間を計算
dx := xVal - dataSet[i][0]
return dataSet[i][2] + b[i]*dx + c[i]*dx*dx + d[i]*dx*dx*dx
}
}
func main() {
// データ点の定義
dataSet := [][]float64{
{35.7281578, 139.7680665, 73},
{35.7214573, 139.7754384, 63},
{35.7141672, 139.7748342, 57},
{35.7075171, 139.7564025, 67},
{35.698383, 139.7704968, 65},
{35.6997175, 139.7618655, 61},
{35.7020484, 139.7509267, 66},
{35.6918216, 139.7683569, 63},
{35.6812362, 139.7645499, 57},
{35.6750133, 139.7604455, 59},
{35.666379, 139.7557649, 55},
{35.6553809, 139.754554, 54},
{35.6457361, 139.7449875, 54},
{35.6284713, 139.7361848, 43},
{35.6208763, 139.7405387, 50},
{35.6147448, 139.7412068, 49},
{35.6086671, 139.7426731, 45},
{35.6052508, 139.7421627, 50},
{35.5983959, 139.7391046, 50},
{35.58754, 139.7355111, 51},
{35.5788485, 139.7348961, 40},
{35.5721351, 139.7318494, 53},
{35.5666392, 139.7281759, 53},
{35.5613144, 139.7215761, 33},
{35.5446458, 139.7493338, 46},
{35.5329877, 139.6982966, 30},
{35.5348941, 139.7449763, 42},
{35.5229857, 139.6889874, 41},
{35.5179115, 139.6811867, 40},
{35.5071467, 139.677526, 34},
{35.4998507, 139.6713032, 31},
{35.4923606, 139.6622968, 30},
{35.4852628, 139.6544734, 29},
{35.4846744, 139.6452731, 32},
{35.4808759, 139.6394986, 26},
{35.4763238, 139.631979, 30},
{35.4688634, 139.6268306, 32},
{35.4659811, 139.6194871, 20},
{35.4571602, 139.6199226, 27},
{35.4464751, 139.6235656, 25},
{35.436673, 139.6217708, 24},
{35.4334892, 139.6206713, 18},
{35.4314711, 139.6030542, 16},
{35.424238, 139.5927802, 17},
{35.4201765, 139.586678, 14},
{35.413768, 139.582819, 10},
{35.3819518, 139.6165374, 3},
{35.4091204, 139.5781752, 7},
{35.3966138, 139.6051573, 4},
{35.3645904, 139.6267988, 1},
{35.3428573, 139.6190711, 3},
{35.3314185, 139.6176347, 6},
{35.330416, 139.6295796, 17},
{35.3337822, 139.630869, 18},
{35.3407534, 139.6332478, 18},
{35.3400425, 139.6390968, 20},
{35.323276, 139.6151587, 13},
{35.2973885, 139.5758056, 31},
{35.3158184, 139.6222558, 15},
{35.312573, 139.6250891, 16},
{35.308405, 139.628248, 17},
{35.2825803, 139.6405151, 19},
{35.2916167, 139.6283632, 17},
{35.277848, 139.6379121, 21},
{35.2802815, 139.6599103, 19},
{35.2786985, 139.6674653, 20},
{35.2616259, 139.6679659, 26},
{35.2635438, 139.6841348, 23},
{35.2482969, 139.6775595, 25},
{35.2509382, 139.712402, 30},
{35.2315701, 139.699661, 29},
{35.2120725, 139.6824547, 33},
{35.2055645, 139.671602, 44},
{35.1986888, 139.663162, 37},
{35.1880928, 139.6507295, 39},
{35.1775554, 139.6306392, 42},
}
// スプライン補間関数を作成
interpolatedFunction := splineInterpolation(dataSet)
// 特定の座標で補間された値を計算
xValue := 35.4688634
yValue := 139.6268306
xValue, yValue = 35.7214573, 139.7754384
interpolatedValue := interpolatedFunction(xValue, yValue)
// 結果の出力
fmt.Printf("補間された値: %.2f\n", interpolatedValue)
}