[{"data":1,"prerenderedAt":1512},["ShallowReactive",2],{"tag-gis":3},{"count":4,"content":5},1,[6],{"id":7,"title":8,"body":9,"category":1498,"createdAt":1500,"description":1501,"extension":1502,"index":1503,"meta":1504,"navigation":161,"path":1505,"publish":161,"seo":1506,"series":1503,"seriesTitle":1503,"stem":1507,"tag":1508,"thumbnail":1510,"updatedAt":1503,"__hash__":1511},"articles\u002Farticles\u002F2024_09_22_line_great_circle_antimeridian_cutting.md","turf.jsを用いたメルカトル図法地図上の線の大圏航路補正・逆子午線分割",{"type":10,"value":11,"toc":1491},"minimark",[12,16,19,24,27,32,35,38,41,44,47,50,53,56,59,62,65,68,72,75,80,83,856,859,1487],[13,14,15],"p",{},"私がメルカトル図法を使用した地図上で、mapboxに2点以上の線を引く処理を実装していたとき、線が直線的に描画されるという問題が発生しました。さらに、経度180度の逆子午線を跨ぐ場合、mapboxでは大回りの線が描かれてしまい、その修正も必要でした。例えば、東京→ロサンゼルスの２点を結ぶと、東経180度を越えるのでなく、西回りでぐるっと線が引かれてしまいました。",[13,17,18],{},"本記事では、JavaScriptライブラリであるturf.jsを用いて、補正と分割を行った表示用のパスを算出手法について紹介します。",[20,21,23],"h2",{"id":22},"大圏航路とはなぜ補正が必要","大圏航路とは？なぜ補正が必要？",[13,25,26],{},"大圏航路（Great Circle Route）は、地球上の2点を最短距離で結ぶ経路です。なんとなく２点を結んだ直線が最短経路と思ってしましますが、実際はそうではありません。よく見る平面の地図はメルカトル図法という方法で表現されており、引いた線が実際の地球上の経路、距離、面積と一致しません。これは地球が球面であり、球面上の線を平面上の線の描画と一致しないからです。例えば、東京→デリーの最短ルートは実際以下の通りで、直線的に結んだものではありません。（左が補正なしの直線）",[28,29],"image-render",{":src":30,":width":31},"'2024_09_22_line_great_circle_antimeridian_cutting\u002Ffig2.png'","'200px'",[28,33],{":src":34,":width":31},"'2024_09_22_line_great_circle_antimeridian_cutting\u002Ffig1.png'",[13,36,37],{},"メルカトル図法は、緯度が高くなるほど距離の比率が歪むため、大圏航路を描くと地図上で曲線として表示されるのが特徴です。しかし、通常のGeoJSONなどを使用して単純に線を引くと、2点間を直線で結んでしまい、大圏航路としての正確さが失れます。",[13,39,40],{},"これは2点の距離が離れるほど、平面上に引いた直線と実際の線と乖離します。短い距離、少なくとも日本列島ぐらいであれば問題ありませんが、大陸レベルだったり海路・空路を表現するときはその乖離が顕著になります。",[13,42,43],{},"海路・空路を記載するような地図はこの補正を考慮しないといけません。わかりやすくすると以下の通りです。",[28,45],{":src":46,":width":31},"'2024_09_22_line_great_circle_antimeridian_cutting\u002Ffig5.png'",[28,48],{":src":49,":width":31},"'2024_09_22_line_great_circle_antimeridian_cutting\u002Ffig6.png'",[20,51,52],{"id":52},"逆子午線を越えるときには分割が必要",[13,54,55],{},"逆子午線とは、経度180度の線を指します。mapboxで経度180度を跨ぐ線を描こうとすると、通常の経路補正では大回りで描かれてしまい、直感的に不自然になります。",[28,57],{":src":58,":width":31},"'2024_09_22_line_great_circle_antimeridian_cutting\u002Ffig3.png'",[28,60],{":src":61,":width":31},"'2024_09_22_line_great_circle_antimeridian_cutting\u002Ffig4.png'",[13,63,64],{},"そのため、逆子午線を越える線を正しく描画するには、線を分割して複数のLineStringやMultiLineStringに分ける処理を行いました。図としてこのような感じです。",[28,66],{":src":67,":width":31},"'2024_09_22_line_great_circle_antimeridian_cutting\u002Ffig7.png'",[20,69,71],{"id":70},"基本的にturfjsを使えば解決できる","基本的にturf.jsを使えば解決できる",[13,73,74],{},"JavaScriptのturf.jsライブラリを用いることで、これらの問題を解決できます。turf.jsはGeoJSONデータの操作に強力な機能を提供しており、大圏航路の計算を行うとき、180度を越えるとき自動的に分割したパスを渡してくれます。",[76,77,79],"h3",{"id":78},"_2点間に補正点を算出","2点間に補正点を算出",[13,81,82],{},"まず、2点間の線を大圏航路で補正するために、turf.jsのturf.greatCircle関数を使用しました。この関数を使うことで2点間を大圏航路で補正し、曲線的な追加のパスを生成できます。\n180度を超えない2点の場合、補正した緯度経度の配列が戻ります。180度を越える場合、180度で分割した2つのlineの緯度経度配列が戻ります。",[84,85,90],"pre",{"className":86,"code":87,"language":88,"meta":89,"style":89},"language-ts shiki shiki-themes material-theme-ocean","import * as turf from '@turf\u002Fturf';\nimport { Feature } from \"geojson\";\n\nconst path = [lat:number,lng:number][]\nconst displayPath: [number, number][][] = [];\n\n\u002F\u002F 各ラインのパスごとに大円航路を計算したパスを追加\nfor (let i = 0; i \u003C path.length - 1; i++) {\n    const startPoint = path[i];\n    const endPoint = path[i + 1];\n\n    const currentPoint = turf.point([startPoint[1], startPoint[0]]); \u002F\u002F turf.js は経度・緯度と入力したり戻ってくるので注意。\n    const nextPoint = turf.point([endPoint[1], endPoint[0]]);\n\n    const greatCircle = turf.greatCircle(currentPoint, nextPoint, { npoints: 30 }); \u002F\u002F npoints が追加する補正点。多いほど滑らか\n\n    const coordinates = greatCircle.geometry.coordinates;\n\n    \u002F\u002F LineString の場合\n    if (Array.isArray(coordinates[0]) && !Array.isArray(coordinates[0][0])) {\n        displayPath.push(coordinates as [number, number][]);\n    } \n    \u002F\u002F MultiLineString の場合\n    else if (Array.isArray(coordinates[0][0])) {\n        coordinates.forEach((segment) => {\n            displayPath.push(segment as [number, number][]);\n        });\n    }\n}\n\nconst geojson = {\n    type: \"Feature\",\n    properties: {},\n    geometry: {\n        type: \"MultiLineString\",\n        coordinates: displayPath,\n    },\n} as Feature;\n\nreturn geojson;\n","ts","",[91,92,93,128,156,163,185,218,223,230,288,314,339,344,393,432,437,486,491,515,520,526,583,613,622,628,661,688,716,726,732,738,743,755,773,784,794,811,822,828,840,845],"code",{"__ignoreMap":89},[94,95,97,101,105,108,112,115,118,122,125],"span",{"class":96,"line":4},"line",[94,98,100],{"class":99},"s6cf3","import",[94,102,104],{"class":103},"sAklC"," *",[94,106,107],{"class":99}," as",[94,109,111],{"class":110},"s0W1g"," turf ",[94,113,114],{"class":99},"from",[94,116,117],{"class":103}," '",[94,119,121],{"class":120},"sfyAc","@turf\u002Fturf",[94,123,124],{"class":103},"'",[94,126,127],{"class":103},";\n",[94,129,131,133,136,139,142,145,148,151,154],{"class":96,"line":130},2,[94,132,100],{"class":99},[94,134,135],{"class":103}," {",[94,137,138],{"class":110}," Feature",[94,140,141],{"class":103}," }",[94,143,144],{"class":99}," from",[94,146,147],{"class":103}," \"",[94,149,150],{"class":120},"geojson",[94,152,153],{"class":103},"\"",[94,155,127],{"class":103},[94,157,159],{"class":96,"line":158},3,[94,160,162],{"emptyLinePlaceholder":161},true,"\n",[94,164,166,170,173,176,179,182],{"class":96,"line":165},4,[94,167,169],{"class":168},"sJ14y","const",[94,171,172],{"class":110}," path ",[94,174,175],{"class":103},"=",[94,177,178],{"class":110}," [lat:number",[94,180,181],{"class":103},",",[94,183,184],{"class":110},"lng:number][]\n",[94,186,188,190,193,196,199,203,205,208,211,213,216],{"class":96,"line":187},5,[94,189,169],{"class":168},[94,191,192],{"class":110}," displayPath",[94,194,195],{"class":103},":",[94,197,198],{"class":110}," [",[94,200,202],{"class":201},"s5Dmg","number",[94,204,181],{"class":103},[94,206,207],{"class":201}," number",[94,209,210],{"class":110},"][][] ",[94,212,175],{"class":103},[94,214,215],{"class":110}," []",[94,217,127],{"class":103},[94,219,221],{"class":96,"line":220},6,[94,222,162],{"emptyLinePlaceholder":161},[94,224,226],{"class":96,"line":225},7,[94,227,229],{"class":228},"sC9rS","\u002F\u002F 各ラインのパスごとに大円航路を計算したパスを追加\n",[94,231,233,236,239,242,245,247,251,254,256,259,262,265,268,271,274,276,279,282,285],{"class":96,"line":232},8,[94,234,235],{"class":99},"for",[94,237,238],{"class":110}," (",[94,240,241],{"class":168},"let",[94,243,244],{"class":110}," i ",[94,246,175],{"class":103},[94,248,250],{"class":249},"sx098"," 0",[94,252,253],{"class":103},";",[94,255,244],{"class":110},[94,257,258],{"class":103},"\u003C",[94,260,261],{"class":110}," path",[94,263,264],{"class":103},".",[94,266,267],{"class":110},"length ",[94,269,270],{"class":103},"-",[94,272,273],{"class":249}," 1",[94,275,253],{"class":103},[94,277,278],{"class":110}," i",[94,280,281],{"class":103},"++",[94,283,284],{"class":110},") ",[94,286,287],{"class":103},"{\n",[94,289,291,294,297,300,302,306,309,312],{"class":96,"line":290},9,[94,292,293],{"class":168},"    const",[94,295,296],{"class":110}," startPoint",[94,298,299],{"class":103}," =",[94,301,261],{"class":110},[94,303,305],{"class":304},"s-wAU","[",[94,307,308],{"class":110},"i",[94,310,311],{"class":304},"]",[94,313,127],{"class":103},[94,315,317,319,322,324,326,328,330,333,335,337],{"class":96,"line":316},10,[94,318,293],{"class":168},[94,320,321],{"class":110}," endPoint",[94,323,299],{"class":103},[94,325,261],{"class":110},[94,327,305],{"class":304},[94,329,308],{"class":110},[94,331,332],{"class":103}," +",[94,334,273],{"class":249},[94,336,311],{"class":304},[94,338,127],{"class":103},[94,340,342],{"class":96,"line":341},11,[94,343,162],{"emptyLinePlaceholder":161},[94,345,347,349,352,354,357,359,363,366,369,371,374,376,378,380,382,385,388,390],{"class":96,"line":346},12,[94,348,293],{"class":168},[94,350,351],{"class":110}," currentPoint",[94,353,299],{"class":103},[94,355,356],{"class":110}," turf",[94,358,264],{"class":103},[94,360,362],{"class":361},"sdLwU","point",[94,364,365],{"class":304},"([",[94,367,368],{"class":110},"startPoint",[94,370,305],{"class":304},[94,372,373],{"class":249},"1",[94,375,311],{"class":304},[94,377,181],{"class":103},[94,379,296],{"class":110},[94,381,305],{"class":304},[94,383,384],{"class":249},"0",[94,386,387],{"class":304},"]])",[94,389,253],{"class":103},[94,391,392],{"class":228}," \u002F\u002F turf.js は経度・緯度と入力したり戻ってくるので注意。\n",[94,394,396,398,401,403,405,407,409,411,414,416,418,420,422,424,426,428,430],{"class":96,"line":395},13,[94,397,293],{"class":168},[94,399,400],{"class":110}," nextPoint",[94,402,299],{"class":103},[94,404,356],{"class":110},[94,406,264],{"class":103},[94,408,362],{"class":361},[94,410,365],{"class":304},[94,412,413],{"class":110},"endPoint",[94,415,305],{"class":304},[94,417,373],{"class":249},[94,419,311],{"class":304},[94,421,181],{"class":103},[94,423,321],{"class":110},[94,425,305],{"class":304},[94,427,384],{"class":249},[94,429,387],{"class":304},[94,431,127],{"class":103},[94,433,435],{"class":96,"line":434},14,[94,436,162],{"emptyLinePlaceholder":161},[94,438,440,442,445,447,449,451,454,457,460,462,464,466,468,471,473,476,478,481,483],{"class":96,"line":439},15,[94,441,293],{"class":168},[94,443,444],{"class":110}," greatCircle",[94,446,299],{"class":103},[94,448,356],{"class":110},[94,450,264],{"class":103},[94,452,453],{"class":361},"greatCircle",[94,455,456],{"class":304},"(",[94,458,459],{"class":110},"currentPoint",[94,461,181],{"class":103},[94,463,400],{"class":110},[94,465,181],{"class":103},[94,467,135],{"class":103},[94,469,470],{"class":304}," npoints",[94,472,195],{"class":103},[94,474,475],{"class":249}," 30",[94,477,141],{"class":103},[94,479,480],{"class":304},")",[94,482,253],{"class":103},[94,484,485],{"class":228}," \u002F\u002F npoints が追加する補正点。多いほど滑らか\n",[94,487,489],{"class":96,"line":488},16,[94,490,162],{"emptyLinePlaceholder":161},[94,492,494,496,499,501,503,505,508,510,513],{"class":96,"line":493},17,[94,495,293],{"class":168},[94,497,498],{"class":110}," coordinates",[94,500,299],{"class":103},[94,502,444],{"class":110},[94,504,264],{"class":103},[94,506,507],{"class":110},"geometry",[94,509,264],{"class":103},[94,511,512],{"class":110},"coordinates",[94,514,127],{"class":103},[94,516,518],{"class":96,"line":517},18,[94,519,162],{"emptyLinePlaceholder":161},[94,521,523],{"class":96,"line":522},19,[94,524,525],{"class":228},"    \u002F\u002F LineString の場合\n",[94,527,529,532,534,537,539,542,544,546,548,550,553,556,559,561,563,565,567,569,571,573,576,578,581],{"class":96,"line":528},20,[94,530,531],{"class":99},"    if",[94,533,238],{"class":304},[94,535,536],{"class":110},"Array",[94,538,264],{"class":103},[94,540,541],{"class":361},"isArray",[94,543,456],{"class":304},[94,545,512],{"class":110},[94,547,305],{"class":304},[94,549,384],{"class":249},[94,551,552],{"class":304},"]) ",[94,554,555],{"class":103},"&&",[94,557,558],{"class":103}," !",[94,560,536],{"class":110},[94,562,264],{"class":103},[94,564,541],{"class":361},[94,566,456],{"class":304},[94,568,512],{"class":110},[94,570,305],{"class":304},[94,572,384],{"class":249},[94,574,575],{"class":304},"][",[94,577,384],{"class":249},[94,579,580],{"class":304},"])) ",[94,582,287],{"class":103},[94,584,586,589,591,594,596,598,600,602,604,606,608,611],{"class":96,"line":585},21,[94,587,588],{"class":110},"        displayPath",[94,590,264],{"class":103},[94,592,593],{"class":361},"push",[94,595,456],{"class":304},[94,597,512],{"class":110},[94,599,107],{"class":99},[94,601,198],{"class":304},[94,603,202],{"class":201},[94,605,181],{"class":103},[94,607,207],{"class":201},[94,609,610],{"class":304},"][])",[94,612,127],{"class":103},[94,614,616,619],{"class":96,"line":615},22,[94,617,618],{"class":103},"    }",[94,620,621],{"class":304}," \n",[94,623,625],{"class":96,"line":624},23,[94,626,627],{"class":228},"    \u002F\u002F MultiLineString の場合\n",[94,629,631,634,637,639,641,643,645,647,649,651,653,655,657,659],{"class":96,"line":630},24,[94,632,633],{"class":99},"    else",[94,635,636],{"class":99}," if",[94,638,238],{"class":304},[94,640,536],{"class":110},[94,642,264],{"class":103},[94,644,541],{"class":361},[94,646,456],{"class":304},[94,648,512],{"class":110},[94,650,305],{"class":304},[94,652,384],{"class":249},[94,654,575],{"class":304},[94,656,384],{"class":249},[94,658,580],{"class":304},[94,660,287],{"class":103},[94,662,664,667,669,672,674,676,680,682,685],{"class":96,"line":663},25,[94,665,666],{"class":110},"        coordinates",[94,668,264],{"class":103},[94,670,671],{"class":361},"forEach",[94,673,456],{"class":304},[94,675,456],{"class":103},[94,677,679],{"class":678},"s7ZW3","segment",[94,681,480],{"class":103},[94,683,684],{"class":168}," =>",[94,686,687],{"class":103}," {\n",[94,689,691,694,696,698,700,702,704,706,708,710,712,714],{"class":96,"line":690},26,[94,692,693],{"class":110},"            displayPath",[94,695,264],{"class":103},[94,697,593],{"class":361},[94,699,456],{"class":304},[94,701,679],{"class":110},[94,703,107],{"class":99},[94,705,198],{"class":304},[94,707,202],{"class":201},[94,709,181],{"class":103},[94,711,207],{"class":201},[94,713,610],{"class":304},[94,715,127],{"class":103},[94,717,719,722,724],{"class":96,"line":718},27,[94,720,721],{"class":103},"        }",[94,723,480],{"class":304},[94,725,127],{"class":103},[94,727,729],{"class":96,"line":728},28,[94,730,731],{"class":103},"    }\n",[94,733,735],{"class":96,"line":734},29,[94,736,737],{"class":103},"}\n",[94,739,741],{"class":96,"line":740},30,[94,742,162],{"emptyLinePlaceholder":161},[94,744,746,748,751,753],{"class":96,"line":745},31,[94,747,169],{"class":168},[94,749,750],{"class":110}," geojson ",[94,752,175],{"class":103},[94,754,687],{"class":103},[94,756,758,761,763,765,768,770],{"class":96,"line":757},32,[94,759,760],{"class":304},"    type",[94,762,195],{"class":103},[94,764,147],{"class":103},[94,766,767],{"class":120},"Feature",[94,769,153],{"class":103},[94,771,772],{"class":103},",\n",[94,774,776,779,781],{"class":96,"line":775},33,[94,777,778],{"class":304},"    properties",[94,780,195],{"class":103},[94,782,783],{"class":103}," {},\n",[94,785,787,790,792],{"class":96,"line":786},34,[94,788,789],{"class":304},"    geometry",[94,791,195],{"class":103},[94,793,687],{"class":103},[94,795,797,800,802,804,807,809],{"class":96,"line":796},35,[94,798,799],{"class":304},"        type",[94,801,195],{"class":103},[94,803,147],{"class":103},[94,805,806],{"class":120},"MultiLineString",[94,808,153],{"class":103},[94,810,772],{"class":103},[94,812,814,816,818,820],{"class":96,"line":813},36,[94,815,666],{"class":304},[94,817,195],{"class":103},[94,819,192],{"class":110},[94,821,772],{"class":103},[94,823,825],{"class":96,"line":824},37,[94,826,827],{"class":103},"    },\n",[94,829,831,834,836,838],{"class":96,"line":830},38,[94,832,833],{"class":103},"}",[94,835,107],{"class":99},[94,837,138],{"class":201},[94,839,127],{"class":103},[94,841,843],{"class":96,"line":842},39,[94,844,162],{"emptyLinePlaceholder":161},[94,846,848,851,854],{"class":96,"line":847},40,[94,849,850],{"class":99},"return",[94,852,853],{"class":110}," geojson",[94,855,127],{"class":103},[13,857,858],{},"わかりやすいように、180度を越える・超えないパターンでの大圏航路の補正です。",[84,860,864],{"className":861,"code":862,"language":863,"meta":89,"style":89},"language-js shiki shiki-themes material-theme-ocean","import * as turf from '@turf\u002Fturf';\n\nconst nonOver = turf.greatCircle(\n    [139.6503, 35.6762],  \u002F\u002F 東京の座標\n    [77.2090, 28.6139], \u002F\u002F デリーの座標\n    { npoints: 30 }\n);\n\nconsole.log(nonOver)\n\u002F**\n[\n  [ 139.6503, 35.67620000000001 ],\n  [ 137.45530635075792, 36.00345099838847 ],\n  [ 135.24315241142824, 36.29039534292487 ],\n  [ 133.01584313143206, 36.53630839532294 ],\n  [ 130.77553308674652, 36.74055732953035 ],\n  [ 128.52450866279412, 36.90260805727012 ],\n  [ 126.26516729530344, 37.022031252284606 ],\n  [ 123.99999414238111, 37.09850731283235 ],\n  [ 121.73153667001746, 37.131830125727525 ],\n  [ 119.46237772511748, 37.121909525547366 ],\n  [ 117.19510773852923, 37.0687723782786 ],\n  [ 114.93229674053903, 36.972562257930214 ],\n  [ 112.67646687998554, 36.83353772552399 ],\n  [ 110.43006611487587, 36.65206926027127 ],\n  [ 108.19544368887564, 36.42863493057574 ],\n  [ 105.97482792817907, 36.163814925900674 ],\n  [ 103.7703067926894, 35.858285097980165 ],\n  [ 101.58381150098748, 35.51280968026889 ],\n  [ 99.41710342759748, 35.12823336735064 ],\n  [ 97.27176435078754, 34.705472941209955 ],\n  [ 95.14919001606306, 34.245508629231686 ],\n  [ 93.05058687993017, 33.749375370334334 ],\n  [ 90.97697181428099, 33.21815415185492 ],\n  [ 88.92917448617246, 32.6529635619425 ],\n  [ 86.90784208162192, 32.05495168160128 ],\n  [ 84.91344601479491, 31.42528841842546 ],\n  [ 82.94629025402638, 30.7651583616406 ],\n  [ 81.00652090116452, 30.075754216293156 ],\n  [ 79.09413667798896, 29.358270854084918 ],\n  [ 77.209, 28.613900000000005 ]\n]\n*\u002F\n\nconst over = turf.greatCircle(\n    [139.6503, 35.6762],  \u002F\u002F 東京の座標\n    [-147.7164, 64.8378], \u002F\u002F アラスカの座標\n    { npoints: 30 }\n);\n\nconsole.log(over)\n\u002F*\n  [\n    [ 139.6503, 35.67620000000001 ],\n    [ 140.80178756980726, 37.16607636013253 ],\n    [ 141.99941083018345, 38.64436492965305 ],\n    [ 143.24727313996488, 40.10993078543407 ],\n    [ 144.54983478842868, 41.56151748104379 ],\n    [ 145.91194328157903, 42.9977313513525 ],\n    [ 147.33886324769875, 44.41702385324905 ],\n    [ 148.83630454782175, 45.81767177569259 ],\n    [ 150.41044655311683, 47.19775518537249 ],\n    [ 152.0679557258351, 48.55513303641521 ],\n    [ 153.8159925691613, 49.88741647693477 ],\n    [ 155.66220265313686, 51.19194004906208 ],\n    [ 157.6146847535422, 52.465731224424154 ],\n    [ 159.68192717003024, 53.705479070518045 ],\n    [ 161.87270110244128, 54.90750333482882 ],\n    [ 164.19589776721827, 56.06772589186521 ],\n    [ 166.66029413034695, 57.18164734362052 ],\n    [ 169.27423139783608, 58.24433259326387 ],\n    [ 172.0451917704491, 59.25041037671838 ],\n    [ 174.9792638386216, 60.19409291290832 ],\n    [ 178.08049701800238, 61.069222785803966 ],\n    [ 180, 61.53895140096846 ]\n  ],\n  [\n    [ -180, 61.53895140096846 ],\n    [ -178.64983787529644, 61.86935452669037 ],\n    [ -175.2140408098754, 62.587877615485425 ],\n    [ -171.618756489847, 63.21818519285117 ],\n    [ -167.87562800253605, 63.753888204781546 ],\n    [ -164.0017045661598, 64.18906791167207 ],\n    [ -160.0194735821535, 64.51855132598804 ],\n    [ -155.9564136218279, 64.73818576863974 ],\n    [ -151.84402691822368, 64.84508272020929 ],\n    [ -147.7164, 64.8378 ]\n  ]\n]\n*\u002F\n","js",[91,865,866,886,890,908,928,947,961,967,971,984,989,994,999,1004,1009,1014,1019,1024,1029,1034,1039,1044,1049,1054,1059,1064,1069,1074,1079,1084,1089,1094,1099,1104,1109,1114,1119,1124,1129,1134,1139,1145,1151,1157,1162,1180,1197,1219,1232,1239,1244,1256,1262,1268,1274,1280,1286,1292,1298,1304,1310,1316,1322,1328,1334,1340,1346,1352,1358,1364,1370,1376,1382,1388,1394,1400,1406,1411,1417,1423,1429,1435,1441,1447,1453,1459,1465,1471,1477,1482],{"__ignoreMap":89},[94,867,868,870,872,874,876,878,880,882,884],{"class":96,"line":4},[94,869,100],{"class":99},[94,871,104],{"class":103},[94,873,107],{"class":99},[94,875,111],{"class":110},[94,877,114],{"class":99},[94,879,117],{"class":103},[94,881,121],{"class":120},[94,883,124],{"class":103},[94,885,127],{"class":103},[94,887,888],{"class":96,"line":130},[94,889,162],{"emptyLinePlaceholder":161},[94,891,892,894,897,899,901,903,905],{"class":96,"line":158},[94,893,169],{"class":168},[94,895,896],{"class":110}," nonOver ",[94,898,175],{"class":103},[94,900,356],{"class":110},[94,902,264],{"class":103},[94,904,453],{"class":361},[94,906,907],{"class":110},"(\n",[94,909,910,913,916,918,921,923,925],{"class":96,"line":165},[94,911,912],{"class":110},"    [",[94,914,915],{"class":249},"139.6503",[94,917,181],{"class":103},[94,919,920],{"class":249}," 35.6762",[94,922,311],{"class":110},[94,924,181],{"class":103},[94,926,927],{"class":228},"  \u002F\u002F 東京の座標\n",[94,929,930,932,935,937,940,942,944],{"class":96,"line":187},[94,931,912],{"class":110},[94,933,934],{"class":249},"77.2090",[94,936,181],{"class":103},[94,938,939],{"class":249}," 28.6139",[94,941,311],{"class":110},[94,943,181],{"class":103},[94,945,946],{"class":228}," \u002F\u002F デリーの座標\n",[94,948,949,952,954,956,958],{"class":96,"line":220},[94,950,951],{"class":103},"    {",[94,953,470],{"class":304},[94,955,195],{"class":103},[94,957,475],{"class":249},[94,959,960],{"class":103}," }\n",[94,962,963,965],{"class":96,"line":225},[94,964,480],{"class":110},[94,966,127],{"class":103},[94,968,969],{"class":96,"line":232},[94,970,162],{"emptyLinePlaceholder":161},[94,972,973,976,978,981],{"class":96,"line":290},[94,974,975],{"class":110},"console",[94,977,264],{"class":103},[94,979,980],{"class":361},"log",[94,982,983],{"class":110},"(nonOver)\n",[94,985,986],{"class":96,"line":316},[94,987,988],{"class":228},"\u002F**\n",[94,990,991],{"class":96,"line":341},[94,992,993],{"class":228},"[\n",[94,995,996],{"class":96,"line":346},[94,997,998],{"class":228},"  [ 139.6503, 35.67620000000001 ],\n",[94,1000,1001],{"class":96,"line":395},[94,1002,1003],{"class":228},"  [ 137.45530635075792, 36.00345099838847 ],\n",[94,1005,1006],{"class":96,"line":434},[94,1007,1008],{"class":228},"  [ 135.24315241142824, 36.29039534292487 ],\n",[94,1010,1011],{"class":96,"line":439},[94,1012,1013],{"class":228},"  [ 133.01584313143206, 36.53630839532294 ],\n",[94,1015,1016],{"class":96,"line":488},[94,1017,1018],{"class":228},"  [ 130.77553308674652, 36.74055732953035 ],\n",[94,1020,1021],{"class":96,"line":493},[94,1022,1023],{"class":228},"  [ 128.52450866279412, 36.90260805727012 ],\n",[94,1025,1026],{"class":96,"line":517},[94,1027,1028],{"class":228},"  [ 126.26516729530344, 37.022031252284606 ],\n",[94,1030,1031],{"class":96,"line":522},[94,1032,1033],{"class":228},"  [ 123.99999414238111, 37.09850731283235 ],\n",[94,1035,1036],{"class":96,"line":528},[94,1037,1038],{"class":228},"  [ 121.73153667001746, 37.131830125727525 ],\n",[94,1040,1041],{"class":96,"line":585},[94,1042,1043],{"class":228},"  [ 119.46237772511748, 37.121909525547366 ],\n",[94,1045,1046],{"class":96,"line":615},[94,1047,1048],{"class":228},"  [ 117.19510773852923, 37.0687723782786 ],\n",[94,1050,1051],{"class":96,"line":624},[94,1052,1053],{"class":228},"  [ 114.93229674053903, 36.972562257930214 ],\n",[94,1055,1056],{"class":96,"line":630},[94,1057,1058],{"class":228},"  [ 112.67646687998554, 36.83353772552399 ],\n",[94,1060,1061],{"class":96,"line":663},[94,1062,1063],{"class":228},"  [ 110.43006611487587, 36.65206926027127 ],\n",[94,1065,1066],{"class":96,"line":690},[94,1067,1068],{"class":228},"  [ 108.19544368887564, 36.42863493057574 ],\n",[94,1070,1071],{"class":96,"line":718},[94,1072,1073],{"class":228},"  [ 105.97482792817907, 36.163814925900674 ],\n",[94,1075,1076],{"class":96,"line":728},[94,1077,1078],{"class":228},"  [ 103.7703067926894, 35.858285097980165 ],\n",[94,1080,1081],{"class":96,"line":734},[94,1082,1083],{"class":228},"  [ 101.58381150098748, 35.51280968026889 ],\n",[94,1085,1086],{"class":96,"line":740},[94,1087,1088],{"class":228},"  [ 99.41710342759748, 35.12823336735064 ],\n",[94,1090,1091],{"class":96,"line":745},[94,1092,1093],{"class":228},"  [ 97.27176435078754, 34.705472941209955 ],\n",[94,1095,1096],{"class":96,"line":757},[94,1097,1098],{"class":228},"  [ 95.14919001606306, 34.245508629231686 ],\n",[94,1100,1101],{"class":96,"line":775},[94,1102,1103],{"class":228},"  [ 93.05058687993017, 33.749375370334334 ],\n",[94,1105,1106],{"class":96,"line":786},[94,1107,1108],{"class":228},"  [ 90.97697181428099, 33.21815415185492 ],\n",[94,1110,1111],{"class":96,"line":796},[94,1112,1113],{"class":228},"  [ 88.92917448617246, 32.6529635619425 ],\n",[94,1115,1116],{"class":96,"line":813},[94,1117,1118],{"class":228},"  [ 86.90784208162192, 32.05495168160128 ],\n",[94,1120,1121],{"class":96,"line":824},[94,1122,1123],{"class":228},"  [ 84.91344601479491, 31.42528841842546 ],\n",[94,1125,1126],{"class":96,"line":830},[94,1127,1128],{"class":228},"  [ 82.94629025402638, 30.7651583616406 ],\n",[94,1130,1131],{"class":96,"line":842},[94,1132,1133],{"class":228},"  [ 81.00652090116452, 30.075754216293156 ],\n",[94,1135,1136],{"class":96,"line":847},[94,1137,1138],{"class":228},"  [ 79.09413667798896, 29.358270854084918 ],\n",[94,1140,1142],{"class":96,"line":1141},41,[94,1143,1144],{"class":228},"  [ 77.209, 28.613900000000005 ]\n",[94,1146,1148],{"class":96,"line":1147},42,[94,1149,1150],{"class":228},"]\n",[94,1152,1154],{"class":96,"line":1153},43,[94,1155,1156],{"class":228},"*\u002F\n",[94,1158,1160],{"class":96,"line":1159},44,[94,1161,162],{"emptyLinePlaceholder":161},[94,1163,1165,1167,1170,1172,1174,1176,1178],{"class":96,"line":1164},45,[94,1166,169],{"class":168},[94,1168,1169],{"class":110}," over ",[94,1171,175],{"class":103},[94,1173,356],{"class":110},[94,1175,264],{"class":103},[94,1177,453],{"class":361},[94,1179,907],{"class":110},[94,1181,1183,1185,1187,1189,1191,1193,1195],{"class":96,"line":1182},46,[94,1184,912],{"class":110},[94,1186,915],{"class":249},[94,1188,181],{"class":103},[94,1190,920],{"class":249},[94,1192,311],{"class":110},[94,1194,181],{"class":103},[94,1196,927],{"class":228},[94,1198,1200,1202,1204,1207,1209,1212,1214,1216],{"class":96,"line":1199},47,[94,1201,912],{"class":110},[94,1203,270],{"class":103},[94,1205,1206],{"class":249},"147.7164",[94,1208,181],{"class":103},[94,1210,1211],{"class":249}," 64.8378",[94,1213,311],{"class":110},[94,1215,181],{"class":103},[94,1217,1218],{"class":228}," \u002F\u002F アラスカの座標\n",[94,1220,1222,1224,1226,1228,1230],{"class":96,"line":1221},48,[94,1223,951],{"class":103},[94,1225,470],{"class":304},[94,1227,195],{"class":103},[94,1229,475],{"class":249},[94,1231,960],{"class":103},[94,1233,1235,1237],{"class":96,"line":1234},49,[94,1236,480],{"class":110},[94,1238,127],{"class":103},[94,1240,1242],{"class":96,"line":1241},50,[94,1243,162],{"emptyLinePlaceholder":161},[94,1245,1247,1249,1251,1253],{"class":96,"line":1246},51,[94,1248,975],{"class":110},[94,1250,264],{"class":103},[94,1252,980],{"class":361},[94,1254,1255],{"class":110},"(over)\n",[94,1257,1259],{"class":96,"line":1258},52,[94,1260,1261],{"class":228},"\u002F*\n",[94,1263,1265],{"class":96,"line":1264},53,[94,1266,1267],{"class":228},"  [\n",[94,1269,1271],{"class":96,"line":1270},54,[94,1272,1273],{"class":228},"    [ 139.6503, 35.67620000000001 ],\n",[94,1275,1277],{"class":96,"line":1276},55,[94,1278,1279],{"class":228},"    [ 140.80178756980726, 37.16607636013253 ],\n",[94,1281,1283],{"class":96,"line":1282},56,[94,1284,1285],{"class":228},"    [ 141.99941083018345, 38.64436492965305 ],\n",[94,1287,1289],{"class":96,"line":1288},57,[94,1290,1291],{"class":228},"    [ 143.24727313996488, 40.10993078543407 ],\n",[94,1293,1295],{"class":96,"line":1294},58,[94,1296,1297],{"class":228},"    [ 144.54983478842868, 41.56151748104379 ],\n",[94,1299,1301],{"class":96,"line":1300},59,[94,1302,1303],{"class":228},"    [ 145.91194328157903, 42.9977313513525 ],\n",[94,1305,1307],{"class":96,"line":1306},60,[94,1308,1309],{"class":228},"    [ 147.33886324769875, 44.41702385324905 ],\n",[94,1311,1313],{"class":96,"line":1312},61,[94,1314,1315],{"class":228},"    [ 148.83630454782175, 45.81767177569259 ],\n",[94,1317,1319],{"class":96,"line":1318},62,[94,1320,1321],{"class":228},"    [ 150.41044655311683, 47.19775518537249 ],\n",[94,1323,1325],{"class":96,"line":1324},63,[94,1326,1327],{"class":228},"    [ 152.0679557258351, 48.55513303641521 ],\n",[94,1329,1331],{"class":96,"line":1330},64,[94,1332,1333],{"class":228},"    [ 153.8159925691613, 49.88741647693477 ],\n",[94,1335,1337],{"class":96,"line":1336},65,[94,1338,1339],{"class":228},"    [ 155.66220265313686, 51.19194004906208 ],\n",[94,1341,1343],{"class":96,"line":1342},66,[94,1344,1345],{"class":228},"    [ 157.6146847535422, 52.465731224424154 ],\n",[94,1347,1349],{"class":96,"line":1348},67,[94,1350,1351],{"class":228},"    [ 159.68192717003024, 53.705479070518045 ],\n",[94,1353,1355],{"class":96,"line":1354},68,[94,1356,1357],{"class":228},"    [ 161.87270110244128, 54.90750333482882 ],\n",[94,1359,1361],{"class":96,"line":1360},69,[94,1362,1363],{"class":228},"    [ 164.19589776721827, 56.06772589186521 ],\n",[94,1365,1367],{"class":96,"line":1366},70,[94,1368,1369],{"class":228},"    [ 166.66029413034695, 57.18164734362052 ],\n",[94,1371,1373],{"class":96,"line":1372},71,[94,1374,1375],{"class":228},"    [ 169.27423139783608, 58.24433259326387 ],\n",[94,1377,1379],{"class":96,"line":1378},72,[94,1380,1381],{"class":228},"    [ 172.0451917704491, 59.25041037671838 ],\n",[94,1383,1385],{"class":96,"line":1384},73,[94,1386,1387],{"class":228},"    [ 174.9792638386216, 60.19409291290832 ],\n",[94,1389,1391],{"class":96,"line":1390},74,[94,1392,1393],{"class":228},"    [ 178.08049701800238, 61.069222785803966 ],\n",[94,1395,1397],{"class":96,"line":1396},75,[94,1398,1399],{"class":228},"    [ 180, 61.53895140096846 ]\n",[94,1401,1403],{"class":96,"line":1402},76,[94,1404,1405],{"class":228},"  ],\n",[94,1407,1409],{"class":96,"line":1408},77,[94,1410,1267],{"class":228},[94,1412,1414],{"class":96,"line":1413},78,[94,1415,1416],{"class":228},"    [ -180, 61.53895140096846 ],\n",[94,1418,1420],{"class":96,"line":1419},79,[94,1421,1422],{"class":228},"    [ -178.64983787529644, 61.86935452669037 ],\n",[94,1424,1426],{"class":96,"line":1425},80,[94,1427,1428],{"class":228},"    [ -175.2140408098754, 62.587877615485425 ],\n",[94,1430,1432],{"class":96,"line":1431},81,[94,1433,1434],{"class":228},"    [ -171.618756489847, 63.21818519285117 ],\n",[94,1436,1438],{"class":96,"line":1437},82,[94,1439,1440],{"class":228},"    [ -167.87562800253605, 63.753888204781546 ],\n",[94,1442,1444],{"class":96,"line":1443},83,[94,1445,1446],{"class":228},"    [ -164.0017045661598, 64.18906791167207 ],\n",[94,1448,1450],{"class":96,"line":1449},84,[94,1451,1452],{"class":228},"    [ -160.0194735821535, 64.51855132598804 ],\n",[94,1454,1456],{"class":96,"line":1455},85,[94,1457,1458],{"class":228},"    [ -155.9564136218279, 64.73818576863974 ],\n",[94,1460,1462],{"class":96,"line":1461},86,[94,1463,1464],{"class":228},"    [ -151.84402691822368, 64.84508272020929 ],\n",[94,1466,1468],{"class":96,"line":1467},87,[94,1469,1470],{"class":228},"    [ -147.7164, 64.8378 ]\n",[94,1472,1474],{"class":96,"line":1473},88,[94,1475,1476],{"class":228},"  ]\n",[94,1478,1480],{"class":96,"line":1479},89,[94,1481,1150],{"class":228},[94,1483,1485],{"class":96,"line":1484},90,[94,1486,1156],{"class":228},[1488,1489,1490],"style",{},"html pre.shiki code .s6cf3, html code.shiki .s6cf3{--shiki-default:#89DDFF;--shiki-default-font-style:italic}html pre.shiki code .sAklC, html code.shiki .sAklC{--shiki-default:#89DDFF}html pre.shiki code .s0W1g, html code.shiki .s0W1g{--shiki-default:#BABED8}html pre.shiki code .sfyAc, html code.shiki .sfyAc{--shiki-default:#C3E88D}html pre.shiki code .sJ14y, html code.shiki .sJ14y{--shiki-default:#C792EA}html pre.shiki code .s5Dmg, html code.shiki .s5Dmg{--shiki-default:#FFCB6B}html pre.shiki code .sC9rS, html code.shiki .sC9rS{--shiki-default:#464B5D;--shiki-default-font-style:italic}html pre.shiki code .sx098, html code.shiki .sx098{--shiki-default:#F78C6C}html pre.shiki code .s-wAU, html code.shiki .s-wAU{--shiki-default:#F07178}html pre.shiki code .sdLwU, html code.shiki .sdLwU{--shiki-default:#82AAFF}html pre.shiki code .s7ZW3, html code.shiki .s7ZW3{--shiki-default:#BABED8;--shiki-default-font-style:italic}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":89,"searchDepth":158,"depth":158,"links":1492},[1493,1494,1495],{"id":22,"depth":130,"text":23},{"id":52,"depth":130,"text":52},{"id":70,"depth":130,"text":71,"children":1496},[1497],{"id":78,"depth":158,"text":79},[1499],"devstack","2024-09-22","平面の地図にまっすぐひいた線は最短の航路ではありません。","md",null,{},"\u002Farticles\u002F2024_09_22_line_great_circle_antimeridian_cutting",{"title":8,"description":1501},"articles\u002F2024_09_22_line_great_circle_antimeridian_cutting",[863,1509],"gis","2024_09_22_line_great_circle_antimeridian_cutting\u002Fthumbnail.webp","rjpze4IQqIg5qQZw4X3RE4NP18BGM-IbRT3T9c54h4c",1780987135500]