지도에서 경도 / 위도를 픽셀로 변환


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 (론 / 위도 쌍)에서 지리적 투영으로 변환해야합니다 (동일하지 않습니까?). 실제로는 같지만 위의 투영 정보의 구 반경은 6370997이며 Plate Carree 투영에서 찾은 patialreference.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 도입니다. 이것은 종종 의사 판 캐리 (Pseudo-Plate Carree)라고도합니다. Plate Carree는 값을 스케일링하고 미터로 변환합니다. WGS84라고하는 데이텀이 혼합되어 있지만 반경이 6370997 인 구가 언급됩니다. WKID : 4326을 사용하려고합니다.
mkennedy 2016 년

@ mkennedy 월드 파일에 적용된 위의 공식은 미터 용으로 설계 되었기 때문에 의미있는 결과가 없을 것이라고 생각합니까? 또한 WKID : 4326의 의미가 무엇인지 모르고 검색했습니다.
Dmitry Marchuk

답변:


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. 추가로 설명하거나 답을 수정하십시오.
Dmitry Marchuk

오리지널 코드는 자바 스크립트로 일부 의존성이있었습니다. 다음을 확인
Andreas Müller

JavaScript에서 복사하는 중에 오류가 발생하여 위의 코드와 텍스트를 변경했습니다.
Andreas Müller
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.