【问题标题】:Convert Longitude and Latitude to image X, Y pixel coordinates on Alber's projection将经度和纬度转换为 Alber 投影上的图像 X、Y 像素坐标
【发布时间】:2016-10-08 02:26:04
【问题描述】:

我从雷达获得了许多坐标,这些坐标的格式与谷歌地图坐标几乎相同,我不太确定,但我问了公司,他们告诉我为了获得阿尔伯投影上的坐标,我需要执行以下操作:

然后您将能够创建 2 个 CoordinateReferenceSystem(即 坐标系),将其设置为默认值(经度/纬度),然后设置 另一个带有 WKT 字符串(将被投影为 x/y)。然后你 可以轻松创建 2 MathTransform 以在两者中转换 方向。

这是 Alber 投影的 OGC WKT:

PROJCS["unnamed",
    GEOGCS["WGS 84",
        DATUM["WGS_1984",
            SPHEROID["WGS 84",6378137,298.2572235629972,
                AUTHORITY["EPSG","7030"]],
            AUTHORITY["EPSG","6326"]],
        PRIMEM["Greenwich",0],
        UNIT["degree",0.0174532925199433],
        AUTHORITY["EPSG","4326"]],
    PROJECTION["Albers_Conic_Equal_Area"],
    PARAMETER["standard_parallel_1",31.996308],
    PARAMETER["standard_parallel_2",33.996308],
    PARAMETER["latitude_of_center",32.996308],
    PARAMETER["longitude_of_center",35.415901],
    PARAMETER["false_easting",0],
    PARAMETER["false_northing",0],
    UNIT["metre",1,AUTHORITY["EPSG","9001"]]]

因此,据我所知,我需要从 long/lat 转换为 WKT 投影以显示在 Alber 的投影图图像上。

所以在GeoTools我使用了以下代码:

    CoordinateReferenceSystem source = CRS.decode("EPSG:4326");
    CoordinateReferenceSystem target = CRS.parseWKT("PROJCS[\"unnamed\", GEOGCS[\"WGS 84\", DATUM[\"WGS_1984\", SPHEROID[\"WGS 84\",6378137,298.2572235629972, AUTHORITY[\"EPSG\",\"7030\"]], AUTHORITY[\"EPSG\",\"6326\"]], PRIMEM[\"Greenwich\",0], UNIT[\"degree\",0.0174532925199433], AUTHORITY[\"EPSG\",\"4326\"]], PROJECTION[\"Albers_Conic_Equal_Area\"], PARAMETER[\"standard_parallel_1\",31.996308], PARAMETER[\"standard_parallel_2\",33.996308], PARAMETER[\"latitude_of_center\",32.996308], PARAMETER[\"longitude_of_center\",35.415901], PARAMETER[\"false_easting\",0], PARAMETER[\"false_northing\",0], UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]]]");
    MathTransform transform = CRS.findMathTransform(source, target, true);

    Coordinate c = JTS.transform(new Coordinate(34, 35), new Coordinate(), transform);
    System.out.println(c.toString());

这就是我得到的输出:

(-38422.86847540497, 111410.0483012808, NaN)

现在,可能是因为 source 坐标系统错误,但他默认的 long/lat 系统是什么意思?

即使我解决了这个问题,我怎样才能让它在我的地图图像上显示这些点?我的意思是它必须知道图像的宽度/高度不是吗?

【问题讨论】:

    标签: java geotools


    【解决方案1】:

    此阿尔伯斯投影 WKT 从 EPSG 4326 投影到距零点的距离(以米为单位)(请参阅参数)。我们怎么知道它是否是米?因为 WKT 有一个设置 UNIT 标签,将其显示为米单位。

    那么我是怎么使用它的呢?

    我的公司给了我两个文件,地图 JPEG 文件和地图常量的 XML 文件。

    该地图常量 XML 文件包含从该地图的零点到地图角落的距离。因此,如果您在地图上至少有一个点,则可以找到所有内容。

    将其转换为地图 X/Y 需要了解的事项:

    • 每个像素有多少公里(在我的例子中是 1.6 正好 1 英里)
    • 地图上至少一个已知点距零点的距离

    我就是这样做的:

            MathTransform transform = CRS.findMathTransform(epsg4326, targetWKT, true);
    
            DirectPosition2D srcDirectPosition2D
                    = new DirectPosition2D(epsg4326, latitude, longitude);
            DirectPosition2D destDirectPosition2D
                    = new DirectPosition2D();
            transform.transform(srcDirectPosition2D, destDirectPosition2D);
    
            double transX = destDirectPosition2D.x;
            double transY = destDirectPosition2D.y;
    
            int kmPerPixel = mapImage.getWidth / 1024; // It is known to me that my map is 1024x1024km ...
    
            double x = zeroPointX + ( (transX * 0.001) * kmPerPixel);
            double y = zeroPointY + ( ( (transX * -1) * 0.001) * kmPerPixel);
    

    zeroPointX 和 Y 可以通过在地图上的距离点上进行相同的计算而无需添加,就像我对角所做的那样。

    可能会帮助一些人,所以我发布了我的发现。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-09
      • 1970-01-01
      • 2012-12-29
      • 2013-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多