Tagging Two Locations on Map using Python and Finding Distance between Two Tagged Location in Python

Tagging Two Locations on Map using Python and Finding Distance between Two Tagged Location in Python

# To begin with :

In our last blog we tried to visualize total sales of an organization geographical location wise on a geographical map. Please refer to below blog :


Here in this blog we will see how to tag two different locations on map. And will connect them using a custom arrow on the map itself. Adn then we will see how to compute the aerial distance between the two locations in Kilometers.

Two locations in considerations here are as follows : –

(1) instrovate.com, Noida
(2) Connaught Place, New Delhi

# Python Code

Python Libraries to be use :

(1) folium
(2) collections
(3) numpy
(4) math

Make sure that you have all these libraries pre installed on your system. Please rfer to below blog in case of any help :


The first step is to declare the latitude and longitude of two locations in some variables

In [37]:
import folium 
from collections import namedtuple
import numpy as np
import math
instrovate_latitude = 28.5626
instrovate_longitude = 77.4512
instroate = [instrovate_latitude,instrovate_longitude]

cp_delhi_latitude = 28.6304 
cp_delhi_longitude = 77.2177
cp_delhi = [cp_delhi_latitude, cp_delhi_longitude]
# Tagging Locations on Map

Following are the steps to tag locations on Map :

(1) create a folium map with location as latitude and logitude of instrovate

(2) use folium.marker(…) function to tag the two loations on map one by one. Here we can define color of tagging and text to be displayed if someone clicks that tagged location on map by using argument popup.

(3) Next is to create the line or arrow from instrovate to connaught place delhi. For this use folium.PolyLine(….) method.

(4) TO create the arraow kne from instrovate to connaught place delhi we will use two user defined function get_arrows() and get_degree() whose details will be defined later in the blog.

(5) Once we have the arows we will add it to our existing map

(6) View the map

In [45]:
dist_map = folium.Map(location=instroate, zoom_start=12)
folium.Marker(location=instroate, icon=folium.Icon(color='green') , popup = ' instrovate.com ').add_to(dist_map)
folium.Marker(location=cp_delhi, icon=folium.Icon(color='blue'), popup = ' Connaught Place ').add_to(dist_map)

folium.PolyLine(locations=[instroate, cp_delhi], color='red').add_to(dist_map)
arrows = getArrows(locations=[instroate, cp_delhi], n_arrows=3)

for arrow in arrows:

# Computing Distance Between Two Tagged Location

Below is the user defined function to calculate the distance between two locations when theor latitude and longitude are given

We can call this function with latitude and longitude values of both the locations and then print the returned value of distance in Kilometeres.

Please note that the distance computed in the aerial distance between the two locations.

In [15]:
def find_distance(origin, destination):
    lat1, lon1 = origin
    lat2, lon2 = destination
    radius = 6371 # km

    dlat = math.radians(lat2-lat1)
    dlon = math.radians(lon2-lon1)
    a = math.sin(dlat/2) * math.sin(dlat/2) + math.cos(math.radians(lat1)) \
        * math.cos(math.radians(lat2)) * math.sin(dlon/2) * math.sin(dlon/2)
    c = 2 * math.atan2(math.sqrt(a), math.sqrt(1-a))
    distance_bw_ori_desti = radius * c
    return distance_bw_ori_desti

dis = find_distance((instrovate_latitude, instrovate_longitude),(cp_delhi_latitude, cp_delhi_longitude))
print("Aerial Distance between Instrovate.com and Connaught Place Delhi is %d Km"%(dis))
Aerial Distance between Instrovate.com and Cannought Place Delhi is 24 Km
# User defined functions for getting arrows

Below are the two user defined functions used to get arrows to connect from instrovate to connaugth place delhi.

Locations needs to be converted in to namedtuples.

get_degree method is used to calculate the angle by which the arrow needs to be rotated as originally the arrow would be towards right hand side. It must be appropriately rotated to connect the two locations.

Below are the codes for two user defined functions

Please note that the execution of the below two user defined fuctions nees to be performed first they are being called in above codes.

In [36]:
def getArrows(locations, color='blue', size=6, n_arrows=3):
    Get a list of placed and rotated arrows or markers to be plotted
    locations : list of lists of latitude longitude that represent the begining and end of Line. 
                    this function Return list of arrows or the markers
    Point = namedtuple('Point', field_names=['lat', 'lon'])
    # creating point from Point named tuple
    point1 = Point(locations[0][0], locations[0][1])
    point2 = Point(locations[1][0], locations[1][1])
    # calculate the rotation required for the marker.  
    #Reducing 90 to account for the orientation of marker
    # Get the degree of rotation
    angle = get_angle(point1, point2) - 90
    # get the evenly space list of latitudes and longitudes for the required arrows

    arrow_latitude = np.linspace(point1.lat, point2.lat, n_arrows + 2)[1:n_arrows+1]
    arrow_longitude = np.linspace(point1.lon, point2.lon, n_arrows + 2)[1:n_arrows+1]
    final_arrows = []
    #creating each "arrow" and appending them to our arrows list
    for points in zip(arrow_latitude, arrow_longitude):
                      fill_color=color, number_of_sides=3, 
                      radius=size, rotation=angle))
    return final_arrows
In [39]:
def get_angle(p1, p2):
    This function Returns angle value in degree from the location p1 to location p2
    Parameters it accepts : 
    p1 : namedtuple with lat lon
    p2 : namedtuple with lat lon
    This function Return the vlaue of degree in the data type float
    Pleae also refers to for better understanding : https://gist.github.com/jeromer/2005586
    longitude_diff = np.radians(p2.lon - p1.lon)
    latitude1 = np.radians(p1.lat)
    latitude2 = np.radians(p2.lat)
    x_vector = np.sin(longitude_diff) * np.cos(latitude2)
    y_vector = (np.cos(latitude1) * np.sin(latitude2) 
        - (np.sin(latitude1) * np.cos(latitude2) 
        * np.cos(longitude_diff)))
    angle = np.degrees(np.arctan2(x_vector, y_vector))
    # Checking and adjustring angle value on the scale of 360
    if angle < 0:
        return angle + 360
    return angle