Skip to content

Commit 3025db6

Browse files
committed
add lod filtering
1 parent e1a0dd7 commit 3025db6

File tree

5 files changed

+167
-165
lines changed

5 files changed

+167
-165
lines changed

ConsoleApp1/Program.cs

+3-3
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@
22

33
// Sample for reading a set of CityJSON Seq files and inserting the geometries into a PostGIS database
44

5-
var path = "D:\\gisdata\\3dbag\\france\\output\\tiles";
5+
var path = @"D:\aaa\barcelonnette\tile_00001.city";
66

77
var allFiles = Directory.GetFiles(path, "*.jsonl", SearchOption.AllDirectories);
88

9-
var connString = "Host=localhost;Username=postgres;Password=postgres;Database=postgres";
9+
var connString = "Host=localhost;Username=postgres;Password=postgres;Database=postgres;Port=5439";
1010

1111
using var conn = new NpgsqlConnection(connString);
1212

@@ -15,7 +15,7 @@
1515

1616
foreach (var file in allFiles)
1717
{
18-
var wkts = TileReader.ReadCityJsonSeqTile(file);
18+
var wkts = TileReader.ReadCityJsonSeqTile(file, "2.2");
1919
foreach(var wkt in wkts)
2020
{
2121
var sql = @$"insert into public.roofer(geom)values(st_setsrid(st_GeomfromText('{wkt}'), 5698));";

ConsoleApp1/TileReader.cs

+4-4
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,20 @@
44

55
public static class TileReader
66
{
7-
public static List<string> ReadCityJsonSeqTile(string file)
7+
public static List<string> ReadCityJsonSeqTile(string file, string lod=null)
88
{
99
var jsonSeq = File.ReadAllText(file);
1010
var allLines = jsonSeq.Split('\n');
1111
var firstLine = allLines[0];
1212
var cityJson = JsonConvert.DeserializeObject<CityJsonDocument>(firstLine);
1313
var transform = cityJson.Transform;
1414

15-
var result = GetWkts(allLines,transform);
15+
var result = GetWkts(allLines,transform, lod);
1616
return result;
1717
}
1818

1919

20-
public static List<string> GetWkts(string[] allLines, Transform transform)
20+
public static List<string> GetWkts(string[] allLines, Transform transform, string lod = null)
2121
{
2222
var wkts = new List<string>();
2323

@@ -26,7 +26,7 @@ public static List<string> GetWkts(string[] allLines, Transform transform)
2626
var line = allLines[i];
2727
var cityObject = JsonConvert.DeserializeObject<CityJsonDocument>(line);
2828

29-
var wkt = cityObject.ToWkt(transform);
29+
var wkt = cityObject.ToWkt(transform, lod);
3030
wkts.Add(wkt);
3131
}
3232
return wkts;

cityjson.core.tests/UnitTest1.cs

+129-129
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
1-
using System.IO;
2-
using System.Linq;
3-
using CityJSON.Extensions;
4-
using Newtonsoft.Json;
5-
using NUnit.Framework;
6-
7-
namespace CityJSON.Tests
8-
{
9-
public class UnitTest1
10-
{
11-
[Test]
1+
using System.IO;
2+
using System.Linq;
3+
using CityJSON.Extensions;
4+
using Newtonsoft.Json;
5+
using NUnit.Framework;
6+
7+
namespace CityJSON.Tests
8+
{
9+
public class UnitTest1
10+
{
11+
[Test]
1212
public void ReadBuildingWithInnerRingTest()
1313
{
1414
var json = File.ReadAllText("./fixtures/building_with_innerring.city.json");
@@ -22,121 +22,121 @@ public void ReadBuildingWithInnerRingTest()
2222
var geom = reader.Read(wkt);
2323

2424
Assert.That(geom.GeometryType, Is.EqualTo("MultiPolygon"));
25-
Assert.That(geom.NumGeometries, Is.EqualTo(102));
26-
27-
}
28-
29-
[Test]
30-
public void ReadCityJsonSeqFileMinimal()
31-
{
32-
var jsonSeq = File.ReadAllText("fixtures/tile_00000.city.jsonl");
33-
34-
var allLines = jsonSeq.Split('\n');
35-
36-
var firstLine = allLines[0];
37-
var cityJson = JsonConvert.DeserializeObject<CityJsonDocument>(firstLine);
38-
Assert.That(cityJson.Type == "CityJSON");
39-
Assert.That(cityJson.Version == "2.0");
40-
41-
var transform = cityJson.Transform;
42-
43-
var secondLine = allLines[1];
44-
var cityJsonSecond = JsonConvert.DeserializeObject<CityJsonDocument>(secondLine);
45-
Assert.That(cityJsonSecond.CityObjects.Count == 2);
46-
var wkt = cityJsonSecond.ToWkt(transform);
47-
48-
// read with NetTopologySuite
49-
var reader = new NetTopologySuite.IO.WKTReader();
50-
var geom = reader.Read(wkt);
51-
Assert.That(geom.GeometryType == "MultiPolygon");
52-
}
53-
54-
55-
[Test]
56-
public void ReadCityJsonSeqFile()
57-
{
58-
var jsonSeq = File.ReadAllText("fixtures/tile_00000.city.jsonl");
59-
60-
var allLines = jsonSeq.Split('\n');
61-
62-
var firstLine = allLines[0];
63-
var cityJson = JsonConvert.DeserializeObject<CityJsonDocument>(firstLine);
64-
Assert.That(cityJson.Type == "CityJSON");
65-
Assert.That(cityJson.Version == "2.0");
66-
67-
var transform = cityJson.Transform;
68-
Assert.That(transform.Scale.Length == 3);
69-
Assert.That(transform.Scale[0] == 0.01);
70-
Assert.That(transform.Scale[1] == 0.01);
71-
Assert.That(transform.Scale[2] == 0.01);
72-
Assert.That(transform.Translate.Length == 3);
73-
Assert.That(transform.Translate[0] == 1033078.6);
74-
Assert.That(transform.Translate[1] == 6280758.8);
75-
Assert.That(transform.Translate[2] == 0.0);
76-
Assert.That(cityJson.Vertices.Count == 0);
77-
78-
var secondLine = allLines[1];
79-
var cityJsonSecond = JsonConvert.DeserializeObject<CityJsonDocument>(secondLine);
80-
Assert.That(cityJsonSecond.CityObjects.Count == 2);
81-
var wkt = cityJsonSecond.ToWkt(transform);
82-
83-
// read with NetTopologySuite
84-
var reader = new NetTopologySuite.IO.WKTReader();
85-
var geom = reader.Read(wkt);
86-
Assert.That(geom.GeometryType == "MultiPolygon");
87-
}
88-
89-
[Test]
90-
public void ReadMinimal20CityJson()
91-
{
92-
var json = File.ReadAllText("fixtures/minimal.city.json");
93-
var cityjson = JsonConvert.DeserializeObject<CityJsonDocument>(json);
94-
95-
Assert.That(cityjson.Type == "CityJSON");
96-
Assert.That(cityjson.Version == "2.0");
97-
Assert.That(cityjson.CityObjects.Count == 0);
98-
99-
Assert.That(cityjson.Transform.Scale.Length == 3);
100-
Assert.That(cityjson.Transform.Scale[0] == 1);
101-
Assert.That(cityjson.Transform.Scale[1] == 1);
102-
Assert.That(cityjson.Transform.Scale[2] == 1);
103-
104-
Assert.That(cityjson.Transform.Translate.Length == 3);
105-
Assert.That(cityjson.Transform.Translate[0] == 0);
106-
Assert.That(cityjson.Transform.Translate[1] == 0);
107-
Assert.That(cityjson.Transform.Translate[2] == 0);
108-
109-
Assert.That(cityjson.CityObjects.Count == 0);
110-
Assert.That(cityjson.Vertices.Count == 0);
111-
}
112-
113-
114-
[Test]
115-
public void TestReadDenHaag()
116-
{
117-
var json = File.ReadAllText("fixtures/denhaag.json");
118-
var cityjson = JsonConvert.DeserializeObject<CityJsonDocument>(json);
119-
Assert.That(cityjson.Version == "1.0");
120-
Assert.That(cityjson.CityObjects.Count == 2498);
121-
var firstCityObject = cityjson.CityObjects.First().Value;
122-
var attributes = firstCityObject.Attributes;
123-
Assert.That(attributes.Count == 5);
124-
var firstAttribute = attributes.First().Value;
125-
Assert.That(firstAttribute.Equals("1000"));
126-
127-
var firstGeometry = firstCityObject.Geometry.First();
128-
Assert.That(firstGeometry.Type == Geometry.GeometryType.Solid);
129-
130-
Assert.That(firstGeometry.Lod == "2");
131-
}
132-
133-
[Test]
134-
public void TestReadGebouwen()
135-
{
136-
var json = File.ReadAllText("fixtures/25gn1_04_2020_gebouwen.json");
137-
var cityjson = JsonConvert.DeserializeObject<CityJsonDocument>(json);
138-
Assert.That(cityjson.Version == "1.0");
139-
Assert.That(cityjson.CityObjects.Count == 7313);
140-
}
141-
}
142-
}
25+
Assert.That(geom.NumGeometries, Is.EqualTo(102));
26+
27+
}
28+
29+
[Test]
30+
public void ReadCityJsonSeqFileMinimal()
31+
{
32+
var jsonSeq = File.ReadAllText("fixtures/tile_00000.city.jsonl");
33+
34+
var allLines = jsonSeq.Split('\n');
35+
36+
var firstLine = allLines[0];
37+
var cityJson = JsonConvert.DeserializeObject<CityJsonDocument>(firstLine);
38+
Assert.That(cityJson.Type == "CityJSON");
39+
Assert.That(cityJson.Version == "2.0");
40+
41+
var transform = cityJson.Transform;
42+
43+
var secondLine = allLines[1];
44+
var cityJsonSecond = JsonConvert.DeserializeObject<CityJsonDocument>(secondLine);
45+
Assert.That(cityJsonSecond.CityObjects.Count == 2);
46+
var wkt = cityJsonSecond.ToWkt(transform);
47+
48+
// read with NetTopologySuite
49+
var reader = new NetTopologySuite.IO.WKTReader();
50+
var geom = reader.Read(wkt);
51+
Assert.That(geom.GeometryType == "MultiPolygon");
52+
}
53+
54+
55+
[Test]
56+
public void ReadCityJsonSeqFile()
57+
{
58+
var jsonSeq = File.ReadAllText("fixtures/tile_00000.city.jsonl");
59+
60+
var allLines = jsonSeq.Split('\n');
61+
62+
var firstLine = allLines[0];
63+
var cityJson = JsonConvert.DeserializeObject<CityJsonDocument>(firstLine);
64+
Assert.That(cityJson.Type == "CityJSON");
65+
Assert.That(cityJson.Version == "2.0");
66+
67+
var transform = cityJson.Transform;
68+
Assert.That(transform.Scale.Length == 3);
69+
Assert.That(transform.Scale[0] == 0.01);
70+
Assert.That(transform.Scale[1] == 0.01);
71+
Assert.That(transform.Scale[2] == 0.01);
72+
Assert.That(transform.Translate.Length == 3);
73+
Assert.That(transform.Translate[0] == 1033078.6);
74+
Assert.That(transform.Translate[1] == 6280758.8);
75+
Assert.That(transform.Translate[2] == 0.0);
76+
Assert.That(cityJson.Vertices.Count == 0);
77+
78+
var secondLine = allLines[1];
79+
var cityJsonSecond = JsonConvert.DeserializeObject<CityJsonDocument>(secondLine);
80+
Assert.That(cityJsonSecond.CityObjects.Count == 2);
81+
var wkt = cityJsonSecond.ToWkt(transform);
82+
83+
// read with NetTopologySuite
84+
var reader = new NetTopologySuite.IO.WKTReader();
85+
var geom = reader.Read(wkt);
86+
Assert.That(geom.GeometryType == "MultiPolygon");
87+
}
88+
89+
[Test]
90+
public void ReadMinimal20CityJson()
91+
{
92+
var json = File.ReadAllText("fixtures/minimal.city.json");
93+
var cityjson = JsonConvert.DeserializeObject<CityJsonDocument>(json);
94+
95+
Assert.That(cityjson.Type == "CityJSON");
96+
Assert.That(cityjson.Version == "2.0");
97+
Assert.That(cityjson.CityObjects.Count == 0);
98+
99+
Assert.That(cityjson.Transform.Scale.Length == 3);
100+
Assert.That(cityjson.Transform.Scale[0] == 1);
101+
Assert.That(cityjson.Transform.Scale[1] == 1);
102+
Assert.That(cityjson.Transform.Scale[2] == 1);
103+
104+
Assert.That(cityjson.Transform.Translate.Length == 3);
105+
Assert.That(cityjson.Transform.Translate[0] == 0);
106+
Assert.That(cityjson.Transform.Translate[1] == 0);
107+
Assert.That(cityjson.Transform.Translate[2] == 0);
108+
109+
Assert.That(cityjson.CityObjects.Count == 0);
110+
Assert.That(cityjson.Vertices.Count == 0);
111+
}
112+
113+
114+
[Test]
115+
public void TestReadDenHaag()
116+
{
117+
var json = File.ReadAllText("fixtures/denhaag.json");
118+
var cityjson = JsonConvert.DeserializeObject<CityJsonDocument>(json);
119+
Assert.That(cityjson.Version == "1.0");
120+
Assert.That(cityjson.CityObjects.Count == 2498);
121+
var firstCityObject = cityjson.CityObjects.First().Value;
122+
var attributes = firstCityObject.Attributes;
123+
Assert.That(attributes.Count == 5);
124+
var firstAttribute = attributes.First().Value;
125+
Assert.That(firstAttribute.Equals("1000"));
126+
127+
var firstGeometry = firstCityObject.Geometry.First();
128+
Assert.That(firstGeometry.Type == Geometry.GeometryType.Solid);
129+
130+
Assert.That(firstGeometry.Lod == "2");
131+
}
132+
133+
[Test]
134+
public void TestReadGebouwen()
135+
{
136+
var json = File.ReadAllText("fixtures/25gn1_04_2020_gebouwen.json");
137+
var cityjson = JsonConvert.DeserializeObject<CityJsonDocument>(json);
138+
Assert.That(cityjson.Version == "1.0");
139+
Assert.That(cityjson.CityObjects.Count == 7313);
140+
}
141+
}
142+
}

src/cityjson.core/Extensions/CityJsonDocumentExtensions.cs

+6-4
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,19 @@ namespace CityJSON.Extensions
77
{
88
public static class CityJsonDocumentExtensions
99
{
10-
public static string ToWkt(this CityJsonDocument cityJson)
10+
public static string ToWkt(this CityJsonDocument cityJson, string lod=null)
1111
{
12-
return ToWkt(cityJson, cityJson.Transform);
12+
return ToWkt(cityJson, cityJson.Transform,lod);
1313
}
1414

15-
public static string ToWkt(this CityJsonDocument cityJson, Transform transform)
15+
public static string ToWkt(this CityJsonDocument cityJson, Transform transform, string lod=null)
1616
{
1717
var polygons = new List<Polygon>();
1818
foreach (var co in cityJson.CityObjects)
1919
{
20-
foreach(var geom in co.Value.Geometry)
20+
var geoms = lod!=null ? co.Value.Geometry.FindAll(g => g.Lod == lod) : co.Value.Geometry;
21+
22+
foreach (var geom in geoms)
2123
{
2224
switch (geom)
2325
{
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,28 @@
1-
using System.Collections.Generic;
2-
using CityJSON.Geometry;
3-
using CityJSON.IO;
4-
using NetTopologySuite.Geometries;
5-
using NetTopologySuite.Noding;
6-
7-
namespace CityJSON.Extensions
8-
{
9-
public static class MultiSurfaceGeometryExtensions
10-
{
11-
public static List<Polygon> ToPolys(this MultiSurfaceGeometry multiSurfaceGeometry, List<Vertex> vertices, Transform transform)
12-
{
13-
var polygons = new List<Polygon>();
14-
15-
foreach(var bnd in multiSurfaceGeometry.Boundaries)
16-
{
1+
using System.Collections.Generic;
2+
using CityJSON.Geometry;
3+
using CityJSON.IO;
4+
using NetTopologySuite.Geometries;
5+
using NetTopologySuite.Noding;
6+
7+
namespace CityJSON.Extensions
8+
{
9+
public static class MultiSurfaceGeometryExtensions
10+
{
11+
public static List<Polygon> ToPolys(this MultiSurfaceGeometry multiSurfaceGeometry, List<Vertex> vertices, Transform transform)
12+
{
13+
var polygons = new List<Polygon>();
14+
15+
foreach(var bnd in multiSurfaceGeometry.Boundaries)
16+
{
1717
var outer = bnd[0];
1818

1919
var holes = bnd.Length>1?bnd[1..]:null;
20-
21-
var poly = PolygonCreator.GetPolygon(vertices, outer, transform, holes);
22-
polygons.Add(poly);
23-
}
24-
25-
return polygons;
26-
}
27-
}
28-
}
20+
21+
var poly = PolygonCreator.GetPolygon(vertices, outer, transform, holes);
22+
polygons.Add(poly);
23+
}
24+
25+
return polygons;
26+
}
27+
}
28+
}

0 commit comments

Comments
 (0)