// URLのカテゴリーIDと店舗IDの保管用 var categoryId; var shopId; // 取得している店舗情報 var shopDataList = new Array(); var selectShop = null; // 店舗情報数 var shopDataCount = 0; // 店舗情報取得時接続エラーが起こったかのフラグ var shopDataConnectError = false; // MAPの中央のポジション var firstPos; // GPSの仕様フラグ var gpsUsingFlg = true; // 各種緯度経度保管用 var tmpLat = 0; var tmpLng = 0; var maxLat = 0;//最大緯度 var maxLng = 0;//最大経度 var minLat = 0;//最小緯度 var minLng = 0;//最小経度 // Google Mapオブジェクト var map; // マーカーリスト var markerList = new Array(); var locationList = new Array(); /* 地図の座標データを作成 */ function createPointData(detailFlg) { // 店舗・観光地情報詳細から遷移の場合 if (detailFlg) { var obj = new Object(); obj.data = createShopText(selectShop); obj.lat = selectShop.latitude; obj.lng = selectShop.longitude; locationList[0] = obj; tmpLat += parseFloat(selectShop.latitude); tmpLng += parseFloat(selectShop.longitude); settingMaxMin(parseFloat(selectShop.latitude), parseFloat(selectShop.longitude)); } else { // それ以外の場合 for (var i = 0; i < shopDataCount; i++) { var obj = new Object(); obj.data = createShopText(shopDataList[i]); obj.lat = shopDataList[i].latitude; obj.lng = shopDataList[i].longitude; locationList[i] = obj; tmpLat += parseFloat(shopDataList[i].latitude); tmpLng += parseFloat(shopDataList[i].longitude); settingMaxMin(parseFloat(shopDataList[i].latitude), parseFloat(shopDataList[i].longitude)); } } } /** * 地図の初期化 * ※地図及びマーカーの設定 */ function initMap() { // フリーワード検索から遷移してきた場合、ローカルストレージから店舗情報を取得 if ((document.referrer).match(regexFreeWordUrl)) { shopDataList = JSON.parse(localStorage.getItem(freeWordKey)); if (shopDataList != null && shopDataList.length != 0) { shopDataCount = shopDataList.length; } } else { // フリーワード以外の場合、地図のパラメータから情報を取得 // urlのパラメータを取得 var param = getSearchParam(); var regex = new RegExp('^[0-9]*$'); if (param == null || param['categoryId'] == null || !checkCategory(param['categoryId'])) { $('#map').append("エラー:選択された店舗の情報は存在しません。1"); return; } categoryId = param['categoryId']; var detailFlg =false; /* 店舗IDが存在する場合はそれを取得 */ if (param['shopId'] != null) { if (!param['shopId'].match(regex)) { $('#map').append("エラー:選択された店舗の情報は存在しません。2"); return; } else { detailFlg = true; shopId = param['shopId']; } } if (document.referrer.length == 0) { // 直リンの場合、csvから情報を取得 readShopDataCsv('csv/category_' + categoryId + '.csv'); } else { // そうでない場合、ローカルストレージから取得 getLocalShopData(); if (shopDataCount == 0) { // ローカルストレージの情報が空であった場合、csvから情報を取得 readShopDataCsv('csv/category_' + categoryId + '.csv'); } } } if (shopDataCount == 0) { if (shopDataConnectError) { $('#map').append('エラー:データの取得が行えません。通信状態を確認して下さい。'); return; } else { $('#map').append('エラー:選択された店舗の情報は存在しません。3'); return; } } if (detailFlg) { for (i = 0; i < shopDataCount; i ++) { if (shopDataList[i].shopId == shopId) { selectShop = shopDataList[i]; } } if (selectShop == null) { $('#map').append("エラー:選択された店舗の情報は存在しません。4"); return; } } // 座標データ作成 createPointData(detailFlg); // 初期位置設定にJR久留米駅と西鉄久留米駅分を追加 tmpLat += parseFloat(33.320389); tmpLng += parseFloat(130.501306); tmpLat += parseFloat(33.312369); tmpLng += parseFloat(130.521092); if (detailFlg) { firstPos = new google.maps.LatLng(tmpLat/3, tmpLng/3); } else { firstPos = new google.maps.LatLng(tmpLat/(shopDataCount + 2), tmpLng/(shopDataCount + 2)); } // 地図の作成 var mapOptions = { center: firstPos, mapTypeId: google.maps.MapTypeId.ROADMAP, scrollwheel: false, // zoomControl: false }; map = new google.maps.Map(document.getElementById("map"), mapOptions); // 現在地の表示 showCurrentPosition(); // マーカーリストの初期化 markerList.length = 0; // アイコンの設定 var icon = new google.maps.MarkerImage('img/map_marker.png', new google.maps.Size(32,32), new google.maps.Point(0,0) ); // 各店舗のマーカーの作成 for (var i = 0; i < locationList.length; i++) { // マーカーの作成 markerList[i] = new google.maps.Marker({ position: new google.maps.LatLng(locationList[i].lat, locationList[i].lng), map: map, icon :icon }); // マーカーに店舗・地名の情報を持たせる markerList[i].location = locationList[i]; // クリック時の処理を設定 addMarkerListener(markerList[i]); } // JR久留米の範囲設定 settingMaxMin(33.320389,130.501306); // 西鉄久留米の範囲設定 settingMaxMin(33.312369,130.521092); // 地図の範囲を設定 fittingMap(map); } /** * マーカーがクリックされたときの処理を設定 * * @param {Object} marker */ function addMarkerListener(marker) { // 直接記述すると、クリック時の処理のmarkerList[i]のiがlocationList.lengthになるため、関数にしている // クリック時の処理 google.maps.event.addListener(marker, "click", function() { // 情報を表示する $('#map_popup').html('
' + '
' + marker.location.data + '
' + '
' + '
' + ' ' + '
'); settingViews_map(); }); } // 店舗情報詳細の閉じる function detailClose() { $('#map_popup').html(''); } /** * 現在位置の表示 * ※現在位置を更新し続けます */ function showCurrentPosition() { // GPSに対応しているかチェック if (!navigator.geolocation) { return; } var isFirst = true; var currentMarker; var option = { enableHighAccuracy: true, // 高精度 timeout: 60000, // 最大待ち時間(ミリ秒) maximumAge: 0 // キャッシュ有効期間(ミリ秒) }; // GPS取得(※定期的に取得する) navigator.geolocation.watchPosition(function(pos) { // GPS取得成功 var currentPos = new google.maps.LatLng(pos.coords.latitude, pos.coords.longitude); if (isFirst === true) { // 現在位置にピンをたてる currentMarker = new google.maps.Marker({ position: currentPos, map: map, title: '現在地' }); // 現在地にスクロールさせる //map.panTo(currentPos); isFirst = false; } else { // 2回目以降は、現在位置のピンを移動する currentMarker.setPosition(currentPos); } }, function(err) { // GPS取得失敗時の処理 gpsUsingFlg = false; return; }, option); } /* 座標の最大値と最小値を設定する */ function settingMaxMin(lat, lng) { // 初期値をセット if (maxLat == 0) { maxLat = lat; } if (maxLng == 0) { maxLng = lng; } if (minLat == 0) { minLat = lat; } if (minLng == 0) { minLng = lng; } // 最大、最小値をセット if (maxLat < lat) { maxLat = lat; } if (maxLng < lng) { maxLng = lng; } if (minLat > lat) { minLat = lat; } if (minLng > lng) { minLng = lng; } } /* 地図の範囲を設定 */ function fittingMap(map) { var sw = new google.maps.LatLng(maxLat,minLng); var ne = new google.maps.LatLng(minLat,maxLng); var bounds = new google.maps.LatLngBounds(sw, ne); map.fitBounds(bounds); } /* MAP画面での店舗情報を作成 */ function createShopText(selectShop) { var shopText = '
' + selectShop.shopName + '
' + selectShop.romaji + '
' + '
連絡先
' + '
' + selectShop.address + '
' + '
' + createRateStar(selectShop.rating) + ' ' + ratePadding(selectShop.rating) + '' + '
'+ ''; return shopText; }