@@ -236,9 +236,10 @@ private static int ProcessPolygon(Polygon polygon, int dimension, List<double> e
236236 elemInfoList . Add ( 1 ) ;
237237
238238 var exteriorRingCoords = polygon . ExteriorRing . CoordinateSequence ;
239- pos += Algorithm . Orientation . IsCCW ( exteriorRingCoords )
239+ pos += AddOrdinates ( exteriorRingCoords , dimension , ordinateList , LinearRingOrientation . CounterClockwise ) ;
240+ /* Algorithm.Orientation.IsCCW(exteriorRingCoords)
240241 ? AddOrdinates(exteriorRingCoords, dimension, ordinateList)
241- : AddOrdinatesInReverse ( exteriorRingCoords , dimension , ordinateList ) ;
242+ : AddOrdinatesInReverse(exteriorRingCoords, dimension, ordinateList);*/
242243
243244 int interiorRingCount = polygon . NumInteriorRings ;
244245 for ( int i = 0 ; i < interiorRingCount ; i ++ )
@@ -248,9 +249,10 @@ private static int ProcessPolygon(Polygon polygon, int dimension, List<double> e
248249 elemInfoList . Add ( 1 ) ;
249250
250251 var interiorRingCoords = polygon . GetInteriorRingN ( i ) . CoordinateSequence ;
251- pos += Algorithm . Orientation . IsCCW ( interiorRingCoords )
252+ pos += AddOrdinates ( interiorRingCoords , dimension , ordinateList , LinearRingOrientation . Clockwise ) ;
253+ /*Algorithm.Orientation.IsCCW(interiorRingCoords)
252254 ? AddOrdinatesInReverse(interiorRingCoords, dimension, ordinateList)
253- : AddOrdinates ( interiorRingCoords , dimension , ordinateList ) ;
255+ : AddOrdinates(interiorRingCoords, dimension, ordinateList);*/
254256 }
255257
256258 return pos ;
@@ -300,20 +302,28 @@ private static int ProcessMultiPolygon(MultiPolygon multiPolygon, int dimension,
300302 return pos ;
301303 }
302304
303- private static int AddOrdinates ( CoordinateSequence sequence , int dimension , List < double > ords )
304- {
305- int numOfPoints = sequence . Count ;
306- for ( int i = 0 ; i < numOfPoints ; i ++ )
305+ //private enum RingOrientation
306+
307+ private static int AddOrdinates ( CoordinateSequence sequence , int dimension , List < double > ords ,
308+ LinearRingOrientation orientation = LinearRingOrientation . DontCare )
309+ {
310+ switch ( orientation )
307311 {
308- ords . Add ( ( double ) sequence . GetX ( i ) ) ;
309- ords . Add ( ( double ) sequence . GetY ( i ) ) ;
310- if ( dimension == 3 )
311- {
312- ords . Add ( ( double ) sequence . GetZ ( i ) ) ;
313- }
312+ case LinearRingOrientation . CounterClockwise :
313+ if ( ! Algorithm . Orientation . IsCCW ( sequence ) ) sequence = sequence . Reversed ( ) ;
314+ break ;
315+ case LinearRingOrientation . Clockwise :
316+ if ( Algorithm . Orientation . IsCCW ( sequence ) ) sequence = sequence . Reversed ( ) ;
317+ break ;
314318 }
315319
316- return numOfPoints * dimension ;
320+ for ( int i = 0 ; i < sequence . Count ; i ++ )
321+ {
322+ for ( int j = 0 ; j < sequence . Dimension ; j ++ )
323+ ords . Add ( sequence . GetOrdinate ( i , j ) ) ;
324+ }
325+
326+ return sequence . Count * dimension ;
317327 }
318328
319329 private static int AddOrdinatesInReverse ( CoordinateSequence sequence , int dimension , List < double > ords )
@@ -322,28 +332,25 @@ private static int AddOrdinatesInReverse(CoordinateSequence sequence, int dimens
322332
323333 for ( int i = numOfPoints - 1 ; i >= 0 ; i -- )
324334 {
325- ords . Add ( ( double ) sequence . GetX ( i ) ) ;
326- ords . Add ( ( double ) sequence . GetY ( i ) ) ;
327- if ( dimension == 3 )
328- {
329- ords . Add ( ( double ) sequence . GetZ ( i ) ) ;
330- }
335+ for ( int j = 0 ; j < sequence . Dimension ; j ++ )
336+ ords . Add ( sequence . GetOrdinate ( i , j ) ) ;
331337 }
332338
333339 return numOfPoints * dimension ;
334340 }
335341
336342 private static int GType ( Geometry geom , out int dimension )
337343 {
338- dimension = Dimension ( geom ) ;
339- return dimension * 1000 + ( int ) Template ( geom ) ;
344+ DimensionAndMeasure ( geom , out dimension , out int measure ) ;
345+ return dimension * 1000 + measure * 100 + ( int ) Template ( geom ) ;
340346 }
341347
342- private static int Dimension ( Geometry geom )
348+ private static void DimensionAndMeasure ( Geometry geom , out int dimension , out int measure )
343349 {
344- var sdd = new SpatialDimensionDeterminator ( ) ;
350+ var sdd = new DimensionAndMeasureDeterminator ( ) ;
345351 geom . Apply ( sdd ) ;
346- return sdd . NumSpatialDimensions ;
352+ dimension = sdd . Dimension ;
353+ measure = sdd . Measure ;
347354 }
348355
349356 private static SdoGTemplate Template ( Geometry geom )
@@ -382,14 +389,22 @@ private static SdoGTemplate Template(Geometry geom)
382389 }
383390 }
384391
385- private class SpatialDimensionDeterminator : IEntireCoordinateSequenceFilter
392+ private class DimensionAndMeasureDeterminator : IEntireCoordinateSequenceFilter
386393 {
387394 public void Filter ( CoordinateSequence sequence )
388395 {
389- NumSpatialDimensions = sequence . Dimension - sequence . Measures ;
396+ bool hasMeasure = sequence . Measures > 0 ;
397+ Dimension = Math . Min ( sequence . Dimension , 4 ) ;
398+ if ( hasMeasure )
399+ Measure = Dimension ;
400+
390401 Done = true ;
391402 }
392- public int NumSpatialDimensions { get ; private set ; } = 2 ;
403+
404+ public int Dimension { get ; private set ; } = 2 ;
405+
406+ public int Measure { get ; private set ; } = 0 ;
407+
393408 public bool Done { get ; private set ; }
394409 public bool GeometryChanged => false ;
395410 }
0 commit comments