o
    ^"<fP!                     @   s   d dl mZmZ d dlmZ 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 d dlmZ d d	lmZmZmZ d d
lmZ d dlmZmZ G dd deZdS )    )byrefc_double)GDALBase)EnvelopeOGREnvelope)GDALExceptionSRSException)Feature)OGRFieldTypes)OGRGeometry)OGRGeomType)dsgeomsrs)SpatialReference)force_bytes	force_strc                   @   s   e Zd Z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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d#d$ Zd%d& Ze
eeZd'd( Zd0d*d+Zd,d- Zd.S )1LayerzSA class that wraps an OGR Layer, needs to be instantiated from a DataSource object.c                 C   s6   |st d|| _|| _t| j| _| d| _dS )a7  
        Initialize on an OGR C pointer to the Layer and the `DataSource` object
        that owns this layer.  The `DataSource` object is required so that a
        reference to it is kept with this Layer.  This prevents garbage
        collection of the `DataSource` while this Layer is still active.
        z*Cannot create Layer, invalid pointer givens
   RandomReadN)	r   ptr_dscapiget_layer_defn_ptr_ldefntest_capability_random_read)self	layer_ptrr    r   T/var/www/html/kck/venv/lib/python3.10/site-packages/django/contrib/gis/gdal/layer.py__init__   s   zLayer.__init__c                    sb   t |tr|dk rtd |S t |tr-| j\}}} fddt|||D S td)z'Get the Feature at the specified index.r   z/Negative indices are not allowed on OGR Layers.c                    s   g | ]}  |qS r   )_make_feature).0fidr   r   r   
<listcomp>3       z%Layer.__getitem__.<locals>.<listcomp>z>Integers and slices may only be used when indexing OGR Layers.)	
isinstanceint
IndexErrorr!   sliceindicesnum_featrange	TypeError)r   indexstartstopstrider   r$   r   __getitem__'   s   


zLayer.__getitem__c                 c   s6    t | j t| jD ]}tt | j| V  qdS )z'Iterate over each Feature in the Layer.N)r   reset_readingr   r-   r,   r	   get_next_feature)r   ir   r   r   __iter__7   s
   zLayer.__iter__c                 C      | j S )z%The length is the number of features.)r,   r$   r   r   r   __len__>      zLayer.__len__c                 C   r8   )zThe string name of the layer.)namer$   r   r   r   __str__B   r:   zLayer.__str__c                 C   sX   | j rztt| j|| W S  ty   Y nw | D ]}|j|kr%|  S qtd| )a.  
        Helper routine for __getitem__ that constructs a Feature from the given
        Feature ID.  If the OGR Layer does not support random-access reading,
        then each feature of the layer will be incremented through until the
        a Feature is found matching the given feature ID.
        zInvalid feature id: %s.)r   r	   r   get_featurer   r   r#   r)   )r   feat_idfeatr   r   r   r!   F   s   
zLayer._make_featurec                 C   s"   t  }t| jt|d t|S )z.Return the extent (an Envelope) of this layer.   )r   r   
get_extentr   r   r   )r   envr   r   r   extent]   s   zLayer.extentc                 C   s   t | j}t|| jjddS )z1Return the name of this layer in the Data Source.Tstrings_only)r   get_fd_namer   r   r   encoding)r   r;   r   r   r   r;   d   s   z
Layer.namer@   c                 C   s   t | j|S )z+Return the number of features in the Layer.)r   get_feature_countr   )r   forcer   r   r   r,   j   s   zLayer.num_featc                 C   s   t | jS )z)Return the number of fields in the Layer.)r   get_field_countr   r$   r   r   r   
num_fieldso   s   zLayer.num_fieldsc                 C   s   t t| jS )z4Return the geometry type (OGRGeomType) of the Layer.)r   r   get_fd_geom_typer   r$   r   r   r   	geom_typet   s   zLayer.geom_typec                 C   s2   zt | j}tt|W S  ty   Y dS w )z0Return the Spatial Reference used in this Layer.N)r   get_layer_srsr   r   srs_api	clone_srsr   )r   r   r   r   r   r   y   s   z	Layer.srsc                        fddt  jD S )zt
        Return a list of string names corresponding to each of the Fields
        available in this Layer.
        c              	      s.   g | ]}t tt j| jjd dqS )TrD   )r   r   get_field_nameget_field_defnr   r   rG   r"   r6   r$   r   r   r%      s    
z Layer.fields.<locals>.<listcomp>r-   rK   r$   r   r$   r   fields   s   
zLayer.fieldsc                    rQ   )z
        Return a list of the types of fields in this Layer.  For example,
        return the list [OFTInteger, OFTReal, OFTString] for an OGR layer that
        has an integer, a floating-point, and string fields.
        c              	      s$   g | ]}t tt j| qS r   )r
   r   get_field_typerS   r   rT   r$   r   r   r%      s    z%Layer.field_types.<locals>.<listcomp>rU   r$   r   r$   r   field_types   s   
zLayer.field_typesc                    rQ   )z;Return a list of the maximum field widths for the features.c                        g | ]}t t  j|qS r   )r   get_field_widthrS   r   rT   r$   r   r   r%          z&Layer.field_widths.<locals>.<listcomp>rU   r$   r   r$   r   field_widths      
zLayer.field_widthsc                    rQ   )z-Return the field precisions for the features.c                    rY   r   )r   get_field_precisionrS   r   rT   r$   r   r   r%      r[   z*Layer.field_precisions.<locals>.<listcomp>rU   r$   r   r$   r   field_precisions   r]   zLayer.field_precisionsc                 C   s.   zt tt| jW S  ty   Y d S w )N)r   geom_api
clone_geomr   get_spatial_filterr   r   r$   r   r   r   _get_spatial_filter   s
   zLayer._get_spatial_filterc                 C   s   t |trt| j|j d S t |ttfr5t|dks tdt	t
|\}}}}t| j|||| d S |d u rBt| jd  d S td)N   z/Spatial filter list/tuple must have 4 elements.zJSpatial filter must be either an OGRGeometry instance, a 4-tuple, or None.)r'   r   r   set_spatial_filterr   tuplelistlen
ValueErrormapr   set_spatial_filter_rectr.   )r   filterxminyminxmaxymaxr   r   r   _set_spatial_filter   s   
zLayer._set_spatial_filterc                    s(    | j vrtd   fdd| D S )zg
        Return a list containing the given field name for every Feature
        in the Layer.
        zinvalid field name: %sc                    s   g | ]}|  qS r   )getr"   r?   
field_namer   r   r%      r&   z$Layer.get_fields.<locals>.<listcomp>)rV   r   )r   ru   r   rt   r   
get_fields   s   
zLayer.get_fieldsFc                    s0   |rddl m   fdd| D S dd | D S )zb
        Return a list containing the OGRGeometry for every Feature in
        the Layer.
        r   GEOSGeometryc                    s   g | ]} |j jqS r   )r   wkbrs   rw   r   r   r%      s    z#Layer.get_geoms.<locals>.<listcomp>c                 S   s   g | ]}|j qS r   )r   rs   r   r   r   r%      s    )django.contrib.gis.geosrx   )r   geosr   rw   r   	get_geoms   s   zLayer.get_geomsc                 C   s   t t| jt|S )ah  
        Return a bool indicating whether the this Layer supports the given
        capability (a string).  Valid capability strings include:
          'RandomRead', 'SequentialWrite', 'RandomWrite', 'FastSpatialFilter',
          'FastFeatureCount', 'FastGetExtent', 'CreateField', 'Transactions',
          'DeleteFeature', and 'FastSetNextByIndex'.
        )boolr   r   r   r   )r   
capabilityr   r   r   r      s   zLayer.test_capabilityN)r@   )F)__name__
__module____qualname____doc__r    r3   r7   r9   r<   r!   propertyrC   r;   r,   rK   rM   r   rV   rX   r\   r_   rc   rq   spatial_filterrv   r|   r   r   r   r   r   r      sD    







	



	r   N) ctypesr   r   django.contrib.gis.gdal.baser    django.contrib.gis.gdal.enveloper   r   django.contrib.gis.gdal.errorr   r   django.contrib.gis.gdal.featurer	   django.contrib.gis.gdal.fieldr
   "django.contrib.gis.gdal.geometriesr    django.contrib.gis.gdal.geomtyper   "django.contrib.gis.gdal.prototypesr   r   r   r`   r   rO   django.contrib.gis.gdal.srsr   django.utils.encodingr   r   r   r   r   r   r   <module>   s    