แปลงลองจิจูด / ละติจูดเป็นพิกเซลบนแผนที่


11

ฉันมีแผนที่จากที่นี่ ฉันต้องการที่จะสามารถแปลงคู่ 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 (คู่ lon / lat) เป็นการคาดการณ์ทางภูมิศาสตร์ (ไม่เหมือนกันหรือไม่) สำหรับฉันแล้วดูเหมือนว่าพวกมันเหมือนกัน แต่รัศมีของทรงกลมในข้อมูลการฉายภาพด้านบนคือ 6370997 และแตกต่างจากหน้า spatialreference.com ที่ฉันพบสำหรับการฉาย Plate Plate อย่างไรก็ตามฉันพบห้องสมุด 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
ขึ้นอยู่กับไฟล์โลก raster ใช้ละติจูดและลองจิจูดเป็นหน่วย ขนาดเซลล์คือ 0.0222 องศา บางครั้งนี้เป็นที่รู้จักกันในชื่อหลอก - จาน Carree Plate Carree จะปรับขนาดและแปลงค่าเป็นเมตร นอกจากนี้ยังมีการผสมผสานของตัวเลขที่เรียกว่า WGS84 แต่กล่าวถึงทรงกลมที่มีรัศมี = 6370997 ลองใช้ WKID: 4326
mkennedy

@mkennedy ฉันคิดว่าสูตรด้านบนที่นำไปใช้กับไฟล์โลกจะไม่ส่งผลอะไรที่มีความหมายเพราะมันถูกออกแบบมาสำหรับมิเตอร์? ฉันยังไม่รู้และ googled โดยไม่มีผลใด ๆ ความหมายของ WKID: 4326
Dmitry Marchuk

คำตอบ:


6

ไม่มีการแปลงระหว่างพิกัด แต่ไปสู่ ​​/ จากตำแหน่งพิกเซลเช่นนี้เราถือว่า px, py เป็นตำแหน่งพิกเซลในแผนที่ของคุณในขณะที่ geox และ geoy เป็นพิกัดโลกแห่งความจริง เรายังมี xOff, yOff ที่นำมาจาก tfw ด้วย -180, 90 บวก xsize และ ysize ด้วย 0.0222222222222222, -0.0222222222222222

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

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

ฟังก์ชันหลอกสองฟังก์ชันข้างต้นบอกตำแหน่งทางภูมิศาสตร์ (geox, geoy) สำหรับตำแหน่งพิกเซลที่ระบุและฉันคิดว่านั่นคือสิ่งที่คุณขอตำแหน่งตำแหน่งพิกเซลสำหรับตำแหน่งทางภูมิศาสตร์ที่กำหนด สิ่งนี้เป็นไปได้เพียงเพราะ "plate carree" ใช้องศาทางภูมิศาสตร์ด้วยลองจิจูดและละติจูดเป็นพิกัดเมตริกบนเครื่องบิน (ภายในระบบพิกัดรูปสี่เหลี่ยมผืนผ้า) ถ้าคุณจะวาดรอยแยกของโลกคุณจะได้สี่เหลี่ยมที่มีขนาดเท่ากัน (และนั่นคือสิ่งที่ภาพแผนที่ของคุณดูเหมือนจะเป็นเหมือน) หลังจากแก้ไขข้อผิดพลาดตอนนี้ฉันได้รับด้วย lon / lat (50.4546600, 30.5238000) ฉันได้รับ (10370.459803704598, 2676.42902676429) ส่งไปที่จำนวนเต็มหากคุณต้องการพิกเซลระบุ


px = (geox + xOff) / xsizeตัวอย่างเช่นคุณจะเป็นที่เป็นลบและประมาณเท่ากับ(50.4546600 + (-180)) / 0.02222222222222 ซึ่งไม่ได้เป็น5830 2113.3936363636362กรุณาอธิบายเพิ่มเติมหรือแก้ไขคำตอบ
Dmitry Marchuk

รหัสเดิมอยู่ในจาวาสคริปต์ที่มีการอ้างอิงบางอย่างฉันจะตรวจสอบ ...
Andreas Müller

ฉันเปลี่ยนรหัสและข้อความด้านบนเนื่องจากฉันมีข้อผิดพลาดในการคัดลอกจาก JavaScript
Andreas Müller
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.