Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
[FEATURE] Port autoincremental field to c++
Also add:
- support for setting initial value for field to start at
- support for user-set field names (instead of always using 'AUTO')
  • Loading branch information
nyalldawson committed Oct 12, 2017
1 parent 61dc8ea commit 97c1b0d
Show file tree
Hide file tree
Showing 10 changed files with 367 additions and 70 deletions.
7 changes: 0 additions & 7 deletions python/plugins/processing/algs/help/qgis.yaml
@@ -1,10 +1,3 @@
qgis:addautoincrementalfield: >
This algorithm adds a new integer field to a vector layer, with a sequential value for each feature.

This field can be used as a unique ID for features in the layer.

The new attribute is not added to the input layer but a new layer is generated instead.

qgis:addfieldtoattributestable: >
This algorithm adds a new attribute to a vector layer.

Expand Down
60 changes: 0 additions & 60 deletions python/plugins/processing/algs/qgis/AutoincrementalField.py

This file was deleted.

2 changes: 0 additions & 2 deletions python/plugins/processing/algs/qgis/QGISAlgorithmProvider.py
Expand Up @@ -43,7 +43,6 @@
from .AddTableField import AddTableField
from .Aggregate import Aggregate
from .Aspect import Aspect
from .AutoincrementalField import AutoincrementalField
from .BasicStatistics import BasicStatisticsForField
from .Boundary import Boundary
from .CheckValidity import CheckValidity
Expand Down Expand Up @@ -174,7 +173,6 @@ def getAlgs(self):
algs = [AddTableField(),
Aggregate(),
Aspect(),
AutoincrementalField(),
BasicStatisticsForField(),
Boundary(),
CheckValidity(),
Expand Down
@@ -0,0 +1,86 @@
<?xml version="1.0" encoding="utf-8" ?>
<ogr:FeatureCollection
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://ogr.maptools.org/ autoincrement_field_field_name.xsd"
xmlns:ogr="http://ogr.maptools.org/"
xmlns:gml="http://www.opengis.net/gml">
<gml:boundedBy>
<gml:Box>
<gml:coord><gml:X>0</gml:X><gml:Y>-5</gml:Y></gml:coord>
<gml:coord><gml:X>8</gml:X><gml:Y>3</gml:Y></gml:coord>
</gml:Box>
</gml:boundedBy>

<gml:featureMember>
<ogr:autoincrement_field_field_name fid="points.0">
<ogr:geometryProperty><gml:Point srsName="EPSG:4326"><gml:coordinates>1,1</gml:coordinates></gml:Point></ogr:geometryProperty>
<ogr:id>1</ogr:id>
<ogr:id2>2</ogr:id2>
<ogr:my_field>0</ogr:my_field>
</ogr:autoincrement_field_field_name>
</gml:featureMember>
<gml:featureMember>
<ogr:autoincrement_field_field_name fid="points.1">
<ogr:geometryProperty><gml:Point srsName="EPSG:4326"><gml:coordinates>3,3</gml:coordinates></gml:Point></ogr:geometryProperty>
<ogr:id>2</ogr:id>
<ogr:id2>1</ogr:id2>
<ogr:my_field>1</ogr:my_field>
</ogr:autoincrement_field_field_name>
</gml:featureMember>
<gml:featureMember>
<ogr:autoincrement_field_field_name fid="points.2">
<ogr:geometryProperty><gml:Point srsName="EPSG:4326"><gml:coordinates>2,2</gml:coordinates></gml:Point></ogr:geometryProperty>
<ogr:id>3</ogr:id>
<ogr:id2>0</ogr:id2>
<ogr:my_field>2</ogr:my_field>
</ogr:autoincrement_field_field_name>
</gml:featureMember>
<gml:featureMember>
<ogr:autoincrement_field_field_name fid="points.3">
<ogr:geometryProperty><gml:Point srsName="EPSG:4326"><gml:coordinates>5,2</gml:coordinates></gml:Point></ogr:geometryProperty>
<ogr:id>4</ogr:id>
<ogr:id2>2</ogr:id2>
<ogr:my_field>3</ogr:my_field>
</ogr:autoincrement_field_field_name>
</gml:featureMember>
<gml:featureMember>
<ogr:autoincrement_field_field_name fid="points.4">
<ogr:geometryProperty><gml:Point srsName="EPSG:4326"><gml:coordinates>4,1</gml:coordinates></gml:Point></ogr:geometryProperty>
<ogr:id>5</ogr:id>
<ogr:id2>1</ogr:id2>
<ogr:my_field>4</ogr:my_field>
</ogr:autoincrement_field_field_name>
</gml:featureMember>
<gml:featureMember>
<ogr:autoincrement_field_field_name fid="points.5">
<ogr:geometryProperty><gml:Point srsName="EPSG:4326"><gml:coordinates>0,-5</gml:coordinates></gml:Point></ogr:geometryProperty>
<ogr:id>6</ogr:id>
<ogr:id2>0</ogr:id2>
<ogr:my_field>5</ogr:my_field>
</ogr:autoincrement_field_field_name>
</gml:featureMember>
<gml:featureMember>
<ogr:autoincrement_field_field_name fid="points.6">
<ogr:geometryProperty><gml:Point srsName="EPSG:4326"><gml:coordinates>8,-1</gml:coordinates></gml:Point></ogr:geometryProperty>
<ogr:id>7</ogr:id>
<ogr:id2>0</ogr:id2>
<ogr:my_field>6</ogr:my_field>
</ogr:autoincrement_field_field_name>
</gml:featureMember>
<gml:featureMember>
<ogr:autoincrement_field_field_name fid="points.7">
<ogr:geometryProperty><gml:Point srsName="EPSG:4326"><gml:coordinates>7,-1</gml:coordinates></gml:Point></ogr:geometryProperty>
<ogr:id>8</ogr:id>
<ogr:id2>0</ogr:id2>
<ogr:my_field>7</ogr:my_field>
</ogr:autoincrement_field_field_name>
</gml:featureMember>
<gml:featureMember>
<ogr:autoincrement_field_field_name fid="points.8">
<ogr:geometryProperty><gml:Point srsName="EPSG:4326"><gml:coordinates>0,-1</gml:coordinates></gml:Point></ogr:geometryProperty>
<ogr:id>9</ogr:id>
<ogr:id2>0</ogr:id2>
<ogr:my_field>8</ogr:my_field>
</ogr:autoincrement_field_field_name>
</gml:featureMember>
</ogr:FeatureCollection>
@@ -0,0 +1,44 @@
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="http://ogr.maptools.org/" xmlns:ogr="http://ogr.maptools.org/" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:gml="http://www.opengis.net/gml" elementFormDefault="qualified" version="1.0">
<xs:import namespace="http://www.opengis.net/gml" schemaLocation="http://schemas.opengis.net/gml/2.1.2/feature.xsd"/>
<xs:element name="FeatureCollection" type="ogr:FeatureCollectionType" substitutionGroup="gml:_FeatureCollection"/>
<xs:complexType name="FeatureCollectionType">
<xs:complexContent>
<xs:extension base="gml:AbstractFeatureCollectionType">
<xs:attribute name="lockId" type="xs:string" use="optional"/>
<xs:attribute name="scope" type="xs:string" use="optional"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:element name="autoincrement_field_field_name" type="ogr:autoincrement_field_field_name_Type" substitutionGroup="gml:_Feature"/>
<xs:complexType name="autoincrement_field_field_name_Type">
<xs:complexContent>
<xs:extension base="gml:AbstractFeatureType">
<xs:sequence>
<xs:element name="geometryProperty" type="gml:PointPropertyType" nillable="true" minOccurs="0" maxOccurs="1"/>
<xs:element name="id" nillable="true" minOccurs="0" maxOccurs="1">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:totalDigits value="10"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="id2" nillable="true" minOccurs="0" maxOccurs="1">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:totalDigits value="10"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="my_field" nillable="true" minOccurs="0" maxOccurs="1">
<xs:simpleType>
<xs:restriction base="xs:long">
<xs:totalDigits value="20"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:schema>
@@ -0,0 +1,86 @@
<?xml version="1.0" encoding="utf-8" ?>
<ogr:FeatureCollection
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://ogr.maptools.org/ autoincrement_field_start.xsd"
xmlns:ogr="http://ogr.maptools.org/"
xmlns:gml="http://www.opengis.net/gml">
<gml:boundedBy>
<gml:Box>
<gml:coord><gml:X>0</gml:X><gml:Y>-5</gml:Y></gml:coord>
<gml:coord><gml:X>8</gml:X><gml:Y>3</gml:Y></gml:coord>
</gml:Box>
</gml:boundedBy>

<gml:featureMember>
<ogr:autoincrement_field_start fid="points.0">
<ogr:geometryProperty><gml:Point srsName="EPSG:4326"><gml:coordinates>1,1</gml:coordinates></gml:Point></ogr:geometryProperty>
<ogr:id>1</ogr:id>
<ogr:id2>2</ogr:id2>
<ogr:AUTO>10</ogr:AUTO>
</ogr:autoincrement_field_start>
</gml:featureMember>
<gml:featureMember>
<ogr:autoincrement_field_start fid="points.1">
<ogr:geometryProperty><gml:Point srsName="EPSG:4326"><gml:coordinates>3,3</gml:coordinates></gml:Point></ogr:geometryProperty>
<ogr:id>2</ogr:id>
<ogr:id2>1</ogr:id2>
<ogr:AUTO>11</ogr:AUTO>
</ogr:autoincrement_field_start>
</gml:featureMember>
<gml:featureMember>
<ogr:autoincrement_field_start fid="points.2">
<ogr:geometryProperty><gml:Point srsName="EPSG:4326"><gml:coordinates>2,2</gml:coordinates></gml:Point></ogr:geometryProperty>
<ogr:id>3</ogr:id>
<ogr:id2>0</ogr:id2>
<ogr:AUTO>12</ogr:AUTO>
</ogr:autoincrement_field_start>
</gml:featureMember>
<gml:featureMember>
<ogr:autoincrement_field_start fid="points.3">
<ogr:geometryProperty><gml:Point srsName="EPSG:4326"><gml:coordinates>5,2</gml:coordinates></gml:Point></ogr:geometryProperty>
<ogr:id>4</ogr:id>
<ogr:id2>2</ogr:id2>
<ogr:AUTO>13</ogr:AUTO>
</ogr:autoincrement_field_start>
</gml:featureMember>
<gml:featureMember>
<ogr:autoincrement_field_start fid="points.4">
<ogr:geometryProperty><gml:Point srsName="EPSG:4326"><gml:coordinates>4,1</gml:coordinates></gml:Point></ogr:geometryProperty>
<ogr:id>5</ogr:id>
<ogr:id2>1</ogr:id2>
<ogr:AUTO>14</ogr:AUTO>
</ogr:autoincrement_field_start>
</gml:featureMember>
<gml:featureMember>
<ogr:autoincrement_field_start fid="points.5">
<ogr:geometryProperty><gml:Point srsName="EPSG:4326"><gml:coordinates>0,-5</gml:coordinates></gml:Point></ogr:geometryProperty>
<ogr:id>6</ogr:id>
<ogr:id2>0</ogr:id2>
<ogr:AUTO>15</ogr:AUTO>
</ogr:autoincrement_field_start>
</gml:featureMember>
<gml:featureMember>
<ogr:autoincrement_field_start fid="points.6">
<ogr:geometryProperty><gml:Point srsName="EPSG:4326"><gml:coordinates>8,-1</gml:coordinates></gml:Point></ogr:geometryProperty>
<ogr:id>7</ogr:id>
<ogr:id2>0</ogr:id2>
<ogr:AUTO>16</ogr:AUTO>
</ogr:autoincrement_field_start>
</gml:featureMember>
<gml:featureMember>
<ogr:autoincrement_field_start fid="points.7">
<ogr:geometryProperty><gml:Point srsName="EPSG:4326"><gml:coordinates>7,-1</gml:coordinates></gml:Point></ogr:geometryProperty>
<ogr:id>8</ogr:id>
<ogr:id2>0</ogr:id2>
<ogr:AUTO>17</ogr:AUTO>
</ogr:autoincrement_field_start>
</gml:featureMember>
<gml:featureMember>
<ogr:autoincrement_field_start fid="points.8">
<ogr:geometryProperty><gml:Point srsName="EPSG:4326"><gml:coordinates>0,-1</gml:coordinates></gml:Point></ogr:geometryProperty>
<ogr:id>9</ogr:id>
<ogr:id2>0</ogr:id2>
<ogr:AUTO>18</ogr:AUTO>
</ogr:autoincrement_field_start>
</gml:featureMember>
</ogr:FeatureCollection>
@@ -0,0 +1,44 @@
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="http://ogr.maptools.org/" xmlns:ogr="http://ogr.maptools.org/" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:gml="http://www.opengis.net/gml" elementFormDefault="qualified" version="1.0">
<xs:import namespace="http://www.opengis.net/gml" schemaLocation="http://schemas.opengis.net/gml/2.1.2/feature.xsd"/>
<xs:element name="FeatureCollection" type="ogr:FeatureCollectionType" substitutionGroup="gml:_FeatureCollection"/>
<xs:complexType name="FeatureCollectionType">
<xs:complexContent>
<xs:extension base="gml:AbstractFeatureCollectionType">
<xs:attribute name="lockId" type="xs:string" use="optional"/>
<xs:attribute name="scope" type="xs:string" use="optional"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:element name="autoincrement_field_start" type="ogr:autoincrement_field_start_Type" substitutionGroup="gml:_Feature"/>
<xs:complexType name="autoincrement_field_start_Type">
<xs:complexContent>
<xs:extension base="gml:AbstractFeatureType">
<xs:sequence>
<xs:element name="geometryProperty" type="gml:PointPropertyType" nillable="true" minOccurs="0" maxOccurs="1"/>
<xs:element name="id" nillable="true" minOccurs="0" maxOccurs="1">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:totalDigits value="10"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="id2" nillable="true" minOccurs="0" maxOccurs="1">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:totalDigits value="10"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="AUTO" nillable="true" minOccurs="0" maxOccurs="1">
<xs:simpleType>
<xs:restriction base="xs:long">
<xs:totalDigits value="20"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:schema>
Expand Up @@ -414,7 +414,7 @@ tests:
name: expected/unique_values.gml
type: vector

- algorithm: qgis:addautoincrementalfield
- algorithm: native:addautoincrementalfield
name: Add autoincremental field
params:
INPUT:
Expand All @@ -425,6 +425,33 @@ tests:
name: expected/autoincrement_field.gml
type: vector

- algorithm: native:addautoincrementalfield
name: Add autoincremental field with start value
params:
FIELD_NAME: AUTO
INPUT:
name: points.gml
type: vector
START: 10
results:
OUTPUT:
name: expected/autoincrement_field_start.gml
type: vector

- algorithm: native:addautoincrementalfield
name: Add autoincremental field with name
params:
FIELD_NAME: my_field
INPUT:
name: points.gml
type: vector
START: 0
results:
OUTPUT:
name: expected/autoincrement_field_field_name.gml
type: vector


- algorithm: native:dissolve
name: Dissolve using field
params:
Expand Down

0 comments on commit 97c1b0d

Please sign in to comment.