MATSIM
MGC.java
Go to the documentation of this file.
1 /* *********************************************************************** *
2  * project: org.matsim.*
3  * MGC.java
4  * *
5  * *********************************************************************** *
6  * *
7  * copyright : (C) 2007 by the members listed in the COPYING, *
8  * LICENSE and WARRANTY file. *
9  * email : info at matsim dot org *
10  * *
11  * *********************************************************************** *
12  * *
13  * This program is free software; you can redistribute it and/or modify *
14  * it under the terms of the GNU General Public License as published by *
15  * the Free Software Foundation; either version 2 of the License, or *
16  * (at your option) any later version. *
17  * See also COPYING, LICENSE and WARRANTY file *
18  * *
19  * *********************************************************************** */
20 
21 package org.matsim.core.utils.geometry.geotools;
22 
23 import java.util.HashMap;
24 import java.util.Map;
25 
26 import org.apache.logging.log4j.LogManager;
27 import org.apache.logging.log4j.Logger;
28 import org.geotools.api.referencing.FactoryException;
29 import org.geotools.api.referencing.crs.CoordinateReferenceSystem;
30 import org.geotools.referencing.CRS;
31 import org.locationtech.jts.geom.Coordinate;
32 import org.locationtech.jts.geom.GeometryFactory;
33 import org.locationtech.jts.geom.Point;
34 import org.matsim.api.core.v01.Coord;
36 
43 public class MGC {
44 
45  private final static Logger log = LogManager.getLogger(MGC.class);
46 
47  public static final GeometryFactory geoFac = new GeometryFactory();
48 
49  private final static Map<String, String> COORDINATE_REFERENCE_SYSTEMS = new HashMap<>();
50 
51  static {
52  COORDINATE_REFERENCE_SYSTEMS.put(TransformationFactory.WGS84,
53  "EPSG:4326");
54  COORDINATE_REFERENCE_SYSTEMS.put(TransformationFactory.WGS84_UTM47S,
55  "PROJCS[\"WGS_1984_UTM_Zone_47S\",GEOGCS[\"GCS_WGS_1984\",DATUM[\"D_WGS_1984\",SPHEROID[\"WGS_1984\",6378137.0,298.257223563]],PRIMEM[\"Greenwich\",0.0],UNIT[\"Degree\",0.0174532925199433]],PROJECTION[\"Transverse_Mercator\"],PARAMETER[\"False_Easting\",500000.0],PARAMETER[\"False_Northing\",10000000.0],PARAMETER[\"Central_Meridian\",99.0],PARAMETER[\"Scale_Factor\",0.9996],PARAMETER[\"Latitude_Of_Origin\",0.0],UNIT[\"Meter\",1.0]]");
56  COORDINATE_REFERENCE_SYSTEMS.put(TransformationFactory.WGS84_UTM35S, // south-africa
57  "PROJCS[\"WGS_1984_UTM_Zone_35S\",GEOGCS[\"GCS_WGS_1984\",DATUM[\"D_WGS_1984\",SPHEROID[\"WGS_1984\",6378137,298.257223563]],PRIMEM[\"Greenwich\",0],UNIT[\"Degree\",0.017453292519943295]],PROJECTION[\"Transverse_Mercator\"],PARAMETER[\"latitude_of_origin\",0],PARAMETER[\"central_meridian\",27],PARAMETER[\"scale_factor\",0.9996],PARAMETER[\"false_easting\",500000],PARAMETER[\"false_northing\",10000000],UNIT[\"Meter\",1]]");
58  COORDINATE_REFERENCE_SYSTEMS.put(TransformationFactory.WGS84_UTM36S, // South Africa (eThekwini)
59  "PROJCS[\"WGS_1984_UTM_Zone_36S\",GEOGCS[\"GCS_WGS_1984\",DATUM[\"D_WGS_1984\",SPHEROID[\"WGS_1984\",6378137.0,298.257223563]],PRIMEM[\"Greenwich\",0.0],UNIT[\"Degree\",0.0174532925199433]],PROJECTION[\"Transverse_Mercator\"],PARAMETER[\"False_Easting\",500000.0],PARAMETER[\"False_Northing\",10000000.0],PARAMETER[\"Central_Meridian\",33.0],PARAMETER[\"Scale_Factor\",0.9996],PARAMETER[\"Latitude_Of_Origin\",0.0],UNIT[\"Meter\",1.0]]");
60  COORDINATE_REFERENCE_SYSTEMS.put(TransformationFactory.WGS84_UTM33N, // berlin
61  "PROJCS[\"UTM Zone 33, Northern Hemisphere\",GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],TOWGS84[0,0,0,0,0,0,0],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9108\"]],AUTHORITY[\"EPSG\",\"4326\"]],PROJECTION[\"Transverse_Mercator\"],PARAMETER[\"latitude_of_origin\",0],PARAMETER[\"central_meridian\",15],PARAMETER[\"scale_factor\",0.9996],PARAMETER[\"false_easting\",500000],PARAMETER[\"false_northing\",0],UNIT[\"Meter\",1]]");
62  COORDINATE_REFERENCE_SYSTEMS.put(TransformationFactory.DHDN_GK4, // Berlin
63  "EPSG:31468");
64  COORDINATE_REFERENCE_SYSTEMS.put(TransformationFactory.WGS84_UTM29N, // Coimbra, Portugal
65  "PROJCS[\"WGS_1984_UTM_Zone_29N\",GEOGCS[\"GCS_WGS_1984\",DATUM[\"D_WGS_1984\",SPHEROID[\"WGS_1984\",6378137,298.257223563]],PRIMEM[\"Greenwich\",0],UNIT[\"Degree\",0.017453292519943295]],PROJECTION[\"Transverse_Mercator\"],PARAMETER[\"latitude_of_origin\",0],PARAMETER[\"central_meridian\",-9],PARAMETER[\"scale_factor\",0.9996],PARAMETER[\"false_easting\",500000],PARAMETER[\"false_northing\",0.0],UNIT[\"Meter\",1]]");
66  COORDINATE_REFERENCE_SYSTEMS.put(TransformationFactory.WGS84_UTM31N, // Barcelona, Spain
67  "PROJCS[\"WGS_1984_UTM_Zone_31N\",GEOGCS[\"GCS_WGS_1984\",DATUM[\"D_WGS_1984\",SPHEROID[\"WGS_1984\",6378137,298.257223563]],PRIMEM[\"Greenwich\",0],UNIT[\"Degree\",0.017453292519943295]],PROJECTION[\"Transverse_Mercator\"],PARAMETER[\"latitude_of_origin\",0],PARAMETER[\"central_meridian\",3],PARAMETER[\"scale_factor\",0.9996],PARAMETER[\"false_easting\",500000],PARAMETER[\"false_northing\",0],UNIT[\"Meter\",1]]");
68  COORDINATE_REFERENCE_SYSTEMS.put(TransformationFactory.CH1903_LV03_GT, "PROJCS[\"Hotine_Oblique_Mercator_Azimuth_Center\",GEOGCS[\"Bessel" +
69  "1841\",DATUM[\"D_unknown\",SPHEROID[\"bessel\",6377397.155,299.1528128]]" +
70  ",PRIMEM[\"Greenwich\",0],UNIT[\"Degree\",0.017453292519943295]],PROJECTION[" +
71  "\"Hotine_Oblique_Mercator_Azimuth_Center\"],PARAMETER[\"latitude_of_center\",46.95240555555556]" +
72  ",PARAMETER[\"longitude_of_center\",7.439583333333333],PARAMETER[\"azimuth\",90],PARAMETER[" +
73  "\"scale_factor\",1],PARAMETER[\"false_easting\",600000],PARAMETER[\"false_northing\",200000],UNIT[\"Meter\",1]]");
74  COORDINATE_REFERENCE_SYSTEMS.put(TransformationFactory.CH1903_LV03_Plus_GT, "PROJCS[\"Hotine_Oblique_Mercator_Azimuth_Center\",GEOGCS[\"Bessel" +
75  "1841\",DATUM[\"D_unknown\",SPHEROID[\"bessel\",6377397.155,299.1528128]]" +
76  ",PRIMEM[\"Greenwich\",0],UNIT[\"Degree\",0.017453292519943295]],PROJECTION[" +
77  "\"Hotine_Oblique_Mercator_Azimuth_Center\"],PARAMETER[\"latitude_of_center\",46.95240555555556]" +
78  ",PARAMETER[\"longitude_of_center\",7.439583333333333],PARAMETER[\"azimuth\",90],PARAMETER[" +
79  "\"scale_factor\",1],PARAMETER[\"false_easting\",2600000],PARAMETER[\"false_northing\",1200000],UNIT[\"Meter\",1]]");
80  COORDINATE_REFERENCE_SYSTEMS.put(TransformationFactory.WGS84_Albers, // South Africa (Africa Albers equal area conic)
81  "PROJCS[\"Africa_Albers_Equal_Area_Conic\",GEOGCS[\"GCS_WGS_1984\",DATUM[\"D_WGS_1984\",SPHEROID[\"WGS_1984\",6378137.0,298.257223563]],PRIMEM[\"Greenwich\",0.0],UNIT[\"Degree\",0.0174532925199433]],PROJECTION[\"Albers\"],PARAMETER[\"False_Easting\",0.0],PARAMETER[\"False_Northing\",0.0],PARAMETER[\"Central_Meridian\",25.0],PARAMETER[\"Standard_Parallel_1\",20.0],PARAMETER[\"Standard_Parallel_2\",-23.0],PARAMETER[\"Latitude_Of_Origin\",0.0],UNIT[\"Meter\",1.0]]");
82  COORDINATE_REFERENCE_SYSTEMS.put(TransformationFactory.WGS84_SA_Albers, // South Africa (Adapted version of Africa Albers equal area conic)
83  "PROJCS[\"South_Africa_Albers_Equal\",GEOGCS[\"GCS_WGS_1984\",DATUM[\"D_WGS_1984\",SPHEROID[\"WGS_1984\",6378137.0,298.257223563]],PRIMEM[\"Greenwich\",0.0],UNIT[\"Degree\",0.0174532925199433]],PROJECTION[\"Albers\"],PARAMETER[\"False_Easting\",0.0],PARAMETER[\"False_Northing\",0.0],PARAMETER[\"Central_Meridian\",24.0],PARAMETER[\"Standard_Parallel_1\",-18.0],PARAMETER[\"Standard_Parallel_2\",-32.0],PARAMETER[\"Latitude_Of_Origin\",0.0],UNIT[\"Meter\",1.0]]");
84  COORDINATE_REFERENCE_SYSTEMS.put(TransformationFactory.HARTEBEESTHOEK94_LO19, // South Africa adaption of Transverse Mercator - 17 degrees
85  "PROJCS[\"Transverse_Mercator\", GEOGCS[\"GCS_WGS_1984\", DATUM[\"D_Hartebeesthoek_1994\", SPHEROID[\"WGS_1984\", 6378137, 298.257223563]], PRIMEM[\"Greenwich\", 0], UNIT[\"Degree\", 0.017453292519943295]], PROJECTION[\"Transverse_Mercator\"], PARAMETER[\"latitude_of_origin\", 0], PARAMETER[\"central_meridian\", 19], PARAMETER[\"scale_factor\", 1], PARAMETER[\"false_easting\", 0], PARAMETER[\"false_northing\", 0], UNIT[\"Meter\", 1]]");
86  COORDINATE_REFERENCE_SYSTEMS.put(TransformationFactory.HARTEBEESTHOEK94_LO25, // South Africa adaption of Transverse Mercator - 25 degrees
87  "PROJCS[\"Transverse_Mercator\", GEOGCS[\"GCS_WGS_1984\", DATUM[\"D_Hartebeesthoek_1994\", SPHEROID[\"WGS_1984\", 6378137, 298.257223563]], PRIMEM[\"Greenwich\", 0], UNIT[\"Degree\", 0.017453292519943295]], PROJECTION[\"Transverse_Mercator\"], PARAMETER[\"latitude_of_origin\", 0], PARAMETER[\"central_meridian\", 25], PARAMETER[\"scale_factor\", 1], PARAMETER[\"false_easting\", 0], PARAMETER[\"false_northing\", 0], UNIT[\"Meter\", 1]]");
88  COORDINATE_REFERENCE_SYSTEMS.put(TransformationFactory.HARTEBEESTHOEK94_LO29, // South Africa adaption of Transverse Mercator - 29 degrees
89  "PROJCS[\"Transverse_Mercator\", GEOGCS[\"GCS_WGS_1984\", DATUM[\"D_Hartebeesthoek_1994\", SPHEROID[\"WGS_1984\", 6378137, 298.257223563]], PRIMEM[\"Greenwich\", 0], UNIT[\"Degree\", 0.017453292519943295]], PROJECTION[\"Transverse_Mercator\"], PARAMETER[\"latitude_of_origin\", 0], PARAMETER[\"central_meridian\", 29], PARAMETER[\"scale_factor\", 1], PARAMETER[\"false_easting\", 0], PARAMETER[\"false_northing\", 0], UNIT[\"Meter\", 1]]");
90  COORDINATE_REFERENCE_SYSTEMS.put(TransformationFactory.HARTEBEESTHOEK94_LO31, // South Africa adaption of Transverse Mercator - 31 degrees
91  "PROJCS[\"Transverse_Mercator\", GEOGCS[\"GCS_WGS_1984\", DATUM[\"D_Hartebeesthoek_1994\", SPHEROID[\"WGS_1984\", 6378137, 298.257223563]], PRIMEM[\"Greenwich\", 0], UNIT[\"Degree\", 0.017453292519943295]], PROJECTION[\"Transverse_Mercator\"], PARAMETER[\"latitude_of_origin\", 0], PARAMETER[\"central_meridian\", 31], PARAMETER[\"scale_factor\", 1], PARAMETER[\"false_easting\", 0], PARAMETER[\"false_northing\", 0], UNIT[\"Meter\", 1]]");
92  COORDINATE_REFERENCE_SYSTEMS.put(TransformationFactory.WGS84_UTM48N, // Singapore
93  "PROJCS[\"WGS_1984_UTM_Zone_48N\",GEOGCS[\"GCS_WGS_1984\",DATUM[\"D_WGS_1984\",SPHEROID[\"WGS_1984\",6378137.0,298.257223563]],PRIMEM[\"Greenwich\",0.0],UNIT[\"Degree\",0.0174532925199433]],PROJECTION[\"Transverse_Mercator\"],PARAMETER[\"False_Easting\",500000.0],PARAMETER[\"False_Northing\",0.0],PARAMETER[\"Central_Meridian\",105.0],PARAMETER[\"Scale_Factor\",0.9996],PARAMETER[\"Latitude_Of_Origin\",0.0],UNIT[\"Meter\",1.0]]");
94  COORDINATE_REFERENCE_SYSTEMS.put(TransformationFactory.WGS84_SVY21, // Singapore2
95  "PROJCS[\"SVY21\",GEOGCS[\"GCS_WGS_1984\",DATUM[\"D_WGS_1984\",SPHEROID[\"WGS_1984\",6378137.0,298.257223563]],PRIMEM[\"Greenwich\",0.0],UNIT[\"Degree\",0.0174532925199433]],PROJECTION[\"Transverse_Mercator\"],PARAMETER[\"False_Easting\",28001.642],PARAMETER[\"False_Northing\",38744.572],PARAMETER[\"Central_Meridian\",103.8333333333333],PARAMETER[\"Scale_Factor\",1.0],PARAMETER[\"Latitude_Of_Origin\",1.366666666666667],UNIT[\"Meter\",1.0]]");
96  COORDINATE_REFERENCE_SYSTEMS.put(TransformationFactory.NAD83_UTM17N, // Toronto, Canada - UTM_NAD1983_Zone17N
97  "PROJCS[\"NAD_1983_UTM_Zone_17N\",GEOGCS[\"GCS_North_American_1983\",DATUM[\"D_North_American_1983\",SPHEROID[\"GRS_1980\",6378137.0,298.257222101]],PRIMEM[\"Greenwich\",0.0],UNIT[\"Degree\",0.0174532925199433]],PROJECTION[\"Transverse_Mercator\"],PARAMETER[\"False_Easting\",500000.0],PARAMETER[\"False_Northing\",0.0],PARAMETER[\"Central_Meridian\",-81.0],PARAMETER[\"Scale_Factor\",0.9996],PARAMETER[\"Latitude_Of_Origin\",0.0],UNIT[\"Meter\",1.0]]");
98  COORDINATE_REFERENCE_SYSTEMS.put(TransformationFactory.WGS84_TM, //Singapore3
99  "PROJCS[\"WGS_1984_Transverse_Mercator\",GEOGCS[\"GCS_WGS_1984\",DATUM[\"D_WGS_1984\",SPHEROID[\"WGS_1984\",6378137.0,298.257223563]],PRIMEM[\"Greenwich\",0.0],UNIT[\"Degree\",0.0174532925199433]],PROJECTION[\"Transverse_Mercator\"],PARAMETER[\"False_Easting\",28001.642],PARAMETER[\"False_Northing\",38744.572],PARAMETER[\"Central_Meridian\",103.8333333333333],PARAMETER[\"Scale_Factor\",1.0],PARAMETER[\"Latitude_Of_Origin\",1.366666666666667],UNIT[\"Meter\",1.0]]");
100  COORDINATE_REFERENCE_SYSTEMS.put(TransformationFactory.PCS_ITRF2000_TM_UOS, // South Korea - but used by University of Seoul - probably a wrong one. !NEW!: Replaced by the correct one! TODO: probably needs to be renamed but since UOS use that already let's keep it.
101  "PROJCS[\"Korean 1985 Katech(TM128)\",GEOGCS[\"GCS_Korean_Datum_1985\",DATUM[\"D_Korean_Datum_1985\",SPHEROID[\"Bessel_1841\",6377397.155,299.1528128]],PRIMEM[\"Greenwich\",0.0],UNIT[\"Degree\",0.0174532925199433]],PROJECTION[\"Transverse_Mercator\"],PARAMETER[\"False_Easting\",400000.0],PARAMETER[\"False_Northing\",600000.0],PARAMETER[\"Central_Meridian\",128.0],PARAMETER[\"Scale_Factor\",0.9999],PARAMETER[\"Latitude_Of_Origin\",38.0],UNIT[\"Meter\",1.0]]");
102  COORDINATE_REFERENCE_SYSTEMS.put(TransformationFactory.DHDN_SoldnerBerlin, // Berlin
103  "PROJCS[\"DHDN / Soldner Berlin\",GEOGCS[\"DHDN\",DATUM[\"Deutsches_Hauptdreiecksnetz\",SPHEROID[\"Bessel 1841\",6377397.155,299.1528128,AUTHORITY[\"EPSG\",\"7004\"]],AUTHORITY[\"EPSG\",\"6314\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.01745329251994328,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4314\"]],UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]],PROJECTION[\"Cassini_Soldner\"],PARAMETER[\"latitude_of_origin\",52.41864827777778],PARAMETER[\"central_meridian\",13.62720366666667],PARAMETER[\"false_easting\",40000],PARAMETER[\"false_northing\",10000],AUTHORITY[\"EPSG\",\"3068\"],AXIS[\"y\",EAST],AXIS[\"x\",NORTH]]");
104  COORDINATE_REFERENCE_SYSTEMS.put(TransformationFactory.KROVAK, // Krovak EPSG5514
105  "PROJCS[\"Czech GIS S-JTSK (Greenwich) / Krovak\",GEOGCS[\"Czech S-JTSK (Greenwich)\",DATUM[\"Czech S-JTSK\",SPHEROID[\"Bessel 1841\",6377397.155,299.1528128,AUTHORITY[\"EPSG\",\"7004\"]],TOWGS84[570.8,85.7,462.8,4.998,1.587,5.261,3.56]],PRIMEM[\"Greenwich\", 0.0, AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.0174532925199433]],PROJECTION[\"Krovak\",AUTHORITY[\"EPSG\",\"9819\"]],PARAMETER[\"latitude_of_center\",49.5],PARAMETER[\"longitude_of_center\",24.83333333333333],PARAMETER[\"azimuth\",0],PARAMETER[\"pseudo_standard_parallel_1\",0],PARAMETER[\"scale_factor\",0.9999],PARAMETER[\"false_easting\",0],PARAMETER[\"false_northing\",0],UNIT[\"Meter\",1],AXIS[\"X\",EAST],AXIS[\"Y\",NORTH],AUTHORITY[\"EPSG\",\"5514\"]]");
106  }
107 
113  public static Coordinate coord2Coordinate(final Coord coord) {
114  return new Coordinate(coord.getX(), coord.getY());
115  }
116 
122  public static Coord coordinate2Coord(final Coordinate coord) {
123  return new Coord(coord.x, coord.y);
124  }
125 
131  public static Point coord2Point(final Coord coord) {
132  return geoFac.createPoint(coord2Coordinate(coord));
133  }
134 
139  public static Point coordinate2Point(Coordinate coordinate) {
140  return geoFac.createPoint(coordinate);
141  }
142 
148  public static Coord point2Coord(final Point point) {
149  return new Coord(point.getX(), point.getY());
150  }
151 
158  public static Point xy2Point(final double x, final double y) {
159  return geoFac.createPoint(new Coordinate(x, y));
160  }
161 
169  public static CoordinateReferenceSystem getCRS(final String wktOrAuthorityCodeOrShorthandName) {
170  String wktOrAuthorityCode = COORDINATE_REFERENCE_SYSTEMS.get(wktOrAuthorityCodeOrShorthandName);
171  if (wktOrAuthorityCode == null) {
172  wktOrAuthorityCode = wktOrAuthorityCodeOrShorthandName;
173  }
174  CoordinateReferenceSystem crs;
175  try {
176  crs = CRS.parseWKT(wktOrAuthorityCode);
177  } catch (FactoryException fe) {
178  try {
179  log.warn("Assuming that coordinates are in longitude first notation, i.e. (longitude, latitude).");
180  crs = CRS.decode(wktOrAuthorityCode, true);
181  } catch (FactoryException e) {
182  throw new IllegalArgumentException(e);
183  }
184  }
185  return crs;
186  }
187 
195  public static String getUTMEPSGCodeForWGS84Coordinate(final double lon, final double lat) {
196  int utmZone = (int) (Math.ceil((180+lon) / 6)+0.5);
197  String epsgCode = null;
198  if (lat > 0 ) { //northern hemisphere
199  epsgCode = "EPSG:" + (32600 + utmZone);
200  } else { //southern hemisphere
201  epsgCode = "EPSG:" + (32700 + utmZone);
202  }
203  return epsgCode;
204  }
205 }
static Point coordinate2Point(Coordinate coordinate)
Definition: MGC.java:139
static Coord point2Coord(final Point point)
Definition: MGC.java:148
static String getUTMEPSGCodeForWGS84Coordinate(final double lon, final double lat)
Definition: MGC.java:195
static Point coord2Point(final Coord coord)
Definition: MGC.java:131
static Point xy2Point(final double x, final double y)
Definition: MGC.java:158
static final GeometryFactory geoFac
Definition: MGC.java:47
static Coord coordinate2Coord(final Coordinate coord)
Definition: MGC.java:122
static Coordinate coord2Coordinate(final Coord coord)
Definition: MGC.java:113
static final Map< String, String > COORDINATE_REFERENCE_SYSTEMS
Definition: MGC.java:49
static CoordinateReferenceSystem getCRS(final String wktOrAuthorityCodeOrShorthandName)
Definition: MGC.java:169