Преобразование ED_1950_UTM_Zone_32N (23032) в WGS84

Мне нужно импортировать и обработать шейп-файл, используя вышеупомянутую систему координат, в приложение Java, которое использует систему координат WGS84.

В частности, я читаю шейп-файл, извлекаю многоугольники и сохраняю каждый многоугольник как объект в своей базе данных. Позже мне придется сравнивать пространственные точки с этими многоугольниками (проверяя, находится ли точка внутри или вне его многоугольника). Тот факт, что точки и многоугольники находятся в разных CRS, кажется причиной, по которой я достигаю 0 совпадений.

Хотя я думаю, что это не имеет значения, вот как я читаю шейп-файл с помощью GeoTools:

        InputStream stream = new FileInputStream("path/to/file");

        File tempDir = File.createTempFile("shapefile_temp", "");

        if (tempDir.exists())
            tempDir.delete();
        tempDir.mkdir();

        URL shpName = null;

        Files.unzip(stream, tempDir);

        for (File file : tempDir.listFiles())
            if (file.getName()
                    .endsWith(".shp"))
            {
                shpName = file.toURI()
                              .toURL();
                break;
            }

        if (shpName == null)
            throw new RuntimeException("No SHP found");

        Map<String, Object> map = new HashMap<String, Object>();

        map.put("url", shpName);
        DataStore dataStore = DataStoreFinder.getDataStore(map);

        try
        {
            String typeName = dataStore.getTypeNames()[0];

            FeatureSource<SimpleFeatureType, SimpleFeature> source = dataStore.getFeatureSource(typeName);

            FeatureIterator<SimpleFeature> iterator = source.getFeatures()
                                                            .features();

            while (iterator.hasNext())
            {

                Feature feature = iterator.next();

                System.out.println();
                System.out.println((int) feature.getProperty("COD_PRO")
                                                .getValue() + "\t" + feature.getProperty("NOME_PRO")
                                                                            .getValue());
                System.out.println(feature.getDefaultGeometryProperty()
                                          .getValue()); //This thing will be stored in a CQEngine and compared against a given point
            }

        }
        finally
        {
            tempDir.delete();
        }

    }
    finally
    {
        System.gc();
    }

Следующий код более актуален: как проверить, находится ли точка внутри фигуры

    final GeometryFactory geoFactory = new GeometryFactory();
    com.vividsolutions.jts.geom.Point point = geoFactory.createPoint(new Coordinate(loc.getLongitude().doubleValue(), loc.getLatitude().doubleValue()));

                            loc.setContained(shape.getGeometry().covers(pointBing) || shape.getGeometry().contains(point));

Как преобразовать полигоны из ED_1950 ... в WGS84? Или как сравнить точку WGS84 с полигоном ED_1950?


person usr-local-ΕΨΗΕΛΩΝ    schedule 30.07.2014    source источник


Ответы (1)


Сначала вам нужно преобразовать Данию в WGS84:

CoordinateReferenceSystem worldCRS = CRS.decode("EPSG:4326");
CoordinateReferenceSystem ed_1950 = CRS.decode("EPSG:23032");
boolean lenient = true; // allow for some error due to different datums
MathTransform transform = CRS.findMathTransform(ed_1950, worldCRS, lenient);

Затем для каждой геометрии, которую вы добавляете в свою базу данных, вам необходимо преобразовать ее:

Geometry geometry = (Geometry) feature.getDefaultGeometry();
Geometry geometry2 = JTS.transform(geometry, transform);

(На самом деле я не компилировал этот код, но он должен работать - см. Это руководство для более подробной информации).

person Ian Turton    schedule 31.07.2014
comment
Ошибка: для объекта типа EngineeringCRS не найден код EPSG: 4326 от источника EPSG. Я пытаюсь найти решение самостоятельно, но если у вас есть идеи, поделитесь - person usr-local-ΕΨΗΕΛΩΝ; 01.08.2014
comment
убедитесь, что у вас есть ‹dependency› ‹groupId› org.geotools ‹/groupId› ‹artifactId› gt-epsg-hsql ‹/artifactId› ‹version› $ {geotools.version} ‹/version› ‹/dependency› в вашем pom - person Ian Turton; 01.08.2014