转换英国国家网格(EPSG:7405),以编程方式使用Java(JTS首选)坐标到纬度和经度坐标

时间:2017-10-11 14:19:31

标签: java gis jts

有没有办法使用Java转换(英国国家网格(10图网格参考))到lat / long?

例如,我有一个558832.516608631,180065.50201851176,并希望使用Java或JTS生成lat / long。

我已经看过使用Javacript的问题/解决方案,但没有单独使用Java的解决方案。

我已经尝试使用JTS:

   Coordinate c = new Coordinate(394028.93262359675,806122.3097467106);

    com.vividsolutions.jts.geom.Point p = gf.createPoint(c);

    CoordinateReferenceSystem utmCrs = CRS.decode("EPSG:3785");
    MathTransform mathTransform = CRS.findMathTransform(utmCrs, DefaultGeographicCRS.WGS84, false);
    com.vividsolutions.jts.geom.Point p1 = (com.vividsolutions.jts.geom.Point) JTS.transform(p, mathTransform);

    System.out.println(p1.getCoordinate());

但坐标不会转换为我可以在谷歌地图中使用的纬度/经度。

感谢。

http://www.movable-type.co.uk/scripts/latlong-os-gridref.html 包含一个论坛,我相信,但我宁愿使用java lib。

这是我想要修复的GeoJson Polygon: https://gist.githubusercontent.com/boundaries-io/089ca86fdc88b1065f5ee3dd12af684b/raw/e9f8b54ae17d835ad8560fcb81d693201235e386/example.geojson

尝试使用:

CoordinateReferenceSystem utmCrs = CRS.decode("EPSG:7405");

然而,

org.opengis.referencing.operation.OperationNotFoundException: No transformation available from system "CompoundCRS[OSGB 1936 / British National Grid + ODN height]" to "GeographicCRS[WGS84(DD)]".
    at  

最终解决方案是使用:

CoordinateReferenceSystem utmCrs = CRS.decode("EPSG:27700");

2 个答案:

答案 0 :(得分:2)

Oups,除非我在某个地方弄错了,英国国家网格是EPSG:27700EPSG:3785是一个弃用的流行墨卡托投影。

但你也可以查看EPSG:7405,它被宣布为OSGB 1936 /英国国家网格+ ODN高度。事实上,我认为你想要这个,因为你在评论和EPSG中引用了SGB1936:7405是OSGB 1936,而EPSG:27700是OSBG36。

事实上,EPSG:27700可以在任何工具上使用而没有任何问题,因为它不依赖于特定的高度网格。相比之下,EPSG:7405更准确,因为它明确地使用了ODN高度数据......但需要将其加载到转换器工具中。它可以在真正的Proj4安装上完成(但对它的解释远远超出我目前的知识),并且可能会或可能不会在Java工具中完成。有关它的问题应在Geographic Information Sytems上提出。但如果2米精度可以接受,只需从EPSG:27700转换为EPSG:4326(WGS84 lat-lon)。使用online tool from epsg.io,您的示例点394028.93262359675,806122.3097467106将在lon = -2°6'1.122“,lat = 57°8'45.42”转换为Aberdeen中心。

答案 1 :(得分:1)

不确定这是否有帮助,因为它确实涉及GeoTools以及JTS,但我之前已成功使用过它。我不知道它将在变形方面包含所有内容。

  public static Geometry transform(Geometry inputFeature, CoordinateReferenceSystem source, CoordinateReferenceSystem target) {
    Geometry out = null;
    try {
      final MathTransform mathTransform = CRS.findMathTransform(source, target, true);
      out = JTS.transform(inputFeature, mathTransform);
    } catch (Exception e) {
      LOGGER.error("Exception occurred during transform for input: " + inputFeature, e);
    }
    return out;
  }

以下是我对这些对象的导入

import org.geotools.coverage.grid.GridCoverage2D;
import org.geotools.coverage.grid.GridEnvelope2D;
import org.geotools.coverage.grid.GridGeometry2D;
import org.geotools.coverage.grid.io.AbstractGridFormat;
import org.geotools.coverage.grid.io.OverviewPolicy;

import org.geotools.gce.geotiff.GeoTiffReader;
import org.geotools.geometry.Envelope2D;
import org.geotools.geometry.jts.JTS;
import org.geotools.referencing.CRS;
import org.geotools.referencing.crs.DefaultGeographicCRS;
import org.jaitools.jts.CoordinateSequence2D;
import org.opengis.parameter.GeneralParameterValue;
import org.opengis.parameter.ParameterValue;
import org.opengis.referencing.crs.CoordinateReferenceSystem;
import org.opengis.referencing.operation.MathTransform;

以下是我可能需要的POM条目

       <dependency>

            <groupId>org.geotools</groupId>
            <artifactId>gt-epsg-hsql</artifactId>
            <version>15-RC1</version>
        </dependency>
<dependency>
  <groupId>org.geotools</groupId>
  <artifactId>gt-geojson</artifactId>
  <version>15-RC1</version>
</dependency>



        <dependency>
            <groupId>org.geotools</groupId>
            <artifactId>gt-geotiff</artifactId>
            <version>15-RC1</version>
        </dependency>

        <dependency>
            <groupId>org.geotools</groupId>
            <artifactId>gt-wms</artifactId>
            <version>15-RC1</version>
        </dependency>

希望这会有所帮助,如果您已经在运行数据库服务器,我还采用了使用PostGIS或Oracle Spatial之类的方法在sql中进行转换。

更新:

我认为这适用于这个具体案例 这段代码:

 Coordinate c = new Coordinate(394028.93262359675,806122.3097467106);

      com.vividsolutions.jts.geom.Point p = GEOMETRY_FACTORY.createPoint(c);

      CoordinateReferenceSystem utmCrs = CRS.decode("EPSG:3785");
      Geometry transform = transform(p, utmCrs, DefaultGeographicCRS.WGS84);

制作了这个geom(在WKT中) 要点(3.5396221256107805 7.270235925793633)

这看起来对我很好(至少直觉)