Google Maps API (v3) を使用して、架空のゲーム世界用のカスタム マップ タイプを作成しました。デフォルトでは、マップは、カスタム マップ タイプであっても、水平方向に繰り返されます (下の画像を参照)。
マップが水平方向に繰り返されないようにすることは可能ですか? 私の地図では、それは惑星や球状の世界を表していないので、水平方向に永遠に繰り返すことはまったく意味がありません. 次のように、左右に繰り返されるマップのタイルをロードしない方法を見つけました。
ただし、マーカーを作成すると、繰り返されるすべてのマップにマーカーが引き続き表示されます。
マーカーが繰り返されないようにすることは可能ですか? または、マップがまったく繰り返されないようにすることは可能ですか? そうすれば、マーカーの繰り返しに対処する必要がなくなりますか?
回避策: マップ境界を超えたパンを 制限する ユーザーが左または右にパンできる範囲を単純に制限することについて説明しているさまざまな回避策を読みました。ユーザーがズームアウトしてマップ全体を一度に表示できるようにする必要があるため、これはうまくいきません。完全にズームアウトすると、繰り返されるマーカーがまだ表示されますが、これは受け入れられません。
マップに大量のパディングを追加することは可能ですか? こうすることで、マップ間に大きなスペースができます。
十分なパディングを追加できれば、パニングを制限することでうまくいきます。これは、繰り返されるマーカーがパディングによって十分に遠くに押し出され、ユーザーが決して見ることができないためです。
最後に、私のコードは非常に単純です:
(注: 私が使用しているマップ タイルの画像は、まだオンラインでは利用できません)
<!DOCTYPE html>
<html style='height: 100%'>
<head>
<link rel="stylesheet" type="text/css" href="normalize.css" />
<style>
html, body { height: 100%;}
#map_canvas { height: 1000px;}
</style>
</head>
<body style='height: 100%'>
<div id="map_canvas"></div>
<script src="https://maps.googleapis.com/maps/api/js?sensor=false"></script>
<script type='text/javascript'>
var options =
{
getTileUrl: function(coord, zoom)
{
// Don't load tiles for repeated maps
var tileRange = 1 << zoom;
if ( coord.y < 0 || coord.y >= tileRange || coord.x < 0 || coord.x >= tileRange )
return null;
// Load the tile for the requested coordinate
var file = 'images/zoom' + zoom + '/tile_' + zoom + '_' + (coord.x) + '_' + (coord.y) + '.jpg';
return file;
},
tileSize: new google.maps.Size(256, 256),
minZoom: 1,
maxZoom: 9,
radius: 1738000, // I got this from an example in the api, I have no idea what this does
name: 'Map',
};
var mapOptions =
{
center: new google.maps.LatLng(0,0),
zoom: 2,
backgroundColor: '#000',
streetViewControl: false,
mapTypeControl: false
};
var map = new google.maps.Map(document.getElementById('map_canvas'),mapOptions);
var mapType = new google.maps.ImageMapType(options);
map.mapTypes.set('map', mapType);
map.setMapTypeId('map');
var marker = new google.maps.Marker({
position: new google.maps.LatLng(0,0),
map: map,
title: "Test"
});
</script>
</body>
</html>