Merge c08ce4c652e110d957e8374929f27d7fd40b468f into 2e07d9829f38ea12661050415d09e28675c961bd

This commit is contained in:
Loïc Bartoletti 2025-10-01 16:25:21 +00:00 committed by GitHub
commit 707188e078
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
11 changed files with 1406 additions and 205 deletions

View File

@ -0,0 +1,790 @@
<?xml version="1.0" encoding="utf-8" ?>
<ogr:FeatureCollection
gml:id="aFeatureCollection"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://ogr.maptools.org/ transect_fixed_single_both.xsd"
xmlns:ogr="http://ogr.maptools.org/"
xmlns:gml="http://www.opengis.net/gml/3.2">
<gml:boundedBy><gml:Envelope srsName="urn:ogc:def:crs:EPSG::2154"><gml:lowerCorner>-1007699.67743807 1334639.79376903</gml:lowerCorner><gml:upperCorner>-1007695.38013693 1334643.87803237</gml:upperCorner></gml:Envelope></gml:boundedBy>
<ogr:featureMember>
<ogr:transect_fixed_single_both gml:id="transect_fixed_single_both.0">
<gml:boundedBy><gml:Envelope srsName="urn:ogc:def:crs:EPSG::2154"><gml:lowerCorner>-1007699.39626005 1334640.42219045</gml:lowerCorner><gml:upperCorner>-1007698.51286553 1334640.89082049</gml:upperCorner></gml:Envelope></gml:boundedBy>
<ogr:geometryProperty><gml:LineString srsName="urn:ogc:def:crs:EPSG::2154" gml:id="transect_fixed_single_both.geom.0"><gml:posList>-1007699.39626005 1334640.89082049 -1007698.51286553 1334640.42219045</gml:posList></gml:LineString></ogr:geometryProperty>
<ogr:fid>1</ogr:fid>
<ogr:TR_FID>0</ogr:TR_FID>
<ogr:TR_ID>0</ogr:TR_ID>
<ogr:TR_SEGMENT>1</ogr:TR_SEGMENT>
<ogr:TR_ANGLE>90.00</ogr:TR_ANGLE>
<ogr:TR_LENGTH>1.000000</ogr:TR_LENGTH>
<ogr:TR_ORIENT>2</ogr:TR_ORIENT>
</ogr:transect_fixed_single_both>
</ogr:featureMember>
<ogr:featureMember>
<ogr:transect_fixed_single_both gml:id="transect_fixed_single_both.1">
<gml:boundedBy><gml:Envelope srsName="urn:ogc:def:crs:EPSG::2154"><gml:lowerCorner>-1007699.48998606 1334640.24551155</gml:lowerCorner><gml:upperCorner>-1007698.60659153 1334640.71414158</gml:upperCorner></gml:Envelope></gml:boundedBy>
<ogr:geometryProperty><gml:LineString srsName="urn:ogc:def:crs:EPSG::2154" gml:id="transect_fixed_single_both.geom.1"><gml:posList>-1007699.48998606 1334640.71414158 -1007698.60659153 1334640.24551155</gml:posList></gml:LineString></ogr:geometryProperty>
<ogr:fid>1</ogr:fid>
<ogr:TR_FID>0</ogr:TR_FID>
<ogr:TR_ID>1</ogr:TR_ID>
<ogr:TR_SEGMENT>2</ogr:TR_SEGMENT>
<ogr:TR_ANGLE>90.00</ogr:TR_ANGLE>
<ogr:TR_LENGTH>1.000000</ogr:TR_LENGTH>
<ogr:TR_ORIENT>2</ogr:TR_ORIENT>
</ogr:transect_fixed_single_both>
</ogr:featureMember>
<ogr:featureMember>
<ogr:transect_fixed_single_both gml:id="transect_fixed_single_both.2">
<gml:boundedBy><gml:Envelope srsName="urn:ogc:def:crs:EPSG::2154"><gml:lowerCorner>-1007699.58371207 1334640.06883264</gml:lowerCorner><gml:upperCorner>-1007698.70031754 1334640.53746267</gml:upperCorner></gml:Envelope></gml:boundedBy>
<ogr:geometryProperty><gml:LineString srsName="urn:ogc:def:crs:EPSG::2154" gml:id="transect_fixed_single_both.geom.2"><gml:posList>-1007699.58371207 1334640.53746267 -1007698.70031754 1334640.06883264</gml:posList></gml:LineString></ogr:geometryProperty>
<ogr:fid>1</ogr:fid>
<ogr:TR_FID>0</ogr:TR_FID>
<ogr:TR_ID>2</ogr:TR_ID>
<ogr:TR_SEGMENT>3</ogr:TR_SEGMENT>
<ogr:TR_ANGLE>90.00</ogr:TR_ANGLE>
<ogr:TR_LENGTH>1.000000</ogr:TR_LENGTH>
<ogr:TR_ORIENT>2</ogr:TR_ORIENT>
</ogr:transect_fixed_single_both>
</ogr:featureMember>
<ogr:featureMember>
<ogr:transect_fixed_single_both gml:id="transect_fixed_single_both.3">
<gml:boundedBy><gml:Envelope srsName="urn:ogc:def:crs:EPSG::2154"><gml:lowerCorner>-1007699.67743807 1334639.89215374</gml:lowerCorner><gml:upperCorner>-1007698.79404354 1334640.36078377</gml:upperCorner></gml:Envelope></gml:boundedBy>
<ogr:geometryProperty><gml:LineString srsName="urn:ogc:def:crs:EPSG::2154" gml:id="transect_fixed_single_both.geom.3"><gml:posList>-1007699.67743807 1334640.36078377 -1007698.79404354 1334639.89215374</gml:posList></gml:LineString></ogr:geometryProperty>
<ogr:fid>1</ogr:fid>
<ogr:TR_FID>0</ogr:TR_FID>
<ogr:TR_ID>3</ogr:TR_ID>
<ogr:TR_SEGMENT>4</ogr:TR_SEGMENT>
<ogr:TR_ANGLE>90.00</ogr:TR_ANGLE>
<ogr:TR_LENGTH>1.000000</ogr:TR_LENGTH>
<ogr:TR_ORIENT>2</ogr:TR_ORIENT>
</ogr:transect_fixed_single_both>
</ogr:featureMember>
<ogr:featureMember>
<ogr:transect_fixed_single_both gml:id="transect_fixed_single_both.4">
<gml:boundedBy><gml:Envelope srsName="urn:ogc:def:crs:EPSG::2154"><gml:lowerCorner>-1007698.87625616 1334641.0871433</gml:lowerCorner><gml:upperCorner>-1007697.8764214 1334641.10532212</gml:upperCorner></gml:Envelope></gml:boundedBy>
<ogr:geometryProperty><gml:LineString srsName="urn:ogc:def:crs:EPSG::2154" gml:id="transect_fixed_single_both.geom.4"><gml:posList>-1007698.87625616 1334641.10532212 -1007697.8764214 1334641.0871433</gml:posList></gml:LineString></ogr:geometryProperty>
<ogr:fid>2</ogr:fid>
<ogr:TR_FID>1</ogr:TR_FID>
<ogr:TR_ID>4</ogr:TR_ID>
<ogr:TR_SEGMENT>1</ogr:TR_SEGMENT>
<ogr:TR_ANGLE>90.00</ogr:TR_ANGLE>
<ogr:TR_LENGTH>1.000000</ogr:TR_LENGTH>
<ogr:TR_ORIENT>2</ogr:TR_ORIENT>
</ogr:transect_fixed_single_both>
</ogr:featureMember>
<ogr:featureMember>
<ogr:transect_fixed_single_both gml:id="transect_fixed_single_both.5">
<gml:boundedBy><gml:Envelope srsName="urn:ogc:def:crs:EPSG::2154"><gml:lowerCorner>-1007698.87989192 1334640.88717635</gml:lowerCorner><gml:upperCorner>-1007697.88005717 1334640.90535517</gml:upperCorner></gml:Envelope></gml:boundedBy>
<ogr:geometryProperty><gml:LineString srsName="urn:ogc:def:crs:EPSG::2154" gml:id="transect_fixed_single_both.geom.5"><gml:posList>-1007698.87989192 1334640.90535517 -1007697.88005717 1334640.88717635</gml:posList></gml:LineString></ogr:geometryProperty>
<ogr:fid>2</ogr:fid>
<ogr:TR_FID>1</ogr:TR_FID>
<ogr:TR_ID>5</ogr:TR_ID>
<ogr:TR_SEGMENT>2</ogr:TR_SEGMENT>
<ogr:TR_ANGLE>90.00</ogr:TR_ANGLE>
<ogr:TR_LENGTH>1.000000</ogr:TR_LENGTH>
<ogr:TR_ORIENT>2</ogr:TR_ORIENT>
</ogr:transect_fixed_single_both>
</ogr:featureMember>
<ogr:featureMember>
<ogr:transect_fixed_single_both gml:id="transect_fixed_single_both.6">
<gml:boundedBy><gml:Envelope srsName="urn:ogc:def:crs:EPSG::2154"><gml:lowerCorner>-1007698.88352768 1334640.6872094</gml:lowerCorner><gml:upperCorner>-1007697.88369293 1334640.70538822</gml:upperCorner></gml:Envelope></gml:boundedBy>
<ogr:geometryProperty><gml:LineString srsName="urn:ogc:def:crs:EPSG::2154" gml:id="transect_fixed_single_both.geom.6"><gml:posList>-1007698.88352768 1334640.70538822 -1007697.88369293 1334640.6872094</gml:posList></gml:LineString></ogr:geometryProperty>
<ogr:fid>2</ogr:fid>
<ogr:TR_FID>1</ogr:TR_FID>
<ogr:TR_ID>6</ogr:TR_ID>
<ogr:TR_SEGMENT>3</ogr:TR_SEGMENT>
<ogr:TR_ANGLE>90.00</ogr:TR_ANGLE>
<ogr:TR_LENGTH>1.000000</ogr:TR_LENGTH>
<ogr:TR_ORIENT>2</ogr:TR_ORIENT>
</ogr:transect_fixed_single_both>
</ogr:featureMember>
<ogr:featureMember>
<ogr:transect_fixed_single_both gml:id="transect_fixed_single_both.7">
<gml:boundedBy><gml:Envelope srsName="urn:ogc:def:crs:EPSG::2154"><gml:lowerCorner>-1007698.57444492 1334640.06062766</gml:lowerCorner><gml:upperCorner>-1007698.14727692 1334640.96479993</gml:upperCorner></gml:Envelope></gml:boundedBy>
<ogr:geometryProperty><gml:LineString srsName="urn:ogc:def:crs:EPSG::2154" gml:id="transect_fixed_single_both.geom.7"><gml:posList>-1007698.57444492 1334640.06062766 -1007698.14727692 1334640.96479993</gml:posList></gml:LineString></ogr:geometryProperty>
<ogr:fid>2</ogr:fid>
<ogr:TR_FID>1</ogr:TR_FID>
<ogr:TR_ID>7</ogr:TR_ID>
<ogr:TR_SEGMENT>4</ogr:TR_SEGMENT>
<ogr:TR_ANGLE>90.00</ogr:TR_ANGLE>
<ogr:TR_LENGTH>1.000000</ogr:TR_LENGTH>
<ogr:TR_ORIENT>2</ogr:TR_ORIENT>
</ogr:transect_fixed_single_both>
</ogr:featureMember>
<ogr:featureMember>
<ogr:transect_fixed_single_both gml:id="transect_fixed_single_both.8">
<gml:boundedBy><gml:Envelope srsName="urn:ogc:def:crs:EPSG::2154"><gml:lowerCorner>-1007698.39361047 1334639.97519406</gml:lowerCorner><gml:upperCorner>-1007697.96644246 1334640.87936633</gml:upperCorner></gml:Envelope></gml:boundedBy>
<ogr:geometryProperty><gml:LineString srsName="urn:ogc:def:crs:EPSG::2154" gml:id="transect_fixed_single_both.geom.8"><gml:posList>-1007698.39361047 1334639.97519406 -1007697.96644246 1334640.87936633</gml:posList></gml:LineString></ogr:geometryProperty>
<ogr:fid>2</ogr:fid>
<ogr:TR_FID>1</ogr:TR_FID>
<ogr:TR_ID>8</ogr:TR_ID>
<ogr:TR_SEGMENT>5</ogr:TR_SEGMENT>
<ogr:TR_ANGLE>90.00</ogr:TR_ANGLE>
<ogr:TR_LENGTH>1.000000</ogr:TR_LENGTH>
<ogr:TR_ORIENT>2</ogr:TR_ORIENT>
</ogr:transect_fixed_single_both>
</ogr:featureMember>
<ogr:featureMember>
<ogr:transect_fixed_single_both gml:id="transect_fixed_single_both.9">
<gml:boundedBy><gml:Envelope srsName="urn:ogc:def:crs:EPSG::2154"><gml:lowerCorner>-1007698.21277601 1334639.88976046</gml:lowerCorner><gml:upperCorner>-1007697.78560801 1334640.79393273</gml:upperCorner></gml:Envelope></gml:boundedBy>
<ogr:geometryProperty><gml:LineString srsName="urn:ogc:def:crs:EPSG::2154" gml:id="transect_fixed_single_both.geom.9"><gml:posList>-1007698.21277601 1334639.88976046 -1007697.78560801 1334640.79393273</gml:posList></gml:LineString></ogr:geometryProperty>
<ogr:fid>2</ogr:fid>
<ogr:TR_FID>1</ogr:TR_FID>
<ogr:TR_ID>9</ogr:TR_ID>
<ogr:TR_SEGMENT>6</ogr:TR_SEGMENT>
<ogr:TR_ANGLE>90.00</ogr:TR_ANGLE>
<ogr:TR_LENGTH>1.000000</ogr:TR_LENGTH>
<ogr:TR_ORIENT>2</ogr:TR_ORIENT>
</ogr:transect_fixed_single_both>
</ogr:featureMember>
<ogr:featureMember>
<ogr:transect_fixed_single_both gml:id="transect_fixed_single_both.10">
<gml:boundedBy><gml:Envelope srsName="urn:ogc:def:crs:EPSG::2154"><gml:lowerCorner>-1007697.43018498 1334641.18324138</gml:lowerCorner><gml:upperCorner>-1007696.5063014 1334641.56591506</gml:upperCorner></gml:Envelope></gml:boundedBy>
<ogr:geometryProperty><gml:LineString srsName="urn:ogc:def:crs:EPSG::2154" gml:id="transect_fixed_single_both.geom.10"><gml:posList>-1007697.43018498 1334641.56591506 -1007696.5063014 1334641.18324138</gml:posList></gml:LineString></ogr:geometryProperty>
<ogr:fid>3</ogr:fid>
<ogr:TR_FID>2</ogr:TR_FID>
<ogr:TR_ID>10</ogr:TR_ID>
<ogr:TR_SEGMENT>1</ogr:TR_SEGMENT>
<ogr:TR_ANGLE>90.00</ogr:TR_ANGLE>
<ogr:TR_LENGTH>1.000000</ogr:TR_LENGTH>
<ogr:TR_ORIENT>2</ogr:TR_ORIENT>
</ogr:transect_fixed_single_both>
</ogr:featureMember>
<ogr:featureMember>
<ogr:transect_fixed_single_both gml:id="transect_fixed_single_both.11">
<gml:boundedBy><gml:Envelope srsName="urn:ogc:def:crs:EPSG::2154"><gml:lowerCorner>-1007697.50671971 1334640.99846467</gml:lowerCorner><gml:upperCorner>-1007696.58283614 1334641.38113835</gml:upperCorner></gml:Envelope></gml:boundedBy>
<ogr:geometryProperty><gml:LineString srsName="urn:ogc:def:crs:EPSG::2154" gml:id="transect_fixed_single_both.geom.11"><gml:posList>-1007697.50671971 1334641.38113835 -1007696.58283614 1334640.99846467</gml:posList></gml:LineString></ogr:geometryProperty>
<ogr:fid>3</ogr:fid>
<ogr:TR_FID>2</ogr:TR_FID>
<ogr:TR_ID>11</ogr:TR_ID>
<ogr:TR_SEGMENT>2</ogr:TR_SEGMENT>
<ogr:TR_ANGLE>90.00</ogr:TR_ANGLE>
<ogr:TR_LENGTH>1.000000</ogr:TR_LENGTH>
<ogr:TR_ORIENT>2</ogr:TR_ORIENT>
</ogr:transect_fixed_single_both>
</ogr:featureMember>
<ogr:featureMember>
<ogr:transect_fixed_single_both gml:id="transect_fixed_single_both.12">
<gml:boundedBy><gml:Envelope srsName="urn:ogc:def:crs:EPSG::2154"><gml:lowerCorner>-1007697.58325445 1334640.81368795</gml:lowerCorner><gml:upperCorner>-1007696.65937088 1334641.19636163</gml:upperCorner></gml:Envelope></gml:boundedBy>
<ogr:geometryProperty><gml:LineString srsName="urn:ogc:def:crs:EPSG::2154" gml:id="transect_fixed_single_both.geom.12"><gml:posList>-1007697.58325445 1334641.19636163 -1007696.65937088 1334640.81368795</gml:posList></gml:LineString></ogr:geometryProperty>
<ogr:fid>3</ogr:fid>
<ogr:TR_FID>2</ogr:TR_FID>
<ogr:TR_ID>12</ogr:TR_ID>
<ogr:TR_SEGMENT>3</ogr:TR_SEGMENT>
<ogr:TR_ANGLE>90.00</ogr:TR_ANGLE>
<ogr:TR_LENGTH>1.000000</ogr:TR_LENGTH>
<ogr:TR_ORIENT>2</ogr:TR_ORIENT>
</ogr:transect_fixed_single_both>
</ogr:featureMember>
<ogr:featureMember>
<ogr:transect_fixed_single_both gml:id="transect_fixed_single_both.13">
<gml:boundedBy><gml:Envelope srsName="urn:ogc:def:crs:EPSG::2154"><gml:lowerCorner>-1007697.65978918 1334640.62891124</gml:lowerCorner><gml:upperCorner>-1007696.73590561 1334641.01158492</gml:upperCorner></gml:Envelope></gml:boundedBy>
<ogr:geometryProperty><gml:LineString srsName="urn:ogc:def:crs:EPSG::2154" gml:id="transect_fixed_single_both.geom.13"><gml:posList>-1007697.65978918 1334641.01158492 -1007696.73590561 1334640.62891124</gml:posList></gml:LineString></ogr:geometryProperty>
<ogr:fid>3</ogr:fid>
<ogr:TR_FID>2</ogr:TR_FID>
<ogr:TR_ID>13</ogr:TR_ID>
<ogr:TR_SEGMENT>4</ogr:TR_SEGMENT>
<ogr:TR_ANGLE>90.00</ogr:TR_ANGLE>
<ogr:TR_LENGTH>1.000000</ogr:TR_LENGTH>
<ogr:TR_ORIENT>2</ogr:TR_ORIENT>
</ogr:transect_fixed_single_both>
</ogr:featureMember>
<ogr:featureMember>
<ogr:transect_fixed_single_both gml:id="transect_fixed_single_both.14">
<gml:boundedBy><gml:Envelope srsName="urn:ogc:def:crs:EPSG::2154"><gml:lowerCorner>-1007697.73672317 1334640.44900368</gml:lowerCorner><gml:upperCorner>-1007696.80824647 1334640.82039432</gml:upperCorner></gml:Envelope></gml:boundedBy>
<ogr:geometryProperty><gml:LineString srsName="urn:ogc:def:crs:EPSG::2154" gml:id="transect_fixed_single_both.geom.14"><gml:posList>-1007697.73672317 1334640.82039432 -1007696.80824647 1334640.44900368</gml:posList></gml:LineString></ogr:geometryProperty>
<ogr:fid>3</ogr:fid>
<ogr:TR_FID>2</ogr:TR_FID>
<ogr:TR_ID>14</ogr:TR_ID>
<ogr:TR_SEGMENT>5</ogr:TR_SEGMENT>
<ogr:TR_ANGLE>90.00</ogr:TR_ANGLE>
<ogr:TR_LENGTH>1.000000</ogr:TR_LENGTH>
<ogr:TR_ORIENT>2</ogr:TR_ORIENT>
</ogr:transect_fixed_single_both>
</ogr:featureMember>
<ogr:featureMember>
<ogr:transect_fixed_single_both gml:id="transect_fixed_single_both.15">
<gml:boundedBy><gml:Envelope srsName="urn:ogc:def:crs:EPSG::2154"><gml:lowerCorner>-1007697.81121219 1334640.26596432</gml:lowerCorner><gml:upperCorner>-1007696.88031755 1334640.63125212</gml:upperCorner></gml:Envelope></gml:boundedBy>
<ogr:geometryProperty><gml:LineString srsName="urn:ogc:def:crs:EPSG::2154" gml:id="transect_fixed_single_both.geom.15"><gml:posList>-1007697.81121219 1334640.63125212 -1007696.88031755 1334640.26596432</gml:posList></gml:LineString></ogr:geometryProperty>
<ogr:fid>3</ogr:fid>
<ogr:TR_FID>2</ogr:TR_FID>
<ogr:TR_ID>15</ogr:TR_ID>
<ogr:TR_SEGMENT>6</ogr:TR_SEGMENT>
<ogr:TR_ANGLE>90.00</ogr:TR_ANGLE>
<ogr:TR_LENGTH>1.000000</ogr:TR_LENGTH>
<ogr:TR_ORIENT>2</ogr:TR_ORIENT>
</ogr:transect_fixed_single_both>
</ogr:featureMember>
<ogr:featureMember>
<ogr:transect_fixed_single_both gml:id="transect_fixed_single_both.16">
<gml:boundedBy><gml:Envelope srsName="urn:ogc:def:crs:EPSG::2154"><gml:lowerCorner>-1007697.88853468 1334640.09745328</gml:lowerCorner><gml:upperCorner>-1007696.94386101 1334640.42546496</gml:upperCorner></gml:Envelope></gml:boundedBy>
<ogr:geometryProperty><gml:LineString srsName="urn:ogc:def:crs:EPSG::2154" gml:id="transect_fixed_single_both.geom.16"><gml:posList>-1007697.88853468 1334640.42546496 -1007696.94386101 1334640.09745328</gml:posList></gml:LineString></ogr:geometryProperty>
<ogr:fid>3</ogr:fid>
<ogr:TR_FID>2</ogr:TR_FID>
<ogr:TR_ID>16</ogr:TR_ID>
<ogr:TR_SEGMENT>7</ogr:TR_SEGMENT>
<ogr:TR_ANGLE>90.00</ogr:TR_ANGLE>
<ogr:TR_LENGTH>1.000000</ogr:TR_LENGTH>
<ogr:TR_ORIENT>2</ogr:TR_ORIENT>
</ogr:transect_fixed_single_both>
</ogr:featureMember>
<ogr:featureMember>
<ogr:transect_fixed_single_both gml:id="transect_fixed_single_both.17">
<gml:boundedBy><gml:Envelope srsName="urn:ogc:def:crs:EPSG::2154"><gml:lowerCorner>-1007697.97399382 1334639.99112039</gml:lowerCorner><gml:upperCorner>-1007696.987237 1334640.15332697</gml:upperCorner></gml:Envelope></gml:boundedBy>
<ogr:geometryProperty><gml:LineString srsName="urn:ogc:def:crs:EPSG::2154" gml:id="transect_fixed_single_both.geom.17"><gml:posList>-1007697.97399382 1334640.15332697 -1007696.987237 1334639.99112039</gml:posList></gml:LineString></ogr:geometryProperty>
<ogr:fid>3</ogr:fid>
<ogr:TR_FID>2</ogr:TR_FID>
<ogr:TR_ID>17</ogr:TR_ID>
<ogr:TR_SEGMENT>8</ogr:TR_SEGMENT>
<ogr:TR_ANGLE>90.00</ogr:TR_ANGLE>
<ogr:TR_LENGTH>1.000000</ogr:TR_LENGTH>
<ogr:TR_ORIENT>2</ogr:TR_ORIENT>
</ogr:transect_fixed_single_both>
</ogr:featureMember>
<ogr:featureMember>
<ogr:transect_fixed_single_both gml:id="transect_fixed_single_both.18">
<gml:boundedBy><gml:Envelope srsName="urn:ogc:def:crs:EPSG::2154"><gml:lowerCorner>-1007698.00643513 1334639.79376903</gml:lowerCorner><gml:upperCorner>-1007697.01967831 1334639.9559756</gml:upperCorner></gml:Envelope></gml:boundedBy>
<ogr:geometryProperty><gml:LineString srsName="urn:ogc:def:crs:EPSG::2154" gml:id="transect_fixed_single_both.geom.18"><gml:posList>-1007698.00643513 1334639.9559756 -1007697.01967831 1334639.79376903</gml:posList></gml:LineString></ogr:geometryProperty>
<ogr:fid>3</ogr:fid>
<ogr:TR_FID>2</ogr:TR_FID>
<ogr:TR_ID>18</ogr:TR_ID>
<ogr:TR_SEGMENT>9</ogr:TR_SEGMENT>
<ogr:TR_ANGLE>90.00</ogr:TR_ANGLE>
<ogr:TR_LENGTH>1.000000</ogr:TR_LENGTH>
<ogr:TR_ORIENT>2</ogr:TR_ORIENT>
</ogr:transect_fixed_single_both>
</ogr:featureMember>
<ogr:featureMember>
<ogr:transect_fixed_single_both gml:id="transect_fixed_single_both.19">
<gml:boundedBy><gml:Envelope srsName="urn:ogc:def:crs:EPSG::2154"><gml:lowerCorner>-1007698.38013693 1334641.37803237</gml:lowerCorner><gml:upperCorner>-1007697.38013693 1334641.37803237</gml:upperCorner></gml:Envelope></gml:boundedBy>
<ogr:geometryProperty><gml:LineString srsName="urn:ogc:def:crs:EPSG::2154" gml:id="transect_fixed_single_both.geom.19"><gml:posList>-1007697.38013693 1334641.37803237 -1007698.38013693 1334641.37803237</gml:posList></gml:LineString></ogr:geometryProperty>
<ogr:fid>4</ogr:fid>
<ogr:TR_FID>3</ogr:TR_FID>
<ogr:TR_ID>19</ogr:TR_ID>
<ogr:TR_SEGMENT>1</ogr:TR_SEGMENT>
<ogr:TR_ANGLE>90.00</ogr:TR_ANGLE>
<ogr:TR_LENGTH>1.000000</ogr:TR_LENGTH>
<ogr:TR_ORIENT>2</ogr:TR_ORIENT>
</ogr:transect_fixed_single_both>
</ogr:featureMember>
<ogr:featureMember>
<ogr:transect_fixed_single_both gml:id="transect_fixed_single_both.20">
<gml:boundedBy><gml:Envelope srsName="urn:ogc:def:crs:EPSG::2154"><gml:lowerCorner>-1007698.38013693 1334641.57803237</gml:lowerCorner><gml:upperCorner>-1007697.38013693 1334641.57803237</gml:upperCorner></gml:Envelope></gml:boundedBy>
<ogr:geometryProperty><gml:LineString srsName="urn:ogc:def:crs:EPSG::2154" gml:id="transect_fixed_single_both.geom.20"><gml:posList>-1007697.38013693 1334641.57803237 -1007698.38013693 1334641.57803237</gml:posList></gml:LineString></ogr:geometryProperty>
<ogr:fid>4</ogr:fid>
<ogr:TR_FID>3</ogr:TR_FID>
<ogr:TR_ID>20</ogr:TR_ID>
<ogr:TR_SEGMENT>2</ogr:TR_SEGMENT>
<ogr:TR_ANGLE>90.00</ogr:TR_ANGLE>
<ogr:TR_LENGTH>1.000000</ogr:TR_LENGTH>
<ogr:TR_ORIENT>2</ogr:TR_ORIENT>
</ogr:transect_fixed_single_both>
</ogr:featureMember>
<ogr:featureMember>
<ogr:transect_fixed_single_both gml:id="transect_fixed_single_both.21">
<gml:boundedBy><gml:Envelope srsName="urn:ogc:def:crs:EPSG::2154"><gml:lowerCorner>-1007698.38013693 1334641.77803237</gml:lowerCorner><gml:upperCorner>-1007697.38013693 1334641.77803237</gml:upperCorner></gml:Envelope></gml:boundedBy>
<ogr:geometryProperty><gml:LineString srsName="urn:ogc:def:crs:EPSG::2154" gml:id="transect_fixed_single_both.geom.21"><gml:posList>-1007697.38013693 1334641.77803237 -1007698.38013693 1334641.77803237</gml:posList></gml:LineString></ogr:geometryProperty>
<ogr:fid>4</ogr:fid>
<ogr:TR_FID>3</ogr:TR_FID>
<ogr:TR_ID>21</ogr:TR_ID>
<ogr:TR_SEGMENT>3</ogr:TR_SEGMENT>
<ogr:TR_ANGLE>90.00</ogr:TR_ANGLE>
<ogr:TR_LENGTH>1.000000</ogr:TR_LENGTH>
<ogr:TR_ORIENT>2</ogr:TR_ORIENT>
</ogr:transect_fixed_single_both>
</ogr:featureMember>
<ogr:featureMember>
<ogr:transect_fixed_single_both gml:id="transect_fixed_single_both.22">
<gml:boundedBy><gml:Envelope srsName="urn:ogc:def:crs:EPSG::2154"><gml:lowerCorner>-1007698.38013693 1334641.97803237</gml:lowerCorner><gml:upperCorner>-1007697.38013693 1334641.97803237</gml:upperCorner></gml:Envelope></gml:boundedBy>
<ogr:geometryProperty><gml:LineString srsName="urn:ogc:def:crs:EPSG::2154" gml:id="transect_fixed_single_both.geom.22"><gml:posList>-1007697.38013693 1334641.97803237 -1007698.38013693 1334641.97803237</gml:posList></gml:LineString></ogr:geometryProperty>
<ogr:fid>4</ogr:fid>
<ogr:TR_FID>3</ogr:TR_FID>
<ogr:TR_ID>22</ogr:TR_ID>
<ogr:TR_SEGMENT>4</ogr:TR_SEGMENT>
<ogr:TR_ANGLE>90.00</ogr:TR_ANGLE>
<ogr:TR_LENGTH>1.000000</ogr:TR_LENGTH>
<ogr:TR_ORIENT>2</ogr:TR_ORIENT>
</ogr:transect_fixed_single_both>
</ogr:featureMember>
<ogr:featureMember>
<ogr:transect_fixed_single_both gml:id="transect_fixed_single_both.23">
<gml:boundedBy><gml:Envelope srsName="urn:ogc:def:crs:EPSG::2154"><gml:lowerCorner>-1007698.38013693 1334642.17803237</gml:lowerCorner><gml:upperCorner>-1007697.38013693 1334642.17803237</gml:upperCorner></gml:Envelope></gml:boundedBy>
<ogr:geometryProperty><gml:LineString srsName="urn:ogc:def:crs:EPSG::2154" gml:id="transect_fixed_single_both.geom.23"><gml:posList>-1007697.38013693 1334642.17803237 -1007698.38013693 1334642.17803237</gml:posList></gml:LineString></ogr:geometryProperty>
<ogr:fid>4</ogr:fid>
<ogr:TR_FID>3</ogr:TR_FID>
<ogr:TR_ID>23</ogr:TR_ID>
<ogr:TR_SEGMENT>5</ogr:TR_SEGMENT>
<ogr:TR_ANGLE>90.00</ogr:TR_ANGLE>
<ogr:TR_LENGTH>1.000000</ogr:TR_LENGTH>
<ogr:TR_ORIENT>2</ogr:TR_ORIENT>
</ogr:transect_fixed_single_both>
</ogr:featureMember>
<ogr:featureMember>
<ogr:transect_fixed_single_both gml:id="transect_fixed_single_both.24">
<gml:boundedBy><gml:Envelope srsName="urn:ogc:def:crs:EPSG::2154"><gml:lowerCorner>-1007698.38013693 1334642.37803237</gml:lowerCorner><gml:upperCorner>-1007697.38013693 1334642.37803237</gml:upperCorner></gml:Envelope></gml:boundedBy>
<ogr:geometryProperty><gml:LineString srsName="urn:ogc:def:crs:EPSG::2154" gml:id="transect_fixed_single_both.geom.24"><gml:posList>-1007697.38013693 1334642.37803237 -1007698.38013693 1334642.37803237</gml:posList></gml:LineString></ogr:geometryProperty>
<ogr:fid>4</ogr:fid>
<ogr:TR_FID>3</ogr:TR_FID>
<ogr:TR_ID>24</ogr:TR_ID>
<ogr:TR_SEGMENT>6</ogr:TR_SEGMENT>
<ogr:TR_ANGLE>90.00</ogr:TR_ANGLE>
<ogr:TR_LENGTH>1.000000</ogr:TR_LENGTH>
<ogr:TR_ORIENT>2</ogr:TR_ORIENT>
</ogr:transect_fixed_single_both>
</ogr:featureMember>
<ogr:featureMember>
<ogr:transect_fixed_single_both gml:id="transect_fixed_single_both.25">
<gml:boundedBy><gml:Envelope srsName="urn:ogc:def:crs:EPSG::2154"><gml:lowerCorner>-1007698.38013693 1334642.57803237</gml:lowerCorner><gml:upperCorner>-1007697.38013693 1334642.57803237</gml:upperCorner></gml:Envelope></gml:boundedBy>
<ogr:geometryProperty><gml:LineString srsName="urn:ogc:def:crs:EPSG::2154" gml:id="transect_fixed_single_both.geom.25"><gml:posList>-1007697.38013693 1334642.57803237 -1007698.38013693 1334642.57803237</gml:posList></gml:LineString></ogr:geometryProperty>
<ogr:fid>4</ogr:fid>
<ogr:TR_FID>3</ogr:TR_FID>
<ogr:TR_ID>25</ogr:TR_ID>
<ogr:TR_SEGMENT>7</ogr:TR_SEGMENT>
<ogr:TR_ANGLE>90.00</ogr:TR_ANGLE>
<ogr:TR_LENGTH>1.000000</ogr:TR_LENGTH>
<ogr:TR_ORIENT>2</ogr:TR_ORIENT>
</ogr:transect_fixed_single_both>
</ogr:featureMember>
<ogr:featureMember>
<ogr:transect_fixed_single_both gml:id="transect_fixed_single_both.26">
<gml:boundedBy><gml:Envelope srsName="urn:ogc:def:crs:EPSG::2154"><gml:lowerCorner>-1007698.38013693 1334642.77803237</gml:lowerCorner><gml:upperCorner>-1007697.38013693 1334642.77803237</gml:upperCorner></gml:Envelope></gml:boundedBy>
<ogr:geometryProperty><gml:LineString srsName="urn:ogc:def:crs:EPSG::2154" gml:id="transect_fixed_single_both.geom.26"><gml:posList>-1007697.38013693 1334642.77803237 -1007698.38013693 1334642.77803237</gml:posList></gml:LineString></ogr:geometryProperty>
<ogr:fid>4</ogr:fid>
<ogr:TR_FID>3</ogr:TR_FID>
<ogr:TR_ID>26</ogr:TR_ID>
<ogr:TR_SEGMENT>8</ogr:TR_SEGMENT>
<ogr:TR_ANGLE>90.00</ogr:TR_ANGLE>
<ogr:TR_LENGTH>1.000000</ogr:TR_LENGTH>
<ogr:TR_ORIENT>2</ogr:TR_ORIENT>
</ogr:transect_fixed_single_both>
</ogr:featureMember>
<ogr:featureMember>
<ogr:transect_fixed_single_both gml:id="transect_fixed_single_both.27">
<gml:boundedBy><gml:Envelope srsName="urn:ogc:def:crs:EPSG::2154"><gml:lowerCorner>-1007698.38013693 1334642.97803237</gml:lowerCorner><gml:upperCorner>-1007697.38013693 1334642.97803237</gml:upperCorner></gml:Envelope></gml:boundedBy>
<ogr:geometryProperty><gml:LineString srsName="urn:ogc:def:crs:EPSG::2154" gml:id="transect_fixed_single_both.geom.27"><gml:posList>-1007697.38013693 1334642.97803237 -1007698.38013693 1334642.97803237</gml:posList></gml:LineString></ogr:geometryProperty>
<ogr:fid>4</ogr:fid>
<ogr:TR_FID>3</ogr:TR_FID>
<ogr:TR_ID>27</ogr:TR_ID>
<ogr:TR_SEGMENT>9</ogr:TR_SEGMENT>
<ogr:TR_ANGLE>90.00</ogr:TR_ANGLE>
<ogr:TR_LENGTH>1.000000</ogr:TR_LENGTH>
<ogr:TR_ORIENT>2</ogr:TR_ORIENT>
</ogr:transect_fixed_single_both>
</ogr:featureMember>
<ogr:featureMember>
<ogr:transect_fixed_single_both gml:id="transect_fixed_single_both.28">
<gml:boundedBy><gml:Envelope srsName="urn:ogc:def:crs:EPSG::2154"><gml:lowerCorner>-1007698.38013693 1334643.17803237</gml:lowerCorner><gml:upperCorner>-1007697.38013693 1334643.17803237</gml:upperCorner></gml:Envelope></gml:boundedBy>
<ogr:geometryProperty><gml:LineString srsName="urn:ogc:def:crs:EPSG::2154" gml:id="transect_fixed_single_both.geom.28"><gml:posList>-1007697.38013693 1334643.17803237 -1007698.38013693 1334643.17803237</gml:posList></gml:LineString></ogr:geometryProperty>
<ogr:fid>4</ogr:fid>
<ogr:TR_FID>3</ogr:TR_FID>
<ogr:TR_ID>28</ogr:TR_ID>
<ogr:TR_SEGMENT>10</ogr:TR_SEGMENT>
<ogr:TR_ANGLE>90.00</ogr:TR_ANGLE>
<ogr:TR_LENGTH>1.000000</ogr:TR_LENGTH>
<ogr:TR_ORIENT>2</ogr:TR_ORIENT>
</ogr:transect_fixed_single_both>
</ogr:featureMember>
<ogr:featureMember>
<ogr:transect_fixed_single_both gml:id="transect_fixed_single_both.29">
<gml:boundedBy><gml:Envelope srsName="urn:ogc:def:crs:EPSG::2154"><gml:lowerCorner>-1007698.38013693 1334643.37803237</gml:lowerCorner><gml:upperCorner>-1007697.38013693 1334643.37803237</gml:upperCorner></gml:Envelope></gml:boundedBy>
<ogr:geometryProperty><gml:LineString srsName="urn:ogc:def:crs:EPSG::2154" gml:id="transect_fixed_single_both.geom.29"><gml:posList>-1007697.38013693 1334643.37803237 -1007698.38013693 1334643.37803237</gml:posList></gml:LineString></ogr:geometryProperty>
<ogr:fid>4</ogr:fid>
<ogr:TR_FID>3</ogr:TR_FID>
<ogr:TR_ID>29</ogr:TR_ID>
<ogr:TR_SEGMENT>11</ogr:TR_SEGMENT>
<ogr:TR_ANGLE>90.00</ogr:TR_ANGLE>
<ogr:TR_LENGTH>1.000000</ogr:TR_LENGTH>
<ogr:TR_ORIENT>2</ogr:TR_ORIENT>
</ogr:transect_fixed_single_both>
</ogr:featureMember>
<ogr:featureMember>
<ogr:transect_fixed_single_both gml:id="transect_fixed_single_both.30">
<gml:boundedBy><gml:Envelope srsName="urn:ogc:def:crs:EPSG::2154"><gml:lowerCorner>-1007697.68013693 1334642.87803237</gml:lowerCorner><gml:upperCorner>-1007697.68013693 1334643.87803237</gml:upperCorner></gml:Envelope></gml:boundedBy>
<ogr:geometryProperty><gml:LineString srsName="urn:ogc:def:crs:EPSG::2154" gml:id="transect_fixed_single_both.geom.30"><gml:posList>-1007697.68013693 1334642.87803237 -1007697.68013693 1334643.87803237</gml:posList></gml:LineString></ogr:geometryProperty>
<ogr:fid>4</ogr:fid>
<ogr:TR_FID>3</ogr:TR_FID>
<ogr:TR_ID>30</ogr:TR_ID>
<ogr:TR_SEGMENT>12</ogr:TR_SEGMENT>
<ogr:TR_ANGLE>90.00</ogr:TR_ANGLE>
<ogr:TR_LENGTH>1.000000</ogr:TR_LENGTH>
<ogr:TR_ORIENT>2</ogr:TR_ORIENT>
</ogr:transect_fixed_single_both>
</ogr:featureMember>
<ogr:featureMember>
<ogr:transect_fixed_single_both gml:id="transect_fixed_single_both.31">
<gml:boundedBy><gml:Envelope srsName="urn:ogc:def:crs:EPSG::2154"><gml:lowerCorner>-1007697.48013693 1334642.87803237</gml:lowerCorner><gml:upperCorner>-1007697.48013693 1334643.87803237</gml:upperCorner></gml:Envelope></gml:boundedBy>
<ogr:geometryProperty><gml:LineString srsName="urn:ogc:def:crs:EPSG::2154" gml:id="transect_fixed_single_both.geom.31"><gml:posList>-1007697.48013693 1334642.87803237 -1007697.48013693 1334643.87803237</gml:posList></gml:LineString></ogr:geometryProperty>
<ogr:fid>4</ogr:fid>
<ogr:TR_FID>3</ogr:TR_FID>
<ogr:TR_ID>31</ogr:TR_ID>
<ogr:TR_SEGMENT>13</ogr:TR_SEGMENT>
<ogr:TR_ANGLE>90.00</ogr:TR_ANGLE>
<ogr:TR_LENGTH>1.000000</ogr:TR_LENGTH>
<ogr:TR_ORIENT>2</ogr:TR_ORIENT>
</ogr:transect_fixed_single_both>
</ogr:featureMember>
<ogr:featureMember>
<ogr:transect_fixed_single_both gml:id="transect_fixed_single_both.32">
<gml:boundedBy><gml:Envelope srsName="urn:ogc:def:crs:EPSG::2154"><gml:lowerCorner>-1007697.28013693 1334642.87803237</gml:lowerCorner><gml:upperCorner>-1007697.28013693 1334643.87803237</gml:upperCorner></gml:Envelope></gml:boundedBy>
<ogr:geometryProperty><gml:LineString srsName="urn:ogc:def:crs:EPSG::2154" gml:id="transect_fixed_single_both.geom.32"><gml:posList>-1007697.28013693 1334642.87803237 -1007697.28013693 1334643.87803237</gml:posList></gml:LineString></ogr:geometryProperty>
<ogr:fid>4</ogr:fid>
<ogr:TR_FID>3</ogr:TR_FID>
<ogr:TR_ID>32</ogr:TR_ID>
<ogr:TR_SEGMENT>14</ogr:TR_SEGMENT>
<ogr:TR_ANGLE>90.00</ogr:TR_ANGLE>
<ogr:TR_LENGTH>1.000000</ogr:TR_LENGTH>
<ogr:TR_ORIENT>2</ogr:TR_ORIENT>
</ogr:transect_fixed_single_both>
</ogr:featureMember>
<ogr:featureMember>
<ogr:transect_fixed_single_both gml:id="transect_fixed_single_both.33">
<gml:boundedBy><gml:Envelope srsName="urn:ogc:def:crs:EPSG::2154"><gml:lowerCorner>-1007697.08013693 1334642.87803237</gml:lowerCorner><gml:upperCorner>-1007697.08013693 1334643.87803237</gml:upperCorner></gml:Envelope></gml:boundedBy>
<ogr:geometryProperty><gml:LineString srsName="urn:ogc:def:crs:EPSG::2154" gml:id="transect_fixed_single_both.geom.33"><gml:posList>-1007697.08013693 1334642.87803237 -1007697.08013693 1334643.87803237</gml:posList></gml:LineString></ogr:geometryProperty>
<ogr:fid>4</ogr:fid>
<ogr:TR_FID>3</ogr:TR_FID>
<ogr:TR_ID>33</ogr:TR_ID>
<ogr:TR_SEGMENT>15</ogr:TR_SEGMENT>
<ogr:TR_ANGLE>90.00</ogr:TR_ANGLE>
<ogr:TR_LENGTH>1.000000</ogr:TR_LENGTH>
<ogr:TR_ORIENT>2</ogr:TR_ORIENT>
</ogr:transect_fixed_single_both>
</ogr:featureMember>
<ogr:featureMember>
<ogr:transect_fixed_single_both gml:id="transect_fixed_single_both.34">
<gml:boundedBy><gml:Envelope srsName="urn:ogc:def:crs:EPSG::2154"><gml:lowerCorner>-1007696.88013693 1334642.87803237</gml:lowerCorner><gml:upperCorner>-1007696.88013693 1334643.87803237</gml:upperCorner></gml:Envelope></gml:boundedBy>
<ogr:geometryProperty><gml:LineString srsName="urn:ogc:def:crs:EPSG::2154" gml:id="transect_fixed_single_both.geom.34"><gml:posList>-1007696.88013693 1334642.87803237 -1007696.88013693 1334643.87803237</gml:posList></gml:LineString></ogr:geometryProperty>
<ogr:fid>4</ogr:fid>
<ogr:TR_FID>3</ogr:TR_FID>
<ogr:TR_ID>34</ogr:TR_ID>
<ogr:TR_SEGMENT>16</ogr:TR_SEGMENT>
<ogr:TR_ANGLE>90.00</ogr:TR_ANGLE>
<ogr:TR_LENGTH>1.000000</ogr:TR_LENGTH>
<ogr:TR_ORIENT>2</ogr:TR_ORIENT>
</ogr:transect_fixed_single_both>
</ogr:featureMember>
<ogr:featureMember>
<ogr:transect_fixed_single_both gml:id="transect_fixed_single_both.35">
<gml:boundedBy><gml:Envelope srsName="urn:ogc:def:crs:EPSG::2154"><gml:lowerCorner>-1007696.68013693 1334642.87803237</gml:lowerCorner><gml:upperCorner>-1007696.68013693 1334643.87803237</gml:upperCorner></gml:Envelope></gml:boundedBy>
<ogr:geometryProperty><gml:LineString srsName="urn:ogc:def:crs:EPSG::2154" gml:id="transect_fixed_single_both.geom.35"><gml:posList>-1007696.68013693 1334642.87803237 -1007696.68013693 1334643.87803237</gml:posList></gml:LineString></ogr:geometryProperty>
<ogr:fid>4</ogr:fid>
<ogr:TR_FID>3</ogr:TR_FID>
<ogr:TR_ID>35</ogr:TR_ID>
<ogr:TR_SEGMENT>17</ogr:TR_SEGMENT>
<ogr:TR_ANGLE>90.00</ogr:TR_ANGLE>
<ogr:TR_LENGTH>1.000000</ogr:TR_LENGTH>
<ogr:TR_ORIENT>2</ogr:TR_ORIENT>
</ogr:transect_fixed_single_both>
</ogr:featureMember>
<ogr:featureMember>
<ogr:transect_fixed_single_both gml:id="transect_fixed_single_both.36">
<gml:boundedBy><gml:Envelope srsName="urn:ogc:def:crs:EPSG::2154"><gml:lowerCorner>-1007696.48013693 1334642.87803237</gml:lowerCorner><gml:upperCorner>-1007696.48013693 1334643.87803237</gml:upperCorner></gml:Envelope></gml:boundedBy>
<ogr:geometryProperty><gml:LineString srsName="urn:ogc:def:crs:EPSG::2154" gml:id="transect_fixed_single_both.geom.36"><gml:posList>-1007696.48013693 1334642.87803237 -1007696.48013693 1334643.87803237</gml:posList></gml:LineString></ogr:geometryProperty>
<ogr:fid>4</ogr:fid>
<ogr:TR_FID>3</ogr:TR_FID>
<ogr:TR_ID>36</ogr:TR_ID>
<ogr:TR_SEGMENT>18</ogr:TR_SEGMENT>
<ogr:TR_ANGLE>90.00</ogr:TR_ANGLE>
<ogr:TR_LENGTH>1.000000</ogr:TR_LENGTH>
<ogr:TR_ORIENT>2</ogr:TR_ORIENT>
</ogr:transect_fixed_single_both>
</ogr:featureMember>
<ogr:featureMember>
<ogr:transect_fixed_single_both gml:id="transect_fixed_single_both.37">
<gml:boundedBy><gml:Envelope srsName="urn:ogc:def:crs:EPSG::2154"><gml:lowerCorner>-1007696.28013693 1334642.87803237</gml:lowerCorner><gml:upperCorner>-1007696.28013693 1334643.87803237</gml:upperCorner></gml:Envelope></gml:boundedBy>
<ogr:geometryProperty><gml:LineString srsName="urn:ogc:def:crs:EPSG::2154" gml:id="transect_fixed_single_both.geom.37"><gml:posList>-1007696.28013693 1334642.87803237 -1007696.28013693 1334643.87803237</gml:posList></gml:LineString></ogr:geometryProperty>
<ogr:fid>4</ogr:fid>
<ogr:TR_FID>3</ogr:TR_FID>
<ogr:TR_ID>37</ogr:TR_ID>
<ogr:TR_SEGMENT>19</ogr:TR_SEGMENT>
<ogr:TR_ANGLE>90.00</ogr:TR_ANGLE>
<ogr:TR_LENGTH>1.000000</ogr:TR_LENGTH>
<ogr:TR_ORIENT>2</ogr:TR_ORIENT>
</ogr:transect_fixed_single_both>
</ogr:featureMember>
<ogr:featureMember>
<ogr:transect_fixed_single_both gml:id="transect_fixed_single_both.38">
<gml:boundedBy><gml:Envelope srsName="urn:ogc:def:crs:EPSG::2154"><gml:lowerCorner>-1007696.08013693 1334642.87803237</gml:lowerCorner><gml:upperCorner>-1007696.08013693 1334643.87803237</gml:upperCorner></gml:Envelope></gml:boundedBy>
<ogr:geometryProperty><gml:LineString srsName="urn:ogc:def:crs:EPSG::2154" gml:id="transect_fixed_single_both.geom.38"><gml:posList>-1007696.08013693 1334642.87803237 -1007696.08013693 1334643.87803237</gml:posList></gml:LineString></ogr:geometryProperty>
<ogr:fid>4</ogr:fid>
<ogr:TR_FID>3</ogr:TR_FID>
<ogr:TR_ID>38</ogr:TR_ID>
<ogr:TR_SEGMENT>20</ogr:TR_SEGMENT>
<ogr:TR_ANGLE>90.00</ogr:TR_ANGLE>
<ogr:TR_LENGTH>1.000000</ogr:TR_LENGTH>
<ogr:TR_ORIENT>2</ogr:TR_ORIENT>
</ogr:transect_fixed_single_both>
</ogr:featureMember>
<ogr:featureMember>
<ogr:transect_fixed_single_both gml:id="transect_fixed_single_both.39">
<gml:boundedBy><gml:Envelope srsName="urn:ogc:def:crs:EPSG::2154"><gml:lowerCorner>-1007695.88013693 1334642.87803237</gml:lowerCorner><gml:upperCorner>-1007695.88013693 1334643.87803237</gml:upperCorner></gml:Envelope></gml:boundedBy>
<ogr:geometryProperty><gml:LineString srsName="urn:ogc:def:crs:EPSG::2154" gml:id="transect_fixed_single_both.geom.39"><gml:posList>-1007695.88013693 1334642.87803237 -1007695.88013693 1334643.87803237</gml:posList></gml:LineString></ogr:geometryProperty>
<ogr:fid>4</ogr:fid>
<ogr:TR_FID>3</ogr:TR_FID>
<ogr:TR_ID>39</ogr:TR_ID>
<ogr:TR_SEGMENT>21</ogr:TR_SEGMENT>
<ogr:TR_ANGLE>90.00</ogr:TR_ANGLE>
<ogr:TR_LENGTH>1.000000</ogr:TR_LENGTH>
<ogr:TR_ORIENT>2</ogr:TR_ORIENT>
</ogr:transect_fixed_single_both>
</ogr:featureMember>
<ogr:featureMember>
<ogr:transect_fixed_single_both gml:id="transect_fixed_single_both.40">
<gml:boundedBy><gml:Envelope srsName="urn:ogc:def:crs:EPSG::2154"><gml:lowerCorner>-1007696.38013693 1334643.17803237</gml:lowerCorner><gml:upperCorner>-1007695.38013693 1334643.17803237</gml:upperCorner></gml:Envelope></gml:boundedBy>
<ogr:geometryProperty><gml:LineString srsName="urn:ogc:def:crs:EPSG::2154" gml:id="transect_fixed_single_both.geom.40"><gml:posList>-1007696.38013693 1334643.17803237 -1007695.38013693 1334643.17803237</gml:posList></gml:LineString></ogr:geometryProperty>
<ogr:fid>4</ogr:fid>
<ogr:TR_FID>3</ogr:TR_FID>
<ogr:TR_ID>40</ogr:TR_ID>
<ogr:TR_SEGMENT>22</ogr:TR_SEGMENT>
<ogr:TR_ANGLE>90.00</ogr:TR_ANGLE>
<ogr:TR_LENGTH>1.000000</ogr:TR_LENGTH>
<ogr:TR_ORIENT>2</ogr:TR_ORIENT>
</ogr:transect_fixed_single_both>
</ogr:featureMember>
<ogr:featureMember>
<ogr:transect_fixed_single_both gml:id="transect_fixed_single_both.41">
<gml:boundedBy><gml:Envelope srsName="urn:ogc:def:crs:EPSG::2154"><gml:lowerCorner>-1007696.38013693 1334642.97803237</gml:lowerCorner><gml:upperCorner>-1007695.38013693 1334642.97803237</gml:upperCorner></gml:Envelope></gml:boundedBy>
<ogr:geometryProperty><gml:LineString srsName="urn:ogc:def:crs:EPSG::2154" gml:id="transect_fixed_single_both.geom.41"><gml:posList>-1007696.38013693 1334642.97803237 -1007695.38013693 1334642.97803237</gml:posList></gml:LineString></ogr:geometryProperty>
<ogr:fid>4</ogr:fid>
<ogr:TR_FID>3</ogr:TR_FID>
<ogr:TR_ID>41</ogr:TR_ID>
<ogr:TR_SEGMENT>23</ogr:TR_SEGMENT>
<ogr:TR_ANGLE>90.00</ogr:TR_ANGLE>
<ogr:TR_LENGTH>1.000000</ogr:TR_LENGTH>
<ogr:TR_ORIENT>2</ogr:TR_ORIENT>
</ogr:transect_fixed_single_both>
</ogr:featureMember>
<ogr:featureMember>
<ogr:transect_fixed_single_both gml:id="transect_fixed_single_both.42">
<gml:boundedBy><gml:Envelope srsName="urn:ogc:def:crs:EPSG::2154"><gml:lowerCorner>-1007696.38013693 1334642.77803237</gml:lowerCorner><gml:upperCorner>-1007695.38013693 1334642.77803237</gml:upperCorner></gml:Envelope></gml:boundedBy>
<ogr:geometryProperty><gml:LineString srsName="urn:ogc:def:crs:EPSG::2154" gml:id="transect_fixed_single_both.geom.42"><gml:posList>-1007696.38013693 1334642.77803237 -1007695.38013693 1334642.77803237</gml:posList></gml:LineString></ogr:geometryProperty>
<ogr:fid>4</ogr:fid>
<ogr:TR_FID>3</ogr:TR_FID>
<ogr:TR_ID>42</ogr:TR_ID>
<ogr:TR_SEGMENT>24</ogr:TR_SEGMENT>
<ogr:TR_ANGLE>90.00</ogr:TR_ANGLE>
<ogr:TR_LENGTH>1.000000</ogr:TR_LENGTH>
<ogr:TR_ORIENT>2</ogr:TR_ORIENT>
</ogr:transect_fixed_single_both>
</ogr:featureMember>
<ogr:featureMember>
<ogr:transect_fixed_single_both gml:id="transect_fixed_single_both.43">
<gml:boundedBy><gml:Envelope srsName="urn:ogc:def:crs:EPSG::2154"><gml:lowerCorner>-1007696.38013693 1334642.57803237</gml:lowerCorner><gml:upperCorner>-1007695.38013693 1334642.57803237</gml:upperCorner></gml:Envelope></gml:boundedBy>
<ogr:geometryProperty><gml:LineString srsName="urn:ogc:def:crs:EPSG::2154" gml:id="transect_fixed_single_both.geom.43"><gml:posList>-1007696.38013693 1334642.57803237 -1007695.38013693 1334642.57803237</gml:posList></gml:LineString></ogr:geometryProperty>
<ogr:fid>4</ogr:fid>
<ogr:TR_FID>3</ogr:TR_FID>
<ogr:TR_ID>43</ogr:TR_ID>
<ogr:TR_SEGMENT>25</ogr:TR_SEGMENT>
<ogr:TR_ANGLE>90.00</ogr:TR_ANGLE>
<ogr:TR_LENGTH>1.000000</ogr:TR_LENGTH>
<ogr:TR_ORIENT>2</ogr:TR_ORIENT>
</ogr:transect_fixed_single_both>
</ogr:featureMember>
<ogr:featureMember>
<ogr:transect_fixed_single_both gml:id="transect_fixed_single_both.44">
<gml:boundedBy><gml:Envelope srsName="urn:ogc:def:crs:EPSG::2154"><gml:lowerCorner>-1007696.38013693 1334642.37803237</gml:lowerCorner><gml:upperCorner>-1007695.38013693 1334642.37803237</gml:upperCorner></gml:Envelope></gml:boundedBy>
<ogr:geometryProperty><gml:LineString srsName="urn:ogc:def:crs:EPSG::2154" gml:id="transect_fixed_single_both.geom.44"><gml:posList>-1007696.38013693 1334642.37803237 -1007695.38013693 1334642.37803237</gml:posList></gml:LineString></ogr:geometryProperty>
<ogr:fid>4</ogr:fid>
<ogr:TR_FID>3</ogr:TR_FID>
<ogr:TR_ID>44</ogr:TR_ID>
<ogr:TR_SEGMENT>26</ogr:TR_SEGMENT>
<ogr:TR_ANGLE>90.00</ogr:TR_ANGLE>
<ogr:TR_LENGTH>1.000000</ogr:TR_LENGTH>
<ogr:TR_ORIENT>2</ogr:TR_ORIENT>
</ogr:transect_fixed_single_both>
</ogr:featureMember>
<ogr:featureMember>
<ogr:transect_fixed_single_both gml:id="transect_fixed_single_both.45">
<gml:boundedBy><gml:Envelope srsName="urn:ogc:def:crs:EPSG::2154"><gml:lowerCorner>-1007696.38013693 1334642.17803237</gml:lowerCorner><gml:upperCorner>-1007695.38013693 1334642.17803237</gml:upperCorner></gml:Envelope></gml:boundedBy>
<ogr:geometryProperty><gml:LineString srsName="urn:ogc:def:crs:EPSG::2154" gml:id="transect_fixed_single_both.geom.45"><gml:posList>-1007696.38013693 1334642.17803237 -1007695.38013693 1334642.17803237</gml:posList></gml:LineString></ogr:geometryProperty>
<ogr:fid>4</ogr:fid>
<ogr:TR_FID>3</ogr:TR_FID>
<ogr:TR_ID>45</ogr:TR_ID>
<ogr:TR_SEGMENT>27</ogr:TR_SEGMENT>
<ogr:TR_ANGLE>90.00</ogr:TR_ANGLE>
<ogr:TR_LENGTH>1.000000</ogr:TR_LENGTH>
<ogr:TR_ORIENT>2</ogr:TR_ORIENT>
</ogr:transect_fixed_single_both>
</ogr:featureMember>
<ogr:featureMember>
<ogr:transect_fixed_single_both gml:id="transect_fixed_single_both.46">
<gml:boundedBy><gml:Envelope srsName="urn:ogc:def:crs:EPSG::2154"><gml:lowerCorner>-1007696.38013693 1334641.97803237</gml:lowerCorner><gml:upperCorner>-1007695.38013693 1334641.97803237</gml:upperCorner></gml:Envelope></gml:boundedBy>
<ogr:geometryProperty><gml:LineString srsName="urn:ogc:def:crs:EPSG::2154" gml:id="transect_fixed_single_both.geom.46"><gml:posList>-1007696.38013693 1334641.97803237 -1007695.38013693 1334641.97803237</gml:posList></gml:LineString></ogr:geometryProperty>
<ogr:fid>4</ogr:fid>
<ogr:TR_FID>3</ogr:TR_FID>
<ogr:TR_ID>46</ogr:TR_ID>
<ogr:TR_SEGMENT>28</ogr:TR_SEGMENT>
<ogr:TR_ANGLE>90.00</ogr:TR_ANGLE>
<ogr:TR_LENGTH>1.000000</ogr:TR_LENGTH>
<ogr:TR_ORIENT>2</ogr:TR_ORIENT>
</ogr:transect_fixed_single_both>
</ogr:featureMember>
<ogr:featureMember>
<ogr:transect_fixed_single_both gml:id="transect_fixed_single_both.47">
<gml:boundedBy><gml:Envelope srsName="urn:ogc:def:crs:EPSG::2154"><gml:lowerCorner>-1007696.38013693 1334641.77803237</gml:lowerCorner><gml:upperCorner>-1007695.38013693 1334641.77803237</gml:upperCorner></gml:Envelope></gml:boundedBy>
<ogr:geometryProperty><gml:LineString srsName="urn:ogc:def:crs:EPSG::2154" gml:id="transect_fixed_single_both.geom.47"><gml:posList>-1007696.38013693 1334641.77803237 -1007695.38013693 1334641.77803237</gml:posList></gml:LineString></ogr:geometryProperty>
<ogr:fid>4</ogr:fid>
<ogr:TR_FID>3</ogr:TR_FID>
<ogr:TR_ID>47</ogr:TR_ID>
<ogr:TR_SEGMENT>29</ogr:TR_SEGMENT>
<ogr:TR_ANGLE>90.00</ogr:TR_ANGLE>
<ogr:TR_LENGTH>1.000000</ogr:TR_LENGTH>
<ogr:TR_ORIENT>2</ogr:TR_ORIENT>
</ogr:transect_fixed_single_both>
</ogr:featureMember>
<ogr:featureMember>
<ogr:transect_fixed_single_both gml:id="transect_fixed_single_both.48">
<gml:boundedBy><gml:Envelope srsName="urn:ogc:def:crs:EPSG::2154"><gml:lowerCorner>-1007696.38013693 1334641.57803237</gml:lowerCorner><gml:upperCorner>-1007695.38013693 1334641.57803237</gml:upperCorner></gml:Envelope></gml:boundedBy>
<ogr:geometryProperty><gml:LineString srsName="urn:ogc:def:crs:EPSG::2154" gml:id="transect_fixed_single_both.geom.48"><gml:posList>-1007696.38013693 1334641.57803237 -1007695.38013693 1334641.57803237</gml:posList></gml:LineString></ogr:geometryProperty>
<ogr:fid>4</ogr:fid>
<ogr:TR_FID>3</ogr:TR_FID>
<ogr:TR_ID>48</ogr:TR_ID>
<ogr:TR_SEGMENT>30</ogr:TR_SEGMENT>
<ogr:TR_ANGLE>90.00</ogr:TR_ANGLE>
<ogr:TR_LENGTH>1.000000</ogr:TR_LENGTH>
<ogr:TR_ORIENT>2</ogr:TR_ORIENT>
</ogr:transect_fixed_single_both>
</ogr:featureMember>
<ogr:featureMember>
<ogr:transect_fixed_single_both gml:id="transect_fixed_single_both.49">
<gml:boundedBy><gml:Envelope srsName="urn:ogc:def:crs:EPSG::2154"><gml:lowerCorner>-1007696.38013693 1334641.37803237</gml:lowerCorner><gml:upperCorner>-1007695.38013693 1334641.37803237</gml:upperCorner></gml:Envelope></gml:boundedBy>
<ogr:geometryProperty><gml:LineString srsName="urn:ogc:def:crs:EPSG::2154" gml:id="transect_fixed_single_both.geom.49"><gml:posList>-1007696.38013693 1334641.37803237 -1007695.38013693 1334641.37803237</gml:posList></gml:LineString></ogr:geometryProperty>
<ogr:fid>4</ogr:fid>
<ogr:TR_FID>3</ogr:TR_FID>
<ogr:TR_ID>49</ogr:TR_ID>
<ogr:TR_SEGMENT>31</ogr:TR_SEGMENT>
<ogr:TR_ANGLE>90.00</ogr:TR_ANGLE>
<ogr:TR_LENGTH>1.000000</ogr:TR_LENGTH>
<ogr:TR_ORIENT>2</ogr:TR_ORIENT>
</ogr:transect_fixed_single_both>
</ogr:featureMember>
<ogr:featureMember>
<ogr:transect_fixed_single_both gml:id="transect_fixed_single_both.50">
<gml:boundedBy><gml:Envelope srsName="urn:ogc:def:crs:EPSG::2154"><gml:lowerCorner>-1007696.08172314 1334640.8774</gml:lowerCorner><gml:upperCorner>-1007696.0785487 1334641.87739496</gml:upperCorner></gml:Envelope></gml:boundedBy>
<ogr:geometryProperty><gml:LineString srsName="urn:ogc:def:crs:EPSG::2154" gml:id="transect_fixed_single_both.geom.50"><gml:posList>-1007696.08172314 1334641.87739496 -1007696.0785487 1334640.8774</gml:posList></gml:LineString></ogr:geometryProperty>
<ogr:fid>4</ogr:fid>
<ogr:TR_FID>3</ogr:TR_FID>
<ogr:TR_ID>50</ogr:TR_ID>
<ogr:TR_SEGMENT>32</ogr:TR_SEGMENT>
<ogr:TR_ANGLE>90.00</ogr:TR_ANGLE>
<ogr:TR_LENGTH>1.000000</ogr:TR_LENGTH>
<ogr:TR_ORIENT>2</ogr:TR_ORIENT>
</ogr:transect_fixed_single_both>
</ogr:featureMember>
<ogr:featureMember>
<ogr:transect_fixed_single_both gml:id="transect_fixed_single_both.51">
<gml:boundedBy><gml:Envelope srsName="urn:ogc:def:crs:EPSG::2154"><gml:lowerCorner>-1007696.28172214 1334640.87676511</gml:lowerCorner><gml:upperCorner>-1007696.27854769 1334641.87676007</gml:upperCorner></gml:Envelope></gml:boundedBy>
<ogr:geometryProperty><gml:LineString srsName="urn:ogc:def:crs:EPSG::2154" gml:id="transect_fixed_single_both.geom.51"><gml:posList>-1007696.28172214 1334641.87676007 -1007696.27854769 1334640.87676511</gml:posList></gml:LineString></ogr:geometryProperty>
<ogr:fid>4</ogr:fid>
<ogr:TR_FID>3</ogr:TR_FID>
<ogr:TR_ID>51</ogr:TR_ID>
<ogr:TR_SEGMENT>33</ogr:TR_SEGMENT>
<ogr:TR_ANGLE>90.00</ogr:TR_ANGLE>
<ogr:TR_LENGTH>1.000000</ogr:TR_LENGTH>
<ogr:TR_ORIENT>2</ogr:TR_ORIENT>
</ogr:transect_fixed_single_both>
</ogr:featureMember>
<ogr:featureMember>
<ogr:transect_fixed_single_both gml:id="transect_fixed_single_both.52">
<gml:boundedBy><gml:Envelope srsName="urn:ogc:def:crs:EPSG::2154"><gml:lowerCorner>-1007696.48172113 1334640.87613022</gml:lowerCorner><gml:upperCorner>-1007696.47854668 1334641.87612518</gml:upperCorner></gml:Envelope></gml:boundedBy>
<ogr:geometryProperty><gml:LineString srsName="urn:ogc:def:crs:EPSG::2154" gml:id="transect_fixed_single_both.geom.52"><gml:posList>-1007696.48172113 1334641.87612518 -1007696.47854668 1334640.87613022</gml:posList></gml:LineString></ogr:geometryProperty>
<ogr:fid>4</ogr:fid>
<ogr:TR_FID>3</ogr:TR_FID>
<ogr:TR_ID>52</ogr:TR_ID>
<ogr:TR_SEGMENT>34</ogr:TR_SEGMENT>
<ogr:TR_ANGLE>90.00</ogr:TR_ANGLE>
<ogr:TR_LENGTH>1.000000</ogr:TR_LENGTH>
<ogr:TR_ORIENT>2</ogr:TR_ORIENT>
</ogr:transect_fixed_single_both>
</ogr:featureMember>
<ogr:featureMember>
<ogr:transect_fixed_single_both gml:id="transect_fixed_single_both.53">
<gml:boundedBy><gml:Envelope srsName="urn:ogc:def:crs:EPSG::2154"><gml:lowerCorner>-1007696.68172012 1334640.87549533</gml:lowerCorner><gml:upperCorner>-1007696.67854568 1334641.8754903</gml:upperCorner></gml:Envelope></gml:boundedBy>
<ogr:geometryProperty><gml:LineString srsName="urn:ogc:def:crs:EPSG::2154" gml:id="transect_fixed_single_both.geom.53"><gml:posList>-1007696.68172012 1334641.8754903 -1007696.67854568 1334640.87549533</gml:posList></gml:LineString></ogr:geometryProperty>
<ogr:fid>4</ogr:fid>
<ogr:TR_FID>3</ogr:TR_FID>
<ogr:TR_ID>53</ogr:TR_ID>
<ogr:TR_SEGMENT>35</ogr:TR_SEGMENT>
<ogr:TR_ANGLE>90.00</ogr:TR_ANGLE>
<ogr:TR_LENGTH>1.000000</ogr:TR_LENGTH>
<ogr:TR_ORIENT>2</ogr:TR_ORIENT>
</ogr:transect_fixed_single_both>
</ogr:featureMember>
<ogr:featureMember>
<ogr:transect_fixed_single_both gml:id="transect_fixed_single_both.54">
<gml:boundedBy><gml:Envelope srsName="urn:ogc:def:crs:EPSG::2154"><gml:lowerCorner>-1007696.88171911 1334640.87486045</gml:lowerCorner><gml:upperCorner>-1007696.87854467 1334641.87485541</gml:upperCorner></gml:Envelope></gml:boundedBy>
<ogr:geometryProperty><gml:LineString srsName="urn:ogc:def:crs:EPSG::2154" gml:id="transect_fixed_single_both.geom.54"><gml:posList>-1007696.88171911 1334641.87485541 -1007696.87854467 1334640.87486045</gml:posList></gml:LineString></ogr:geometryProperty>
<ogr:fid>4</ogr:fid>
<ogr:TR_FID>3</ogr:TR_FID>
<ogr:TR_ID>54</ogr:TR_ID>
<ogr:TR_SEGMENT>36</ogr:TR_SEGMENT>
<ogr:TR_ANGLE>90.00</ogr:TR_ANGLE>
<ogr:TR_LENGTH>1.000000</ogr:TR_LENGTH>
<ogr:TR_ORIENT>2</ogr:TR_ORIENT>
</ogr:transect_fixed_single_both>
</ogr:featureMember>
<ogr:featureMember>
<ogr:transect_fixed_single_both gml:id="transect_fixed_single_both.55">
<gml:boundedBy><gml:Envelope srsName="urn:ogc:def:crs:EPSG::2154"><gml:lowerCorner>-1007697.08202457 1334640.87500562</gml:lowerCorner><gml:upperCorner>-1007697.07823672 1334641.87499845</gml:upperCorner></gml:Envelope></gml:boundedBy>
<ogr:geometryProperty><gml:LineString srsName="urn:ogc:def:crs:EPSG::2154" gml:id="transect_fixed_single_both.geom.55"><gml:posList>-1007697.07823672 1334641.87499845 -1007697.08202457 1334640.87500562</gml:posList></gml:LineString></ogr:geometryProperty>
<ogr:fid>4</ogr:fid>
<ogr:TR_FID>3</ogr:TR_FID>
<ogr:TR_ID>55</ogr:TR_ID>
<ogr:TR_SEGMENT>37</ogr:TR_SEGMENT>
<ogr:TR_ANGLE>90.00</ogr:TR_ANGLE>
<ogr:TR_LENGTH>1.000000</ogr:TR_LENGTH>
<ogr:TR_ORIENT>2</ogr:TR_ORIENT>
</ogr:transect_fixed_single_both>
</ogr:featureMember>
<ogr:featureMember>
<ogr:transect_fixed_single_both gml:id="transect_fixed_single_both.56">
<gml:boundedBy><gml:Envelope srsName="urn:ogc:def:crs:EPSG::2154"><gml:lowerCorner>-1007697.28202314 1334640.8757632</gml:lowerCorner><gml:upperCorner>-1007697.27823528 1334641.87575602</gml:upperCorner></gml:Envelope></gml:boundedBy>
<ogr:geometryProperty><gml:LineString srsName="urn:ogc:def:crs:EPSG::2154" gml:id="transect_fixed_single_both.geom.56"><gml:posList>-1007697.27823528 1334641.87575602 -1007697.28202314 1334640.8757632</gml:posList></gml:LineString></ogr:geometryProperty>
<ogr:fid>4</ogr:fid>
<ogr:TR_FID>3</ogr:TR_FID>
<ogr:TR_ID>56</ogr:TR_ID>
<ogr:TR_SEGMENT>38</ogr:TR_SEGMENT>
<ogr:TR_ANGLE>90.00</ogr:TR_ANGLE>
<ogr:TR_LENGTH>1.000000</ogr:TR_LENGTH>
<ogr:TR_ORIENT>2</ogr:TR_ORIENT>
</ogr:transect_fixed_single_both>
</ogr:featureMember>
<ogr:featureMember>
<ogr:transect_fixed_single_both gml:id="transect_fixed_single_both.57">
<gml:boundedBy><gml:Envelope srsName="urn:ogc:def:crs:EPSG::2154"><gml:lowerCorner>-1007697.4820217 1334640.87652077</gml:lowerCorner><gml:upperCorner>-1007697.47823385 1334641.87651359</gml:upperCorner></gml:Envelope></gml:boundedBy>
<ogr:geometryProperty><gml:LineString srsName="urn:ogc:def:crs:EPSG::2154" gml:id="transect_fixed_single_both.geom.57"><gml:posList>-1007697.47823385 1334641.87651359 -1007697.4820217 1334640.87652077</gml:posList></gml:LineString></ogr:geometryProperty>
<ogr:fid>4</ogr:fid>
<ogr:TR_FID>3</ogr:TR_FID>
<ogr:TR_ID>57</ogr:TR_ID>
<ogr:TR_SEGMENT>39</ogr:TR_SEGMENT>
<ogr:TR_ANGLE>90.00</ogr:TR_ANGLE>
<ogr:TR_LENGTH>1.000000</ogr:TR_LENGTH>
<ogr:TR_ORIENT>2</ogr:TR_ORIENT>
</ogr:transect_fixed_single_both>
</ogr:featureMember>
<ogr:featureMember>
<ogr:transect_fixed_single_both gml:id="transect_fixed_single_both.58">
<gml:boundedBy><gml:Envelope srsName="urn:ogc:def:crs:EPSG::2154"><gml:lowerCorner>-1007697.68202027 1334640.87727834</gml:lowerCorner><gml:upperCorner>-1007697.67823241 1334641.87727117</gml:upperCorner></gml:Envelope></gml:boundedBy>
<ogr:geometryProperty><gml:LineString srsName="urn:ogc:def:crs:EPSG::2154" gml:id="transect_fixed_single_both.geom.58"><gml:posList>-1007697.67823241 1334641.87727117 -1007697.68202027 1334640.87727834</gml:posList></gml:LineString></ogr:geometryProperty>
<ogr:fid>4</ogr:fid>
<ogr:TR_FID>3</ogr:TR_FID>
<ogr:TR_ID>58</ogr:TR_ID>
<ogr:TR_SEGMENT>40</ogr:TR_SEGMENT>
<ogr:TR_ANGLE>90.00</ogr:TR_ANGLE>
<ogr:TR_LENGTH>1.000000</ogr:TR_LENGTH>
<ogr:TR_ORIENT>2</ogr:TR_ORIENT>
</ogr:transect_fixed_single_both>
</ogr:featureMember>
<ogr:featureMember>
<ogr:transect_fixed_single_both gml:id="transect_fixed_single_both.59">
<gml:boundedBy><gml:Envelope srsName="urn:ogc:def:crs:EPSG::2154"><gml:lowerCorner>-1007698.38012491 1334641.37803232</gml:lowerCorner><gml:upperCorner>-1007697.38012491 1334641.37803232</gml:upperCorner></gml:Envelope></gml:boundedBy>
<ogr:geometryProperty><gml:LineString srsName="urn:ogc:def:crs:EPSG::2154" gml:id="transect_fixed_single_both.geom.59"><gml:posList>-1007697.38012491 1334641.37803232 -1007698.38012491 1334641.37803232</gml:posList></gml:LineString></ogr:geometryProperty>
<ogr:fid>4</ogr:fid>
<ogr:TR_FID>3</ogr:TR_FID>
<ogr:TR_ID>59</ogr:TR_ID>
<ogr:TR_SEGMENT>41</ogr:TR_SEGMENT>
<ogr:TR_ANGLE>90.00</ogr:TR_ANGLE>
<ogr:TR_LENGTH>1.000000</ogr:TR_LENGTH>
<ogr:TR_ORIENT>2</ogr:TR_ORIENT>
</ogr:transect_fixed_single_both>
</ogr:featureMember>
</ogr:FeatureCollection>

View File

@ -0,0 +1,97 @@
<?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/3.2"
xmlns:gmlsf="http://www.opengis.net/gmlsf/2.0"
elementFormDefault="qualified"
version="1.0">
<xs:annotation>
<xs:appinfo source="http://schemas.opengis.net/gmlsfProfile/2.0/gmlsfLevels.xsd">
<gmlsf:ComplianceLevel>0</gmlsf:ComplianceLevel>
</xs:appinfo>
</xs:annotation>
<xs:import namespace="http://www.opengis.net/gml/3.2" schemaLocation="http://schemas.opengis.net/gml/3.2.1/gml.xsd"/>
<xs:import namespace="http://www.opengis.net/gmlsf/2.0" schemaLocation="http://schemas.opengis.net/gmlsfProfile/2.0/gmlsfLevels.xsd"/>
<xs:element name="FeatureCollection" type="ogr:FeatureCollectionType" substitutionGroup="gml:AbstractFeature"/>
<xs:complexType name="FeatureCollectionType">
<xs:complexContent>
<xs:extension base="gml:AbstractFeatureType">
<xs:sequence minOccurs="0" maxOccurs="unbounded">
<xs:element name="featureMember">
<xs:complexType>
<xs:complexContent>
<xs:extension base="gml:AbstractFeatureMemberType">
<xs:sequence>
<xs:element ref="gml:AbstractFeature"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:element name="transect_fixed_single_both" type="ogr:transect_fixed_single_both_Type" substitutionGroup="gml:AbstractFeature"/>
<xs:complexType name="transect_fixed_single_both_Type">
<xs:complexContent>
<xs:extension base="gml:AbstractFeatureType">
<xs:sequence>
<xs:element name="geometryProperty" type="gml:CurvePropertyType" nillable="true" minOccurs="0" maxOccurs="1"/> <!-- restricted to LineString --><!-- srsName="urn:ogc:def:crs:EPSG::2154" -->
<xs:element name="fid" nillable="true" minOccurs="0" maxOccurs="1">
<xs:simpleType>
<xs:restriction base="xs:string">
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="TR_FID" 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="TR_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="TR_SEGMENT" 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="TR_ANGLE" nillable="true" minOccurs="0" maxOccurs="1">
<xs:simpleType>
<xs:restriction base="xs:decimal">
<xs:totalDigits value="6"/>
<xs:fractionDigits value="2"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="TR_LENGTH" nillable="true" minOccurs="0" maxOccurs="1">
<xs:simpleType>
<xs:restriction base="xs:decimal">
<xs:totalDigits value="21"/>
<xs:fractionDigits value="6"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="TR_ORIENT" nillable="true" minOccurs="0" maxOccurs="1">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:totalDigits value="1"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:schema>

View File

@ -2466,6 +2466,21 @@ tests:
name: expected/transect_multi_both_2_30.gml
type: vector
- algorithm: native:transectfixeddistance
name: Test (native:transectfixeddistance)
params:
ANGLE: 90.0
INPUT:
name: custom/transect_single.gml
type: vector
INTERVAL: 0.20
LENGTH: 1.0
SIDE: 2
results:
OUTPUT:
name: expected/transect_fixed_single_both.gml
type: vector
- algorithm: qgis:distancematrix
name: Linear (N*k x 3) distance matrix
params:

View File

@ -289,6 +289,8 @@ set(QGIS_ANALYSIS_SRCS
processing/qgsalgorithmtaperedbuffer.cpp
processing/qgsalgorithmtinmeshcreation.cpp
processing/qgsalgorithmtransect.cpp
processing/qgsalgorithmtransectbase.cpp
processing/qgsalgorithmtransectfixeddistance.cpp
processing/qgsalgorithmtransform.cpp
processing/qgsalgorithmtranslate.cpp
processing/qgsalgorithmtruncatetable.cpp

View File

@ -31,40 +31,6 @@ QString QgsTransectAlgorithm::displayName() const
return QObject::tr( "Transect" );
}
QStringList QgsTransectAlgorithm::tags() const
{
return QObject::tr( "transect,station,lines,extend," ).split( ',' );
}
QString QgsTransectAlgorithm::group() const
{
return QObject::tr( "Vector geometry" );
}
QString QgsTransectAlgorithm::groupId() const
{
return QStringLiteral( "vectorgeometry" );
}
void QgsTransectAlgorithm::initAlgorithm( const QVariantMap & )
{
addParameter( new QgsProcessingParameterFeatureSource( QStringLiteral( "INPUT" ), QObject::tr( "Input layer" ), QList<int>() << static_cast<int>( Qgis::ProcessingSourceType::VectorLine ) ) );
auto length = std::make_unique<QgsProcessingParameterDistance>( QStringLiteral( "LENGTH" ), QObject::tr( "Length of the transect" ), 5.0, QStringLiteral( "INPUT" ), false, 0 );
length->setIsDynamic( true );
length->setDynamicPropertyDefinition( QgsPropertyDefinition( QStringLiteral( "LENGTH" ), QObject::tr( "Length of the transect" ), QgsPropertyDefinition::DoublePositive ) );
length->setDynamicLayerParameterName( QStringLiteral( "INPUT" ) );
addParameter( length.release() );
auto angle = std::make_unique<QgsProcessingParameterNumber>( QStringLiteral( "ANGLE" ), QObject::tr( "Angle in degrees from the original line at the vertices" ), Qgis::ProcessingNumberParameterType::Double, 90.0, false, 0, 360 );
angle->setIsDynamic( true );
angle->setDynamicPropertyDefinition( QgsPropertyDefinition( QStringLiteral( "ANGLE" ), QObject::tr( "Angle in degrees" ), QgsPropertyDefinition::Double ) );
angle->setDynamicLayerParameterName( QStringLiteral( "INPUT" ) );
addParameter( angle.release() );
addParameter( new QgsProcessingParameterEnum( QStringLiteral( "SIDE" ), QObject::tr( "Side to create the transects" ), QStringList() << QObject::tr( "Left" ) << QObject::tr( "Right" ) << QObject::tr( "Both" ), false ) );
addParameter( new QgsProcessingParameterFeatureSink( QStringLiteral( "OUTPUT" ), QObject::tr( "Transect" ), Qgis::ProcessingSourceType::VectorLine ) );
}
QString QgsTransectAlgorithm::shortHelpString() const
{
return QObject::tr( "This algorithm creates transects on vertices for (multi)linestrings.\n" )
@ -79,156 +45,37 @@ QString QgsTransectAlgorithm::shortHelpString() const
+ QObject::tr( "- TR_ORIENT: Side of the transect (only on the left or right of the line, or both side)\n" );
}
QString QgsTransectAlgorithm::shortDescription() const
{
return QObject::tr( "Creates transects on vertices for (multi)linestrings." );
}
Qgis::ProcessingAlgorithmDocumentationFlags QgsTransectAlgorithm::documentationFlags() const
{
return Qgis::ProcessingAlgorithmDocumentationFlag::RegeneratesPrimaryKey;
}
QgsTransectAlgorithm *QgsTransectAlgorithm::createInstance() const
{
return new QgsTransectAlgorithm();
}
QVariantMap QgsTransectAlgorithm::processAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback *feedback )
void QgsTransectAlgorithm::addAlgorithmParams()
{
const Side orientation = static_cast<QgsTransectAlgorithm::Side>( parameterAsInt( parameters, QStringLiteral( "SIDE" ), context ) );
const double angle = fabs( parameterAsDouble( parameters, QStringLiteral( "ANGLE" ), context ) );
const bool dynamicAngle = QgsProcessingParameters::isDynamic( parameters, QStringLiteral( "ANGLE" ) );
QgsProperty angleProperty;
if ( dynamicAngle )
angleProperty = parameters.value( QStringLiteral( "ANGLE" ) ).value<QgsProperty>();
double length = parameterAsDouble( parameters, QStringLiteral( "LENGTH" ), context );
const bool dynamicLength = QgsProcessingParameters::isDynamic( parameters, QStringLiteral( "LENGTH" ) );
QgsProperty lengthProperty;
if ( dynamicLength )
lengthProperty = parameters.value( QStringLiteral( "LENGTH" ) ).value<QgsProperty>();
if ( orientation == QgsTransectAlgorithm::Both )
length /= 2.0;
std::unique_ptr<QgsFeatureSource> source( parameterAsSource( parameters, QStringLiteral( "INPUT" ), context ) );
if ( !source )
throw QgsProcessingException( invalidSourceError( parameters, QStringLiteral( "INPUT" ) ) );
QgsExpressionContext expressionContext = createExpressionContext( parameters, context, dynamic_cast<QgsProcessingFeatureSource *>( source.get() ) );
QgsFields newFields;
newFields.append( QgsField( QStringLiteral( "TR_FID" ), QMetaType::Type::Int, QString(), 20 ) );
newFields.append( QgsField( QStringLiteral( "TR_ID" ), QMetaType::Type::Int, QString(), 20 ) );
newFields.append( QgsField( QStringLiteral( "TR_SEGMENT" ), QMetaType::Type::Int, QString(), 20 ) );
newFields.append( QgsField( QStringLiteral( "TR_ANGLE" ), QMetaType::Type::Double, QString(), 5, 2 ) );
newFields.append( QgsField( QStringLiteral( "TR_LENGTH" ), QMetaType::Type::Double, QString(), 20, 6 ) );
newFields.append( QgsField( QStringLiteral( "TR_ORIENT" ), QMetaType::Type::Int, QString(), 1 ) );
QgsFields fields = QgsProcessingUtils::combineFields( source->fields(), newFields );
Qgis::WkbType outputWkb = Qgis::WkbType::LineString;
if ( QgsWkbTypes::hasZ( source->wkbType() ) )
outputWkb = QgsWkbTypes::addZ( outputWkb );
if ( QgsWkbTypes::hasM( source->wkbType() ) )
outputWkb = QgsWkbTypes::addM( outputWkb );
QString dest;
std::unique_ptr<QgsFeatureSink> sink( parameterAsSink( parameters, QStringLiteral( "OUTPUT" ), context, dest, fields, outputWkb, source->sourceCrs(), QgsFeatureSink::RegeneratePrimaryKey ) );
if ( !sink )
throw QgsProcessingException( invalidSinkError( parameters, QStringLiteral( "OUTPUT" ) ) );
QgsFeatureIterator features = source->getFeatures();
int current = -1;
int number = 0;
const double step = source->featureCount() > 0 ? 100.0 / source->featureCount() : 1;
QgsFeature feat;
while ( features.nextFeature( feat ) )
{
current++;
if ( feedback->isCanceled() )
{
break;
}
feedback->setProgress( current * step );
if ( !feat.hasGeometry() )
continue;
QgsGeometry inputGeometry = feat.geometry();
if ( dynamicLength || dynamicAngle )
{
expressionContext.setFeature( feat );
}
double evaluatedLength = length;
if ( dynamicLength )
evaluatedLength = lengthProperty.valueAsDouble( context.expressionContext(), length );
double evaluatedAngle = angle;
if ( dynamicAngle )
evaluatedAngle = angleProperty.valueAsDouble( context.expressionContext(), angle );
inputGeometry.convertToMultiType();
const QgsMultiLineString *multiLine = static_cast<const QgsMultiLineString *>( inputGeometry.constGet() );
for ( int id = 0; id < multiLine->numGeometries(); ++id )
{
const QgsLineString *line = multiLine->lineStringN( id );
QgsAbstractGeometry::vertex_iterator it = line->vertices_begin();
while ( it != line->vertices_end() )
{
const QgsVertexId vertexId = it.vertexId();
const int i = vertexId.vertex;
QgsFeature outFeat;
QgsAttributes attrs = feat.attributes();
attrs << current << number << i + 1 << evaluatedAngle << ( ( orientation == QgsTransectAlgorithm::Both ) ? evaluatedLength * 2 : evaluatedLength ) << orientation;
outFeat.setAttributes( attrs );
const double angleAtVertex = line->vertexAngle( vertexId );
outFeat.setGeometry( calcTransect( *it, angleAtVertex, evaluatedLength, orientation, evaluatedAngle ) );
if ( !sink->addFeature( outFeat, QgsFeatureSink::FastInsert ) )
throw QgsProcessingException( writeFeatureError( sink.get(), parameters, QStringLiteral( "OUTPUT" ) ) );
number++;
it++;
}
}
}
sink->finalize();
QVariantMap outputs;
outputs.insert( QStringLiteral( "OUTPUT" ), dest );
return outputs;
// No additional parameters for the basic transect algorithm (vertex-based only)
}
QgsGeometry QgsTransectAlgorithm::calcTransect( const QgsPoint &point, const double angleAtVertex, const double length, const QgsTransectAlgorithm::Side orientation, const double angle )
bool QgsTransectAlgorithm::prepareAlgorithmTransectParameters( const QVariantMap &, QgsProcessingContext &, QgsProcessingFeedback * )
{
QgsPoint pLeft; // left point of the line
QgsPoint pRight; // right point of the line
QgsPolyline line;
if ( ( orientation == QgsTransectAlgorithm::Right ) || ( orientation == QgsTransectAlgorithm::Both ) )
{
pLeft = point.project( length, angle + 180.0 / M_PI * angleAtVertex );
if ( orientation != QgsTransectAlgorithm::Both )
pRight = point;
}
if ( ( orientation == QgsTransectAlgorithm::Left ) || ( orientation == QgsTransectAlgorithm::Both ) )
{
pRight = point.project( -length, angle + 180.0 / M_PI * angleAtVertex );
if ( orientation != QgsTransectAlgorithm::Both )
pLeft = point;
}
line.append( pLeft );
line.append( pRight );
return QgsGeometry::fromPolyline( line );
// No additional preparation needed for basic transect algorithm
return true;
}
///@endcond
std::vector<QgsPoint> QgsTransectAlgorithm::generateSamplingPoints( const QgsLineString &line, const QVariantMap &, QgsProcessingContext & )
{
std::vector<QgsPoint> samplingPoints;
// Vertex-based sampling only (like original master algorithm)
for ( auto it = line.vertices_begin(); it != line.vertices_end(); ++it )
samplingPoints.push_back( *it );
return samplingPoints;
}
double QgsTransectAlgorithm::calculateAzimuth( const QgsLineString &line, const QgsPoint &, int pointIndex )
{
// For vertex-based sampling, use vertex angle directly (like original master algorithm)
return line.vertexAngle( QgsVertexId( 0, 0, pointIndex ) );
}
///@endcond

View File

@ -21,50 +21,27 @@
#define SIP_NO_FILE
#include "qgis_sip.h"
#include "qgsprocessingalgorithm.h"
#include "qgsalgorithmtransectbase.h"
///@cond PRIVATE
/**
* Native transect algorithm.
*/
class QgsTransectAlgorithm : public QgsProcessingAlgorithm
class QgsTransectAlgorithm : public QgsTransectAlgorithmBase
{
public:
/**
* Draw the transect on which side of the line
*/
enum Side
{
Left,
Right,
Both
};
QgsTransectAlgorithm() = default;
void initAlgorithm( const QVariantMap &configuration = QVariantMap() ) override;
QString name() const override;
QString displayName() const override;
QStringList tags() const override;
QString group() const override;
QString groupId() const override;
QString shortHelpString() const override;
QString shortDescription() const override;
Qgis::ProcessingAlgorithmDocumentationFlags documentationFlags() const override;
QgsTransectAlgorithm *createInstance() const override SIP_FACTORY;
protected:
QVariantMap processAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback *feedback ) override;
private:
/**
* Returns the transect of the point \a point with \a length, \a orientation and \a angle.
* \param point The vertex
* \param angleAtVertex Angle at the vertex
* \param length Length of the transect Distance to extend line from input feature
* \param orientation Orientation of the transect
* \param angle Angle of the transect relative to the segment [\a p1 - \a p2] (degrees clockwise)
*/
QgsGeometry calcTransect( const QgsPoint &point, double angleAtVertex, double length, Side orientation, double angle );
void addAlgorithmParams() override;
bool prepareAlgorithmTransectParameters( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback *feedback ) override;
std::vector<QgsPoint> generateSamplingPoints( const QgsLineString &line, const QVariantMap &parameters, QgsProcessingContext &context ) override;
double calculateAzimuth( const QgsLineString &line, const QgsPoint &point, int pointIndex ) override;
};
///@endcond PRIVATE

View File

@ -0,0 +1,221 @@
/***************************************************************************
qgsalgorithmtransectbase.cpp
----------------------------
begin : September 2025
copyright : (C) 2025 by Loïc Bartoletti
email : loic dot bartoletti at oslandia dot com
***************************************************************************/
/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#include "qgsalgorithmtransectbase.h"
#include "qgsmultilinestring.h"
#include "qgslinestring.h"
///@cond PRIVATE
QString QgsTransectAlgorithmBase::group() const
{
return QObject::tr( "Vector geometry" );
}
QString QgsTransectAlgorithmBase::groupId() const
{
return QStringLiteral( "vectorgeometry" );
}
QStringList QgsTransectAlgorithmBase::tags() const
{
return QObject::tr( "transect,station,lines,extend" ).split( ',' );
}
QString QgsTransectAlgorithmBase::shortDescription() const
{
return QObject::tr( "Creates transects for (multi)linestrings." );
}
Qgis::ProcessingAlgorithmDocumentationFlags QgsTransectAlgorithmBase::documentationFlags() const
{
return Qgis::ProcessingAlgorithmDocumentationFlag::RegeneratesPrimaryKey;
}
void QgsTransectAlgorithmBase::initAlgorithm( const QVariantMap & )
{
addParameter( new QgsProcessingParameterFeatureSource( QStringLiteral( "INPUT" ), QObject::tr( "Input layer" ), QList<int>() << static_cast<int>( Qgis::ProcessingSourceType::VectorLine ) ) );
auto length = std::make_unique<QgsProcessingParameterDistance>( QStringLiteral( "LENGTH" ), QObject::tr( "Length of the transect" ), 5.0, QStringLiteral( "INPUT" ), false, 0 );
length->setIsDynamic( true );
length->setDynamicPropertyDefinition( QgsPropertyDefinition( QStringLiteral( "LENGTH" ), QObject::tr( "Length of the transect" ), QgsPropertyDefinition::DoublePositive ) );
length->setDynamicLayerParameterName( QStringLiteral( "INPUT" ) );
addParameter( length.release() );
auto angle = std::make_unique<QgsProcessingParameterNumber>( QStringLiteral( "ANGLE" ), QObject::tr( "Angle in degrees from the original line at the vertices" ), Qgis::ProcessingNumberParameterType::Double, 90.0, false, 0, 360 );
angle->setIsDynamic( true );
angle->setDynamicPropertyDefinition( QgsPropertyDefinition( QStringLiteral( "ANGLE" ), QObject::tr( "Angle in degrees" ), QgsPropertyDefinition::Double ) );
angle->setDynamicLayerParameterName( QStringLiteral( "INPUT" ) );
addParameter( angle.release() );
addParameter( new QgsProcessingParameterEnum( QStringLiteral( "SIDE" ), QObject::tr( "Side to create the transects" ), QStringList() << QObject::tr( "Left" ) << QObject::tr( "Right" ) << QObject::tr( "Both" ), false ) );
// Allow subclasses to add their specific parameters
addAlgorithmParams();
addParameter( new QgsProcessingParameterFeatureSink( QStringLiteral( "OUTPUT" ), QObject::tr( "Transect" ), Qgis::ProcessingSourceType::VectorLine ) );
}
QVariantMap QgsTransectAlgorithmBase::processAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback *feedback )
{
mOrientation = static_cast<QgsTransectAlgorithmBase::Side>( parameterAsInt( parameters, QStringLiteral( "SIDE" ), context ) );
mAngle = fabs( parameterAsDouble( parameters, QStringLiteral( "ANGLE" ), context ) );
mDynamicAngle = QgsProcessingParameters::isDynamic( parameters, QStringLiteral( "ANGLE" ) );
if ( mDynamicAngle )
mAngleProperty = parameters.value( QStringLiteral( "ANGLE" ) ).value<QgsProperty>();
mLength = parameterAsDouble( parameters, QStringLiteral( "LENGTH" ), context );
mDynamicLength = QgsProcessingParameters::isDynamic( parameters, QStringLiteral( "LENGTH" ) );
if ( mDynamicLength )
mLengthProperty = parameters.value( QStringLiteral( "LENGTH" ) ).value<QgsProperty>();
if ( mOrientation == QgsTransectAlgorithmBase::Both )
mLength /= 2.0;
// Let subclass prepare their specific parameters
if ( !prepareAlgorithmTransectParameters( parameters, context, feedback ) )
return QVariantMap();
std::unique_ptr<QgsFeatureSource> source( parameterAsSource( parameters, QStringLiteral( "INPUT" ), context ) );
if ( !source )
throw QgsProcessingException( invalidSourceError( parameters, QStringLiteral( "INPUT" ) ) );
QgsExpressionContext expressionContext = createExpressionContext( parameters, context, dynamic_cast<QgsProcessingFeatureSource *>( source.get() ) );
QgsFields newFields;
newFields.append( QgsField( QStringLiteral( "TR_FID" ), QMetaType::Type::Int, QString(), 20 ) );
newFields.append( QgsField( QStringLiteral( "TR_ID" ), QMetaType::Type::Int, QString(), 20 ) );
newFields.append( QgsField( QStringLiteral( "TR_SEGMENT" ), QMetaType::Type::Int, QString(), 20 ) );
newFields.append( QgsField( QStringLiteral( "TR_ANGLE" ), QMetaType::Type::Double, QString(), 5, 2 ) );
newFields.append( QgsField( QStringLiteral( "TR_LENGTH" ), QMetaType::Type::Double, QString(), 20, 6 ) );
newFields.append( QgsField( QStringLiteral( "TR_ORIENT" ), QMetaType::Type::Int, QString(), 1 ) );
QgsFields fields = QgsProcessingUtils::combineFields( source->fields(), newFields );
Qgis::WkbType outputWkb = Qgis::WkbType::LineString;
if ( QgsWkbTypes::hasZ( source->wkbType() ) )
outputWkb = QgsWkbTypes::addZ( outputWkb );
if ( QgsWkbTypes::hasM( source->wkbType() ) )
outputWkb = QgsWkbTypes::addM( outputWkb );
QString dest;
std::unique_ptr<QgsFeatureSink> sink( parameterAsSink( parameters, QStringLiteral( "OUTPUT" ), context, dest, fields, outputWkb, source->sourceCrs(), QgsFeatureSink::RegeneratePrimaryKey ) );
if ( !sink )
throw QgsProcessingException( invalidSinkError( parameters, QStringLiteral( "OUTPUT" ) ) );
QgsFeatureIterator features = source->getFeatures();
int current = -1;
int number = 0;
const double step = source->featureCount() > 0 ? 100.0 / source->featureCount() : 1;
QgsFeature feat;
while ( features.nextFeature( feat ) )
{
current++;
if ( feedback->isCanceled() )
{
break;
}
feedback->setProgress( current * step );
if ( !feat.hasGeometry() )
continue;
QgsGeometry inputGeometry = feat.geometry();
if ( mDynamicLength || mDynamicAngle )
{
expressionContext.setFeature( feat );
}
double evaluatedLength = mLength;
if ( mDynamicLength )
evaluatedLength = mLengthProperty.valueAsDouble( context.expressionContext(), mLength );
double evaluatedAngle = mAngle;
if ( mDynamicAngle )
evaluatedAngle = mAngleProperty.valueAsDouble( context.expressionContext(), mAngle );
inputGeometry.convertToMultiType();
const QgsMultiLineString *multiLine = static_cast<const QgsMultiLineString *>( inputGeometry.constGet() );
for ( int part = 0; part < multiLine->numGeometries(); ++part )
{
const QgsLineString *lineString = multiLine->lineStringN( part );
if ( !lineString )
continue;
QgsLineString line = *lineString;
// Let subclass generate sampling points using their specific strategy
std::vector<QgsPoint> samplingPoints = generateSamplingPoints( line, parameters, context );
for ( int i = 0; i < static_cast<int>( samplingPoints.size() ); ++i )
{
const QgsPoint &pt = samplingPoints[i];
// Let subclass calculate azimuth using their specific method
double azimuth = calculateAzimuth( line, pt, i );
QgsFeature outFeat;
QgsAttributes attrs = feat.attributes();
attrs << current << number << i + 1 << evaluatedAngle
<< ( ( mOrientation == QgsTransectAlgorithmBase::Both ) ? evaluatedLength * 2 : evaluatedLength )
<< static_cast<int>( mOrientation );
outFeat.setAttributes( attrs );
outFeat.setGeometry( calcTransect( pt, azimuth, evaluatedLength, mOrientation, evaluatedAngle ) );
if ( !sink->addFeature( outFeat, QgsFeatureSink::FastInsert ) )
throw QgsProcessingException( writeFeatureError( sink.get(), parameters, QStringLiteral( "OUTPUT" ) ) );
number++;
}
}
}
sink->finalize();
QVariantMap outputs;
outputs.insert( QStringLiteral( "OUTPUT" ), dest );
return outputs;
}
QgsGeometry QgsTransectAlgorithmBase::calcTransect( const QgsPoint &point, const double angleAtVertex, const double length, const QgsTransectAlgorithmBase::Side orientation, const double angle )
{
QgsPoint pLeft; // left point of the line
QgsPoint pRight; // right point of the line
QgsPolyline line;
if ( ( orientation == QgsTransectAlgorithmBase::Right ) || ( orientation == QgsTransectAlgorithmBase::Both ) )
{
pLeft = point.project( length, angle + 180.0 / M_PI * angleAtVertex );
if ( orientation != QgsTransectAlgorithmBase::Both )
pRight = point;
}
if ( ( orientation == QgsTransectAlgorithmBase::Left ) || ( orientation == QgsTransectAlgorithmBase::Both ) )
{
pRight = point.project( -length, angle + 180.0 / M_PI * angleAtVertex );
if ( orientation != QgsTransectAlgorithmBase::Both )
pLeft = point;
}
line.append( pLeft );
line.append( pRight );
return QgsGeometry::fromPolyline( line );
}
///@endcond

View File

@ -0,0 +1,97 @@
/***************************************************************************
qgsalgorithmtransectbase.h
-------------------------
begin : September 2025
copyright : (C) 2025 by Loïc Bartoletti
email : loic dot bartoletti at oslandia dot com
***************************************************************************/
/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#ifndef QGSALGORITHMTRANSECTBASE_H
#define QGSALGORITHMTRANSECTBASE_H
#define SIP_NO_FILE
#include "qgis_sip.h"
#include "qgsprocessingalgorithm.h"
///@cond PRIVATE
/**
* Base class for transect algorithms.
*/
class QgsTransectAlgorithmBase : public QgsProcessingAlgorithm
{
public:
/**
* Draw the transect on which side of the line
*/
enum Side
{
Left,
Right,
Both
};
QString group() const final;
QString groupId() const final;
QStringList tags() const override;
QString shortDescription() const override;
Qgis::ProcessingAlgorithmDocumentationFlags documentationFlags() const final;
void initAlgorithm( const QVariantMap &configuration = QVariantMap() ) final;
protected:
/**
* Adds specific subclass algorithm parameters. The common parameters (INPUT, LENGTH, ANGLE, SIDE, OUTPUT)
* are automatically added by the base class.
*/
virtual void addAlgorithmParams() = 0;
/**
* Prepares the transect algorithm subclass for execution.
*/
virtual bool prepareAlgorithmTransectParameters( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback *feedback ) = 0;
/**
* Processes a line geometry using the specific sampling strategy implemented in subclasses.
*/
QVariantMap processAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback *feedback ) final;
/**
* Pure virtual method that generates sampling points along a line geometry.
* Subclasses implement their specific sampling strategy here.
*/
virtual std::vector<QgsPoint> generateSamplingPoints( const QgsLineString &line, const QVariantMap &parameters, QgsProcessingContext &context ) = 0;
/**
* Calculate the azimuth at a given point for transect orientation.
* Subclasses can override this if they need different azimuth calculation.
*/
virtual double calculateAzimuth( const QgsLineString &line, const QgsPoint &point, int pointIndex ) = 0;
/**
* Returns the transect geometry at the specified point.
*/
static QgsGeometry calcTransect( const QgsPoint &point, double angleAtVertex, double length, Side orientation, double angle );
// Shared member variables accessible to subclasses
Side mOrientation = Both;
double mAngle = 90.0;
double mLength = 5.0;
bool mDynamicAngle = false;
bool mDynamicLength = false;
QgsProperty mAngleProperty;
QgsProperty mLengthProperty;
};
///@endcond PRIVATE
#endif // QGSALGORITHMTRANSECTBASE_H

View File

@ -0,0 +1,99 @@
/***************************************************************************
qgsalgorithmtransectfixeddistance.cpp
-------------------------------------
begin : September 2025
copyright : (C) 2025 by Loïc Bartoletti
email : loic dot bartoletti at oslandia dot com
***************************************************************************/
/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#include "qgsalgorithmtransectfixeddistance.h"
#include "qgsmultilinestring.h"
#include "qgslinestring.h"
///@cond PRIVATE
QString QgsTransectFixedDistanceAlgorithm::name() const
{
return QStringLiteral( "transectfixeddistance" );
}
QString QgsTransectFixedDistanceAlgorithm::displayName() const
{
return QObject::tr( "Transect (fixed distance)" );
}
QStringList QgsTransectFixedDistanceAlgorithm::tags() const
{
return QObject::tr( "transect,station,lines,extend,fixed,interval,distance" ).split( ',' );
}
QString QgsTransectFixedDistanceAlgorithm::shortHelpString() const
{
return QObject::tr( "This algorithm creates transects at fixed distance intervals along (multi)linestrings.\n" )
+ QObject::tr( "A transect is a line oriented from an angle (by default perpendicular) to the input polylines at regular intervals." )
+ QStringLiteral( "\n\n" )
+ QObject::tr( "Field(s) from feature(s) are returned in the transect with these new fields:\n" )
+ QObject::tr( "- TR_FID: ID of the original feature\n" )
+ QObject::tr( "- TR_ID: ID of the transect. Each transect have an unique ID\n" )
+ QObject::tr( "- TR_SEGMENT: ID of the segment of the linestring\n" )
+ QObject::tr( "- TR_ANGLE: Angle in degrees from the original line at the vertex\n" )
+ QObject::tr( "- TR_LENGTH: Total length of the transect returned\n" )
+ QObject::tr( "- TR_ORIENT: Side of the transect (only on the left or right of the line, or both side)\n" );
}
QString QgsTransectFixedDistanceAlgorithm::shortDescription() const
{
return QObject::tr( "Creates transects at fixed distance intervals along (multi)linestrings." );
}
QgsTransectFixedDistanceAlgorithm *QgsTransectFixedDistanceAlgorithm::createInstance() const
{
return new QgsTransectFixedDistanceAlgorithm();
}
void QgsTransectFixedDistanceAlgorithm::addAlgorithmParams()
{
addParameter( new QgsProcessingParameterNumber( QStringLiteral( "INTERVAL" ), QObject::tr( "Fixed sampling interval" ), Qgis::ProcessingNumberParameterType::Double, 10.0, false, 0 ) );
}
bool QgsTransectFixedDistanceAlgorithm::prepareAlgorithmTransectParameters( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback * )
{
mInterval = parameterAsDouble( parameters, QStringLiteral( "INTERVAL" ), context );
return true;
}
std::vector<QgsPoint> QgsTransectFixedDistanceAlgorithm::generateSamplingPoints( const QgsLineString &line, const QVariantMap &, QgsProcessingContext & )
{
std::vector<QgsPoint> samplingPoints;
// Sample points at fixed intervals
double totalLength = line.length();
for ( double d = 0; d <= totalLength; d += mInterval )
{
QgsPoint *pt = line.interpolatePoint( d );
samplingPoints.push_back( *pt );
}
return samplingPoints;
}
double QgsTransectFixedDistanceAlgorithm::calculateAzimuth( const QgsLineString &line, const QgsPoint &point, int )
{
// For fixed distance sampling, find closest segment
QgsPoint segPt;
QgsVertexId vid;
line.closestSegment( point, segPt, vid, nullptr, Qgis::DEFAULT_SEGMENT_EPSILON );
QgsVertexId prev( vid.part, vid.ring, vid.vertex - 1 );
return line.vertexAt( prev ).azimuth( line.vertexAt( vid ) ) * M_PI / 180.0;
}
///@endcond

View File

@ -0,0 +1,54 @@
/***************************************************************************
qgsalgorithmtransectfixeddistance.h
------------------------------------
begin : September 2025
copyright : (C) 2025 by Loïc Bartoletti
email : loic dot bartoletti at oslandia dot com
***************************************************************************/
/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#ifndef QGSALGORITHMTRANSECTFIXEDDISTANCE_H
#define QGSALGORITHMTRANSECTFIXEDDISTANCE_H
#define SIP_NO_FILE
#include "qgis_sip.h"
#include "qgsalgorithmtransectbase.h"
///@cond PRIVATE
/**
* Native transect (fixed distance) algorithm.
*/
class QgsTransectFixedDistanceAlgorithm : public QgsTransectAlgorithmBase
{
public:
QgsTransectFixedDistanceAlgorithm() = default;
QString name() const override;
QString displayName() const override;
QStringList tags() const override;
QString shortHelpString() const override;
QString shortDescription() const override;
QgsTransectFixedDistanceAlgorithm *createInstance() const override SIP_FACTORY;
protected:
void addAlgorithmParams() override;
bool prepareAlgorithmTransectParameters( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback *feedback ) override;
std::vector<QgsPoint> generateSamplingPoints( const QgsLineString &line, const QVariantMap &parameters, QgsProcessingContext &context ) override;
double calculateAzimuth( const QgsLineString &line, const QgsPoint &point, int pointIndex ) override;
private:
double mInterval = 10.0;
};
///@endcond PRIVATE
#endif // QGSALGORITHMTRANSECTFIXEDDISTANCE_H

View File

@ -271,6 +271,7 @@
#include "qgsalgorithmtaperedbuffer.h"
#include "qgsalgorithmtinmeshcreation.h"
#include "qgsalgorithmtransect.h"
#include "qgsalgorithmtransectfixeddistance.h"
#include "qgsalgorithmtransform.h"
#include "qgsalgorithmtranslate.h"
#include "qgsalgorithmtruncatetable.h"
@ -636,6 +637,7 @@ void QgsNativeAlgorithms::loadAlgorithms()
addAlgorithm( new QgsTaperedBufferAlgorithm() );
addAlgorithm( new QgsTinMeshCreationAlgorithm() );
addAlgorithm( new QgsTransectAlgorithm() );
addAlgorithm( new QgsTransectFixedDistanceAlgorithm() );
addAlgorithm( new QgsTransferAnnotationsFromMainAlgorithm() );
addAlgorithm( new QgsTransformAlgorithm() );
addAlgorithm( new QgsTranslateAlgorithm() );