Skip to content

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.

SpaceUnitUsed for
Window (Win)pixels (int)mouse events, widget-absolute positions
OpenGL (Gl)NDC (-1 ~ 1)shaders / custom GL drawing
Mapdegrees (°)cell content, chart object coords
Mercatormetresdistance, vessel track
// 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/lon
void 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) ...
}
// 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);
}
// Mouse position into GL NDC - pass to a custom shader
void mouseToGl(int view, int mx, int my, double* gx, double* gy) {
hencWinPosToGlPos(view, mx, my, gx, gy);
}
// Or lat/lon directly into GL NDC
void mapToGl(int view, double lon, double lat, double* gx, double* gy) {
hencMapPosToGlPos(view, lon, lat, gx, gy);
}