view map.js @ 273:f8aa8534b951 gmap2

More work .. fixed error handling somewhat.
author Matti Hamalainen <ccr@tnsp.org>
date Mon, 14 Apr 2014 03:01:00 +0300
parents a66d849006f2
children 43e8493891ed
line wrap: on
line source

// $Id: map.js 2404 2009-12-24 20:01:32Z jeskko $

var pmap, pmapBaseURL, pmapCanvas;

var pmapTileSize = 256;
var pmapTileOrig = pmapTileSize / 2.0;
var pmapTilePxPerDeg = pmapTileSize / 360.0;
var pmapTilePxPerRad = pmapTileSize / (2.0 * Math.PI);


var pmapPlrPrevPos = {"x": 8192, "y": 8192};
var pmapPlrMarker, pmapPlrToken, pmapPlrName;
var pmapUpdateDelay, pmapUpdateFails = 0;


function pmapMinMax(vval, vmin, vmax)
{
  return Math.min(Math.max(vval, vmin), vmax);
}


function pmapLatLngToMapCoords(latLng, zoom)
{
  msiny = pmapMinMax(Math.sin((latLng.lat() * Math.PI) / 180.0), -0.9999, 0.9999);

  px = latLng.lng() * pmapTilePxPerDeg;
  py = 0.5 * Math.log((1 + msiny) / (1 - msiny)) * - pmapTilePxPerRad;

  pz = 1 << zoom;
  return new google.maps.Point(px * pz, py * pz);
}


function pmapMapCoordsToLatLng(point, zoom)
{
  pz = 1 << zoom;
  px = point.x / pz;
  py = point.y / pz;

  lng = (px - pmapTileOrig) / pmapTilePxPerDeg;
  latRadians = (py - pmapTileOrig) / - pmapTilePxPerRad;

  //lat = radiansToDegrees(2 * Math.atan(Math.exp(latRadians)) - Math.PI / 2);
  //lat = (2 * Math.atan(Math.exp(latRadians)) - Math.PI / 2) / (Math.PI / 180);

  lat = (360 * Math.atan(Math.exp(latRadians))) / Math.PI - 90;

  return new google.maps.LatLng(lat, lng);
}


function CanvasProjectionOverlay() {}
CanvasProjectionOverlay.prototype = new google.maps.OverlayView();
CanvasProjectionOverlay.prototype.constructor = CanvasProjectionOverlay;
CanvasProjectionOverlay.prototype.onAdd = function(){};
CanvasProjectionOverlay.prototype.draw = function(){};
CanvasProjectionOverlay.prototype.onRemove = function(){};


function pmapInitializeMap(args)
{
  // Initialize custom imagemap with our tiles
  var pmapBatMap = new google.maps.ImageMapType(
  {
    getTileUrl: function(coord, zoom)
    {
      return "tiles/"+ zoom +"/"+ coord.y +"/"+ coord.x +".png";
    },

    tileSize: new google.maps.Size(pmapTileSize, pmapTileSize),
    maxZoom: 10,
    minZoom: 3,
    radius: 1738000,
    name: 'BatMap'
  });

  // Create map controller object
  pmap = new google.maps.Map(document.getElementById("map"),
  {
    zoom: 3,
    center: new google.maps.LatLng(-15, 10),

    streetViewControl: false,
    draggableCursor: 'crosshair',
    draggingCursor: 'pointer',
    mapTypeControl: false,
    scaleControl: false,
    rotateControl: false,
    overviewMapControl: false,
  });

  pmap.mapTypes.set('BatMap', pmapBatMap);
  pmap.setMapTypeId('BatMap');

  pmapCanvas = new CanvasProjectionOverlay();
  pmapCanvas.setMap(pmap);

  google.maps.event.addListener(pmap, "mousemove", pmapCoordinateListener);

  if (typeof(args) == "object")
  {
    var posSet = false;
    if ("zoom" in args && "x" in args && "y" in args)
    {
      pmapPlrPrevPos = {"x": args.x, "y": args.y};
      posSet = true;

      google.maps.event.addDomListener(pmap, "foobar", function()
      {
        pmap.setZoom(args.zoom);
        pmap.panTo(pmapMapCoordsToLatLng(new google.maps.Point(args.x, args.y), 6));
        var tgtMarker = pmapGetMarkerIndexByCoords(args.x, args.y);
        if (tgtMarker)
          pmapMyClick(tgtMarker);
      });
    }

    if ("token" in args && args.token != "" && "name" in args && args.name != "")
    {
      // Create player position marker
      pmapPlrMarker = new google.maps.Marker(
      {
        position: pmapMapCoordsToLatLng(new google.maps.Point(0, 0)),
        draggable: false,
        map: pmap
      });

      if (!posSet)
        pmap.setZoom(9);

      pmapPlrToken = args.token;
      pmapPlrName = args.name;
      pmapUpdateDelay = 1000;
      pmapScheduleNextUpdate();
    }
  }

  pmapInitializeNav();
  pmapInitializeIcons();
  pmapInitializeMarkers();
}


//
// Listener for updating coordinates display
//
function pmapCoordinateListener(point)
{
  // Round the coordinates so that we hit the pointed square more accurately
  var p = pmapLatLngToMapCoords(point.latLng, 7);
  var tx = Math.round((p.x + 1) / 2.0);
  var ty = Math.round((p.y + 1) / 2.0);

  var cx, cy;
  var cont = "Deep Sea";
  
  for (i = 0; i < pmapContinents.length; i++)
  {
    var c = pmapContinents[i];
    if (c != null && tx > c[1] && tx < c[3] && ty > c[2] && ty < c[4])
    {
      cont = c[0];
      cx = tx - c[1];
      cy = ty - c[2];
      break;
    }
  }

  tx += pmapWorld.ox - 1;
  ty += pmapWorld.oy - 1;

  var str = "Cursor: "+
    "Global X: <span class=\"coord\">"+ tx +"</span>, Y: <span class=\"coord\">"+ ty +"</span>, "+
    "Continent: <span class=\"continent\">"+ cont +"</span> ";

  if (cx >= 0 && cy >= 0)
    str += "[ Local X: <span class=\"coord\">"+ cx +"</span>, Y: <span class=\"coord\">"+ cy +"</span> ]";

  document.getElementById("footercontent").innerHTML = str;
}


function pmapMakeLink()
{
  if (pmap)
  {
    var p = pmapLatLngToMapCoords(pmap.getCenter(), 6);
    var tx = Math.round(p.x) + pmapWorld.ox - 1;
    var ty = Math.round(p.y) + pmapWorld.oy;
    
    str = pmapBaseURL +"?x="+ tx +"&y="+ ty +"&zoom="+ pmap.getZoom();

    window.prompt("Copy to clipboard: Ctrl+C, Enter", str);
  }
}


function pmapScheduleNextUpdate()
{
  setTimeout("pmapUpdatePlayerPosition()", pmapUpdateDelay);
}


function pmapIncreaseUpdateDelay(v)
{
  pmapUpdateDelay += v;
  if (pmapUpdateDelay > 5000)
    pmapUpdateDelay = 5000;
}


function pmapUpdatePlayerPosition()
{
  XDownloadUrl("http://tnsp.org/gmapng/playerpos.php?name="+pmapPlrName+"&token="+pmapPlrToken,
  function(data, responseCode)
  {
    // Check response for type
    pmapUpdateFails = 0;
    if (typeof(data) == "string")
    {
      // Check response
      if (dmatches = data.match(/^Error: (.*)$/))
      {
        alert("An error occured: "+ dmatches[1]);
        return false;
      }
      else
      if (dmatches = data.match(/{[A-Za-z0-9\'\":, ]+}/))
      {
        var pos = JSON.parse(dmatches[0]);
        if (typeof(pos) == "object" && (pos.x != pmapPlrPrevPos.x || pos.y != pmapPlrPrevPos.y))
        {
          pmapPlrMarker.setPosition(pmapMapCoordsToLatLng(new google.maps.Point(pos.x * 2 + 1, pos.y * 2 + 1), 7));
          pmap.panTo(pmapMapCoordsToLatLng(new google.maps.Point(pos.x, pos.y), 6));
          pmapPlrPrevPos = pos;
          pmapUpdateDelay = 500;
        }
        else
          // Position not changed, increase update delay
          pmapIncreaseUpdateDelay(500);
      }
      else
      // Not a position update, increase update delay
        pmapIncreaseUpdateDelay(1000);
    }
    else
      pmapUpdateDelay = 10000;

    pmapScheduleNextUpdate();
  },
  function()
  {
    pmapUpdateDelay = 10000;
    if (pmapUpdateFails++ > 5)
      alert("An error occured: Server failed to respond.");
    else
      pmapScheduleNextUpdate();
  });
}