「Widget:Custom map」の版間の差分
提供:メタファー リファンタジオ 攻略Wiki
ヘイグ運営用アカウント (トーク | 投稿記録) 編集の要約なし |
ヘイグ運営用アカウント (トーク | 投稿記録) 編集の要約なし |
||
18行目: | 18行目: | ||
<script type="text/javascript"> | <script type="text/javascript"> | ||
125行目: | 27行目: | ||
// 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'; | ||
// 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; | |||
} | |||
}); | |||
} | |||
window.savePopupContent = savePopupContent; | window.savePopupContent = savePopupContent; | ||
// | // マップの初期化 | ||
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', { | map = L.map('map', { | ||
153行目: | 83行目: | ||
attribution: '<a href="https://h1g.jp/" target="_blank">【ヘイグ】</a>' | attribution: '<a href="https://h1g.jp/" target="_blank">【ヘイグ】</a>' | ||
}).addTo(map); | }).addTo(map); | ||
// マップを境界に合わせる | |||
map.fitBounds(imageBounds); | |||
var drawnItems = new L.FeatureGroup(); | var drawnItems = new L.FeatureGroup(); | ||
162行目: | 96行目: | ||
map.addLayer(drawnItems); | map.addLayer(drawnItems); | ||
drawControl = new L.Control.Draw({ | // drawControlの設定 | ||
drawControl = new L.Control.Draw({ | |||
edit: { | |||
featureGroup: drawnItems, | |||
poly: { allowIntersection: false } | |||
}, | |||
draw: { | |||
polygon: false, | |||
polyline: false, | |||
rectangle: true, | |||
circle: true, | |||
marker: true, | |||
circlemarker: false | |||
} | } | ||
} | }); | ||
// 初期状態では編集モードを無効に | |||
drawControl.remove(); | |||
return map; | |||
} | |||
map | |||
// 初期状態では編集モードを無効にする | // 初期状態では編集モードを無効にする | ||
drawControl.remove(); | drawControl.remove(); | ||
// ページ読み込み時の処理 | |||
$(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() { | |||
map.invalidateSize(); | |||
getMwToken() | |||
.then(function(token) { | |||
console.log('Initial token obtained'); | |||
loadPinsFromWikiPage(token); | |||
}) | |||
.catch(function(error) { | |||
console.error("Failed to get initial token:", error); | |||
alert('データの読み込みに失敗しました。ページを再読み込みしてください。'); | |||
}); | |||
}, 500); | |||
}); | |||
// ページ離脱時のクリーンアップ | |||
$(window).on('unload', cleanupBeforeInit); | |||
map.on(L.Draw.Event.CREATED, function (event) { | map.on(L.Draw.Event.CREATED, function (event) { |