Search code examples
androidskmaps

Get Northeast and Southwest from skmaps


Hi I'm porting an app from Google Maps to Skmaps. An API require the northeast and southwest points, but in Skmaps I can't find a way to get this points. I tried with onMapRegionChangeEnded interface method, but only is returned the map's center point and zoom level.

How can get it?


Solution

  • I did the next workaround based on a C# code to get the bounds from Google's static maps. Yet I must improve the zoom ranges to work with skmaps.

    public class MapsUtils {
    
        public static int TileSize = 256;
        public static double OriginX, OriginY;
        public static double PixelsPerLonDegree;
        public static double PixelsPerLonRadian;
    
        public static void MapsUtils() {
            OriginX = TileSize / 2;
            OriginY = TileSize / 2;
            PixelsPerLonDegree = TileSize / 360.0;
            PixelsPerLonRadian = TileSize / (2 * Math.PI);
        }
    
        public static double DegreesToRadians(double deg) {
            return deg * Math.PI / 180.0;
        }
    
        public static double RadiansToDegrees(double rads) {
            return rads * 180.0 / Math.PI;
        }
    
        public static double Bound(double value, double min, double max) {
            value = Math.min(value, max);
            return Math.max(value, min);
        }
    
        //From Lat, Lon to World Coordinate X, Y. I'm being explicit in assigning to
    //X and Y properties.
        public static Coordinate Mercator(double latitude, double longitude) {
            double siny = Bound(Math.sin(DegreesToRadians(latitude)), -.9999, .9999);
    
            Coordinate c = new Coordinate();
            c.setX(OriginX + longitude * PixelsPerLonDegree);
            c.setY(OriginY + .5 * Math.log((1 + siny) / (1 - siny)) * -PixelsPerLonRadian);
    
            return c;
        }
    
        //From World Coordinate X, Y to Lat, Lon. I'm being explicit in assigning to
        //Latitude and Longitude properties.
        public static Coordinate InverseMercator(double x, double y) {
            Coordinate c = new Coordinate();
    
            c.setLongitude((x - OriginX) / PixelsPerLonDegree);
            double latRadians = (y - OriginY) / -PixelsPerLonRadian;
            c.setLatitude(RadiansToDegrees(Math.atan(Math.sinh(latRadians))));
    
            return c;
        }
    
        public static MapBound getBound(Coordinate center,int zoom,int mapWidth,int mapHeight){
            MapsUtils.MapsUtils();
            double scale = Math.pow(2, zoom);
    
            Coordinate centerWorld = Mercator(center.getLatitude(), center.getLongitude());
            Coordinate centerPixel = new Coordinate();
            centerPixel.setX(centerWorld.getX() * scale);
            centerPixel.setY(centerWorld.getY() * scale);
    
            Coordinate NEPixel = new Coordinate();
            NEPixel.setX(centerPixel.getX() + mapWidth / 2.0);
            NEPixel.setY(centerPixel.getY() - mapHeight / 2.0);
    
            Coordinate SWPixel = new Coordinate();
            SWPixel.setX(centerPixel.getX() - mapWidth / 2.0);
            SWPixel.setY(centerPixel.getY() + mapHeight / 2.0);
    
            Coordinate NEWorld = new Coordinate();
            NEWorld.setX(NEPixel.getX() / scale);
            NEWorld.setY(NEPixel.getY() / scale);
    
            Coordinate SWWorld = new Coordinate();
            SWWorld.setX(SWPixel.getX() / scale);
            SWWorld.setY(SWPixel.getY() / scale);
    
            Coordinate NELatLon = InverseMercator(NEWorld.getX(), NEWorld.getY());
            Coordinate SWLatLon = InverseMercator(SWWorld.getX(), SWWorld.getY());
    
            return new MapBound(NELatLon,SWLatLon);
        }
    
    
    }
    

    Mapbound class:

    public class MapBound {
        private Coordinate northEast, southWest;
    
        public MapBound(Coordinate northEast, Coordinate southWest) {
            this.northEast = northEast;
            this.southWest = southWest;
        }
    
        public Coordinate getNorthEast() {
            return northEast;
        }
    
        public void setNorthEast(Coordinate northEast) {
            this.northEast = northEast;
        }
    
        public Coordinate getSouthWest() {
            return southWest;
        }
    
        public void setSouthWest(Coordinate southWest) {
            this.southWest = southWest;
        }
    }
    

    And coordinate class:

    public class Coordinate{
        private double x,y,latitude, longitude;
    
        public Coordinate() {
            this.x = 0;
            this.y = 0;
        }
    
        public Coordinate(double latitude, double longitude) {
            this.latitude = latitude;
            this.longitude = longitude;
        }
    
        public double getX() {
            return x;
        }
    
        public void setX(double x) {
            this.x = x;
        }
    
        public double getY() {
            return y;
        }
    
        public void setY(double y) {
            this.y = y;
        }
    
        public double getLatitude() {
            return latitude;
        }
    
        public void setLatitude(double latitude) {
            this.latitude = latitude;
        }
    
        public double getLongitude() {
            return longitude;
        }
    
        public void setLongitude(double longitude) {
            this.longitude = longitude;
        }
    }
    

    for use this code:

    @Override
    public void onMapRegionChangeEnded(SKCoordinateRegion skCoordinateRegion) {
        MapBound mapBound = MapsUtils.getBound(
                new Coordinate(skCoordinateRegion.getCenter().getLatitude(), skCoordinateRegion.getCenter().getLongitude()),
                (int) skCoordinateRegion.getZoomLevel(),
                skMap.getWidth(),
                skMap.getHeight());
        mapBound.getNorthEast().getLatitude();
        mapBound.getNorthEast().getLongitude();
        mapBound.getSouthWest().getLatitude();
        mapBound.getSouthWest().getLongitude();
    
    
    
    }