좌표 변환
전자해도 응용에서 가장 자주 쓰는 작업 중 하나가 좌표 변환이다. henc 는 4 가지 좌표계를 다루며 각각 사이의 변환 함수를 제공한다.
4개의 좌표계
섹션 제목: “4개의 좌표계”| 좌표계 | 단위 | 사용처 |
|---|---|---|
| Window (Win) | 픽셀 (정수) | 마우스 이벤트, 위젯 절대 좌표 |
| OpenGL (Gl) | 정규화 좌표 (-1 ~ 1) | 셰이더·임의 OpenGL 드로잉 |
| Map | 도(°) - 위경도 | 셀·해도 객체 좌표 |
| Mercator | 미터 | 거리 계산·항적 |
마우스 클릭 → 위경도
섹션 제목: “마우스 클릭 → 위경도”// 마우스 메시지 핸들러 (Win32 OnLButtonDown 또는 Qt mousePressEvent)void onLeftClick(int viewHandle, int mouseX, int mouseY) { double lon = 0, lat = 0; // Win → Map (위경도) hencWinPosToMapPos(viewHandle, mouseX, mouseY, &lon, &lat); printf("clicked at: %.6f°E, %.6f°N\n", lon, lat);}위경도 → 화면 픽셀 (마커 그리기)
섹션 제목: “위경도 → 화면 픽셀 (마커 그리기)”// 사용자 정의 PNG 마커를 위경도 좌표에 그리고 싶을 때 화면 좌표가 필요한 경우void drawCustomMarker(int view, double lon, double lat) { int sx = 0, sy = 0; hencMapPosToWinPos(view, lon, lat, &sx, &sy);
// 뷰포트 밖이면 그리지 않음 - 화면 크기로 보드 클리핑 int vw, vh; hencGetPixelSize(view, &vw, &vh); if (sx < 0 || sy < 0 || sx >= vw || sy >= vh) return;
// 응용 코드에서 sx, sy 위치에 OpenGL 또는 GDI로 마커 렌더링}WGS84 ↔ Mercator (거리 계산용)
섹션 제목: “WGS84 ↔ Mercator (거리 계산용)”// 두 점 사이의 거리를 미터 단위로 - 메르카토르 좌표 차이로 근사double distanceInMeters(double lon1, double lat1, double lon2, double lat2) { double mx1, my1, mx2, my2; hencWgs84ToMercator(lon1, lat1, &mx1, &my1); hencWgs84ToMercator(lon2, lat2, &mx2, &my2);
double dx = mx2 - mx1; double dy = my2 - my1; return sqrt(dx * dx + dy * dy);}
// 미터 단위로 떨어진 위치 계산 (예: 마우스 위치에서 동쪽으로 500m 떨어진 점)void offsetMeters(double lon, double lat, double dxMeters, double dyMeters, double* outLon, double* outLat) { double mx, my; hencWgs84ToMercator(lon, lat, &mx, &my); hencMercatorToWgs84(mx + dxMeters, my + dyMeters, outLon, outLat);}OpenGL 좌표가 필요한 경우 (셰이더·임의 드로잉)
섹션 제목: “OpenGL 좌표가 필요한 경우 (셰이더·임의 드로잉)”// 마우스 위치를 OpenGL 정규화 좌표로 - 사용자 정의 셰이더에 전달void mouseToGl(int view, int mx, int my, double* gx, double* gy) { hencWinPosToGlPos(view, mx, my, gx, gy);}
// 또는 위경도를 직접 OpenGL 좌표로void mapToGl(int view, double lon, double lat, double* gx, double* gy) { hencMapPosToGlPos(view, lon, lat, gx, gy);}관련 API
섹션 제목: “관련 API”- hencWinPosToMapPos / hencMapPosToWinPos
- hencWinPosToGlPos / hencGlPosToWinPos
- hencMapPosToGlPos / hencGlPosToMapPos
- hencWgs84ToMercator / hencMercatorToWgs84
- 짧은 측지 계산은 util - 좌표/유틸 의 Vincenty / Haversine 함수도 활용