/// <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));
    }