diff --git a/html/script.js b/html/script.js index dec10ad..9444291 100644 --- a/html/script.js +++ b/html/script.js @@ -61,6 +61,8 @@ let lastFetch = 0; let refreshMultiplier = 1; let globeIndexGrid = 0; let globeIndexNow = {}; +let globeIndexDist = {}; +let globeIndexSpecialLookup = {}; let globeIndexSpecialTiles; let globeTilesViewCount = 0; let globeSimLoad = 4; @@ -303,8 +305,9 @@ function fetchData() { } else if (globeIndex) { let indexes = globeIndexes(); indexes.sort(function(x,y) { - if (!globeIndexNow[x] && !globeIndexNow[y]) - return 0; + if (!globeIndexNow[x] && !globeIndexNow[y]) { + return globeIndexDist[x] - globeIndexDist[y]; + } if (globeIndexNow[x] == null) return -1; if (globeIndexNow[y] == null) @@ -4176,6 +4179,7 @@ function trailReaper() { } function globeIndexes() { + const center = ol.proj.toLonLat(OLMap.getView().getCenter()); if (mapIsVisible || lastGlobeExtent == null) { let mapSize = OLMap.getSize(); let size = [mapSize[0] * 1.02, mapSize[1] * 1.02]; @@ -4228,6 +4232,7 @@ function globeIndexes() { let index = globe_index(lat, lon); //console.log(lat + ' ' + lon + ' ' + index); if (!indexes.includes(index)) { + globeIndexDist[index] = ol.sphere.getDistance(center, [lon, lat]); indexes.push(index); } } @@ -4256,20 +4261,33 @@ function globe_index(lat, lon) { } } */ - for (let i = 0; i < globeIndexSpecialTiles.length; i++) { - let tile = globeIndexSpecialTiles[i]; - if ((lat >= tile[0] && lat < tile[2]) - && ((tile[1] < tile[3] && lon >= tile[1] && lon < tile[3]) - || (tile[1] > tile[3] && (lon >= tile[1] || lon < tile[3])))) { - return i; - } - } let i = Math.floor((lat+90) / grid); let j = Math.floor((lon+180) / grid); let lat_multiplier = Math.floor(360 / grid + 1); - return (i * lat_multiplier + j + 1000); + let defaultIndex = i * lat_multiplier + j + 1000; + + let index = globeIndexSpecialLookup[defaultIndex]; + if (index) { + return index; + } + + // not yet in lookup, check special tiles + for (let i = 0; i < globeIndexSpecialTiles.length; i++) { + let tile = globeIndexSpecialTiles[i]; + if ((lat >= tile[0] && lat < tile[2]) + && ((tile[1] < tile[3] && lon >= tile[1] && lon < tile[3]) + || (tile[1] > tile[3] && (lon >= tile[1] || lon < tile[3])))) { + globeIndexSpecialLookup[defaultIndex] = index = i; + } + } + if (index == null) { + // not a special tile, set lookup to default index + globeIndexSpecialLookup[defaultIndex] = index = defaultIndex; + } + + return index; } function myExtent(extent) {