o
    [h0                     @   s   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 ddlmZ ddlmZmZ G d	d
 d
eZG dd de
ZG dd de
ZdS )a6  
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)IntEnum)NoneType)GDALBase)SRSException)srs)force_bytes	force_strc                   @   s   e Zd ZdZdZdS )	AxisOrderr      N)__name__
__module____qualname__TRADITIONALZ	AUTHORITY r   r   /home/ubuntu/experiments/live_experiments/Pythonexperiments/Otree/venv/lib/python3.10/site-packages/django/contrib/gis/gdal/srs.pyr   (   s    r   c                   @   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d0d1 Zed2d3 Zed4d5 Zed6d7 Z d8d9 Z!d:d; Z"d<d= Z#d>d? Z$d@dA Z%edBdC Z&edMdDdEZ'edFdG Z(edHdI Z)edNdJdKZ*dS )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."
     userNc                 C   sJ  t |ttfstd|ptj| _|dkr2ttd| _	| 
| | jtjkr0t| j	| j dS t |trKz
t|}d| }W n" tyJ   Y nw t |trSd}nt || jr^|}d}ntd| |dkrk|}n	td}t|}|s|td	| || _	| jtjkrt| j	| j |d
kr| | dS |dkr| | 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 string, and/or a projection "well known" shorthand
        string (one of 'WGS84', 'WGS72', 'NAD27', 'NAD83').
        z:SpatialReference.axis_order must be an AxisOrder instance.wkt    NzEPSG:%depsgZogrzInvalid SRS type "%s"z+Could not create spatial reference from: %sr   )
isinstancer   r   
ValueErrorr   
axis_ordercapiZnew_srsr   ptr
import_wktZset_axis_strategystrintZptr_type	TypeErrorr   import_user_inputimport_epsg)selfZ	srs_inputZsrs_typer   sridr	   bufr   r   r   __init__6   sP   



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
        >>> # For the units authority, have to use the pipe symbole.
        >>> print(srs['UNIT|AUTHORITY'])
        EPSG
        >>> print(srs['UNIT|AUTHORITY', 1]) # The authority value for the units
        9122
        )r   tuple
attr_valuer%   targetr   r   r   __getitem__q   s   


zSpatialReference.__getitem__c                 C      | j S )zUse 'pretty' WKT.)
pretty_wktr%   r   r   r   __str__   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   Zget_attr_valuer   r
   )r%   r,   indexr   r   r   r*      s   zSpatialReference.attr_valuec                 C       t | j|du r|S t|S )z;Return the authority name for the given string target node.N)r   Zget_auth_namer   r
   r+   r   r   r   	auth_name   
   zSpatialReference.auth_namec                 C   r3   )z;Return the authority code for the given string target node.N)r   Zget_auth_coder   r
   r+   r   r   r   	auth_code   r5   zSpatialReference.auth_codec                 C   s   t t| j| jdS )z/Return a clone of this SpatialReference object.)r   )r   r   Z	clone_srsr   r   r0   r   r   r   clone      zSpatialReference.clonec                 C      t | j dS )z7Morph this SpatialReference from ESRI's format to EPSG.N)r   Zmorph_from_esrir   r0   r   r   r   	from_esri      zSpatialReference.from_esric                 C   r9   )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   r0   r   r   r   r<      s   zSpatialReference.identify_epsgc                 C   r9   )z-Morph this SpatialReference to ESRI's format.N)r   Zmorph_to_esrir   r0   r   r   r   to_esri   r;   zSpatialReference.to_esric                 C   r9   )z5Check to see if the given spatial reference is valid.N)r   Zsrs_validater   r0   r   r   r   validate   r;   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.ZPROJCSZGEOGCSZLOCAL_CSN)	projectedr*   
geographiclocalr0   r   r   r   name   s   


zSpatialReference.namec              	   C   s,   z	t | jddW S  ttfy   Y dS w )z=Return the SRID of top-level authority, or None if undefined.N)r,   )r!   r6   r"   r   r0   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%   unitsrB   r   r   r   linear_name      zSpatialReference.linear_namec                 C      t | jtt \}}|S )z%Return the value of the linear units.rD   rF   r   r   r   rE      rI   zSpatialReference.linear_unitsc                 C   rC   )z%Return the name of the angular units.r   angular_unitsr   r   r   rF   r   r   r   angular_name   rI   zSpatialReference.angular_namec                 C   rJ   )z&Return the value of the angular units.rK   rF   r   r   r   rL      rI   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)
r?   rA   r   rE   r   r   r   r@   rL   r   rF   r   r   r   rG      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_flatteningr0   r   r   r   	ellipsoid      zSpatialReference.ellipsoidc                 C      t | jtt S )z6Return the Semi Major Axis for this Spatial Reference.)r   rN   r   r   r   r0   r   r   r   rN        zSpatialReference.semi_majorc                 C   rS   )z6Return the Semi Minor Axis for this Spatial Reference.)r   rO   r   r   r   r0   r   r   r   rO   
  rT   zSpatialReference.semi_minorc                 C   rS   )z9Return the Inverse Flattening for this Spatial Reference.)r   Zinvflatteningr   r   r   r0   r   r   r   rP     rT   z#SpatialReference.inverse_flatteningc                 C      t t| jS )zd
        Return True if this SpatialReference is geographic
         (root node is GEOGCS).
        )boolr   Zisgeographicr   r0   r   r   r   r@     rR   zSpatialReference.geographicc                 C   rU   )zFReturn True if this SpatialReference is local (root node is LOCAL_CS).)rV   r   Zislocalr   r0   r   r   r   rA     s   zSpatialReference.localc                 C   rU   )zw
        Return True if this SpatialReference is a projected coordinate system
         (root node is PROJCS).
        )rV   r   Zisprojectedr   r0   r   r   r   r?   "  rR   zSpatialReference.projectedc                 C      t | j| dS )z=Import the Spatial Reference from the EPSG code (an integer).N)r   Z	from_epsgr   )r%   r   r   r   r   r$   +     zSpatialReference.import_epsgc                 C   rW   )z0Import the Spatial Reference from a PROJ string.N)r   Z	from_projr   )r%   projr   r   r   import_proj/  rX   zSpatialReference.import_projc                 C   s   t | jt| dS )z>Import the Spatial Reference from the given user input string.N)r   Zfrom_user_inputr   r
   )r%   Z
user_inputr   r   r   r#   3  r8   z"SpatialReference.import_user_inputc                 C   s   t | jttt| dS )z2Import the Spatial Reference from OGC WKT (string)N)r   Zfrom_wktr   r   r   r
   )r%   r   r   r   r   r   7  s   zSpatialReference.import_wktc                 C   rW   )z0Import the Spatial Reference from an XML string.N)r   Zfrom_xmlr   )r%   xmlr   r   r   
import_xml;  rX   zSpatialReference.import_xmlc                 C   rS   )z8Return the WKT representation of this Spatial Reference.)r   Zto_wktr   r   r   r0   r   r   r   r   @  rT   zSpatialReference.wktc                 C   s   t | jtt |S )z.Return the 'pretty' representation of the WKT.)r   Zto_pretty_wktr   r   r   )r%   simplifyr   r   r   r/   E  s   zSpatialReference.pretty_wktc                 C   rS   )z:Return the PROJ representation for this Spatial Reference.)r   Zto_projr   r   r   r0   r   r   r   rY   J  rT   zSpatialReference.projc                 C   r.   )zAlias for proj().)rY   r0   r   r   r   proj4O  s   zSpatialReference.proj4c                 C   s   t | jtt t|S )z8Return the XML representation of this Spatial Reference.)r   Zto_xmlr   r   r   r
   )r%   dialectr   r   r   r[   T  s   zSpatialReference.xml)r   r   N)r   )r   )+r   r   r   __doc__r   Zrelease_srs
destructorr(   r-   r1   r*   r4   r6   r7   r:   r<   r=   r>   propertyrB   r&   rH   rE   rM   rL   rG   rQ   rN   rO   rP   r@   rA   r?   r$   rZ   r#   r   r\   r   r/   rY   r^   r[   r   r   r   r   r   -   sr    
;
	
















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   Znew_ctZ_ptrr   rB   
_srs1_name
_srs2_name)r%   sourcer,   r   r   r   r(   _  s   zCoordTransform.__init__c                 C   s   d| j | jf S )NzTransform from "%s" to "%s")rd   re   r0   r   r   r   r1   i  s   zCoordTransform.__str__N)	r   r   r   r`   r   Z
destroy_ctra   r(   r1   r   r   r   r   rc   Z  s
    
rc   N)r`   ctypesr   r   r   enumr   typesr   Zdjango.contrib.gis.gdal.baser   Zdjango.contrib.gis.gdal.errorr   Z"django.contrib.gis.gdal.prototypesr	   r   Zdjango.utils.encodingr
   r   r   r   rc   r   r   r   r   <module>   s      /