Skip to content

Commit f685d11

Browse files
committedJul 23, 2018
[processing] Reverse line direction can work with multi(line/curve) geometries
1 parent 6554843 commit f685d11

File tree

4 files changed

+100
-7
lines changed

4 files changed

+100
-7
lines changed
 
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<?xml version="1.0" encoding="utf-8" ?>
2+
<ogr:FeatureCollection
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://ogr.maptools.org/ reverse_multiline.xsd"
5+
xmlns:ogr="http://ogr.maptools.org/"
6+
xmlns:gml="http://www.opengis.net/gml">
7+
<gml:boundedBy>
8+
<gml:Box>
9+
<gml:coord><gml:X>-1</gml:X><gml:Y>-1</gml:Y></gml:coord>
10+
<gml:coord><gml:X>5.58042226487524</gml:X><gml:Y>4.119769673704415</gml:Y></gml:coord>
11+
</gml:Box>
12+
</gml:boundedBy>
13+
14+
<gml:featureMember>
15+
<ogr:reverse_multiline fid="lines.1">
16+
<ogr:geometryProperty><gml:MultiLineString srsName="EPSG:4326"><gml:lineStringMember><gml:LineString><gml:coordinates>1,-1 -1,-1</gml:coordinates></gml:LineString></gml:lineStringMember></gml:MultiLineString></ogr:geometryProperty>
17+
</ogr:reverse_multiline>
18+
</gml:featureMember>
19+
<gml:featureMember>
20+
<ogr:reverse_multiline fid="lines.2">
21+
<ogr:geometryProperty><gml:MultiLineString srsName="EPSG:4326"><gml:lineStringMember><gml:LineString><gml:coordinates>5,1 3,1</gml:coordinates></gml:LineString></gml:lineStringMember><gml:lineStringMember><gml:LineString><gml:coordinates>5,1 5.02418426103647,2.4147792706334</gml:coordinates></gml:LineString></gml:lineStringMember></gml:MultiLineString></ogr:geometryProperty>
22+
</ogr:reverse_multiline>
23+
</gml:featureMember>
24+
<gml:featureMember>
25+
<ogr:reverse_multiline fid="lines.3">
26+
</ogr:reverse_multiline>
27+
</gml:featureMember>
28+
<gml:featureMember>
29+
<ogr:reverse_multiline fid="lines.4">
30+
<ogr:geometryProperty><gml:MultiLineString srsName="EPSG:4326"><gml:lineStringMember><gml:LineString><gml:coordinates>3,3 3,2 2,2 2,0</gml:coordinates></gml:LineString></gml:lineStringMember><gml:lineStringMember><gml:LineString><gml:coordinates>5.4595009596929,4.11976967370441 2.94433781190019,4.04721689059501</gml:coordinates></gml:LineString></gml:lineStringMember><gml:lineStringMember><gml:LineString><gml:coordinates>5.58042226487524,2.9468330134357 3,3</gml:coordinates></gml:LineString></gml:lineStringMember></gml:MultiLineString></ogr:geometryProperty>
31+
</ogr:reverse_multiline>
32+
</gml:featureMember>
33+
</ogr:FeatureCollection>
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<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">
3+
<xs:import namespace="http://www.opengis.net/gml" schemaLocation="http://schemas.opengis.net/gml/2.1.2/feature.xsd"/>
4+
<xs:element name="FeatureCollection" type="ogr:FeatureCollectionType" substitutionGroup="gml:_FeatureCollection"/>
5+
<xs:complexType name="FeatureCollectionType">
6+
<xs:complexContent>
7+
<xs:extension base="gml:AbstractFeatureCollectionType">
8+
<xs:attribute name="lockId" type="xs:string" use="optional"/>
9+
<xs:attribute name="scope" type="xs:string" use="optional"/>
10+
</xs:extension>
11+
</xs:complexContent>
12+
</xs:complexType>
13+
<xs:element name="reverse_multiline" type="ogr:reverse_multiline_Type" substitutionGroup="gml:_Feature"/>
14+
<xs:complexType name="reverse_multiline_Type">
15+
<xs:complexContent>
16+
<xs:extension base="gml:AbstractFeatureType">
17+
<xs:sequence>
18+
<xs:element name="geometryProperty" type="gml:MultiLineStringPropertyType" nillable="true" minOccurs="0" maxOccurs="1"/>
19+
</xs:sequence>
20+
</xs:extension>
21+
</xs:complexContent>
22+
</xs:complexType>
23+
</xs:schema>

‎python/plugins/processing/tests/testdata/qgis_algorithm_tests.yaml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -973,6 +973,17 @@ tests:
973973
geometry:
974974
precision: 7
975975

976+
- algorithm: native:reverselinedirection
977+
name: Reverse multiline direction
978+
params:
979+
INPUT:
980+
name: multilines.gml
981+
type: vector
982+
results:
983+
OUTPUT:
984+
name: expected/reverse_multiline.gml
985+
type: vector
986+
976987
- algorithm: qgis:offsetline
977988
name: Offset line positive
978989
params:

‎src/analysis/processing/qgsalgorithmreverselinedirection.cpp

Lines changed: 33 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
#include "qgsalgorithmreverselinedirection.h"
1919
#include "qgscurve.h"
20+
#include "qgsgeometrycollection.h"
2021

2122
///@cond PRIVATE
2223

@@ -87,16 +88,41 @@ QgsFeatureList QgsReverseLineDirectionAlgorithm ::processFeature( const QgsFeatu
8788
if ( feature.hasGeometry() )
8889
{
8990
const QgsGeometry geom = feature.geometry();
90-
const QgsCurve *curve = qgsgeometry_cast< const QgsCurve * >( geom.constGet() );
91-
if ( curve )
91+
if ( !geom.isMultipart() )
9292
{
93-
std::unique_ptr< QgsCurve > reversed( curve->reversed() );
94-
if ( !reversed )
93+
const QgsCurve *curve = qgsgeometry_cast< const QgsCurve * >( geom.constGet() );
94+
if ( curve )
9595
{
96-
// can this even happen?
97-
throw QgsProcessingException( QObject::tr( "Error reversing line" ) );
96+
std::unique_ptr< QgsCurve > reversed( curve->reversed() );
97+
if ( !reversed )
98+
{
99+
// can this even happen?
100+
throw QgsProcessingException( QObject::tr( "Error reversing line" ) );
101+
}
102+
const QgsGeometry outGeom( std::move( reversed ) );
103+
feature.setGeometry( outGeom );
98104
}
99-
const QgsGeometry outGeom( std::move( reversed ) );
105+
}
106+
else
107+
{
108+
std::unique_ptr< QgsAbstractGeometry > dest( geom.constGet()->createEmptyWithSameType() );
109+
const QgsGeometryCollection *collection = qgsgeometry_cast< const QgsGeometryCollection * >( geom.constGet() );
110+
QgsGeometryCollection *destCollection = qgsgeometry_cast< QgsGeometryCollection * >( dest.get() );
111+
for ( int i = 0; i < collection->numGeometries(); ++i )
112+
{
113+
const QgsCurve *curve = qgsgeometry_cast< const QgsCurve *>( collection->geometryN( i ) );
114+
if ( curve )
115+
{
116+
std::unique_ptr< QgsCurve > reversed( curve->reversed() );
117+
if ( !reversed )
118+
{
119+
// can this even happen?
120+
throw QgsProcessingException( QObject::tr( "Error reversing line" ) );
121+
}
122+
destCollection->addGeometry( reversed.release() );
123+
}
124+
}
125+
const QgsGeometry outGeom( std::move( dest ) );
100126
feature.setGeometry( outGeom );
101127
}
102128
}

0 commit comments

Comments
 (0)
Please sign in to comment.