「Widget:Custom map」の版間の差分

提供:メタファー リファンタジオ 攻略Wiki
移動先:案内検索
編集の要約なし
編集の要約なし
18行目: 18行目:


<script type="text/javascript">
<script type="text/javascript">
/////////////////////////////////////
// マップの初期化を改善するコード
(function() {
    // API_BASE_URLを保護
    const WIKI_BASE_URL = API_BASE_URL;
    Object.defineProperty(window, 'API_BASE_URL', {
        value: WIKI_BASE_URL,
        writable: false,
        configurable: false
    });
    // マップ初期化前のクリーンアップ
    function cleanupBeforeInit() {
        // 既存のマップインスタンスを削除
        if (window.map) {
            map.remove();
            window.map = null;
        }


        // drawnItemsをクリーンアップ
        if (window.drawnItems) {
            drawnItems.clearLayers();
            window.drawnItems = null;
        }
        // Leaflet関連の変数をリセット
        ['editControl', 'drawControl', 'iconDefinitions'].forEach(varName => {
            if (window[varName]) {
                window[varName] = null;
            }
        });
        // マップ関連のローカルストレージをクリア
        const currentWiki = WIKI_BASE_URL.split('/').pop();
        Object.keys(localStorage).forEach(key => {
            if (key.includes('map') || key.includes('leaflet')) {
                if (!key.includes(currentWiki)) {
                    localStorage.removeItem(key);
                }
            }
        });
    }
    // 安全なマップ初期化
    function initializeMap() {
        // 初期化前のクリーンアップ
        cleanupBeforeInit();
        // マップインスタンスの作成
        map = L.map('map', {
            crs: L.CRS.Simple,
            maxBounds: imageBounds.pad(0.5),
            minZoom: <!--{$minzoom}-->,
            maxZoom: <!--{$maxzoom}-->,
        });
        // APIリクエストのインターセプター
        const originalAjax = $.ajax;
        $.ajax = function(settings) {
            // URLが現在のWikiのものかチェック
            if (typeof settings.url === 'string') {
                const requestUrl = settings.url.startsWith('http') ?
                    settings.url :
                    WIKI_BASE_URL + settings.url;
               
                if (!requestUrl.includes(WIKI_BASE_URL.split('/').pop())) {
                    console.warn('Incorrect Wiki URL detected, correcting...');
                    settings.url = settings.url.replace(
                        /\/[^\/]+\/api\.php/,
                        '/' + WIKI_BASE_URL.split('/').pop() + '/api.php'
                    );
                }
            }
            return originalAjax.apply(this, arguments);
        };
        // その他の初期化処理...
        drawnItems = new L.FeatureGroup();
        map.addLayer(drawnItems);
       
        // イベントリスナーの設定
        map.on('unload', cleanupBeforeInit);
       
        return map;
    }
    // 既存の初期化処理を置き換え
    window.originalInitMap = window.initMap || function() {};
    window.initMap = function() {
        const map = initializeMap();
        window.originalInitMap.call(this);
        return map;
    };
    // ページ離脱時のクリーンアップ
    $(window).on('unload', cleanupBeforeInit);
})();
///////////////////////////




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;


// 表示する画像
// マップの初期化
var imageBase = {
function initializeMap() {
  url: '<!--{$img}-->',
    // クリーンアップ
  width: <!--{$imgwidth}-->,         // 画像のサイズ
    cleanupBeforeInit();
  height: <!--{$imgheight}-->
   
};
    // 画像の設定
    const imageBase = {
        url: '<!--{$img}-->',
        width: <!--{$imgwidth}-->,
        height: <!--{$imgheight}-->
    };


// 地図初期化
    // 境界の設定
var imageBounds = L.latLngBounds(
    const imageBounds = L.latLngBounds(
  [0, 0],
        [0, 0],
  [imageBase.height, imageBase.width],
        [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の設定
    edit: {
    drawControl = new L.Control.Draw({
        featureGroup: drawnItems,
        edit: {
         poly: {
            featureGroup: drawnItems,
             allowIntersection: false
            poly: { allowIntersection: false }
         },
        draw: {
             polygon: false,
            polyline: false,
            rectangle: true,
            circle: true,
            marker: true,
            circlemarker: false
         }
         }
     },
     });
     draw: {
 
        polygon: false,
     // 初期状態では編集モードを無効に
        polyline: false,
     drawControl.remove();
        rectangle: false,
 
        circle: true,
    return map;
        marker: true,
}
        circlemarker: false
     }
});
map.addControl(drawControl);


// 初期状態では編集モードを無効にする
// 初期状態では編集モードを無効にする
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) {

2024年11月10日 (日) 13:13時点における版