diff --git a/Runtime/Mapbox/BaseModule/Utilities/Conversions.cs b/Runtime/Mapbox/BaseModule/Utilities/Conversions.cs
index 20ae5b1c3..9519d51a5 100644
--- a/Runtime/Mapbox/BaseModule/Utilities/Conversions.cs
+++ b/Runtime/Mapbox/BaseModule/Utilities/Conversions.cs
@@ -132,16 +132,15 @@ public static Vector3 LatitudeLongitudeToWorldPosition(LatitudeLongitude latLong
{
return LatitudeLongitudeToWorldPosition(latLong.Latitude, latLong.Longitude, refPoint, scale);
}
-
-
-
- ///
- /// Convert a simple string to a latitude longitude.
- /// Expects format: latitude, longitude
- ///
- /// The lat/lon as Vector2d.
- /// string.
- public static LatitudeLongitude StringToLatLon(string s)
+
+
+ ///
+ /// Convert a simple string to a latitude longitude.
+ /// Expects format: latitude, longitude
+ ///
+ /// The lat/lon as Vector2d.
+ /// string.
+ public static LatitudeLongitude StringToLatLon(string s)
{
var latLonSplit = s.Split(',');
if (latLonSplit.Length != 2)
@@ -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);
}
@@ -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);
}
@@ -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(
@@ -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);
}