/// <summary> /// Converts geographical coordinate to position in screen space. /// </summary> /// <param name="lng">Longitude</param> /// <param name="lat">Latitude</param> /// <returns>Screen space position</returns> public virtual Vector2 GetScreenPosition(double lng, double lat) { double mx, my; GetPosition(lng, lat, out mx, out my); OnlineMapsBuffer.StateProps lastState = map.buffer.lastState; mx /= lastState.width; my /= lastState.height; Rect mapRect = GetRect(); mx = mapRect.x + mapRect.width * mx; my = mapRect.y + mapRect.height - mapRect.height * my; return(new Vector2((float)mx, (float)my)); }
/// <summary> /// Converts geographical coordinates to position in world space. /// </summary> /// <param name="lng">Longitude</param> /// <param name="lat">Latitude</param> /// <returns></returns> public Vector3 GetWorldPosition(double lng, double lat) { double mx, my; GetPosition(lng, lat, out mx, out my); OnlineMapsBuffer.StateProps lastState = map.buffer.lastState; double px = -mx / lastState.width * sizeInScene.x; double pz = my / lastState.height * sizeInScene.y; Vector3 offset = transform.rotation * new Vector3((float)px, 0, (float)pz); offset.Scale(map.transform.lossyScale); return(map.transform.position + offset); }
/// <summary> /// Converts geographical coordinate to position in the scene relative to the top-left corner of the map in map space. /// </summary> /// <param name="lng">Longitude</param> /// <param name="lat">Latitude</param> /// <param name="px">Relative position X</param> /// <param name="py">Relative position Y</param> public virtual void GetPosition(double lng, double lat, out double px, out double py) { double dx, dy, dtx, dty; OnlineMapsBuffer.StateProps lastState = map.buffer.lastState; map.projection.CoordinatesToTile(lng, lat, lastState.zoom, out dx, out dy); map.projection.CoordinatesToTile(lastState.leftLongitude, lastState.topLatitude, lastState.zoom, out dtx, out dty); dx -= dtx; dy -= dty; int maxX = 1 << (lastState.zoom - 1); if (dx < -maxX) { dx += maxX << 1; } px = dx * OnlineMapsUtils.tileSize / lastState.zoomCoof; py = dy * OnlineMapsUtils.tileSize / lastState.zoomCoof; }
/// <summary> /// Converts geographical coordinates to position in world space with elevation. /// </summary> /// <param name="lng">Longitude</param> /// <param name="lat">Laatitude</param> /// <param name="tlx">Top-left longitude.</param> /// <param name="tly">Top-left latitude.</param> /// <param name="brx">Bottom-right longitude.</param> /// <param name="bry">Bottom-right latitude.</param> /// <returns>Position in world space.</returns> public Vector3 GetWorldPositionWithElevation(double lng, double lat, double tlx, double tly, double brx, double bry) { double mx, my; GetPosition(lng, lat, out mx, out my); OnlineMapsBuffer.StateProps lastState = map.buffer.lastState; mx = -mx / lastState.width * sizeInScene.x; my = my / lastState.height * sizeInScene.y; float y = OnlineMapsElevationManagerBase.GetElevation(mx, my, OnlineMapsElevationManagerBase.GetBestElevationYScale(tlx, tly, brx, bry), tlx, tly, brx, bry); Vector3 offset = transform.rotation * new Vector3((float)mx, y, (float)my); offset.Scale(map.transform.lossyScale); return(map.transform.position + offset); }
public override Vector2 GetScreenPosition(double lng, double lat) { double mx, my; GetPosition(lng, lat, out mx, out my); OnlineMapsBuffer.StateProps lastState = map.buffer.lastState; mx /= lastState.width; my /= lastState.height; Rect mapRect = image.GetPixelAdjustedRect(); mx = mapRect.x + mapRect.width * mx; my = mapRect.y + mapRect.height - mapRect.height * my; Vector3 worldPoint = new Vector3((float)mx, (float)my, 0); Matrix4x4 matrix = transform.localToWorldMatrix; worldPoint = matrix.MultiplyPoint(worldPoint); return(RectTransformUtility.WorldToScreenPoint(worldCamera, worldPoint)); }