Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 33 additions & 11 deletions Runtime/Mapbox/BaseModule/Utilities/Conversions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -132,16 +132,15 @@ public static Vector3 LatitudeLongitudeToWorldPosition(LatitudeLongitude latLong
{
return LatitudeLongitudeToWorldPosition(latLong.Latitude, latLong.Longitude, refPoint, scale);
}



/// <summary>
/// Convert a simple string to a latitude longitude.
/// Expects format: latitude, longitude
/// </summary>
/// <returns>The lat/lon as Vector2d.</returns>
/// <param name="s">string.</param>
public static LatitudeLongitude StringToLatLon(string s)


/// <summary>
/// Convert a simple string to a latitude longitude.
/// Expects format: latitude, longitude
/// </summary>
/// <returns>The lat/lon as Vector2d.</returns>
/// <param name="s">string.</param>
public static LatitudeLongitude StringToLatLon(string s)
{
var latLonSplit = s.Split(',');
if (latLonSplit.Length != 2)
Expand Down Expand Up @@ -219,7 +218,9 @@ public static RectD TileBoundsInWebMercator(CanonicalTileId canonicalTileId)
public static Vector3 TileTopLeftInUnitySpace(CanonicalTileId unwrappedTileId, Vector2d worldCenter, float scale)
{
var res = InitialResolution / PowerTable2[unwrappedTileId.Z];
var minX = (float)(((unwrappedTileId.X * TileSize) * res - OriginShift) - worldCenter.x) / scale;
var xMeters = (unwrappedTileId.X * TileSize) * res - OriginShift;
xMeters = WrapWorldX(xMeters, worldCenter.x);
var minX = (float)((xMeters - worldCenter.x) / scale);
var minY = (float)((-((unwrappedTileId.Y * TileSize * res) - OriginShift)) - worldCenter.y) / scale;
return new Vector3(minX, 0, minY);
}
Expand All @@ -239,6 +240,13 @@ public static RectD TileBoundsInUnitySpace(CanonicalTileId unwrappedTileId, Vect
(unwrappedTileId.X + 1) * TileSize,
(unwrappedTileId.Y + 1) * TileSize,
unwrappedTileId.Z);
var centerX = (min.x + max.x) * 0.5;
var shift = Math.Round((centerX - worldCenter.x) / (OriginShift * 2.0)) * (OriginShift * 2.0);
if (shift != 0.0)
{
min.x -= shift;
max.x -= shift;
}
return new RectD((min - worldCenter)/scale, (max - min)/scale);
}

Expand All @@ -256,6 +264,13 @@ public static float TileEdgeSizeInMercator(CanonicalTileId unwrappedTileId)
return (40075017f / PowerTable2[unwrappedTileId.Z]);
}

private static double WrapWorldX(double x, double worldCenterX)
{
var worldWidth = OriginShift * 2.0;
var shift = Math.Round((x - worldCenterX) / worldWidth) * worldWidth;
return x - shift;
}

public static RectD TileBoundsInUnitySpace(UnwrappedTileId unwrappedTileId, Vector2d worldCenter, float scale)
{
var min = PixelsToMeters(
Expand All @@ -266,6 +281,13 @@ public static RectD TileBoundsInUnitySpace(UnwrappedTileId unwrappedTileId, Vect
(unwrappedTileId.X + 1) * TileSize,
(unwrappedTileId.Y + 1) * TileSize,
unwrappedTileId.Z);
var centerX = (min.x + max.x) * 0.5;
var shift = Math.Round((centerX - worldCenter.x) / (OriginShift * 2.0)) * (OriginShift * 2.0);
if (shift != 0.0)
{
min.x -= shift;
max.x -= shift;
}
return new RectD((min - worldCenter)/scale, (max - min)/scale);
}

Expand Down