Coordinate Conversion
Coordinate conversion is one of the most frequent operations in an ENC app. henc deals with 4 coordinate spaces and provides conversion functions between any pair.
The 4 coordinate spaces
Section titled “The 4 coordinate spaces”| Space | Unit | Used for |
|---|---|---|
| Window (Win) | pixels (int) | mouse events, widget-absolute positions |
| OpenGL (Gl) | NDC (-1 ~ 1) | shaders / custom GL drawing |
| Map | degrees (°) | cell content, chart object coords |
| Mercator | metres | distance, vessel track |
Mouse click → lat/lon
Section titled “Mouse click → lat/lon”// Mouse handler (Win32 OnLButtonDown or Qt mousePressEvent)void onLeftClick(int viewHandle, int mouseX, int mouseY) { double lon = 0, lat = 0; hencWinPosToMapPos(viewHandle, mouseX, mouseY, &lon, &lat); printf("clicked at: %.6f°E, %.6f°N\n", lon, lat);}Lat/lon → window pixel (drawing markers)
Section titled “Lat/lon → window pixel (drawing markers)”// Drawing a custom PNG marker on top of a chart at a given lat/lonvoid drawCustomMarker(int view, double lon, double lat) { int sx = 0, sy = 0; hencMapPosToWinPos(view, lon, lat, &sx, &sy);
// Off-screen? skip drawing int vw, vh; hencGetPixelSize(view, &vw, &vh); if (sx < 0 || sy < 0 || sx >= vw || sy >= vh) return;
// ... draw via OpenGL or GDI at (sx, sy) ...}WGS84 ↔ Mercator (distance)
Section titled “WGS84 ↔ Mercator (distance)”// Distance between two points in metres (Mercator delta approximation)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);}
// Offset a position by metres (e.g. 500m east of mouse click)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 coords (shaders / custom drawing)
Section titled “OpenGL coords (shaders / custom drawing)”// Mouse position into GL NDC - pass to a custom shadervoid mouseToGl(int view, int mx, int my, double* gx, double* gy) { hencWinPosToGlPos(view, mx, my, gx, gy);}
// Or lat/lon directly into GL NDCvoid mapToGl(int view, double lon, double lat, double* gx, double* gy) { hencMapPosToGlPos(view, lon, lat, gx, gy);}Related API
Section titled “Related API”- hencWinPosToMapPos / hencMapPosToWinPos
- hencWinPosToGlPos / hencGlPosToWinPos
- hencMapPosToGlPos / hencGlPosToMapPos
- hencWgs84ToMercator / hencMercatorToWgs84
- For short geodesic math, see util - coordinates / utilities (Vincenty / Haversine)