Revision: 5509
          http://sourceforge.net/p/jump-pilot/code/5509
Author:   michaudm
Date:     2017-10-07 09:14:29 +0000 (Sat, 07 Oct 2017)
Log Message:
-----------
Integration of Coordinate Transformation PlugIn in OpenJUMP core

Modified Paths:
--------------
    core/trunk/ChangeLog
    core/trunk/pom.xml
    core/trunk/scripts/default-plugins.xml
    core/trunk/src/language/jump.properties
    core/trunk/src/language/jump_cz.properties
    core/trunk/src/language/jump_de.properties
    core/trunk/src/language/jump_es.properties
    core/trunk/src/language/jump_fi.properties
    core/trunk/src/language/jump_fr.properties
    core/trunk/src/language/jump_hu.properties
    core/trunk/src/language/jump_it.properties
    core/trunk/src/language/jump_ja_JP.properties
    core/trunk/src/language/jump_ml.properties
    core/trunk/src/language/jump_pt.properties
    core/trunk/src/language/jump_pt_BR.properties
    core/trunk/src/language/jump_ta_IN.properties
    core/trunk/src/language/jump_te.properties
    core/trunk/src/language/jump_zh_CN.properties
    core/trunk/src/language/jump_zh_HK.properties

Added Paths:
-----------
    core/trunk/src/org/openjump/core/ui/plugin/cts/CTSPlugIn.java
    core/trunk/src/org/openjump/core/ui/plugin/cts/CoordinateSystemWrapper.java
    core/trunk/src/org/openjump/core/ui/plugin/cts/RegistryReader.java

Modified: core/trunk/ChangeLog
===================================================================
--- core/trunk/ChangeLog        2017-10-06 21:57:39 UTC (rev 5508)
+++ core/trunk/ChangeLog        2017-10-07 09:14:29 UTC (rev 5509)
@@ -3,6 +3,9 @@
 # 2. make sure that lines break at 80 chars for constricted display situations
 #<-------------------------------- 80 chars 
---------------------------------->#
 
+2017-10-07 mmichaud <m.michael.mich...@orange.fr>
+  * Integration of Coordinate Transformation PlugIn in OpenJUMP core
+
 2017-10-06 mmichaud <m.michael.mich...@orange.fr>
   * Add postgis driver options to narrow database geometry type
 

Modified: core/trunk/pom.xml
===================================================================
--- core/trunk/pom.xml  2017-10-06 21:57:39 UTC (rev 5508)
+++ core/trunk/pom.xml  2017-10-07 09:14:29 UTC (rev 5509)
@@ -881,6 +881,11 @@
             <version>2.0b4</version>
             <scope>compile</scope>
         </dependency>
+        <dependency>
+            <groupId>org.orbisgis</groupId>
+            <artifactId>cts</artifactId>
+            <version>1.5.1</version>
+        </dependency>
         <!--dependency>
           <groupId>jdom</groupId>
           <artifactId>jdom</artifactId>

Modified: core/trunk/scripts/default-plugins.xml
===================================================================
--- core/trunk/scripts/default-plugins.xml      2017-10-06 21:57:39 UTC (rev 
5508)
+++ core/trunk/scripts/default-plugins.xml      2017-10-07 09:14:29 UTC (rev 
5509)
@@ -907,6 +907,14 @@
        <plug-in> org.openjump.core.ui.plugin.raster.RasterQueryPlugIn
        </plug-in>
 
+       <!--- ======================= PLUGINS menu 
============================== -->
+       <plug-in>
+               org.openjump.core.ui.plugin.cts.CTSPlugIn
+               <menus>
+                       <main-menu menupath="MenuNames.PLUGINS" install="true" 
/>
+               </menus>
+       </plug-in>
+
        <!--- ======================= WINDOW menu 
=============================== -->
        <plug-in>
                com.vividsolutions.jump.workbench.ui.plugin.OutputWindowPlugIn

Modified: core/trunk/src/language/jump.properties
===================================================================
--- core/trunk/src/language/jump.properties     2017-10-06 21:57:39 UTC (rev 
5508)
+++ core/trunk/src/language/jump.properties     2017-10-07 09:14:29 UTC (rev 
5509)
@@ -527,6 +527,25 @@
 org.openjump.core.rasterimage.SelectRasterImageFilesPanel.Select-Raster-Image 
= Select Raster Image
 
org.openjump.core.rasterimage.SelectRasterImageFilesPanel.supported-raster-image-formats
 = Supported raster image formats
 org.openjump.core.ui.io.file.DataSourceFileLayerLoader.charset = Charset
+org.openjump.core.ui.plugin.cts.CTSPlugIn = Coordinate Transformation
+org.openjump.core.ui.plugin.cts.CTSPlugIn.registry = Registry
+org.openjump.core.ui.plugin.cts.CTSPlugIn.srcCRS = Source coordinate systeme
+org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtCRS = Target coordinate system
+org.openjump.core.ui.plugin.cts.CTSPlugIn.op-not-found = No coordinate 
operation has been found
+org.openjump.core.ui.plugin.cts.CTSPlugIn.heterogeneous-sources = Source 
layers have heterogeneous coordinate systems
+org.openjump.core.ui.plugin.cts.CTSPlugIn.transform = Transform layer
+org.openjump.core.ui.plugin.cts.CTSPlugIn.replace = Replace geometries in
+org.openjump.core.ui.plugin.cts.CTSPlugIn.srcDatum = Source datum
+org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtDatum = Target datum
+org.openjump.core.ui.plugin.cts.CTSPlugIn.srcSpheroid = Source spheroid
+org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtSpheroid = Target spheroid
+org.openjump.core.ui.plugin.cts.CTSPlugIn.transformed-layers = Transformed 
layers
+org.openjump.core.ui.plugin.cts.CTSPlugIn.srcToWgs84 = Transformation to WGS84
+org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtToWgs84 = Transformation to WGS84
+org.openjump.core.ui.plugin.cts.CTSPlugIn.invalid-src-crs = Source Coordinate 
System was not Valid
+org.openjump.core.ui.plugin.cts.CTSPlugIn.invalid-tgt-crs = Target Coordinate 
System was not Valid
+org.openjump.core.ui.plugin.cts.CTSPlugIn.srcProjection = Source Projection
+org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtProjection = Source Projection
 org.openjump.core.ui.plugin.customize.BeanToolsPlugIn.Bean-Tools = BeanShell 
Tools
 
org.openjump.core.ui.plugin.customize.PythonToolsPlugIn.Python-Console-and-Tools
 = Python Console and Tools
 org.openjump.core.ui.plugin.datastore.AddDataStoreLayerWizard = Data Store 
Layer

Modified: core/trunk/src/language/jump_cz.properties
===================================================================
--- core/trunk/src/language/jump_cz.properties  2017-10-06 21:57:39 UTC (rev 
5508)
+++ core/trunk/src/language/jump_cz.properties  2017-10-07 09:14:29 UTC (rev 
5509)
@@ -2809,4 +2809,23 @@
 org.openjump.core.ui.plugin.file.ProjectInfoPlugIn.edit-metadata=#T:Edit 
project metadata
 org.openjump.core.ui.plugin.file.ProjectInfoPlugIn.tooltip=#T:Edit SRS and 
Information metadata. Warning: changing SRS won't reproject layers.\n Metadata 
will be saved on saving project file
 
org.openjump.core.ui.plugin.datastore.DataStoreSaveDriverPanel.narrow-geometry-type=#T:Narrow
 geometry type if possible
-org.openjump.core.ui.plugin.datastore.DataStoreSaveDriverPanel.convert-to-multigeometry=#T:Convert
 to multi-geometry type
\ No newline at end of file
+org.openjump.core.ui.plugin.datastore.DataStoreSaveDriverPanel.convert-to-multigeometry=#T:Convert
 to multi-geometry type
+org.openjump.core.ui.plugin.cts.CTSPlugIn=#T:Coordinate Transformation
+org.openjump.core.ui.plugin.cts.CTSPlugIn.heterogeneous-sources=#T:Source 
layers have heterogeneous coordinate systems
+org.openjump.core.ui.plugin.cts.CTSPlugIn.invalid-src-crs=#T:Source Coordinate 
System was not Valid
+org.openjump.core.ui.plugin.cts.CTSPlugIn.invalid-tgt-crs=#T:Target Coordinate 
System was not Valid
+org.openjump.core.ui.plugin.cts.CTSPlugIn.op-not-found=#T:No coordinate 
operation has been found
+org.openjump.core.ui.plugin.cts.CTSPlugIn.registry=#T:Registry
+org.openjump.core.ui.plugin.cts.CTSPlugIn.replace=#T:Replace geometries in
+org.openjump.core.ui.plugin.cts.CTSPlugIn.srcCRS=#T:Source coordinate systeme
+org.openjump.core.ui.plugin.cts.CTSPlugIn.srcDatum=#T:Source datum
+org.openjump.core.ui.plugin.cts.CTSPlugIn.srcProjection=#T:Source Projection
+org.openjump.core.ui.plugin.cts.CTSPlugIn.srcSpheroid=#T:Source spheroid
+org.openjump.core.ui.plugin.cts.CTSPlugIn.srcToWgs84=#T:Transformation to WGS84
+org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtCRS=#T:Target coordinate system
+org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtDatum=#T:Target datum
+org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtProjection=#T:Source Projection
+org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtSpheroid=#T:Target spheroid
+org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtToWgs84=#T:Transformation to WGS84
+org.openjump.core.ui.plugin.cts.CTSPlugIn.transform=#T:Transform layer
+org.openjump.core.ui.plugin.cts.CTSPlugIn.transformed-layers=#T:Transformed 
layers
\ No newline at end of file

Modified: core/trunk/src/language/jump_de.properties
===================================================================
--- core/trunk/src/language/jump_de.properties  2017-10-06 21:57:39 UTC (rev 
5508)
+++ core/trunk/src/language/jump_de.properties  2017-10-07 09:14:29 UTC (rev 
5509)
@@ -2805,4 +2805,23 @@
 org.openjump.core.ui.plugin.file.ProjectInfoPlugIn.edit-metadata=#T:Edit 
project metadata
 org.openjump.core.ui.plugin.file.ProjectInfoPlugIn.tooltip=#T:Edit SRS and 
Information metadata. Warning: changing SRS won't reproject layers.\n Metadata 
will be saved on saving project file
 
org.openjump.core.ui.plugin.datastore.DataStoreSaveDriverPanel.narrow-geometry-type=#T:Narrow
 geometry type if possible
-org.openjump.core.ui.plugin.datastore.DataStoreSaveDriverPanel.convert-to-multigeometry=#T:Convert
 to multi-geometry type
\ No newline at end of file
+org.openjump.core.ui.plugin.datastore.DataStoreSaveDriverPanel.convert-to-multigeometry=#T:Convert
 to multi-geometry type
+org.openjump.core.ui.plugin.cts.CTSPlugIn=#T:Coordinate Transformation
+org.openjump.core.ui.plugin.cts.CTSPlugIn.heterogeneous-sources=#T:Source 
layers have heterogeneous coordinate systems
+org.openjump.core.ui.plugin.cts.CTSPlugIn.invalid-src-crs=#T:Source Coordinate 
System was not Valid
+org.openjump.core.ui.plugin.cts.CTSPlugIn.invalid-tgt-crs=#T:Target Coordinate 
System was not Valid
+org.openjump.core.ui.plugin.cts.CTSPlugIn.op-not-found=#T:No coordinate 
operation has been found
+org.openjump.core.ui.plugin.cts.CTSPlugIn.registry=#T:Registry
+org.openjump.core.ui.plugin.cts.CTSPlugIn.replace=#T:Replace geometries in
+org.openjump.core.ui.plugin.cts.CTSPlugIn.srcCRS=#T:Source coordinate systeme
+org.openjump.core.ui.plugin.cts.CTSPlugIn.srcDatum=#T:Source datum
+org.openjump.core.ui.plugin.cts.CTSPlugIn.srcProjection=#T:Source Projection
+org.openjump.core.ui.plugin.cts.CTSPlugIn.srcSpheroid=#T:Source spheroid
+org.openjump.core.ui.plugin.cts.CTSPlugIn.srcToWgs84=#T:Transformation to WGS84
+org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtCRS=#T:Target coordinate system
+org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtDatum=#T:Target datum
+org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtProjection=#T:Source Projection
+org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtSpheroid=#T:Target spheroid
+org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtToWgs84=#T:Transformation to WGS84
+org.openjump.core.ui.plugin.cts.CTSPlugIn.transform=#T:Transform layer
+org.openjump.core.ui.plugin.cts.CTSPlugIn.transformed-layers=#T:Transformed 
layers
\ No newline at end of file

Modified: core/trunk/src/language/jump_es.properties
===================================================================
--- core/trunk/src/language/jump_es.properties  2017-10-06 21:57:39 UTC (rev 
5508)
+++ core/trunk/src/language/jump_es.properties  2017-10-07 09:14:29 UTC (rev 
5509)
@@ -2786,4 +2786,23 @@
 org.openjump.core.ui.plugin.file.ProjectInfoPlugIn.edit-metadata=#T:Edit 
project metadata
 org.openjump.core.ui.plugin.file.ProjectInfoPlugIn.tooltip=#T:Edit SRS and 
Information metadata. Warning: changing SRS won't reproject layers.\n Metadata 
will be saved on saving project file
 
org.openjump.core.ui.plugin.datastore.DataStoreSaveDriverPanel.narrow-geometry-type=#T:Narrow
 geometry type if possible
-org.openjump.core.ui.plugin.datastore.DataStoreSaveDriverPanel.convert-to-multigeometry=#T:Convert
 to multi-geometry type
\ No newline at end of file
+org.openjump.core.ui.plugin.datastore.DataStoreSaveDriverPanel.convert-to-multigeometry=#T:Convert
 to multi-geometry type
+org.openjump.core.ui.plugin.cts.CTSPlugIn=#T:Coordinate Transformation
+org.openjump.core.ui.plugin.cts.CTSPlugIn.heterogeneous-sources=#T:Source 
layers have heterogeneous coordinate systems
+org.openjump.core.ui.plugin.cts.CTSPlugIn.invalid-src-crs=#T:Source Coordinate 
System was not Valid
+org.openjump.core.ui.plugin.cts.CTSPlugIn.invalid-tgt-crs=#T:Target Coordinate 
System was not Valid
+org.openjump.core.ui.plugin.cts.CTSPlugIn.op-not-found=#T:No coordinate 
operation has been found
+org.openjump.core.ui.plugin.cts.CTSPlugIn.registry=#T:Registry
+org.openjump.core.ui.plugin.cts.CTSPlugIn.replace=#T:Replace geometries in
+org.openjump.core.ui.plugin.cts.CTSPlugIn.srcCRS=#T:Source coordinate systeme
+org.openjump.core.ui.plugin.cts.CTSPlugIn.srcDatum=#T:Source datum
+org.openjump.core.ui.plugin.cts.CTSPlugIn.srcProjection=#T:Source Projection
+org.openjump.core.ui.plugin.cts.CTSPlugIn.srcSpheroid=#T:Source spheroid
+org.openjump.core.ui.plugin.cts.CTSPlugIn.srcToWgs84=#T:Transformation to WGS84
+org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtCRS=#T:Target coordinate system
+org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtDatum=#T:Target datum
+org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtProjection=#T:Source Projection
+org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtSpheroid=#T:Target spheroid
+org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtToWgs84=#T:Transformation to WGS84
+org.openjump.core.ui.plugin.cts.CTSPlugIn.transform=#T:Transform layer
+org.openjump.core.ui.plugin.cts.CTSPlugIn.transformed-layers=#T:Transformed 
layers
\ No newline at end of file

Modified: core/trunk/src/language/jump_fi.properties
===================================================================
--- core/trunk/src/language/jump_fi.properties  2017-10-06 21:57:39 UTC (rev 
5508)
+++ core/trunk/src/language/jump_fi.properties  2017-10-07 09:14:29 UTC (rev 
5509)
@@ -2782,4 +2782,23 @@
 org.openjump.core.ui.plugin.file.ProjectInfoPlugIn.edit-metadata=Muokkaa 
projektin metatietoja
 org.openjump.core.ui.plugin.file.ProjectInfoPlugIn.tooltip=Muokkaa 
metatietoja. Varoitus: SRS:n muuttaminen ei uudelleenprojisoi tasoja.\n 
Metatiedot tallennetaan pysyv\u00E4sti kun projektitiedosto tallennetaan
 
org.openjump.core.ui.plugin.datastore.DataStoreSaveDriverPanel.narrow-geometry-type=#T:Narrow
 geometry type if possible
-org.openjump.core.ui.plugin.datastore.DataStoreSaveDriverPanel.convert-to-multigeometry=#T:Convert
 to multi-geometry type
\ No newline at end of file
+org.openjump.core.ui.plugin.datastore.DataStoreSaveDriverPanel.convert-to-multigeometry=#T:Convert
 to multi-geometry type
+org.openjump.core.ui.plugin.cts.CTSPlugIn=#T:Coordinate Transformation
+org.openjump.core.ui.plugin.cts.CTSPlugIn.heterogeneous-sources=#T:Source 
layers have heterogeneous coordinate systems
+org.openjump.core.ui.plugin.cts.CTSPlugIn.invalid-src-crs=#T:Source Coordinate 
System was not Valid
+org.openjump.core.ui.plugin.cts.CTSPlugIn.invalid-tgt-crs=#T:Target Coordinate 
System was not Valid
+org.openjump.core.ui.plugin.cts.CTSPlugIn.op-not-found=#T:No coordinate 
operation has been found
+org.openjump.core.ui.plugin.cts.CTSPlugIn.registry=#T:Registry
+org.openjump.core.ui.plugin.cts.CTSPlugIn.replace=#T:Replace geometries in
+org.openjump.core.ui.plugin.cts.CTSPlugIn.srcCRS=#T:Source coordinate systeme
+org.openjump.core.ui.plugin.cts.CTSPlugIn.srcDatum=#T:Source datum
+org.openjump.core.ui.plugin.cts.CTSPlugIn.srcProjection=#T:Source Projection
+org.openjump.core.ui.plugin.cts.CTSPlugIn.srcSpheroid=#T:Source spheroid
+org.openjump.core.ui.plugin.cts.CTSPlugIn.srcToWgs84=#T:Transformation to WGS84
+org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtCRS=#T:Target coordinate system
+org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtDatum=#T:Target datum
+org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtProjection=#T:Source Projection
+org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtSpheroid=#T:Target spheroid
+org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtToWgs84=#T:Transformation to WGS84
+org.openjump.core.ui.plugin.cts.CTSPlugIn.transform=#T:Transform layer
+org.openjump.core.ui.plugin.cts.CTSPlugIn.transformed-layers=#T:Transformed 
layers
\ No newline at end of file

Modified: core/trunk/src/language/jump_fr.properties
===================================================================
--- core/trunk/src/language/jump_fr.properties  2017-10-06 21:57:39 UTC (rev 
5508)
+++ core/trunk/src/language/jump_fr.properties  2017-10-07 09:14:29 UTC (rev 
5509)
@@ -488,6 +488,25 @@
 org.openjump.core.rasterimage.SelectRasterImageFilesPanel.Select-Raster-Image 
= S\u00e9lectionner l'image raster
 
org.openjump.core.rasterimage.SelectRasterImageFilesPanel.supported-raster-image-formats
 = Formats d'images reconnus
 org.openjump.core.ui.io.file.DataSourceFileLayerLoader.charset = Jeu de 
caract\u00e8res
+org.openjump.core.ui.plugin.cts.CTSPlugIn = Transformation de coordonn\xE9es
+org.openjump.core.ui.plugin.cts.CTSPlugIn.registry = Registre
+org.openjump.core.ui.plugin.cts.CTSPlugIn.srcCRS = Syst\xE8me de 
coordonn\xE9es source
+org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtCRS = Syst\xE8me de 
coordonn\xE9es cible
+org.openjump.core.ui.plugin.cts.CTSPlugIn.op-not-found = Aucune transformation 
n'a \xE9t\xE9 trouv\xE9e
+org.openjump.core.ui.plugin.cts.CTSPlugIn.heterogeneous-sources = Les couches 
sources ont des Syst\xE8me de coordonn\xE9es h\xE9t\xE9rog\xE8nes
+org.openjump.core.ui.plugin.cts.CTSPlugIn.transform = Transformation de la 
couche
+org.openjump.core.ui.plugin.cts.CTSPlugIn.replace = Remplacement des 
g\xE9om\xE9tries dans
+org.openjump.core.ui.plugin.cts.CTSPlugIn.srcDatum = R\xE9f\xE9rentiel source
+org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtDatum = R\xE9f\xE9rentiel cible
+org.openjump.core.ui.plugin.cts.CTSPlugIn.srcSpheroid = Ellipso\xEFde source
+org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtSpheroid = Ellipso\xEFde cible
+org.openjump.core.ui.plugin.cts.CTSPlugIn.transformed-layers = Couches 
transform\xE9es
+org.openjump.core.ui.plugin.cts.CTSPlugIn.srcToWgs84 = Transformation vers 
WGS84
+org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtToWgs84 = Transformation vers 
WGS84
+org.openjump.core.ui.plugin.cts.CTSPlugIn.invalid-src-crs = Le syst\xE8me de 
coordonn\xE9es source \xE9tait invalide
+org.openjump.core.ui.plugin.cts.CTSPlugIn.invalid-tgt-crs = Le syst\xE8me de 
coordonn\xE9es cible \xE9tait invalide
+org.openjump.core.ui.plugin.cts.CTSPlugIn.srcProjection = Projection source
+org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtProjection = Projection cible
 org.openjump.core.ui.plugin.customize.BeanToolsPlugIn.Bean-Tools = BeanShell 
Tools
 
org.openjump.core.ui.plugin.customize.PythonToolsPlugIn.Python-Console-and-Tools
 = Outils et console Python
 org.openjump.core.ui.plugin.datastore.AddDataStoreLayerWizard = Base de 
donn\u00e9es

Modified: core/trunk/src/language/jump_hu.properties
===================================================================
--- core/trunk/src/language/jump_hu.properties  2017-10-06 21:57:39 UTC (rev 
5508)
+++ core/trunk/src/language/jump_hu.properties  2017-10-07 09:14:29 UTC (rev 
5509)
@@ -2801,4 +2801,23 @@
 org.openjump.core.ui.plugin.file.ProjectInfoPlugIn.edit-metadata=#T:Edit 
project metadata
 org.openjump.core.ui.plugin.file.ProjectInfoPlugIn.tooltip=#T:Edit SRS and 
Information metadata. Warning: changing SRS won't reproject layers.\n Metadata 
will be saved on saving project file
 
org.openjump.core.ui.plugin.datastore.DataStoreSaveDriverPanel.narrow-geometry-type=#T:Narrow
 geometry type if possible
-org.openjump.core.ui.plugin.datastore.DataStoreSaveDriverPanel.convert-to-multigeometry=#T:Convert
 to multi-geometry type
\ No newline at end of file
+org.openjump.core.ui.plugin.datastore.DataStoreSaveDriverPanel.convert-to-multigeometry=#T:Convert
 to multi-geometry type
+org.openjump.core.ui.plugin.cts.CTSPlugIn=#T:Coordinate Transformation
+org.openjump.core.ui.plugin.cts.CTSPlugIn.heterogeneous-sources=#T:Source 
layers have heterogeneous coordinate systems
+org.openjump.core.ui.plugin.cts.CTSPlugIn.invalid-src-crs=#T:Source Coordinate 
System was not Valid
+org.openjump.core.ui.plugin.cts.CTSPlugIn.invalid-tgt-crs=#T:Target Coordinate 
System was not Valid
+org.openjump.core.ui.plugin.cts.CTSPlugIn.op-not-found=#T:No coordinate 
operation has been found
+org.openjump.core.ui.plugin.cts.CTSPlugIn.registry=#T:Registry
+org.openjump.core.ui.plugin.cts.CTSPlugIn.replace=#T:Replace geometries in
+org.openjump.core.ui.plugin.cts.CTSPlugIn.srcCRS=#T:Source coordinate systeme
+org.openjump.core.ui.plugin.cts.CTSPlugIn.srcDatum=#T:Source datum
+org.openjump.core.ui.plugin.cts.CTSPlugIn.srcProjection=#T:Source Projection
+org.openjump.core.ui.plugin.cts.CTSPlugIn.srcSpheroid=#T:Source spheroid
+org.openjump.core.ui.plugin.cts.CTSPlugIn.srcToWgs84=#T:Transformation to WGS84
+org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtCRS=#T:Target coordinate system
+org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtDatum=#T:Target datum
+org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtProjection=#T:Source Projection
+org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtSpheroid=#T:Target spheroid
+org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtToWgs84=#T:Transformation to WGS84
+org.openjump.core.ui.plugin.cts.CTSPlugIn.transform=#T:Transform layer
+org.openjump.core.ui.plugin.cts.CTSPlugIn.transformed-layers=#T:Transformed 
layers
\ No newline at end of file

Modified: core/trunk/src/language/jump_it.properties
===================================================================
--- core/trunk/src/language/jump_it.properties  2017-10-06 21:57:39 UTC (rev 
5508)
+++ core/trunk/src/language/jump_it.properties  2017-10-07 09:14:29 UTC (rev 
5509)
@@ -2788,4 +2788,23 @@
 org.openjump.core.ui.plugin.file.ProjectInfoPlugIn.edit-metadata=Edita 
metadati del progetto
 org.openjump.core.ui.plugin.file.ProjectInfoPlugIn.tooltip=#T:Edit SRS and 
Information metadata. Warning: changing SRS won't reproject layers.\n Metadata 
will be saved on saving project file
 
org.openjump.core.ui.plugin.datastore.DataStoreSaveDriverPanel.narrow-geometry-type=#T:Narrow
 geometry type if possible
-org.openjump.core.ui.plugin.datastore.DataStoreSaveDriverPanel.convert-to-multigeometry=#T:Convert
 to multi-geometry type
\ No newline at end of file
+org.openjump.core.ui.plugin.datastore.DataStoreSaveDriverPanel.convert-to-multigeometry=#T:Convert
 to multi-geometry type
+org.openjump.core.ui.plugin.cts.CTSPlugIn=#T:Coordinate Transformation
+org.openjump.core.ui.plugin.cts.CTSPlugIn.heterogeneous-sources=#T:Source 
layers have heterogeneous coordinate systems
+org.openjump.core.ui.plugin.cts.CTSPlugIn.invalid-src-crs=#T:Source Coordinate 
System was not Valid
+org.openjump.core.ui.plugin.cts.CTSPlugIn.invalid-tgt-crs=#T:Target Coordinate 
System was not Valid
+org.openjump.core.ui.plugin.cts.CTSPlugIn.op-not-found=#T:No coordinate 
operation has been found
+org.openjump.core.ui.plugin.cts.CTSPlugIn.registry=#T:Registry
+org.openjump.core.ui.plugin.cts.CTSPlugIn.replace=#T:Replace geometries in
+org.openjump.core.ui.plugin.cts.CTSPlugIn.srcCRS=#T:Source coordinate systeme
+org.openjump.core.ui.plugin.cts.CTSPlugIn.srcDatum=#T:Source datum
+org.openjump.core.ui.plugin.cts.CTSPlugIn.srcProjection=#T:Source Projection
+org.openjump.core.ui.plugin.cts.CTSPlugIn.srcSpheroid=#T:Source spheroid
+org.openjump.core.ui.plugin.cts.CTSPlugIn.srcToWgs84=#T:Transformation to WGS84
+org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtCRS=#T:Target coordinate system
+org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtDatum=#T:Target datum
+org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtProjection=#T:Source Projection
+org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtSpheroid=#T:Target spheroid
+org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtToWgs84=#T:Transformation to WGS84
+org.openjump.core.ui.plugin.cts.CTSPlugIn.transform=#T:Transform layer
+org.openjump.core.ui.plugin.cts.CTSPlugIn.transformed-layers=#T:Transformed 
layers
\ No newline at end of file

Modified: core/trunk/src/language/jump_ja_JP.properties
===================================================================
--- core/trunk/src/language/jump_ja_JP.properties       2017-10-06 21:57:39 UTC 
(rev 5508)
+++ core/trunk/src/language/jump_ja_JP.properties       2017-10-07 09:14:29 UTC 
(rev 5509)
@@ -2803,4 +2803,23 @@
 org.openjump.core.ui.plugin.file.ProjectInfoPlugIn.edit-metadata=#T:Edit 
project metadata
 org.openjump.core.ui.plugin.file.ProjectInfoPlugIn.tooltip=#T:Edit SRS and 
Information metadata. Warning: changing SRS won't reproject layers.\n Metadata 
will be saved on saving project file
 
org.openjump.core.ui.plugin.datastore.DataStoreSaveDriverPanel.narrow-geometry-type=#T:Narrow
 geometry type if possible
-org.openjump.core.ui.plugin.datastore.DataStoreSaveDriverPanel.convert-to-multigeometry=#T:Convert
 to multi-geometry type
\ No newline at end of file
+org.openjump.core.ui.plugin.datastore.DataStoreSaveDriverPanel.convert-to-multigeometry=#T:Convert
 to multi-geometry type
+org.openjump.core.ui.plugin.cts.CTSPlugIn=#T:Coordinate Transformation
+org.openjump.core.ui.plugin.cts.CTSPlugIn.heterogeneous-sources=#T:Source 
layers have heterogeneous coordinate systems
+org.openjump.core.ui.plugin.cts.CTSPlugIn.invalid-src-crs=#T:Source Coordinate 
System was not Valid
+org.openjump.core.ui.plugin.cts.CTSPlugIn.invalid-tgt-crs=#T:Target Coordinate 
System was not Valid
+org.openjump.core.ui.plugin.cts.CTSPlugIn.op-not-found=#T:No coordinate 
operation has been found
+org.openjump.core.ui.plugin.cts.CTSPlugIn.registry=#T:Registry
+org.openjump.core.ui.plugin.cts.CTSPlugIn.replace=#T:Replace geometries in
+org.openjump.core.ui.plugin.cts.CTSPlugIn.srcCRS=#T:Source coordinate systeme
+org.openjump.core.ui.plugin.cts.CTSPlugIn.srcDatum=#T:Source datum
+org.openjump.core.ui.plugin.cts.CTSPlugIn.srcProjection=#T:Source Projection
+org.openjump.core.ui.plugin.cts.CTSPlugIn.srcSpheroid=#T:Source spheroid
+org.openjump.core.ui.plugin.cts.CTSPlugIn.srcToWgs84=#T:Transformation to WGS84
+org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtCRS=#T:Target coordinate system
+org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtDatum=#T:Target datum
+org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtProjection=#T:Source Projection
+org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtSpheroid=#T:Target spheroid
+org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtToWgs84=#T:Transformation to WGS84
+org.openjump.core.ui.plugin.cts.CTSPlugIn.transform=#T:Transform layer
+org.openjump.core.ui.plugin.cts.CTSPlugIn.transformed-layers=#T:Transformed 
layers
\ No newline at end of file

Modified: core/trunk/src/language/jump_ml.properties
===================================================================
--- core/trunk/src/language/jump_ml.properties  2017-10-06 21:57:39 UTC (rev 
5508)
+++ core/trunk/src/language/jump_ml.properties  2017-10-07 09:14:29 UTC (rev 
5509)
@@ -4076,4 +4076,23 @@
 org.openjump.core.ui.plugin.file.ProjectInfoPlugIn.edit-metadata=#T:Edit 
project metadata
 org.openjump.core.ui.plugin.file.ProjectInfoPlugIn.tooltip=#T:Edit SRS and 
Information metadata. Warning: changing SRS won't reproject layers.\n Metadata 
will be saved on saving project file
 
org.openjump.core.ui.plugin.datastore.DataStoreSaveDriverPanel.narrow-geometry-type=#T:Narrow
 geometry type if possible
-org.openjump.core.ui.plugin.datastore.DataStoreSaveDriverPanel.convert-to-multigeometry=#T:Convert
 to multi-geometry type
\ No newline at end of file
+org.openjump.core.ui.plugin.datastore.DataStoreSaveDriverPanel.convert-to-multigeometry=#T:Convert
 to multi-geometry type
+org.openjump.core.ui.plugin.cts.CTSPlugIn=#T:Coordinate Transformation
+org.openjump.core.ui.plugin.cts.CTSPlugIn.heterogeneous-sources=#T:Source 
layers have heterogeneous coordinate systems
+org.openjump.core.ui.plugin.cts.CTSPlugIn.invalid-src-crs=#T:Source Coordinate 
System was not Valid
+org.openjump.core.ui.plugin.cts.CTSPlugIn.invalid-tgt-crs=#T:Target Coordinate 
System was not Valid
+org.openjump.core.ui.plugin.cts.CTSPlugIn.op-not-found=#T:No coordinate 
operation has been found
+org.openjump.core.ui.plugin.cts.CTSPlugIn.registry=#T:Registry
+org.openjump.core.ui.plugin.cts.CTSPlugIn.replace=#T:Replace geometries in
+org.openjump.core.ui.plugin.cts.CTSPlugIn.srcCRS=#T:Source coordinate systeme
+org.openjump.core.ui.plugin.cts.CTSPlugIn.srcDatum=#T:Source datum
+org.openjump.core.ui.plugin.cts.CTSPlugIn.srcProjection=#T:Source Projection
+org.openjump.core.ui.plugin.cts.CTSPlugIn.srcSpheroid=#T:Source spheroid
+org.openjump.core.ui.plugin.cts.CTSPlugIn.srcToWgs84=#T:Transformation to WGS84
+org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtCRS=#T:Target coordinate system
+org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtDatum=#T:Target datum
+org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtProjection=#T:Source Projection
+org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtSpheroid=#T:Target spheroid
+org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtToWgs84=#T:Transformation to WGS84
+org.openjump.core.ui.plugin.cts.CTSPlugIn.transform=#T:Transform layer
+org.openjump.core.ui.plugin.cts.CTSPlugIn.transformed-layers=#T:Transformed 
layers
\ No newline at end of file

Modified: core/trunk/src/language/jump_pt.properties
===================================================================
--- core/trunk/src/language/jump_pt.properties  2017-10-06 21:57:39 UTC (rev 
5508)
+++ core/trunk/src/language/jump_pt.properties  2017-10-07 09:14:29 UTC (rev 
5509)
@@ -2802,4 +2802,23 @@
 org.openjump.core.ui.plugin.file.ProjectInfoPlugIn.edit-metadata=#T:Edit 
project metadata
 org.openjump.core.ui.plugin.file.ProjectInfoPlugIn.tooltip=#T:Edit SRS and 
Information metadata. Warning: changing SRS won't reproject layers.\n Metadata 
will be saved on saving project file
 
org.openjump.core.ui.plugin.datastore.DataStoreSaveDriverPanel.narrow-geometry-type=#T:Narrow
 geometry type if possible
-org.openjump.core.ui.plugin.datastore.DataStoreSaveDriverPanel.convert-to-multigeometry=#T:Convert
 to multi-geometry type
\ No newline at end of file
+org.openjump.core.ui.plugin.datastore.DataStoreSaveDriverPanel.convert-to-multigeometry=#T:Convert
 to multi-geometry type
+org.openjump.core.ui.plugin.cts.CTSPlugIn=#T:Coordinate Transformation
+org.openjump.core.ui.plugin.cts.CTSPlugIn.heterogeneous-sources=#T:Source 
layers have heterogeneous coordinate systems
+org.openjump.core.ui.plugin.cts.CTSPlugIn.invalid-src-crs=#T:Source Coordinate 
System was not Valid
+org.openjump.core.ui.plugin.cts.CTSPlugIn.invalid-tgt-crs=#T:Target Coordinate 
System was not Valid
+org.openjump.core.ui.plugin.cts.CTSPlugIn.op-not-found=#T:No coordinate 
operation has been found
+org.openjump.core.ui.plugin.cts.CTSPlugIn.registry=#T:Registry
+org.openjump.core.ui.plugin.cts.CTSPlugIn.replace=#T:Replace geometries in
+org.openjump.core.ui.plugin.cts.CTSPlugIn.srcCRS=#T:Source coordinate systeme
+org.openjump.core.ui.plugin.cts.CTSPlugIn.srcDatum=#T:Source datum
+org.openjump.core.ui.plugin.cts.CTSPlugIn.srcProjection=#T:Source Projection
+org.openjump.core.ui.plugin.cts.CTSPlugIn.srcSpheroid=#T:Source spheroid
+org.openjump.core.ui.plugin.cts.CTSPlugIn.srcToWgs84=#T:Transformation to WGS84
+org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtCRS=#T:Target coordinate system
+org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtDatum=#T:Target datum
+org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtProjection=#T:Source Projection
+org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtSpheroid=#T:Target spheroid
+org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtToWgs84=#T:Transformation to WGS84
+org.openjump.core.ui.plugin.cts.CTSPlugIn.transform=#T:Transform layer
+org.openjump.core.ui.plugin.cts.CTSPlugIn.transformed-layers=#T:Transformed 
layers
\ No newline at end of file

Modified: core/trunk/src/language/jump_pt_BR.properties
===================================================================
--- core/trunk/src/language/jump_pt_BR.properties       2017-10-06 21:57:39 UTC 
(rev 5508)
+++ core/trunk/src/language/jump_pt_BR.properties       2017-10-07 09:14:29 UTC 
(rev 5509)
@@ -2802,4 +2802,23 @@
 org.openjump.core.ui.plugin.file.ProjectInfoPlugIn.edit-metadata=#T:Edit 
project metadata
 org.openjump.core.ui.plugin.file.ProjectInfoPlugIn.tooltip=#T:Edit SRS and 
Information metadata. Warning: changing SRS won't reproject layers.\n Metadata 
will be saved on saving project file
 
org.openjump.core.ui.plugin.datastore.DataStoreSaveDriverPanel.narrow-geometry-type=#T:Narrow
 geometry type if possible
-org.openjump.core.ui.plugin.datastore.DataStoreSaveDriverPanel.convert-to-multigeometry=#T:Convert
 to multi-geometry type
\ No newline at end of file
+org.openjump.core.ui.plugin.datastore.DataStoreSaveDriverPanel.convert-to-multigeometry=#T:Convert
 to multi-geometry type
+org.openjump.core.ui.plugin.cts.CTSPlugIn=#T:Coordinate Transformation
+org.openjump.core.ui.plugin.cts.CTSPlugIn.heterogeneous-sources=#T:Source 
layers have heterogeneous coordinate systems
+org.openjump.core.ui.plugin.cts.CTSPlugIn.invalid-src-crs=#T:Source Coordinate 
System was not Valid
+org.openjump.core.ui.plugin.cts.CTSPlugIn.invalid-tgt-crs=#T:Target Coordinate 
System was not Valid
+org.openjump.core.ui.plugin.cts.CTSPlugIn.op-not-found=#T:No coordinate 
operation has been found
+org.openjump.core.ui.plugin.cts.CTSPlugIn.registry=#T:Registry
+org.openjump.core.ui.plugin.cts.CTSPlugIn.replace=#T:Replace geometries in
+org.openjump.core.ui.plugin.cts.CTSPlugIn.srcCRS=#T:Source coordinate systeme
+org.openjump.core.ui.plugin.cts.CTSPlugIn.srcDatum=#T:Source datum
+org.openjump.core.ui.plugin.cts.CTSPlugIn.srcProjection=#T:Source Projection
+org.openjump.core.ui.plugin.cts.CTSPlugIn.srcSpheroid=#T:Source spheroid
+org.openjump.core.ui.plugin.cts.CTSPlugIn.srcToWgs84=#T:Transformation to WGS84
+org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtCRS=#T:Target coordinate system
+org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtDatum=#T:Target datum
+org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtProjection=#T:Source Projection
+org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtSpheroid=#T:Target spheroid
+org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtToWgs84=#T:Transformation to WGS84
+org.openjump.core.ui.plugin.cts.CTSPlugIn.transform=#T:Transform layer
+org.openjump.core.ui.plugin.cts.CTSPlugIn.transformed-layers=#T:Transformed 
layers
\ No newline at end of file

Modified: core/trunk/src/language/jump_ta_IN.properties
===================================================================
--- core/trunk/src/language/jump_ta_IN.properties       2017-10-06 21:57:39 UTC 
(rev 5508)
+++ core/trunk/src/language/jump_ta_IN.properties       2017-10-07 09:14:29 UTC 
(rev 5509)
@@ -2801,4 +2801,23 @@
 org.openjump.core.ui.plugin.file.ProjectInfoPlugIn.edit-metadata=#T:Edit 
project metadata
 org.openjump.core.ui.plugin.file.ProjectInfoPlugIn.tooltip=#T:Edit SRS and 
Information metadata. Warning: changing SRS won't reproject layers.\n Metadata 
will be saved on saving project file
 
org.openjump.core.ui.plugin.datastore.DataStoreSaveDriverPanel.narrow-geometry-type=#T:Narrow
 geometry type if possible
-org.openjump.core.ui.plugin.datastore.DataStoreSaveDriverPanel.convert-to-multigeometry=#T:Convert
 to multi-geometry type
\ No newline at end of file
+org.openjump.core.ui.plugin.datastore.DataStoreSaveDriverPanel.convert-to-multigeometry=#T:Convert
 to multi-geometry type
+org.openjump.core.ui.plugin.cts.CTSPlugIn=#T:Coordinate Transformation
+org.openjump.core.ui.plugin.cts.CTSPlugIn.heterogeneous-sources=#T:Source 
layers have heterogeneous coordinate systems
+org.openjump.core.ui.plugin.cts.CTSPlugIn.invalid-src-crs=#T:Source Coordinate 
System was not Valid
+org.openjump.core.ui.plugin.cts.CTSPlugIn.invalid-tgt-crs=#T:Target Coordinate 
System was not Valid
+org.openjump.core.ui.plugin.cts.CTSPlugIn.op-not-found=#T:No coordinate 
operation has been found
+org.openjump.core.ui.plugin.cts.CTSPlugIn.registry=#T:Registry
+org.openjump.core.ui.plugin.cts.CTSPlugIn.replace=#T:Replace geometries in
+org.openjump.core.ui.plugin.cts.CTSPlugIn.srcCRS=#T:Source coordinate systeme
+org.openjump.core.ui.plugin.cts.CTSPlugIn.srcDatum=#T:Source datum
+org.openjump.core.ui.plugin.cts.CTSPlugIn.srcProjection=#T:Source Projection
+org.openjump.core.ui.plugin.cts.CTSPlugIn.srcSpheroid=#T:Source spheroid
+org.openjump.core.ui.plugin.cts.CTSPlugIn.srcToWgs84=#T:Transformation to WGS84
+org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtCRS=#T:Target coordinate system
+org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtDatum=#T:Target datum
+org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtProjection=#T:Source Projection
+org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtSpheroid=#T:Target spheroid
+org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtToWgs84=#T:Transformation to WGS84
+org.openjump.core.ui.plugin.cts.CTSPlugIn.transform=#T:Transform layer
+org.openjump.core.ui.plugin.cts.CTSPlugIn.transformed-layers=#T:Transformed 
layers
\ No newline at end of file

Modified: core/trunk/src/language/jump_te.properties
===================================================================
--- core/trunk/src/language/jump_te.properties  2017-10-06 21:57:39 UTC (rev 
5508)
+++ core/trunk/src/language/jump_te.properties  2017-10-07 09:14:29 UTC (rev 
5509)
@@ -3308,4 +3308,23 @@
 org.openjump.core.ui.plugin.file.ProjectInfoPlugIn.edit-metadata=#T:Edit 
project metadata
 org.openjump.core.ui.plugin.file.ProjectInfoPlugIn.tooltip=#T:Edit SRS and 
Information metadata. Warning: changing SRS won't reproject layers.\n Metadata 
will be saved on saving project file
 
org.openjump.core.ui.plugin.datastore.DataStoreSaveDriverPanel.narrow-geometry-type=#T:Narrow
 geometry type if possible
-org.openjump.core.ui.plugin.datastore.DataStoreSaveDriverPanel.convert-to-multigeometry=#T:Convert
 to multi-geometry type
\ No newline at end of file
+org.openjump.core.ui.plugin.datastore.DataStoreSaveDriverPanel.convert-to-multigeometry=#T:Convert
 to multi-geometry type
+org.openjump.core.ui.plugin.cts.CTSPlugIn=#T:Coordinate Transformation
+org.openjump.core.ui.plugin.cts.CTSPlugIn.heterogeneous-sources=#T:Source 
layers have heterogeneous coordinate systems
+org.openjump.core.ui.plugin.cts.CTSPlugIn.invalid-src-crs=#T:Source Coordinate 
System was not Valid
+org.openjump.core.ui.plugin.cts.CTSPlugIn.invalid-tgt-crs=#T:Target Coordinate 
System was not Valid
+org.openjump.core.ui.plugin.cts.CTSPlugIn.op-not-found=#T:No coordinate 
operation has been found
+org.openjump.core.ui.plugin.cts.CTSPlugIn.registry=#T:Registry
+org.openjump.core.ui.plugin.cts.CTSPlugIn.replace=#T:Replace geometries in
+org.openjump.core.ui.plugin.cts.CTSPlugIn.srcCRS=#T:Source coordinate systeme
+org.openjump.core.ui.plugin.cts.CTSPlugIn.srcDatum=#T:Source datum
+org.openjump.core.ui.plugin.cts.CTSPlugIn.srcProjection=#T:Source Projection
+org.openjump.core.ui.plugin.cts.CTSPlugIn.srcSpheroid=#T:Source spheroid
+org.openjump.core.ui.plugin.cts.CTSPlugIn.srcToWgs84=#T:Transformation to WGS84
+org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtCRS=#T:Target coordinate system
+org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtDatum=#T:Target datum
+org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtProjection=#T:Source Projection
+org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtSpheroid=#T:Target spheroid
+org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtToWgs84=#T:Transformation to WGS84
+org.openjump.core.ui.plugin.cts.CTSPlugIn.transform=#T:Transform layer
+org.openjump.core.ui.plugin.cts.CTSPlugIn.transformed-layers=#T:Transformed 
layers
\ No newline at end of file

Modified: core/trunk/src/language/jump_zh_CN.properties
===================================================================
--- core/trunk/src/language/jump_zh_CN.properties       2017-10-06 21:57:39 UTC 
(rev 5508)
+++ core/trunk/src/language/jump_zh_CN.properties       2017-10-07 09:14:29 UTC 
(rev 5509)
@@ -2965,4 +2965,23 @@
 org.openjump.core.ui.plugin.file.ProjectInfoPlugIn.edit-metadata=#T:Edit 
project metadata
 org.openjump.core.ui.plugin.file.ProjectInfoPlugIn.tooltip=#T:Edit SRS and 
Information metadata. Warning: changing SRS won't reproject layers.\n Metadata 
will be saved on saving project file
 
org.openjump.core.ui.plugin.datastore.DataStoreSaveDriverPanel.narrow-geometry-type=#T:Narrow
 geometry type if possible
-org.openjump.core.ui.plugin.datastore.DataStoreSaveDriverPanel.convert-to-multigeometry=#T:Convert
 to multi-geometry type
\ No newline at end of file
+org.openjump.core.ui.plugin.datastore.DataStoreSaveDriverPanel.convert-to-multigeometry=#T:Convert
 to multi-geometry type
+org.openjump.core.ui.plugin.cts.CTSPlugIn=#T:Coordinate Transformation
+org.openjump.core.ui.plugin.cts.CTSPlugIn.heterogeneous-sources=#T:Source 
layers have heterogeneous coordinate systems
+org.openjump.core.ui.plugin.cts.CTSPlugIn.invalid-src-crs=#T:Source Coordinate 
System was not Valid
+org.openjump.core.ui.plugin.cts.CTSPlugIn.invalid-tgt-crs=#T:Target Coordinate 
System was not Valid
+org.openjump.core.ui.plugin.cts.CTSPlugIn.op-not-found=#T:No coordinate 
operation has been found
+org.openjump.core.ui.plugin.cts.CTSPlugIn.registry=#T:Registry
+org.openjump.core.ui.plugin.cts.CTSPlugIn.replace=#T:Replace geometries in
+org.openjump.core.ui.plugin.cts.CTSPlugIn.srcCRS=#T:Source coordinate systeme
+org.openjump.core.ui.plugin.cts.CTSPlugIn.srcDatum=#T:Source datum
+org.openjump.core.ui.plugin.cts.CTSPlugIn.srcProjection=#T:Source Projection
+org.openjump.core.ui.plugin.cts.CTSPlugIn.srcSpheroid=#T:Source spheroid
+org.openjump.core.ui.plugin.cts.CTSPlugIn.srcToWgs84=#T:Transformation to WGS84
+org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtCRS=#T:Target coordinate system
+org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtDatum=#T:Target datum
+org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtProjection=#T:Source Projection
+org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtSpheroid=#T:Target spheroid
+org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtToWgs84=#T:Transformation to WGS84
+org.openjump.core.ui.plugin.cts.CTSPlugIn.transform=#T:Transform layer
+org.openjump.core.ui.plugin.cts.CTSPlugIn.transformed-layers=#T:Transformed 
layers
\ No newline at end of file

Modified: core/trunk/src/language/jump_zh_HK.properties
===================================================================
--- core/trunk/src/language/jump_zh_HK.properties       2017-10-06 21:57:39 UTC 
(rev 5508)
+++ core/trunk/src/language/jump_zh_HK.properties       2017-10-07 09:14:29 UTC 
(rev 5509)
@@ -2966,4 +2966,23 @@
 org.openjump.core.ui.plugin.file.ProjectInfoPlugIn.edit-metadata=#T:Edit 
project metadata
 org.openjump.core.ui.plugin.file.ProjectInfoPlugIn.tooltip=#T:Edit SRS and 
Information metadata. Warning: changing SRS won't reproject layers.\n Metadata 
will be saved on saving project file
 
org.openjump.core.ui.plugin.datastore.DataStoreSaveDriverPanel.narrow-geometry-type=#T:Narrow
 geometry type if possible
-org.openjump.core.ui.plugin.datastore.DataStoreSaveDriverPanel.convert-to-multigeometry=#T:Convert
 to multi-geometry type
\ No newline at end of file
+org.openjump.core.ui.plugin.datastore.DataStoreSaveDriverPanel.convert-to-multigeometry=#T:Convert
 to multi-geometry type
+org.openjump.core.ui.plugin.cts.CTSPlugIn=#T:Coordinate Transformation
+org.openjump.core.ui.plugin.cts.CTSPlugIn.heterogeneous-sources=#T:Source 
layers have heterogeneous coordinate systems
+org.openjump.core.ui.plugin.cts.CTSPlugIn.invalid-src-crs=#T:Source Coordinate 
System was not Valid
+org.openjump.core.ui.plugin.cts.CTSPlugIn.invalid-tgt-crs=#T:Target Coordinate 
System was not Valid
+org.openjump.core.ui.plugin.cts.CTSPlugIn.op-not-found=#T:No coordinate 
operation has been found
+org.openjump.core.ui.plugin.cts.CTSPlugIn.registry=#T:Registry
+org.openjump.core.ui.plugin.cts.CTSPlugIn.replace=#T:Replace geometries in
+org.openjump.core.ui.plugin.cts.CTSPlugIn.srcCRS=#T:Source coordinate systeme
+org.openjump.core.ui.plugin.cts.CTSPlugIn.srcDatum=#T:Source datum
+org.openjump.core.ui.plugin.cts.CTSPlugIn.srcProjection=#T:Source Projection
+org.openjump.core.ui.plugin.cts.CTSPlugIn.srcSpheroid=#T:Source spheroid
+org.openjump.core.ui.plugin.cts.CTSPlugIn.srcToWgs84=#T:Transformation to WGS84
+org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtCRS=#T:Target coordinate system
+org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtDatum=#T:Target datum
+org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtProjection=#T:Source Projection
+org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtSpheroid=#T:Target spheroid
+org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtToWgs84=#T:Transformation to WGS84
+org.openjump.core.ui.plugin.cts.CTSPlugIn.transform=#T:Transform layer
+org.openjump.core.ui.plugin.cts.CTSPlugIn.transformed-layers=#T:Transformed 
layers
\ No newline at end of file

Added: core/trunk/src/org/openjump/core/ui/plugin/cts/CTSPlugIn.java
===================================================================
--- core/trunk/src/org/openjump/core/ui/plugin/cts/CTSPlugIn.java               
                (rev 0)
+++ core/trunk/src/org/openjump/core/ui/plugin/cts/CTSPlugIn.java       
2017-10-07 09:14:29 UTC (rev 5509)
@@ -0,0 +1,386 @@
+package org.openjump.core.ui.plugin.cts;
+
+import com.vividsolutions.jts.geom.Coordinate;
+import com.vividsolutions.jts.geom.CoordinateFilter;
+import com.vividsolutions.jts.geom.Geometry;
+import com.vividsolutions.jump.I18N;
+import com.vividsolutions.jump.coordsys.CoordinateSystem;
+import com.vividsolutions.jump.feature.Feature;
+import com.vividsolutions.jump.task.TaskMonitor;
+import com.vividsolutions.jump.workbench.WorkbenchContext;
+import com.vividsolutions.jump.workbench.model.Layer;
+import com.vividsolutions.jump.workbench.model.Layerable;
+import com.vividsolutions.jump.workbench.model.UndoableCommand;
+import com.vividsolutions.jump.workbench.plugin.*;
+import com.vividsolutions.jump.workbench.ui.GUIUtil;
+import com.vividsolutions.jump.workbench.ui.HTMLFrame;
+import com.vividsolutions.jump.workbench.ui.MenuNames;
+import com.vividsolutions.jump.workbench.ui.MultiInputDialog;
+import com.vividsolutions.jump.workbench.ui.SuggestTreeComboBox;
+import com.vividsolutions.jump.workbench.ui.plugin.FeatureInstaller;
+import org.cts.CRSFactory;
+import org.cts.Identifier;
+import org.cts.crs.CRSException;
+import org.cts.crs.CoordinateReferenceSystem;
+import org.cts.crs.GeodeticCRS;
+import org.cts.datum.GeodeticDatum;
+import org.cts.op.*;
+import org.cts.registry.*;
+import org.openjump.core.ccordsys.srid.SRIDStyle;
+
+import javax.swing.*;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.geom.NoninvertibleTransformException;
+import java.io.IOException;
+import java.util.*;
+import java.util.List;
+
+/**
+ * PlugIn to transform coordinates using Coordinate Transformation Suite (CTS)
+ */
+public class CTSPlugIn extends ThreadedBasePlugIn implements Iconified, 
EnableChecked {
+
+    private final String REGISTRY           = 
I18N.get("org.openjump.core.ui.plugin.cts.CTSPlugIn.registry");
+    private final String SOURCE_LABEL       = 
I18N.get("org.openjump.core.ui.plugin.cts.CTSPlugIn.srcCRS");
+    private final String TARGET_LABEL       = 
I18N.get("org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtCRS");
+    private final String OP_NOT_FOUND       = 
I18N.get("org.openjump.core.ui.plugin.cts.CTSPlugIn.op-not-found");
+    private final String HETEROGEN_SRC      = 
I18N.get("org.openjump.core.ui.plugin.cts.CTSPlugIn.heterogeneous-sources");
+    private final String TRANSFORM          = 
I18N.get("org.openjump.core.ui.plugin.cts.CTSPlugIn.transform");
+    private final String REPLACE            = 
I18N.get("org.openjump.core.ui.plugin.cts.CTSPlugIn.replace");
+    private final String SOURCE_DATUM       = 
I18N.get("org.openjump.core.ui.plugin.cts.CTSPlugIn.srcDatum");
+    private final String TARGET_DATUM       = 
I18N.get("org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtDatum");
+    private final String SOURCE_SPHEROID    = 
I18N.get("org.openjump.core.ui.plugin.cts.CTSPlugIn.srcSpheroid");
+    private final String TARGET_SPHEROID    = 
I18N.get("org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtSpheroid");
+    private final String SOURCE_TOWGS84     = 
I18N.get("org.openjump.core.ui.plugin.cts.CTSPlugIn.srcToWgs84");
+    private final String TARGET_TOWGS84     = 
I18N.get("org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtToWgs84");
+    private final String TRANSFORMED_LAYERS = 
I18N.get("org.openjump.core.ui.plugin.cts.CTSPlugIn.transformed-layers");
+    private final String INVALID_SRC_CRS    = 
I18N.get("org.openjump.core.ui.plugin.cts.CTSPlugIn.invalid-src-crs");
+    private final String INVALID_TGT_CRS    = 
I18N.get("org.openjump.core.ui.plugin.cts.CTSPlugIn.invalid-tgt-crs");
+    private final String SOURCE_PROJECTION  = 
I18N.get("org.openjump.core.ui.plugin.cts.CTSPlugIn.srcProjection");
+    private final String TARGET_PROJECTION  = 
I18N.get("org.openjump.core.ui.plugin.cts.CTSPlugIn.tgtProjection");
+
+    private static final String EPSG = "EPSG";
+    private static final String IGNF = "IGNF";
+
+    private String registry = EPSG;
+    private String srcCode = "4326";
+    private String tgtCode = "4326";
+    private final Map<String,String> codes = new LinkedHashMap<>(64);
+
+    public ImageIcon getIcon(){
+        return new ImageIcon(this.getClass().getResource("world.png"));
+    }
+
+    public boolean execute(final PlugInContext context) throws Exception {
+
+        final String SOURCE = "source";
+        final String TARGET = "target";
+        MultiInputDialog dialog = new 
MultiInputDialog(context.getWorkbenchFrame(), getName(), true);
+
+        // Try to get the srid (epsg) of selected layers
+        // 1) from the CoordinateSystem associated to the first selected layer
+        // 2) from the SRIDStyle associated to the first selected layer
+        CoordinateSystem coordSystem;
+        if (context.getSelectedLayers().length > 0 &&
+                null != (coordSystem = 
context.getSelectedLayer(0).getFeatureCollectionWrapper().getFeatureSchema().getCoordinateSystem()))
 {
+            srcCode = coordSystem == CoordinateSystem.UNSPECIFIED ?
+                    "0" : Integer.toString(coordSystem.getEPSGCode());
+            if (srcCode.equals("0") && 
context.getSelectedLayer(0).getStyle(SRIDStyle.class) != null) {
+                srcCode = 
Integer.toString(((SRIDStyle)context.getSelectedLayer(0).getStyle(SRIDStyle.class)).getSRID());
+            }
+        }
+
+        final JComboBox<String> registry_cb =
+                dialog.addComboBox(REGISTRY, registry, Arrays.asList("EPSG", 
"IGNF"),"");
+
+        codes.clear();
+        codes.putAll(getAvailableCRS(context, 
(String)registry_cb.getSelectedItem()));
+
+        final SuggestTreeComboBox srcCodesCB = new 
SuggestTreeComboBox(codes.keySet().toArray(new String[codes.size()]), 8);
+        srcCodesCB.setSelectedItem(srcCode);
+        
srcCodesCB.setPrototypeDisplayValue("abcdefghijklmnpqrstuvwxyz/0123456789");
+        dialog.addRow(SOURCE, new JLabel(SOURCE_LABEL), srcCodesCB, new 
EnableCheck[0], "");
+
+        final SuggestTreeComboBox tgtCodesCB = new 
SuggestTreeComboBox(codes.keySet().toArray(new String[codes.size()]), 8);
+        tgtCodesCB.setSelectedItem(tgtCode);
+        
tgtCodesCB.setPrototypeDisplayValue("abcdefghijklmnpqrstuvwxyz/0123456789");
+        dialog.addRow(TARGET, new JLabel(TARGET_LABEL), tgtCodesCB, new 
EnableCheck[0], "");
+
+        registry_cb.addActionListener(new ActionListener() {
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                try {
+                    codes.clear();
+                    codes.putAll(getAvailableCRS(context, (String) 
registry_cb.getSelectedItem()));
+                    srcCodesCB.changeModel(codes.keySet().toArray(new 
String[codes.size()]));
+                    tgtCodesCB.changeModel(codes.keySet().toArray(new 
String[codes.size()]));
+                    
srcCodesCB.setSelectedItem(codes.keySet().iterator().next());
+                    
tgtCodesCB.setSelectedItem(codes.keySet().iterator().next());
+                } catch(RegistryException|CRSException|IOException t) {
+                    t.printStackTrace();
+                }
+            }
+        });
+
+        GUIUtil.centreOnWindow(dialog);
+        dialog.setVisible(true);
+        if (dialog.wasOKPressed()) {
+            registry = dialog.getText(REGISTRY);
+            srcCode = codes.get(srcCodesCB.getSelectedItem());
+            tgtCode = codes.get(tgtCodesCB.getSelectedItem());
+            return true;
+        }
+        return false;
+    }
+
+    public void run(TaskMonitor monitor, PlugInContext context)
+            throws RegistryException, CRSException {
+        reportNothingToUndoYet(context);
+        if (srcCode == null) {
+            throw new RegistryException(INVALID_SRC_CRS);
+        } else if (tgtCode == null) {
+            throw new RegistryException(INVALID_TGT_CRS);
+        }
+        if (!tgtCode.equals(srcCode)) {
+            CRSFactory crsFactory = new CRSFactory();
+            RegistryManager registryManager = crsFactory.getRegistryManager();
+            if (registry.equals("EPSG")) {
+                registryManager.addRegistry(new EPSGRegistry());
+            } else if (registry.equals("IGNF")) {
+                registryManager.addRegistry(new IGNFRegistry());
+            }
+            //CoordinateReferenceSystem srcCRS = 
registryManager.getRegistry(registry)
+            //        .getCoordinateReferenceSystem(new Identifier(registry, 
srcCode, null));
+            //CoordinateReferenceSystem tgtCRS = 
registryManager.getRegistry(registry)
+            //        .getCoordinateReferenceSystem(new Identifier(registry, 
tgtCode, null));
+//
+            //commitChanges(monitor, context, srcCRS, tgtCRS);
+            //report(context, srcCRS, tgtCRS);
+        }
+    }
+
+
+    // Commit reprojection as an undoable transaction
+    private void commitChanges(final TaskMonitor monitor,
+                               final PlugInContext context,
+                               final CoordinateReferenceSystem srcCRS,
+                               final CoordinateReferenceSystem tgtCRS) throws 
CoordinateOperationException {
+
+        // Short-circuits for cases where transformation cannot be done
+        CoordinateOperation coordinateOperation = getOperation(srcCRS, tgtCRS);
+        if (coordinateOperation == null) {
+            context.getWorkbenchFrame().warnUser(OP_NOT_FOUND);
+            return;
+        }
+        Layer[] layers = context.getLayerNamePanel().getSelectedLayers();
+        if (layers.length == 0) {
+            // Should never reach here if the plugin has been called from UI
+            return;
+        }
+
+        // Prepare parameters and data structures for transaction
+        final CoordinateFilter filter = 
getCoordinateFilter(coordinateOperation);
+        boolean epsg = tgtCRS.getAuthorityName().equalsIgnoreCase(EPSG);
+        int epsgCode = epsg ? Integer.parseInt(tgtCRS.getAuthorityKey()) : 0;
+        CoordinateSystemWrapper newCoordinateSystem = new 
CoordinateSystemWrapper(tgtCRS);
+        final Map<String,ArrayList<Geometry>> srcGeometryMap = new HashMap<>();
+        final Map<String,ArrayList<Geometry>> tgtGeometryMap = new HashMap<>();
+        final Map<String,CoordinateSystem> oldCoordinateSystems = new 
HashMap<>();
+        final Map<String,SRIDStyle> oldSridStyles = new HashMap<>();
+        final Map<String,CoordinateSystem> newCoordinateSystems = new 
HashMap<>();
+
+        // Start transaction
+        
context.getLayerManager().getUndoableEditReceiver().reportNothingToUndoYet();
+        for (Layer layer : context.getSelectedLayers()) {
+            oldCoordinateSystems.put(layer.getName(), 
layer.getFeatureCollectionWrapper().getFeatureSchema().getCoordinateSystem());
+            ArrayList<Geometry> srcGeometries = new ArrayList<>();
+            ArrayList<Geometry> tgtGeometries = new ArrayList<>();
+            int count = 0;
+            monitor.report(TRANSFORM + " " + layer.getName());
+            for (Object object : 
layer.getFeatureCollectionWrapper().getFeatures()) {
+                Geometry srcGeom = ((Feature)object).getGeometry();
+                srcGeometries.add(srcGeom);
+                Geometry tgtGeom = (Geometry)srcGeom.clone();
+                tgtGeom.apply(filter);
+                tgtGeom.setSRID(epsgCode);
+                tgtGeom.geometryChanged();
+                tgtGeometries.add(tgtGeom);
+                if (++count % 100 == 0) monitor.report(count, 
layer.getFeatureCollectionWrapper().getFeatures().size(), "");
+            }
+            srcGeometryMap.put(layer.getName(), srcGeometries);
+            tgtGeometryMap.put(layer.getName(), tgtGeometries);
+            oldSridStyles.put(layer.getName(), 
(SRIDStyle)layer.getStyle(SRIDStyle.class));
+            oldCoordinateSystems.put(layer.getName(), 
layer.getFeatureCollectionWrapper().getFeatureSchema().getCoordinateSystem());
+            newCoordinateSystems.put(layer.getName(), newCoordinateSystem);
+        }
+        UndoableCommand cmd = new UndoableCommand(getName()) {
+            public void execute() {
+                boolean isFiringEvents = 
context.getLayerManager().isFiringEvents();
+                context.getLayerManager().setFiringEvents(false);
+                for (Layer layer : context.getSelectedLayers()) {
+                    monitor.report(REPLACE + " " + layer.getName());
+                    List<Feature> features = 
layer.getFeatureCollectionWrapper().getFeatures();
+                    ArrayList<Geometry> geometries = 
tgtGeometryMap.get(layer.getName());
+                    CoordinateSystem cs = 
newCoordinateSystems.get(layer.getName());
+                    for (int i = 0 ; i < features.size() ; i++) {
+                        Feature feature = features.get(i);
+                        feature.setGeometry(geometries.get(i));
+                    }
+                    Layer.tryToInvalidateEnvelope(layer);
+                    layer.removeStyle(layer.getStyle(SRIDStyle.class));
+                    SRIDStyle sridStyle = new SRIDStyle();
+                    sridStyle.setSRID(cs.getEPSGCode());
+                    layer.addStyle(sridStyle);
+                    
layer.getFeatureCollectionWrapper().getFeatureSchema().setCoordinateSystem(cs);
+                    layer.setFeatureCollectionModified(true);
+                }
+                context.getLayerManager().setFiringEvents(isFiringEvents);
+                try {
+                    
context.getLayerViewPanel().getViewport().zoomToFullExtent();
+                } catch(NoninvertibleTransformException e) {
+                    e.printStackTrace();
+                }
+            }
+
+            public void unexecute() {
+                boolean isFiringEvents = 
context.getLayerManager().isFiringEvents();
+                context.getLayerManager().setFiringEvents(false);
+                for (Layer layer : context.getSelectedLayers()) {
+                    List<Feature> features = 
layer.getFeatureCollectionWrapper().getFeatures();
+                    ArrayList<Geometry> geometries = 
srcGeometryMap.get(layer.getName());
+                    CoordinateSystem cs = 
oldCoordinateSystems.get(layer.getName());
+                    for (int i = 0 ; i < features.size() ; i++) {
+                        Feature feature = features.get(i);
+                        feature.setGeometry(geometries.get(i));
+                    }
+                    Layer.tryToInvalidateEnvelope(layer);
+                    layer.removeStyle(layer.getStyle(SRIDStyle.class));
+                    if (oldSridStyles.get(layer.getName()) != null) 
layer.addStyle(oldSridStyles.get(layer.getName()));
+                    
layer.getFeatureCollectionWrapper().getFeatureSchema().setCoordinateSystem(cs);
+                    layer.setFeatureCollectionModified(true);
+                }
+                context.getLayerManager().setFiringEvents(isFiringEvents);
+                try {
+                    
context.getLayerViewPanel().getViewport().zoomToFullExtent();
+                } catch(NoninvertibleTransformException e) {
+                    e.printStackTrace();
+                }
+            }
+        };
+        boolean exceptionOccurred = true;
+        try {
+            cmd.execute();
+            exceptionOccurred = false;
+        }
+        finally {
+            if (exceptionOccurred) {
+                context.getLayerManager().getUndoableEditReceiver()
+                        .getUndoManager().discardAllEdits();
+            }
+        }
+        
context.getLayerManager().getUndoableEditReceiver().receive(cmd.toUndoableEdit());
+    }
+
+    private void report(PlugInContext context, CoordinateReferenceSystem 
srcCRS, CoordinateReferenceSystem tgtCRS)
+            throws CoordinateOperationException {
+        HTMLFrame html = context.getOutputFrame();
+        html.createNewDocument();
+        html.setTitle(getName());
+        html.append("<h2>" + TRANSFORMED_LAYERS + "</h2>");
+        html.append(Arrays.toString(context.getSelectedLayers()));
+        html.append("<h2>" + SOURCE_LABEL + "</h2>");
+        html.addField(SOURCE_LABEL, srcCRS.toString());
+        html.addField(SOURCE_DATUM, srcCRS.getDatum().toString());
+        html.addField(SOURCE_TOWGS84, 
srcCRS.getDatum().getToWGS84().toString());
+        html.addField(SOURCE_SPHEROID, 
(srcCRS.getDatum()).getEllipsoid().toString());
+        html.addField(SOURCE_PROJECTION, srcCRS.getProjection() == null ? 
"null" :
+                
srcCRS.getProjection().toWKT(srcCRS.getCoordinateSystem().getUnit(0)));
+        html.append("<h2>" + TARGET_LABEL + "</h2>");
+        html.addField(TARGET_LABEL, tgtCRS.toString());
+        html.addField(TARGET_DATUM, tgtCRS.getDatum().toString());
+        html.addField(TARGET_TOWGS84, 
tgtCRS.getDatum().getToWGS84().toString());
+        html.addField(TARGET_SPHEROID, 
(srcCRS.getDatum()).getEllipsoid().toString());
+        html.addField(TARGET_PROJECTION, tgtCRS.getProjection() == null ? 
"null" :
+                
tgtCRS.getProjection().toWKT(tgtCRS.getCoordinateSystem().getUnit(0)));
+        html.append("<h2>" + getName() + "</h2>");
+        CoordinateOperation op = getOperation(srcCRS, tgtCRS);
+        if (op != null) {
+            html.addField("", op.toString().replaceAll("\n","<br>"));
+        }
+    }
+
+    private CoordinateOperation getOperation(final CoordinateReferenceSystem 
srcCRS,
+                                             final CoordinateReferenceSystem 
tgtCRS)
+            throws CoordinateOperationException {
+        Collection<CoordinateOperation> ops = CoordinateOperationFactory
+                .createCoordinateOperations((GeodeticCRS) srcCRS, 
(GeodeticCRS) tgtCRS);
+        return ops.size() == 0 ? null :
+                CoordinateOperationFactory.getMostPrecise(ops);
+    }
+
+    private CoordinateFilter getCoordinateFilter(final CoordinateOperation op) 
{
+        return new CoordinateFilter() {
+            @Override
+            public void filter(Coordinate coordinate) {
+                try {
+                    double[] xyz = op.transform(new double[]{coordinate.x, 
coordinate.y, coordinate.z});
+                    coordinate.setOrdinate(0, xyz[0]);
+                    coordinate.setOrdinate(1, xyz[1]);
+                    if (xyz.length > 2) coordinate.setOrdinate(2, xyz[2]);
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            }
+        };
+    }
+
+    private Map<String,String> getAvailableCRS(PlugInContext context, String 
registry)
+            throws IOException, RegistryException, CRSException {
+        return RegistryReader.read(registry);
+    }
+
+    EnableCheck createEnableCheck(final WorkbenchContext context) {
+        return new MultiEnableCheck()
+                
.add(EnableCheckFactory.getInstance().createTaskWindowMustBeActiveCheck())
+                
.add(EnableCheckFactory.getInstance().createAtLeastNLayersMustBeSelectedCheck(1))
+                
.add(EnableCheckFactory.getInstance().createSelectedLayersMustBeEditableCheck())
+                
.add(EnableCheckFactory.getInstance().createSelectedLayerablesMustBeVectorLayers())
+                .add(new EnableCheck() {
+                    @Override
+                    public String check(JComponent component) {
+                        Layerable[] layerables = (Layerable[]) 
context.getLayerNamePanel()
+                                .selectedNodes(Layerable.class).toArray(new 
Layerable[0]);
+                        if (layerables.length > 0) {
+                            Layer layer = (Layer) layerables[0];
+                            CoordinateSystem cs = 
layer.getFeatureCollectionWrapper().getFeatureSchema().getCoordinateSystem();
+                            SRIDStyle srid = (SRIDStyle) 
layer.getStyle(SRIDStyle.class);
+                            for (int i = 1; i < layerables.length; i++) {
+                                layer = (Layer) layerables[i];
+                                CoordinateSystem csi = 
layer.getFeatureCollectionWrapper().getFeatureSchema().getCoordinateSystem();
+                                SRIDStyle sridi = (SRIDStyle) 
layer.getStyle(SRIDStyle.class);
+                                if (cs == csi && srid == sridi) continue;
+                                if (cs == null && csi != null) return 
HETEROGEN_SRC;
+                                if (cs != null && csi == null) return 
HETEROGEN_SRC;
+                                if (cs == CoordinateSystem.UNSPECIFIED && csi 
!= CoordinateSystem.UNSPECIFIED)
+                                    return HETEROGEN_SRC;
+                                if (cs != CoordinateSystem.UNSPECIFIED && csi 
== CoordinateSystem.UNSPECIFIED)
+                                    return HETEROGEN_SRC;
+                                //try {
+                                    if (cs != null && cs.getEPSGCode() != 
csi.getEPSGCode())
+                                        return HETEROGEN_SRC;
+                                //} catch (UnsupportedOperationException e) {
+                                //}
+                                if (srid != null && sridi != null && 
srid.getSRID() != sridi.getSRID())
+                                    return HETEROGEN_SRC;
+                            }
+                            return null;
+                        }
+                        // should never reach here
+                        return "At least 1 layer must be selected";
+                    }
+                });
+    }
+
+}
+

Added: 
core/trunk/src/org/openjump/core/ui/plugin/cts/CoordinateSystemWrapper.java
===================================================================
--- core/trunk/src/org/openjump/core/ui/plugin/cts/CoordinateSystemWrapper.java 
                        (rev 0)
+++ core/trunk/src/org/openjump/core/ui/plugin/cts/CoordinateSystemWrapper.java 
2017-10-07 09:14:29 UTC (rev 5509)
@@ -0,0 +1,101 @@
+package org.openjump.core.ui.plugin.cts;
+
+
+import com.vividsolutions.jts.util.Assert;
+import com.vividsolutions.jump.coordsys.CoordinateSystem;
+import com.vividsolutions.jump.coordsys.Geographic;
+import com.vividsolutions.jump.coordsys.Planar;
+import com.vividsolutions.jump.coordsys.Projection;
+import org.cts.IllegalCoordinateException;
+import org.cts.crs.CoordinateReferenceSystem;
+import org.cts.cs.Axis;
+import org.cts.op.CoordinateOperationException;
+import org.cts.op.CoordinateSwitch;
+import org.cts.op.UnitConversion;
+import org.cts.units.Unit;
+
+/**
+ * A wrapper to wrap a {@link org.cts.crs.CoordinateReferenceSystem} into a
+ * {@link com.vividsolutions.jump.coordsys.CoordinateSystem}.
+ */
+public class CoordinateSystemWrapper extends CoordinateSystem {
+    private CoordinateReferenceSystem crs;
+    CoordinateSystemWrapper(final CoordinateReferenceSystem crs) {
+        super(crs.getName(),
+                (crs.getAuthorityKey().toUpperCase().equals("EPSG") ?
+                        Integer.parseInt(crs.getAuthorityKey()) : 0),
+                new Projection() {
+
+                    @Override
+                    public Planar asPlanar(Geographic q0, Planar p) {
+                        double[] dd = new double[]{q0.lat, q0.lon, q0.hgt};
+                        try {
+                            // La latitude et la longitude sont 
\xE9chang\xE9es si besoin
+                            if (crs.getCoordinateSystem().getAxis(0) == 
Axis.LONGITUDE) {
+                                dd = 
CoordinateSwitch.SWITCH_LAT_LON.transform(dd);
+                            }
+                            // Les coordonn\xE9es g\xE9ographiques sont 
pass\xE9es en radian
+                            dd = 
UnitConversion.createUnitConverter(Unit.DEGREE, Unit.RADIAN).transform(dd);
+                            // puis projet\xE9es
+                            dd = crs.getProjection().transform(dd);
+                            return new Planar(dd[0], dd[1]);
+                        } 
catch(CoordinateOperationException|IllegalCoordinateException e) {
+                            throw new RuntimeException(e);
+                        }
+                    }
+
+                    @Override
+                    public Geographic asGeographic(Planar p, Geographic q) {
+                        double[] dd = new double[]{p.x, p.y, p.z};
+                        try {
+                            // Les coordonn\xE9es sont pass\xE9es en 
g\xE9ographiques
+                            dd = crs.getProjection().inverse().transform(dd);
+                            // La latitude et la longitude sont 
\xE9chang\xE9es au besoin
+                            if (crs.getCoordinateSystem().getAxis(0) == 
Axis.LONGITUDE) {
+                                dd = 
CoordinateSwitch.SWITCH_LAT_LON.transform(dd);
+                            }
+                            // Les unit\xE9s sont converties en degr\xE9s
+                            dd = 
UnitConversion.createUnitConverter(Unit.RADIAN, Unit.DEGREE).transform(dd);
+                            return new Geographic(dd[0], dd[1]);
+                        } 
catch(CoordinateOperationException|IllegalCoordinateException e) {
+                            throw new RuntimeException(e);
+                        }
+                    }
+                });
+        this.crs = crs;
+    }
+    public String toString() {
+        return crs.getName();
+    }
+    public String getName() {
+        return crs.getName();
+    }
+    public Projection getProjection() {
+        return new Projection() {
+            @Override
+            public Planar asPlanar(Geographic q0, Planar p) {
+                return null;
+            }
+
+            @Override
+            public Geographic asGeographic(Planar p, Geographic q) {
+                return null;
+            }
+        };
+    }
+
+    public int getEPSGCode() {
+        return crs.getAuthorityName().equals("EPSG") ?
+                Integer.parseInt(crs.getAuthorityKey()) : 0;
+    }
+
+    public int compareTo(Object o) {
+        Assert.isTrue(o instanceof CoordinateSystem);
+        if (this == o) { return 0; }
+        if (this == UNSPECIFIED) { return -1; }
+        if (o == UNSPECIFIED) { return 1; }
+        return toString().compareTo(o.toString());
+    }
+}
+
+

Added: core/trunk/src/org/openjump/core/ui/plugin/cts/RegistryReader.java
===================================================================
--- core/trunk/src/org/openjump/core/ui/plugin/cts/RegistryReader.java          
                (rev 0)
+++ core/trunk/src/org/openjump/core/ui/plugin/cts/RegistryReader.java  
2017-10-07 09:14:29 UTC (rev 5509)
@@ -0,0 +1,40 @@
+package org.openjump.core.ui.plugin.cts;
+
+import java.io.*;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+/**
+ * This class parses quickly a register to associate CRS codes with names.
+ * Name of CRSs may be written in a comment just before the CRS definition
+ */
+public class RegistryReader {
+
+    static Map<String,String> read(String registry) throws IOException {
+        Map<String,String> map = new LinkedHashMap<String,String>();
+        InputStream is = null;
+        try {
+            is = 
org.cts.registry.Registry.class.getResourceAsStream(registry.toLowerCase());
+            BufferedReader br = new BufferedReader(new InputStreamReader(is));
+            String line, name = null, code;
+            while (null != (line=br.readLine())) {
+                if (line.startsWith("#")) {
+                    name = line.substring(1).trim();
+                } else if (line.startsWith("<")) {
+                    code = line.substring(1, line.indexOf(">"));
+                    map.put(code, code);
+                    if (name != null && name.length() > 0) {
+                        map.put(name, code);
+                    }
+                    name = null;
+                } else {
+                    name = null;
+                }
+            }
+        } finally {
+            if (is != null) try {is.close();} catch(IOException e){}
+        }
+        return map;
+    }
+}
+


------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Jump-pilot-devel mailing list
Jump-pilot-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel

Reply via email to