o
    uvXj-  ã                   @   sp   d Z ddlmZmZmZ ddlmZ ddlmZ ddl	m
Z ddlmZmZ G dd„ deƒZG d	d
„ d
eƒZdS )ah  
  The Spatial Reference class, represents OGR Spatial Reference objects.

  Example:
  >>> from django.contrib.gis.gdal import SpatialReference
  >>> srs = SpatialReference('WGS84')
  >>> print(srs)
  GEOGCS["WGS 84",
      DATUM["WGS_1984",
          SPHEROID["WGS 84",6378137,298.257223563,
              AUTHORITY["EPSG","7030"]],
          TOWGS84[0,0,0,0,0,0,0],
          AUTHORITY["EPSG","6326"]],
      PRIMEM["Greenwich",0,
          AUTHORITY["EPSG","8901"]],
      UNIT["degree",0.01745329251994328,
          AUTHORITY["EPSG","9122"]],
      AUTHORITY["EPSG","4326"]]
  >>> print(srs.proj)
  +proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs
  >>> print(srs.ellipsoid)
  (6378137.0, 6356752.3142451793, 298.25722356300003)
  >>> print(srs.projected, srs.geographic)
  False True
  >>> srs.import_epsg(32140)
  >>> print(srs.name)
  NAD83 / Texas South Central
é    )ÚbyrefÚc_char_pÚc_int)ÚGDALBase)ÚSRSException)Úsrs)Úforce_bytesÚ
force_textc                   @   s‚  e Zd ZdZejZdLdd„Zdd„ Zdd	„ Z	dMdd„Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zedd„ ƒZedd„ ƒZedd „ ƒZed!d"„ ƒZed#d$„ ƒZed%d&„ ƒZed'd(„ ƒZed)d*„ ƒZed+d,„ ƒZed-d.„ ƒZed/d0„ ƒZed1d2„ ƒZed3d4„ ƒZed5d6„ ƒZ d7d8„ Z!d9d:„ Z"d;d<„ Z#d=d>„ Z$d?d@„ Z%edAdB„ ƒZ&edMdCdD„ƒZ'edEdF„ ƒZ(edGdH„ ƒZ)edNdIdJ„ƒZ*dKS )OÚSpatialReferencezê
    A wrapper for the OGRSpatialReference object.  According to the GDAL Web site,
    the SpatialReference object "provide[s] services to represent coordinate
    systems (projections and datums) and to transform between them."
    Ú Úuserc                 C   sð   |dkrt  tdƒ¡| _|  |¡ dS t|tƒr,z
t|ƒ}d| }W n" ty+   Y nw t|tƒr4d}nt|| j	ƒr?|}d}nt
d| ƒ‚|dkrL|}n	tdƒ}t  |¡}|s]td| ƒ‚|| _|d	krk|  |¡ dS |dkrv|  |¡ dS dS )
a&  
        Create a GDAL OSR Spatial Reference object from the given input.
        The input may be string of OGC Well Known Text (WKT), an integer
        EPSG code, a PROJ.4 string, and/or a projection "well known" shorthand
        string (one of 'WGS84', 'WGS72', 'NAD27', 'NAD83').
        Úwktó    NzEPSG:%dÚepsgÚogrzInvalid SRS type "%s"z+Could not create spatial reference from: %sr   )ÚcapiÚnew_srsr   ÚptrÚ
import_wktÚ
isinstanceÚstrÚintÚ
ValueErrorÚptr_typeÚ	TypeErrorr   Úimport_user_inputÚimport_epsg)ÚselfÚ	srs_inputÚsrs_typeÚsridr   Úbuf© r"   úX/var/www/html/myproject/venv/lib/python3.10/site-packages/django/contrib/gis/gdal/srs.pyÚ__init__-   s:   

ÿ

ÿzSpatialReference.__init__c                 C   s   t |tƒr
| j|Ž S |  |¡S )a‡  
        Return the value of the given string attribute node, None if the node
        doesn't exist.  Can also take a tuple as a parameter, (target, child),
        where child is the index of the attribute in the WKT.  For example:

        >>> wkt = 'GEOGCS["WGS 84", DATUM["WGS_1984, ... AUTHORITY["EPSG","4326"]]'
        >>> srs = SpatialReference(wkt) # could also use 'WGS84', or 4326
        >>> print(srs['GEOGCS'])
        WGS 84
        >>> print(srs['DATUM'])
        WGS_1984
        >>> print(srs['AUTHORITY'])
        EPSG
        >>> print(srs['AUTHORITY', 1]) # The authority value
        4326
        >>> print(srs['TOWGS84', 4]) # the fourth value in this wkt
        0
        >>> print(srs['UNIT|AUTHORITY']) # For the units authority, have to use the pipe symbole.
        EPSG
        >>> print(srs['UNIT|AUTHORITY', 1]) # The authority value for the units
        9122
        )r   ÚtupleÚ
attr_value©r   Útargetr"   r"   r#   Ú__getitem__^   s   


zSpatialReference.__getitem__c                 C   ó   | j S )zUse 'pretty' WKT.)Ú
pretty_wkt©r   r"   r"   r#   Ú__str__z   s   zSpatialReference.__str__r   c                 C   s,   t |tƒr
t |tƒst‚t | jt|ƒ|¡S )zš
        The attribute value for the given target node (e.g. 'PROJCS'). The index
        keyword specifies an index of the child node to return.
        )r   r   r   r   r   Úget_attr_valuer   r   )r   r(   Úindexr"   r"   r#   r&      s   zSpatialReference.attr_valuec                 C   ó   t  | jt|ƒ¡S )z;Return the authority name for the given string target node.)r   Úget_auth_namer   r   r'   r"   r"   r#   Ú	auth_nameˆ   ó   zSpatialReference.auth_namec                 C   r0   )z;Return the authority code for the given string target node.)r   Úget_auth_coder   r   r'   r"   r"   r#   Ú	auth_codeŒ   r3   zSpatialReference.auth_codec                 C   ó   t t | j¡ƒS )z/Return a clone of this SpatialReference object.)r
   r   Ú	clone_srsr   r,   r"   r"   r#   Úclone�   ó   zSpatialReference.clonec                 C   ó   t  | j¡ dS )z7Morph this SpatialReference from ESRI's format to EPSG.N)r   Úmorph_from_esrir   r,   r"   r"   r#   Ú	from_esri”   r9   zSpatialReference.from_esric                 C   r:   )zš
        This method inspects the WKT of this SpatialReference, and will
        add EPSG authority nodes where an EPSG identifier is applicable.
        N)r   Úidentify_epsgr   r,   r"   r"   r#   r=   ˜   s   zSpatialReference.identify_epsgc                 C   r:   )z-Morph this SpatialReference to ESRI's format.N)r   Úmorph_to_esrir   r,   r"   r"   r#   Úto_esriŸ   r9   zSpatialReference.to_esric                 C   r:   )z5Check to see if the given spatial reference is valid.N)r   Úsrs_validater   r,   r"   r"   r#   Úvalidate£   r9   zSpatialReference.validatec                 C   s4   | j r|  d¡S | jr|  d¡S | jr|  d¡S dS )z*Return the name of this Spatial Reference.ÚPROJCSÚGEOGCSÚLOCAL_CSN)Ú	projectedr&   Ú
geographicÚlocalr,   r"   r"   r#   Úname¨   s   


zSpatialReference.namec              	   C   s,   z	t |  dd¡ƒW S  ttfy   Y dS w )z=Return the SRID of top-level authority, or None if undefined.Ú	AUTHORITYé   N)r   r&   r   r   r,   r"   r"   r#   r    ´   s
   ÿzSpatialReference.sridc                 C   ó   t  | jttƒ ƒ¡\}}|S )z$Return the name of the linear units.©r   Úlinear_unitsr   r   r   ©r   ÚunitsrH   r"   r"   r#   Úlinear_name½   ó   zSpatialReference.linear_namec                 C   ó   t  | jttƒ ƒ¡\}}|S )z%Return the value of the linear units.rL   rN   r"   r"   r#   rM   Ã   rQ   zSpatialReference.linear_unitsc                 C   rK   )z%Return the name of the angular units.©r   Úangular_unitsr   r   r   rN   r"   r"   r#   Úangular_nameÉ   rQ   zSpatialReference.angular_namec                 C   rR   )z&Return the value of the angular units.rS   rN   r"   r"   r#   rT   Ï   rQ   zSpatialReference.angular_unitsc                 C   sd   d\}}| j s
| jrt | jttƒ ƒ¡\}}n| jr&t | jttƒ ƒ¡\}}|dur.t	|ƒ}||fS )z˜
        Return a 2-tuple of the units value and the units name. Automatically
        determine whether to return the linear or angular units.
        )NNN)
rE   rG   r   rM   r   r   r   rF   rT   r	   rN   r"   r"   r#   rO   Õ   s   zSpatialReference.unitsc                 C   s   | j | j| jfS )z
        Return a tuple of the ellipsoid parameters:
         (semimajor axis, semiminor axis, and inverse flattening)
        )Ú
semi_majorÚ
semi_minorÚinverse_flatteningr,   r"   r"   r#   Ú	ellipsoidå   ó   zSpatialReference.ellipsoidc                 C   ó   t  | jttƒ ƒ¡S )z6Return the Semi Major Axis for this Spatial Reference.)r   rV   r   r   r   r,   r"   r"   r#   rV   í   ó   zSpatialReference.semi_majorc                 C   r[   )z6Return the Semi Minor Axis for this Spatial Reference.)r   rW   r   r   r   r,   r"   r"   r#   rW   ò   r\   zSpatialReference.semi_minorc                 C   r[   )z9Return the Inverse Flattening for this Spatial Reference.)r   Úinvflatteningr   r   r   r,   r"   r"   r#   rX   ÷   r\   z#SpatialReference.inverse_flatteningc                 C   r6   )zd
        Return True if this SpatialReference is geographic
         (root node is GEOGCS).
        )Úboolr   Úisgeographicr   r,   r"   r"   r#   rF   ý   rZ   zSpatialReference.geographicc                 C   r6   )zFReturn True if this SpatialReference is local (root node is LOCAL_CS).)r^   r   Úislocalr   r,   r"   r"   r#   rG     s   zSpatialReference.localc                 C   r6   )zw
        Return True if this SpatialReference is a projected coordinate system
         (root node is PROJCS).
        )r^   r   Úisprojectedr   r,   r"   r"   r#   rE   
  rZ   zSpatialReference.projectedc                 C   ó   t  | j|¡ dS )z=Import the Spatial Reference from the EPSG code (an integer).N)r   Ú	from_epsgr   )r   r   r"   r"   r#   r     r3   zSpatialReference.import_epsgc                 C   rb   )z2Import the Spatial Reference from a PROJ.4 string.N)r   Ú	from_projr   )r   Úprojr"   r"   r#   Úimport_proj  r3   zSpatialReference.import_projc                 C   s   t  | jt|ƒ¡ dS )z>Import the Spatial Reference from the given user input string.N)r   Úfrom_user_inputr   r   )r   Ú
user_inputr"   r"   r#   r     s   z"SpatialReference.import_user_inputc                 C   s   t  | jttt|ƒƒƒ¡ dS )z2Import the Spatial Reference from OGC WKT (string)N)r   Úfrom_wktr   r   r   r   )r   r   r"   r"   r#   r     s   zSpatialReference.import_wktc                 C   rb   )z0Import the Spatial Reference from an XML string.N)r   Úfrom_xmlr   )r   Úxmlr"   r"   r#   Ú
import_xml#  r3   zSpatialReference.import_xmlc                 C   r[   )z8Return the WKT representation of this Spatial Reference.)r   Úto_wktr   r   r   r,   r"   r"   r#   r   (  r\   zSpatialReference.wktc                 C   s   t  | jttƒ ƒ|¡S )z.Return the 'pretty' representation of the WKT.)r   Úto_pretty_wktr   r   r   )r   Úsimplifyr"   r"   r#   r+   -  s   zSpatialReference.pretty_wktc                 C   r[   )z<Return the PROJ.4 representation for this Spatial Reference.)r   Úto_projr   r   r   r,   r"   r"   r#   re   2  r\   zSpatialReference.projc                 C   r*   )zAlias for proj().)re   r,   r"   r"   r#   Úproj47  s   zSpatialReference.proj4c                 C   s   t  | jttƒ ƒt|ƒ¡S )z8Return the XML representation of this Spatial Reference.)r   Úto_xmlr   r   r   r   )r   Údialectr"   r"   r#   rk   <  s   zSpatialReference.xmlN)r   r   )r   )r   )+Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Úrelease_srsÚ
destructorr$   r)   r-   r&   r2   r5   r8   r<   r=   r?   rA   ÚpropertyrH   r    rP   rM   rU   rT   rO   rY   rV   rW   rX   rF   rG   rE   r   rf   r   r   rl   r   r+   re   rq   rk   r"   r"   r"   r#   r
   %   sr    
1
	
















r
   c                   @   s&   e Zd ZdZejZdd„ Zdd„ ZdS )ÚCoordTransformz,The coordinate system transformation object.c                 C   sB   t |tƒr
t |tƒstdƒ‚t |j|j¡| _|j| _|j| _	dS )z;Initialize on a source and target SpatialReference objects.z2source and target must be of type SpatialReferenceN)
r   r
   r   r   Únew_ctÚ_ptrr   rH   Ú
_srs1_nameÚ
_srs2_name)r   Úsourcer(   r"   r"   r#   r$   F  s
   zCoordTransform.__init__c                 C   s   d| j | jf S )NzTransform from "%s" to "%s")r~   r   r,   r"   r"   r#   r-   N  s   zCoordTransform.__str__N)	rt   ru   rv   rw   r   Ú
destroy_ctry   r$   r-   r"   r"   r"   r#   r{   B  s
    r{   N)rw   Úctypesr   r   r   Údjango.contrib.gis.gdal.baser   Údjango.contrib.gis.gdal.errorr   Ú"django.contrib.gis.gdal.prototypesr   r   Údjango.utils.encodingr   r	   r
   r{   r"   r"   r"   r#   Ú<module>   s      