Skip to content

Commit

Permalink
Introducing Traversing with a IWktTraverseHandler interface
Browse files Browse the repository at this point in the history
WktToProjConverter is an implementation example of this interface.

ParseAllWKTs unittest succeeds.
  • Loading branch information
driekus77 committed Jul 20, 2024
1 parent 06ddf4c commit 0539e85
Show file tree
Hide file tree
Showing 20 changed files with 689 additions and 67 deletions.
20 changes: 3 additions & 17 deletions src/ProjNet/Wkt/Tree/IWktObject.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,25 +12,11 @@ public interface IWktObject
string Keyword { get; }


/// <summary>
/// Set Left Delimiter. (For semantic checking).
/// </summary>
/// <param name="leftDelimiter"></param>
/// <returns></returns>
IWktObject SetLeftDelimiter(char leftDelimiter);

/// <summary>
/// Set Right Delimiter. (For semantic checking).
/// </summary>
/// <param name="rightDelimiter"></param>
/// <returns></returns>
IWktObject SetRightDelimiter(char rightDelimiter);

/// <summary>
/// Cast function to reach the "lower" interfaces.
/// Traverse this object and its descendants calling the handler as we go down.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
T As<T>() where T : IWktObject;
/// <param name="handler"></param>
void Traverse(IWktTraverseHandler handler);
}
}
41 changes: 41 additions & 0 deletions src/ProjNet/Wkt/Tree/IWktTraverseHandler.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
using System.Collections.Generic;

namespace ProjNet.Wkt.Tree
{
/// <summary>
/// IWktTraverseHandler interface for traveling a WktObject tree.
/// </summary>
public interface IWktTraverseHandler
{

/// <summary>
/// Handle method for WktAuthority.
/// </summary>
/// <param name="authority"></param>
void Handle(WktAuthority authority);

void Handle(WktAxis axis);

void Handle(WktDatum datum);

void Handle(WktEllipsoid ellipsoid);

void Handle(WktSpheroid spheroid);

void Handle(WktExtension extension);

void Handle(WktUnit unit);

void Handle(WktParameter parameter);

void Handle(WktPrimeMeridian meridian);

void Handle(WktProjection projection);

void Handle(WktToWgs84 toWgs84);

void Handle(WktGeocentricCoordinateSystem cs);
void Handle(WktGeographicCoordinateSystem cs);
void Handle(WktProjectedCoordinateSystem cs);
}
}
6 changes: 6 additions & 0 deletions src/ProjNet/Wkt/Tree/WktAuthority.cs
Original file line number Diff line number Diff line change
Expand Up @@ -86,5 +86,11 @@ public override int GetHashCode()
return ((Name != null ? Name.GetHashCode() : 0) * 397) ^ Code.GetHashCode();
}
}

/// <inheritdoc/>>
public override void Traverse(IWktTraverseHandler handler)
{
handler.Handle(this);
}
}
}
7 changes: 7 additions & 0 deletions src/ProjNet/Wkt/Tree/WktAxis.cs
Original file line number Diff line number Diff line change
Expand Up @@ -90,5 +90,12 @@ public override int GetHashCode()
return ((Name != null ? Name.GetHashCode() : 0) * 397) ^ (int) Direction;
}
}


/// <inheritdoc/>>
public override void Traverse(IWktTraverseHandler handler)
{
handler.Handle(this);
}
}
}
30 changes: 3 additions & 27 deletions src/ProjNet/Wkt/Tree/WktBaseObject.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ namespace ProjNet.Wkt.Tree
/// <summary>
/// Base class for all WKT Objects.
/// </summary>
public class WktBaseObject : IWktObject
public abstract class WktBaseObject : IWktObject
{
/// <inheritdoc/>
public string Keyword { get; internal set; }
Expand All @@ -21,21 +21,6 @@ public class WktBaseObject : IWktObject
public char RightDelimiter { get; set; }


/// <inheritdoc/>
public virtual IWktObject SetLeftDelimiter(char leftDelimiter)
{
LeftDelimiter = leftDelimiter;
return this;
}

/// <inheritdoc/>
public virtual IWktObject SetRightDelimiter(char rightDelimiter)
{
RightDelimiter = rightDelimiter;
return this;
}


/// <summary>
/// Constructor for all Wkt Object's.
/// </summary>
Expand All @@ -57,17 +42,8 @@ public WktBaseObject(string keyword = null, char left = '[', char right = ']')
}



/// <summary>
/// Cast function for all IWktObject"s.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
public virtual T As<T>() where T : IWktObject
{
return (T) Convert.ChangeType(this, typeof(T));
}

/// <inheritdoc/>
public abstract void Traverse(IWktTraverseHandler handler);

}
}
10 changes: 10 additions & 0 deletions src/ProjNet/Wkt/Tree/WktCoordinateSystem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -30,5 +30,15 @@ public WktCoordinateSystem(string name,
Name = name;
}

/// <inheritdoc/>>
public override void Traverse(IWktTraverseHandler handler)
{
if (this is WktProjectedCoordinateSystem projcs)
projcs.Traverse(handler);
else if (this is WktGeographicCoordinateSystem geogcs)
geogcs.Traverse(handler);
else if (this is WktGeocentricCoordinateSystem geoccs)
geoccs.Traverse(handler);
}
}
}
13 changes: 13 additions & 0 deletions src/ProjNet/Wkt/Tree/WktDatum.cs
Original file line number Diff line number Diff line change
Expand Up @@ -83,5 +83,18 @@ public override int GetHashCode()
return hashCode;
}
}

/// <inheritdoc/>
public override void Traverse(IWktTraverseHandler handler)
{
if (Spheroid!=null)
this.Spheroid.Traverse(handler);
if (ToWgs84!=null)
this.ToWgs84.Traverse(handler);
if (Authority!=null)
this.Authority.Traverse(handler);

handler.Handle(this);
}
}
}
10 changes: 10 additions & 0 deletions src/ProjNet/Wkt/Tree/WktEllipsoid.cs
Original file line number Diff line number Diff line change
Expand Up @@ -87,5 +87,15 @@ public override int GetHashCode()
return hashCode;
}
}


/// <inheritdoc/>
public override void Traverse(IWktTraverseHandler handler)
{
if (Authority!=null)
Authority.Traverse(handler);

handler.Handle(this);
}
}
}
6 changes: 6 additions & 0 deletions src/ProjNet/Wkt/Tree/WktExtension.cs
Original file line number Diff line number Diff line change
Expand Up @@ -71,5 +71,11 @@ public override int GetHashCode()
return ((Name != null ? Name.GetHashCode() : 0) * 397) ^ Value.GetHashCode();
}
}

/// <inheritdoc/>
public override void Traverse(IWktTraverseHandler handler)
{
handler.Handle(this);
}
}
}
14 changes: 14 additions & 0 deletions src/ProjNet/Wkt/Tree/WktGeocentricCoordinateSystem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -102,5 +102,19 @@ public override int GetHashCode()
return hashCode;
}
}

/// <inheritdoc/>
public override void Traverse(IWktTraverseHandler handler)
{
Datum.Traverse(handler);
PrimeMeridian.Traverse(handler);
Unit.Traverse(handler);
Authority.Traverse(handler);

foreach (var axis in Axes)
axis.Traverse(handler);

handler.Handle(this);
}
}
}
23 changes: 23 additions & 0 deletions src/ProjNet/Wkt/Tree/WktGeographicCoordinateSystem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -125,5 +125,28 @@ public override int GetHashCode()
return hashCode;
}
}


/// <inheritdoc/>
public override void Traverse(IWktTraverseHandler handler)
{
if (AngularUnit!=null)
AngularUnit.Traverse(handler);
if (Unit!=null)
Unit.Traverse(handler);
if (HorizontalDatum!=null)
HorizontalDatum.Traverse(handler);
if (PrimeMeridian!=null)
PrimeMeridian.Traverse(handler);

foreach (var axis in Axes)
if (axis!=null)
axis.Traverse(handler);

if (Authority!=null)
Authority.Traverse(handler);

handler.Handle(this);
}
}
}
7 changes: 7 additions & 0 deletions src/ProjNet/Wkt/Tree/WktParameter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -72,5 +72,12 @@ public override int GetHashCode()
return ((Name != null ? Name.GetHashCode() : 0) * 397) ^ Value.GetHashCode();
}
}


/// <inheritdoc/>
public override void Traverse(IWktTraverseHandler handler)
{
handler.Handle(this);
}
}
}
10 changes: 10 additions & 0 deletions src/ProjNet/Wkt/Tree/WktPrimeMeridian.cs
Original file line number Diff line number Diff line change
Expand Up @@ -81,5 +81,15 @@ public override int GetHashCode()
return hashCode;
}
}


/// <inheritdoc/>
public override void Traverse(IWktTraverseHandler handler)
{
if (Authority!=null)
Authority.Traverse(handler);

handler.Handle(this);
}
}
}
32 changes: 32 additions & 0 deletions src/ProjNet/Wkt/Tree/WktProjectedCoordinateSystem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -124,5 +124,37 @@ public override int GetHashCode()
return hashCode;
}
}


/// <inheritdoc/>
public override void Traverse(IWktTraverseHandler handler)
{
if (GeographicCoordinateSystem!=null)
GeographicCoordinateSystem.Traverse(handler);
if (Projection!=null)
Projection.Traverse(handler);

if (Parameters != null)
{
foreach (var p in Parameters)
p.Traverse(handler);
}

if (Unit!=null)
Unit.Traverse(handler);

if (Axes != null)
{
foreach (var axis in Axes)
axis.Traverse(handler);
}

if (Authority!=null)
Authority.Traverse(handler);
if (Extension!=null)
Extension.Traverse(handler);

handler.Handle(this);
}
}
}
10 changes: 10 additions & 0 deletions src/ProjNet/Wkt/Tree/WktProjection.cs
Original file line number Diff line number Diff line change
Expand Up @@ -71,5 +71,15 @@ public override int GetHashCode()
return ((Name != null ? Name.GetHashCode() : 0) * 397) ^ (Authority != null ? Authority.GetHashCode() : 0);
}
}


/// <inheritdoc/>
public override void Traverse(IWktTraverseHandler handler)
{
if (Authority!=null)
Authority.Traverse(handler);

handler.Handle(this);
}
}
}
34 changes: 11 additions & 23 deletions src/ProjNet/Wkt/Tree/WktSpheroid.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,25 +5,8 @@ namespace ProjNet.Wkt.Tree
/// <summary>
/// WktSpheroid class.
/// </summary>
public class WktSpheroid : WktBaseObject, IEquatable<WktSpheroid>
public class WktSpheroid : WktEllipsoid, IEquatable<WktSpheroid>
{
/// <summary>
/// Name property.
/// </summary>
public string Name { get; internal set; }
/// <summary>
/// SemiMajorAxis property.
/// </summary>
public double SemiMajorAxis { get; internal set; }
/// <summary>
/// InverseFlattening property.
/// </summary>
public double InverseFlattening { get; internal set; }
/// <summary>
/// Authority property.
/// </summary>
public WktAuthority Authority { get; internal set; }

/// <summary>
/// Constructor for a WktSpheroid.
/// </summary>
Expand All @@ -36,12 +19,8 @@ public class WktSpheroid : WktBaseObject, IEquatable<WktSpheroid>
/// <param name="rightDelimiter"></param>
public WktSpheroid(string name, double semiMajorAxis, double inverseFlattening, WktAuthority authority,
string keyword = "SPHEROID", char leftDelimiter = '[', char rightDelimiter = ']')
: base(keyword, leftDelimiter, rightDelimiter)
: base(name, semiMajorAxis, inverseFlattening, authority, keyword, leftDelimiter, rightDelimiter)
{
Name = name;
SemiMajorAxis = semiMajorAxis;
InverseFlattening = inverseFlattening;
Authority = authority;
}


Expand Down Expand Up @@ -87,5 +66,14 @@ public override int GetHashCode()
return hashCode;
}
}

/// <inheritdoc/>
public override void Traverse(IWktTraverseHandler handler)
{
if (Authority!=null)
Authority.Traverse(handler);

handler.Handle(this);
}
}
}
Loading

0 comments on commit 0539e85

Please sign in to comment.