Skip to content

Add verticalScale support and metadata convert post processor - #155

Open
zhak5388 wants to merge 3 commits into
mainfrom
zhak/vertical-scale-v3
Open

Add verticalScale support and metadata convert post processor#155
zhak5388 wants to merge 3 commits into
mainfrom
zhak/vertical-scale-v3

Conversation

@zhak5388

@zhak5388 zhak5388 commented Oct 31, 2025

Copy link
Copy Markdown
Contributor

Description

Integration of the following commit from fds of PR#137:

  • (4404a8d) feat(verticalscale): Manage vertical scale in vectors and heightmaps

Notes

  • Converter takes only one MathTransform object
  • Update docs to reflect that when using metadata, it should expressed in voxel unit (RenderBuildingTask was a mix of geo value and voxel value for example)
  • Add a MetadataConvert post processor capable of converting horizontal/vertical distances and altitude
  • Add comments about CRS / units
  • Add a TODO for FloatMatrixModel (This one is tricky as in X/Z it is in voxel unit but it is data is geographical [meaning not converted])

TODOs

  • Bug: metadata conversion PP does not work with truncate PP
  • Squash
  • Check notes from others branches

Self-checks

  • The code has unit tests associated
  • The code has Javadoc Comments associated
  • Complex / Unexpected code is explained / justified with a small comment
  • Relevant documentation inside the /docs folder has been updated
  • All examples in docs/usage/Examples.md work the same (or have been adapted if subject to changes in this PR)
  • Git history is clean (each commit accomplish a single task and describe it accordingly)
  • The texts have been proofread (documentation, error messages, logs, comments...)

Comment thread examples/processes/full.yaml
@zhak5388
zhak5388 marked this pull request as ready for review October 31, 2025 16:51
@zhak5388 zhak5388 self-assigned this Oct 31, 2025
@zhak5388
zhak5388 force-pushed the zhak/vertical-scale-v3 branch from b93e47f to b639e8d Compare November 3, 2025 14:26
@github-actions

github-actions Bot commented Nov 3, 2025

Copy link
Copy Markdown

[Maven Build Status]

📑 Commit: 52ace425cf2687dfd63da4c3b5748d6127c1aef2
⌚️ Date: 2026-01-20T14:01:08 (CET)
🛠️ Status: ✅ Success

📦 Download artifact: Generator.jar

@zhak5388
zhak5388 force-pushed the zhak/vertical-scale-v3 branch 3 times, most recently from 62638c0 to 459710c Compare November 3, 2025 15:49
@zhak5388
zhak5388 requested a review from a team November 3, 2025 15:55
Comment thread src/main/java/com/ignfab/minalac/generator/models/JTSGeometryModel.java Outdated
Comment thread src/main/java/com/ignfab/minalac/generator/utils/coordinates/Converter.java Outdated

@pyrollo pyrollo left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Déjà quelques commentaires

Comment thread docs/usage/parameters/PostProcessing.md Outdated
Comment thread src/main/java/com/ignfab/minalac/generator/utils/coordinates/Converter.java Outdated
Comment thread src/main/java/com/ignfab/minalac/generator/utils/coordinates/Converter.java Outdated
Comment thread src/main/java/com/ignfab/minalac/generator/utils/coordinates/Converter.java Outdated
@zhak5388
zhak5388 force-pushed the zhak/vertical-scale-v3 branch from 746b6db to 1394827 Compare November 4, 2025 13:56
Comment thread src/main/java/com/ignfab/minalac/generator/models/ModelImpl.java Outdated
Comment thread src/main/java/com/ignfab/minalac/generator/utils/coordinates/Converter.java Outdated
@zhak5388
zhak5388 force-pushed the zhak/vertical-scale-v3 branch from 6377a05 to 4eb50bd Compare November 6, 2025 14:08
@zhak5388

zhak5388 commented Nov 6, 2025

Copy link
Copy Markdown
Contributor Author

Je viens de push un commit qui fusionne les classes Converter, MapToWorldConverter et WorldToMapConverter. La classe résultante, je prefere l'appeler Converter (tout simplement parce que les objets permettant de faire WorldToMap et MapToWorld sont des instances la même classe et ça serait étrange de l'appeler MapToWorldConverter et WorldToMapConverter. Mais à discuter.
Pour créer un Converter qui fait MapToWorld, je passe par une méthode statique plutot que un constructeur. (Plus clair et on passe par un seul chemin Convert.createMapToWorld() et inverse())
Il me reste la javadoc et les tests à mettre à jour (Ca depend un peu du nom choisi)

Edit: Commentaire déprecié. Deux classes au lieu d'une.

@zhak5388
zhak5388 force-pushed the zhak/vertical-scale-v3 branch 4 times, most recently from 9b17a1c to 10ba5a0 Compare November 13, 2025 15:24

@zhak5388 zhak5388 left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bon au final, beaucoup d'aller retour! Au final, je suis sur quelque chose d'assez proche dans l'esprit de la version fds, avec quelques différences.

  • MapToWorldConverter qui a des méthodes pour faire de la conversion de distance et de coordonnées et WorldToMapConverter uniquement coordonnées. Je trouve que c'est plus clair en terme de responsabilité (il y a un peu de repetition mais je trouve que c'est mieux qu'avoir une seule classe converter qui pourrait avoir des instances avoir des méthodes non appropriées).
  • Generation n'est plus responsable de créer les objets de transformations.
  • Ajout de petits commentaires / javadoc pour clarifier certains points qui pourraient être peut-être poser problème dans le futur. (Unités CRS, CRS projeté, altitudeOffset pour différence altitudes entre CRS et/ou pour palier limite Minecraft en hauteur, échelle de déformation verticale pour Minecraft, necessité de travailler en unité de voxels pour les taches de rendus notamment). J'ai aussi ajouté deux TODO:
    • Dans PopulateHeightmapTask sur le fait FloatMatrixModel soit en x/y en coordonnées du monde et contiennent des données qui ne sont pas en voxels (Pas sur de faire la conversion dans le model car c'est possible de contenir des données qui ne sont pas de l'altiude et donc ne necessite pas de conversion)
    • Dans MapToWorldConverter sur le fait que l'altitude offset pourrait contenuir différence altitudes entre CRS ou pas

Ci-dessous quelques remarques/questionnement

Comment on lines -56 to -57
if (type.isInstance(value))
return model;

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ça serait peut-être utile de déplacer ce test dans ValueParser.

Concernant le fait d'avoir ValueParser qui puisse parser une donnée en tant que distance vertical à la place d'un post processeur de conversion, je n'ai pas pleinement exploré cette possibilité mais ça ne me semblait pas aussi trivial, j'ai l'impression que ça implique changer les autres PostProcessor pour faire en sorte qu'il y ait une fonction de model.

Aussi j'ai l'impression que les PostProcessor auront besoin d'un changement à un moment (Modifier un Model juste pour les besoins d'une tache, ou bien simplement l’écriture des failures policy (Par exemple actuellement on est obligé de répéter ifMissing à tous les post processors dans le fetchData)

Ceci dit, la solution actuelle (le fait d'introduire un autre PostProcessor) fait un minimum de modification mais ça ajoute de potentielles modifications futures, donc pas sur que ça soit idéal.

Comment on lines +70 to +74
// Checking units once
Unit<?> unitMap = CRSUtilities.getUnit(mapCrs.getCoordinateSystem());
Unit<?> unitWorld = CRSUtilities.getUnit(worldCrs.getCoordinateSystem());
if (!unitMap.equals(unitWorld))
System.out.printf("WARNING: the two CRS do not use the same unit. They might be awry results when converting distances. Unit map: %s, Unit world: %s%n", unitMap.getName(), unitWorld.getName());

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Alors initialement j'avais mis ce warning uniquement dans méthodes convertAltitude(), convert...Distance(), et mettre le warning dans le constructeur une bonne fois pour toute ça parait être une bonne idée et ça permet de ne pas stocker les CRS.
Sauf que, souvent on va avoir un map CRS (dans nos tests notamment) en degré , ça va faire un warning et ça pollue pas mal, du coup je suis tenté de virer tout simplement ce test. (Je me dit que la javadoc est assez explite sur le fait de la nécessité d'avoir les mêmes unités et ça me semble suffisant)

Je voulais aussi ajouter un test pour vérifier si le CRS cible utilise bien un système de coordonnées cartésien (car nécessaire pour les transformations affines) mais en suivant la même logique, la javadoc est assez explicite là-dessus.

Du coup, ça fait un peu un pas en avant et un peu en arrière (Je garde juste les commentaires/javadoc que du doc)

Comment on lines +92 to +97
this.transform = transform;
// The scales might be passed to the transform object, but it lost during creation
// The same value should be passed explicitly as it is required for convertAltitude(), convertHorizontalDistance(), convertVerticalDistance()
this.horizontalScale = horizontalScale;
this.verticalScale = verticalScale;
this.altitudeOffset = altitudeOffset;

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sur ce constructeur.. j'aurai bien aimé avoir un constructeur privé/protégé qui fait que l'initialisation et un public qui soit spécifique appelant le privé mais j'ai été bloqué avec le fait de devoir avoir this() en premiere ligne et laisser tomber la gestion d'erreur

*/
public MapToWorldConverter(AffineTransformation preTransform, MathTransform crsTransform, AffineTransformation postTransform) {
this(new Converter(preTransform, crsTransform, postTransform));
public WorldCoords2d convert(MapCoordinates2d coords) throws TransformException {

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ici j'ai hésité à faire un MapCoordinates2d convert(MapCoordinates2d coords) à la place. Cela permettrait de garder la précision et de laisser le soin à l'appelant de choisir comment arrondir.

En terme d'écriture ça semble plus judicieux d'avoir un MapToWorldConverter faisant MapCoord -> WorldCoord plutot que MapCoord -> MapCoord. (Peut être juste un soucis de nommage de MapCoord pour montrer qu'elle n'est pas exclusive à la carto.

Il y a pas cette gêne sur Geometry convert(Geometry geom). (Même contenant, mais c'est le contenu qui change)

J'ai le même questionnement pour WorldToMapConverter.

@zhak5388
zhak5388 force-pushed the zhak/vertical-scale-v3 branch from 10ba5a0 to 650bc0d Compare November 14, 2025 11:13
@zhak5388
zhak5388 force-pushed the zhak/vertical-scale-v3 branch from 650bc0d to 52ace42 Compare January 20, 2026 13:00
@indyteo indyteo mentioned this pull request Aug 4, 2026
1 task
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants