嗨,我正在将一个应用程序从谷歌地图移植到skmaps。api需要东北点和西南点,但在skmaps中,我找不到获取这些点的方法。我尝试了onmaRegionChangedInterface方法,但只返回地图的中心点和缩放级别。
怎么能拿到?

最佳答案

我做了下一个基于c代码的解决方案,从google的静态地图中获取边界。但是我必须改进缩放范围才能使用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);
    }


}

映射绑定类:
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;
    }
}

坐标等级:
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;
    }
}

使用此代码:
@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();



}

09-26 08:27