2013-04-08 6 views
4

J'ai un ensemble de coordonnées GPS en notation décimale, et je cherche un moyen de trouver les coordonnées dans un cercle avec un rayon variable autour chaque emplacement.python: une façon élégante de trouver les coordonnées GPS d'un cercle autour d'un certain emplacement GPS

Here is an example de ce dont j'ai besoin. C'est un cercle avec 1km rayon autour de la coordonnée 47,11. Ce dont j'ai besoin est l'algorithme pour trouver les coordonnées du cercle, donc je peux l'utiliser dans mon fichier kml en utilisant un polygone. Idéalement pour python.

Des idées?

+1

Question intéressante. Vous obtiendrez probablement une réponse beaucoup plus rapidement à http://gis.stackexchange.com. – mtrw

Répondre

4

Utilisez la formule pour "distance donnée du point de destination et portant du point de départ" ici:

http://www.movable-type.co.uk/scripts/latlong.html

avec votre point central comme point de départ, votre rayon comme la distance, et boucle sur un certain nombre de roulements de 0 degrés à 360 degrés. Cela vous donnera les points sur un cercle, et travaillera aux pôles parce qu'il utilise de grands cercles partout.

+0

Je pense que c'est ça. Merci pour le lien. Il est difficile de chercher de telles choses si vous ne savez pas exactement comment ça s'appelle ... C'est pourquoi j'aime ce site et vous tous. Merci. – otmezger

6

voir aussi Adding distance to a GPS coordinate pour les relations simples entre les distances lat/lon et courte distance.

cela fonctionne:

import math 

# inputs 
radius = 1000.0 # m - the following code is an approximation that stays reasonably accurate for distances < 100km 
centerLat = 30.0 # latitude of circle center, decimal degrees 
centerLon = -100.0 # Longitude of circle center, decimal degrees 

# parameters 
N = 10 # number of discrete sample points to be generated along the circle 

# generate points 
circlePoints = [] 
for k in xrange(N): 
    # compute 
    angle = math.pi*2*k/N 
    dx = radius*math.cos(angle) 
    dy = radius*math.sin(angle) 
    point = {} 
    point['lat']=centerLat + (180/math.pi)*(dy/6378137) 
    point['lon']=centerLon + (180/math.pi)*(dx/6378137)/math.cos(centerLat*math.pi/180) 
    # add to list 
    circlePoints.append(point) 

print circlePoints 
+0

Nice. Est-ce stable près des pôles? – poolie

+2

Non, cette approximation est très pratique mais comme vous pouvez le voir il y a un terme 1/cos (lat), donc il diverge aux pôles. En outre, il n'est précis que pour les distances relatives inférieures à 10-100 km. –

+0

@poolie comment est-il bon en Europe du Nord ou au Canada? – otmezger

0

C'est un problème de trigonométrie simple.

Définissez votre système de coordonnées XOY au centre de votre cercle. Commencez par y = 0 et trouvez votre valeur x avec x = r. Ensuite, il suffit de faire pivoter votre rayon autour de l'origine par l'angle a (en radians). Vous pouvez trouver les coordonnées de votre prochain point sur le cercle avec Xi = r * cos(a), Yi = r * sin(a). Répétez le dernier 2 * Pi/a fois.

C'est tout.

MISE À JOUR

Prendre le commentaire de @poolie en compte, le problème peut être résolu de la manière suivante (en supposant que la Terre étant la sphère droite). Considérons une section transversale de la Terre avec son plus grand diamètre D à travers notre point (appelez-le L). Le diamètre de 1 km de notre cercle devient alors un accord (appelez le AB) du cercle de la section transversale de la Terre. Ainsi, la longueur de l'arc AB devient (AB) = D * Theta, où Theta = 2 * sin(|AB|/2). En outre, il est facile de trouver toutes les autres dimensions.

+0

Cela est correct pour un système xy cartésien, rectiligne. Mais, lat/long n'est pas un tel système. Il se rapproche d'un pour les petites compensations et près de l'équateur. Mais sur de longues distances, les lignes se courbent et convergent vers les pôles. – poolie

+0

@poolie oui, ce n'est pas mon sujet. Mais pour le petit cercle de 1 km de rayon cela peut fonctionner très bien. Sinon, vous pouvez essayer CS sphérique mais c'est plus complexe alors. – Olexandr

+0

@poolie Fait une mise à jour à ma réponse. – Olexandr

Questions connexes