{"version":3,"file":"GeoHex-4b9Z_inJ.js","sources":["../../../node_modules/@uupaa/geohex/lib/GeoHexDefines.js","../../../node_modules/@uupaa/geohex/lib/GeoHexZone.js","../../../node_modules/@uupaa/geohex/lib/GeoHexCore.js","../../../node_modules/@uupaa/geohex/lib/GeoHex.js"],"sourcesContent":["export const H_KEY = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\";\nexport const H_BASE = 20037508.34;\nexport const H_DEG = Math.PI * (30 / 180);\nexport const H_K = Math.tan(H_DEG);\nexport function calcHexSize(level) {\n return H_BASE / Math.pow(3, level + 3);\n}\nexport function latLng2xy(lat, lng) {\n const x = lng * H_BASE / 180;\n let y = Math.log(Math.tan((90 + lat) * Math.PI / 360)) / (Math.PI / 180);\n y *= H_BASE / 180;\n return { x, y };\n}\nexport function xy2latLng(x, y) {\n const lng = (x / H_BASE) * 180;\n let lat = (y / H_BASE) * 180;\n lat = 180 / Math.PI * (2 * Math.atan(Math.exp(lat * Math.PI / 180)) - Math.PI / 2);\n return { lat, lng, lon: lng };\n}\n","import { calcHexSize, latLng2xy, xy2latLng } from \"./GeoHexDefines.js\";\nexport class GeoHexZone {\n constructor(lat, lng, x, y, code) {\n this._lat = lat;\n this._lng = lng;\n this._x = x;\n this._y = y;\n this._code = code;\n }\n get lat() { return this._lat; }\n get lng() { return this._lng; }\n get lon() { return this._lng; } // lng alias\n get x() { return this._x; }\n get y() { return this._y; }\n get code() { return this._code; }\n get level() { return this._code.length - 2; }\n equals(zone) {\n return this._lat === zone.lat && this._lng === zone.lng && // this._lon === zone.lon &&\n this._x === zone.x && this._y === zone.y &&\n this._code === zone.code;\n }\n getHexSize() { return calcHexSize(this.level); }\n getHexCoords() {\n const h_lat = this._lat;\n const h_lng = this._lng;\n const { x, y } = latLng2xy(h_lat, h_lng);\n const h_deg = Math.tan(Math.PI * (60 / 180));\n const h_size = this.getHexSize();\n const h_top = xy2latLng(x, y + h_deg * h_size).lat;\n const h_btm = xy2latLng(x, y - h_deg * h_size).lat;\n const h_l = xy2latLng(x - 2 * h_size, y).lng;\n const h_r = xy2latLng(x + 2 * h_size, y).lng;\n const h_cl = xy2latLng(x - 1 * h_size, y).lng;\n const h_cr = xy2latLng(x + 1 * h_size, y).lng;\n return [\n { lat: h_lat, lng: h_l, lon: h_l },\n { lat: h_top, lng: h_cl, lon: h_cl },\n { lat: h_top, lng: h_cr, lon: h_cr },\n { lat: h_lat, lng: h_r, lon: h_r },\n { lat: h_btm, lng: h_cr, lon: h_cr },\n { lat: h_btm, lng: h_cl, lon: h_cl },\n ];\n }\n toJSON() {\n const { lat, lng, lon, x, y, code, level } = this;\n return `{ \"lat\": ${lat}, \"lng\": ${lng}, \"lon\": ${lon}, \"x\": ${x}, \"y\": ${y}, \"code\": ${code}, \"level\": ${level} }`;\n }\n}\n","import { H_KEY, H_K } from \"./GeoHexDefines.js\";\nimport { calcHexSize, latLng2xy, xy2latLng } from \"./GeoHexDefines.js\";\nimport { GeoHexZone } from \"./GeoHexZone.js\";\nexport function getXYByLocation(lat, lng, level) {\n const h_size = calcHexSize(level);\n const z_xy = latLng2xy(lat, lng);\n const lng_grid = z_xy.x;\n const lat_grid = z_xy.y;\n const unit_x = 6 * h_size;\n const unit_y = 6 * h_size * H_K;\n const h_pos_x = (lng_grid + lat_grid / H_K) / unit_x;\n const h_pos_y = (lat_grid - H_K * lng_grid) / unit_y;\n const h_x_0 = Math.floor(h_pos_x);\n const h_y_0 = Math.floor(h_pos_y);\n const h_x_q = h_pos_x - h_x_0;\n const h_y_q = h_pos_y - h_y_0;\n let x = Math.round(h_pos_x);\n let y = Math.round(h_pos_y);\n if (h_y_q > -h_x_q + 1) {\n if ((h_y_q < 2 * h_x_q) && (h_y_q > 0.5 * h_x_q)) {\n x = h_x_0 + 1;\n y = h_y_0 + 1;\n }\n }\n else if (h_y_q < -h_x_q + 1) {\n if ((h_y_q > (2 * h_x_q) - 1) && (h_y_q < (0.5 * h_x_q) + 0.5)) {\n x = h_x_0;\n y = h_y_0;\n }\n }\n return adjustXY(x, y, level);\n}\nexport function getZoneByXY(xyl) {\n let { x, y } = xyl;\n const { level } = xyl;\n const h_size = calcHexSize(level);\n const unit_x = 6 * h_size;\n const unit_y = 6 * h_size * H_K;\n const h_lat = (H_K * x * unit_x + y * unit_y) / 2;\n const h_lng = (h_lat - y * unit_y) / H_K;\n const z_loc = xy2latLng(h_lng, h_lat);\n let z_loc_x = z_loc.lng;\n const z_loc_y = z_loc.lat;\n const max_hsteps = Math.pow(3, level + 2);\n const hsteps = Math.abs(x - y);\n if (hsteps === max_hsteps) {\n if (x > y) {\n const tmp = x;\n x = y;\n y = tmp;\n }\n z_loc_x = -180;\n }\n const code3_x = [];\n const code3_y = [];\n let mod_x = x;\n let mod_y = y;\n for (let i = 0; i <= level + 2; i++) {\n const h_pow = Math.pow(3, level + 2 - i);\n if (mod_x >= Math.ceil(h_pow / 2)) {\n code3_x[i] = 2;\n mod_x -= h_pow;\n }\n else if (mod_x <= -Math.ceil(h_pow / 2)) {\n code3_x[i] = 0;\n mod_x += h_pow;\n }\n else {\n code3_x[i] = 1;\n }\n if (mod_y >= Math.ceil(h_pow / 2)) {\n code3_y[i] = 2;\n mod_y -= h_pow;\n }\n else if (mod_y <= -Math.ceil(h_pow / 2)) {\n code3_y[i] = 0;\n mod_y += h_pow;\n }\n else {\n code3_y[i] = 1;\n }\n if (i === 2 && (z_loc_x === -180 || z_loc_x >= 0)) {\n if (code3_x[0] === 2 &&\n code3_y[0] === 1 &&\n code3_x[1] === code3_y[1] &&\n code3_x[2] === code3_y[2]) {\n code3_x[0] = 1;\n code3_y[0] = 2;\n }\n else if (code3_x[0] === 1 &&\n code3_y[0] === 0 &&\n code3_x[1] === code3_y[1] &&\n code3_x[2] === code3_y[2]) {\n code3_x[0] = 0;\n code3_y[0] = 1;\n }\n }\n }\n let h_code = \"\";\n for (let i = 0; i < code3_x.length; i++) {\n const code3 = (\"\" + code3_x[i] + code3_y[i]);\n const code9 = parseInt(code3, 3);\n h_code += code9.toString(10);\n }\n const h_2 = h_code.slice(3);\n const h_1 = h_code.slice(0, 3);\n const h_1_num = parseInt(h_1, 10) || 0;\n const h_a1 = Math.floor(h_1_num / 30);\n const h_a2 = h_1_num % 30;\n h_code = H_KEY[h_a1] + H_KEY[h_a2] + h_2;\n return new GeoHexZone(z_loc_y, z_loc_x, xyl.x, xyl.y, h_code);\n}\nexport function getXYByCode(code) {\n const level = code.length - 2;\n //const h_size:number = calcHexSize(level);\n //const unit_x:number = 6 * h_size;\n //const unit_y:number = 6 * h_size * H_K;\n let x = 0;\n let y = 0;\n let h_dec9 = (H_KEY.indexOf(code[0]) * 30 + H_KEY.indexOf(code[1])) + code.slice(2);\n if (/[15]/.test(h_dec9[0]) &&\n /[^125]/.test(h_dec9[1]) &&\n /[^125]/.test(h_dec9[2])) {\n if (h_dec9[0] === \"5\") {\n h_dec9 = \"7\" + h_dec9.slice(1, h_dec9.length);\n }\n else if (h_dec9[0] === \"1\") {\n h_dec9 = \"3\" + h_dec9.slice(1, h_dec9.length);\n }\n }\n let d9xlen = h_dec9.length;\n for (let i = 0; i < level + 3 - d9xlen; i++) {\n h_dec9 = \"0\" + h_dec9;\n ++d9xlen;\n }\n let h_dec3 = \"\";\n for (let i = 0; i < d9xlen; i++) {\n const h_dec0 = parseInt(h_dec9[i]).toString(3);\n if (!h_dec0) {\n h_dec3 += \"00\";\n }\n else if (h_dec0.length === 1) {\n h_dec3 += \"0\";\n }\n h_dec3 += h_dec0;\n }\n let h_decx = [];\n let h_decy = [];\n for (let i = 0; i < h_dec3.length / 2; i++) {\n h_decx[i] = h_dec3[i * 2];\n h_decy[i] = h_dec3[i * 2 + 1];\n }\n for (let i = 0; i <= level + 2; i++) {\n let h_pow = Math.pow(3, level + 2 - i);\n if (h_decx[i] === \"0\") {\n x -= h_pow;\n }\n else if (h_decx[i] === \"2\") {\n x += h_pow;\n }\n if (h_decy[i] === \"0\") {\n y -= h_pow;\n }\n else if (h_decy[i] === \"2\") {\n y += h_pow;\n }\n }\n return adjustXY(x, y, level);\n}\nfunction adjustXY(x, y, level) {\n //let rev:boolean = false; // -180 deg reversed\n let max_hsteps = Math.pow(3, level + 2);\n let hsteps = Math.abs(x - y);\n if (hsteps === max_hsteps && x > y) {\n let tmp = x;\n x = y;\n y = tmp;\n //rev = true;\n }\n else if (hsteps > max_hsteps) {\n const dif = hsteps - max_hsteps;\n const dif_x = Math.floor(dif / 2);\n const dif_y = dif - dif_x;\n let edge_x = 0;\n let edge_y = 0;\n if (x > y) {\n edge_x = x - dif_x;\n edge_y = y + dif_y;\n const h_xy = edge_x;\n edge_x = edge_y;\n edge_y = h_xy;\n x = edge_x + dif_x;\n y = edge_y - dif_y;\n }\n else if (y > x) {\n edge_x = x + dif_x;\n edge_y = y - dif_y;\n const h_xy = edge_x;\n edge_x = edge_y;\n edge_y = h_xy;\n x = edge_x - dif_x;\n y = edge_y + dif_y;\n }\n }\n return { x, y, level };\n}\nexport function getXYListByRect(a_lat, a_lng, b_lat, b_lng, level) {\n const base_steps = Math.pow(3, level + 2) * 2;\n const min_lat = (a_lat > b_lat) ? b_lat : a_lat;\n const max_lat = (a_lat < b_lat) ? b_lat : a_lat;\n const min_lng = a_lng;\n const max_lng = b_lng;\n const zone_tl = getZoneByXY(getXYByLocation(max_lat, min_lng, level));\n const zone_bl = getZoneByXY(getXYByLocation(min_lat, min_lng, level));\n const zone_br = getZoneByXY(getXYByLocation(min_lat, max_lng, level));\n const zone_tr = getZoneByXY(getXYByLocation(max_lat, max_lng, level));\n const h_size = zone_br.getHexSize();\n const bl_xy = latLng2xy(zone_bl.lat, zone_bl.lng);\n const bl_cl = xy2latLng(bl_xy.x - h_size, bl_xy.y).lng;\n const bl_cr = xy2latLng(bl_xy.x + h_size, bl_xy.y).lng;\n const br_xy = latLng2xy(zone_br.lat, zone_br.lng);\n const br_cl = xy2latLng(br_xy.x - h_size, br_xy.y).lng;\n const br_cr = xy2latLng(br_xy.x + h_size, br_xy.y).lng;\n const s_steps = getXSteps(min_lng, max_lng, zone_bl, zone_br);\n const w_steps = getYSteps(min_lng, zone_bl, zone_tl);\n const n_steps = getXSteps(min_lng, max_lng, zone_tl, zone_tr);\n const e_steps = getYSteps(max_lng, zone_br, zone_tr);\n const edge = { l: 0, r: 0, t: 0, b: 0 };\n if (s_steps === n_steps && s_steps >= base_steps) {\n edge.l = 0;\n edge.r = 0;\n }\n else {\n if (min_lng > 0 && zone_bl.lng === -180) {\n const m_lng = min_lng - 360;\n if (bl_cr < m_lng) {\n edge.l = 1;\n }\n if (bl_cl > m_lng) {\n edge.l = -1;\n }\n }\n else {\n if (bl_cr < min_lng) {\n edge.l = 1;\n }\n if (bl_cl > min_lng) {\n edge.l = -1;\n }\n }\n if (max_lng > 0 && zone_br.lng === -180) {\n const m_lng = max_lng - 360;\n if (br_cr < m_lng) {\n edge.r = 1;\n }\n if (br_cl > m_lng) {\n edge.r = -1;\n }\n }\n else {\n if (br_cr < max_lng) {\n edge.r = 1;\n }\n if (br_cl > max_lng) {\n edge.r = -1;\n }\n }\n }\n if (zone_bl.lat > min_lat) {\n edge.b++;\n }\n if (zone_tl.lat > max_lat) {\n edge.t++;\n }\n const s_list = getXList(zone_bl, s_steps, edge.b);\n const w_list = getYList(zone_bl, w_steps, edge.l);\n const tl_end = { x: w_list[w_list.length - 1].x, y: w_list[w_list.length - 1].y };\n const br_end = { x: s_list[s_list.length - 1].x, y: s_list[s_list.length - 1].y };\n const n_list = getXList(tl_end, n_steps, edge.t);\n const e_list = getYList(br_end, e_steps, edge.r);\n return mergeList(s_list.concat(w_list, n_list, e_list), level);\n}\nfunction getXList(_min, _xsteps, _edge) {\n const list = [];\n for (let i = 0; i < _xsteps; i++) {\n const x = _edge ? _min.x + Math.floor(i / 2) : _min.x + Math.ceil(i / 2);\n const y = _edge ? _min.y + Math.floor(i / 2) - i : _min.y + Math.ceil(i / 2) - i;\n list.push({ x, y });\n }\n return list;\n}\nfunction getYList(_min, _ysteps, _edge) {\n const list = [];\n const steps_base = Math.floor(_ysteps);\n const steps_half = _ysteps - steps_base;\n for (let i = 0; i < steps_base; i++) {\n const x = _min.x + i;\n const y = _min.y + i;\n list.push({ x, y });\n if (_edge !== 0) {\n if (steps_half === 0 && i === steps_base - 1) {\n }\n else {\n const x = (_edge > 0) ? _min.x + i + 1 : _min.x + i;\n const y = (_edge < 0) ? _min.y + i + 1 : _min.y + i;\n list.push({ x, y });\n }\n }\n }\n return list;\n}\nfunction getXSteps(_minlng, _maxlng, _min, _max) {\n const minsteps = Math.abs(_min.x - _min.y);\n const maxsteps = Math.abs(_max.x - _max.y);\n const code = _min.code;\n const base_steps = Math.pow(3, code.length) * 2;\n let steps = 0;\n if (_min.lng == -180 && _max.lng == -180) {\n if ((_minlng > _maxlng && _minlng * _maxlng >= 0) ||\n (_minlng < 0 && _maxlng > 0)) {\n steps = base_steps;\n }\n else {\n steps = 0;\n }\n }\n else if (Math.abs(_min.lng - _max.lng) < 0.0000000001) {\n if (_min.lng != -180 && _minlng > _maxlng) {\n steps = base_steps;\n }\n else {\n steps = 0;\n }\n }\n else if (_min.lng < _max.lng) {\n if (_min.lng <= 0 && _max.lng <= 0) {\n steps = minsteps - maxsteps;\n }\n else if (_min.lng <= 0 && _max.lng >= 0) {\n steps = minsteps + maxsteps;\n }\n else if (_min.lng >= 0 && _max.lng >= 0) {\n steps = maxsteps - minsteps;\n }\n }\n else if (_min.lng > _max.lng) {\n if (_min.lng <= 0 && _max.lng <= 0) {\n steps = base_steps - maxsteps + minsteps;\n }\n else if (_min.lng >= 0 && _max.lng <= 0) {\n steps = base_steps - (minsteps + maxsteps);\n }\n else if (_min.lng >= 0 && _max.lng >= 0) {\n steps = base_steps + maxsteps - minsteps;\n }\n }\n return steps + 1;\n}\nfunction getYSteps(_lng, _min, _max) {\n let min_x = _min.x;\n let min_y = _min.y;\n let max_x = _max.x;\n let max_y = _max.y;\n if (_lng > 0) {\n if (_min.lng !== -180 && _max.lng === -180) {\n max_x = _max.y;\n max_y = _max.x;\n }\n if (_min.lng === -180 && _max.lng !== -180) {\n min_x = _min.y;\n min_y = _min.x;\n }\n }\n const steps = Math.abs(min_y - max_y);\n const half = Math.abs(max_x - min_x) - Math.abs(max_y - min_y);\n return steps + half * 0.5 + 1;\n}\nfunction mergeList(_arr, _level) {\n const newArr = [];\n const mrgArr = [];\n _arr.sort(function (a, b) {\n return (a.x > b.x ? 1 : a.x < b.x ? -1 : a.y < b.y ? 1 : -1);\n });\n for (let i = 0; i < _arr.length; i++) {\n if (!i) {\n var inner_xy = adjustXY(_arr[i].x, _arr[i].y, _level);\n var x = inner_xy.x;\n var y = inner_xy.y;\n if (!mrgArr[x]) {\n mrgArr[x] = [];\n }\n if (!mrgArr[x][y]) {\n mrgArr[x][y] = true;\n newArr.push({ x, y });\n }\n }\n else {\n var mrg = margeCheck(_arr[i - 1], _arr[i]);\n for (let j = 0; j < mrg; j++) {\n const inner_xy = adjustXY(_arr[i].x, _arr[i].y + j, _level);\n const x = inner_xy.x;\n const y = inner_xy.y;\n if (!mrgArr[x]) {\n mrgArr[x] = [];\n }\n if (!mrgArr[x][y]) {\n mrgArr[x][y] = true;\n newArr.push({ x, y });\n }\n }\n }\n }\n return newArr;\n}\nfunction margeCheck(_pre, _next) {\n if (_pre.x === _next.x) {\n if (_pre.y === _next.y) {\n return 0;\n }\n return Math.abs(_next.y - _pre.y);\n }\n return 1;\n}\n","import { getZoneByXY, getXYByCode, getXYByLocation, getXYListByRect } from \"./GeoHexCore.js\";\nexport class GeoHex {\n // Convert a map location(lat,lng) to a GeoHex Zone structure.\n static getZoneByLocation(lat, lng, level) {\n return getZoneByXY(getXYByLocation(lat, lng, level));\n }\n // Convert a GeoHex position(x,y) to a GeoHex Zone structure.\n static getZoneByXY(x, y, level) {\n return getZoneByXY({ x, y, level });\n }\n // Convert a GeoHex code string to a GeoHex Zone structure.\n static getZoneByCode(code) {\n return getZoneByXY(getXYByCode(code));\n }\n // Convert a GeoHex position(x,y) to a map location(lat,lng).\n static getXYByLocation(lat, lng, level) {\n return getXYByLocation(lat, lng, level);\n }\n // List the shortest routes from map location A to map location B.\n static getXYListByRect(a_lat, a_lng, b_lat, b_lng, level) {\n return getXYListByRect(a_lat, a_lng, b_lat, b_lng, level);\n }\n}\nGeoHex.version = \"3.2.0\"; // http://geohex.net/src/script/hex_v3.2_core.js\n"],"names":["H_KEY","H_BASE","H_DEG","H_K","calcHexSize","level","latLng2xy","lat","lng","x","y","xy2latLng","GeoHexZone","code","zone","h_lat","h_lng","h_deg","h_size","h_top","h_btm","h_l","h_r","h_cl","h_cr","lon","getXYByLocation","z_xy","lng_grid","lat_grid","unit_x","unit_y","h_pos_x","h_pos_y","h_x_0","h_y_0","h_x_q","h_y_q","adjustXY","getZoneByXY","xyl","z_loc","z_loc_x","z_loc_y","max_hsteps","tmp","code3_x","code3_y","mod_x","mod_y","i","h_pow","h_code","code3","code9","h_2","h_1","h_1_num","h_a1","h_a2","getXYByCode","h_dec9","d9xlen","h_dec3","h_dec0","h_decx","h_decy","hsteps","dif","dif_x","dif_y","edge_x","edge_y","h_xy","getXYListByRect","a_lat","a_lng","b_lat","b_lng","base_steps","min_lat","max_lat","min_lng","max_lng","zone_tl","zone_bl","zone_br","zone_tr","bl_xy","bl_cl","bl_cr","br_xy","br_cl","br_cr","s_steps","getXSteps","w_steps","getYSteps","n_steps","e_steps","edge","m_lng","s_list","getXList","w_list","getYList","tl_end","br_end","n_list","e_list","mergeList","_min","_xsteps","_edge","list","_ysteps","steps_base","steps_half","_minlng","_maxlng","_max","minsteps","maxsteps","steps","_lng","min_x","min_y","max_x","max_y","half","_arr","_level","newArr","mrgArr","a","b","mrg","margeCheck","j","inner_xy","_pre","_next","GeoHex"],"mappings":"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","x_google_ignoreList":[0,1,2,3]}