1/* ============================================================================ 2 å°å³ãã調ã¹ã(map.php) â å ¥å/ãã¼ã«ã¼æä½ 3 ---------------------------------------------------------------------------- 4 ãã¯ãã«å°å³(MapLibre GL JS / jnrm.maplibre.js)çã 5 ã»å°å³ä¸ã¯ãªã㯠or 使/é§ å/ã©ã³ããã¼ã¯ããåºçºå°ã»ç®çå°ãã¼ã«ã¼ãé ç½® 6 ã»MapLibre 㯠lng/lat ãç´æ¥æ±ããããæ§ ol.proj.fromLonLat/toLonLat ã¯ä¸è¦ 7 ã»ã¸ãªã³ã¼ã(geocoder.js)ã»è¿åé§ (commonç³»)ã»æ¥æã»ã¬ã¯ãã»æ¤ç´¢URLçæã¯æµç¨ 8 ============================================================================ */ 9var CITYBUS_SEARCH_MODE = false; 10 11var distanceMatrixService = new JNRM.OsmMatrix(); 12var walkingVelocity = 1.0; 13var OSM = null; 14var startMarker = null, endMarker = null; 15var startPlaced = false, endPlaced = false; // ãã¼ã«ã¼ãå°å³ã«é ç½®æ¸ã¿ã 16var kyotoBounds = { /* é ç½®å¯å¦ã®ç²å¤å®ã京é½åºå ¨åãã«ãã¼ï¼å®ãµã¼ãã¹ç¯å²å¤å®ã¯ checkKyotoCity=京é½åºï¼ */ 17 minLng: 134.7, 18 minLat: 34.6, 19 maxLng: 136.1, 20 maxLat: 35.85 21}; 22var geocoder = new JNRGEO.Geocoder(); 23 24var fn = '', tn = '', fs = '', ts = '', wt = ''; // æ¤ç´¢æ¡ä»¶ 25var originMode = true; // true:åºçºå°è¨å®ä¸, false:å°çå°è¨å®ä¸ 26 27if (lang == 'en') { 28 var MARKER_DEPARTURE = './img/en/map/marker_departure.png'; 29 var MARKER_ARRIVAL = './img/en/map/marker_arrival.png'; 30 var BUTTON_SEARCH = './img/en/buttons/btn_search_map.png'; 31 var BUTTON_SEARCH_GRAY = './img/en/buttons/btn_search_map_gray.png'; 32 var TEXT_DEPARTURE = 'Departure'; 33 var TEXT_ARRIVAL = 'Arrival'; 34 var ADDR_KYOTO_CITY = '京é½å¸'; //'Kyoto'; 35 var ADDR_KYOTO_PREF = '京é½åº'; //'Kyoto Prefecture'; 36 var ADDR_JAPAN = 'æ¥æ¬'; //'Japan'; 37 var MESSAGE_TITLE = 'Input Error'; 38 var MESSAGE1 = 'Please accurately enter point of departure and arrival. See <a href="./static.php?page=guide&lang=en#setting_area">this page</a> for available departure and destination setting coverage."'; 39 var MESSAGE2 = 'Point of departure or arrival not entered.'; 40 var MESSAGE3 = 'Please accurately enter point of departure.'; 41 var MESSAGE4 = 'Please accurately enter point of arrival.'; 42} 43else { 44 var MARKER_DEPARTURE = './img/ja/map/marker_departure.png'; 45 var MARKER_ARRIVAL = './img/ja/map/marker_arrival.png'; 46 var BUTTON_SEARCH = './img/ja/buttons/btn_search_map.png'; 47 var BUTTON_SEARCH_GRAY = './img/ja/buttons/btn_search_map_gray.png'; 48 var TEXT_DEPARTURE = 'åºçºå°'; 49 var TEXT_ARRIVAL = 'ç®çå°'; 50 var ADDR_KYOTO_CITY = '京é½å¸'; 51 var ADDR_KYOTO_PREF = '京é½åº'; 52 var ADDR_JAPAN = 'æ¥æ¬'; 53 var MESSAGE_TITLE = 'å ¥åã¨ã©ã¼'; 54 var MESSAGE1 = 'åºçºå°ã»ç®çå°ãæ£ããå ¥åãã¦ãã ãããæ¬ã·ã¹ãã ã§åºçºå°ã»ç®çå¤ã¨ãã¦è¨å®å¯è½ãªç¯å²ã¯<a href="./static.php?page=guide&lang=ja#setting_area">ãã¡ã</a>ãã覧ãã ããã'; 55 var MESSAGE2 = 'åºçºå°ã¨ç®çå°ãè¨å®ãã¦ä¸ããã'; 56 var MESSAGE3 = 'åºçºå°ãæ£ããå ¥åãã¦ä¸ããã'; 57 var MESSAGE4 = 'ç®çå°ãæ£ããå ¥åãã¦ãã ããã'; 58} 59 60// åºçºå°/ç®çå°ãã¼ã«ã¼ï¼ç»åãã³ã»ãã©ãã°å¯ï¼ãçæãã 61function makePin(isDeparture) { 62 var img = document.createElement('img'); 63 img.src = isDeparture ? MARKER_DEPARTURE : MARKER_ARRIVAL; 64 img.className = 'jnrm-pin'; 65 img.alt = isDeparture ? TEXT_DEPARTURE : TEXT_ARRIVAL; 66 img.draggable = false; 67 var m = new maplibregl.Marker({ element: img, anchor: 'bottom', draggable: true }); 68 return m; 69} 70 71$(function() { 72 // å°å³çæï¼MapLibre ãã¯ãã«ï¼ 73 // â åæãºã¼ã â æ¢å®(14)ã§ã¯ãªã 12 ã§éãããã¯ã¿ã¿ã¤ã«ã¯ã½ã¼ã¹ã® maxzoom ã 14 ã§ã 74 // z14 ã¿ã¤ã«ã«ã¯å»ºç©å½¢ç¶ãå ¨é¨å ¥ã£ã¦ããï¼1æ 652KB ã®ãã¡ building ã 520KBï¼ã 75 // ç»é¢ãã£ã±ãã« 9 æåã㨠4.5MB ã«ãªããåæè¡¨ç¤ºãç®ã«è¦ãã¦é ãã 76 // z12 ãªãåã 9 æã§ã 851KB ã§æ¸ãã 77 OSM = new JNRM.OpenStreetMap("map", { zoom: 12 }); 78 79 // ãã¼ã«ã¼(åºçºå°/ç®çå°)çæãé ç½®ãããã¾ã§å°å³ã«ã¯è¿½å ããªã 80 startMarker = makePin(true); 81 endMarker = makePin(false); 82 83 // ãã©ãã°ç§»åãããé§ ï¼ãã¹åï¼ã¹ãããåæå®ãç¡å¹åï¼åº§æ¨åªå ï¼ 84 startMarker.on('dragend', function() { fn = ''; }); 85 endMarker.on('dragend', function() { tn = ''; }); 86 87 // å°å³ã¯ãªãã¯ã§ãã¼ã«ã¼ãé ç½®ï¼åºçºå°âç®çå°ã®é ï¼ 88 OSM.map.on('click', function(evt) { 89 var ll = [evt.lngLat.lng, evt.lngLat.lat]; 90 if (!startPlaced) { 91 startMarker.setLngLat(ll).addTo(OSM.map); 92 startPlaced = true; 93 fn = ''; 94 toggleOd(); 95 } else if (!endPlaced) { 96 endMarker.setLngLat(ll).addTo(OSM.map); 97 endPlaced = true; 98 tn = ''; 99 toggleOd(); 100 } 101 }); 102 103 search_btn(); 104 105 // ãµã¸ã§ã¹ããæå¹ã«ãã 106 $('#text4').catcomplete({ 107 source: function(request, response) { response(make_od_list(request.term)); }, 108 search: function(event, ui) { $('text4_selected_type').val(''); }, 109 select: function(event, ui) { $('text4_selected_type').val(ui.item.category); } 110 }); 111 112 // äºæ¥è ã®ãã¼ã«ããã 113 $(document).tooltip({ 114 position: { 115 my: "left+5 center", 116 at: "right center" 117 } 118 }); 119 120 // æ¥æé¸æã®é¸æé ç®ãçæ 121 SetupDateSelect('#month', '#day', '#date_sav'); 122 SetupHourSelect('#hour', '#hour_sav'); 123 SetupMinuteSelect('#minute', '#minute_sav'); 124 125 // ç¾å¨æå»è¨å® 126 $('#set_currtime').click(function() { 127 $('#date_sav, #hour_sav, #minute_sav').val(''); 128 SetupDateSelect('#month', '#day', '#date_sav'); 129 SetupHourSelect('#hour', '#hour_sav'); 130 SetupMinuteSelect('#minute', '#minute_sav'); 131 }); 132 133 // ãã©ã¡ã¿ã§æå®ãããæ¤ç´¢æ¡ä»¶ãã»ãããã 134 var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&'); 135 var args = new Array(); 136 for (var i = 0; i < hashes.length; i++) { 137 hash = hashes[i].split('='); 138 args[hash[0]] = decodeURIComponent(hash[1]); 139 } 140 141 if (args['fn'] && args['fn'] != '') { 142 setPosition(args['fn']); 143 } else if (args['fl']){ 144 var latlng = args['fl'].split(','); 145 var lat = parseFloat(latlng[0]); 146 var lng = parseFloat(latlng[1]); 147 startMarker.setLngLat([lng, lat]).addTo(OSM.map); 148 startPlaced = true; 149 fn = ''; 150 }
151 if (args['tn'] && args['tn'] != '') { 152 setPosition(args['tn']); 153 } else if (args['tl']){ 154 var latlng = args['tl'].split(','); 155 var lat = parseFloat(latlng[0]); 156 var lng = parseFloat(latlng[1]); 157 endMarker.setLngLat([lng, lat]).addTo(OSM.map); 158 endPlaced = true; 159 tn = ''; 160 } 161 if (args['dt']) { 162 days = args['dt'].split('/'); 163 $('#month').val(days[0] + "_" + days[1]); 164 $('#day').val(days[2]); 165 } 166 if (args['tm']) { 167 times = args['tm'].split(':'); 168 $('#hour').val(times[0]); 169 $('#minute').val(times[1]); 170 } 171 if (args['tt']) { 172 switch (args['tt']) { 173 case 'd': 174 $('#date1').prop('checked', 'checked'); 175 break; 176 case 'a': 177 $('#date2').prop('checked', 'checked'); 178 break; 179 case 'f': 180 $('#date3').prop('checked', 'checked'); 181 break; 182 case 'l': 183 $('#date4').prop('checked', 'checked'); 184 break; 185 } 186 } 187 // ã¿ãå ãéè¡¨ç¤ºç¶æ ãã表示ãããå ´åã«åãã¦ãµã¤ãºåè¨ç® 188 OSM.map.on('load', function() { OSM.map.resize(); search_btn(); }); 189}); 190 191// ãªã»ãããã¿ã³ãæ¼ãããæ 192function markerReset() { 193 startMarker.remove(); 194 endMarker.remove(); 195 startPlaced = false; 196 endPlaced = false; 197 originMode = false; 198 toggleOd(); 199} 200 201// æ¤ç´¢ãã¿ã³ã® gray-out 202function search_btn() { 203 if (startPlaced && endPlaced) { 204 $('#btn_search').attr('src', BUTTON_SEARCH); 205 } else { 206 $('#btn_search').attr('src', BUTTON_SEARCH_GRAY); 207 } 208} 209 210function setPosition(position_name) { 211 if (position_name == '') { 212 ShowMessage(MESSAGE1, MESSAGE_TITLE); 213 return; 214 } 215 216 // ãåµå±±ãã®ä¾å¤å¦ç 217 if (position_name == ARASHIYAMA_NAME) { 218 var arashiyama_landmark = LandmarkData.data[ARASHIYAMA_LANDMARK_CODE]; 219 if (arashiyama_landmark != null) { 220 setMarker([arashiyama_landmark.lng, arashiyama_landmark.lat], position_name); 221 return; 222 } 223 } 224 225 // é§ ã»ãã¹åå 226 var ss = Master.stationselect[position_name]; 227 if (ss !== undefined) { 228 var lat = 0.0, lng = 0.0, count = 0; 229 for (var i = 0; i < ss.stationnames.length; i++) { 230 var sn = ss.stationnames[i].stationname; 231 var sinfo = Master.station[sn]; 232 if (sinfo !== undefined) { 233 lat -= -sinfo.lat; 234 lng -= -sinfo.lng; 235 count++; 236 } 237 } 238 if (count > 0) { 239 setMarker([lng / count, lat / count], position_name); 240 return; 241 } 242 } 243 244 // ã©ã³ããã¼ã¯å 245 for (var code in LandmarkData.data) { 246 var lm = LandmarkData.data[code]; 247 if (lm.name == position_name && lm.lat > 0 && lm.lng > 0) { 248 setMarker([lm.lng, lm.lat], position_name); 249 return; 250 } 251 } 252 253 // 使 254 geocoder.geocode({ 255 'address': position_name, 256 }, 257 function(results, status) { 258 if (status == JNRGEO.Status.OK) { 259 var lng = parseFloat(results.longitude); 260 var lat = parseFloat(results.latitude); 261 if (kyotoBounds.minLat <= lat && lat <= kyotoBounds.maxLat 262 && kyotoBounds.minLng <= lng && lng <= kyotoBounds.maxLng) { 263 setMarker([lng, lat], position_name); 264 return; 265 } 266 } 267 ShowMessage(MESSAGE1, MESSAGE_TITLE); 268 }); 269} 270 271function toggleOd() { 272 if (originMode) { 273 $('#od_label').text(TEXT_ARRIVAL).addClass('arr_label').removeClass('dep_label'); 274 } else { 275 $('#od_label').text(TEXT_DEPARTURE).addClass('dep_label').removeClass('arr_label'); 276 } 277 $('#text4').val('').change(); 278 originMode = !originMode; 279 search_btn(); 280} 281 282// lngLat = [lng, lat] 283function setMarker(lngLat, name) { 284 if (originMode) { 285 fn = name; 286 startMarker.setLngLat(lngLat).addTo(OSM.map); 287 startPlaced = true; 288 } else { 289 tn = name; 290 endMarker.setLngLat(lngLat).addTo(OSM.map); 291 endPlaced = true; 292 } 293 OSM.map.easeTo({ center: lngLat }); 294 toggleOd(); 295} 296 297// 緯度çµåº¦ã京é½å¸å ããå¤å®ãããlonLat = [lng, lat] 298function checkKyotoCity(lonLat, callback) { 299 var address = ''; 300 301 geocoder.revGeocode({ 302 'latitude': lonLat[1], 303 'longitude': lonLat[0] 304 }, 305 function(results, status) { 306 if (status == JNRGEO.Status.OK ) { 307 var pref = results.Address.pref; 308 var city = results.Address.city; 309 var section = results.Address.section; 310 var banchi = results.Address.banchi; 311 var registry = results.Address.registry; 312 if (pref == ADDR_KYOTO_PREF){ /* 京é½åºå ãªãOKï¼æ§: 京é½å¸å éå® city.indexOf(京é½å¸)==0 ãåºå ¨åã¸ç·©åï¼ */ 313 address = city 314 + (section ? " " + section : "") 315 + (banchi ? " " + banchi : "") 316 + (registry? "-" + registry : ""); 317 callback(address); 318 return; 319 } 320 } 321 322 ShowMessage(MESSAGE1, MESSAGE_TITLE); 323 }); 324} 325 326function get_near_stations(name, lonLat, callback) { 327 var kiyomizudera_landmark = null; 328 if (LandmarkData.data[KIYOMIZUDERA_LANDMARK_CODE] !== undefined) { 329 kiyomizudera_landmark = LandmarkData.data[KIYOMIZUDERA_LANDMARK_CODE]; 330 } 331 var ginkakuji_landmark = null; 332 if (LandmarkData.data[GINKAKUJI_LANDMARK_CODE] !== undefined) { 333 ginkakuji_landmark = LandmarkData.data[GINKAKUJI_LANDMARK_CODE]; 334 } 335 336 if (name == ARASHIYAMA_NAME) { 337 callback(ARASHIYAMA_NEAR_STATIONS, ''); 338 return; 339 } else if (kiyomizudera_landmark != null && name == kiyomizudera_landmark.name) { 340 var loc = kiyomizudera_landmark.lat + ',' + kiyomizudera_landmark.lng; 341 callback(KIYOMIZUDERA_NEAR_STATIONS, loc); 342 return; 343 } else if (ginkakuji_landmark != null && name == ginkakuji_landmark.name) { 344 var loc = ginkakuji_landmark.lat + ',' + ginkakuji_landmark.lng; 345 callback(GINKAKUJI_NEAR_STATIONS, loc); 346 return; 347 } 348 349 var ranking = []; 350 for (var i = 0; i < Master.coefficient['SEARCH_NEAR_SPOTS_NUMBER']; i++) { 351 ranking[i] = {len:0, name: ''}; 352 } 353 354 search_near_stations(lonLat, '', 'S', ranking, function(near_stations) { 355 var loc = lonLat[1] + ',' + lonLat[0]; 356 callback(near_stations, loc); 357 }); 358} 359 360function search_submit() { 361 if (!startPlaced || !endPlaced) { 362 ShowMessage(MESSAGE2, MESSAGE_TITLE); 363 return; 364 } 365 366 var lonLat = startMarker.getLngLat().toArray(); // [lng, lat] 367 checkKyotoCity(lonLat, function(address) { 368 if (fn == '') { 369 fn = address; 370 } 371 search_submit2(); 372 }); 373} 374 375function search_submit2() { 376 var lonLat = endMarker.getLngLat().toArray(); 377 checkKyotoCity(lonLat, function(address) { 378 if (tn == '') { 379 tn = address; 380 } 381 search_submit3(); 382 }); 383} 384 385function search_submit3() { 386 var lonLat = startMarker.getLngLat().toArray(); 387 get_near_stations(fn, lonLat, function(near_stations, loc) { 388 fs = near_stations; 389 fl = loc; 390 if (fs == '') { 391 ShowMessage(MESSAGE3, MESSAGE_TITLE); 392 return; 393 } 394 search_submit4(); 395 }); 396} 397 398function search_submit4() { 399 var lonLat = endMarker.getLngLat().toArray(); 400 get_near_stations(tn, lonLat, function(near_stations, loc) { 401 ts = near_stations; 402 tl = loc; 403 if (ts == '') { 404 ShowMessage(MESSAGE4, MESSAGE_TITLE); 405 return; 406 } 407 search_submit5(); 408 }); 409} 410 411function search_submit5() { 412 var originLonLat = startMarker.getLngLat().toArray(); 413 var destinationLonlat = endMarker.getLngLat().toArray(); 414 wt = 0; 415 distanceMatrixService.getDistanceMatrixWalk({ 416 origins: [originLonLat], 417 destinations: [destinationLonlat], 418 }, 419 function (results, status) { 420 if (status == JNRM.OsmMatrixStatus.OK) { 421 for (var i = 0; i < results.length; i++) { 422 wt -= -Math.ceil(results[i]/walkingVelocity/60); 423 } 424 search_submit6(); 425 } 426 }); 427} 428 429function search_submit6() { 430 var pn = '';
431 var month = $('#month').val().replace(/_/g,'/'); 432 var dt = month + '/' + $('#day').val(); 433 var tm = $('#hour').val() + ':' + $('#minute').val(); 434 var tt = $('input[name="search_type"]:checked').val(); 435 var de = 'n'; // ãã¹å°çäºæ¸¬ã¯å»æ¢ããã©ã¡ã¿ã¯äºæã®ããæ®ãã常㫠'n' 436 var md = 'm'; 437 438 url = './search_result.php?fn=' + encodeURI(fn) + '&tn=' + encodeURI(tn) + '&dt=' + dt + '&tm=' + tm + '&fs=' + fs; 439 url = url + '&ts=' + ts + '&fl=' + fl + '&tl=' + tl + '&de=' + de + '&tt=' + tt + '&md=' + md + '&pn=' + encodeURI(pn) + '&wt=' + wt + '&lang=' + lang + '&fi=L&ti=L'; 440 441 $('#searching_message').dialog({ 442 modal: true, 443 autoOpen: true, 444 dialogClass: 'ui-dialog-notitle', 445 width: 300, 446 height: 100 447 }); 448 449 setTimeout(function() { 450 document.location.href = url; 451 }, 0); 452}
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.