{ "version": 3, "sources": ["../scripts/pilotgaea-web-shim.js", "../src/openLRDecoder.ts", "../src/tdxCityInfo.ts", "../src/widget-track.ts"], "sourcesContent": ["// \u9019\u4EFD\u6A94\u6848\u7684\u4E3B\u8981\u529F\u80FD\u662F\u5F9E\u700F\u89BD\u5668\u7684 window \u4E0A\u53D6\u5DF2\u7D93\u5B9A\u7FA9\u7684\u7269\u4EF6\u53CA\u985E\u5225 (\u4F8B\u5982 ov, GeoPoint)\u3002\r\n// \u61C9\u5C0D pilotgaea-web/index.d.ts \u7684\u5B9A\u7FA9\r\n\r\n// \u5C0D\u61C9\u5B9A\u7FA9\u6A94 export * as ov from \"./webgl/ov/ov\"\r\nconst ov = window.ov;\r\nexport { ov };\r\n\r\n// \u5C0D\u61C9\u5B9A\u7FA9\u6A94 export * from \"./common/geometry/index\"\r\nconst Geo3DPoint = window.Geo3DPoint;\r\nconst GeoBoundary = window.GeoBoundary;\r\nconst GeoLine = window.GeoLine;\r\nconst GeoPoint = window.GeoPoint;\r\nconst GeoPolygon = window.GeoPolygon;\r\nconst GeoPolygonSet = window.GeoPolygonSet;\r\nconst GeoPolyline = window.GeoPolyline;\r\nconst GeoUtility = window.GeoUtility;\r\nconst CRect = window.CRect;\r\nconst CSize = window.CSize;\r\nexport { Geo3DPoint, GeoBoundary, GeoLine, GeoPoint, GeoPolygon, GeoPolygonSet, GeoPolyline, GeoUtility, CRect, CSize };\r\n\r\n// \u5C0D\u61C9\u5B9A\u7FA9\u6A94 export { GetEPSGEngine } from \"./common/utility/EPSGEngine\";\r\nconst GetEPSGEngine = window.GetEPSGEngine;\r\nexport { GetEPSGEngine };", "export type LRP = {\r\n PositionLon: number;\r\n PositionLat: number;\r\n FRC: number;\r\n FOW: number;\r\n LFRCNP: number;\r\n Bear: number;\r\n DistanceToNext: number;\r\n}\r\n\r\nexport type OpenLRDecodeResult = {\r\n Header: number;\r\nStartLocation: LRP;\r\nMidLocation: LRP[];\r\nEndLocation: LRP;\r\nPosOffset: number;\r\nNegOffset: number;\r\n}\r\n\r\nexport class OpenLRDecoder {\r\n\r\n public static decode(encodedData: string): OpenLRDecodeResult {\r\n let count = 1;\r\n \r\n // \u89E3\u78BC base64 \u5B57\u4E32\r\n const binaryString = atob(encodedData);\r\n const bytes = new Uint8Array(binaryString.length);\r\n for (let i = 0; i < binaryString.length; i++) {\r\n bytes[i] = binaryString.charCodeAt(i);\r\n }\r\n \r\n // \u8F14\u52A9\u51FD\u5F0F\uFF1A\u5F9E Uint8Array \u8B80\u53D6 24 \u4F4D\u6574\u6578\r\n function read24BitInt(array: Uint8Array, offset: number): number { \r\n return (array[offset] << 16) | (array[offset + 1] << 8) | array[offset + 2];\r\n }\r\n \r\n // \u8F14\u52A9\u51FD\u5F0F\uFF1A\u5F9E Uint8Array \u8B80\u53D6 16 \u4F4D\u5E36\u7B26\u865F\u6574\u6578\r\n function read16BitSignedInt(array: Uint8Array, offset: number): number {\r\n const value = (array[offset] << 8) | array[offset + 1];\r\n return value & 0x8000 ? value - 0x10000 : value;\r\n }\r\n \r\n // \u8F14\u52A9\u51FD\u5F0F\uFF1A\u5F9E\u6574\u6578\u89E3\u78BC\u7D93\u7DEF\u5EA6\r\n function decodeCoordinate(integerDegree: number) {\r\n return ((integerDegree - 0.5) * 360) / Math.pow(2, 24);\r\n }\r\n \r\n // \u89E3\u6790 LRP1\r\n function decodeLRP1(array: Uint8Array, offset: number) {\r\n const lon_originValue = read24BitInt(array, offset);\r\n const lat_originValue = read24BitInt(array, offset + 3);\r\n // console.log(`\u6B63\u5728\u89E3\u6790\u7B2C ${count++} \u500B LRP\uFF1A`);\r\n // console.log(\"lon_originValue:\", lon_originValue);\r\n // console.log(\"lat_originValue:\", lat_originValue);\r\n \r\n const lon = decodeCoordinate(read24BitInt(array, offset));\r\n const lat = decodeCoordinate(read24BitInt(array, offset + 3));\r\n const attr1 = array[offset + 6];\r\n const attr2 = array[offset + 7];\r\n const attr3 = array[offset + 8];\r\n const attr4 = array[offset + 9];\r\n \r\n return {\r\n PositionLon: lon,\r\n PositionLat: lat,\r\n FRC: attr1 >> 3,\r\n FOW: attr1 & 0x07,\r\n LFRCNP: attr2 >> 5,\r\n Bear: (attr2 & 0x1f) * 11.25, // \u8F49\u63DB\u70BA\u5EA6\u6578\r\n DistanceToNext: (attr3 << 8) | attr4,\r\n };\r\n }\r\n \r\n // \u89E3\u6790 LRP2+\r\n function decodeLRP2Plus(array: Uint8Array, offset: number, prevLon: number, prevLat: number) {\r\n const lon_originValue = read16BitSignedInt(array, offset);\r\n const lat_originValue = read16BitSignedInt(array, offset + 2);\r\n // console.log(`\u6B63\u5728\u89E3\u6790\u7B2C ${count++} \u500B LRP\uFF1A`);\r\n // console.log(\"lon_originValue:\", lon_originValue);\r\n // console.log(\"lat_originValue:\", lat_originValue);\r\n \r\n const lonOffset = read16BitSignedInt(array, offset);\r\n const latOffset = read16BitSignedInt(array, offset + 2);\r\n const lon = prevLon + lonOffset * 0.00001; // \u8ABF\u6574\u70BA\u9069\u7576\u7684\u6BD4\u4F8B\r\n const lat = prevLat + latOffset * 0.00001; // \u8ABF\u6574\u70BA\u9069\u7576\u7684\u6BD4\u4F8B\r\n const attr1 = array[offset + 4];\r\n const attr2 = array[offset + 5];\r\n const attr3 = array[offset + 6];\r\n const attr4 = array[offset + 7];\r\n \r\n return {\r\n PositionLon: lon,\r\n PositionLat: lat,\r\n FRC: attr1 >> 3,\r\n FOW: attr1 & 0x07,\r\n LFRCNP: attr2 >> 5,\r\n Bear: (attr2 & 0x1f) * 11.25, // \u8F49\u63DB\u70BA\u5EA6\u6578\r\n DistanceToNext: (attr3 << 8) | attr4,\r\n };\r\n }\r\n \r\n // \u89E3\u6790 header\r\n const header = bytes[0];\r\n \r\n // \u89E3\u6790\u7B2C\u4E00\u500B LRP\r\n const startLRP = decodeLRP1(bytes, 1);\r\n \r\n const numIntermediateLRPs = Math.floor((bytes.length - 18) / 7); // 18 = 1(header) + 9(first LRP) + 6(last LRP) + 2(offsets)\r\n const intermediateLRPs = [];\r\n let prevLon = startLRP.PositionLon;\r\n let prevLat = startLRP.PositionLat;\r\n \r\n for (let i = 0; i < numIntermediateLRPs; i++) {\r\n const lrp = decodeLRP2Plus(bytes, 10 + i * 7, prevLon, prevLat);\r\n intermediateLRPs.push(lrp);\r\n prevLon = lrp.PositionLon;\r\n prevLat = lrp.PositionLat;\r\n }\r\n \r\n const lastLRPOffset = 10 + numIntermediateLRPs * 7;\r\n const endLRP = decodeLRP2Plus(bytes, lastLRPOffset, prevLon, prevLat);\r\n \r\n // \u89E3\u6790 offsets\r\n const posOffset = bytes[bytes.length - 2];\r\n const negOffset = bytes[bytes.length - 1];\r\n \r\n return {\r\n Header: header,\r\n StartLocation: startLRP,\r\n MidLocation: intermediateLRPs,\r\n EndLocation: endLRP,\r\n PosOffset: posOffset,\r\n NegOffset: negOffset,\r\n };\r\n }\r\n}", "/**\r\n * Represents information about a city.\r\n */\r\nexport type cityInfo = {\r\n /**\r\n * The name of the city.\r\n */\r\n CityName: string;\r\n /**\r\n * The code of the city.\r\n */\r\n CityCode: string;\r\n /**\r\n * The English name of the city.\r\n */\r\n CityNameEng: string;\r\n /**\r\n * The ID of the city.\r\n */\r\n CityID: string;\r\n /**\r\n * The code of the county.\r\n */\r\n CountyCode: string;\r\n}\r\n\r\nexport class TDXCityInfo {\r\n private static cities: cityInfo[] = [\r\n { CityName: '\u81FA\u5317\u5E02', CityCode: 'TPE', CityNameEng: 'Taipei', CityID: 'A', CountyCode: '63000' },\r\n { CityName: '\u65B0\u5317\u5E02', CityCode: 'NWT', CityNameEng: 'NewTaipei', CityID: 'F', CountyCode: '65000' },\r\n { CityName: '\u6843\u5712\u5E02', CityCode: 'TAO', CityNameEng: 'Taoyuan', CityID: 'H', CountyCode: '68000' },\r\n { CityName: '\u81FA\u4E2D\u5E02', CityCode: 'TXG', CityNameEng: 'Taichung', CityID: 'B', CountyCode: '66000' },\r\n { CityName: '\u81FA\u5357\u5E02', CityCode: 'TNN', CityNameEng: 'Tainan', CityID: 'D', CountyCode: '67000' },\r\n { CityName: '\u9AD8\u96C4\u5E02', CityCode: 'KHH', CityNameEng: 'Kaohsiung', CityID: 'E', CountyCode: '64000' },\r\n { CityName: '\u57FA\u9686\u5E02', CityCode: 'KEE', CityNameEng: 'Keelung', CityID: 'C', CountyCode: '10017' },\r\n { CityName: '\u65B0\u7AF9\u5E02', CityCode: 'HSZ', CityNameEng: 'Hsinchu', CityID: 'J', CountyCode: '10004' },\r\n { CityName: '\u65B0\u7AF9\u7E23', CityCode: 'HSQ', CityNameEng: 'HsinchuCounty', CityID: 'I', CountyCode: '10020' },\r\n { CityName: '\u82D7\u6817\u7E23', CityCode: 'MIA', CityNameEng: 'MiaoliCounty', CityID: 'K', CountyCode: '10005' },\r\n { CityName: '\u5F70\u5316\u7E23', CityCode: 'CHA', CityNameEng: 'ChanghuaCounty', CityID: 'N', CountyCode: '10007' },\r\n { CityName: '\u5357\u6295\u7E23', CityCode: 'NAN', CityNameEng: 'NantouCounty', CityID: 'M', CountyCode: '10008' },\r\n { CityName: '\u5609\u7FA9\u5E02', CityCode: 'CYI', CityNameEng: 'Chiayi', CityID: 'G', CountyCode: '10002' },\r\n { CityName: '\u5609\u7FA9\u7E23', CityCode: 'CYQ', CityNameEng: 'ChiayiCounty', CityID: 'Q', CountyCode: '10010' },\r\n { CityName: '\u96F2\u6797\u7E23', CityCode: 'YUN', CityNameEng: 'YunlinCounty', CityID: 'P', CountyCode: '10009' },\r\n { CityName: '\u5C4F\u6771\u7E23', CityCode: 'PIF', CityNameEng: 'PingtungCounty', CityID: 'T', CountyCode: '10013' },\r\n { CityName: '\u5B9C\u862D\u7E23', CityCode: 'ILA', CityNameEng: 'YilanCounty', CityID: 'G', CountyCode: '10002' },\r\n { CityName: '\u82B1\u84EE\u7E23', CityCode: 'HUA', CityNameEng: 'HualienCounty', CityID: 'U', CountyCode: '10015' },\r\n { CityName: '\u81FA\u6771\u7E23', CityCode: 'TTT', CityNameEng: 'TaitungCounty', CityID: 'V', CountyCode: '10014' },\r\n { CityName: '\u6F8E\u6E56\u7E23', CityCode: 'PEN', CityNameEng: 'PenghuCounty', CityID: 'X', CountyCode: '10016' },\r\n { CityName: '\u9023\u6C5F\u7E23', CityCode: 'LIE', CityNameEng: 'LienchiangCounty', CityID: 'Z', CountyCode: '9007' },\r\n { CityName: '\u91D1\u9580\u7E23', CityCode: 'KIN', CityNameEng: 'KinmenCounty', CityID: 'W', CountyCode: '9020' }\r\n ];\r\n\r\n /**\r\n * \u6839\u64DA\u57CE\u5E02\u540D\u7A31\u53D6\u5F97\u57CE\u5E02\u8CC7\u8A0A\r\n *\r\n * @static\r\n * @param {string} cityName \u57CE\u5E02\u540D\u7A31, \u4F8B\u5982: '\u81FA\u5317\u5E02'\r\n * @returns {(cityInfo | undefined)}\r\n */\r\n static getCityInfoByCityName(cityName: string): cityInfo | undefined {\r\n return this.cities.find(city => city.CityName.toLocaleLowerCase() === cityName.toLocaleLowerCase());\r\n }\r\n /**\r\n * \u6839\u64DA\u57CE\u5E02\u4EE3\u78BC\u53D6\u5F97\u57CE\u5E02\u8CC7\u8A0A\r\n *\r\n * @static\r\n * @param {string} cityCode \u57CE\u5E02\u4EE3\u78BC, \u4F8B\u5982: 'TPE'\r\n * @returns {(cityInfo | undefined)}\r\n */\r\n static getCityInfoByCityCode(cityCode: string): cityInfo | undefined {\r\n return this.cities.find(city => city.CityCode.toLocaleLowerCase() === cityCode.toLocaleLowerCase());\r\n }\r\n\r\n /**\r\n * \u6839\u64DA\u57CE\u5E02\u82F1\u6587\u540D\u7A31\u53D6\u5F97\u57CE\u5E02\u8CC7\u8A0A\r\n *\r\n * @static\r\n * @param {string} cityNameEng \u57CE\u5E02\u82F1\u6587\u540D\u7A31, \u4F8B\u5982: 'Taipei'\r\n * @returns {(cityInfo | undefined)}\r\n */\r\n static getCityInfoByCityNameEng(cityNameEng: string): cityInfo | undefined {\r\n return this.cities.find(city => city.CityNameEng.toLocaleLowerCase() === cityNameEng.toLocaleLowerCase());\r\n }\r\n\r\n /**\r\n * \u6839\u64DA\u57CE\u5E02ID\u53D6\u5F97\u57CE\u5E02\u8CC7\u8A0A\r\n *\r\n * @static\r\n * @param {string} cityID \u57CE\u5E02ID, \u4F8B\u5982: 'A'\r\n * @returns {(cityInfo | undefined)}\r\n */\r\n static getCityInfoByCityID(cityID: string): cityInfo | undefined {\r\n return this.cities.find(city => city.CityID.toLocaleLowerCase() === cityID.toLocaleLowerCase());\r\n }\r\n\r\n /**\r\n * \u6839\u64DA\u7E23\u5E02\u4EE3\u78BC\u53D6\u5F97\u57CE\u5E02\u8CC7\u8A0A\r\n *\r\n * @static\r\n * @param {string} countyCode \u7E23\u5E02\u4EE3\u78BC, \u4F8B\u5982: '63000'\r\n * @returns {(cityInfo | undefined)}\r\n */\r\n static getCityInfoByCountyCode(countyCode: string): cityInfo | undefined {\r\n return this.cities.find(city => city.CountyCode.toLocaleLowerCase() === countyCode.toLocaleLowerCase());\r\n }\r\n\r\n /**\r\n * \u53D6\u5F97\u6240\u6709\u57CE\u5E02\u8CC7\u8A0A\r\n *\r\n * @static\r\n * @returns {cityInfo[]}\r\n */\r\n static getAllCityInfo(): cityInfo[] {\r\n return this.cities;\r\n }\r\n \r\n}", "\uFEFFimport { ov } from \"./pilotgaea-web\";\r\nimport { OpenLRDecoder } from \"./openLRDecoder\";\r\nimport { TDXCityInfo } from \"./tdxCityInfo\";\r\n\r\n/** */\r\nexport type TrackWidgetSetting = Required & {\r\n /**\r\n * \u4EE3\u7406\u4F3A\u670D\u5668\uFF0C\u53EF\u7D66\u4EE3\u7406\u5982PROXY_URL/{URL}\u3002\r\n * @defaultValue \"\"\r\n */\r\n proxy?: string;\r\n /** \u6642\u9593\u8EF8\u7269\u4EF6\uFF0C\u9700\u6709\u8A2D\u5B9A\u5C07\u6703\u81EA\u52D5\u5C07\u6B77\u53F2\u56DE\u6CE2\u52A0\u5165\u6642\u9593\u8EF8\u3002 */\r\n timeline?: ov.Widget.Timeline;\r\n /**\r\n * \u662F\u5426\u5728\u95DC\u9589Widget\u6642\u6E05\u9664\u6240\u6709\u8ECC\u8DE1\u3002\r\n * @defaultValue true\r\n */\r\n clearOnClose?: boolean;\r\n eTagCities?: string[];\r\n};\r\n\r\nexport interface TDXApiInfo {\r\n /** API\u985E\u578B */\r\n type: string;\r\n /** API\u540D\u7A31 */\r\n name: string;\r\n /** API\u7C21\u7A31 */\r\n shortName: string;\r\n /** API\u8DEF\u5F91 */\r\n url: string;\r\n};\r\n\r\nexport type TDXeTagEntity = {\r\n layer?: ov.CustomLayer;\r\n pairData?: any;\r\n pairDataUpdated?: boolean;\r\n}\r\n\r\nexport type TDXCert = {\r\n client_id: string;\r\n client_secret: string;\r\n grant_type: string;\r\n token?: {\r\n access_token: string;\r\n expires_in: number;\r\n refresh_expires_in: number;\r\n token_type: string;\r\n \"not-before-policy\": number;\r\n scope: string;\r\n timestamp: number;\r\n };\r\n};\r\n\r\n/**\r\n * \u8ECC\u8DE1Widget\r\n *\r\n * \u9700\u52A0\u5165`material-icons.css`\r\n * ```html\r\n * \r\n * ```\r\n * \u6216\u53C3\u7167 {@link https://developers.google.com/fonts/docs/material_icons | Google Fonts Material Icons Guide} \u8A2D\u7F6E\u96E2\u7DDA\u7248\u672C\u3002\r\n */\r\nexport class TrackWidget extends ov.Widget.BaseWidget {\r\n _TerrainView: ov.TerrainView; // \u8981\u8DDFview\u62FF\u6A21\u7D44\r\n _Proxy: string;\r\n _APIServer: string;\r\n _TDXServer: string;\r\n _TDXApi: TDXApiInfo[];\r\n _TDXCert?: TDXCert;\r\n _Timeline: null | ov.Widget.Timeline;\r\n _TrackCount: number;\r\n _ClearOnClose: boolean;\r\n _ResultContainer!: HTMLDivElement;\r\n _ApiContainer!: HTMLDivElement;\r\n _FileContainer!: HTMLDivElement;\r\n _TdxContainer!: HTMLDivElement;\r\n _ResultTabRadio!: HTMLInputElement;\r\n _APIKeyInput!: HTMLInputElement;\r\n _FlightIdInput!: HTMLInputElement;\r\n _OkBtn!: HTMLButtonElement;\r\n _SelectType!: HTMLSelectElement;\r\n _FileInput!: HTMLInputElement;\r\n _UploadBtn!: HTMLButtonElement;\r\n _TdxApiIdInput!: HTMLInputElement;\r\n _TdxApiSecretInput!: HTMLInputElement;\r\n _TdxSelectType!: HTMLSelectElement;\r\n _TdxOkBtn!: HTMLButtonElement; \r\n _HighwayLayer: ov.TerrainCustomTileOverlay | null = null;\r\n _HighwayLegend?: HTMLElement;\r\n _HighwaySectionData?: any;\r\n _HighwaySectionDataUpdated?: boolean;\r\n _ETagEntities: { [key: string]: TDXeTagEntity } = {};\r\n _EtagHsinchuLayer?: ov.CustomLayer;\r\n _EtagHsinchuCountyLayer?: ov.CustomLayer;\r\n _EtagPairsDataHsinchu?: any;\r\n _EtagPairsDataHsinchuUpdated?: boolean;\r\n _EtagPairsDataHsinchuCounty?: any;\r\n _EtagPairsDataHsinchuCountyUpdated?: boolean;\r\n _EtagLegend?: HTMLElement;\r\n\r\n\r\n /**\r\n * \u8ECC\u8DE1Widget\r\n * @param param \u53C3\u6578\u3002\r\n */\r\n constructor(param: TrackWidgetSetting) {\r\n super(param);\r\n this._TerrainView = param.view;\r\n this._Proxy = \"\";\r\n this._APIServer = \"https://aeroapi.flightaware.com/aeroapi/\";\r\n this._Timeline = null;\r\n this._TrackCount = 1;\r\n this._ClearOnClose = true;\r\n\r\n //#region TDX init\r\n this._TDXServer = \"https://tdx.transportdata.tw/api/basic\";\r\n this._TDXApi = [\r\n {\r\n type: \"highway\",\r\n name: \"\u9AD8\u901F\u516C\u8DEF\u767C\u5E03\u8DEF\u6BB5\u5373\u6642\u8DEF\u6CC1\u8CC7\u6599\",\r\n shortName: \"\u9AD8\u901F\u516C\u8DEF\u5373\u6642\u8DEF\u6CC1\",\r\n url: \"/v2/Road/Traffic/Live/Freeway\",\r\n }\r\n ];\r\n\r\n if (param.eTagCities) {\r\n const cities = param.eTagCities;\r\n // \u6AA2\u67E5\u662F\u5426\u70BA\u5B57\u4E32\u9663\u5217\r\n if (cities.every((city) => typeof city === \"string\")) {\r\n this._TDXApi.push(\r\n ...cities\r\n .map((city) => {\r\n const cityInfo = TDXCityInfo.getCityInfoByCityNameEng(city);\r\n if (cityInfo) {\r\n return {\r\n type: `etag${cityInfo.CityNameEng}`,\r\n name: `${cityInfo.CityName}\u96FB\u5B50\u6A19\u7C64\u9580\u67B6\u914D\u5C0D\u8DEF\u6BB5\u5373\u6642\u8DEF\u6CC1`,\r\n shortName: `${cityInfo.CityName}ETag\u5373\u6642\u8DEF\u6CC1`,\r\n url: `/v2/Road/Traffic/Live/ETag/City/${cityInfo.CityNameEng}`,\r\n };\r\n }\r\n })\r\n .filter((item) => item !== undefined)\r\n );\r\n \r\n }else{\r\n console.error(\"\u5EFA\u7ACB track widget \u4F7F\u7528\u7684 eTagCities \u53C3\u6578\u932F\u8AA4\uFF0C\u8ACB\u6AA2\u67E5\u662F\u5426\u70BA\u5B57\u4E32\u9663\u5217\");\r\n }\r\n }else{\r\n // \u4F7F\u7528\u9810\u8A2D\u503C\r\n this._TDXApi.push(\r\n {\r\n type: \"etagHsinchu\",\r\n name: \"\u65B0\u7AF9\u5E02\u96FB\u5B50\u6A19\u7C64\u9580\u67B6\u914D\u5C0D\u8DEF\u6BB5\u5373\u6642\u8DEF\u6CC1\",\r\n shortName: \"\u65B0\u7AF9\u5E02ETag\u5373\u6642\u8DEF\u6CC1\",\r\n url: \"/v2/Road/Traffic/Live/ETag/City/HsinchuCounty\",\r\n },\r\n {\r\n type: \"etagHsinchuCounty\",\r\n name: \"\u65B0\u7AF9\u7E23\u96FB\u5B50\u6A19\u7C64\u9580\u67B6\u914D\u5C0D\u8DEF\u6BB5\u5373\u6642\u8DEF\u6CC1\",\r\n shortName: \"\u65B0\u7AF9\u7E23ETag\u5373\u6642\u8DEF\u6CC1\",\r\n url: \"/v2/Road/Traffic/Live/ETag/City/Hsinchu\",\r\n }\r\n )\r\n }\r\n\r\n //#endregion TDX init\r\n\r\n this._updateParameter(param);\r\n this._createUI();\r\n this._initEvent();\r\n this._appendToCanvas();\r\n this._init();\r\n }\r\n\r\n _beforeClose() {\r\n if (this._ClearOnClose) {\r\n const results = this._ResultContainer.querySelectorAll(\r\n \".ov-widget-deleteBtn\"\r\n );\r\n for (let i = 0; i < results.length; i++) {\r\n results[i].click();\r\n }\r\n }\r\n }\r\n\r\n _updateParameter(parameter: TrackWidgetSetting) {\r\n if (!parameter) return;\r\n const { proxy, timeline, clearOnClose } = parameter;\r\n this._Proxy = typeof proxy === \"string\" ? proxy : this._Proxy;\r\n this._Timeline = timeline ?? this._Timeline;\r\n this._ClearOnClose =\r\n typeof clearOnClose === \"boolean\" ? clearOnClose : this._ClearOnClose;\r\n }\r\n\r\n _createUI() {\r\n let x = 0;\r\n if (this._TerrainView) {\r\n x = this._TerrainView.canvas.width - 450;\r\n }\r\n this._WidgetUI = new ov.UI.WindowUI({\r\n x: x,\r\n y: 50,\r\n title: \"\u8ECC\u8DE1\u7BA1\u7406\",\r\n closeButton: true,\r\n minimizeButton: true,\r\n draggable: true,\r\n onClose: this._onClose.bind(this),\r\n });\r\n this._WidgetUI.getElement().classList.add(\"ov-widget-trackWidget\");\r\n this._WidgetUI.getElement().classList.add(\"ov-widget-unselectable\");\r\n this._WidgetUI.getElement().classList.add(\"ov-widget-hideScrollBar\");\r\n this._WidgetUI.getTitleElement().classList.add(\"ov-widget-header\");\r\n this.divider = document.createElement(\"div\");\r\n this.divider.classList.add(\"ov-widget-divider\");\r\n\r\n this._ApiContainer = document.createElement(\"div\");\r\n this._ApiContainer.classList.add(\"ov-widget-tabs-content\");\r\n this._ApiContainer.classList.add(\"ov-widget-hideScrollBar\");\r\n this._FileContainer = this._ApiContainer.cloneNode(true) as HTMLDivElement;\r\n this._TdxContainer = this._ApiContainer.cloneNode(true) as HTMLDivElement;\r\n const resultContainer = this._ApiContainer.cloneNode(\r\n true\r\n ) as HTMLDivElement;\r\n this._ResultContainer = document.createElement(\"div\");\r\n this._ResultContainer.classList.add(\"ov-widget-scrollBar\");\r\n this._ResultContainer.style.overflowY = \"auto\";\r\n this._ResultContainer.style.height = \"100%\";\r\n resultContainer.append(this._ResultContainer);\r\n const radio = document.createElement(\"input\");\r\n const label = document.createElement(\"label\");\r\n const t = Math.ceil(new Date().getTime() * Math.random());\r\n radio.classList.add(\"ov-widget-tabs-radio\");\r\n label.classList.add(\"ov-widget-tabs-label\");\r\n radio.name = \"DTM\" + t;\r\n radio.type = \"radio\";\r\n const radio2 = radio.cloneNode(true) as HTMLInputElement;\r\n const radio3 = radio.cloneNode(true) as HTMLInputElement;\r\n this._ResultTabRadio = radio.cloneNode(true) as HTMLInputElement;\r\n const label2 = label.cloneNode(true) as HTMLLabelElement;\r\n const label3 = label.cloneNode(true) as HTMLLabelElement;\r\n const label4 = label.cloneNode(true) as HTMLLabelElement;\r\n radio.checked = true;\r\n radio.id = \"apiTab\" + t;\r\n radio2.id = \"fileTab\" + t;\r\n radio3.id = \"tdxTab\" + t;\r\n this._ResultTabRadio.id = \"resultTab\" + t;\r\n label.classList.add(\"ov-widget-tabs-labelFirst\");\r\n label.innerText = \"API\u8F38\u5165\";\r\n label2.innerText = \"\u4E0A\u50B3\u6A94\u6848\";\r\n label3.innerText = \"\u4E32\u63A5TDX\";\r\n label4.classList.add(\"ov-widget-tabs-labelLast\");\r\n label4.innerText = \"\u6E05\u55AE\";\r\n label.setAttribute(\"for\", radio.id);\r\n label2.setAttribute(\"for\", radio2.id);\r\n label3.setAttribute(\"for\", radio3.id);\r\n label4.setAttribute(\"for\", this._ResultTabRadio.id);\r\n\r\n this._APIKeyInput = document.createElement(\"input\");\r\n this._APIKeyInput.setAttribute(\"type\", \"text\");\r\n this._APIKeyInput.setAttribute(\"id\", \"widget-track-tdx-flightaware-key\");\r\n this._APIKeyInput.placeholder = \"\u8ACB\u81F3 Flightaware \u5B98\u7DB2\u8A3B\u518A\u53D6\u5F97API Key\"; \r\n this._InsertContent(\"API Key\", this._APIKeyInput, this._ApiContainer);\r\n\r\n this._FlightIdInput = document.createElement(\"input\");\r\n this._FlightIdInput.setAttribute(\"type\", \"text\");\r\n\tthis._FlightIdInput.setAttribute(\"id\", \"widget-track-tdx-flightaware-id\");\r\n this._FlightIdInput.placeholder = \"\u8ACB\u8F38\u5165\u98DB\u822AID\"; \r\n this._InsertContent(\"ID\", this._FlightIdInput, this._ApiContainer);\r\n\r\n this._OkBtn = document.createElement(\"button\");\r\n this._OkBtn.classList.add(\"ov-widget-btn\");\r\n this._OkBtn.innerText = \"\u65B0\u589E\";\r\n this._ApiContainer.append(this._OkBtn);\r\n\r\n this._SelectType = document.createElement(\"select\");\r\n this._SelectType.classList.add(\"ov-widget-select\");\r\n [\"GPX\", \"FlightAware\", \"FlightRadarCSV\", \"AIS\"].forEach((value) => {\r\n const op = document.createElement(\"option\");\r\n op.text = value;\r\n this._SelectType.append(op);\r\n });\r\n\r\n this._FileInput = document.createElement(\"input\");\r\n this._FileInput.type = \"file\";\r\n\r\n this._UploadBtn = document.createElement(\"button\");\r\n this._UploadBtn.classList.add(\"ov-widget-btn\");\r\n this._UploadBtn.innerText = \"\u78BA\u8A8D\u4E0A\u50B3\";\r\n this._FileContainer.append(this._SelectType);\r\n this._FileContainer.append(this.divider.cloneNode(true));\r\n this._FileContainer.append(this._FileInput);\r\n this._FileContainer.append(this.divider.cloneNode(true));\r\n this._FileContainer.append(this._UploadBtn);\r\n\r\n //#region TDX Tab\r\n\r\n this._TdxApiIdInput = document.createElement(\"input\");\r\n this._TdxApiIdInput.setAttribute(\"type\", \"text\");\r\n this._TdxApiIdInput.setAttribute(\"id\", \"widget-track-tdx-id\");\r\n this._TdxApiIdInput.placeholder = \"\u8ACB\u81F3 TDX \u5B98\u7DB2\u8A3B\u518A\u53D6\u5F97 API Client Id\";\r\n\r\n this._TdxApiSecretInput = document.createElement(\"input\");\r\n this._TdxApiSecretInput.setAttribute(\"type\", \"text\");\r\n this._TdxApiSecretInput.setAttribute(\"id\", \"widget-track-tdx-secret\");\r\n this._TdxApiSecretInput.placeholder =\r\n \"\u8ACB\u81F3 TDX \u5B98\u7DB2\u8A3B\u518A\u53D6\u5F97 API Client Secret\";\r\n\r\n this._TdxSelectType = document.createElement(\"select\");\r\n this._TdxSelectType.classList.add(\"ov-widget-select\");\r\n this._TDXApi.forEach((value) => {\r\n const op = document.createElement(\"option\");\r\n op.text = value.name;\r\n this._TdxSelectType.append(op);\r\n });\r\n\r\n this._TdxOkBtn = document.createElement(\"button\");\r\n this._TdxOkBtn.classList.add(\"ov-widget-btn\");\r\n this._TdxOkBtn.innerText = \"\u65B0\u589E\";\r\n\r\n this._TdxContainer.append(this._TdxSelectType);\r\n this._TdxContainer.append(this.divider.cloneNode(true));\r\n this._InsertContent(\r\n \"Client ID\",\r\n this._TdxApiIdInput,\r\n this._TdxContainer,\r\n false\r\n ).style.marginBottom = \"0.2rem\";\r\n this._InsertContent(\r\n \"Client Secret\",\r\n this._TdxApiSecretInput,\r\n this._TdxContainer\r\n );\r\n this._TdxContainer.append(this._TdxOkBtn);\r\n\r\n //#endregion TDX Tab\r\n\r\n const mainContainer = this._WidgetUI.getContentElement();\r\n mainContainer.classList.add(\"ov-widget-tabs\");\r\n mainContainer.append(radio);\r\n mainContainer.append(label);\r\n mainContainer.append(this._ApiContainer);\r\n mainContainer.append(radio2);\r\n mainContainer.append(label2);\r\n mainContainer.append(this._FileContainer);\r\n mainContainer.append(radio3);\r\n mainContainer.append(label3);\r\n mainContainer.append(this._TdxContainer);\r\n mainContainer.append(this._ResultTabRadio);\r\n mainContainer.append(label4);\r\n mainContainer.append(resultContainer);\r\n \r\n // @ts-ignore\r\n window.eTagEntities = this._ETagEntities;\r\n }\r\n\r\n _InsertContent(\r\n label: string,\r\n content: HTMLElement,\r\n container: HTMLElement,\r\n withDivider: boolean = true\r\n ) {\r\n const innerContainer = document.createElement(\"div\");\r\n innerContainer.classList.add(\"ov-widget-inputContainer\");\r\n\r\n const labelContainer = document.createElement(\"div\");\r\n labelContainer.classList.add(\"ov-widget-inputTitle\");\r\n labelContainer.innerText = label;\r\n innerContainer.append(labelContainer);\r\n\r\n content.classList.add(\"ov-widget-inputItem\");\r\n innerContainer.append(content);\r\n\r\n container.append(innerContainer);\r\n\r\n withDivider && container.append(this.divider.cloneNode(true));\r\n\r\n return innerContainer;\r\n }\r\n\r\n _initEvent() {\r\n this._OkBtn.addEventListener(\"click\", (evt) => {\r\n if (!this._APIKeyInput.value) {\r\n ov.UI.Alertify.Error(\"\u8ACB\u5148\u8F38\u5165\u8A8D\u8B49\u78BC\");\r\n } else if (this._FlightIdInput.value) {\r\n const request = new XMLHttpRequest();\r\n request.onreadystatechange = function (\r\n this: TrackWidget,\r\n xmlHttp: XMLHttpRequest\r\n ) {\r\n if (xmlHttp.readyState === 4) {\r\n if (xmlHttp.status === 200) {\r\n this._TerrainView.getModule(\"track\").addFlightAwareEntity({\r\n source: JSON.parse(xmlHttp.responseText),\r\n callback: this._addEntityComplete.bind(\r\n this,\r\n\t\t\t\t \"FlightAwareAPI\",\r\n this._FlightIdInput.value\r\n ),\r\n });\r\n } else {\r\n ov.UI.Alertify.Error(\"API Server \u56DE\u61C9\uFF1A\" + xmlHttp.statusText);\r\n }\r\n }\r\n }.bind(this, request);\r\n try {\r\n request.open(\r\n \"GET\",\r\n this._Proxy +\r\n this._APIServer +\r\n \"flights/\" +\r\n this._FlightIdInput.value +\r\n \"/track\",\r\n true\r\n );\r\n request.setRequestHeader(\"Accept\", \"application/json;charset=UTF-8\");\r\n request.setRequestHeader(\"x-apikey\", this._APIKeyInput.value);\r\n request.send(null);\r\n } catch (e: any) {\r\n ov.UI.Alertify.Error(e.toString());\r\n }\r\n ov.UI.Alertify.Notify(\"\u5411API\u8ACB\u6C42\u8CC7\u6599\u4E2D\uFF0C\u8ACB\u7A0D\u5F8C...\");\r\n } else {\r\n ov.UI.Alertify.Error(\"\u8ACB\u5148\u8F38\u5165Flight Id\");\r\n }\r\n });\r\n\r\n this._UploadBtn.addEventListener(\"click\", (evt) => {\r\n\t\t// const fileTypes = [\"GPX\", \"FlightAware\", \"FlightRadarCSV\", \"AIS\"];\r\n if (this._FileInput.files!.length) {\r\n const param = {\r\n onGround: false,\r\n source: this._FileInput.files![0],\r\n callback: this._addEntityComplete.bind(\r\n this,\r\n\t\t\tthis._SelectType.options[this._SelectType.selectedIndex].text,\r\n this._FileInput.files![0].name\r\n ),\r\n };\r\n const mod = this._TerrainView.getModule(\"track\");\r\n switch (this._SelectType.selectedIndex) {\r\n case 0:\r\n param.onGround = true;\r\n mod.addGPXEntity(param);\r\n break;\r\n case 1:\r\n mod.addFlightAwareEntity(param);\r\n break;\r\n case 2:\r\n mod.addFlightRadarEntity(param);\r\n break;\r\n case 3:\r\n mod.addAISEntity(param);\r\n break;\r\n }\r\n }\r\n });\r\n\r\n this._TdxOkBtn.addEventListener(\"click\", (evt) => {\r\n\r\n if (!this._TdxApiSecretInput.value) {\r\n ov.UI.Alertify.Error(\"\u8ACB\u5148\u8F38\u5165 TDX APIKEY\");\r\n } else {\r\n this._addTDXEntity(this._TdxSelectType.value);\r\n }\r\n });\r\n }\r\n\r\n _init() {\r\n const t = Math.ceil(new Date().getTime() * Math.random());\r\n this._HighwayLayer = this._TerrainView.addTerrainCustomTileOverlay({\r\n layername: \"TrackWidget-Highway-\" + t,\r\n })!;\r\n this._EtagHsinchuLayer = this._TerrainView.addCustomLayer({\r\n layername: \"TrackWidget-Etag-Hsinchu-\" + t,\r\n })!;\r\n this._EtagHsinchuCountyLayer = this._TerrainView.addCustomLayer({\r\n layername: \"TrackWidget-Etag-HsinchuCounty-\" + t,\r\n })!;\r\n\r\n // this._HighwayLayer = this._TerrainView.addTerrainCustomTileOverlay({\r\n // layername: \"TestCustomTile\",\r\n // });\r\n }\r\n\r\n _addEntityComplete(type: string, info: string = \"\", result: string | any) {\r\n if (result) { \r\n if (typeof result === \"string\") {\r\n ov.UI.Alertify.Error(result);\r\n } else if (\r\n result._entity._MarkEntities.length === 0 &&\r\n result._entity._PathEntities.length === 0 &&\r\n (!result.isAis || result.tracks.length === 0)\r\n ) {\r\n ov.UI.Alertify.Error(\"\u78BA\u8A8D\u6A94\u6848\u5167\u5BB9\u8207\u985E\u578B\u662F\u5426\u5339\u914D\");\r\n } else {\r\n const wrapper = document.createElement(\"div\");\r\n\t\twrapper.classList.add(\"ov-widget-trackWidget-resultRecord\");\r\n\r\n\t\tconst infoContainer = document.createElement(\"div\");\r\n\t\tinfoContainer.style.display = \"flex\";\r\n\t\tinfoContainer.style.flexDirection = \"column\";\r\n\t\tinfoContainer.style.flexGrow = \"1\";\r\n\t\tconst titleEle = document.createElement(\"div\");\r\n\t\ttitleEle.style.textOverflow = \"ellipsis\";\t\r\n\t\ttitleEle.innerText = type;\r\n\t\ttitleEle.setAttribute(\"title\", titleEle.innerText);\r\n\t\tconst infoEle = document.createElement(\"div\");\r\n\t\tinfoEle.style.textOverflow = \"ellipsis\";\r\n\t\tinfoEle.style.fontSize = \"0.8rem\";\t\r\n\t\tinfoEle.innerText = info;\r\n\t\tinfoEle.setAttribute(\"title\", infoEle.innerText);\r\n\t\t\r\n\t\tinfoContainer.append(titleEle);\r\n\t\tinfoContainer.append(infoEle);\r\n\r\n\t\tconst btnContainer = document.createElement(\"div\");\r\n\t\tbtnContainer.style.display = \"flex\";\r\n\r\n const locateBtn = document.createElement(\"button\");\r\n locateBtn.classList.add(\"ov-widget-smallBtn\");\r\n const showBtn = locateBtn.cloneNode(true) as HTMLButtonElement;\r\n const deleteBtn = locateBtn.cloneNode(true) as HTMLButtonElement;\r\n locateBtn.classList.add(\"ov-widget-locateBtn\");\r\n locateBtn.setAttribute(\"title\", \"\u5B9A\u4F4D\");\r\n showBtn.classList.add(\"ov-widget-showBtn\");\r\n showBtn.classList.add(\"active\");\r\n showBtn.setAttribute(\"title\", \"\u96B1\u85CF/\u986F\u793A\");\r\n deleteBtn.classList.add(\"ov-widget-deleteBtn\");\r\n deleteBtn.setAttribute(\"title\", \"\u79FB\u9664\");\r\n const mod = this._TerrainView.getModule(\"track\");\r\n\r\n locateBtn.addEventListener(\"click\", (event) => {\r\n result.goto();\r\n });\r\n\r\n showBtn.addEventListener(\"click\", (event) => {\r\n showBtn.classList.toggle(\"active\");\r\n result.show = showBtn.classList.contains(\"active\");\r\n this._TerrainView.updateScreen();\r\n });\r\n\r\n deleteBtn.addEventListener(\"click\", (event) => {\r\n mod.removeEntity(result);\r\n if (result.isAis) {\r\n result.tracks.forEach((ent: any) => {\r\n mod.removeEntity(ent);\r\n });\r\n }\r\n\r\n if (this._Timeline) {\r\n this._Timeline.removeLink(result);\r\n }\r\n wrapper.remove();\r\n this._TerrainView.updateScreen();\r\n });\r\n\r\n\t\tbtnContainer.append(showBtn);\r\n\t\tbtnContainer.append(locateBtn);\r\n\t\tbtnContainer.append(deleteBtn);\r\n \r\n const _title = info;\r\n\r\n // wrapper.append(_title);\r\n // wrapper.append(deleteBtn);\r\n // wrapper.append(locateBtn);\r\n // wrapper.append(showBtn);\r\n \r\n if (this._Timeline && result.playingInfo) {\r\n if (result.play !== null) {\r\n showBtn.classList.remove(\"active\");\r\n this._Timeline.addLink(result, _title);\r\n }\r\n\r\n const block = this._TerrainView.addTimeEvent({\r\n start: result.playingInfo.TimeSpan[0],\r\n end: result.playingInfo.TimeSpan[1],\r\n onEnter: function () {\r\n showBtn.classList.add(\"active\");\r\n },\r\n onLeave: function () {\r\n showBtn.classList.remove(\"active\");\r\n },\r\n });\r\n\r\n deleteBtn.addEventListener(\"click\", (event) => {\r\n this._TerrainView.removeTimeEvent(block);\r\n });\r\n\r\n const resetBtn = document.createElement(\"button\");\r\n resetBtn.classList.add(\"ov-widget-smallBtn\");\r\n resetBtn.classList.add(\"ov-widget-resetBtn\");\r\n resetBtn.setAttribute(\"title\", \"\u56DE\u5230\u8D77\u9EDE\");\r\n resetBtn.addEventListener(\"click\", (event) => {\r\n this._Timeline!.updateTime(result.playingInfo.TimeSpan[0]);\r\n });\r\n\t\t\r\n\t\t btnContainer.prepend(resetBtn); \r\n\r\n const fastForwardBtn = document.createElement(\"button\");\r\n fastForwardBtn.classList.add(\"ov-widget-smallBtn\");\r\n fastForwardBtn.classList.add(\"ov-widget-fastForwardBtn\");\r\n fastForwardBtn.setAttribute(\"title\", \"\u5FEB\u8F49\u81F3\u6307\u5B9A\u6642\u9593\");\r\n fastForwardBtn.addEventListener(\"click\", (event) => {\r\n const timeOffset = new Date().getTimezoneOffset() * 60000;\r\n const value = new Date(\r\n result.playingInfo.TimeSpan[0].getTime() - timeOffset\r\n )\r\n .toISOString()\r\n .slice(0, -1);\r\n new ov.UI.FormDialog(this._TerrainView, {\r\n form: {\r\n formContents: {\r\n Time: {\r\n type: \"datetime-local\",\r\n value: value,\r\n },\r\n },\r\n formTitle: {\r\n icon: \"fast_forward\",\r\n text: \"\u6307\u5B9A\u6642\u9593\",\r\n },\r\n },\r\n onOk: (value) => {\r\n this._Timeline!.updateTime(\r\n new Date(\r\n Math.min(\r\n result.playingInfo.TimeSpan[1].getTime(),\r\n Math.max(\r\n result.playingInfo.TimeSpan[0].getTime(),\r\n new Date(value.Time).getTime()\r\n )\r\n )\r\n )\r\n );\r\n },\r\n mask: true,\r\n });\r\n });\r\n\r\n\t\t btnContainer.prepend(fastForwardBtn);\t\t\r\n }\t\t\r\n\t\t\r\n if (result.isAis || type === \"AIS\") {\r\n const target = document.createElement(\"input\");\r\n target.type = \"text\";\r\n target.classList.add(\"ov-widget-trackWidget-targetInput\");\r\n target.setAttribute(\"placeholder\", \"\u8F38\u5165ID\u4EE5\u904E\u6FFE\");\r\n\t\t\tinfoEle.append(target);\r\n // wrapper.append(target);\r\n target.addEventListener(\"input\", (evt) => {\r\n result.targetID = (evt.target as HTMLInputElement).value;\r\n });\r\n }\r\n\r\n\t\twrapper.append(infoContainer);\r\n\t\twrapper.append(btnContainer);\r\n\r\n this._ResultContainer.append(wrapper);\r\n ov.UI.Alertify.Notify(\"\u65B0\u589E\u8ECC\u8DE1\u5B8C\u6210\");\r\n this._ResultTabRadio.checked = true;\r\n }\r\n } else {\r\n ov.UI.Alertify.Error(\"Unknown failure!\");\r\n }\r\n }\r\n\r\n //#region TDX\r\n\r\n async _addTDXEntity(param: string | any) {\r\n if (this._isTokenExpired() || this._isApiInfoChanged()) {\r\n await this._getTDXAuthorizationHeader();\r\n }\r\n\r\n const endpoint = this._TDXApi.find((api) => api.name === param)?.url;\r\n\r\n if (!endpoint) return;\r\n\r\n const result = await this._getTdxDataByAPI(endpoint);\r\n\r\n if (endpoint == \"/v2/Road/Traffic/Live/Freeway\") {\r\n this._highwayTrafficHandler(result);\r\n } else if (endpoint.includes(\"/v2/Road/Traffic/Live/ETag/City\")) {\r\n this._etagTrafficHandler(result);\r\n } \r\n }\r\n\r\n async _addTDXEntityCompleted(\r\n layer: ov.TerrainCustomTileOverlay | ov.CustomLayer | ov.Layer | null | undefined,\r\n type: string,\r\n timeTag: string = \"\"\r\n ) {\r\n\r\n const wrapper = document.createElement(\"div\");\r\n\t wrapper.classList.add(\"ov-widget-trackWidget-resultRecord\");\r\n wrapper.classList.add(\"ov-widget-trackWidget-resultRecord-\" + type);\r\n\r\n\tconst infoContainer = document.createElement(\"div\");\r\n\tinfoContainer.style.display = \"flex\";\r\n\tinfoContainer.style.flexDirection = \"column\";\r\n\tinfoContainer.style.flexGrow = \"1\";\r\n\tconst titleEle = document.createElement(\"div\");\r\n\ttitleEle.style.textOverflow = \"ellipsis\";\t\r\n\ttitleEle.innerText = (this._TDXApi.find((api) => api.type === type))?.shortName || (\"TDX API \u8CC7\u6599\");\r\n\ttitleEle.setAttribute(\"title\", titleEle.innerText);\r\n\tconst infoEle = document.createElement(\"div\");\r\n\tinfoEle.style.textOverflow = \"ellipsis\";\r\n\tinfoEle.style.fontSize = \"0.8rem\";\t\r\n\tinfoEle.innerText = \"\u8CC7\u6599\u6642\u9593\uFF1A\" + timeTag;\r\n\tinfoEle.setAttribute(\"title\", infoEle.innerText);\r\n\r\n\tinfoContainer.append(titleEle);\r\n\tinfoContainer.append(infoEle);\r\n\r\n\tconst btnContainer = document.createElement(\"div\");\r\n\tbtnContainer.style.display = \"flex\";\r\n\r\n const locateBtn = document.createElement(\"button\");\r\n locateBtn.classList.add(\"ov-widget-smallBtn\");\r\n const showBtn = locateBtn.cloneNode(true) as HTMLButtonElement;\r\n const deleteBtn = locateBtn.cloneNode(true) as HTMLButtonElement;\r\n\r\n locateBtn.classList.add(\"ov-widget-locateBtn\");\r\n locateBtn.setAttribute(\"title\", \"\u5B9A\u4F4D\");\r\n showBtn.classList.add(\"ov-widget-showBtn\");\r\n showBtn.classList.add(\"active\");\r\n showBtn.setAttribute(\"title\", \"\u96B1\u85CF/\u986F\u793A\");\r\n deleteBtn.classList.add(\"ov-widget-deleteBtn\");\r\n deleteBtn.setAttribute(\"title\", \"\u79FB\u9664\");\r\n\r\n locateBtn.addEventListener(\"click\", (event) => {\r\n \r\n if (type === \"highway\") { \r\n const point = new window.GeoPoint(120.818713, 23.5684329, 512358);\r\n this._TerrainView.goto({pos:point, distance: point.z});\r\n }\r\n else if (type.includes(\"etag\")) {\r\n const city = type.substring(4);\r\n this.gotoCity(city);\r\n }\r\n \r\n });\r\n\r\n showBtn.addEventListener(\"click\", (event) => {\r\n showBtn.classList.toggle(\"active\");\r\n layer!.show = showBtn.classList.contains(\"active\");\r\n this._TerrainView.updateScreen();\r\n });\r\n\r\n deleteBtn.addEventListener(\"click\", (event) => {\r\n \r\n wrapper.remove();\r\n\r\n if (type === \"highway\") {\r\n this._TerrainView.removeTerrainOverlay(layer as ov.TerrainCustomTileOverlay);\r\n this._HighwayLayer = null;\r\n this._HighwayLegend!.remove();\r\n this._HighwayLegend = undefined;\r\n }\r\n else if (type.includes(\"etag\")) {\r\n this._TerrainView.removeLayer(layer as ov.CustomLayer);\r\n const city = type.substring(4);\r\n this._ETagEntities[city].layer = undefined;\r\n\r\n var widgetUI = this._WidgetUI!.getElement();\r\n var dataItems = widgetUI.querySelectorAll(\r\n \".ov-widget-trackWidget-resultRecord\"\r\n ); \r\n var eTagItemLenght = [...dataItems].filter((item) =>\r\n item.className.includes(\"etag\")\r\n ).length;\r\n \r\n if (eTagItemLenght === 0) {\r\n this._EtagLegend?.remove();\r\n this._EtagLegend = undefined;\r\n }\r\n }\r\n \r\n this._TerrainView.updateScreen();\r\n });\r\n\r\n\tbtnContainer.append(showBtn);\r\n\tbtnContainer.append(locateBtn);\r\n\tbtnContainer.append(deleteBtn);\r\n \r\n wrapper.append(infoContainer);\r\n\twrapper.append(btnContainer);\r\n\r\n \r\n\r\n this._ResultContainer.append(wrapper);\r\n ov.UI.Alertify.Notify(\"\u65B0\u589E\u5373\u6642\u8DEF\u6CC1\u5B8C\u6210\");\r\n this._ResultTabRadio.checked = true;\r\n }\r\n\r\n gotoCity(city: string) {\r\n const cititesPosition: { [key: string]: GeoPoint } = {\r\n Taipei: new window.GeoPoint({\"x\":121.55571411919937,\"y\":25.076538645837857,\"z\":35196.06828161581}),\r\n NewTaipei: new window.GeoPoint({\"x\":121.55674245412945,\"y\":24.970004748848467,\"z\":90706.54013239434}),\r\n Taoyuan: new window.GeoPoint({\"x\":121.16142088123121,\"y\":24.863790162183534,\"z\":80152.81601481442}),\r\n Taichung: new window.GeoPoint({\"x\":120.73242754266391,\"y\":24.187736133348324,\"z\":57121.87407761267}),\r\n Tainan: new window.GeoPoint({\"x\":120.33967465172486,\"y\":23.1295209604139,\"z\":71061.09647388318}),\r\n Kaohsiung: new window.GeoPoint({\"x\":120.5658222506978,\"y\":22.881065943233963,\"z\":125833.24878102746}),\r\n Keelung: new window.GeoPoint({\"x\":121.71309970410005,\"y\":25.10758560415951,\"z\":16901.98980638795}),\r\n Hsinchu: new window.GeoPoint({\"x\":120.94449810418456,\"y\":24.782774324650546,\"z\":21288.56646152329}),\r\n HsinchuCounty: new window.GeoPoint({\"x\":121.0950454682906,\"y\":24.662176494606243,\"z\":67491.0829568951}),\r\n MiaoliCounty: new window.GeoPoint({\"x\":120.90024881668052,\"y\":24.48929283980776,\"z\":64884.72903635817}),\r\n ChanghuaCounty: new window.GeoPoint({\"x\":120.47236851868473,\"y\":23.99231062314138,\"z\":64884.72903635983}),\r\n NantouCounty: new window.GeoPoint({\"x\":120.9742122334003,\"y\":23.78227518170172,\"z\":113113.6950184827}),\r\n Chiayi: new window.GeoPoint({\"x\":120.4427433910497,\"y\":23.475170311077804,\"z\":12477.887233459978}),\r\n ChiayiCounty: new window.GeoPoint({\"x\":120.49047406157615,\"y\":23.40833025225507,\"z\":62299.633794021705}),\r\n YunlinCounty: new window.GeoPoint({\"x\":120.32741512021397,\"y\":23.674417499771096,\"z\":46933.15347744207}),\r\n PingtungCounty: new window.GeoPoint({\"x\":120.678169428371,\"y\":22.35493466682287,\"z\":136821.0295920161}),\r\n YilanCounty: new window.GeoPoint({\"x\":121.65365695733652,\"y\":24.605648134709625,\"z\":92610.12823027617}),\r\n HualienCounty: new window.GeoPoint({\"x\":121.3657998907533,\"y\":23.710136479106424,\"z\":181927.07925011948}),\r\n TaitungCounty: new window.GeoPoint({\"x\":121.07365275972768,\"y\":22.74051547603655,\"z\":145892.2731876692}),\r\n PenghuCounty: new window.GeoPoint({\"x\":119.59579454560077,\"y\":23.46206736869125,\"z\":86224.79585048351}),\r\n LienchiangCounty: new window.GeoPoint({\"x\":119.93474061745508,\"y\":26.122907549338308,\"z\":70051.03149966884}),\r\n KinmenCounty: new window.GeoPoint({\"x\":118.37139355990507,\"y\":24.44479356499255,\"z\":29285.89328477848}),\r\n }\r\n const point = cititesPosition[city]; \r\n this._TerrainView.goto({pos: point, distance: point.z});\r\n }\r\n\r\n _isTokenExpired() {\r\n if (!this._TDXCert?.token || !this._TDXCert?.token.timestamp) {\r\n return true;\r\n }\r\n const { token } = this._TDXCert;\r\n const { expires_in, timestamp } = token;\r\n const now = new Date().getTime();\r\n const diff = now - timestamp;\r\n return diff > expires_in * 1000; // expires_in \u662F\u79D2\uFF0Cdiff \u662F\u6BEB\u79D2\uFF0C\u9700\u4E58\u4EE51000\r\n }\r\n\r\n _isApiInfoChanged() {\r\n if (!this._TDXCert) return false;\r\n\r\n const { client_id, client_secret } = this._TDXCert;\r\n const client_id_input = this._TdxApiIdInput.value;\r\n const client_secret_input = this._TdxApiSecretInput.value;\r\n return (\r\n client_id !== client_id_input || client_secret !== client_secret_input\r\n );\r\n }\r\n\r\n async _getTDXAuthorizationHeader() {\r\n const client_id = this._TdxApiIdInput.value;\r\n const client_secret = this._TdxApiSecretInput.value;\r\n const grant_type = \"client_credentials\";\r\n const auth_url =\r\n \"https://tdx.transportdata.tw/auth/realms/TDXConnect/protocol/openid-connect/token\";\r\n\r\n this._TDXCert = {\r\n client_id,\r\n client_secret,\r\n grant_type,\r\n };\r\n\r\n const token = await fetch(auth_url, {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/x-www-form-urlencoded\",\r\n Accept: \"application/json\",\r\n },\r\n body: new URLSearchParams({\r\n client_id,\r\n client_secret,\r\n grant_type,\r\n }),\r\n })\r\n .then((response) => {\r\n if (response.ok) {\r\n return response.json();\r\n } else {\r\n throw new Error(\"API request failed\");\r\n }\r\n })\r\n .catch((error) => {\r\n console.error(\"Error:\", error.message);\r\n });\r\n\r\n this._TDXCert.token = {\r\n ...token,\r\n timestamp: new Date().getTime(),\r\n };\r\n\r\n // console.log(\"\u5DF2\u53D6\u5F97 access token: \", this._TDXCert.token);\r\n }\r\n\r\n async _getTdxDataByAPI(endpoint: string, query: any = {}) {\r\n if (!this._TDXCert?.token) return;\r\n\r\n const { access_token } = this._TDXCert?.token;\r\n\r\n const url = new URL(this._TDXServer + endpoint);\r\n url.search = new URLSearchParams(query).toString();\r\n\r\n const result = await fetch(url, {\r\n method: \"GET\",\r\n headers: {\r\n \"Accept-Encoding\": \"br,gzip\",\r\n \"Content-Type\": \"application/json\",\r\n authorization: \"Bearer \" + access_token,\r\n },\r\n })\r\n .then((response) => response.json())\r\n .then((data) => data)\r\n .catch((error) => {\r\n console.error(\"Error:\", error.message);\r\n });\r\n\r\n return result;\r\n }\r\n\r\n //#endregion TDX\r\n\r\n //#region HighwayTraffic\r\n\r\n async _highwayTrafficHandler(data: any) {\r\n\tawait this._highwaySectionDataUpdater();\r\n\r\n const traffics = data.LiveTraffics;\r\n const dataSrcUpdateTime = this._formatDateTime(data.SrcUpdateTime);\r\n\r\n if (this._HighwayLayer === undefined || this._HighwayLayer === null) {\r\n const t = Math.ceil(new Date().getTime() * Math.random());\r\n this._HighwayLayer = this._TerrainView.addTerrainCustomTileOverlay({\r\n layername: \"TrackWidget-Highway-\" + t,\r\n })!;\r\n } \r\n\r\n traffics.forEach((traffic: any) => { \r\n\t const sectionId = traffic.SectionID;\r\n const speed = traffic.TravelSpeed;\r\n \r\n if (\r\n traffic.hasOwnProperty(\"OpenLRs\") === false ||\r\n traffic.OpenLRs.length === 0\r\n ) {\r\n // console.log(\"\u7121 OpenLR \u8CC7\u6599\");\r\n // console.log(\"traffic \u8CC7\u6599: \", traffic);\r\n } else {\r\n traffic.OpenLRs.forEach((openLR: any) => {\r\n const lrp = OpenLRDecoder.decode(openLR.OpenLR);\r\n this._createPath(sectionId, speed, lrp);\r\n });\r\n }\r\n });\r\n\r\n if (\r\n document.querySelector(\".ov-widget-trackWidget-resultRecord-highway\") ===\r\n null\r\n ) {\r\n this._addTDXEntityCompleted(\r\n this._HighwayLayer!,\r\n \"highway\",\r\n dataSrcUpdateTime\r\n );\r\n this._createHighwayLegend();\r\n }\r\n }\r\n\r\n _getHighwayTrafficeLegendColor(\r\n speed: number | undefined\r\n ): string | undefined {\r\n if (speed == -2 || speed == undefined) return \"#FFFFFF\"; // \u7121\u8CC7\u6599\r\n if (speed == -1) return \"#000000\"; // \u9053\u8DEF\u5C01\u9589\r\n if (speed >= 80) return \"#00FF00\";\r\n if (speed >= 60) return \"#FFFF00\";\r\n if (speed >= 40) return \"#FFA500\";\r\n if (speed >= 20) return \"#FF0000\";\r\n if (speed >= 0) return \"#AA1EAA\";\r\n }\r\n\r\n async _highwaySectionDataUpdater() {\r\n // \u82E5\u5DF2\u6709\u8CC7\u6599\u5247\u4E0D\u518D\u66F4\u65B0 \r\n\tif (this._HighwaySectionDataUpdated) { return; }\r\n\r\n // \u6AA2\u67E5 Local Storage \u662F\u5426\u6709\u8CC7\u6599, \u82E5\u6709\u5247\u6AA2\u67E5 SrcUpdate \u7684\u65E5\u671F\u662F\u5426\u70BA\u4ECA\u5929, \u82E5\u662F\u5247\u76F4\u63A5\u4F7F\u7528\r\n const localData = localStorage.getItem(\"highwaySectionData\");\r\n\r\n if (localData) {\r\n const data = JSON.parse(localData);\r\n const today = new Date();\r\n const srcUpdate = new Date(data.SrcUpdateTime);\r\n if (\r\n today.getDate() === srcUpdate.getDate() &&\r\n today.getMonth() === srcUpdate.getMonth() &&\r\n today.getFullYear() === srcUpdate.getFullYear()\r\n ) {\r\n\t\t this._HighwaySectionData = data;\r\n this._HighwaySectionDataUpdated = true; \r\n return;\r\n }\r\n }\r\n\r\n // \u82E5\u7121\u8CC7\u6599\u5247\u76F4\u63A5\u66F4\u65B0\r\n const endpoint = \"/v2/Road/Traffic/Section/Freeway\";\r\n const data = await this._getTdxDataByAPI(endpoint);\r\n this._HighwaySectionData = data;\r\n localStorage.setItem(\"highwaySectionData\", JSON.stringify(data));\r\n this._HighwaySectionDataUpdated = true;\r\n }\r\n\r\n _getHighwaySectionData(sectionId: string) {\r\n\treturn this._HighwaySectionData?.Sections.find(\r\n\t (section: any) => section.SectionID === sectionId\r\n\t);\r\n }\r\n\r\n _createPath(sectionId: string, speed: number, decodedOepnLR: any, ) {\r\n\tconst color = this._getHighwayTrafficeLegendColor(speed);\r\n\tconst sectionData = this._getHighwaySectionData(sectionId);\r\n\tconst tooltipDescription = this._getSectionTooltipDescription(sectionData, speed);\r\n\r\n const points = [];\r\n points.push(\r\n new window.GeoPoint(\r\n decodedOepnLR.StartLocation.PositionLon,\r\n decodedOepnLR.StartLocation.PositionLat\r\n )\r\n );\r\n decodedOepnLR.MidLocation.forEach((lrp: any) => {\r\n points.push(new window.GeoPoint(lrp.PositionLon, lrp.PositionLat));\r\n });\r\n points.push(\r\n new window.GeoPoint(\r\n decodedOepnLR.EndLocation.PositionLon,\r\n decodedOepnLR.EndLocation.PositionLat\r\n )\r\n );\r\n\r\n const entity = this._HighwayLayer?.addPolylineEntity({\r\n geo: new window.GeoPolyline(points),\r\n lineWidth: 5,\r\n strokeStyle: color as ov.CSSColor || \"#FFFFFF\" as ov.CSSColor,\r\n visibleLevel: 0,\r\n // todo: \u7B49 TerrainOverlay \u652F\u63F4 tooltip \u6216\u9EDE\u64CA\u4E8B\u4EF6\u5F8C\u518D\u555F\u7528\r\n\t // onClick: this._setHightwaySectionTooltip.bind(this, tooltipDescription),\r\n // \u6216\u8005\r\n\t // onClick: (mousePos: GeoPoint) => {\r\n\t\t // console.log(\"mousePos\", mousePos);\r\n\t\t // this._setHightwaySectionTooltip(tooltipDescription, mousePos);\r\n\t // }\r\n });\r\n\r\n this._TerrainView.updateScreen();\r\n }\r\n\r\n _getSectionTooltipDescription(sectionData: any, speed: number | undefined) {\r\n\tconst directionSymbol: { [key: string]: string } = {\r\n\t\t\"S\": \"\u5357\u5411\",\r\n\t\t\"N\": \"\u5317\u5411\",\r\n\t\t\"E\": \"\u6771\u5411\",\r\n\t\t\"W\": \"\u897F\u5411\",\r\n\t}\r\n\tconst name = sectionData?.SectionName;\r\n\tconst direction: string = sectionData?.Direction;\r\n\tconst speedLimit = sectionData?.SpeedLimit;\r\n\tconst startKm = sectionData?.StartKm;\r\n\tconst endKm = sectionData?.EndKm;\r\n\tconst description = `
\r\n\t
${name} ${directionSymbol[direction]}
\r\n\t
${startKm} - ${endKm} \u8DEF\u6BB5
\r\n\t
\u9650\u901F: ${speedLimit} \u516C\u91CC
\r\n\t
\u76EE\u524D\u901F\u5EA6: ${speed ? speed : \"No Data\"} km/h
\r\n\t
\r\n\t `\r\n\treturn description;\r\n }\r\n\r\n _setHightwaySectionTooltip(description: string, mousePos: GeoPoint) {\r\n\t\r\n\tconst tooltipEle: HTMLElement | null = document.querySelector(\".EntityTooltip\");\t\r\n\tif (tooltipEle) {\t \r\n\t tooltipEle.style.left = mousePos.x + 10 + \"px\";\r\n\t tooltipEle.style.top = mousePos.y + 10 + \"px\";\r\n\t tooltipEle && (tooltipEle.innerHTML = description);\r\n\t tooltipEle.style.opacity = \"1\";\t \r\n\t}\t\r\n }\r\n\r\n _createHighwayLegend() {\r\n \r\n const wrapper = this._createLegendWrapper();\r\n wrapper.style.flexDirection = \"column\";\r\n wrapper.style.maxWidth = \"200px\";\r\n\tif (this._EtagLegend) wrapper.style.bottom = \"7%\";\r\n\r\n const trafficLegendContainer = this._createLegendContainer();\r\n\r\n const lblStart = this._createLegendTextBlock(\"\u9806\u66A2\");\r\n trafficLegendContainer.append(lblStart);\r\n\r\n const colors = [\"#00FF00\", \"#FFFF00\", \"#FFA500\", \"#FF0000\", \"#aa1eaa\"];\r\n colors.forEach((color, index) => {\r\n const item = this._createLegendColorBlock(color);\r\n trafficLegendContainer.append(item);\r\n });\r\n\r\n const lblEnd = this._createLegendTextBlock(\"\u64C1\u585E\");\r\n trafficLegendContainer.append(lblEnd);\r\n\r\n wrapper.append(trafficLegendContainer);\r\n\r\n const subLegendContainer = this._createLegendContainer();\r\n subLegendContainer.style.marginTop = \"0.1rem\";\r\n subLegendContainer.style.justifyContent = \"space-evenly\";\r\n const colorItemRoadClose = this._createLegendColorBlock(\"#000000\");\r\n const lblRoadClose = this._createLegendTextBlock(\"\u9053\u8DEF\u5C01\u9589\");\r\n const colorItemDataLoss = this._createLegendColorBlock(\"#FFFFFF\");\r\n const lblDataLoss = this._createLegendTextBlock(\"\u8CC7\u6599\u907A\u5931\");\r\n subLegendContainer.append(colorItemRoadClose);\r\n subLegendContainer.append(lblRoadClose);\r\n subLegendContainer.append(colorItemDataLoss);\r\n subLegendContainer.append(lblDataLoss);\r\n\r\n wrapper.append(subLegendContainer);\r\n\r\n\tconst titleContainer = this._createLegendContainer();\r\n\ttitleContainer.style.justifyContent = \"center\";\r\n\ttitleContainer.style.borderTop = \"1px solid gray\";\r\n\ttitleContainer.style.borderRadius = \"0px\";\r\n\ttitleContainer.style.marginTop = \"2px\";\r\n\ttitleContainer.style.fontSize = \"12px\";\r\n\ttitleContainer.style.color = \"slategray\";\r\n\tconst title = this._createLegendTextBlock(\"\u9AD8\u901F\u516C\u8DEF\u5373\u6642\u8DEF\u6CC1 \u5716\u4F8B\");\r\n\ttitleContainer.append(title);\r\n\r\n\twrapper.append(titleContainer);\r\n\r\n this._HighwayLegend = wrapper;\r\n this._setContainerDraggable(this._HighwayLegend);\r\n document.body.append(this._HighwayLegend);\r\n }\r\n\r\n //#endregion HighwayTraffic\r\n\r\n //#region EtagTraffic\r\n async _etagTrafficHandler(data: any) {\r\n const ETagPairLives = data.ETagPairLives;\r\n const AuthorityCode: string = data.AuthorityCode;\r\n const CityNameEng: string | undefined = TDXCityInfo.getCityInfoByCityCode(AuthorityCode)?.CityNameEng;\r\n const dataSrcUpdateTime = this._formatDateTime(data.SrcUpdateTime);\r\n\r\n let eTagCityEntity;\r\n\r\n if (CityNameEng && this._ETagEntities.hasOwnProperty(CityNameEng) === false) {\r\n const t = Math.ceil(new Date().getTime() * Math.random());\r\n this._ETagEntities[CityNameEng] = {\r\n layer: this._TerrainView.addCustomLayer({\r\n layername: `TrackWidget-Etag-${CityNameEng}-${t}`,\r\n })!,\r\n }; \r\n }\r\n \r\n eTagCityEntity = this._ETagEntities[CityNameEng!];\r\n\r\n\r\n if (CityNameEng !== undefined) {\r\n await this._etagPairsDataUpdater(CityNameEng);\r\n\r\n // const ETagPairsData = this[`_EtagPairsData${CityNameEng}`];\r\n // const layer = this[`_Etag${CityNameEng}Layer`];\r\n\r\n const ETagPairsData = eTagCityEntity.pairData;\r\n const layer = eTagCityEntity.layer;\r\n\r\n ETagPairLives.forEach((ETagPairLive: any) => {\r\n const targetEtagPair = ETagPairsData.ETagPairs.find(\r\n (etagPair: any) => etagPair.ETagPairID === ETagPairLive.ETagPairID\r\n );\r\n\r\n if (targetEtagPair === undefined) {\r\n // console.log(\"\u7121 ETagPair \u8CC7\u6599\");\r\n // console.log(\"traffic \u8CC7\u6599: \", ETagPairLive);\r\n } else { \r\n const pathGeometry = targetEtagPair.Geometry;\r\n const speed =\r\n ETagPairLive.Flows.reduce(\r\n (acc: any, flow: any) => acc + (flow.SpaceMeanSpeed == -99 ? 0 : flow.SpaceMeanSpeed),\r\n 0\r\n ) / ETagPairLive.Flows.filter((flow:any)=> flow.SpaceMeanSpeed !== -99).length;\r\n // console.log(`\u6B63\u5728\u8655\u7406 ETagPair: ID-${targetEtagPair.ETagPairID}, ${targetEtagPair.Description}` + ` \u901F\u5EA6: ${speed}` );\r\n const color: string = this._getRoadTrafficColor(speed)!;\r\n this._createGeometryPath(\r\n pathGeometry,\r\n color,\r\n speed,\r\n targetEtagPair.Description,\r\n layer!,\r\n ETagPairLive\r\n );\r\n }\r\n });\r\n }\r\n\r\n // const logText = `${CityNameEng} - ETagPairLives \u8CC7\u6599\u7B46\u6578: ${(ETagPairLives.length+\"\").padStart(3,'0')}, ETagPairsData \u8CC7\u6599\u7B46\u6578: ${(this._ETagEntities[CityNameEng!]?.pairData.ETagPairs.length+\"\").padStart(3,'0')}`;\r\n\r\n // console.log(logText);\r\n // window.navigator.clipboard.writeText(logText);\r\n // if (!window.hasOwnProperty(\"ETagCityData\")) {\r\n // //@ts-ignore\r\n // window.ETagCityData = [];\r\n // }\r\n // //@ts-ignore\r\n // window.ETagCityData.push(logText);\r\n\r\n if (\r\n document.querySelector(\r\n \".ov-widget-trackWidget-resultRecord-etag\" + CityNameEng\r\n ) === null\r\n ) {\r\n this._addTDXEntityCompleted(\r\n eTagCityEntity.layer,\r\n \"etag\" + CityNameEng,\r\n dataSrcUpdateTime\r\n );\r\n this._EtagLegend === undefined && this._createEtagLegend();\r\n }\r\n }\r\n\r\n async _etagPairsDataUpdater(city: string) {\r\n // \u82E5\u5DF2\u6709\u8CC7\u6599\u5247\u4E0D\u518D\u66F4\u65B0\r\n const eTagCityEntity = this._ETagEntities[city];\r\n if (eTagCityEntity && eTagCityEntity.pairDataUpdated) {\r\n // console.log(`${city} \u5DF2\u6709 EtagPairs \u8CC7\u6599`);\r\n return;\r\n }\r\n\r\n\r\n // \u6AA2\u67E5 Local Storage \u662F\u5426\u6709\u8CC7\u6599, \u82E5\u6709\u5247\u6AA2\u67E5 SrcUpdate \u7684\u65E5\u671F\u662F\u5426\u70BA\u4ECA\u5929, \u82E5\u662F\u5247\u76F4\u63A5\u4F7F\u7528\r\n const localData = localStorage.getItem(\"etagPairsData\" + city);\r\n\r\n if (localData) {\r\n const data = JSON.parse(localData);\r\n const today = new Date();\r\n const srcUpdate = new Date(data.SrcUpdateTime);\r\n if (\r\n today.getDate() === srcUpdate.getDate() &&\r\n today.getMonth() === srcUpdate.getMonth() &&\r\n today.getFullYear() === srcUpdate.getFullYear()\r\n ) {\r\n this._ETagEntities[city].pairData = data;\r\n this._ETagEntities[city].pairDataUpdated = true;\r\n\r\n // console.log(`\u4F7F\u7528\u672C\u5730\u7AEF\u5132\u5B58\u7684 ${city} EtagPairs \u8CC7\u6599`);\r\n return;\r\n }\r\n }\r\n\r\n // \u82E5\u7121\u8CC7\u6599\u5247\u76F4\u63A5\u66F4\u65B0\r\n\r\n const endpoint = \"/v2/Road/Traffic/ETagPair/City/\" + city;\r\n const data = await this._getTdxDataByAPI(endpoint);\r\n\r\n this._ETagEntities[city].pairData = data;\r\n this._ETagEntities[city].pairDataUpdated = true;\r\n localStorage.setItem(\"etagPairsData\" + city, JSON.stringify(data));\r\n\r\n\r\n // console.log(`\u5DF2\u66F4\u65B0 ${city} EtagPairs \u8CC7\u6599`);\r\n }\r\n\r\n _createGeometryPath(\r\n geometry: string,\r\n color: string,\r\n speed: number,\r\n description: string,\r\n layer: ov.CustomLayer,\r\n ETagPairLive: any\r\n ) {\r\n // geometry ex: \"\"LINESTRING(121.02799 24.81966,121.02666 24.81802,121.02592 24.81718)\"\r\n // get points\r\n const points = geometry!.match(/\\d+\\.\\d+\\s\\d+\\.\\d+/g)?.map((point) => {\r\n const [lon, lat] = point.split(\" \");\r\n return new window.GeoPoint(parseFloat(lon), parseFloat(lat)); \r\n });\r\n\r\n let groundPolyline;\r\n const param = {\r\n geo: new window.GeoPolyline(points),\r\n color: new ov.Color(color),\r\n size: 5,\r\n opacity: 1.0,\r\n epsg: 4326,\r\n tooltip: `
\r\n\t
${description}
\r\n\t
\u901F\u5EA6: ${speed ? speed.toFixed(1) : \"No Data\"} km/h
\r\n\t
\r\n\t `,\r\n // onClick: (point: GeoPoint, parameter: any, sn?: number, name?: string) => {\r\n // console.log(\"ETagPairLive\", ETagPairLive);\r\n // console.log(\"layer\", layer);\r\n // console.log(\"entity\", groundPolyline!);\r\n // ETagPairLive.Flows.forEach((flow: any) => {\r\n // console.log(flow);\r\n // })\r\n // }\r\n };\r\n\r\n groundPolyline = layer.addGroundPolylineEntity(param);\r\n }\r\n\r\n _getRoadTrafficColor(speed: number) {\r\n if (speed >= 50) return \"#00FF00\";\r\n if (speed >= 25) return \"#FFFF00\";\r\n if (speed >= 0) return \"#FF0000\";\r\n if (speed == -99) return \"#000000\"; // \u8CC7\u6599\u7570\u5E38\r\n }\r\n\r\n _createEtagLegend() { \r\n const wrapper = this._createLegendWrapper();\r\n\twrapper.style.flexDirection = \"column\";\r\n\tif (this._HighwayLegend) wrapper.style.bottom = \"9%\";\r\n\r\n const legendContainer = this._createLegendContainer();\r\n\r\n const lblStart = this._createLegendTextBlock(\"\u9806\u66A2\");\r\n legendContainer.append(lblStart);\r\n\r\n const colors = [\"#00FF00\", \"#FFFF00\", \"#FF0000\"];\r\n colors.forEach((color, index) => {\r\n const item = this._createLegendColorBlock(color);\r\n legendContainer.append(item);\r\n });\r\n\r\n const lblEnd = this._createLegendTextBlock(\"\u5C01\u9589 | \");\r\n const colorItemError = this._createLegendColorBlock(\"#000000\");\r\n const textItemError = this._createLegendTextBlock(\"\u8CC7\u6599\u7570\u5E38\");\r\n legendContainer.append(lblEnd);\r\n legendContainer.append(colorItemError);\r\n legendContainer.append(textItemError);\r\n\r\n wrapper.append(legendContainer);\r\n\r\n\tconst titleContainer = this._createLegendContainer();\r\n\ttitleContainer.style.justifyContent = \"center\";\r\n\ttitleContainer.style.borderTop = \"1px solid gray\";\r\n\ttitleContainer.style.borderRadius = \"0px\";\r\n\ttitleContainer.style.marginTop = \"2px\";\r\n\ttitleContainer.style.fontSize = \"12px\";\r\n\ttitleContainer.style.color = \"slategray\";\r\n\tconst title = this._createLegendTextBlock(\"ETag \u5373\u6642\u8DEF\u6CC1 \u5716\u4F8B\");\t\r\n\ttitleContainer.append(title);\r\n\r\n\twrapper.append(titleContainer);\r\n\r\n this._EtagLegend = wrapper;\r\n this._setContainerDraggable(this._EtagLegend);\r\n document.body.append(this._EtagLegend);\r\n }\r\n\r\n //#endregion EtagTraffic\r\n\r\n //#region UI-Helper\r\n _setContainerDraggable(container: HTMLElement) {\r\n let isDragging = false;\r\n let relativeX = 0;\r\n let relativeY = 0;\r\n let cursorTemp = container.style.cursor;\r\n\r\n container.addEventListener(\"mousedown\", (event) => {\r\n isDragging = true;\r\n relativeX = event.clientX - container.offsetLeft;\r\n relativeY = event.clientY - container.offsetTop;\r\n container.style.cursor = \"grabbing\";\r\n event.preventDefault();\r\n });\r\n\r\n document.addEventListener(\"mousemove\", (event) => {\r\n if (isDragging) {\r\n container.style.bottom = \"auto\";\r\n container.style.left = event.clientX - relativeX + \"px\";\r\n container.style.top = event.clientY - relativeY + \"px\";\r\n }\r\n });\r\n\r\n document.addEventListener(\"mouseup\", () => {\r\n isDragging = false;\r\n container.style.cursor = cursorTemp;\r\n });\r\n }\r\n\r\n _createLegendColorBlock(color: string) {\r\n const item = document.createElement(\"div\");\r\n item.style.display = \"flex\";\r\n item.style.alignItems = \"center\";\r\n const block = document.createElement(\"div\");\r\n block.style.width = \"20px\";\r\n block.style.height = \"20px\";\r\n block.style.borderRadius = \"3px\";\r\n block.style.backgroundColor = color;\r\n return block;\r\n }\r\n\r\n _createLegendTextBlock(text: string) {\r\n const item = document.createElement(\"div\");\r\n item.style.display = \"flex\";\r\n item.style.alignItems = \"center\";\r\n const span = document.createElement(\"span\");\r\n span.innerText = text;\r\n item.append(span);\r\n return item;\r\n }\r\n\r\n _createLegendContainer() {\r\n const container = document.createElement(\"div\");\r\n container.style.display = \"flex\";\r\n container.style.justifyContent = \"space-between\";\r\n container.style.alignItems = \"center\";\r\n container.style.borderRadius = \"5px\";\r\n container.style.width = \"100%\";\r\n return container;\r\n }\r\n\r\n _createLegendWrapper() {\r\n const wrapper = document.createElement(\"div\");\r\n wrapper.classList.add(\"ov-widget-inputContainer\");\r\n wrapper.style.position = \"absolute\";\r\n wrapper.style.bottom = \"1%\";\r\n wrapper.style.left = \"10px\";\r\n // wrapper.style.transform = \"translate(-50%, -50%)\";\r\n wrapper.style.backgroundColor = \"white\";\r\n wrapper.style.padding = \"0.2rem\";\r\n wrapper.style.zIndex = \"1000\";\r\n wrapper.style.border = \"1px solid dimgray\";\r\n wrapper.style.borderRadius = \"5px\";\r\n wrapper.style.boxShadow = \"0 0 10px rgba(0, 0, 0, 0.5)\";\r\n wrapper.style.backgroundColor = \"var(--primary-100)\";\r\n wrapper.style.maxWidth = \"235px\";\r\n wrapper.style.cursor = \"grab\";\r\n return wrapper;\r\n }\r\n\r\n //#region Utils\r\n _formatDateTime(isoString: string) {\r\n // \u5275\u5EFA\u4E00\u500B\u65B0\u7684 Date \u5C0D\u8C61\r\n const date = new Date(isoString);\r\n\r\n // \u7372\u53D6\u5E74\u4EFD\u3001\u6708\u4EFD\u548C\u65E5\u671F\r\n const year = date.getFullYear();\r\n const month = String(date.getMonth() + 1).padStart(2, \"0\"); // \u6708\u4EFD\u662F0-indexed\u7684\uFF0C\u9700\u8981\u52A01\r\n const day = String(date.getDate()).padStart(2, \"0\");\r\n\r\n // \u7372\u53D6\u5C0F\u6642\u548C\u5206\u9418\r\n const hours = String(date.getHours()).padStart(2, \"0\");\r\n const minutes = String(date.getMinutes()).padStart(2, \"0\");\r\n\r\n // \u7D44\u5408\u6210\u6240\u9700\u7684\u683C\u5F0F\r\n const formattedDateTime = `${year}-${month}-${day}_${hours}${minutes}`;\r\n\r\n return formattedDateTime;\r\n }\r\n}\r\n\r\n// @ts-ignore \u786C\u585E\u9032 Widget\r\nov.Widget.TrackWidget = TrackWidget;\r\n"], "mappings": "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", "names": ["ov", "Geo3DPoint", "GeoBoundary", "GeoLine", "GeoPoint", "GeoPolygon", "GeoPolygonSet", "GeoPolyline", "GeoUtility", "CRect", "CSize", "GetEPSGEngine", "OpenLRDecoder", "encodedData", "count", "binaryString", "bytes", "i", "read24BitInt", "array", "offset", "read16BitSignedInt", "value", "decodeCoordinate", "integerDegree", "decodeLRP1", "lon_originValue", "lat_originValue", "lon", "lat", "attr1", "attr2", "attr3", "attr4", "decodeLRP2Plus", "prevLon", "prevLat", "lonOffset", "latOffset", "header", "startLRP", "numIntermediateLRPs", "intermediateLRPs", "lrp", "lastLRPOffset", "endLRP", "posOffset", "negOffset", "TDXCityInfo", "cityName", "city", "cityCode", "cityNameEng", "cityID", "countyCode", "TrackWidget", "ov", "param", "cities", "city", "cityInfo", "TDXCityInfo", "item", "results", "parameter", "proxy", "timeline", "clearOnClose", "x", "resultContainer", "radio", "label", "t", "radio2", "radio3", "label2", "label3", "label4", "value", "op", "mainContainer", "content", "container", "withDivider", "innerContainer", "labelContainer", "evt", "request", "xmlHttp", "mod", "type", "info", "result", "wrapper", "infoContainer", "titleEle", "infoEle", "btnContainer", "locateBtn", "showBtn", "deleteBtn", "event", "ent", "_title", "block", "resetBtn", "fastForwardBtn", "timeOffset", "target", "endpoint", "api", "layer", "timeTag", "point", "widgetUI", "dataItems", "eTagItemLenght", "token", "expires_in", "timestamp", "client_id", "client_secret", "client_id_input", "client_secret_input", "grant_type", "auth_url", "response", "error", "query", "access_token", "url", "data", "traffics", "dataSrcUpdateTime", "traffic", "sectionId", "speed", "openLR", "lrp", "OpenLRDecoder", "localData", "today", "srcUpdate", "section", "decodedOepnLR", "color", "sectionData", "tooltipDescription", "points", "entity", "directionSymbol", "name", "direction", "speedLimit", "startKm", "endKm", "description", "mousePos", "tooltipEle", "trafficLegendContainer", "lblStart", "index", "lblEnd", "subLegendContainer", "colorItemRoadClose", "lblRoadClose", "colorItemDataLoss", "lblDataLoss", "titleContainer", "title", "ETagPairLives", "AuthorityCode", "CityNameEng", "eTagCityEntity", "ETagPairsData", "ETagPairLive", "targetEtagPair", "etagPair", "pathGeometry", "acc", "flow", "geometry", "lon", "lat", "groundPolyline", "legendContainer", "colorItemError", "textItemError", "isDragging", "relativeX", "relativeY", "cursorTemp", "text", "span", "isoString", "date", "year", "month", "day", "hours", "minutes"] }