Я сделал следующее обходное решение, основанное на коде 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();
}
вам нужно будет ориентировать карту в соответствии с северо-востока ось? (Я не уверен, что вы подразумеваете под «северо-восточной точкой» – Ando
Мне нужно преобразовать верхний правый пиксель и нижний левый пиксель в северо-восток и юго-западные координаты на экране для получения прямоугольника для отправки в API, который возвращает маркеры внутри этого региона , – ClarkXP