2015-03-31 2 views
3

Привет, я переношу приложение с Google Maps на Skmaps. API требует северо-восточных и юго-западных точек, но в Skmaps я не могу найти способ получить эти очки. Я попытался использовать метод интерфейса onMapRegionChangeEnded, но возвращается только центральная точка карты и уровень масштабирования.Получите северо-восток и юго-запад от skmaps

Как это получить?

+0

вам нужно будет ориентировать карту в соответствии с северо-востока ось? (Я не уверен, что вы подразумеваете под «северо-восточной точкой» – Ando

+0

Мне нужно преобразовать верхний правый пиксель и нижний левый пиксель в северо-восток и юго-западные координаты на экране для получения прямоугольника для отправки в API, который возвращает маркеры внутри этого региона , – ClarkXP

ответ

2

Я сделал следующее обходное решение, основанное на коде 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); 
    } 


} 

Mapbound:

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(); 



}