cityjson / specs

Specifications for CityJSON, a JSON-based encoding for 3D city models
https://cityjson.org
Creative Commons Zero v1.0 Universal
107 stars 25 forks source link

are "geometry-templates" allowed in JSONL? #130

Closed hugoledoux closed 11 months ago

hugoledoux commented 1 year ago

the text contradicts itself, should they be "resolved" (real-world coordinates) or is it okay to put them in the 1st line or stored somewhere?

hugoledoux commented 1 year ago

If we put the whole "geometry-templates" in the first line (and do not dereference them in the objects), then for the Railway dataset the 1st line is pretty large: 21KB (without spaces and newlines).

To keep in mind

balazsdukai commented 1 year ago

In contrast, I've been thinking about including the "geometry-templates" in the CityJSONFeature, but only containing the template(s) that is used by the feature.

For instance like this:

{
  "type": "CityJSONFeature",
  "id": "id-1",
  "CityObjects": {
    "id-1": {
      "type": "Building",
      "attributes": {
        "roofType": "gabled roof"
      },
      "children": ["mywindow"],
      "geometry": [...]
    },
    "mywindow": {
      "type": "BuildingInstallation",
      "parents": ["id-1"],
      "geometry": [
        {
          "type": "GeometryInstance",
          "template": 0,
          "boundaries": [372],
          "transformationMatrix": [
            2.0, 0.0, 0.0, 0.0,
            0.0, 2.0, 0.0, 0.0,
            0.0, 0.0, 2.0, 0.0,
            0.0, 0.0, 0.0, 1.0
          ]
        }
      ]
    }
  },
  "geometry-templates": {
    "templates": [
      {
        "type": "MultiSurface",
        "lod": "2.1",
        "boundaries": [
           [[0, 3, 2, 1]], [[4, 5, 6, 7]], [[0, 1, 5, 4]]
        ]
      }
    ],
    "vertices-templates": [
      [0.0, 0.5, 0.0],
      ...
      [1.0, 1.0, 0.0],
      [0.0, 1.0, 0.0]
    ]
  },
  "vertices": [...]
}

However, the problem with this approach, or with dereferencing the templates in the CityJSONFeature, as it says in the specs currently, is the duplication of objects. Imagine and application, a 3D viewer, that populates the scene by loading the CityJSONFeatures that are in the view. The features are buildings with templated windows on the facades. There are a lot of windows on one building, and even more on many buildings... :-D. If the window-templates need to be duplicated for each feature, then that'll mean a lot of extra geometry, which could be avoided by loading the templates only once and reusing them for the features.

I don't particularly like the idea of dumping more and more stuff in the "first line" (I call it metadata), but I think if we include the template definitions with the features, then we practically lose the possibility of using templates (in their true sense), when using CityJSONFeatures. And since CityJSONFeatures are meant for handling large areas, templates are probably even more useful than in regular CityJSON files.

clausnagel commented 1 year ago

I agree that dereferencing geometry templates is a strong limitation of the current CityJSONFeature approach. Putting the templates in the first line would be a valid solution. It also means that a software creating the stream of CityJSONFeature objects must know the required templates a priori. In a database scenario, for example, this might require additional and possibly expensive queries before being able to write to the stream.

Another solution would be to store a geometry template with the first CityJSONFeature object that uses it. The next CityJSONFeature could then reuse this template. For this purpose, templates would require a unique identifier to be able to reuse them. This would avoid duplicate templates in a CityJSONFeature stream and therefore keep the stream compact. And no extra queries required in the database scenario from above.

I am aware that this idea breaks with the current philosophy of having all templates at one place, which also has a lot of benefits. Just wanted to put it on the table as another approach.

hugoledoux commented 1 year ago

I am not a big fan of the 2nd solution: put the template in the first CityJSONFeature, since then each feature can be different. And how to ensure uniqueness?

I think the best is to have in the first line, and/or in the metadata somewhere (at the cost of some operations for a database, agreed).