Files
ffxiv-datamining/research/map_coordinates.md
T
2015-12-02 11:48:39 +00:00

1.9 KiB

Conversions to 2D Map

Code samples in C#

Conversion of a Level coordinate into a 2D map coordinate:

private double ToMapCoordinate(double val) {
	var c = Map.SizeFactor / 100.0;

	val *= c;
	return ((41.0 / c) * ((val + 1024.0) / 2048.0)) + 1;
}

Conversion of a FishingSpot coordinate into a 2D map coordinate:

private double ToMapCoordinate(double val) {
	var c = TerritoryType.Map.SizeFactor / 100.0;

	return (41.0 / c) * ((val) / 2048.0) + 1;
}

Conversions to Long/Lat (eg Leaflets/Google Maps)

Code samples in PHP

You can translate the levels.exd values to Long/Lat using the x, y and scale would be the maps size_factor

function mapsRadiansToDegrees($rad)
{
    return $rad / (pi() / 180);
}

function mapsTranslateXYZtoLatLong($x, $y, $scale = 100)
{
    $scale = $scale / 100;
    $tilesize = 2048 / $scale;

    $pixelsPerLonDegree = $tilesize / 360;
    $pixelsPerLonRadian = $tilesize / (2 * pi());

    $lng = $x / $pixelsPerLonDegree;
    $latRadians = $y / -$pixelsPerLonRadian;
    $lat = mapsRadiansToDegrees(2 * atan(exp($latRadians)) - pi() / 2);

    return [
        'x' => $lng,
        'y' => $lat,
    ];
}

To translate a levels.exd position to an in-game X/Y:

function mapsTranslateXYZToGame($x, $y, $scale, $tilescale = 50)
{
    $map = 2048 / ($scale / 100);
    
    $TileCount = $map / $tilescale;
    
    $x = ceil(round(($x / $tilescale) + ($TileCount / 2),1));
    $y = ceil(round(($y / $tilescale) + ($TileCount / 2),1));
    
    return [
        'x' => $x,
        'y' => $y,
    ];
}

And finally, to translate an in game X/Y to a levels.exd position which can then be converted to a 2D or Long/Lat:

function mapsTranslateGameToXYZ($x, $y)
{
	$x = ($x*50)-25-1024;
	$y = ($y*50)-25-1024;
	
	return [
	    'x' => $x,
	    'y' => $y,
	];
}