переводить широту и долготу в север и на восток в яве? - PullRequest
7 голосов
/ 30 ноября 2010

как преобразовать широту и долготу на север и восток в Java?

Ответы [ 2 ]

13 голосов
/ 30 ноября 2010

Полагаю, вы имеете в виду восточное и северное направления ОСГ Великобритании. Тригонометрия, стоящая за этой, очень смешная, но вы можете использовать для этого библиотеку JCoord , это упрощает ее (если сильно загружает процессор).


Чтобы прокомментировать комментарии @ DD, приведенные ниже, есть недоработка с JCoord, в которой вы должны убедиться, что используете правильные данные при преобразовании из Easting / Northing в Lat / Long и наоборот.

Возьмите код @ DD:

LatLng latLng = new OSRef(394251,806376).toLatLng();

Это вернет широту / долготу, которая использует данные OSGB36, то есть приближение «плоской земли», используемое на картах Великобритании. Это существенно отличается от данных WSG84, используемых в большинстве приложений (включая Streetmap), которые моделируют мир как сферу (более или менее).

Чтобы преобразовать в WGS84 lat / long, вам нужно сделать это явно:

LatLng latLng = new OSRef(394251,806376).toLatLng();
latLng.toWGS84();

Это позволит отрегулировать широту и длину до правильного значения.

Обратите внимание, что javadoc для OsRef.toLatLng() очень ясно говорит об этом:

Преобразовать эту опорную сетку OSGB в пару широта / долгота, используя данные OSGB36. Обратите внимание, что объект LatLng может нуждаться в преобразовании в базовые данные WGS84 в зависимости от приложения

Преобразование между координатными данными не простое. Если это выглядит просто, вы, вероятно, делаете это неправильно.

4 голосов
/ 19 июля 2011

Попробуйте GeoTools:

       CRSAuthorityFactory crsFac = ReferencingFactoryFinder
    .getCRSAuthorityFactory("EPSG", null);

    CoordinateReferenceSystem wgs84crs = crsFac
            .createCoordinateReferenceSystem("4326");
    CoordinateReferenceSystem osgbCrs = crsFac
            .createCoordinateReferenceSystem("27700");

    CoordinateOperation op = new DefaultCoordinateOperationFactory()
            .createOperation(osgbCrs, wgs84crs);

    DirectPosition eastNorth = new GeneralDirectPosition(easting, northing);
    DirectPosition latLng = op.getMathTransform().transform(eastNorth,
            eastNorth);


    double latitude=latLng.getOrdinate(0);
    double longitude=latLng.getOrdinate(1);

    <dependency>
        <groupId>org.geotools</groupId>
        <artifactId>gt-main</artifactId>
        <version>${geotools.version}</version>
    </dependency>
    <dependency>
        <groupId>org.geotools</groupId>
        <artifactId>gt-epsg-hsql</artifactId>
        <version>${geotools.version}</version>
    </dependency>
    <dependency>
        <groupId>org.geotools</groupId>
        <artifactId>gt-xml</artifactId>
        <version>${geotools.version}</version>
    </dependency>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...