a
    Kcòfy"  ã                   @   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 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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ÚLayerza
    A 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ÚcapiZget_layer_defnÚ_ptrÚ_ldefnÚtest_capabilityÚ_random_read)ÚselfZ	layer_ptrr   © r   úZ/home/httpd/docs/test/DocsMgr/lib/python3.9/site-packages/django/contrib/gis/gdal/layer.pyÚ__init__   s    zLayer.__init__c                    sf   t |tƒr$|dk rtdƒ‚ˆ  |¡S t |tƒrZ| ˆ j¡\}}}‡ fdd„t|||ƒD ƒS tdƒ‚dS )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>6   ó    z%Layer.__getitem__.<locals>.<listcomp>z>Integers and slices may only be used when indexing OGR Layers.N)	Ú
isinstanceÚintÚ
IndexErrorr    ÚsliceÚindicesÚnum_featÚrangeÚ	TypeError)r   ÚindexÚstartÚstopZstrider   r#   r   Ú__getitem__*   s    


ÿzLayer.__getitem__c                 c   s4   t  | j¡ t| jƒD ]}tt  | j¡| ƒV  qdS )z'Iterate over each Feature in the Layer.N)r   Zreset_readingr   r,   r+   r	   Zget_next_feature)r   Úir   r   r   Ú__iter__<   s    zLayer.__iter__c                 C   s   | j S )z%The length is the number of features.)r+   r#   r   r   r   Ú__len__C   s    zLayer.__len__c                 C   s   | j S )zThe string name of the layer.)Únamer#   r   r   r   Ú__str__G   s    zLayer.__str__c                 C   s^   | j r2ztt | j|¡| ƒW S  ty.   Y qN0 n| D ]}|j|kr6|  S q6td| ƒ‚dS )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.N)r   r	   r   Zget_featurer   r   r"   r(   )r   Zfeat_idÚfeatr   r   r   r    K   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   Z
get_extentr   r   r   )r   Úenvr   r   r   Úextentb   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©Zstrings_only)r   Zget_fd_namer   r   r   Úencoding)r   r5   r   r   r   r5   i   s    z
Layer.namer8   c                 C   s   t  | j|¡S )z+Return the number of features in the Layer.)r   Zget_feature_countr   )r   Úforcer   r   r   r+   o   s    zLayer.num_featc                 C   s   t  | j¡S )z)Return the number of fields in the Layer.)r   Zget_field_countr   r#   r   r   r   Ú
num_fieldst   s    zLayer.num_fieldsc                 C   s   t t | j¡ƒS )z4Return the geometry type (OGRGeomType) of the Layer.)r   r   Zget_fd_geom_typer   r#   r   r   r   Ú	geom_typey   s    zLayer.geom_typec                 C   s6   zt  | j¡}tt |¡ƒW S  ty0   Y dS 0 dS )z0Return the Spatial Reference used in this Layer.N)r   Zget_layer_srsr   r   Úsrs_apiZ	clone_srsr   )r   r   r   r   r   r   ~   s
    z	Layer.srsc                    s   ‡ 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 )Tr;   )r   r   Zget_field_nameÚget_field_defnr   r   r<   ©r!   r2   r#   r   r   r$   �   s   ûýz Layer.fields.<locals>.<listcomp>©r,   r>   r#   r   r#   r   Úfields‡   s    
úzLayer.fieldsc                    s   ‡ fdd„t ˆ jƒD ƒS )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   Zget_field_typerA   r   rB   r#   r   r   r$   �   s   ÿz%Layer.field_types.<locals>.<listcomp>rC   r#   r   r#   r   Úfield_types–   s    
þzLayer.field_typesc                    s   ‡ fdd„t ˆ jƒD ƒS )z;Return a list of the maximum field widths for the features.c                    s    g | ]}t  t  ˆ j|¡¡‘qS r   )r   Zget_field_widthrA   r   rB   r#   r   r   r$   ¥   s   ÿz&Layer.field_widths.<locals>.<listcomp>rC   r#   r   r#   r   Úfield_widths¢   s    
þzLayer.field_widthsc                    s   ‡ fdd„t ˆ jƒD ƒS )z-Return the field precisions for the features.c                    s    g | ]}t  t  ˆ j|¡¡‘qS r   )r   Zget_field_precisionrA   r   rB   r#   r   r   r$   ­   s   ÿz*Layer.field_precisions.<locals>.<listcomp>rC   r#   r   r#   r   Úfield_precisionsª   s    
þzLayer.field_precisionsc                 C   s2   zt t t | j¡¡ƒW S  ty,   Y d S 0 d S )N)r   Úgeom_apiZ
clone_geomr   Z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¡ njt |ttfƒrft|ƒdks>tdƒ‚t	t
|ƒ\}}}}t | j||||¡ n |d u r~t | jd ¡ ntdƒ‚d S )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   Zset_spatial_filterr   ÚtupleÚlistÚlenÚ
ValueErrorÚmapr   Zset_spatial_filter_rectr-   )r   ÚfilterZxminZyminZxmaxZ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!   r7   ©Ú
field_namer   r   r$   Ô   r%   z$Layer.get_fields.<locals>.<listcomp>)rD   r   )r   rU   r   rT   r   Ú
get_fieldsÍ   s    
zLayer.get_fieldsFc                    s4   |r"ddl m‰  ‡ fdd„| D ƒS dd„ | D ƒS 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   ZwkbrS   rW   r   r   r$   Þ   r%   z#Layer.get_geoms.<locals>.<listcomp>c                 S   s   g | ]
}|j ‘qS r   r   rS   r   r   r   r$   à   r%   N)Zdjango.contrib.gis.geosrX   )r   Z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   Z
capabilityr   r   r   r   â   s    zLayer.test_capabilityN)r8   )F)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r1   r3   r4   r6   r    Úpropertyr:   r5   r+   r>   r?   r   rD   rE   rF   rG   rI   rQ   Zspatial_filterrV   rY   r   r   r   r   r   r      sB   









	
r   N) Úctypesr   r   Zdjango.contrib.gis.gdal.baser   Z django.contrib.gis.gdal.enveloper   r   Zdjango.contrib.gis.gdal.errorr   r   Zdjango.contrib.gis.gdal.featurer	   Zdjango.contrib.gis.gdal.fieldr
   Z"django.contrib.gis.gdal.geometriesr   Z django.contrib.gis.gdal.geomtyper   Z"django.contrib.gis.gdal.prototypesr   r   r   rH   r   r@   Zdjango.contrib.gis.gdal.srsr   Zdjango.utils.encodingr   r   r   r   r   r   r   Ú<module>   s   