Permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
[FEATURE][processing] "Create parallel lines" algorithm
This algorithm creates copies of line features in a layer, by creating multiple parallel versions of each feature. Each copy is offset by a preset distance.
- Loading branch information
Showing
with
502 additions
and 3 deletions.
- +188 −0 python/plugins/processing/tests/testdata/expected/create_parallel_lines.gml
- +36 −0 python/plugins/processing/tests/testdata/expected/create_parallel_lines.xsd
- +15 −0 python/plugins/processing/tests/testdata/qgis_algorithm_tests.yaml
- +1 −0 src/analysis/CMakeLists.txt
- +3 −3 src/analysis/processing/qgsalgorithmarrayfeatures.cpp
- +181 −0 src/analysis/processing/qgsalgorithmparallellines.cpp
- +76 −0 src/analysis/processing/qgsalgorithmparallellines.h
- +2 −0 src/analysis/processing/qgsnativealgorithms.cpp
@@ -0,0 +1,188 @@ | ||
<?xml version="1.0" encoding="utf-8" ?> | ||
<ogr:FeatureCollection | ||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | ||
xsi:schemaLocation="http://ogr.maptools.org/ create_parallel_lines.xsd" | ||
xmlns:ogr="http://ogr.maptools.org/" | ||
xmlns:gml="http://www.opengis.net/gml"> | ||
<gml:boundedBy> | ||
<gml:Box> | ||
<gml:coord><gml:X>-1</gml:X><gml:Y>-3.6</gml:Y></gml:coord> | ||
<gml:coord><gml:X>11.42426406871193</gml:X><gml:Y>5</gml:Y></gml:coord> | ||
</gml:Box> | ||
</gml:boundedBy> | ||
|
||
<gml:featureMember> | ||
<ogr:create_parallel_lines fid="lines.0"> | ||
<ogr:geometryProperty><gml:LineString srsName="EPSG:4326"><gml:coordinates>6,2 9,2 9,3 11,5</gml:coordinates></gml:LineString></ogr:geometryProperty> | ||
<ogr:instance>0</ogr:instance> | ||
<ogr:offset>0</ogr:offset> | ||
</ogr:create_parallel_lines> | ||
</gml:featureMember> | ||
<gml:featureMember> | ||
<ogr:create_parallel_lines fid="lines.0"> | ||
<ogr:geometryProperty><gml:LineString srsName="EPSG:4326"><gml:coordinates>11.1414213562373,4.85857864376269 9.2,2.91715728752538 9.2,1.8 6.0,1.8</gml:coordinates></gml:LineString></ogr:geometryProperty> | ||
<ogr:instance>1</ogr:instance> | ||
<ogr:offset>-0.2</ogr:offset> | ||
</ogr:create_parallel_lines> | ||
</gml:featureMember> | ||
<gml:featureMember> | ||
<ogr:create_parallel_lines fid="lines.0"> | ||
<ogr:geometryProperty><gml:LineString srsName="EPSG:4326"><gml:coordinates>11.2828427124746,4.71715728752538 9.4,2.83431457505076 9.4,1.6 6.0,1.6</gml:coordinates></gml:LineString></ogr:geometryProperty> | ||
<ogr:instance>2</ogr:instance> | ||
<ogr:offset>-0.4</ogr:offset> | ||
</ogr:create_parallel_lines> | ||
</gml:featureMember> | ||
<gml:featureMember> | ||
<ogr:create_parallel_lines fid="lines.0"> | ||
<ogr:geometryProperty><gml:LineString srsName="EPSG:4326"><gml:coordinates>11.4242640687119,4.57573593128807 9.6,2.75147186257614 9.6,1.4 6.0,1.4</gml:coordinates></gml:LineString></ogr:geometryProperty> | ||
<ogr:instance>3</ogr:instance> | ||
<ogr:offset>-0.6</ogr:offset> | ||
</ogr:create_parallel_lines> | ||
</gml:featureMember> | ||
<gml:featureMember> | ||
<ogr:create_parallel_lines fid="lines.1"> | ||
<ogr:geometryProperty><gml:LineString srsName="EPSG:4326"><gml:coordinates>-1,-1 1,-1</gml:coordinates></gml:LineString></ogr:geometryProperty> | ||
<ogr:instance>0</ogr:instance> | ||
<ogr:offset>0</ogr:offset> | ||
</ogr:create_parallel_lines> | ||
</gml:featureMember> | ||
<gml:featureMember> | ||
<ogr:create_parallel_lines fid="lines.1"> | ||
<ogr:geometryProperty><gml:LineString srsName="EPSG:4326"><gml:coordinates>1.0,-1.2 -1.0,-1.2</gml:coordinates></gml:LineString></ogr:geometryProperty> | ||
<ogr:instance>1</ogr:instance> | ||
<ogr:offset>-0.2</ogr:offset> | ||
</ogr:create_parallel_lines> | ||
</gml:featureMember> | ||
<gml:featureMember> | ||
<ogr:create_parallel_lines fid="lines.1"> | ||
<ogr:geometryProperty><gml:LineString srsName="EPSG:4326"><gml:coordinates>1.0,-1.4 -1.0,-1.4</gml:coordinates></gml:LineString></ogr:geometryProperty> | ||
<ogr:instance>2</ogr:instance> | ||
<ogr:offset>-0.4</ogr:offset> | ||
</ogr:create_parallel_lines> | ||
</gml:featureMember> | ||
<gml:featureMember> | ||
<ogr:create_parallel_lines fid="lines.1"> | ||
<ogr:geometryProperty><gml:LineString srsName="EPSG:4326"><gml:coordinates>1.0,-1.6 -1.0,-1.6</gml:coordinates></gml:LineString></ogr:geometryProperty> | ||
<ogr:instance>3</ogr:instance> | ||
<ogr:offset>-0.6</ogr:offset> | ||
</ogr:create_parallel_lines> | ||
</gml:featureMember> | ||
<gml:featureMember> | ||
<ogr:create_parallel_lines fid="lines.2"> | ||
<ogr:geometryProperty><gml:LineString srsName="EPSG:4326"><gml:coordinates>2,0 2,2 3,2 3,3</gml:coordinates></gml:LineString></ogr:geometryProperty> | ||
<ogr:instance>0</ogr:instance> | ||
<ogr:offset>0</ogr:offset> | ||
</ogr:create_parallel_lines> | ||
</gml:featureMember> | ||
<gml:featureMember> | ||
<ogr:create_parallel_lines fid="lines.2"> | ||
<ogr:geometryProperty><gml:LineString srsName="EPSG:4326"><gml:coordinates>3.2,3.0 3.2,1.8 2.8,1.8 2.2,1.8 2.2,0.0</gml:coordinates></gml:LineString></ogr:geometryProperty> | ||
<ogr:instance>1</ogr:instance> | ||
<ogr:offset>-0.2</ogr:offset> | ||
</ogr:create_parallel_lines> | ||
</gml:featureMember> | ||
<gml:featureMember> | ||
<ogr:create_parallel_lines fid="lines.2"> | ||
<ogr:geometryProperty><gml:LineString srsName="EPSG:4326"><gml:coordinates>3.4,3.0 3.4,1.6 2.93333333333333,1.6 2.4,1.6 2.4,0.0</gml:coordinates></gml:LineString></ogr:geometryProperty> | ||
<ogr:instance>2</ogr:instance> | ||
<ogr:offset>-0.4</ogr:offset> | ||
</ogr:create_parallel_lines> | ||
</gml:featureMember> | ||
<gml:featureMember> | ||
<ogr:create_parallel_lines fid="lines.2"> | ||
<ogr:geometryProperty><gml:LineString srsName="EPSG:4326"><gml:coordinates>3.6,3.0 3.6,1.4 3.06666666666667,1.4 2.6,1.4 2.6,0.0</gml:coordinates></gml:LineString></ogr:geometryProperty> | ||
<ogr:instance>3</ogr:instance> | ||
<ogr:offset>-0.6</ogr:offset> | ||
</ogr:create_parallel_lines> | ||
</gml:featureMember> | ||
<gml:featureMember> | ||
<ogr:create_parallel_lines fid="lines.3"> | ||
<ogr:geometryProperty><gml:LineString srsName="EPSG:4326"><gml:coordinates>3,1 5,1</gml:coordinates></gml:LineString></ogr:geometryProperty> | ||
<ogr:instance>0</ogr:instance> | ||
<ogr:offset>0</ogr:offset> | ||
</ogr:create_parallel_lines> | ||
</gml:featureMember> | ||
<gml:featureMember> | ||
<ogr:create_parallel_lines fid="lines.3"> | ||
<ogr:geometryProperty><gml:LineString srsName="EPSG:4326"><gml:coordinates>5.0,0.8 3.0,0.8</gml:coordinates></gml:LineString></ogr:geometryProperty> | ||
<ogr:instance>1</ogr:instance> | ||
<ogr:offset>-0.2</ogr:offset> | ||
</ogr:create_parallel_lines> | ||
</gml:featureMember> | ||
<gml:featureMember> | ||
<ogr:create_parallel_lines fid="lines.3"> | ||
<ogr:geometryProperty><gml:LineString srsName="EPSG:4326"><gml:coordinates>5.0,0.6 3.0,0.6</gml:coordinates></gml:LineString></ogr:geometryProperty> | ||
<ogr:instance>2</ogr:instance> | ||
<ogr:offset>-0.4</ogr:offset> | ||
</ogr:create_parallel_lines> | ||
</gml:featureMember> | ||
<gml:featureMember> | ||
<ogr:create_parallel_lines fid="lines.3"> | ||
<ogr:geometryProperty><gml:LineString srsName="EPSG:4326"><gml:coordinates>5.0,0.4 3.0,0.4</gml:coordinates></gml:LineString></ogr:geometryProperty> | ||
<ogr:instance>3</ogr:instance> | ||
<ogr:offset>-0.6</ogr:offset> | ||
</ogr:create_parallel_lines> | ||
</gml:featureMember> | ||
<gml:featureMember> | ||
<ogr:create_parallel_lines fid="lines.4"> | ||
<ogr:geometryProperty><gml:LineString srsName="EPSG:4326"><gml:coordinates>7,-3 10,-3</gml:coordinates></gml:LineString></ogr:geometryProperty> | ||
<ogr:instance>0</ogr:instance> | ||
<ogr:offset>0</ogr:offset> | ||
</ogr:create_parallel_lines> | ||
</gml:featureMember> | ||
<gml:featureMember> | ||
<ogr:create_parallel_lines fid="lines.4"> | ||
<ogr:geometryProperty><gml:LineString srsName="EPSG:4326"><gml:coordinates>10.0,-3.2 7.0,-3.2</gml:coordinates></gml:LineString></ogr:geometryProperty> | ||
<ogr:instance>1</ogr:instance> | ||
<ogr:offset>-0.2</ogr:offset> | ||
</ogr:create_parallel_lines> | ||
</gml:featureMember> | ||
<gml:featureMember> | ||
<ogr:create_parallel_lines fid="lines.4"> | ||
<ogr:geometryProperty><gml:LineString srsName="EPSG:4326"><gml:coordinates>10.0,-3.4 7.0,-3.4</gml:coordinates></gml:LineString></ogr:geometryProperty> | ||
<ogr:instance>2</ogr:instance> | ||
<ogr:offset>-0.4</ogr:offset> | ||
</ogr:create_parallel_lines> | ||
</gml:featureMember> | ||
<gml:featureMember> | ||
<ogr:create_parallel_lines fid="lines.4"> | ||
<ogr:geometryProperty><gml:LineString srsName="EPSG:4326"><gml:coordinates>10.0,-3.6 7.0,-3.6</gml:coordinates></gml:LineString></ogr:geometryProperty> | ||
<ogr:instance>3</ogr:instance> | ||
<ogr:offset>-0.6</ogr:offset> | ||
</ogr:create_parallel_lines> | ||
</gml:featureMember> | ||
<gml:featureMember> | ||
<ogr:create_parallel_lines fid="lines.5"> | ||
<ogr:geometryProperty><gml:LineString srsName="EPSG:4326"><gml:coordinates>6,-3 10,1</gml:coordinates></gml:LineString></ogr:geometryProperty> | ||
<ogr:instance>0</ogr:instance> | ||
<ogr:offset>0</ogr:offset> | ||
</ogr:create_parallel_lines> | ||
</gml:featureMember> | ||
<gml:featureMember> | ||
<ogr:create_parallel_lines fid="lines.5"> | ||
<ogr:geometryProperty><gml:LineString srsName="EPSG:4326"><gml:coordinates>10.1414213562373,0.858578643762691 6.14142135623731,-3.14142135623731</gml:coordinates></gml:LineString></ogr:geometryProperty> | ||
<ogr:instance>1</ogr:instance> | ||
<ogr:offset>-0.2</ogr:offset> | ||
</ogr:create_parallel_lines> | ||
</gml:featureMember> | ||
<gml:featureMember> | ||
<ogr:create_parallel_lines fid="lines.5"> | ||
<ogr:geometryProperty><gml:LineString srsName="EPSG:4326"><gml:coordinates>10.2828427124746,0.717157287525381 6.28284271247462,-3.28284271247462</gml:coordinates></gml:LineString></ogr:geometryProperty> | ||
<ogr:instance>2</ogr:instance> | ||
<ogr:offset>-0.4</ogr:offset> | ||
</ogr:create_parallel_lines> | ||
</gml:featureMember> | ||
<gml:featureMember> | ||
<ogr:create_parallel_lines fid="lines.5"> | ||
<ogr:geometryProperty><gml:LineString srsName="EPSG:4326"><gml:coordinates>10.4242640687119,0.575735931288071 6.42426406871193,-3.42426406871193</gml:coordinates></gml:LineString></ogr:geometryProperty> | ||
<ogr:instance>3</ogr:instance> | ||
<ogr:offset>-0.6</ogr:offset> | ||
</ogr:create_parallel_lines> | ||
</gml:featureMember> | ||
<gml:featureMember> | ||
<ogr:create_parallel_lines fid="lines.6"> | ||
<ogr:instance xsi:nil="true"/> | ||
<ogr:offset xsi:nil="true"/> | ||
</ogr:create_parallel_lines> | ||
</gml:featureMember> | ||
</ogr:FeatureCollection> |
@@ -0,0 +1,36 @@ | ||
<?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="create_parallel_lines" type="ogr:create_parallel_lines_Type" substitutionGroup="gml:_Feature"/> | ||
<xs:complexType name="create_parallel_lines_Type"> | ||
<xs:complexContent> | ||
<xs:extension base="gml:AbstractFeatureType"> | ||
<xs:sequence> | ||
<xs:element name="geometryProperty" type="gml:LineStringPropertyType" nillable="true" minOccurs="0" maxOccurs="1"/> | ||
<xs:element name="instance" 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="offset" nillable="true" minOccurs="0" maxOccurs="1"> | ||
<xs:simpleType> | ||
<xs:restriction base="xs:decimal"> | ||
</xs:restriction> | ||
</xs:simpleType> | ||
</xs:element> | ||
</xs:sequence> | ||
</xs:extension> | ||
</xs:complexContent> | ||
</xs:complexType> | ||
</xs:schema> |
Oops, something went wrong.