web-dev-qa-db-fra.com

Comment vérifier si les coordonnées à l'intérieur d'une certaine zone Python

Disons que j'ai 2 types de coordonnées, d'abord appelés center_point et deuxième appelé test_point. Je veux savoir si test_point la coordonnée est à l'intérieur proche ou non de center_point coordonne en appliquant le seuil radius. Si je l'écris, c'est comme:

center_point = [{'lat': -7.7940023, 'lng': 110.3656535}]
test_point = [{'lat': -7.79457, 'lng': 110.36563}]

radius = 5 # in kilometer

Comment vérifier si le test_point à l'intérieur ou à l'extérieur du rayon de center_point en Python? comment j'effectue ce genre de tâche en Python?

Le résultat attendu indiquera que test_point à l'intérieur ou à l'extérieur du radius de center_point coordonnée.

12
ytomo

de la recommandation de @ user1753919 dans son commentaire, j'ai obtenu la réponse ici: Formule Haversine en Python (Relèvement et distance entre deux points GPS)

code final:

from math import radians, cos, sin, asin, sqrt

def haversine(lon1, lat1, lon2, lat2):
    """
    Calculate the great circle distance between two points 
    on the earth (specified in decimal degrees)
    """
    # convert decimal degrees to radians 
    lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2])

    # haversine formula 
    dlon = lon2 - lon1 
    dlat = lat2 - lat1 
    a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2
    c = 2 * asin(sqrt(a)) 
    r = 6371 # Radius of earth in kilometers. Use 3956 for miles
    return c * r

center_point = [{'lat': -7.7940023, 'lng': 110.3656535}]
test_point = [{'lat': -7.79457, 'lng': 110.36563}]

lat1 = center_point[0]['lat']
lon1 = center_point[0]['lng']
lat2 = test_point[0]['lat']
lon2 = test_point[0]['lng']

radius = 1.00 # in kilometer

a = haversine(lon1, lat1, lon2, lat2)

print('Distance (km) : ', a)
if a <= radius:
    print('Inside the area')
else:
    print('Outside the area')

Merci

18
ytomo
from math import sqrt
a = center_point[0]['lat'] - test_point[0]['lat']
b = center_point[0]['lng'] - test_point[0]['lng']
c = sqrt(a * a  +  b * b)
if (c < radius):
        print("inside")
else:
        print("outside")
2
Egor

GeoPy peut le gérer avec élégance:

from geopy import distance

center_point = [{'lat': -7.7940023, 'lng': 110.3656535}]
test_point = [{'lat': -7.79457, 'lng': 110.36563}]
radius = 5 # in kilometer

center_point_Tuple = Tuple(center_point[0].values()) # (-7.7940023, 110.3656535)
test_point_Tuple = Tuple(test_point[0].values()) # (-7.79457, 110.36563)

dis = distance.distance(center_point_Tuple, test_point_Tuple).km
print("Distance: {}".format(dis)) # Distance: 0.0628380925748918

if dis <= radius:
    print("{} point is inside the {} km radius from {} coordinate".format(test_point_Tuple, radius, center_point_Tuple))
else:
    print("{} point is outside the {} km radius from {} coordinate".format(test_point_Tuple, radius, center_point_Tuple))

ou si vous avez besoin de connaître la distance du grand cercle:

dis = distance.great_circle(center_point_Tuple, test_point_Tuple).km
print("Distance: {}".format(dis)) # Distance: 0.0631785164583489
1
Igor-S