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