Python ve Postgresql'de İki Coğrafi Nokta Arasındaki Mesafe

Her gün yeni şeyler öğrendiğim Zingat'ın New York özgürlük anıtına olan uzaklığı https://www.geodatasource.com/distance-calculator sitesine göre 8142.86 km. Bu uzaklığı Longitude,Latitude değerleri ile pythonda geopy paketindeki distance ve postgresql'de st_distance_sphere fonksiyonu ile teyit edelim.
İhtiyacımız olan bilgi Zingat'ın, New York Özgürlük Anıtının, Dubai'deki Burj Khalifa lokasyonlarının Longitude,Latitude değerleri.Önce gerekli paketleri yükleyelim.
NOT:Hangi paketi ne için yüklediğimizin yanına not düşüldü.
NOT:Burj Khalifa ile Zingat arasındaki mesafeyide merak ettim:)

In [31]:
from pyspark.sql import DataFrameReader
import pandas as pd # Panda dataframe'i icin gerekli
import psycopg2  # Postgresql icin gerekli
from pandas import DataFrame 
import geopy.distance #distance hesaplama için gerekli

Panda dataframe'i oluşturalım, herbir lokasyonun Longitude,Latitude değerlerini girelim

In [32]:
 data = [['Zingat', 40.202750,29.168350,'Ozgurluk Anıtı',40.689247,-74.044502],
         ['Zingat', 40.202750,29.168350,'Burj Khalifa',25.197197,55.274376]] 
df = pd.DataFrame(data, columns = ['Location 1', 'Latitude1','Longitude1','Location2','Latitude2','Longitude2']) 
  
# print dataframe. 
df
Out[32]:
Location 1 Latitude1 Longitude1 Location2 Latitude2 Longitude2
0 Zingat 40.20275 29.16835 Ozgurluk Anıtı 40.689247 -74.044502
1 Zingat 40.20275 29.16835 Burj Khalifa 25.197197 55.274376

İlkini pythonda hesaplayalım geopy.distance fonksiyonunu kullanalım. geopy.distance fonksiyonunuda import etmemiz gerekir.

In [33]:
def distance(row):
    return (geopy.distance.distance((row['Latitude1'], row['Longitude1']), 
                                    (row['Latitude2'], row['Longitude2'])).km)

df['distance']=df.apply(distance, axis=1)
df
Out[33]:
Location 1 Latitude1 Longitude1 Location2 Latitude2 Longitude2 distance
0 Zingat 40.20275 29.16835 Ozgurluk Anıtı 40.689247 -74.044502 8163.515469
1 Zingat 40.20275 29.16835 Burj Khalifa 25.197197 55.274376 2941.748768

Distance kolonunda görüldüğü üzere Zingat'in özgürlük anıtı ile olan mesafe 8163 km, Zingat'in Burj Khalifa ile olan mesafe 2941 km. Bu mesafeleri birde posgresql'de t_distance_sphere fonksiyonu ilede hesaplayalım
Not:Jupyterde postgresql sorguları yazabilmek için Postgresql makinesine bağlanma izni gereklidir. Gerekli user,password,host,port alınarak makineye bağlanılır ve sorgular çalıştırılır.

In [34]:
connection = psycopg2.connect(user = "xxxxx",
                                  password = "xxxxxx",
                                  host = "xxxxxx",
                                  port = "xxxxx",
                                  database = "xxxxx")

Önce Zingat ile Özgürlük Anıtı arasındaki mesafeyi hesaplayalım

In [35]:
cursor = connection.cursor()
cursor.execute("select st_distance_sphere(st_makepoint(29.16835,40.20275)\
                ,st_makepoint(-74.044502,40.689247))")
df = cursor.fetchall()
df
Out[35]:
[(8143266.9887514,)]

Mesafe 8143266 metredir. Yaklaşık 8143 km dir. Aşağıda Zingat ile Burj Khalifa arasındaki
mesafe hesaplanmıştır

In [36]:
cursor = connection.cursor()
cursor.execute("select st_distance_sphere(st_makepoint(29.16835,40.20275)\
                ,st_makepoint(55.274376,25.197197))")
df = cursor.fetchall()
df
Out[36]:
[(2940063.93147133,)]

Mesafe 2940063 m yaklaşık 2940 km dir.