Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
DB_NAME=lab08
DB_USER=postgres
DB_PASSWORD=your_password
DB_HOST=localhost
DB_PORT=your_port
11 changes: 11 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
.env

__pycache__/
*.pyc

.vscode/

.DS_Store
Thumbs.db

.venv/
23 changes: 23 additions & 0 deletions func.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
DROP FUNCTION IF EXISTS get_coordinates();

CREATE FUNCTION get_coordinates()
RETURNS TABLE (
airport_code CHAR(3),
coordinates TEXT
)
AS $$
BEGIN
RETURN QUERY
SELECT
a.airport_code,
a.coordinates::TEXT
FROM airports_data a
WHERE
(a.coordinates[0] BETWEEN 35 AND 50)
AND
(a.coordinates[1] BETWEEN 35 AND 50)
LIMIT 50;
END;
$$ LANGUAGE plpgsql;

--SELECT * FROM get_coordinates();
3 changes: 3 additions & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
psycopg2==2.9.11
geopy==2.4.1
python-dotenv==1.0.1
62 changes: 62 additions & 0 deletions task4.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
import psycopg2
from geopy.geocoders import Nominatim
import time
import os
from dotenv import load_dotenv

load_dotenv()

conn = psycopg2.connect(
dbname=os.getenv("DB_NAME"),
user=os.getenv("DB_USER"),
password=os.getenv("DB_PASSWORD"),
host=os.getenv("DB_HOST"),
port=os.getenv("DB_PORT")
)

cur = conn.cursor()

cur.execute("""
CREATE TABLE IF NOT EXISTS Address (
address_id SERIAL PRIMARY KEY,
address_text TEXT,
address_x FLOAT,
address_y FLOAT
);
""")

cur.execute("SELECT * FROM get_coordinates();")
rows = cur.fetchall()

geolocator = Nominatim(user_agent="geo_app")

for row in rows:
coords = row[1]

coords = coords.strip("()").split(",")

lat = float(coords[0])
lon = float(coords[1])

try:
location = geolocator.reverse(f"{lat}, {lon}")

if location:
address = location.address

cur.execute("""
INSERT INTO Address (address_text, address_x, address_y)
VALUES (%s, %s, %s)
""", (address, lat, lon))

print(f"[{lat}, {lon}] → {address}")

time.sleep(1)

except Exception as e:
print("Error:", e)

conn.commit()
cur.close()
conn.close()