将经度/纬度转换为地图上的像素


10

我从这里有一张地图。我希望能够简单地将任意lon / lat对转换为地图上的像素(还可以进行反向转换)。这些地图带有.tfw文件和投影信息,这里是:

0.02222222222222 
0.00000000000000 
0.00000000000000 
-0.02222222222222 
-180.00000000000000 
90.00000000000000

和投影信息:

Projection: Plate Carree aka Geographic or "LatLong"
Earth ellipsoid: Sphere, radius 6370997 m
Datum: WGS84
Extent: 180 West to 180 East, 90 North to 90 South
Size: 16,200 height samples wide x 8,100 high
Resolution: 2.47 km/pixel

我对制图相关的知识完全陌生,据我所知,我应该首先进行从WGS84(单双)到地理投影的转换(不是吗?)。在我看来,它们实际上是相同的,但是上面的投影信息中的球体半径是6370997,并且与我在Plate Carree投影中发现的spacespacereference.com页面不同。无论如何,我发现DotSpatial.Projections库可以使用以下代码为我完成此操作:

    var kievCoordinates = new[] { 50.4546600, 30.5238000 };
    var z = new[] { 1.0 };

    var wgs84 = KnownCoordinateSystems.Geographic.World.WGS1984;
    var dest = new ProjectionInfo();
    dest.ParseEsriString(
        "PROJCS[\"WGS 84 / Plate Carree (deprecated)\",GEOGCS[\"GCS_WGS_1984\",DATUM[\"D_WGS_1984\",SPHEROID[\"WGS_1984\",6378137,298.257223563]],PRIMEM[\"Greenwich\",0],UNIT[\"Degree\",0.017453292519943295]],PROJECTION[\"Equidistant_Cylindrical\"],PARAMETER[\"central_meridian\",0],PARAMETER[\"false_easting\",0],PARAMETER[\"false_northing\",0],UNIT[\"Meter\",1]]");

    Reproject.ReprojectPoints(kievCoordinates, z, wgs84, dest, 0, 1);

然后,我必须使用世界文件将结果坐标转换为地图上的像素。我知道以下公式:

维基百科图片

但似乎世界文件中没有度数,我也不知道该如何处理。通常,我在做正确的事情吗?还是根据我的数据,有一种更简单的方法?


1
栅格基于世界文件,以经度和纬度为单位。像元大小为0.0222度。有时称为伪板Carree。Plate Carree将缩放比例并将其转换为米。还有一种混合的数据称为WGS84,但其中提到了半径为6370997的球体。尝试使用WKID:4326。
mkennedy

@mkennedy我认为上面应用于世界文件的公式不会带来任何有意义的结果,因为它是为仪表设计的?我也不知道,没有结果,谷歌搜索WKID:4326意味着什么。
德米特里·马库克

Answers:


6

坐标之间没有变换,只能与像素位置进行变换,如下所示:我们假设px,py是地图中的像素位置,而geox和geoy是真实世界的坐标。我们还从tfw中获取xOff,yOff,其中-180、90加上xsize和ysize,分别为0.02222222222222,-0.02222222222222

pix2coord(px,py)
    geox = xOff + (px * xsize)
    geoy = yOff + (py * ysize)

coord2pix(geox, geoy)
    px = (geox - xOff) / xsize 
    py = (geoy - yOff) / ysize

上面的两个伪函数告诉我们给定像素位置的地理位置(geox,geoy),我想这就是您要求的给定地理位置的像素位置。这仅是可能的,因为“板状凸起”将经度和纬度的地理度视为平面上的度量坐标(在直角坐标系内)。如果您绘制地球的方格线,则会得到大小相等的正方形(这就是您的地图图片看上去所想要的)。编辑错误后,现在我得到lon / lat(50.4546600,30.5238000)我得到(10370.459803704598,2676.42902676429)。如果需要像素化,则将其强制转换为整数。


px = (geox + xOff) / xsize,例如(50.4546600 + (-180)) / 0.02222222222222,负数大致等于5830。哪个不是2113.3936363636362。请进一步解释或纠正答案。
德米特里·马库克

原始代码在javascript中具有某些依赖性,我将检查...
AndreasMüller16年

我更改了上面的代码和文本,因为从JavaScript复制代码时出错。
AndreasMüller'16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.