Skip to content

Commit ce67971

Browse files
committed
Don't write extent in header for single point and empty geometries
refers to #11
1 parent 2370d8f commit ce67971

File tree

3 files changed

+65
-22
lines changed

3 files changed

+65
-22
lines changed

src/NetTopologySuite.IO.GeoPackage/GeoPackageGeoWriter.cs

Lines changed: 25 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -68,25 +68,9 @@ public void Write(Geometry geom, Stream stream)
6868
using (var writer = new BinaryWriter(stream))
6969
{
7070
int byteOrder = (int)ByteOrder.LittleEndian;
71-
int ordinates = 0;
72-
switch (HandleOrdinates)
73-
{
74-
case Ordinates.None:
75-
ordinates = 0;
76-
break;
77-
case Ordinates.XY:
78-
ordinates = 1;
79-
break;
80-
case Ordinates.XYZ:
81-
ordinates = 2;
82-
break;
83-
case Ordinates.XYM:
84-
ordinates = 3;
85-
break;
86-
case Ordinates.XYZM:
87-
ordinates = 4;
88-
break;
89-
}
71+
72+
int ordinates = GetExtentOrdinates(geom);
73+
9074
int isEmpty = geom.IsEmpty ? 1 : 0;
9175
byte flags = (byte)(byteOrder + (ordinates << 1) + (isEmpty << 4));
9276
var header = new GeoPackageBinaryHeader
@@ -117,12 +101,32 @@ public void Write(Geometry geom, Stream stream)
117101
}
118102

119103
// NOTE: GeoPackage handles SRID in its own header. It would be invalid here.
120-
const bool dontHandleSRID = false;
121-
var wkbWriter = new WKBWriter(ByteOrder.LittleEndian, dontHandleSRID, emitZ, emitM);
104+
const bool handleSRID = false;
105+
var wkbWriter = new WKBWriter(ByteOrder.LittleEndian, handleSRID, emitZ, emitM);
122106
wkbWriter.Write(geom, stream);
123107
}
124108
}
125109

110+
private int GetExtentOrdinates(Geometry geom)
111+
{
112+
if (geom.IsEmpty || geom.OgcGeometryType == OgcGeometryType.Point)
113+
return 0;
114+
115+
switch (HandleOrdinates)
116+
{
117+
case Ordinates.XY:
118+
return 1;
119+
case Ordinates.XYZ:
120+
return 2;
121+
case Ordinates.XYM:
122+
return 3;
123+
case Ordinates.XYZM:
124+
return 4;
125+
}
126+
127+
return 0;
128+
}
129+
126130
/// <summary>
127131
/// Serializes a given <see cref="Geometry"/> to a new byte array.
128132
/// </summary>
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
using NetTopologySuite;
2+
using NetTopologySuite.Geometries;
3+
using NetTopologySuite.IO;
4+
using NUnit.Framework;
5+
6+
namespace NetTopologySuite.IO.SpatiaLite.Test;
7+
8+
class Issue11
9+
{
10+
[TestCase("POINT EMPTY", 17)]
11+
[TestCase("POINT(10 10)", 1)]
12+
[TestCase("POINT Z(10 10 1)", 1)]
13+
[TestCase("POINT M(10 10 2)", 1)]
14+
[TestCase("POINT ZM(10 10 1 2)", 1)]
15+
[TestCase("POINT(10 10)", 1)]
16+
[TestCase("LINESTRING EMPTY", 17)]
17+
[TestCase("LINESTRING(10 10, 10 20)", 3)]
18+
[TestCase("LINESTRING Z(10 10 1, 10 20 1)", 3)]
19+
[TestCase("LINESTRING M(10 10 2, 10 20 2)", 3)]
20+
[TestCase("LINESTRING ZM(10 10 1 2, 10 20 1 2)", 3)]
21+
public void TestHeaderFlags(string wkt, byte expectedFlags)
22+
{
23+
var factory = NtsGeometryServices.Instance.CreateGeometryFactory();
24+
var wktReader = new WKTReader() { IsOldNtsCoordinateSyntaxAllowed = false };
25+
var geom = wktReader.Read(wkt);
26+
var writer = new GeoPackageGeoWriter
27+
{
28+
HandleOrdinates = Ordinates.None
29+
};
30+
byte[] s = writer.Write(geom);
31+
32+
Assert.That(s[3], Is.EqualTo(expectedFlags));
33+
34+
var reader = new GeoPackageGeoReader(factory.CoordinateSequenceFactory, factory.PrecisionModel);
35+
var dgeom = reader.Read(s);
36+
Assert.That(dgeom, Is.EqualTo(geom));
37+
}
38+
39+
}

test/NetTopologySuite.IO.SpatiaLite.Test/NetTopologySuite.IO.SpatiaLite.Test.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
4-
<TargetFramework>netcoreapp3.1</TargetFramework>
4+
<TargetFramework>net8</TargetFramework>
55
</PropertyGroup>
66

77
<ItemGroup>

0 commit comments

Comments
 (0)