Since no one answers you:
Code: Select all
EnableExplicit
Procedure.d MercatorProjection(Latitude.d)
ProcedureReturn Log(Tan(#PI / 4.0 + Latitude * #PI / 360.0))
EndProcedure
Procedure.d MercatorScaleFactor(ImgWidth.i, ImgLongitudeEast.d, ImgLongitudeWest.d)
ProcedureReturn ImgWidth / (Radian(ImgLongitudeEast) - Radian(ImgLongitudeWest))
EndProcedure
Procedure.d MercatorX(Longitude.d, ImgLongitudeWest.d, ScaleFactor.d)
ProcedureReturn (Radian(Longitude) - Radian(ImgLongitudeWest)) * ScaleFactor
EndProcedure
Procedure.d MercatorY(Latitude.d, ImgLatitudeNorth.d, ScaleFactor.d)
ProcedureReturn (MercatorProjection(ImgLatitudeNorth) - MercatorProjection(Latitude)) * ScaleFactor
EndProcedure
Define.i Img, ImgWidth, ImgHeight, X, Y
Define.d Latitude, Longitude, Scale, ImgNorthLatitude, ImgEastLongitude, ImgSouthLatitude, ImgWestLongitude
Latitude = 48.6833
Longitude = 6.2
;Latitude = 49.723359
;Longitude = -1.941223
UsePNGImageDecoder()
Img = CatchImage(#PB_Any, ?MercatorMapImageStart, ?MercatorMapImageEnd - ?MercatorMapImageStart)
If Img
Restore MercatorMapImage
Read.d ImgNorthLatitude
Read.d ImgEastLongitude
Read.d ImgSouthLatitude
Read.d ImgWestLongitude
ImgWidth = ImageWidth(Img)
ImgHeight = ImageHeight(Img)
Scale = MercatorScaleFactor(ImgWidth, ImgEastLongitude, ImgWestLongitude)
X = MercatorX(Longitude, ImgWestLongitude, Scale)
Y = MercatorY(Latitude, ImgNorthLatitude, Scale)
StartDrawing(ImageOutput(Img))
Circle(X, Y, 5, $0000FF)
StopDrawing()
OpenWindow(0, 0, 0, ImgWidth, ImgHeight, "Mercator", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
ImageGadget(0, 0, 0, 0, 0, ImageID(Img))
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
DataSection
MercatorMapImage:
Data.d 52.0, 10.0, 40.9166, -5.5
MercatorMapImageStart:
IncludeBinary "MercatorMapImage.png"
MercatorMapImageEnd:
EndDataSection
I modifed the procedures a bit.
Now they use parameters instead of constants.
Bernd