Search code examples
iosmapkitcllocationcllocationcoordinate2d

Calculate coordinates of map square from map center


I want to get the coordinates of the corners of the rectangle. Or to find the coordinate of the north-westest most point, 50 km from the map centre.

Does anyone know how I can do that?

The point is when I move around the map, I want to always have a rectangle(the rectangle does not need to drew, I just need its coordinates for a backend request), with it's corners always at 50 km from the current centre of the map.

I'm thinking of using somehow the distance function from CLLocation, but in this case I have the distance, but not one of the coordinates.

50km = mapCenterLocation.distance(from: coordinatesUnknown)

enter image description here


Solution

  • Not really sure what do you mean, but maybe this can help

    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)
    }
    

    This work for NE direction and distance in meters for the north-west direction, I think you can just put 135 for the degree and 5000 for distance. For the position, you need to put map center location.

    edit: For custom rectangle., you can first check for the diagonal degree

    func getDiagonalDegree(x: Float, y:Float) -> Float{
        return atan2(y,x)*(180/Double.pi)
    }
    

    So now you can get that returned diagonal degree to and put it in getNewTargetCoordinate. New bearing is 270+diagonalDegree.