From commits-return-7764-apmail-sis-commits-archive=sis.apache.org@sis.apache.org Thu Jun 2 04:57:17 2016
Return-Path: Introduction to Apache SIS® (English | Français) Martin Desruisseaux
-Christina Hough
This work is licensed under the Apache 2 license.
isWhitespace(â¦)
- Adding new CRS definitions
Among the many kinds of operations performed by GIS softwares on spatial coordinates, -linear operations are both simple and very common. -Linear operations are combinations of only additions and some multiplications. -Linear operations do not include map projections, which are more complex, but cover many other cases: +affine transforms are both relatively simple and very common. +Affine transforms can represent any combination of scales, shears, flips, rotations and translations, +which are linear operations. +Affine transforms can not handle non-linear operations like map projections, +but the affine transform capabilities nevertheless cover many other cases:
.tfw
files associated to some TIFF images)..tfw
files associated to some TIFF images.-Linear operations can be concatenated efficiently. -No matter how many linear operations are chained, the result can be represented by a single linear operation. -This property is more easily seen when linear operations are represented by matrices: -in order to concatenate those operations, we only need to multiply the matrices. +Affine transforms can be concatenated efficiently. +No matter how many affine transforms are chained, the result can be represented by a single affine transform. +This property is more easily seen when affine transforms are represented by matrices: +in order to concatenate those operations, we only need to multiply those matrices. +The âpixel to geographic coordinate conversionsâ case below gives an example.
-Example: -give an image with pixel coordinates represented by (i,j) coordinates, -assuming that all pixels have the same size in longitude and latitude degrees, -and assuming there there is no rotation, then conversion from -(i,j) pixel coordinates to (λ,Ï) geographic coordinates -can be represented by the following matrices:
-
+
+ Example: +given an image with pixel coordinates represented by (x,y) tuples +and given the following assumptions: + +
Then conversions from pixel coordinates (x,y) +to geographic coordinates (λ,Ï) can be represented by the following equations, +where Nx is the image width and +Ny the image height in number of pixels: + + + + + +Above equations can be represented in matrix form as below: + - | -where - |
-
|
-TODO +
+In this particular case, scale factors S are the pixel size in degrees +and translation terms T are the geographic coordinate of an image corner +(not necessarily the lower-left corner if some axes have been flipped). +This straightforward interpretation holds because of above-cited assumptions, but +matrix coefficients become more complex if the image has shear or rotation +or if pixel coordinates do not start at (0,0). +However it is not necessary to use more complex equations for supporting more generic cases. +The following example starts with an âinitial conversionâ matrix +where the S and T terms are set to the most straightforward values. +Then the y axis direction is reversed for matching the most common convention in image coordinate systems (change 1), +and axis are swapped resulting in latitude before longitude (change 2). +Note that when affine transform concatenations are written as matrix multiplications, operations are ordered from right to left: +AÃBÃC is equivalent to first applying operation C, +then operation B and finally operation A.
Change 2 | Change 1 | - | Original conversion | - | Modified conversion | +Initial conversion | + | Concatenated operation | |
---|---|---|---|---|---|---|---|---|---|
-TODO +A key principle is that there is no need to write Java code dedicated to above kinds of axis changes. +Those operations, and many other, can be handled by matrix algebra. +This approach makes easier to write generic code and improves performance. +Apache SIS follows this principle by using affine transforms for every operations +that can be performed by such transform. +For instance there is no code dedicated to changing order of ordinate values in a coordinate.
TODO
++About all graphical libraries support some kind of coordinate operations, usually as affine transforms +or a slight generalization like perspective transforms. +Each library defines its own API. Some examples are listed below: +
+Library | Transform implementation | Dimensions |
---|---|---|
Java2D | java.awt.geom.AffineTransform | 2 |
Java3D | javax.media.j3d.Transform3D | 3 |
JavaFX | javafx.scene.transform.Affine | 2 or 3 |
Java Advanced Imaging (JAI) | javax.media.jai.PerspectiveTransform | 2 |
Android | android.graphics.Matrix | 2 |
+However in many cases, affine or perspective transforms are the only kind of coordinate operations supported by the graphical library.
+Apache SIS needs to handle a wider range of operations, in which affine transforms are only special cases.
+In particular most map projections and datum shifts can not be represented by affine transforms.
+SIS also needs to support arbitrary number of dimensions,
+while above-cited API restrict the use to a fixed number of dimensions.
+For those reasons SIS can not use directly the above-cited API.
+Instead, SIS uses the more abstract org.opengis.referencing.transform.MathTransform
interface.
+But in the special case where the transform is actually affine, SIS may try to use an existing implementation,
+in particular Java2D. The following Java code can be used in situations where the Java2D object is desired:
+
+MathTransform
mt = ...;// Any math transform created by Apache SIS. +
if (mt instanceof AffineTransform) { + AffineTransform at = (AffineTransform) mt; +// Use Java2D API from here. +
}
+However SIS uses Java2D on a best effort basis only.
+The above cast is not guaranteed to succeed,
+even when the MathTransform
meets the requirements allowing Java2D usage.
+
Modified: sis/site/trunk/content/book/fr/developer-guide.html URL: http://svn.apache.org/viewvc/sis/site/trunk/content/book/fr/developer-guide.html?rev=1746518&r1=1746517&r2=1746518&view=diff ============================================================================== --- sis/site/trunk/content/book/fr/developer-guide.html [UTF-8] (original) +++ sis/site/trunk/content/book/fr/developer-guide.html [UTF-8] Thu Jun 2 04:57:06 2016 @@ -60,7 +60,8 @@
-Parmi les sortes d’opérations qu’un SIG doit effectuer sur les coordonnées spatiales, il en est une à la fois simple et très fréquente. -Ce sont les opérations linéaires, constituées uniquement d’une combinaison d’additions et de certaines multiplications. -Ces opérations n’effectuent pas de projections cartographiques, plus complexes, mais couvrent de nombreux autres cas: -
-.tfw
qui accompagnent certaines images TIFF).-Les opérations linéaires peuvent se combiner efficacement: -peu importe le nombre d’opérations linéaires que l’on enchaîne, le résultat sera exprimable par une seule opération linéaire. -Cette propriété est plus facilement visible lorsque les opérations linéaires sont exprimées sous forme de matrices: +Parmi les sortes d’opérations qu’un SIG doit effectuer sur les coordonnées spatiales, +les transformations affines sont à la fois relativement simples et très fréquentes. +Les transformations affines peuvent représenter n’importe quelle combinaison d’échelles, de cisaillements, +de retournements, de rotations ou de translations, qui sont toutes des opérations linéaires. +Les transformations affines ne peuvent pas effectuer des opérations non-linéaires +telles que les projections cartographiques, mais couvrent néanmoins de nombreux autres cas: +
+.tfw
qui accompagnent certaines images TIFF.+Les transformations affines peuvent se combiner efficacement. +Peu importe le nombre de transformations affines que l’on enchaîne, le résultat sera exprimable par une seule transformation affine. +Cette propriété est plus facilement visible lorsque les transformations affines sont exprimées sous forme de matrices: pour combiner les opérations, il suffit de multiplier les matrices. +Le cas des conversions des coordonnées pixels en coordonnées géographiques ci-dessous donne un exemple.
-Example: -supposons que nous disposons d’une image dont les coordonnées des pixels sont représentées par (i,j). -Supposons que la taille de chaque pixel correspond à un nombre fixe de degrées de longitude et de latitude -dans un système géographique donné et qu’il n’y a pas de rotation. -La conversion des coordonnées pixels (i,j) vers les coordonnées géographiques (λ,φ) -est alors linéaire et peut être représentée par la matrice suivante:
-
+
+ Exemple: +supposons que nous disposons d’une image dont les coordonnées des pixels sont représentées par (x,y). +Supposons aussi que les contraintes suivantes sont respectées: + +
Alors la conversion des coordonnées pixels (x,y) +vers les coordonnées géographiques (λ,φ) +peut être représentée par les équations suivantes, +où Nx est la largeur +et Ny la hauteur de l’image en nombre de pixels. + + + + + +Les équations ci-dessus peuvent être représentées sous forme de matrices comme ci-dessous: + - | -où - |
-
|
-Concentrons notre attention sur la matrice du milieu dans l’équation ci-dessus. -Si nous n’interchangeons ni n’inversons la direction d’aucun axe, alors une conversion des coordonnées pixels vers les coordonnées géographiques -pourrait s’exprimer par la matrice « conversion originale » ci-dessous. -Mais si l’on veut en outre inverser la direction de l’axe des j pour se conformer à la convention la plus courante appliquée aux images -(« changement 1 ») et interchanger l’ordre des axes pour exprimer la latitude avant la longitude (« changement 2 »), -alors on peut exprimer ces modifications par des multiplications matricielles comme suit -(l’ordre dans laquelle les opérations sont effectuées sur les coordonnées se lit de droite à gauche): +
+Dans ce cas particulier, les facteurs d’échelles S correspondent à la taille des pixels en degrés +et les termes de translations T correspondent aux coordonnées géographiques d’un coin de l’image +(pas nécessairement le coin inférieur gauche si certains axes ont été retournés). +Cette interprétation directe n’est possible que lorsque les contraintes énumérées plus haut sont respectées. +Les coefficients des matrices deviennent plus complexes si l’image a un cisaillement ou une rotation, +ou si les coordonnées des pixels ne commencent pas à (0,0). +Toutefois il n’est pas nécessaire d’utiliser des équations plus complexes pour gérer des cas plus génériques. +L’exemple ci-dessous prend comme point de départ la matrice d’une « conversion initiale » +dans laquelle les coefficients S et T sont les valeurs relativement simples données ci-dessus. +Ensuite la direction de l’axe des y est inversée de manière à correspondre +à la convention habituelle des systèmes de coordonnées des images (changement 1), +et les axes sont intervertis de manière à avoir la latitude avant la longitude (changement 2). +Notez que les concaténations de transformations affines écrites sous forme de multiplications matricielles +se lisent de droite à gauche: +A×B×C est équivalent à d’abord appliquer l’opération C, +suivit de l’opération B et finalement l’opération A.
Changement 2 | Changement 1 | - | Conversion originale | - | Conversion modifiée | +Conversion initiale | + | Opérations combinées | |
---|---|---|---|---|---|---|---|---|---|
-L’idée principale est qu’il n’y a pas besoin d’écrire un code dédié à l’inversion des axes. -Cette opération, et bien d’autres, est prise en compte naturellement par l’algèbre matricielle. +Un principe clé est qu’il n’y a pas besoin d’écrire un code dédié à ce type d’opérations sur les axes. +Ces opérations, et bien d’autres, sont prises en compte naturellement par l’algèbre matricielle. On y gagne en généricité du code et en performance. +Apache SIS suit ce principe en utilisant les tranformations affine pour toutes les opérations +où elles peuvent s’appliquer. +Il n’y a par exemple aucun code dédié au changement de l’ordre des ordonnées dans une coordonnée.
TODO
-+A peu près toutes les bibliothèques graphiques supportent une forme de transformation de coordonnées, +souvent les transformations affines ou une légère généralisation. +Chaque bibliothèque défini son propre API. +Quelques exemples sont: +
+Bibliothèque | Implementation de la transformation | Dimensions |
---|---|---|
Java2D | java.awt.geom.AffineTransform | 2 |
Java3D | javax.media.j3d.Transform3D | 3 |
JavaFX | javafx.scene.transform.Affine | 2 ou 3 |
Java Advanced Imaging (JAI) | javax.media.jai.PerspectiveTransform | 2 |
Android | android.graphics.Matrix | 2 |
+Toutefois dans plusieurs cas, les transformations affines sont les seuls types d’opérations supportées par la bibliothèque graphique.
+Apache SIS a besoin de gérer un plus grand nombre de type d’opérations,
+parmi lesquelles les transformations affines ne sont que des cas particuliers.
+Les projections cartographiques et les changements de référentiels notamment,
+ne peuvent pas être représentés par des transformations affines.
+SIS a aussi besoin de transformer des points ayant un nombre arbitraire de dimensions,
+alors que les API cités ci-haut restreignent leur usage à un nombre fixe de dimensions.
+Pour ces raisons, SIS ne peut pas utiliser directement ces API.
+SIS utilise plutôt une interface plus abstraite, org.opengis.referencing.transform.MathTransform
.
+Mais dans le cas particulier où la transformation est réellement affine, SIS peut essayer d’utiliser
+une implémentation existante, surtout Java2D.
+Par exemple le code suivant peut être utilisé dans les situations où un objet Java2D est désiré:
+
+MathTransform
mt = ...;// N’importe quelle instance créée par Apache SIS. +
if (mt instanceof AffineTransform) { + AffineTransform at = (AffineTransform) mt; +// Utiliser l’API de Java2D API à partir d’ici. +
}
+Toutefois SIS n’utilisera Java2D que sur une base opportuniste.
+Le forçage de type ci-haut n’est pas garantit de réussir, même si l’instance de
+MathTransform
répond aux conditions qui devrait permettre un usage de Java2D.
+
La section précédente indiquait comment calculer les coordonnées d’un point géographique dans une projection au choix.