Calcul des coordonnées du carré x miles du point central?

11

J'essaie de créer un carré (ou cercle) de hache autour d'un point central, où tous les côtés du carré seraient à x miles du centre. J'ai besoin des 4 coordonnées de coin.

Il brouille mon cerveau en essayant de contourner ma tête? Je peux calculer la distance entre deux points en utilisant la formule haversine mais les maths ne sont vraiment pas mon point fort et je ne comprends pas le péché, le cos etc. et essayer de régler ça m'a perdu!

J'ai rencontré Calculer la latitude / longitude X miles à partir du point? mais je ne comprends pas!

Quelqu'un aurait-il la gentillesse d'expliquer comment je fais cela en termes de pommes et de poires?

Pour expliquer exactement ce que j'essaie de faire;

J'ai un site Web, où les utilisateurs peuvent rechercher des bâtiments dans une zone spécifique. Ils entreront dans une ville ou un endroit (que je connais le plus tard) et ils fouilleront dans un rayon spécifique de disons 10 miles de l'endroit.

J'ai besoin de trouver les lat et min et max lat du rayon de 10 milles afin de pouvoir interroger ma base de données en utilisant une clause where similaire à:

Where buildingLat <= maxLat 
  and buildingLat <= minLat 
  and buildingLong >= minLong 
   or buildingLong >= maxLong

J'ai besoin d'une sorte de formule!

Mes coordonnées sont en degrés décimaux

Bex
la source

Réponses:

10

À cette fin, des approximations simples sont plus que suffisantes. Au nord ou au sud, un degré est d'environ 69 milles, mais à l'est ou à l'ouest, il ne fait que 69 * cos (latitude) milles. Parce que les latitudes ne changent pas beaucoup sur une étendue de dix milles, vous pouvez utiliser en toute sécurité le cosinus de la latitude centrale du «carré». Par conséquent, les coordonnées souhaitées pour les sommets carrés à la distance r miles d'un emplacement central (f, l), données comme lat-lon, sont calculées comme

df = r/69        // North-south distance in degrees
dl = df / cos(f) // East-west distance in degrees
{(f-df,l-dl), (f+df,l-dl), (f+df,l+dl), (f-df,l+dl)} // List of vertices

Par exemple, supposons que r = 10 milles et l'emplacement central se trouve à 50 degrés de latitude nord, 1 degré de longitude ouest, de sorte que (f, l) = (50, -1) degrés. ensuite

df = 10/69 = 0.145
dl = 0.145 / cos(50 degrees) = 0.145 / 0.6428 = 0.225
f - df = 50 - 0.145 = 49.855 (southernmost latitude)
f + df = 50 + 0.145 = 50.145 (northernmost latitude)
l - dl = -1 - 0.225 = -1.225 (western longitude)
l + dl = -1 + 0.225 = -0.775 (eastern longitude)

et les coordonnées sont (49.855, -1.225), (50.145, -1.225), (50.145, -0.775) et (49.855, -0.775) lorsque vous marchez dans le sens des aiguilles d'une montre autour du carré en commençant à son coin sud-ouest.

N'utilisez pas cette approximation près des pôles ou pour des carrés supérieurs à quelques degrés sur un côté. En outre, en fonction des limites du SIG, une certaine prudence pourrait être nécessaire autour de la coupe globale de longitude, généralement prise à + -180 degrés.

whuber
la source
4

Prenez la coordonnée X du centre et soustrayez x miles de celui-ci, c'est le côté gauche de votre carré. Ensuite, prenez la coordonnée Y du centre et soustrayez-en X miles, c'est le bas de votre carré. Répétez ces étapes mais en ajoutant au lieu de soustraire pour obtenir la droite et les bords supérieurs. Vous pouvez maintenant construire les quatre coins de votre carré.

Notez que ce qui précède suppose que votre point central est en miles. S'il n'est pas d'abord reprojeté. Sinon, tous les paris sont désactivés et votre carré ne sera pas carré.

Ian Turton
la source
Faites-vous référence à la page d'exemple? Comment soustraire des milles d'une coordonnée et n'ai-je pas besoin de prendre en compte la courbure de la terre?
Bex
Non, c'est si simple qu'il n'y a pas vraiment besoin d'avoir un exemple concret. Peut-être devez-vous spécifier quel logiciel vous utilisez? Comme je l'ai dit, ma solution suppose que vous avez projeté vos coordonnées sur un SRS local (si ce n'est pas le cas, cela devrait être votre première question)
Ian Turton
Je suis vraiment confus maintenant! J'ai mis à jour ma question pour dire exactement ce que j'essaie de faire. J'ai en quelque sorte besoin de créer une boîte englobante pour pouvoir trouver les lat et min et max lat.
Bex
3
proj4js ( proj4js.org ) devrait alors aider
Ian Turton
1
Mes coordonnées ressemblent à ceci: 51.498485, -0.129089 qui sont des degrés n'est-ce pas?
Bex
4

Enfin ma réponse est: (en c #)

Je n'ai probablement pas besoin des 4 coordonnées mais je pense qu'elles sont assez précises.

 public static void GetBoundingCoords(double centerLat, double centerLong,  double distance)
    {
     Coordinate top=   MaxLatLongOnBearing(centerLat, centerLong,45,10);
     Coordinate right = MaxLatLongOnBearing(centerLat, centerLong, 135, 10);
     Coordinate bottom = MaxLatLongOnBearing(centerLat, centerLong, 225, 10);
     Coordinate left = MaxLatLongOnBearing(centerLat, centerLong, 315, 10);
    }

    public static Coordinate MaxLatLongOnBearing(double centerLat, double centerLong, double bearing, double distance)
    {

        var lonRads = ToRadian(centerLong);
        var latRads = ToRadian(centerLat);
        var bearingRads = ToRadian(bearing);
        var maxLatRads = Math.Asin(Math.Sin(latRads) * Math.Cos(distance / 6371) + Math.Cos(latRads) * Math.Sin(distance / 6371) * Math.Cos(bearingRads));
        var maxLonRads = lonRads + Math.Atan2((Math.Sin(bearingRads) * Math.Sin(distance / 6371) * Math.Cos(latRads)), (Math.Cos(distance / 6371) - Math.Sin(latRads) * Math.Sin(maxLatRads)));

        var maxLat = RadiansToDegrees(maxLatRads);
        var maxLong = RadiansToDegrees(maxLonRads);

        return new Coordinate(){Latitude=maxLat, Longitude=maxLong};
    }

ÉDITER

Je viens de réaliser que si je mets les coins de mon carré x miles du point central, les bords de mon carré ne seront pas les mêmes x miles. (Les mathématiques n'étaient pas mon point fort) Donc, pour obtenir la distance entre les points d'angle et le centre si je veux que les bords de mes carrés atteignent x miles, j'ai utilisé le théorème de Pythagore pour calculer la distance de la diagonale. (sur un triangle rectangle, le carré de l'hypoténuse (la diagonale) est égal au carré des deux autres côtés)

Bex
la source
ce ne sera pas un carré.
Ian Turton
J'ai modifié mes roulements, c'était un diamant .. il est désormais carré
Bex
En ce qui concerne l'édition, le théorème de Pythagore est correct pour les petits carrés, mais en général il ne vaut pas pour les triangles rectangulaires sphériques. Il est donc étrange que votre code utilise la trigonométrie sphérique avec cette approximation basée sur la géométrie plane.
whuber
Ma distance ne sera jamais supérieure à 100 miles, donc je ne pense pas que cela compte. Comme les inexactitudes seront petites avec cette distance plus petite.
Bex
1
Je pense que l'argument de @whuber est qu'il n'y a aucun avantage à utiliser un calcul complexe de distance le long de Lat et Long, étant donné que vous combinez ensuite ceux-ci avec le théorème de Pythagore. Vous pouvez plutôt utiliser un calcul beaucoup plus simple, comme Whuber l'a fait, ou comme le fait Ewan Todd . Utilisez des formules linéaires simples pour convertir la longitude en milles et la latitude en milles, ou vice versa. La seule partie "délicate" est de savoir que la formule de longitude nécessite un ajustement * cos(lat)lors de la conversion des degrés en milles et / cos(lat)lors de la conversion des milles en degrés.
ToolmakerSteve
0

Si vous utilisez une base de données sensible à l'espace, vous pouvez convertir votre zone d'intérêt dans le même système de coordonnées dans lequel vos données sont stockées, puis faire une comparaison de pommes à pommes.

Par exemple:

  1. L'utilisateur choisit un emplacement, résultant en lat / lon.
  2. Demandez à la base de données spatiales de convertir ce point en un système de coordonnées projeté approprié à la zone (unités de pieds ou mètres, etc.).
  3. Construisez votre zone d'intérêt autour du point projeté.
  4. Demandez à la base de données spatiale de reconvertir cette zone d'intérêt en lat / lon.
  5. Faites les comparaisons que vous devez faire.
Corbeau
la source
0

J'ai utilisé le contenu de cette page

Point de destination étant donné la distance et le relèvement du point de départ

Formule:
lat2 = asin (sin (lat1) * cos (d / R) + cos (lat1) * sin (d / R) * cos (θ))
lon2 = lon1 + atan2 (sin (θ) * sin (d / R) * cos (lat1), cos (d / R) −sin (lat1) * sin (lat2))

θ est le relèvement (en radians, dans le sens horaire à partir du nord); d / R est la distance angulaire (en radians), où d est la distance parcourue et R est le rayon de la Terre

Pour θ, j'ai utilisé -45 degrés (en radians) pour le "point supérieur gauche" et 135 degrés pour le "point inférieur droit"

(J'ai récemment posé la même question sur le site de mathématiques )

juan
la source
Le problème avec cette solution est que vous devez d'abord déterminer la distance pour les diagonales du carré. Il est plutôt plus facile de se déplacer le long des géodésiques du centre vers le milieu des côtés, puis, en tournant de 90 degrés, de se déplacer le long des côtés du carré.
whuber
@whuber, Si la distance est assez petite, ne pouvez-vous pas utiliser une simple trigonométrie pour cela? (d = côté opposé / sin (côté adjacent). Je le fais parce que je n'ai pas besoin de cette distance pour être exact. Sinon, vous pouvez appliquer cette formule deux fois pour faire exactement ce que vous dites (d'abord avec θ = 0 puis avec θ = -90 pour le coin supérieur gauche par exemple)
juan
C'est vrai, Juan. Mais on se demande pourquoi vous utilisez les formules plus complexes de géométrie sphérique lorsque vous commencez avec une approximation qui suppose que les formules euclidiennes fonctionneront en premier lieu. Il n'y a rien de mal à utiliser les formules sphériques, mais c'est inutile et inefficace sur le plan des calculs.
whuber
@whuber, pour le deuxième cas ce n'est pas approximatif (en appliquant la formule deux fois pour chaque côté). Vous avez raison, cependant, cela n'aurait aucun sens de les mélanger. En fait, je l'ai implémenté, mais je vais le changer (oh, et la raison en est que je ne suis pas si bon en mathématiques :))
juan