Не совсем уверен, что вы имеете в виду, но, возможно, это может помочь
func getNewTargetCoordinate(position: CLLocationCoordinate2D, userBearing: Float, distance: Float)-> CLLocationCoordinate2D{
//haversine formula
//r is earth radius
let r = 6378140.0
let latitude1 = position.latitude * (Double.pi/180);
let longitude1 = position.longitude * (Double.pi/180);
//bearing for user heading in degree
let brng = Double(userBearing) * (Double.pi/180);
//calculating user new position based on user distance and bearing can be seen at haversine formula
var latitude2 = asin(sin(latitude1)*cos(Double(distance)/r) + cos(latitude1)*sin(Double(distance)/r)*cos(brng));
var longitude2 = longitude1 + atan2(sin(brng)*sin(Double(distance)/r)*cos(latitude1),cos(Double(distance)/r)-sin(latitude1)*sin(latitude2));
//converting latitude as degree
latitude2 = latitude2 * (180/Double.pi)
longitude2 = longitude2 * (180/Double.pi)
// return location of user
return CLLocationCoordinate2DMake(latitude2, longitude2)
}
Эта работа для направления NE и расстояния в метрах для направления северо-запад, я думаю, вы можете просто поставить 135 длястепень и 5000 для расстояния.Для этой позиции вам нужно указать местоположение в центре карты.
edit: Для настраиваемого прямоугольника. Вы можете сначала проверить диагональную степень
func getDiagonalDegree(x: Float, y:Float) -> Float{
return atan2(y,x)*(180/Double.pi)
}
Так что теперь вы можете получить эту возвращенную диагональСтепень и положить его в getNewTargetCoordinate.Новый подшипник имеет диагональ 270 + градус.