3
g 6                 @   s^  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mZmZmZmZmZmZmZmZ d dlmZ d dlmZ d dlmZ eeaed	d
dddgZdd ZG dd deZG dd deZ G dd de Z!G dd de Z"G dd de Z#G dd de Z$G dd de Z%G dd de Z&G d d! d!e Z'G d"d# d#eZ(G d$d% d%eZ)d&S )'    )defaultdict
namedtuple)formsgdal)SpatialProxy)GDALException)	GeometryCollectionGEOSExceptionGEOSGeometry
LineStringMultiLineString
MultiPointMultiPolygonPointPolygon)ImproperlyConfigured)Field)gettext_lazySRIDCacheEntryunits
units_namespheroidgeodeticc                s   ddl m} yjj  W n tk
r2   d Y nX  rLj fddfnd|f\}}| t| kr|| }|j\}}t||d|d |j	|j
f |jdt| | < t| |  S )	z
    Return the units, unit name, and spheroid WKT associated with the
    given SRID from the `spatial_ref_sys` (or equivalent) spatial database
    table for the given database connection.  These results are cached.
    r   )SpatialReferenceNc                s    j jjj| djS )N)srid)ZobjectsZusingaliasgetsrs)r   )SpatialRefSys
connection a/var/www/tester-filtro-web/env/lib/python3.6/site-packages/django/contrib/gis/db/models/fields.py<lambda>'   s    zget_srid_info.<locals>.<lambda>zSPHEROID["%s",%s,%s]r   )r   r   r   r   )Zdjango.contrib.gis.gdalr   opsZspatial_ref_sysNotImplementedErrorr   _srid_cacher   r   Z
semi_majorZinverse_flatteningZ
geographic)r   r   r   r   Zget_srsr   r   r   r    )r   r   r!   get_srid_info   s     

r&   c                   s   e Zd ZdZedZdZd fdd	Z fd	d
Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Z fddZdd Z fddZ  ZS ) BaseSpatialFieldz
    The Base GIS Field.

    It's used as a base class for GeometryField and RasterField. Defines
    properties that are common to all GIS fields such as the characteristics
    of the spatial reference system of the field.
    zThe base GIS field.FN  Tc                s&   || _ || _||d< t jf | dS )a  
        The initialization function for base spatial fields. Takes the following
        as keyword arguments:

        srid:
         The spatial reference system identifier, an OGC standard.
         Defaults to 4326 (WGS84).

        spatial_index:
         Indicates whether to create a spatial index.  Defaults to True.
         Set this instead of 'db_index' for geographic fields since index
         creation is different for geometry columns.
        verbose_nameN)spatial_indexr   super__init__)selfr)   r   r*   kwargs)	__class__r    r!   r,   C   s    zBaseSpatialField.__init__c                s<   t  j \}}}}| j|d< | jdk	r0| j|d< ||||fS )Nr   Tr*   )r+   deconstructr   r*   )r-   namepathargsr.   )r/   r    r!   r0   _   s
    


zBaseSpatialField.deconstructc             C   s   |j j| S )N)r#   Zgeo_db_type)r-   r   r    r    r!   db_typeh   s    zBaseSpatialField.db_typec             C   s   t | j|jS )N)r&   r   r   )r-   r   r    r    r!   r   k   s    zBaseSpatialField.spheroidc             C   s   t | j|jS )N)r&   r   r   )r-   r   r    r    r!   r   n   s    zBaseSpatialField.unitsc             C   s   t | j|jS )N)r&   r   r   )r-   r   r    r    r!   r   q   s    zBaseSpatialField.units_namec             C   s   t | j|jS )z
        Return true if this field's SRID corresponds with a coordinate
        system that uses non-projected units (e.g., latitude/longitude).
        )r&   r   r   )r-   r   r    r    r!   r   t   s    zBaseSpatialField.geodeticc             C   s   |j j| ||S )z\
        Return the placeholder for the spatial column for the
        given value.
        )r#   Zget_geom_placeholder)r-   valuecompilerr   r    r    r!   get_placeholder{   s    z BaseSpatialField.get_placeholderc             C   s8   |j }|dks*| j dks*|dkr0| j dkr0| j S |S dS )a  
        Return the default SRID for the given geometry or raster, taking into
        account the SRID set for the field. For example, if the input geometry
        or raster doesn't have an SRID, then the SRID of the field will be
        returned.
        N   r9   r9   )r   )r-   objr   r    r    r!   get_srid   s    $zBaseSpatialField.get_sridc                sD   |d krd S |j jt j||f||f| jr>|jjr>ddini S )N	geographyT)r#   ZAdapterr+   get_db_prep_valuer<   featuresZsupports_geography)r-   r5   r   r3   r.   )r/   r    r!   r=      s    z"BaseSpatialField.get_db_prep_valuec             C   sp   t |tjr|S |r6y
tj|S  tk
r2   Y qlX n6t |trly
tj|S  tk
rj   td| Y nX dS )zY
        Return a GDALRaster if conversion is successful, otherwise return None.
        z6Couldn't create spatial object from lookup value '%s'.N)
isinstancer   
GDALRasterr   dict
ValueError)r-   r5   is_candidater    r    r!   get_raster_prep_value   s    


z&BaseSpatialField.get_raster_prep_valuec                s   t  j|}|d krd S t|tr$nxt|ttfp:t|d}| j||}|rR|}nJ|ryt|}W q tt	fk
r   t
d| Y qX nt
dt|j | j||_|S )NZ__geo_interface__z6Couldn't create spatial object from lookup value '%s'.z>Cannot use object with type %s for a spatial lookup parameter.)r+   get_prep_valuer?   r
   bytesstrhasattrrD   r	   r   rB   type__name__r;   r   )r-   r5   r:   rC   Zraster)r/   r    r!   rE      s"    
zBaseSpatialField.get_prep_value)Nr(   T)rJ   
__module____qualname____doc___descriptionZempty_strings_allowedr,   r0   r4   r   r   r   r   r7   r;   r=   rD   rE   __classcell__r    r    )r/   r!   r'   8   s   	r'   c                   sl   e Zd ZdZedZejZdZ	dZ
ddd	d
 fddZ fddZ fddZ fddZdd Z  ZS )GeometryFieldzU
    The base Geometry field -- maps to the OpenGIS Specification Geometry type.
    uL   The base Geometry field — maps to the OpenGIS Specification Geometry type.ZGEOMETRYN   F     f@     V@g?)extent	tolerancec               s2   || _ || _|| _|| _t jf d|i| dS )a  
        The initialization function for geometry fields. In addition to the
        parameters from BaseSpatialField, it takes the following as keyword
        arguments:

        dim:
         The number of dimensions for this geometry.  Defaults to 2.

        extent:
         Customize the extent, in a 4-tuple of WGS 84 coordinates, for the
         geometry field entry in the `USER_SDO_GEOM_METADATA` table.  Defaults
         to (-180.0, -90.0, 180.0, 90.0).

        tolerance:
         Define the tolerance, in meters, to use for the geometry field
         entry in the `USER_SDO_GEOM_METADATA` table.  Defaults to 0.05.
        r)   N)dimr<   _extent
_tolerancer+   r,   )r-   r)   rW   r<   rU   rV   r.   )r/   r    r!   r,      s
    zGeometryField.__init__c                sn   t  j \}}}}| jdkr&| j|d< | jdk	r:| j|d< | jdkrN| j|d< | jdkrb| j|d	< ||||fS )NrR   rW   Fr<        f@     V@rU   g?rV        f     V)r\   r]   rZ   r[   )r+   r0   rW   r<   rX   rY   )r-   r1   r2   r3   r.   )r/   r    r!   r0      s    







zGeometryField.deconstructc                s4   t  j||f| t|| jt| jp$t| td d S )N)Z	load_func)r+   contribute_to_classsetattrattnamer   
geom_classr
   )r-   clsr1   r.   )r/   r    r!   r^      s    z!GeometryField.contribute_to_classc                sP   | j | j| jd|}| jdkrBt|d jdd rB|jdtj t	 j
f |S )N)
form_class	geom_typer   rR   rc   Zsupports_3dFwidget)rc   rd   r   rW   getattrre   
setdefaultr   ZTextarear+   	formfield)r-   r.   defaults)r/   r    r!   rh     s    zGeometryField.formfieldc             C   s"   |j js|jjj| |fS ||fS )z
        Return the selection format string, depending on the requirements
        of the spatial backend. For example, Oracle and MySQL require custom
        selection formats in order to retrieve geometries in OGC WKB.
        )queryZsubqueryr   r#   select)r-   r6   sqlparamsr    r    r!   select_format  s    zGeometryField.select_format)NrR   F     f     V)ro   rp   rS   rT   )rJ   rK   rL   rM   rN   rO   r   rQ   rc   rd   ra   r,   r0   r^   rh   rn   rP   r    r    )r/   r!   rQ      s   rQ   c               @   s"   e Zd ZdZeZejZe	dZ
dS )
PointFieldZPOINTr   N)rJ   rK   rL   rd   r   ra   r   rq   rc   rN   rO   r    r    r    r!   rq     s   rq   c               @   s"   e Zd ZdZeZejZe	dZ
dS )LineStringFieldZ
LINESTRINGzLine stringN)rJ   rK   rL   rd   r   ra   r   rr   rc   rN   rO   r    r    r    r!   rr   $  s   rr   c               @   s"   e Zd ZdZeZejZe	dZ
dS )PolygonFieldZPOLYGONr   N)rJ   rK   rL   rd   r   ra   r   rs   rc   rN   rO   r    r    r    r!   rs   +  s   rs   c               @   s"   e Zd ZdZeZejZe	dZ
dS )MultiPointFieldZ
MULTIPOINTzMulti-pointN)rJ   rK   rL   rd   r   ra   r   rt   rc   rN   rO   r    r    r    r!   rt   2  s   rt   c               @   s"   e Zd ZdZeZejZe	dZ
dS )MultiLineStringFieldZMULTILINESTRINGzMulti-line stringN)rJ   rK   rL   rd   r   ra   r   ru   rc   rN   rO   r    r    r    r!   ru   9  s   ru   c               @   s"   e Zd ZdZeZejZe	dZ
dS )MultiPolygonFieldZMULTIPOLYGONzMulti polygonN)rJ   rK   rL   rd   r   ra   r   rv   rc   rN   rO   r    r    r    r!   rv   @  s   rv   c               @   s"   e Zd ZdZeZejZe	dZ
dS )GeometryCollectionFieldZGEOMETRYCOLLECTIONzGeometry collectionN)rJ   rK   rL   rd   r   ra   r   rw   rc   rN   rO   r    r    r    r!   rw   G  s   rw   c               @   s(   e Zd ZdZedZdd Zdd ZdS )ExtentFieldz/Used as a return value from an extent aggregatezExtent Aggregate Fieldc             C   s   dS )Nrx   r    )r-   r    r    r!   get_internal_typeS  s    zExtentField.get_internal_typec             C   s   |j jj}|r|| n||fS )N)r   r#   Zselect_extent)r-   r6   rl   rm   rk   r    r    r!   rn   V  s    
zExtentField.select_formatN)rJ   rK   rL   rM   rN   rO   ry   rn   r    r    r    r!   rx   N  s   rx   c                   sX   e Zd ZdZedZdZdZdd Z fddZ	d	d
 Z
 fddZ fddZ  ZS )RasterFieldzJ
    Raster field for GeoDjango -- evaluates into GDALRaster objects.
    zRaster FieldZRASTERFc             C   s    |j j s|j j rtdd S )Nz3Raster fields require backends with raster support.)r>   Zgis_enabledZsupports_rasterr   )r-   r   r    r    r!   _check_connectiond  s    zRasterField._check_connectionc                s   | j | t j|S )N)r{   r+   r4   )r-   r   )r/   r    r!   r4   i  s    
zRasterField.db_typec             C   s   |j j|S )N)r#   Zparse_raster)r-   r5   Z
expressionr   r    r    r!   from_db_valuem  s    zRasterField.from_db_valuec                s,   t  j||f| t|| jttj|  d S )N)r+   r^   r_   r`   r   r   r@   )r-   rb   r1   r.   )r/   r    r!   r^   p  s    zRasterField.contribute_to_classc                sH   ddl m} yt|}td|fd|iS  tk
r:   Y nX t j|S )Nr   )RasterBandTransformZSpecificRasterBandTransform
band_index)Z$django.contrib.gis.db.models.lookupsr}   intrI   rB   r+   get_transform)r-   r1   r}   r~   )r/   r    r!   r   x  s    
zRasterField.get_transform)rJ   rK   rL   rM   rN   rO   rd   r<   r{   r4   r|   r^   r   rP   r    r    )r/   r!   rz   [  s   rz   N)*collectionsr   r   Zdjango.contrib.gisr   r   Z"django.contrib.gis.db.models.proxyr   Zdjango.contrib.gis.gdal.errorr   Zdjango.contrib.gis.geosr   r	   r
   r   r   r   r   r   r   Zdjango.core.exceptionsr   Zdjango.db.modelsr   Zdjango.utils.translationr   rN   rA   r%   r   r&   r'   rQ   rq   rr   rs   rt   ru   rv   rw   rx   rz   r    r    r    r!   <module>   s,   ,! T