Index: /trunk/src/org/openstreetmap/josm/io/GeoJSONReader.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/io/GeoJSONReader.java	(revision 15441)
+++ /trunk/src/org/openstreetmap/josm/io/GeoJSONReader.java	(revision 15442)
@@ -20,4 +20,5 @@
 import javax.json.stream.JsonParser.Event;
 
+import org.openstreetmap.josm.data.coor.EastNorth;
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.osm.DataSet;
@@ -27,4 +28,6 @@
 import org.openstreetmap.josm.data.osm.RelationMember;
 import org.openstreetmap.josm.data.osm.Way;
+import org.openstreetmap.josm.data.projection.Projection;
+import org.openstreetmap.josm.data.projection.Projections;
 import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
 import org.openstreetmap.josm.gui.progress.ProgressMonitor;
@@ -37,4 +40,7 @@
 public class GeoJSONReader extends AbstractReader {
 
+    private static final String CRS = "crs";
+    private static final String NAME = "name";
+    private static final String LINK = "link";
     private static final String COORDINATES = "coordinates";
     private static final String FEATURES = "features";
@@ -43,4 +49,5 @@
     private static final String TYPE = "type";
     private JsonParser parser;
+    private Projection projection = Projections.getProjectionByCode("EPSG:4326"); // WGS 84
 
     GeoJSONReader() {
@@ -52,5 +59,5 @@
     }
 
-    private void parse() {
+    private void parse() throws IllegalDataException {
         while (parser.hasNext()) {
             Event event = parser.next();
@@ -62,5 +69,6 @@
     }
 
-    private void parseRoot(final JsonObject object) {
+    private void parseRoot(final JsonObject object) throws IllegalDataException {
+        parseCrs(object.getJsonObject(CRS));
         switch (object.getString(TYPE)) {
             case "FeatureCollection":
@@ -78,9 +86,41 @@
     }
 
+    /**
+     * Parse CRS as per https://geojson.org/geojson-spec.html#coordinate-reference-system-objects.
+     * CRS are obsolete in RFC7946 but still allowed for interoperability with older applications.
+     * Only named CRS are supported.
+     *
+     * @param crs CRS JSON object
+     * @throws IllegalDataException in case of error
+     */
+    private void parseCrs(final JsonObject crs) throws IllegalDataException {
+        if (crs != null) {
+            // Inspired by https://github.com/JOSM/geojson/commit/f13ceed4645244612a63581c96e20da802779c56
+            JsonObject properties = crs.getJsonObject("properties");
+            if (properties != null) {
+                switch (crs.getString(TYPE)) {
+                    case NAME:
+                        String crsName = properties.getString(NAME);
+                        if ("urn:ogc:def:crs:OGC:1.3:CRS84".equals(crsName)) {
+                            // https://osgeo-org.atlassian.net/browse/GEOT-1710
+                            crsName = "EPSG:4326";
+                        } else if (crsName.startsWith("urn:ogc:def:crs:EPSG:")) {
+                            crsName = crsName.replace("urn:ogc:def:crs:", "");
+                        }
+                        projection = Optional.ofNullable(Projections.getProjectionByCode(crsName))
+                                .orElse(Projections.getProjectionByCode("EPSG:4326")); // WGS84
+                        break;
+                    case LINK: // Not supported (security risk)
+                    default:
+                        throw new IllegalDataException(crs.toString());
+                }
+            }
+        }
+    }
+
     private void parseFeatureCollection(final JsonArray features) {
         for (JsonValue feature : features) {
             if (feature instanceof JsonObject) {
-                JsonObject item = (JsonObject) feature;
-                parseFeature(item);
+                parseFeature((JsonObject) feature);
             }
         }
@@ -117,6 +157,5 @@
 
     private void parseGeometryCollection(final JsonObject feature, final JsonObject geometry) {
-        JsonArray geometries = geometry.getJsonArray("geometries");
-        for (JsonValue jsonValue : geometries) {
+        for (JsonValue jsonValue : geometry.getJsonArray("geometries")) {
             parseGeometry(feature, jsonValue.asJsonObject());
         }
@@ -156,14 +195,16 @@
     }
 
+    private LatLon getLatLon(final JsonArray coordinates) {
+        return projection.eastNorth2latlon(new EastNorth(
+                coordinates.getJsonNumber(0).doubleValue(),
+                coordinates.getJsonNumber(1).doubleValue()));
+    }
+
     private void parsePoint(final JsonObject feature, final JsonArray coordinates) {
-        double lat = coordinates.getJsonNumber(1).doubleValue();
-        double lon = coordinates.getJsonNumber(0).doubleValue();
-        Node node = createNode(lat, lon);
-        fillTagsFromFeature(feature, node);
+        fillTagsFromFeature(feature, createNode(getLatLon(coordinates)));
     }
 
     private void parseMultiPoint(final JsonObject feature, final JsonObject geometry) {
-        JsonArray coordinates = geometry.getJsonArray(COORDINATES);
-        for (JsonValue coordinate : coordinates) {
+        for (JsonValue coordinate : geometry.getJsonArray(COORDINATES)) {
             parsePoint(feature, coordinate.asJsonArray());
         }
@@ -171,14 +212,12 @@
 
     private void parseLineString(final JsonObject feature, final JsonArray coordinates) {
-        if (coordinates.isEmpty()) {
-            return;
-        }
-        createWay(coordinates, false)
-            .ifPresent(way -> fillTagsFromFeature(feature, way));
+        if (!coordinates.isEmpty()) {
+            createWay(coordinates, false)
+                .ifPresent(way -> fillTagsFromFeature(feature, way));
+        }
     }
 
     private void parseMultiLineString(final JsonObject feature, final JsonObject geometry) {
-        JsonArray coordinates = geometry.getJsonArray(COORDINATES);
-        for (JsonValue coordinate : coordinates) {
+        for (JsonValue coordinate : geometry.getJsonArray(COORDINATES)) {
             parseLineString(feature, coordinate.asJsonArray());
         }
@@ -186,8 +225,9 @@
 
     private void parsePolygon(final JsonObject feature, final JsonArray coordinates) {
-        if (coordinates.size() == 1) {
+        final int size = coordinates.size();
+        if (size == 1) {
             createWay(coordinates.getJsonArray(0), true)
                 .ifPresent(way -> fillTagsFromFeature(feature, way));
-        } else if (coordinates.size() > 1) {
+        } else if (size > 1) {
             // create multipolygon
             final Relation multipolygon = new Relation();
@@ -196,5 +236,5 @@
                 .ifPresent(way -> multipolygon.addMember(new RelationMember("outer", way)));
 
-            for (JsonValue interiorRing : coordinates.subList(1, coordinates.size())) {
+            for (JsonValue interiorRing : coordinates.subList(1, size)) {
                 createWay(interiorRing.asJsonArray(), true)
                     .ifPresent(way -> multipolygon.addMember(new RelationMember("inner", way)));
@@ -207,12 +247,11 @@
 
     private void parseMultiPolygon(final JsonObject feature, final JsonObject geometry) {
-        JsonArray coordinates = geometry.getJsonArray(COORDINATES);
-        for (JsonValue coordinate : coordinates) {
+        for (JsonValue coordinate : geometry.getJsonArray(COORDINATES)) {
             parsePolygon(feature, coordinate.asJsonArray());
         }
     }
 
-    private Node createNode(final double lat, final double lon) {
-        final Node node = new Node(new LatLon(lat, lon));
+    private Node createNode(final LatLon latlon) {
+        final Node node = new Node(latlon);
         getDataSet().addPrimitive(node);
         return node;
@@ -224,11 +263,6 @@
         }
 
-        final List<LatLon> latlons = coordinates.stream().map(coordinate -> {
-            final JsonArray jsonValues = coordinate.asJsonArray();
-            return new LatLon(
-                jsonValues.getJsonNumber(1).doubleValue(),
-                jsonValues.getJsonNumber(0).doubleValue()
-            );
-        }).collect(Collectors.toList());
+        final List<LatLon> latlons = coordinates.stream().map(
+                coordinate -> getLatLon(coordinate.asJsonArray())).collect(Collectors.toList());
 
         final int size = latlons.size();
Index: /trunk/test/data/geocrs.json
===================================================================
--- /trunk/test/data/geocrs.json	(revision 15442)
+++ /trunk/test/data/geocrs.json	(revision 15442)
@@ -0,0 +1,1 @@
+{"type":"Polygon","coordinates":[[[780000.00359283,5815000.00356892],[780000.00359283,5821099.08143742],[780942.4228,5822727.2591],[780903.2081,5826730.4477],[782485.901,5832541.6546],[782604.0795,5833877.0599],[782630.6914,5834177.7713],[780000.00359283,5833907.34977738],[780000.00359283,5840000.00489096],[788692.66154638,5840000.00489096],[788574.8603,5838559.6997],[798088.2918,5831471.484],[805000.00995076,5827293.18376379],[805000.00995076,5816299.5133138],[799671.6336,5818081.038],[795715.8250957,5815000.00356892],[780000.00359283,5815000.00356892]],[[788052.6844,5825219.5525],[788349.2233,5820706.4486],[787225.6448,5818585.7125],[786708.0448,5816634.045],[792860.4581,5822004.1242],[788052.6844,5825219.5525]]],"crs":{"type":"name","properties":{"name":"urn:ogc:def:crs:EPSG:25832"}}}
Index: /trunk/test/unit/org/openstreetmap/josm/io/GeoJSONReaderTest.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/io/GeoJSONReaderTest.java	(revision 15441)
+++ /trunk/test/unit/org/openstreetmap/josm/io/GeoJSONReaderTest.java	(revision 15442)
@@ -117,8 +117,25 @@
     }
 
+    /**
+     * Test reading a GeoJSON file with a named CRS.
+     * @throws Exception in case of error
+     */
+    @Test
+    public void testReadGeoJsonNamedCrs() throws Exception {
+        try (InputStream in = Files.newInputStream(Paths.get(TestUtils.getTestDataRoot(), "geocrs.json"))) {
+            final List<OsmPrimitive> primitives = new ArrayList<>(new GeoJSONReader()
+                    .doParseDataSet(in, null)
+                    .getPrimitives(it -> true));
+                assertEquals(24, primitives.size());
+                assertTrue(primitives.stream()
+                        .filter(it -> areEqualNodes(it, new Node(new LatLon(52.5840213, 13.1724145))))
+                        .findAny().isPresent());
+        }
+    }
+
     private static boolean areEqualNodes(final OsmPrimitive p1, final OsmPrimitive p2) {
         return (p1 instanceof Node)
             && (p2 instanceof Node)
-            && ((Node) p1).getCoor().equals(((Node) p2).getCoor());
+            && ((Node) p1).getCoor().equalsEpsilon(((Node) p2).getCoor());
     }
 
