
    N}bg7                         d dl Zd dlmZ d dlmZ d dlmZmZ d dl	m
Z
mZmZ d dlmZ d dlmZ dZd	Zd
ddde
fZ G d de          ZdS )    N)partial)	urlencode)ConfigurationErrorGeocoderQueryError)_DEFAULT_USER_AGENTDEFAULT_SENTINELGeocoder)Location)logger)	Nominatimznominatim.openstreetmap.orgzmy-applicationzmy_app/1zmy_user_agent/1.0specify_your_app_name_herec                        e Zd ZdZh dZdZdZeeeddedd fd
Z	d Z
d	edd
d
dd
ddd
dd
ddZd	ed
d	dd
ddZd Zd Z xZS )r   a  Nominatim geocoder for OpenStreetMap data.

    Documentation at:
        https://nominatim.org/release-docs/develop/api/Overview/

    .. attention::
       Using Nominatim with the default `user_agent` is strongly discouraged,
       as it violates Nominatim's Usage Policy
       https://operations.osmfoundation.org/policies/nominatim/
       and may possibly cause 403 and 429 HTTP errors. Please make sure
       to specify a custom `user_agent` with
       ``Nominatim(user_agent="my-application")`` or by
       overriding the default `user_agent`:
       ``geopy.geocoders.options.default_user_agent = "my-application"``.
       An exception will be thrown if a custom `user_agent` is not specified.
    >   citystatecountystreetcountry
postalcodez/searchz/reverseN)timeoutproxiesdomainscheme
user_agentssl_contextadapter_factoryc                   t                                          ||||||           |                    d          | _        | j        t          k    r1| j        d         t          v rt          d| j        d         z            | j        d| j        | j	        | _
        | j        d| j        | j        | _        dS )a  

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

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

        :param str domain: Domain where the target Nominatim service
            is hosted.

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

        :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
        )r   r   r   r   r   r   /z
User-Agenta  Using Nominatim with default or sample `user_agent` "%s" is strongly discouraged, as it violates Nominatim's ToS https://operations.osmfoundation.org/policies/nominatim/ and may possibly cause 403 and 429 HTTP errors. Please specify a custom `user_agent` with `Nominatim(user_agent="my-application")` or by overriding the default `user_agent`: `geopy.geocoders.options.default_user_agent = "my-application"`.z://N)super__init__stripr   _DEFAULT_NOMINATIM_DOMAINheaders_REJECTED_USER_AGENTSr   r   geocode_pathapireverse_pathreverse_api)	selfr   r   r   r   r   r   r   	__class__s	           l/home/e360mart.nyusoft.in/public_html/e360mart_env/lib/python3.11/site-packages/geopy/geocoders/nominatim.pyr   zNominatim.__init__5   s    N 	!#+ 	 	
 	
 	
 ll3''K444L.2GGG$S ,|,-
 
 
 #'+++t{{D<M<MN*.+++t{{DDUDUV    c                 J    d                     |t          |          f          S )aV  
        Construct geocoding request url.
        The method can be overridden in Nominatim-based geocoders in order
        to extend URL parameters.

        :param str base_api: Geocoding function base address - self.api
            or self.reverse_api.

        :param dict params: Geocoding params.

        :return: string URL.
        ?)joinr   )r(   base_apiparamss      r*   _construct_urlzNominatim._construct_urlx   s#     xx9V#4#45666r+   TF)exactly_oner   limitaddressdetailslanguagegeometry	extratagscountry_codesviewboxboundedfeaturetypenamedetailsc                    t          |t          j        j                  r! fd|                                D             }nd|i}|                    ddi           |rd|d<   n+|)t          |          }|dk     rt          d          ||d<   |
r                     |
d	          |d
<   |rd|d<   |	sg }	t          |	t                    r|	g}	|	rd
                    |	          |d<   |rd|d<   |rd|d<   |r||d<   |rd|d<   |S|                                }|dk    rd|d<   n3|dk    rd|d<   n'|dk    rd|d<   n|dk    rd|d<   nt          d          |r||d<                         j        |          }t          j        d j        j        |           t'           j        |          }                     |||          S ) a  
        Return a location point by address.

        :param query: The address, query or a structured query
            you wish to geocode.

            For a structured query, provide a dictionary whose keys
            are one of: `street`, `city`, `county`, `state`, `country`, or
            `postalcode`. For more information, see Nominatim's
            documentation for `structured requests`:

                https://nominatim.org/release-docs/develop/api/Search

        :type query: dict or str

        :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 int limit: Maximum amount of results to return from Nominatim.
            Unless exactly_one is set to False, limit will always be 1.

        :param bool addressdetails: If you want in *Location.raw* to include
            address details such as house_number, city_district, postcode, etc
            (in a structured form) set it to True

        :param str language: Preferred language in which to return results.
            Either uses standard
            `RFC2616 <http://www.ietf.org/rfc/rfc2616.txt>`_
            accept-language string or a simple comma-separated
            list of language codes.

        :param str geometry: If present, specifies whether the geocoding
            service should return the result's geometry in `wkt`, `svg`,
            `kml`, or `geojson` formats. This is available via the
            `raw` attribute on the returned :class:`geopy.location.Location`
            object.

        :param bool extratags: Include additional information in the result if available,
            e.g. wikipedia link, opening hours.

        :param country_codes: Limit search results
            to a specific country (or a list of countries).
            A country_code should be the ISO 3166-1alpha2 code,
            e.g. ``gb`` for the United Kingdom, ``de`` for Germany, etc.

        :type country_codes: str or list

        :type viewbox: list or tuple of 2 items of :class:`geopy.point.Point` or
            ``(latitude, longitude)`` or ``"%(latitude)s, %(longitude)s"``.

        :param viewbox: Prefer this area to find search results. By default this is
            treated as a hint, if you want to restrict results to this area,
            specify ``bounded=True`` as well.
            Example: ``[Point(22, 180), Point(-22, -180)]``.

        :param bool bounded: Restrict the results to only items contained
            within the bounding ``viewbox``.

        :param str featuretype: If present, restrict results to certain type of features.
            Allowed values: `country`, `state`, `city`, `settlement`.

        :param bool namedetails: If you want in *Location.raw* to include
            namedetails, set it to True. This will be a list of alternative names,
            including language variants, etc.

        :rtype: ``None``, :class:`geopy.location.Location` or a list of them, if
            ``exactly_one=False``.

        c                 .    i | ]\  }}|j         v ||S  )structured_query_params).0keyvalr(   s      r*   
<dictcomp>z%Nominatim.geocode.<locals>.<dictcomp>   s9       C$666 S 766r+   qformatjson   r3   NzLimit cannot be less than 1z#%(lon1)s,%(lat1)s,%(lon2)s,%(lat2)sr9   r:   ,countrycodesr4   r<   accept-languageTr7   wktpolygon_textsvgpolygon_svgkmlpolygon_kmlgeojsonpolygon_geojsonz@Invalid geometry format. Must be one of: wkt, svg, kml, geojson.featureTypez%s.geocode: %sr2   r   )
isinstancecollectionsabcMappingitemsupdateint
ValueError_format_bounding_boxstrr.   lowerr   r1   r%   r   debugr)   __name__r   _parse_json_call_geocoder)r(   queryr2   r   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r0   urlcallbacks   `                r*   geocodezNominatim.geocode   s   x e[_455 	"    ;;==  FF 5\Ff
 	 	 	  	$F7OOJJEqyy !>???#F7O 	@ $ 9 9>!@ !@F9  	" !F9 	MmS)) 	,*OM 	=%(XXm%<%<F>" 	)'(F#$ 	&$%F=! 	1(0F$% 	'"&F;~~''H5  )*~&&U""()}%%U""()}%%Y&&,-())(.  
  	0$/F=!!!$(F33%t~'>DDD4+EEE""3'"BBBr+   )r2   r   r5   r4   zoomr<   c                   	 |                      |                              d          \  }}	n# t          $ r t          d          w xY w||	dd}
|r||
d<   |rdnd|
d<   |||
d
<   |rd|
d<   |                     | j        |
          }t          j        d| j        j        |           t          | 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 str language: Preferred language in which to return results.
            Either uses standard
            `RFC2616 <http://www.ietf.org/rfc/rfc2616.txt>`_
            accept-language string or a simple comma-separated
            list of language codes.

        :param bool addressdetails: Whether or not to include address details,
            such as city, county, state, etc. in *Location.raw*

        :param int zoom: Level of detail required for the address,
            an integer in range from 0 (country level) to 18 (building level),
            default is 18.

        :param bool namedetails: If you want in *Location.raw* to include
            namedetails, set it to True. This will be a list of alternative names,
            including language variants, etc.

            .. versionadded:: 2.3

        :rtype: ``None``, :class:`geopy.location.Location` or a list of them, if
            ``exactly_one=False``.

        rI   z"Must be a coordinate pair or PointrG   )latlonrF   rK   rH   r   r4   Nrj   r<   z%s.reverse: %srU   rV   )_coerce_point_to_stringsplitr^   r1   r'   r   rb   r)   rc   r   rd   re   )r(   rf   r2   r   r5   r4   rj   r<   rl   rm   r0   rg   rh   s                r*   reversezNominatim.reverse+  s!   d	C33E::@@EEHC 	C 	C 	CABBB	C 
 

  	1(0F$%(6#=11A !F6N 	&$%F=!!!$"2F;;%t~'>DDD4+EEE""3'"BBBs	   +. Ac                     |                     dd           }|                     dd           }|                     dd           }| |t          |          }t          |          }t          |||f|          S )Nrl   rm   display_name)getfloatr
   )r(   placelatitude	longitude	placenames        r*   _parse_codezNominatim._parse_codev  su    99UD))IIeT**	IInd33	I$9XHi((I	Hi#8%@@@r+   c                 2    |sd S t          |t          j        j                  r'd|v r#|d         dk    rd S t	          |d                   t          |t          j        j                  s|g}|r                     |d                   S  fd|D             S )NerrorzUnable to geocoder   c                 :    g | ]}                     |          S r?   )ry   )rA   ru   r(   s     r*   
<listcomp>z)Nominatim._parse_json.<locals>.<listcomp>  s'    @@@D$$U++@@@r+   )rW   rX   rY   rZ   r   Sequencery   )r(   placesr2   s   `  r*   rd   zNominatim._parse_json  s     	4fko566 	:7f;L;Lg"555t(999&+/":;; 	XF 	A##F1I...@@@@@@@@r+   )rc   
__module____qualname____doc__r@   r$   r&   r   r!   r   r1   ri   rp   ry   rd   __classcell__)r)   s   @r*   r   r      sI        "   LL
 %$,( AW AW AW AW AW AW AWF7 7 7& $ bC bC bC bC bCP $IC IC IC IC ICVA A AA A A A A A Ar+   r   )collections.abcrX   	functoolsr   urllib.parser   	geopy.excr   r   geopy.geocoders.baser   r   r	   geopy.locationr
   
geopy.utilr   __all__r!   r#   r   r?   r+   r*   <module>r      s              " " " " " " < < < < < < < < P P P P P P P P P P # # # # # #      
9    yA yA yA yA yA yA yA yA yA yAr+   