/* * movie play js */ function phook() { // Global markers in a map var map = L.map('map').setView([38.891, 139.824], 16); var marker = L.marker().setLatLng(map.getCenter()).addTo(map); var timescale = 20; timescale = 1; // var videostart = new Date ('2019-07-29 09:32:35').getTime(); var videostart = new Date ('2019-07-29T00:32:35Z').getTime(); videostart += -81000; // alert(videostart); // MAP handling functions var basemaps = { 'OpenStreetMap': {url: 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', attribution: '© <a href="http://osm.org/copyright">OpenStreetMap</a> contributors', maxZoom: 20, maxNativeZoom: 18}, '国土地理院(標準)': {url: 'https://cyberjapandata.gsi.go.jp/xyz/std/{z}/{x}/{y}.png', attribution: '© <a href="https://maps.gsi.go.jp/development/ichiran.html">国土地理院</a>', maxZoom: 20, maxNativeZoom: 18}, '空中写真(国土地理院2007年-)': {url: 'https://cyberjapandata.gsi.go.jp/xyz/ort/{z}/{x}/{y}.jpg', attribution: '© <a href="https://maps.gsi.go.jp/development/ichiran.html">国土地理院</a>', maxZoom: 20, maxNativeZoom: 18}, }; var layers = {}; for (let i in basemaps) { layers[i] = L.tileLayer(basemaps[i].url, basemaps[i]); } L.control.layers(layers, null).addTo(map); layers['OpenStreetMap'].addTo(map); // Load gpx var gpxgj, times, coords; // var gpx = omnivore.gpx("2019_07_29-Yawata.gpx"); var pointnum=0; function setProperty(f, layer) { // カスタムレイヤ作成用の関数 pointnum++; } var gpxURL = "2019_07_29-Yawata.gpx"; gpxURL = "./getgpx.cgi?https://www.yatex.org/gitbucket/yuuji/debugging/raw/master/m3/2019_07_29-Yawata.gpx"; var gpx = omnivore.gpx(gpxURL, null, L.geoJson(null, { style: {color: "green", weight: 8}, onEachFeature: setProperty })); var tmarray = []; gpx.on('ready', function() { var cons = document.getElementById('console'); gpxgj = this.toGeoJSON(); times = gpxgj.features[0].properties.coordTimes; coords = gpxgj.features[0].geometry.coordinates; // cons.textContent = times; // alert(times[0][0]); var d = new Date(Date.parse(times[0][0])), start = d.getTime(); // Millisecond var ofs, t, tm; for (let i=0; i<times[0].length; i++) { tm = times[0][i]; t = new Date(tm).getTime(); // ofs = t.getTime() - start; tmarray.push([t, coords[0][i]]); } marker.setLatLng([38.94229999999999999999, 139.88699999999999999999]); map.setView(marker.getLatLng()); alert(tmarray[0][0]+', -1='+tmarray[tmarray.length-1][0]+', vs='+videostart); //alert(new Date().getTimezoneOffset()); cons.textContent = JSON.stringify(tmarray); // alert(d.toLocaleString()); // cons.textContent += JSON.stringify(gpxgj, null, " "); }).addTo(map); function seekGeom(t) { // Seek geom pos in tmarray{} by binary search var pseudot = t * 1000 * timescale + videostart; var left=0, right=tmarray.length-1, m; if (pseudot < tmarray[left][0] || pseudot > tmarray[right][0]) return null; console.log("IN="+pseudot); while (left<right) { m = Math.floor((left+right)/2); if (pseudot < tmarray[m][0]) right = m-1; else left = m+1; } console.log(m); return tmarray[m][1]; } // Video Handling functions function dispTime(e) { var pt = document.getElementById("time"); var geom, latlng; if (pt) { pt.innerHTML = vi.currentTime; geom = seekGeom(vi.currentTime); console.log(JSON.stringify(geom)); latlng = L.latLng([geom[1], geom[0]]) marker.setLatLng(latlng); map.setView(latlng); } } vi = document.getElementById("vid"); vi.addEventListener('timeupdate', dispTime); function seekTime(latlng) { // Seek video time from tmarray var lat=latlng.lat, lng=latlng.lng, x, y, s, idx=0; var min = Math.pow(tmarray[0][1][0]-lat, 2) + Math.pow(tmarray[0][1][1]-lng, 2); var beg = new Date().getTime(); for (let i=0; i<tmarray.length; i++) { x = tmarray[i][1][0]; y=tmarray[i][1][1]; s = Math.pow(x-lng, 2) + Math.pow(y-lat, 2); if (s < min) { idx = i; min=s; } } console.log('lapse='+(new Date().getTime()-beg)); return (idx>0) ? (tmarray[idx][0] - videostart) / 1000 / timescale : null; } function setTime(e) { var input = document.getElementById('settime') if (e.type=='keypress' && e.key != 'Enter') return; if (input) { vi.currentTime = input.value;; } } function clickToRewind(e) { var tm = seekTime(e.latlng); if (tm) { vi.currentTime = tm; } } map.on("click", clickToRewind); document.getElementById("b").addEventListener('click', setTime); document.getElementById("settime").addEventListener('keypress', setTime); } window.onload = phook;