File size: 2,999 Bytes
9ea563b
de299f7
2542be6
 
 
94a3c4b
2542be6
9ea563b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2542be6
ee270e3
2542be6
 
 
 
 
9ea563b
 
 
 
 
 
2542be6
9ea563b
ee270e3
2542be6
9ea563b
 
2542be6
9ea563b
 
 
 
2542be6
9ea563b
 
2542be6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# import locationtagger

from geopy.geocoders import Nominatim
from geopy.exc import GeocoderTimedOut, GeocoderUnavailable
from models.location_models import LocationData, Coordinates, ErrorResponse
import requests
class LocationService:
    @staticmethod
    def extract_location_entities(ner_results):
        city, state, country = None, None, None
        
        for entity in ner_results:
            word = entity['word'].replace("##", "").strip()
            
            if entity['entity_group'] == 'CITY' and word.isalpha():
                city = word
            elif entity['entity_group'] == 'STATE' and word.isalpha():
                state = word
            elif entity['entity_group'] == 'COUNTRY' and word.isalpha():
                country = word
        
        if city or state or country:
            return {k: v for k, v in {"city": city, "state": state, "country": country}.items() if v is not None}
        else:
            return None

    
    @staticmethod
    def get_coordinates(data:dict,model) -> Coordinates | ErrorResponse:
        print("Inside get coordinates")
        print(data)
        try:
            location = data.get('location')
        except:
            return Coordinates(latitude=None, longitude=None)
        
        city = None
        state = None
        country = None
        
        if location:
            # Assuming `app.nlp` is already initialized elsewhere and accessible
            ner_results = model(location)
            
            # Extract city, state, and country using the logic from extract_location_entities
            location_entities = LocationService.extract_location_entities(ner_results)
            
            if location_entities:
                city = location_entities.get('city')
                state = location_entities.get('state')
                country = location_entities.get('country')
            
            # Create the location string
            location_string = ' '.join(filter(None, [city, state, country]))
            
            if not location_string:
                location_string = location
        else:
            return ErrorResponse(error="No location information provided")

        geolocator = Nominatim(user_agent="Geolocation")
        print("Printing location string")
        print(location_string)
        if city or state or country :
            location_string = city
        elif country is None:
            location_string = city
        elif city is None:
            location_string = state
        elif state is None:
            location_string = city

        try:
            getLoc = geolocator.geocode(location_string)
            print(getLoc.latitude)
            print(getLoc.longitude)
            return Coordinates(
                latitude=getLoc.latitude,
                longitude=getLoc.longitude
            ) 
        except Exception as e:
            print(f"Error {e}")
            return Coordinates(latitude=None , longitude=None)