
v^                 @   sm   d  d l  m Z d  d l m Z d  d l m Z m Z d  d l m	 Z	 d  d l
 m Z Gd d   d  Z d S)	    )GeometryField)Distance)Arear   )NotSupportedError)cached_propertyc                   s  e  Z d  Z d Z d Z d Z d Z d Z d Z e	 d d    Z
 d Z d Z f  Z d Z i  Z d d d	 d
 d d d d d d d d d d d d d d d d d d d d d d  d! d" d# d$ h Z d Z d% d&   Z d' d(   Z d) d*   Z d+ d,   Z d- d.   Z d/ d0   Z   f d1 d2   Z d3 d4   Z d5 d6   Z d7 d8   Z d9 d:   Z e e  Z   f d; d<   Z  d= d>   Z! d? d@   Z" dA dB   Z#   S)CBaseSpatialOperationsFNz%sc             C   s   |  j  S)N)select)self r
   P/tmp/pip-build-8lau8j11/django/django/contrib/gis/db/backends/base/operations.pyselect_extent   s    z#BaseSpatialOperations.select_extent r   Z	AsGeoJSONZAsGMLZAsKMLZAsSVGZAzimuthZBoundingCircleZCentroidZ
Differencer   ZEnvelopeZGeoHashZGeometryDistanceZIntersectionZIsValidZLengthZLineLocatePointZ	MakeValidZMemSizeZNumGeometriesZ	NumPointsZ	PerimeterZPointOnSurfaceZReverseZScaleZ
SnapToGridZSymDifference	TransformZ	TranslateUnionc             C   s   t  d   d  S)Nz:Aggregate extent not implemented for this spatial backend.)NotImplementedError)r	   boxsridr
   r
   r   convert_extent6   s    z$BaseSpatialOperations.convert_extentc             C   s   t  d   d  S)Nz=Aggregate 3D extent not implemented for this spatial backend.)r   )r	   r   r   r
   r
   r   convert_extent3d9   s    z&BaseSpatialOperations.convert_extent3dc             C   s   d | S)Nz'%s'r
   )r	   namer
   r
   r   geo_quote_name=   s    z$BaseSpatialOperations.geo_quote_namec             C   s   t  d   d S)zh
        Return the database column type for the geometry field on
        the spatial backend.
        zGsubclasses of BaseSpatialOperations must provide a geo_db_type() methodN)r   )r	   fr
   r
   r   geo_db_typeA   s    z!BaseSpatialOperations.geo_db_typec             C   s   t  d   d S)zu
        Return the distance parameters for the given geometry field,
        lookup value, and lookup type.
        z:Distance operations not available on this spatial backend.N)r   )r	   r   valueZlookup_typer
   r
   r   get_distanceH   s    z"BaseSpatialOperations.get_distancec             C   s   d d   } t  | d  rK | | j |  rG d |  j d  | j f Sd S| | |  r d |  j d  |  j | j | j f S|  j j j r d |  j | j f Sd	 |  j Sd
 S)a  
        Return the placeholder for the given geometry field with the given
        value.  Depending on the spatial backend, the placeholder may contain a
        stored procedure call to the transformation function of the spatial
        backend.
        c             S   s   |  d  k	 o |  j  | j  k S)N)r   )r   fieldr
   r
   r   transform_valueV   s    zCBaseSpatialOperations.get_geom_placeholder.<locals>.transform_valueZas_sqlz%s(%%s, %s)r   z%sz%s(%s(%%s,%s), %s)z
%s(%%s,%s)z%s(%%s)N)hasattroutput_fieldspatial_function_namer   	from_text
connectionfeaturesZhas_spatialrefsys_table)r	   r   r   compilerr   r
   r
   r   get_geom_placeholderO   s    ,z*BaseSpatialOperations.get_geom_placeholderc                s9   t  | |  j  r% t d | j   t   j |  d  S)NzA%s spatial aggregation is not supported by this database backend.)
isinstancedisallowed_aggregatesr   r   supercheck_expression_support)r	   
expression)	__class__r
   r   r(   k   s    z.BaseSpatialOperations.check_expression_supportc             C   s   t  d   d  S)Nz;Aggregate support not implemented for this spatial backend.)r   )r	   Zagg_namer
   r
   r   spatial_aggregate_namer   s    z,BaseSpatialOperations.spatial_aggregate_namec             C   s9   | |  j  k r t d |   |  j j | |  j |  S)Nz-This backend doesn't support the %s function.)unsupported_functionsr   function_namesgetgeom_func_prefix)r	   	func_namer
   r
   r   r   u   s    z+BaseSpatialOperations.spatial_function_namec             C   s   t  d   d  S)NzMSubclasses of BaseSpatialOperations must provide a geometry_columns() method.)r   )r	   r
   r
   r   geometry_columns{   s    z&BaseSpatialOperations.geometry_columnsc             C   s   t  d   d  S)NzKsubclasses of BaseSpatialOperations must a provide spatial_ref_sys() method)r   )r	   r
   r
   r   spatial_ref_sys~   s    z%BaseSpatialOperations.spatial_ref_sysc                s>   t    j |  } t | j t  r: | j |  j |   | S)N)r'   get_db_convertersr%   r   r   appendget_geometry_converter)r	   r)   
converters)r*   r
   r   r3      s    z'BaseSpatialOperations.get_db_convertersc             C   s   t  d   d  S)NzSSubclasses of BaseSpatialOperations must provide a get_geometry_converter() method.)r   )r	   r)   r
   r
   r   r5      s    z,BaseSpatialOperations.get_geometry_converterc             C   s]   | j  |  j  r4 |  j j j r% d St d   n% | j |  j  } | rY t j |  Sd  S)NZsq_mz2Area on geodetic coordinate systems not supported.)geodeticr!   r"   Zsupports_area_geodeticr   
units_nameAreaMeasureunit_attname)r	   r   r8   r
   r
   r   get_area_att_for_field   s    z,BaseSpatialOperations.get_area_att_for_fieldc             C   s[   d  } | j  |  j  r0 |  j j j rW d } n' | j |  j  } | rW t j |  } | S)Nm)r7   r!   r"   Zsupports_distance_geodeticr8   DistanceMeasurer:   )r	   r   Zdist_attZunitsr
   r
   r   get_distance_att_for_field   s    	z0BaseSpatialOperations.get_distance_att_for_field)$__name__
__module____qualname__ZpostgisZ
spatialiteZmysqlZoracleZspatial_versionr   r   r   Z	geographyZgeometryr&   r/   r-   r,   r    r   r   r   r   r   r$   r(   r+   r   r1   r2   staticmethodr   Zdistance_expr_for_lookupr3   r5   r;   r>   r
   r
   )r*   r   r   
   sF   
r   N)Zdjango.contrib.gis.db.modelsr   Z&django.contrib.gis.db.models.functionsr   Zdjango.contrib.gis.measurer   r9   r=   Zdjango.db.utilsr   Zdjango.utils.functionalr   r   r
   r
   r
   r   <module>   s
   