Mercurial > hg > batmud > gmap2
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(); }); }