
    g                     n    d dl mZ d dlmZmZ d dlmZmZ d dlm	Z	 d dl
mZ d dlmZ dZ G d d	e      Zy
)    )partial)quote	urlencode)DEFAULT_SENTINELGeocoderLocation)Point)logger)MapTilerc                   d     e Zd ZdZdZdeededdd fd
ZddZdedddd	d
ZdedddZ	 xZ
S )r   z}Geocoder using the MapTiler API.

    Documentation at:
        https://cloud.maptiler.com/geocoding/ (requires sign-up)
    z/geocoding/%(query)s.jsonNzapi.maptiler.com)schemetimeoutproxies
user_agentssl_contextadapter_factorydomainc                    t         	|   ||||||       || _        |j                  d      | _        | j
                  d| j                  | j                  | _        y)a  
        :param str api_key: The API key required by Maptiler to perform
            geocoding requests. API keys are managed through Maptiler's account
            page (https://cloud.maptiler.com/account/keys).

        :param str scheme:
            See :attr:`geopy.geocoders.options.default_scheme`.

        :param int timeout:
            See :attr:`geopy.geocoders.options.default_timeout`.

        :param dict proxies:
            See :attr:`geopy.geocoders.options.default_proxies`.

        :param str user_agent:
            See :attr:`geopy.geocoders.options.default_user_agent`.

        :type ssl_context: :class:`ssl.SSLContext`
        :param ssl_context:
            See :attr:`geopy.geocoders.options.default_ssl_context`.

        :param callable adapter_factory:
            See :attr:`geopy.geocoders.options.default_adapter_factory`.

            .. versionadded:: 2.0

        :param str domain: base api domain for Maptiler
        )r   r   r   r   r   r   /z://N)super__init__api_keystripr   r   api_pathapi)
selfr   r   r   r   r   r   r   r   	__class__s
            X/var/www/api/v1/venv_getwork_v1/lib/python3.12/site-packages/geopy/geocoders/maptiler.pyr   zMapTiler.__init__   s]    P 	!#+ 	 	
 ll3'"&++t{{DMMJ    Tc                 h    |d   }|sy d }|r ||d         S |D cg c]
  } ||       c}S c c}w )Nfeaturesc                 J    | d   }| d   d   }| d   d   }t        |||f|       S )N
place_namecenterr      r   )featurelocation	longitudelatitudes       r   parse_featurez+MapTiler._parse_json.<locals>.parse_featureO   s>    |,H)!,Ix(+HHx&;WEEr    r    )r   jsonexactly_oner"   r+   r'   s         r   _parse_jsonzMapTiler._parse_jsonI   sI    
#	F  !--:BC(wM'*(CCCs   /)r.   r   	proximitylanguagebboxc                >   d| j                   i}|}|r| j                  |d      |d<   t        |t              r|g}|rdj	                  |      |d<   |r)t        |      }|j                  d|j                  |d<   t        |j                  d            }	dj	                  | j                  t        |		      z  t        |      f      }
t        j                  d
| j                  j                   |
       t#        | j$                  |      }| j'                  |
||      S )a  
        Return a location point by address.

        :param str query: The address or query you wish to geocode.

        :param bool exactly_one: Return one result or a list of results, if
            available.

        :param int timeout: Time, in seconds, to wait for the geocoding service
            to respond before raising a :class:`geopy.exc.GeocoderTimedOut`
            exception. Set this only if you wish to override, on this call
            only, the value set during the geocoder's initialization.

        :param proximity: A coordinate to bias local results based on a provided
            location.
        :type proximity: :class:`geopy.point.Point`, list or tuple of ``(latitude,
            longitude)``, or string as ``"%(latitude)s, %(longitude)s"``.

        :param language: Prefer results in specific languages. Accepts
            a single string like ``"en"`` or a list like ``["de", "en"]``.
        :type language: str or list

        :param bbox: The bounding box of the viewport within which
            to bias geocode results more prominently.
            Example: ``[Point(22, 180), Point(-22, -180)]``.
        :type bbox: list or tuple of 2 items of :class:`geopy.point.Point` or
            ``(latitude, longitude)`` or ``"%(latitude)s, %(longitude)s"``.

        :rtype: ``None``, :class:`geopy.location.Location` or a list of them, if
            ``exactly_one=False``.
        keyz#%(lon1)s,%(lat1)s,%(lon2)s,%(lat2)sr2   ,r1   r0   utf-8?queryz%s.geocode: %sr.   r   )r   _format_bounding_box
isinstancestrjoinr
   r)   r*   r   encoder   dictr   r   debugr   __name__r   r/   _call_geocoder)r   r9   r.   r   r0   r1   r2   paramspquoted_queryurlcallbacks               r   geocodezMapTiler.geocodeZ   s   R &!66;=F6N h$ zH!$(!3F:i A-.[[!**"EF;U\\'23hh4l#;;!&)+ ,%t~~'>'>D4++E""3'"BBr    )r.   r   r1   c                   d| j                   i}t        |t              r|g}|rdj                  |      |d<   | j	                  |d      }t        |j                  d            }dj                  | j                  t        |      z  t        |      f      }t        j                  d| j                  j                  |       t        | j                  |	      }	| j!                  ||	|
      S )a  
        Return an address by location point.

        :param query: The coordinates for which you wish to obtain the
            closest human-readable addresses.
        :type query: :class:`geopy.point.Point`, list or tuple of ``(latitude,
            longitude)``, or string as ``"%(latitude)s, %(longitude)s"``.

        :param bool exactly_one: Return one result or a list of results, if
            available.

        :param int timeout: Time, in seconds, to wait for the geocoding service
            to respond before raising a :class:`geopy.exc.GeocoderTimedOut`
            exception. Set this only if you wish to override, on this call
            only, the value set during the geocoder's initialization.

        :param language: Prefer results in specific languages. Accepts
            a single string like ``"en"`` or a list like ``["de", "en"]``.
        :type language: str or list

        :rtype: ``None``, :class:`geopy.location.Location` or a list of them, if
            ``exactly_one=False``.
        r4   r5   r1   z%(lon)s,%(lat)sr6   r7   r8   z%s.reverse: %sr:   r;   )r   r=   r>   r?   _coerce_point_to_stringr   r@   r   rA   r   r   rB   r   rC   r   r/   rD   )
r   r9   r.   r   r1   rE   pointrG   rH   rI   s
             r   reversezMapTiler.reverse   s    > &h$ zH!$(!3F:,,U4EFU\\'23hh4l#;;!&)+ ,%t~~'>'>D4++E""3'"BBr    )T)rC   
__module____qualname____doc__r   r   r   r/   rJ   rN   __classcell__)r   s   @r   r   r      sb     +H $$( %2KhD* $>CH $,C ,Cr    r   N)	functoolsr   urllib.parser   r   geopy.geocoders.baser   r   geopy.locationr	   geopy.pointr
   
geopy.utilr   __all__r   r,   r    r   <module>rZ      s,     ) ; #  
zCx zCr    