「Widget:Custom map」の版間の差分
提供:メタファー リファンタジオ 攻略Wiki
ヘイグ運営用アカウント (トーク | 投稿記録) 編集の要約なし |
ヘイグ運営用アカウント (トーク | 投稿記録) 編集の要約なし |
||
21行目: | 21行目: | ||
// グローバル変数の定義 | |||
let map; | let map; | ||
let drawnItems; | |||
let drawControl; | |||
let editMode = false; | |||
// APIベースURLを定数として定義 | // APIベースURLを定数として定義 | ||
const API_BASE_URL = 'https://prd-h1g-elb-2067013247.ap-northeast-1.elb.amazonaws.com/metaphor_refantazio'; | const API_BASE_URL = 'https://prd-h1g-elb-2067013247.ap-northeast-1.elb.amazonaws.com/metaphor_refantazio'; | ||
window | // API_BASE_URLの保護 | ||
Object.defineProperty(window, 'API_BASE_URL', { | |||
value: API_BASE_URL, | |||
writable: false, | |||
configurable: false | |||
}); | |||
// | // マップ初期化前のクリーンアップ | ||
function cleanupBeforeInit() { | |||
if (window.map) { | |||
map.remove(); | |||
window.map = null; | |||
}; | } | ||
if (window.drawnItems) { | |||
drawnItems.clearLayers(); | |||
window.drawnItems = null; | |||
} | |||
['editControl', 'drawControl', 'iconDefinitions'].forEach(varName => { | |||
if (window[varName]) { | |||
window[varName] = null; | |||
} | |||
}); | |||
} | |||
// マップの初期化 | |||
function initializeMap() { | |||
// クリーンアップ | |||
cleanupBeforeInit(); | |||
// 画像の設定 | |||
const imageBase = { | |||
url: '<!--{$img}-->', | |||
width: <!--{$imgwidth}-->, | |||
height: <!--{$imgheight}--> | |||
}; | |||
// 境界の設定 | |||
const imageBounds = L.latLngBounds( | |||
[0, 0], | |||
[imageBase.height, imageBase.width] | |||
); | |||
// | // マップインスタンスの作成 | ||
map = L.map('map', { | |||
crs: L.CRS.Simple, | |||
maxBounds: imageBounds.pad(0.5), | |||
minZoom: <!--{$minzoom}-->, | |||
); | maxZoom: <!--{$maxzoom}--> | ||
}); | |||
map | map.fitBounds(imageBounds); | ||
L.imageOverlay(imageBase.url, imageBounds, { | |||
attribution: '<a href="https://h1g.jp/" target="_blank">【ヘイグ】</a>' | |||
}).addTo(map); | |||
// drawnItemsの初期化(一度だけ) | |||
drawnItems = new L.FeatureGroup(); | |||
map.addLayer(drawnItems); | |||
return map; | |||
} | |||
771行目: | 804行目: | ||
// ページ読み込み時にデータを読み込む | // ページ読み込み時にデータを読み込む | ||
$(document).ready(function() { | $(document).ready(function() { | ||
// マップの初期化 | |||
map = initializeMap(); | |||
// APIリクエストのインターセプター | |||
const originalAjax = $.ajax; | |||
$.ajax = function(settings) { | |||
if (typeof settings.url === 'string') { | |||
const requestUrl = settings.url.startsWith('http') ? | |||
settings.url : | |||
API_BASE_URL + settings.url; | |||
if (!requestUrl.includes(API_BASE_URL.split('/').pop())) { | |||
console.warn('Incorrect Wiki URL detected, correcting...'); | |||
settings.url = settings.url.replace( | |||
/\/[^\/]+\/api\.php/, | |||
'/' + API_BASE_URL.split('/').pop() + '/api.php' | |||
); | |||
} | |||
} | |||
return originalAjax.apply(this, arguments); | |||
}; | |||
// データの読み込み | |||
setTimeout(function() { | setTimeout(function() { | ||
map.invalidateSize(); | map.invalidateSize(); | ||
getMwToken() | getMwToken() | ||
.then(function(token) { | .then(function(token) { |