与えられた複数の地点の中からランダムに1つを選択し、その地点を中心として半径500メートルの円内にランダムな地点を生成します

//	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)
}

2024,江端さんの技術メモ

Posted by ebata