7
votes

Php Sélectionnez un lon / lon aléatoire dans un certain rayon

Disons que j'ai ce lon / lat: 33.33333,22.22222

Comment puis-je sélectionner au hasard un autre lon / lat dans un rayon x miles / km?

merci,


4 commentaires

Il est préférable de reformuler votre question initiale ( Stackoverflow .com / questions / 5460061 / ... ) que de poster un duplicata. Cliquez sur le lien "Modifier" ci-dessous de votre question pour modifier votre original.


@ D.n. - es-tu sûr? Ceci est une question complètement différente.


L'objectif de votre question reste le même, il s'agit simplement d'une partie spécifique de votre problème initial. Généralement, vous serez mieux reçu par d'autres si vous reformulez votre original. On dirait que vous avez au moins une traction, mais gardez cela à l'esprit à l'avenir.


Je n'ai pas de réponse pour vous, mais vous pourriez trouver mes implémentations de PHP de calculs géographiques pourraient vous aider github.com/treffynnon/geographic-calculations-in-php


4 Réponses :


8
votes

Vous pouvez utiliser ce message pour vous aider à vous guider:

http://blog.fedecarg.com/2009/02/08/geo-proximity-search-the-haversion-equation/

donc avec votre exemple , vous venez de choisir un nombre aléatoire entre 1 et 10 milles, où 10 est votre «dans un certain rayon». xxx

mise à jour: < / P>

Comme Tomalak indiquait dans les commentaires ci-dessous, cela fonctionne sous l'hypothèse que la Terre est une sphère plutôt que d'un géoïde inégal. Pour cette raison, vous obtiendrez des approximations plutôt que potentiellement (proches) des résultats exacts.


8 commentaires

@Tim Nordenfur - faisez-vous référence au 1-10 rand?


Je me demandais ce que les 69s surprenants faisaient là-bas et je pense qu'ils viennent du fait qu'un degré est d'environ 69 milles.


@Spacedman, c'est correct ... Chaque degré est égal à environ 69 milles.


@Mikelewis: Cela suppose plutôt que la Terre est une sphère, quand elle est en fait une géoïde inégale. Si vous êtes content de l'approximation, alors bien, mais au moins soyez conscient de la marge d'erreur. À certains endroits, cela peut être assez grand.


Comment puis-je modifier le code ci-dessus pour prendre en charge la randomisation des valeurs de flotteur? Comme mon rayon d'intérêt d'origine n'est que de 2 miles.


@OR W: La probabilité que le point soit à 10 milles est égal à la probabilité que le point soit de 1,6 km. Si vous choisissez, dites, une zone de 1x1 m ^ 2 près du point d'origine et une éloignement, la probabilité qu'un point aléatoire tombe dans la zone de plus près est beaucoup plus grand.


J'ai eu cette fonction sur mon système depuis longtemps, j'espère que cela vous aide à @or W. CODEPAD.ORG/BUHX2TWG (assurez-vous de soumettre le code pour obtenir de nouveaux résultats, plutôt que de rafraîchir la page).


Merci d'avoir répondu! Comment cela fonctionnerait-il pour mètres? Les 69 devraient-ils être échangés avec 111 045 mètres?



1
votes

Choisissez X1, un nombre compris entre 0 et X. Choisissez X2, un nombre compris entre 0 et X. Votre longitude est (1/2) x1 + longitude originale et votre latitude est (1/2) x2 + la latitude d'origine.


9 commentaires

Malheureusement, cela ne fonctionnera pas non plus, comme un décalage de x: x sera en dehors du rayon (distance étant x * sqrt (2) ou jusqu'à 1,4x la distance autorisée)


Amélioration de mon idée: Vérifiez la distance de la paire générée à partir des coordonnées d'origine (généré - original) et si elle est supérieure à X, générez des coordonnées jusqu'à ce que la distance soit inférieure ou égale à X.


Belle pensée. Votre édition est meilleure, mais maintenant, vous êtes soit limité à une gamme de SQRT (2) / 2 (seulement 0,7 fois la taille qu'il espérait), ou vous effectuez une génération de duplication inutile jusqu'à ce qu'un numéro satisfaisant soit créé. Le seul moyen d'autoriser correctement toutes les possibilités est de considérer les fonctions trigonométriques telles que le péché / cos. Pensez-y de cette façon: la zone que vous créez est une place parfaite, tandis que la zone idéale est un cercle.


Je l'ai mis à jour dans les commentaires, pas vraiment une bonne solution, car il y a probablement un moyen plus rapide que (en quelque sorte) brute forçant une solution ... mais j'apprends toujours une géométrie de base un peu basique.


Vous pensez au problème, et c'est la partie importante. J'essaie d'encourager votre pensée, pas de décourager, alors ne le prenez pas comme critique. :)


Merci pour l'aide. J'apprécie vraiment cela. Si le rayon est seulement ~ 0,7 fois, il est possible de multiplier x par un certain nombre avant de faire d'autres calculs avec elle, de sorte que 0,7x de la x après être multiplié est en réalité 1x.


Vous êtes correct, mais pourquoi effectuer plusieurs calculs lorsque la méthode la plus efficace consisterait à générer toujours une réponse valide à chaque fois? C'est la puissance d'utiliser des fonctions trigonométriques. Il vous permet de déplacer votre cadre de référence d'un système de coordonnées cartésien (coordonnées X et Y ou une "grille") à un système de coordonnées polaires (coordonnées d'angle et de radan, ou un "cercle") Découvrez EN.Wikipedia.org/wiki/polar_coordinated_system Pour en savoir plus.


Merci pour le lien. Je ne suis pas beaucoup sur les fonctions trigonométriques, alors j'utilise simplement ce que je sais. J'espère que l'année prochaine, je vais apprendre une géométrie plus avancée.


Regardé - très intéressant. Merci encore pour le lien avec la vidéo.



17
votes

@Mikelewis réponse est de loin une approche plus simple, mais cela ne vous donne que une gamme de latitude et de longitude, et dessinez au hasard de cela pourrait vous donner des points à l'extérieur du rayon donné.

Ce qui suit est un peu plus compliqué, Mais devrait vous donner des résultats "meilleurs". (Les chances sont que ce n'est pas nécessaire, mais je voulais avoir un aller :)).

comme avec @Mikelewis 'répondre à l'hypothèse ici est que la terre est une sphère. Nous utilisons ceci non seulement dans les formules, mais aussi lorsque nous exploitons la symétrie de rotation.

la théorie

Nous prenons d'abord l'approche évidente de choisir une distance aléatoire Distance / Code> (moins de $ RADIUS miles) et essayez de trouver un point aléatoire $ distance miles de distance. Ces points forment un cercle sur la sphère et vous pouvez vous convaincre rapidement une paramétrisation simple de ce cercle. Nous considérons plutôt un cas spécial: le pôle Nord.

points de distance du pôle Nord forment un cercle sur la sphère de la latitude fixe ( 90 - (PI * 3959) * 180 ). Cela nous donne un moyen facile facile de choisir un point aléatoire sur ce cercle: il aura connu latitude et aléatoire longitude.

Puis nous tournons simplement la sphère afin que notre pôle Nord se trouve au point que nous étions initialement donnés. La position de notre point aléatoire après cette rotation nous donne le point souhaité. < / p>

le code

Note: Les Cartésiennes <-> Les transformations de coordonnées sphériques utilisées ici sont différentes de ce qui est habituel dans la littérature. Mon Seule la motivation pour cela était d'avoir l'axe z (0,0,1) pointant vers le nord et l'axe Y (0,1,0) pointant vers vous et vers le point avec la latitude et la longitude égale à 0. Donc, si vous souhaitez imaginer la Terre, vous regardez le golfe de Guinée.

xxx


0 commentaires

1
votes

Les échantillons de code MATLAB suivants Points uniformément sur l'ellipsoïde dans un fichier spécifié distance d'un point central. xxx

Ce code échantillonne uniformément dans un cercle sur l'équidistant azimutal Projection centrée sur Lat0 , lon0 . Le radial, resp. azimutal, L'échelle de cette projection est de 1, resp. r / m . D'où la valeur arraque distorsion est r / m et cela est comptabilisé en acceptant de tels points avec une probabilité m / r .

Ce code représente également la situation où R0 est environ la moitié de la moitié de la circonférence de la terre et évite le double échantillonnage presque antipodal points.


0 commentaires