Chuyển đổi kinh độ / vĩ độ thành pixel trên bản đồ


10

Tôi có một bản đồ từ đây . Tôi muốn có thể chỉ cần chuyển đổi cặp lon / lat tùy ý thành pixel trên bản đồ (cũng có khả năng thực hiện chuyển đổi ngược lại). Các bản đồ đi kèm với tập tin .tfw và thông tin trình chiếu, đây là:

0.02222222222222 
0.00000000000000 
0.00000000000000 
-0.02222222222222 
-180.00000000000000 
90.00000000000000

và thông tin chiếu:

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

Tôi hoàn toàn mới đối với những thứ liên quan đến bản đồ, và theo như tôi nhận ra trước tiên tôi nên thực hiện chuyển đổi từ WGS84 (cặp lon / lat) sang phép chiếu Địa lý (chúng có giống nhau không?). Đối với tôi, dường như chúng giống nhau, nhưng bán kính hình cầu trong thông tin chiếu ở trên là 6370997 và khác với trang spatialreference.com tôi tìm thấy cho phép chiếu Car Carree. Dù sao, tôi đã tìm thấy thư viện DotSpatial.Projections có thể làm điều này cho tôi, với đoạn mã sau:

    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);

Và sau đó tôi phải dịch tọa độ kết quả thành pixel trên bản đồ bằng tệp thế giới. Tôi biết công thức sau:

hình ảnh wikipedia

Nhưng có vẻ như có độ không phải là mét trong tập tin thế giới và tôi không biết phải làm gì với chúng. Nói chung, tôi đang làm đúng? Hoặc có cách dễ dàng hơn, cho dữ liệu của tôi?


1
Dựa trên tệp thế giới, raster đang sử dụng vĩ độ và kinh độ làm đơn vị. Kích thước tế bào là 0,0222 độ. Điều này đôi khi được gọi là Carree giả. Tấm Carree sẽ chia tỷ lệ và chuyển đổi các giá trị thành mét. Ngoài ra còn có một hỗn hợp dữ liệu được gọi là WGS84, nhưng một hình cầu có bán kính = 6370997 được đề cập. Đang thử sử dụng WKID: 4326.
mkennedy

@mkennedy Tôi nghĩ rằng công thức trên áp dụng cho tập tin thế giới sẽ không mang lại kết quả gì có ý nghĩa bởi vì nó được thiết kế cho mét? Tôi cũng không biết và googled mà không có bất kỳ kết quả nào WKID: 4326 có nghĩa là gì.
Dmitry Marchuk

Câu trả lời:


6

Không có sự chuyển đổi giữa các tọa độ nhưng đến / từ các vị trí pixel, như thế này: chúng tôi giả sử px, py là một vị trí pixel trong bản đồ của bạn, trong khi geox và geoy là tọa độ trong thế giới thực. Chúng tôi cũng có x Offer, y Offer được lấy từ tfw, với -180, 90 cộng với xsize và ysize, với 0,02222222222222222, -0.022222222222222

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

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

hai hàm giả ở trên cho chúng ta biết vị trí địa lý (geox, geoy) cho một vị trí pixel nhất định và, tôi nghĩ đó là những gì bạn yêu cầu, vị trí pixel cho một vị trí địa lý nhất định. Điều này chỉ có thể, bởi vì "tấm carree" xử lý các mức độ địa lý với kinh độ và vĩ độ là tọa độ số liệu trên một mặt phẳng (trong một hệ tọa độ hình chữ nhật). Nếu bạn vẽ hình vẽ của trái đất, bạn sẽ có được các hình vuông có kích thước bằng nhau (Và đó là những gì hình ảnh bản đồ của bạn muốn). Sau khi chỉnh sửa lỗi của tôi, bây giờ tôi nhận được với lon / lat (50.4546600, 30.5238000) Tôi nhận được (10370.459804704598, 2676.42902676429). Truyền nó thành số nguyên, nếu bạn cần pixel kích thước.


px = (geox + xOff) / xsize, ví dụ của bạn sẽ (50.4546600 + (-180)) / 0.02222222222222là số âm và gần bằng nhau 5830. Mà không được 2113.3936363636362. Xin vui lòng, giải thích thêm, hoặc sửa câu trả lời.
Dmitry Marchuk

Mã ban đầu là trong javascript với một số phụ thuộc, tôi sẽ kiểm tra ...
Andreas Müller

Tôi đã thay đổi mã và Văn bản ở trên, vì tôi gặp lỗi khi sao chép mã từ JavaScript.
Andreas Müller
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.