{"id":11678,"date":"2023-08-24T15:53:31","date_gmt":"2023-08-24T06:53:31","guid":{"rendered":"https:\/\/wp.kobore.net\/?p=11678"},"modified":"2023-08-24T16:01:33","modified_gmt":"2023-08-24T07:01:33","slug":"post-11678","status":"publish","type":"post","link":"https:\/\/wp.kobore.net\/2023\/08\/24\/post-11678\/","title":{"rendered":"golang\u3067\u3001\u4ee5\u4e0b\u306ebus_stop_modified.csv\u3068\u3044\u3046\u30d5\u30a1\u30a4\u30eb\u540d\u304b\u3089\u8aad\u307f\u53d6\u3063\u305f\u4f4d\u7f6e\u60c5\u5831\u3054\u3068\u306b\u3001\u4ee5\u4e0b\u306etest.osm\u30d5\u30a1\u30a4\u30eb\u306enode\u306b\u8a18\u8f09\u3055\u308c\u305f\u4f4d\u7f6e\u60c5\u5831\u306850\u30e1\u30fc\u30c8\u30eb\u4ee5\u5185\u306enode\u3068\u305d\u306e\u8ddd\u96e2\u3092\u7b97\u51fa\u3059\u308b\u30d7\u30ed\u30b0\u30e9\u30e0\u3092\u4f5c\u3063\u3066\u4e0b\u3055\u3044\u3002"},"content":{"rendered":"
package main\r\n\/*\r\n\r\nf:\\\u3057\u3085\u3089\u3070\u3057\u3085\u3046\\\u6709\u5409\u5148\u751f\u30c7\u30fc\u30bf\\Transfer(2018)\\N07-11_14_GML>go run nearest_node3.go \r\n\r\ngolang\u3067\u3001\u4ee5\u4e0b\u306ebus_stop_modified.csv\u3068\u3044\u3046\u30d5\u30a1\u30a4\u30eb\u540d\u304b\u3089\u8aad\u307f\u53d6\u3063\u305f\u4f4d\u7f6e\u60c5\u5831\u3054\u3068\u306b\u3001\r\n\u4ee5\u4e0b\u306etsuzuki_bus.osm\u30d5\u30a1\u30a4\u30eb\u306enode\u306b\u8a18\u8f09\u3055\u308c\u305f\u4f4d\u7f6e\u60c5\u5831\u306850\u30e1\u30fc\u30c8\u30eb\u4ee5\u5185\u306enode\u3068\r\n\u305d\u306e\u8ddd\u96e2\u3092\u7b97\u51fa\u3059\u308b\u30d7\u30ed\u30b0\u30e9\u30e0\u3092\u4f5c\u3063\u3066\u4e0b\u3055\u3044\u3002\r\n\r\n[bus_stop_modified.csv]\r\n35.522547,139.590950\r\n35.522547,139.590950\r\n35.564881,139.580736\r\n35.566768,139.583192\r\n35.569075,139.584080\r\n\r\n[tsuzuki_bus.osm]\r\n<?xml version='1.0' encoding='UTF-8'?>\r\n<osm version='0.6' generator='JOSM'>\r\n<node id='200000' visible='true' version='1' lat='35.568239' lon='139.552822' \/>\r\n<node id='200001' visible='true' version='1' lat='35.568164' lon='139.5528' \/>\r\n<node id='200002' visible='true' version='1' lat='35.568321' lon='139.551491' \/>\r\n<node id='200003' visible='true' version='1' lat='35.568338' lon='139.55136' \/>\r\n<node id='200004' visible='true' version='1' lat='35.568355' lon='139.551264' \/>\r\n<\/osm>\r\n\r\n*\/\r\nimport (\r\n\"encoding\/csv\"\r\n\"encoding\/xml\"\r\n\"fmt\"\r\n\"math\"\r\n\"os\"\r\n\"strconv\"\r\n)\r\n\r\n\r\ntype Node struct {\r\nXMLName xml.Name `xml:\"node\"`\r\nID\u00a0 \u00a0 \u00a0 string\u00a0 \u00a0`xml:\"id,attr\"`\r\nLat\u00a0 \u00a0 \u00a0string\u00a0 \u00a0`xml:\"lat,attr\"`\r\nLon\u00a0 \u00a0 \u00a0string\u00a0 \u00a0`xml:\"lon,attr\"`\r\n}\r\n\r\n\r\nfunc haversine(lat1, lon1, lat2, lon2 float64) float64 {\r\nradius := 6371.0 \/\/ Earth's radius in kilometers\r\nlatRad1 := lat1 * (math.Pi \/ 180)\r\nlatRad2 := lat2 * (math.Pi \/ 180)\r\ndeltaLat := (lat2 - lat1) * (math.Pi \/ 180)\r\ndeltaLon := (lon2 - lon1) * (math.Pi \/ 180)\r\n\r\n\r\na := math.Sin(deltaLat\/2)*math.Sin(deltaLat\/2) +\r\nmath.Cos(latRad1)*math.Cos(latRad2)*\r\nmath.Sin(deltaLon\/2)*math.Sin(deltaLon\/2)\r\nc := 2 * math.Atan2(math.Sqrt(a), math.Sqrt(1-a))\r\n\r\n\r\ndistance := radius * c\r\nreturn distance\r\n}\r\n\r\n\r\nfunc main() {\r\n\/\/ Read CSV file\r\ncsvFile, err := os.Open(\"bus_stop_modified.csv\")\r\nif err != nil {\r\nfmt.Println(\"Error opening CSV file:\", err)\r\nreturn\r\n}\r\ndefer csvFile.Close()\r\n\r\n\r\ncsvReader := csv.NewReader(csvFile)\r\npositions, err := csvReader.ReadAll()\r\nif err != nil {\r\nfmt.Println(\"Error reading CSV:\", err)\r\nreturn\r\n}\r\n\r\n\r\n\/\/ Read OSM file\r\nxmlFile, err := os.Open(\"tsuzuki_bus.osm\")\r\nif err != nil {\r\nfmt.Println(\"Error opening OSM file:\", err)\r\nreturn\r\n}\r\ndefer xmlFile.Close()\r\n\r\n\r\nvar nodes struct {\r\nXMLName xml.Name `xml:\"osm\"`\r\nNodes\u00a0 \u00a0[]Node\u00a0 \u00a0`xml:\"node\"`\r\n}\r\n\r\n\r\n\/\/ Parse OSM XML\r\ndecoder := xml.NewDecoder(xmlFile)\r\nerr = decoder.Decode(&nodes)\r\nif err != nil {\r\nfmt.Println(\"Error decoding OSM XML:\", err)\r\nreturn\r\n}\r\n\r\n\r\n\/\/ Find nodes within 50 meters for each position\r\nfor _, position := range positions {\r\nlat, _ := strconv.ParseFloat(position[0], 64)\r\nlon, _ := strconv.ParseFloat(position[1], 64)\r\n\r\n\r\nfmt.Printf(\"For Position (%s, %s):\\n\", position[0], position[1])\r\n\r\n\r\nfor _, node := range nodes.Nodes {\r\nnodeLat, _ := strconv.ParseFloat(node.Lat, 64)\r\nnodeLon, _ := strconv.ParseFloat(node.Lon, 64)\r\n\r\n\r\ndist := haversine(lat, lon, nodeLat, nodeLon)\r\nif dist <= 0.05 { \/\/ 50 meters in kilometers\r\nfmt.Printf(\"Node ID: %s\\n\", node.ID)\r\nfmt.Printf(\"Node Coordinates: %s, %s\\n\", node.Lat, node.Lon)\r\nfmt.Printf(\"Distance to Node: %.2f km\\n\", dist)\r\n}\r\n}\r\nfmt.Println(\"--------------------------\")\r\n}\r\n}<\/code><\/pre>\n

\u51fa\u529b\u7d50\u679c<\/p>\n

go run nearest_node3.go
\nFor Position (35.522547, 139.590950):
\nNode ID: 216067
\nNode Coordinates: 35.522356, 139.591082
\nDistance to Node: 0.02 km
\nNode ID: 216068
\nNode Coordinates: 35.522885, 139.591253
\nDistance to Node: 0.05 km
\nNode ID: 253004
\nNode Coordinates: 35.522356, 139.591082
\nDistance to Node: 0.02 km
\nNode ID: 253005
\nNode Coordinates: 35.522885, 139.591253
\nDistance to Node: 0.05 km
\nNode ID: 287056
\nNode Coordinates: 35.522885, 139.591253
\nDistance to Node: 0.05 km
\nNode ID: 287057
\nNode Coordinates: 35.522356, 139.591082
\nDistance to Node: 0.02 km
\nNode ID: 335005
\nNode Coordinates: 35.522356, 139.591082
\nDistance to Node: 0.02 km
\nNode ID: 335006
\nNode Coordinates: 35.522885, 139.591253
\nDistance to Node: 0.05 km
\nNode ID: 350106
\nNode Coordinates: 35.522885, 139.591253
\nDistance to Node: 0.05 km
\nNode ID: 350107
\nNode Coordinates: 35.522356, 139.591082
\nDistance to Node: 0.02 km
\nNode ID: 351568
\nNode Coordinates: 35.522356, 139.591082
\nDistance to Node: 0.02 km
\nNode ID: 351569
\nNode Coordinates: 35.522885, 139.591253
\nDistance to Node: 0.05 km
\n--------------------------
\nFor Position (35.522547, 139.590950):
\nNode ID: 216067
\nNode Coordinates: 35.522356, 139.591082
\nDistance to Node: 0.02 km
\nNode ID: 216068
\nNode Coordinates: 35.522885, 139.591253
\nDistance to Node: 0.05 km
\nNode ID: 253004
\nNode Coordinates: 35.522356, 139.591082
\nDistance to Node: 0.02 km<\/p><\/blockquote>\n","protected":false},"excerpt":{"rendered":"

package main \/* f:\\\u3057\u3085\u3089\u3070\u3057\u3085\u3046\\\u6709\u5409\u5148\u751f\u30c7\u30fc\u30bf\\Transfer(2018)\\N07-11_14_GML>go run nearest_node3.go golang\u3067\u3001\u4ee5\u4e0b\u306ebus_stop […]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_editorskit_title_hidden":false,"_editorskit_reading_time":0,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}"},"categories":[109,4],"tags":[],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/wp.kobore.net\/wp-json\/wp\/v2\/posts\/11678"}],"collection":[{"href":"https:\/\/wp.kobore.net\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wp.kobore.net\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wp.kobore.net\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wp.kobore.net\/wp-json\/wp\/v2\/comments?post=11678"}],"version-history":[{"count":2,"href":"https:\/\/wp.kobore.net\/wp-json\/wp\/v2\/posts\/11678\/revisions"}],"predecessor-version":[{"id":11680,"href":"https:\/\/wp.kobore.net\/wp-json\/wp\/v2\/posts\/11678\/revisions\/11680"}],"wp:attachment":[{"href":"https:\/\/wp.kobore.net\/wp-json\/wp\/v2\/media?parent=11678"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wp.kobore.net\/wp-json\/wp\/v2\/categories?post=11678"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wp.kobore.net\/wp-json\/wp\/v2\/tags?post=11678"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}