diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..b501f49 --- /dev/null +++ b/.env.example @@ -0,0 +1,5 @@ +DB_NAME=lab08 +DB_USER=postgres +DB_PASSWORD=your_password +DB_HOST=localhost +DB_PORT=your_port \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..97cd5e9 --- /dev/null +++ b/.gitignore @@ -0,0 +1,11 @@ +.env + +__pycache__/ +*.pyc + +.vscode/ + +.DS_Store +Thumbs.db + +.venv/ diff --git a/func.sql b/func.sql new file mode 100644 index 0000000..b4cee8b --- /dev/null +++ b/func.sql @@ -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(); \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..64445b2 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,3 @@ +psycopg2==2.9.11 +geopy==2.4.1 +python-dotenv==1.0.1 \ No newline at end of file diff --git a/task4.py b/task4.py new file mode 100644 index 0000000..f7a58a1 --- /dev/null +++ b/task4.py @@ -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() +