]> gerrit.simantics Code Review - simantics/district.git/blobdiff - org.simantics.district.network/src/org/simantics/district/network/ModelledCRS.java
Dynamic visualisations interval and disable support
[simantics/district.git] / org.simantics.district.network / src / org / simantics / district / network / ModelledCRS.java
index fd129ff095e3d86b5a92b0db0b0ab5d44819ef8c..af0bf4182ee70ddd77d109c364fe9391867cee80 100644 (file)
@@ -7,24 +7,53 @@ import org.simantics.databoard.Bindings;
 import org.simantics.db.ReadGraph;
 import org.simantics.db.Resource;
 import org.simantics.db.exception.DatabaseException;
-import org.simantics.district.network.ontology.DistrictNetworkResource;
+import org.simantics.layer0.Layer0;
 
 public class ModelledCRS implements CRS {
 
     private GeodeticCalculator calculator;
 
     public ModelledCRS(ReadGraph graph, Resource type) throws DatabaseException, FactoryException {
-        String wkt = graph.getRelatedValue2(type, DistrictNetworkResource.getInstance(graph).HasSRTEXT, Bindings.STRING);
-        CoordinateReferenceSystem crs = org.geotools.referencing.CRS.parseWKT(wkt);
+        String code = graph.getRelatedValue2(type, Layer0.getInstance(graph).HasLabel, Bindings.STRING);
+        CoordinateReferenceSystem crs = org.geotools.referencing.CRS.decode(code);
+        
         this.calculator = new GeodeticCalculator(crs);
     }
     
     @Override
     public double calculateDistance(double[] start, double[] end) {
-        // TODO: fix the scale..
-        calculator.setStartingGeographicPoint(start[0] / 100000, start[1] / 100000);
-        calculator.setDestinationGeographicPoint(end[0] / 100000, end[1] / 100000);
-        return calculator.getOrthodromicDistance();
+        calculator.setStartingGeographicPoint(start[0], start[1]);
+        calculator.setDestinationGeographicPoint(end[0], end[1]);
+        double dist = calculator.getOrthodromicDistance();
+        return dist;
     }
 
+    // TODO: these only work with Spherical Mercator
+    public static double xToLongitude(double x) {
+        return x;
+    }
+
+    public static double yToLatitude(double y) {
+        double rad = Math.toRadians(y);
+        double sinh = Math.sinh(rad);
+        double atan = Math.atan(sinh);
+        double finald = Math.toDegrees(atan);
+        return finald;
+    }
+
+    public static double longitudeToX(double lon) {
+        return lon;
+    }
+    
+    private static double asinh(double x) {
+        return Math.log(x + Math.sqrt(x*x + 1.0));
+    }
+    
+    public static double latitudeToY(double lat) {
+        double frad = Math.toRadians(lat);
+        double ftan = Math.tan(frad);
+        double fsin = asinh(ftan);
+        double f = Math.toDegrees(fsin);
+        return f;
+    }
 }