19 Commits

Author SHA1 Message Date
djes
4deae1d60d Curl dependencies removed + some bugfix 2017-03-01 14:19:28 +01:00
djes
2bfd523459 some bugfix + full curl lib usage in comments 2017-03-01 14:06:42 +01:00
djes
751ec96070 Curl option, cache clean function, and cache directory better handling
+ some cleaning
2017-03-01 12:55:28 +01:00
djes
deb766c4c5 Merge remote-tracking branch 'refs/remotes/origin/djes' into MasterRevision 2017-03-01 10:50:19 +01:00
djes
a2eac9192d Merge remote-tracking branch 'refs/remotes/origin/thyphoon' into Revision
# Conflicts:
#	PBMap.pb
2017-03-01 10:42:06 +01:00
djes
1b7cf13af7 Merge remote-tracking branch 'refs/remotes/origin/djes' into MasterRevision 2017-03-01 09:59:35 +01:00
djes
3c87aa702e Bug fixes + bugged rotation removing 2017-02-27 17:27:15 +01:00
djes
b126aacdad Rotation wip 2016-10-07 17:10:36 +02:00
djes
8825b35b1b Rotation wip 2016-10-07 16:22:49 +02:00
djes
382fd53525 Better mouse handling + rotation wip 2016-10-07 12:03:34 +02:00
djes
cdfbe3e839 Better curl error handling, tiles alpha, bugfix + cleanup 2016-10-04 14:01:27 +02:00
djes
1f45afc6f6 Merge remote-tracking branch 'refs/remotes/origin/tilewip' into djes
# Conflicts:
#	PBMap.pb
2016-10-04 13:58:10 +02:00
djes
2fa810fb88 Alpha apparition + img loading update 2016-10-03 17:08:48 +02:00
djes
a1f593c89b Cleaning up tile structure 2016-10-03 16:48:14 +02:00
djes
43f0fc982f BindMapGadget and SetActiveGadget(-1) workaround, and new screenshot 2016-10-03 09:22:42 +02:00
djes
5c3fa46408 Merge pull request #8 from djes/djes
Djes
2016-09-24 11:36:21 +02:00
djes
564bd9f2b1 Add files via upload 2016-09-09 17:24:17 +02:00
djes
eccf177c63 Delete screenshot.png 2016-09-09 17:24:03 +02:00
djes
b7943d279b Add files via upload 2016-09-09 17:20:30 +02:00
3 changed files with 362 additions and 1509 deletions

545
PBMap.pb
View File

@@ -3,7 +3,7 @@
; Description: Permits the use of tiled maps like ; Description: Permits the use of tiled maps like
; OpenStreetMap in a handy PureBASIC module ; OpenStreetMap in a handy PureBASIC module
; Author: Thyphoon, djes And Idle ; Author: Thyphoon, djes And Idle
; Date: Mai 17, 2016 ; Date: March, 2017
; License: PBMap : Free, unrestricted, credit ; License: PBMap : Free, unrestricted, credit
; appreciated but not required. ; appreciated but not required.
; OSM : see http://www.openstreetmap.org/copyright ; OSM : see http://www.openstreetmap.org/copyright
@@ -23,12 +23,22 @@ UsePNGImageDecoder()
UsePNGImageEncoder() UsePNGImageEncoder()
DeclareModule PBMap DeclareModule PBMap
#Red = 255
;-Show debug infos ;-Show debug infos
Global Verbose = 0
Global MyDebugLevel = 0 Global MyDebugLevel = 0
CompilerIf #PB_Compiler_OS = #PB_OS_Linux
#Red = 255
CompilerEndIf
Global slash.s
CompilerSelect #PB_Compiler_OS
CompilerCase #PB_OS_Windows
slash = "\"
CompilerDefault
slash = "/"
CompilerEndSelect
#SCALE_NAUTICAL = 1 #SCALE_NAUTICAL = 1
#SCALE_KM = 0 #SCALE_KM = 0
@@ -39,11 +49,6 @@ DeclareModule PBMap
#MARKER_EDIT_EVENT = #PB_Event_FirstCustomValue #MARKER_EDIT_EVENT = #PB_Event_FirstCustomValue
Structure GeographicCoordinates
Longitude.d
Latitude.d
EndStructure
;-Declarations ;-Declarations
Declare InitPBMap(window) Declare InitPBMap(window)
Declare SetOption(Option.s, Value.s) Declare SetOption(Option.s, Value.s)
@@ -82,13 +87,19 @@ DeclareModule PBMap
Declare.i GetZoom() Declare.i GetZoom()
Declare.i GetMode() Declare.i GetMode()
Declare SetMode(Mode.i = #MODE_DEFAULT) Declare SetMode(Mode.i = #MODE_DEFAULT)
Declare NominatimGeoLocationQuery(Address.s, *ReturnPosition.GeographicCoordinates = 0) ;Send back the position *ptr.GeographicCoordinates Declare NominatimGeoLocationQuery(Address.s, *ReturnPosition= 0) ;Send back the position *ptr.GeographicCoordinates
Declare.i ClearDiskCache()
EndDeclareModule EndDeclareModule
Module PBMap Module PBMap
EnableExplicit EnableExplicit
Structure GeographicCoordinates
Longitude.d
Latitude.d
EndStructure
Structure PixelCoordinates Structure PixelCoordinates
x.d x.d
y.d y.d
@@ -112,19 +123,19 @@ Module PBMap
Structure BoundingBox Structure BoundingBox
NorthWest.GeographicCoordinates NorthWest.GeographicCoordinates
SouthEast.GeographicCoordinates SouthEast.GeographicCoordinates
BottomLeft.PixelCoordinates BottomRight.PixelCoordinates
TopRight.PixelCoordinates TopLeft.PixelCoordinates
EndStructure EndStructure
Structure DrawingParameters Structure DrawingParameters
Canvas.i Canvas.i
CenterX.d ; Gadget center in screen relative pixels RadiusX.d ; Canvas radius, or center in pixels
CenterY.d RadiusY.d
GeographicCoordinates.GeographicCoordinates ; Real center GeographicCoordinates.GeographicCoordinates ; Real center in lat/lon
TileCoordinates.Coordinates ; Center coordinates in tile.decimal TileCoordinates.Coordinates ; Center coordinates in tile.decimal
Bounds.BoundingBox ; Drawing boundaries in lat/lon Bounds.BoundingBox ; Drawing boundaries in lat/lon
Height.d ; Drawing height in degrees
Width.d ; Drawing width in degrees Width.d ; Drawing width in degrees
Height.d ; Drawing height in degrees
PBMapZoom.i PBMapZoom.i
DeltaX.i ; Screen relative pixels tile shift DeltaX.i ; Screen relative pixels tile shift
DeltaY.i DeltaY.i
@@ -179,6 +190,8 @@ Module PBMap
ShowPointer.i ShowPointer.i
TimerInterval.i TimerInterval.i
MaxMemCache.i ; in MiB MaxMemCache.i ; in MiB
Verbose.i ; Maximum debug informations
Warning.i ; Warning requesters
ShowMarkersNb.i ShowMarkersNb.i
ShowMarkersLegend.i ShowMarkersLegend.i
;Drawing stuff ;Drawing stuff
@@ -243,7 +256,7 @@ Module PBMap
Moving.i Moving.i
Dirty.i ; To signal that drawing need a refresh Dirty.i ; To signal that drawing need a refresh
List TracksList.Tracks() List TracksList.Tracks() ; To display a GPX track
List Markers.Marker() ; To diplay marker List Markers.Marker() ; To diplay marker
EditMarker.l EditMarker.l
@@ -269,163 +282,16 @@ Module PBMap
;Send debug infos to stdout (allowing mixed debug infos with curl or other libs) ;Send debug infos to stdout (allowing mixed debug infos with curl or other libs)
Procedure MyDebug(msg.s, DbgLevel = 0) Procedure MyDebug(msg.s, DbgLevel = 0)
If Verbose And DbgLevel >= MyDebugLevel If PBMap\Options\Verbose And DbgLevel >= MyDebugLevel
PrintN(msg) PrintN(msg)
;Debug msg ;Debug msg
EndIf EndIf
EndProcedure EndProcedure
;- *** GetText - Translation purpose ;- *** GetText - Translation purpose
;TODO use this for all text
IncludeFile "gettext.pbi" IncludeFile "gettext.pbi"
;- *** CURL specific
; (program has To be compiled in console format for curl debug infos)
IncludeFile "libcurl.pbi" ; https://github.com/deseven/pbsamples/tree/master/crossplatform/libcurl
Global *ReceiveHTTPToMemoryBuffer, ReceiveHTTPToMemoryBufferPtr.i, ReceivedData.s
ProcedureC ReceiveHTTPWriteToMemoryFunction(*ptr, Size.i, NMemB.i, *Stream)
Protected SizeProper.i = Size & 255
Protected NMemBProper.i = NMemB
If *ReceiveHTTPToMemoryBuffer = 0
*ReceiveHTTPToMemoryBuffer = AllocateMemory(SizeProper * NMemBProper)
If *ReceiveHTTPToMemoryBuffer = 0
Error("Curl : Problem allocating memory")
EndIf
Else
*ReceiveHTTPToMemoryBuffer = ReAllocateMemory(*ReceiveHTTPToMemoryBuffer, MemorySize(*ReceiveHTTPToMemoryBuffer) + SizeProper * NMemBProper)
If *ReceiveHTTPToMemoryBuffer = 0
Error("Curl : Problem reallocating memory")
EndIf
EndIf
CopyMemory(*ptr, *ReceiveHTTPToMemoryBuffer + ReceiveHTTPToMemoryBufferPtr, SizeProper * NMemBProper)
ReceiveHTTPToMemoryBufferPtr + SizeProper * NMemBProper
ProcedureReturn SizeProper * NMemBProper
EndProcedure
Procedure.i CurlReceiveHTTPToMemory(URL$, ProxyURL$="", ProxyPort$="", ProxyUser$="", ProxyPassword$="")
Protected *Buffer, curl.i, Timeout.i, res.i, respcode.l
If Len(URL$)
curl = curl_easy_init()
If curl
Timeout = 3
curl_easy_setopt(curl, #CURLOPT_URL, str2curl(URL$))
curl_easy_setopt(curl, #CURLOPT_SSL_VERIFYPEER, 0)
curl_easy_setopt(curl, #CURLOPT_SSL_VERIFYHOST, 0)
curl_easy_setopt(curl, #CURLOPT_HEADER, 0)
curl_easy_setopt(curl, #CURLOPT_FOLLOWLOCATION, 1)
curl_easy_setopt(curl, #CURLOPT_TIMEOUT, Timeout)
If Verbose
curl_easy_setopt(curl, #CURLOPT_VERBOSE, 1)
EndIf
curl_easy_setopt(curl, #CURLOPT_FAILONERROR, 1)
If Len(ProxyURL$)
;curl_easy_setopt(curl, #CURLOPT_HTTPPROXYTUNNEL, #True)
If Len(ProxyPort$)
ProxyURL$ + ":" + ProxyPort$
EndIf
; Debug ProxyURL$
curl_easy_setopt(curl, #CURLOPT_PROXY, str2curl(ProxyURL$))
If Len(ProxyUser$)
If Len(ProxyPassword$)
ProxyUser$ + ":" + ProxyPassword$
EndIf
;Debug ProxyUser$
curl_easy_setopt(curl, #CURLOPT_PROXYUSERPWD, str2curl(ProxyUser$))
EndIf
EndIf
curl_easy_setopt(curl, #CURLOPT_WRITEFUNCTION, @ReceiveHTTPWriteToMemoryFunction())
res = curl_easy_perform(curl)
If res = #CURLE_OK
*Buffer = AllocateMemory(ReceiveHTTPToMemoryBufferPtr)
If *Buffer
CopyMemory(*ReceiveHTTPToMemoryBuffer, *Buffer, ReceiveHTTPToMemoryBufferPtr)
FreeMemory(*ReceiveHTTPToMemoryBuffer)
*ReceiveHTTPToMemoryBuffer = #Null
ReceiveHTTPToMemoryBufferPtr = 0
Else
MyDebug("Problem allocating buffer", 4)
EndIf
;curl_easy_cleanup(curl) ;Was its original place but moved below as it seems more logical to me.
Else
curl_easy_getinfo(curl, #CURLINFO_HTTP_CODE, @respcode)
MyDebug("CURL : HTTP ERROR " + Str(respcode) , 8)
curl_easy_cleanup(curl)
ProcedureReturn #False
EndIf
curl_easy_cleanup(curl)
Else
MyDebug("Can't Init CURL", 4)
EndIf
EndIf
; Debug "Curl Buffer : " + Str(*Buffer)
ProcedureReturn *Buffer
EndProcedure
;Curl write callback (needed for win32 dll)
ProcedureC ReceiveHTTPWriteToFileFunction(*ptr, Size.i, NMemB.i, FileHandle.i)
ProcedureReturn WriteData(FileHandle, *ptr, Size * NMemB)
EndProcedure
Procedure.i CurlReceiveHTTPToFile(URL$, DestFileName$, ProxyURL$="", ProxyPort$="", ProxyUser$="", ProxyPassword$="")
Protected *Buffer, curl.i, Timeout.i, res.i, respcode.l
Protected FileHandle.i
MyDebug("CurlReceiveHTTPToFile from " + URL$ + " " + ProxyURL$ + " " + ProxyPort$ + " " + ProxyUser$, 8)
MyDebug(" to file : " + DestFileName$, 8)
FileHandle = CreateFile(#PB_Any, DestFileName$)
If FileHandle And Len(URL$)
curl = curl_easy_init()
If curl
Timeout = 120
curl_easy_setopt(curl, #CURLOPT_URL, str2curl(URL$))
curl_easy_setopt(curl, #CURLOPT_SSL_VERIFYPEER, 0)
curl_easy_setopt(curl, #CURLOPT_SSL_VERIFYHOST, 0)
curl_easy_setopt(curl, #CURLOPT_HEADER, 0)
curl_easy_setopt(curl, #CURLOPT_FOLLOWLOCATION, 1)
curl_easy_setopt(curl, #CURLOPT_TIMEOUT, Timeout)
If Verbose
curl_easy_setopt(curl, #CURLOPT_VERBOSE, 1)
EndIf
curl_easy_setopt(curl, #CURLOPT_FAILONERROR, 1)
;curl_easy_setopt(curl, #CURLOPT_CONNECTTIMEOUT, 60)
If Len(ProxyURL$)
;curl_easy_setopt(curl, #CURLOPT_HTTPPROXYTUNNEL, #True)
If Len(ProxyPort$)
ProxyURL$ + ":" + ProxyPort$
EndIf
MyDebug(ProxyURL$, 8)
curl_easy_setopt(curl, #CURLOPT_PROXY, str2curl(ProxyURL$))
If Len(ProxyUser$)
If Len(ProxyPassword$)
ProxyUser$ + ":" + ProxyPassword$
EndIf
MyDebug(ProxyUser$, 8)
curl_easy_setopt(curl, #CURLOPT_PROXYUSERPWD, str2curl(ProxyUser$))
EndIf
EndIf
curl_easy_setopt(curl, #CURLOPT_WRITEDATA, FileHandle)
curl_easy_setopt(curl, #CURLOPT_WRITEFUNCTION, @ReceiveHTTPWriteToFileFunction())
res = curl_easy_perform(curl)
If res <> #CURLE_OK
curl_easy_getinfo(curl, #CURLINFO_HTTP_CODE, @respcode)
MyDebug("CURL : HTTP ERROR " + Str(respcode) , 8)
CloseFile(FileHandle)
curl_easy_cleanup(curl)
ProcedureReturn #False
EndIf
curl_easy_cleanup(curl)
Else
MyDebug("Can't init CURL", 8)
EndIf
CloseFile(FileHandle)
ProcedureReturn FileSize(DestFileName$)
EndIf
ProcedureReturn #False
EndProcedure
;- ***
Procedure TechnicalImagesCreation() Procedure TechnicalImagesCreation()
;"Loading" image ;"Loading" image
Protected LoadingText$ = "Loading" Protected LoadingText$ = "Loading"
@@ -513,6 +379,10 @@ Module PBMap
PBMap\Options\HDDCachePath = Value PBMap\Options\HDDCachePath = Value
Case "maxmemcache" Case "maxmemcache"
PBMap\Options\MaxMemCache = Val(Value) PBMap\Options\MaxMemCache = Val(Value)
Case "verbose"
SelBool(Verbose)
Case "warning"
SelBool(Warning)
Case "wheelmouserelative" Case "wheelmouserelative"
SelBool(WheelMouseRelative) SelBool(WheelMouseRelative)
Case "showdegrees" Case "showdegrees"
@@ -564,6 +434,8 @@ Module PBMap
PreferenceGroup("OPTIONS") PreferenceGroup("OPTIONS")
WritePreferenceInteger("WheelMouseRelative", \WheelMouseRelative) WritePreferenceInteger("WheelMouseRelative", \WheelMouseRelative)
WritePreferenceInteger("MaxMemCache", \MaxMemCache) WritePreferenceInteger("MaxMemCache", \MaxMemCache)
WritePreferenceInteger("Verbose", \Verbose)
WritePreferenceInteger("Warning", \Warning)
WritePreferenceInteger("ShowDegrees", \ShowDegrees) WritePreferenceInteger("ShowDegrees", \ShowDegrees)
WritePreferenceInteger("ShowDebugInfos", \ShowDebugInfos) WritePreferenceInteger("ShowDebugInfos", \ShowDebugInfos)
WritePreferenceInteger("ShowScale", \ShowScale) WritePreferenceInteger("ShowScale", \ShowScale)
@@ -615,10 +487,12 @@ Module PBMap
\DefaultOSMServer = ReadPreferenceString("DefaultOSMServer", "http://tile.openstreetmap.org/") \DefaultOSMServer = ReadPreferenceString("DefaultOSMServer", "http://tile.openstreetmap.org/")
PreferenceGroup("PATHS") PreferenceGroup("PATHS")
\HDDCachePath = ReadPreferenceString("TilesCachePath", GetTemporaryDirectory()) \HDDCachePath = ReadPreferenceString("TilesCachePath", GetTemporaryDirectory() + "PBMap" + slash)
PreferenceGroup("OPTIONS") PreferenceGroup("OPTIONS")
\WheelMouseRelative = ReadPreferenceInteger("WheelMouseRelative", #True) \WheelMouseRelative = ReadPreferenceInteger("WheelMouseRelative", #True)
\MaxMemCache = ReadPreferenceInteger("MaxMemCache", 20480) ;20 MiB, about 80 tiles in memory \MaxMemCache = ReadPreferenceInteger("MaxMemCache", 20480) ;20 MiB, about 80 tiles in memory
\Verbose = ReadPreferenceInteger("Verbose", #True)
\Warning = ReadPreferenceInteger("Warning", #False)
\ShowDegrees = ReadPreferenceInteger("ShowDegrees", #False) \ShowDegrees = ReadPreferenceInteger("ShowDegrees", #False)
\ShowDebugInfos = ReadPreferenceInteger("ShowDebugInfos", #False) \ShowDebugInfos = ReadPreferenceInteger("ShowDebugInfos", #False)
\ShowScale = ReadPreferenceInteger("ShowScale", #False) \ShowScale = ReadPreferenceInteger("ShowScale", #False)
@@ -641,14 +515,6 @@ Module PBMap
Procedure.i AddMapServerLayer(LayerName.s, Order.i, ServerURL.s = "http://tile.openstreetmap.org/", TileSize = 256, ZoomMin = 0, ZoomMax = 18) Procedure.i AddMapServerLayer(LayerName.s, Order.i, ServerURL.s = "http://tile.openstreetmap.org/", TileSize = 256, ZoomMin = 0, ZoomMax = 18)
Protected *Ptr = AddElement(PBMap\Layers()) Protected *Ptr = AddElement(PBMap\Layers())
Protected DirName.s = PBMap\Options\HDDCachePath + LayerName + "\"
If FileSize(DirName) <> -2
If CreateDirectory(DirName) = #False ; Creates a directory based on the layer name
Error("Can't create the following cache directory : " + DirName)
Else
MyDebug(DirName + " successfully created", 4)
EndIf
EndIf
If *Ptr If *Ptr
PBMap\Layers()\Name = LayerName PBMap\Layers()\Name = LayerName
PBMap\Layers()\Order = Order PBMap\Layers()\Order = Order
@@ -690,7 +556,6 @@ Module PBMap
Next Next
Delay(10) Delay(10)
Until MapSize(PBMap\MemCache\Images()) = 0 Until MapSize(PBMap\MemCache\Images()) = 0
curl_global_cleanup()
EndProcedure EndProcedure
Macro Min(a,b) Macro Min(a,b)
@@ -762,7 +627,7 @@ Module PBMap
;Lat Lon coordinates 2 pixel relative to the center of view ;Lat Lon coordinates 2 pixel relative to the center of view
Procedure LatLon2PixelRel(*Location.GeographicCoordinates, *Pixel.PixelCoordinates, Zoom) Procedure LatLon2PixelRel(*Location.GeographicCoordinates, *Pixel.PixelCoordinates, Zoom)
Protected tilemax = Pow(2.0, Zoom) * PBMap\TileSize Protected tilemax = Pow(2.0, Zoom) * PBMap\TileSize
Protected cx.d = PBMap\Drawing\CenterX Protected cx.d = PBMap\Drawing\RadiusX
Protected dpx.d = PBMap\PixelCoordinates\x Protected dpx.d = PBMap\PixelCoordinates\x
Protected LatRad.d = Radian(*Location\Latitude) Protected LatRad.d = Radian(*Location\Latitude)
Protected px.d = tilemax * (Mod( *Location\Longitude + 180.0, 360) / 360.0 ) Protected px.d = tilemax * (Mod( *Location\Longitude + 180.0, 360) / 360.0 )
@@ -781,7 +646,7 @@ Module PBMap
;Debug "c0" ;Debug "c0"
*Pixel\x = cx + (px - dpx) *Pixel\x = cx + (px - dpx)
EndIf EndIf
*Pixel\y = PBMap\Drawing\CenterY + (py - PBMap\PixelCoordinates\y) *Pixel\y = PBMap\Drawing\RadiusY + (py - PBMap\PixelCoordinates\y)
EndProcedure EndProcedure
; HaversineAlgorithm ; HaversineAlgorithm
@@ -818,21 +683,20 @@ Module PBMap
latRad = PBMap\GeographicCoordinates\Latitude*#PI/180; latRad = PBMap\GeographicCoordinates\Latitude*#PI/180;
mercN = Log(Tan((#PI/4)+(latRad/2))) mercN = Log(Tan((#PI/4)+(latRad/2)))
y2 = (mapHeight/2)-(mapWidth*mercN/(2*#PI)); y2 = (mapHeight/2)-(mapWidth*mercN/(2*#PI));
*Pixel\x=GadgetWidth(PBMap\Gadget)/2 - (x2-x1) *Pixel\x=PBMap\Drawing\RadiusX - (x2-x1)
*Pixel\y=GadgetHeight(PBMap\Gadget)/2 - (y2-y1) *Pixel\y=PBMap\Drawing\RadiusY - (y2-y1)
EndProcedure EndProcedure
Procedure IsInDrawingPixelBoundaries(*Drawing.DrawingParameters, *Position.GeographicCoordinates) Procedure IsInDrawingPixelBoundaries(*Drawing.DrawingParameters, *Position.GeographicCoordinates)
Protected Pixel.PixelCoordinates Protected Pixel.PixelCoordinates
LatLon2Pixel(*Position, @Pixel, PBMap\Zoom) LatLon2PixelRel(*Position, @Pixel, PBMap\Zoom)
If Pixel\x >= *Drawing\Bounds\BottomLeft\x And Pixel\y <= *Drawing\Bounds\BottomLeft\y And Pixel\x <= *Drawing\Bounds\TopRight\x And Pixel\y >= *Drawing\Bounds\TopRight\y If Pixel\x >= 0 And Pixel\y >= 0 And Pixel\x < *Drawing\RadiusX * 2 And Pixel\y < *Drawing\RadiusY * 2
ProcedureReturn #True ProcedureReturn #True
Else Else
ProcedureReturn #False ProcedureReturn #False
EndIf EndIf
EndProcedure EndProcedure
;TODO : rotation fix
Procedure IsInDrawingBoundaries(*Drawing.DrawingParameters, *Position.GeographicCoordinates) Procedure IsInDrawingBoundaries(*Drawing.DrawingParameters, *Position.GeographicCoordinates)
Protected Lat.d = *Position\Latitude, Lon.d = *Position\Longitude Protected Lat.d = *Position\Latitude, Lon.d = *Position\Longitude
Protected LatNW.d = *Drawing\Bounds\NorthWest\Latitude, LonNW.d = *Drawing\Bounds\NorthWest\Longitude Protected LatNW.d = *Drawing\Bounds\NorthWest\Latitude, LonNW.d = *Drawing\Bounds\NorthWest\Longitude
@@ -881,15 +745,16 @@ Module PBMap
Protected *Buffer Protected *Buffer
Protected nImage.i = -1 Protected nImage.i = -1
Protected FileSize.i, timg Protected FileSize.i, timg
FileSize = CurlReceiveHTTPToFile(TileURL, CacheFile, PBMap\Options\ProxyURL, PBMap\Options\ProxyPort, PBMap\Options\ProxyUser, PBMap\Options\ProxyPassword) HTTPProxy(PBMap\Options\ProxyURL + ":" + PBMap\Options\ProxyPort, PBMap\Options\ProxyUser, PBMap\Options\ProxyPassword)
FileSize = ReceiveHTTPFile(TileURL, CacheFile)
If FileSize > 0 If FileSize > 0
MyDebug("Loaded from web " + TileURL + " as CacheFile " + CacheFile, 3) MyDebug("Loaded from web " + TileURL + " as CacheFile " + CacheFile, 3)
nImage = GetTileFromHDD(CacheFile) nImage = GetTileFromHDD(CacheFile)
Else Else
MyDebug("Problem loading from web " + TileURL, 3) MyDebug("Problem loading from web " + TileURL, 3)
EndIf EndIf
; **** IMPORTANT NOTICE ; **** IMPORTANT NOTICE (please not remove)
; I'm (djes) now using Curl only, as this original catchimage/saveimage method is a double operation (uncompress/recompress PNG) ; I'm (djes) now using Curl (actually, just normal pb) only, as this original catchimage/saveimage method is a double operation (uncompress/recompress PNG)
; and is modifying the original PNG image which could lead to PNG error (Idle has spent hours debunking the 1 bit PNG bug) ; and is modifying the original PNG image which could lead to PNG error (Idle has spent hours debunking the 1 bit PNG bug)
; More than that, the original Purebasic Receive library is still not Proxy enabled. ; More than that, the original Purebasic Receive library is still not Proxy enabled.
; *Buffer = ReceiveHTTPMemory(TileURL) ;TODO to thread by using #PB_HTTP_Asynchronous ; *Buffer = ReceiveHTTPMemory(TileURL) ;TODO to thread by using #PB_HTTP_Asynchronous
@@ -922,7 +787,7 @@ Module PBMap
*Tile\RetryNb = 0 *Tile\RetryNb = 0
Else Else
MyDebug("Image key : " + *Tile\key + " web image not correctly loaded", 3) MyDebug("Image key : " + *Tile\key + " web image not correctly loaded", 3)
Delay(5000) Delay(2000)
*Tile\RetryNb - 1 *Tile\RetryNb - 1
EndIf EndIf
Until *Tile\RetryNb <= 0 Until *Tile\RetryNb <= 0
@@ -1016,8 +881,8 @@ Module PBMap
Protected x.i, y.i,kq.q Protected x.i, y.i,kq.q
Protected tx = Int(*Drawing\TileCoordinates\x) ;Don't forget the Int() ! Protected tx = Int(*Drawing\TileCoordinates\x) ;Don't forget the Int() !
Protected ty = Int(*Drawing\TileCoordinates\y) Protected ty = Int(*Drawing\TileCoordinates\y)
Protected nx = *Drawing\CenterX / PBMap\TileSize ;How many tiles around the point Protected nx = *Drawing\RadiusX / PBMap\TileSize ;How many tiles around the point
Protected ny = *Drawing\CenterY / PBMap\TileSize Protected ny = *Drawing\RadiusY / PBMap\TileSize
Protected px, py, *timg.ImgMemCach, tilex, tiley, key.s Protected px, py, *timg.ImgMemCach, tilex, tiley, key.s
Protected URL.s, CacheFile.s Protected URL.s, CacheFile.s
Protected tilemax = 1<<PBMap\Zoom Protected tilemax = 1<<PBMap\Zoom
@@ -1025,8 +890,8 @@ Module PBMap
MyDebug("Drawing tiles") MyDebug("Drawing tiles")
For y = - ny - 1 To ny + 1 For y = - ny - 1 To ny + 1
For x = - nx - 1 To nx + 1 For x = - nx - 1 To nx + 1
px = *Drawing\CenterX + x * PBMap\TileSize - *Drawing\DeltaX px = *Drawing\RadiusX + x * PBMap\TileSize - *Drawing\DeltaX
py = *Drawing\CenterY + y * PBMap\TileSize - *Drawing\DeltaY py = *Drawing\RadiusY + y * PBMap\TileSize - *Drawing\DeltaY
tilex = (tx + x) % tilemax tilex = (tx + x) % tilemax
If tilex < 0 If tilex < 0
tilex + tilemax tilex + tilemax
@@ -1036,23 +901,35 @@ Module PBMap
kq = (PBMap\Zoom << 8) | (tilex << 16) | (tiley << 36) kq = (PBMap\Zoom << 8) | (tilex << 16) | (tiley << 36)
key = PBMap\Layers()\Name + Str(kq) key = PBMap\Layers()\Name + Str(kq)
; Creates the cache tree based on the OSM tree+Layer : layer/zoom/x/y.png ; Creates the cache tree based on the OSM tree+Layer : layer/zoom/x/y.png
Protected DirName.s = PBMap\Options\HDDCachePath + PBMap\Layers()\Name
If FileSize(DirName) <> -2
If CreateDirectory(DirName) = #False ; Creates a directory based on the layer name
Error("Can't create the following layer directory : " + DirName)
Else
MyDebug(DirName + " successfully created", 4)
EndIf
EndIf
; Creates the sub-directory based on the zoom ; Creates the sub-directory based on the zoom
Protected DirName.s = PBMap\Options\HDDCachePath + PBMap\Layers()\Name + "\" + Str(PBMap\Zoom) DirName + slash + Str(PBMap\Zoom)
If FileSize(DirName) <> -2 If FileSize(DirName) <> -2
If CreateDirectory(DirName) = #False If CreateDirectory(DirName) = #False
Error("Can't create the following cache directory : " + DirName) Error("Can't create the following zoom directory : " + DirName)
Else
MyDebug(DirName + " successfully created", 4)
EndIf EndIf
EndIf EndIf
; Creates the sub-directory based on x ; Creates the sub-directory based on x
DirName.s + "\" + Str(tilex) DirName.s + slash + Str(tilex)
If FileSize(DirName) <> -2 If FileSize(DirName) <> -2
If CreateDirectory(DirName) = #False If CreateDirectory(DirName) = #False
Error("Can't create the following cache directory : " + DirName) Error("Can't create the following x directory : " + DirName)
Else
MyDebug(DirName + " successfully created", 4)
EndIf EndIf
EndIf EndIf
; Tile cache name based on y ; Tile cache name based on y
URL = PBMap\Layers()\ServerURL + Str(PBMap\Zoom) + "/" + Str(tilex) + "/" + Str(tiley) + ".png" URL = PBMap\Layers()\ServerURL + Str(PBMap\Zoom) + "/" + Str(tilex) + "/" + Str(tiley) + ".png"
CacheFile = DirName + "\" + Str(tiley) + ".png" CacheFile = DirName + slash + Str(tiley) + ".png"
*timg = GetTile(key, URL, CacheFile) *timg = GetTile(key, URL, CacheFile)
If *timg\nImage <> -1 If *timg\nImage <> -1
MovePathCursor(px, py) MovePathCursor(px, py)
@@ -1089,10 +966,10 @@ Module PBMap
Procedure DrawPointer(*Drawing.DrawingParameters) Procedure DrawPointer(*Drawing.DrawingParameters)
If PBMap\CallBackMainPointer > 0 If PBMap\CallBackMainPointer > 0
; @Procedure(X.i, Y.i) to DrawPointer (you must use VectorDrawing lib) ; @Procedure(X.i, Y.i) to DrawPointer (you must use VectorDrawing lib)
CallFunctionFast(PBMap\CallBackMainPointer, *Drawing\CenterX, *Drawing\CenterY) CallFunctionFast(PBMap\CallBackMainPointer, *Drawing\RadiusX, *Drawing\RadiusY)
Else Else
VectorSourceColor(RGBA($FF, 0, 0, $FF)) VectorSourceColor(RGBA($FF, 0, 0, $FF))
MovePathCursor(*Drawing\CenterX, *Drawing\CenterY) MovePathCursor(*Drawing\RadiusX, *Drawing\RadiusY)
AddPathLine(-8, -16, #PB_Path_Relative) AddPathLine(-8, -16, #PB_Path_Relative)
AddPathCircle(8, 0, 8, 180, 0, #PB_Path_Relative) AddPathCircle(8, 0, 8, 180, 0, #PB_Path_Relative)
AddPathLine(-8, 16, #PB_Path_Relative) AddPathLine(-8, 16, #PB_Path_Relative)
@@ -1126,21 +1003,27 @@ Module PBMap
Protected tx, ty, nx,ny,nx1,ny1,x,y,n,cx,dperpixel.d Protected tx, ty, nx,ny,nx1,ny1,x,y,n,cx,dperpixel.d
Protected pos1.PixelCoordinates,pos2.PixelCoordinates,Degrees1.GeographicCoordinates,degrees2.GeographicCoordinates Protected pos1.PixelCoordinates,pos2.PixelCoordinates,Degrees1.GeographicCoordinates,degrees2.GeographicCoordinates
Protected realx Protected realx
; tx = Int(*Drawing\TileCoordinates\x)
; ty = Int(*Drawing\TileCoordinates\y) ;TODO to find why it doesn't work
; tx = *Drawing\TileCoordinates\x
; ty = *Drawing\TileCoordinates\y
; nx = *Drawing\CenterX / PBMap\TileSize ;How many tiles around the point
; ny = *Drawing\CenterY / PBMap\TileSize
; *Drawing\Bounds\NorthWest\x = tx-nx-1
; *Drawing\Bounds\NorthWest\y = ty-ny-1
; *Drawing\Bounds\SouthEast\x = tx+nx+2
; *Drawing\Bounds\SouthEast\y = ty+ny+2
; Debug "------------------"
;TileXY2LatLon(*Drawing\Bounds\NorthWest, @Degrees1, PBMap\Zoom)
;TileXY2LatLon(*Drawing\Bounds\SouthEast, @Degrees2, PBMap\Zoom)
CopyStructure(*Drawing\Bounds\NorthWest, @Degrees1, GeographicCoordinates) CopyStructure(*Drawing\Bounds\NorthWest, @Degrees1, GeographicCoordinates)
Debug "----"
Debug Degrees1\Longitude-1
CopyStructure(*Drawing\Bounds\SouthEast, @Degrees2, GeographicCoordinates) CopyStructure(*Drawing\Bounds\SouthEast, @Degrees2, GeographicCoordinates)
;tx = Int(*Drawing\TileCoordinates\x)
;ty = Int(*Drawing\TileCoordinates\y)
tx = *Drawing\TileCoordinates\x
ty = *Drawing\TileCoordinates\y
nx = *Drawing\RadiusX / PBMap\TileSize ;How many tiles around the point
ny = *Drawing\RadiusY / PBMap\TileSize
*Drawing\Bounds\TopLeft\x = tx-nx-1
*Drawing\Bounds\TopLeft\y = ty-ny-1
*Drawing\Bounds\BottomRight\x = tx+nx+2
*Drawing\Bounds\BottomRight\y = ty+ny+2
TileXY2LatLon(*Drawing\Bounds\TopLeft, @Degrees1, PBMap\Zoom)
TileXY2LatLon(*Drawing\Bounds\BottomRight, @Degrees2, PBMap\Zoom)
Debug Degrees1\Longitude
;***
;ensure we stay positive for the drawing ;ensure we stay positive for the drawing
nx = Mod(Mod(Round(Degrees1\Longitude, #PB_Round_Down)-1, 360) + 360, 360) nx = Mod(Mod(Round(Degrees1\Longitude, #PB_Round_Down)-1, 360) + 360, 360)
ny = Round(Degrees1\Latitude, #PB_Round_Up) +1 ny = Round(Degrees1\Latitude, #PB_Round_Up) +1
@@ -1310,13 +1193,11 @@ Module PBMap
LatLon2PixelRel(@PBMap\TracksList()\Track(), @Pixel, PBMap\Zoom) LatLon2PixelRel(@PBMap\TracksList()\Track(), @Pixel, PBMap\Zoom)
If Int(km) <> memKm If Int(km) <> memKm
memKm = Int(km) memKm = Int(km)
RotateCoordinates(Pixel\x, Pixel\y, -PBMap\Angle)
If Int(km) = 0 If Int(km) = 0
DrawTrackPointerFirst(Pixel\x , Pixel\y, Int(km)) DrawTrackPointerFirst(Pixel\x , Pixel\y, Int(km))
Else Else
DrawTrackPointer(Pixel\x , Pixel\y, Int(km)) DrawTrackPointer(Pixel\x , Pixel\y, Int(km))
EndIf EndIf
RotateCoordinates(Pixel\x, Pixel\y, PBMap\Angle)
EndIf EndIf
Next Next
EndIf EndIf
@@ -1498,13 +1379,11 @@ Module PBMap
ForEach PBMap\Markers() ForEach PBMap\Markers()
If IsInDrawingPixelBoundaries(*Drawing, @PBMap\Markers()\GeographicCoordinates) If IsInDrawingPixelBoundaries(*Drawing, @PBMap\Markers()\GeographicCoordinates)
LatLon2PixelRel(@PBMap\Markers()\GeographicCoordinates, @Pixel, PBMap\Zoom) LatLon2PixelRel(@PBMap\Markers()\GeographicCoordinates, @Pixel, PBMap\Zoom)
RotateCoordinates(Pixel\x, Pixel\y, -PBMap\Angle)
If PBMap\Markers()\CallBackPointer > 0 If PBMap\Markers()\CallBackPointer > 0
CallFunctionFast(PBMap\Markers()\CallBackPointer, Pixel\x, Pixel\y, PBMap\Markers()\Focus, PBMap\Markers()\Selected) CallFunctionFast(PBMap\Markers()\CallBackPointer, Pixel\x, Pixel\y, PBMap\Markers()\Focus, PBMap\Markers()\Selected)
Else Else
DrawMarker(Pixel\x, Pixel\y, ListIndex(PBMap\Markers()), @PBMap\Markers()) DrawMarker(Pixel\x, Pixel\y, ListIndex(PBMap\Markers()), @PBMap\Markers())
EndIf EndIf
RotateCoordinates(Pixel\x, Pixel\y, PBMap\Angle)
EndIf EndIf
Next Next
EndProcedure EndProcedure
@@ -1513,9 +1392,9 @@ Module PBMap
; Display how many images in cache ; Display how many images in cache
VectorFont(FontID(PBMap\Font), 16) VectorFont(FontID(PBMap\Font), 16)
VectorSourceColor(RGBA(0, 0, 0, 80)) VectorSourceColor(RGBA(0, 0, 0, 80))
MovePathCursor(50,50) MovePathCursor(50, 50)
DrawVectorText(Str(MapSize(PBMap\MemCache\Images()))) DrawVectorText(Str(MapSize(PBMap\MemCache\Images())))
MovePathCursor(50,70) MovePathCursor(50, 70)
Protected ThreadCounter = 0 Protected ThreadCounter = 0
ForEach PBMap\MemCache\Images() ForEach PBMap\MemCache\Images()
If PBMap\MemCache\Images()\Tile <> 0 If PBMap\MemCache\Images()\Tile <> 0
@@ -1525,11 +1404,11 @@ Module PBMap
EndIf EndIf
Next Next
DrawVectorText(Str(ThreadCounter)) DrawVectorText(Str(ThreadCounter))
MovePathCursor(50,90) MovePathCursor(50, 90)
DrawVectorText(Str(PBMap\Zoom)) DrawVectorText(Str(PBMap\Zoom))
MovePathCursor(50,110) MovePathCursor(50, 110)
DrawVectorText(StrD(*Drawing\Bounds\NorthWest\Latitude) + "," + StrD(*Drawing\Bounds\NorthWest\Longitude)) DrawVectorText(StrD(*Drawing\Bounds\NorthWest\Latitude) + "," + StrD(*Drawing\Bounds\NorthWest\Longitude))
MovePathCursor(50,130) MovePathCursor(50, 130)
DrawVectorText(StrD(*Drawing\Bounds\SouthEast\Latitude) + "," + StrD(*Drawing\Bounds\SouthEast\Longitude)) DrawVectorText(StrD(*Drawing\Bounds\SouthEast\Latitude) + "," + StrD(*Drawing\Bounds\SouthEast\Longitude))
EndProcedure EndProcedure
@@ -1550,8 +1429,8 @@ Module PBMap
PBMap\Dirty = #False PBMap\Dirty = #False
PBMap\Redraw = #False PBMap\Redraw = #False
;*** Precalc some values ;*** Precalc some values
*Drawing\CenterX = GadgetWidth(PBMap\Gadget) / 2 *Drawing\RadiusX = GadgetWidth(PBMap\Gadget) / 2
*Drawing\CenterY = GadgetHeight(PBMap\Gadget) / 2 *Drawing\RadiusY = GadgetHeight(PBMap\Gadget) / 2
*Drawing\GeographicCoordinates\Latitude = PBMap\GeographicCoordinates\Latitude *Drawing\GeographicCoordinates\Latitude = PBMap\GeographicCoordinates\Latitude
*Drawing\GeographicCoordinates\Longitude = PBMap\GeographicCoordinates\Longitude *Drawing\GeographicCoordinates\Longitude = PBMap\GeographicCoordinates\Longitude
LatLon2TileXY(*Drawing\GeographicCoordinates, *Drawing\TileCoordinates, PBMap\Zoom) LatLon2TileXY(*Drawing\GeographicCoordinates, *Drawing\TileCoordinates, PBMap\Zoom)
@@ -1562,39 +1441,19 @@ Module PBMap
*Drawing\DeltaX = Px * ts - (Int(Px) * ts) ;Don't forget the Int() ! *Drawing\DeltaX = Px * ts - (Int(Px) * ts) ;Don't forget the Int() !
*Drawing\DeltaY = Py * ts - (Int(Py) * ts) *Drawing\DeltaY = Py * ts - (Int(Py) * ts)
;Drawing boundaries ;Drawing boundaries
; nx = *Drawing\CenterX / ts ;How many tiles around the point nx = *Drawing\RadiusX / ts ;How many tiles around the point
; ny = *Drawing\CenterY / ts ny = *Drawing\RadiusY / ts
; NW\x = Px - nx - 1 NW\x = Px - nx - 1
; NW\y = Py - ny - 1 NW\y = Py - ny - 1
; SE\x = Px + nx + 2 SE\x = Px + nx + 2
; SE\y = Py + ny + 2 SE\y = Py + ny + 2
; TileXY2LatLon(@NW, *Drawing\Bounds\NorthWest, PBMap\Zoom) TileXY2LatLon(@NW, *Drawing\Bounds\NorthWest, PBMap\Zoom)
; TileXY2LatLon(@SE, *Drawing\Bounds\SouthEast, PBMap\Zoom) TileXY2LatLon(@SE, *Drawing\Bounds\SouthEast, PBMap\Zoom)
;TODO : rotation fix
nx = PixelCenter\x - *Drawing\CenterX
ny = PixelCenter\y + *Drawing\CenterY
StartVectorDrawing(CanvasVectorOutput(PBMap\Gadget))
RotateCoordinates(PixelCenter\x, PixelCenter\y, PBMap\Angle)
*Drawing\Bounds\BottomLeft\x = ConvertCoordinateX(nx, ny, #PB_Coordinate_Device, #PB_Coordinate_User)
*Drawing\Bounds\BottomLeft\y = ConvertCoordinateY(nx, ny, #PB_Coordinate_Device, #PB_Coordinate_User)
nx + GadgetWidth(PBMap\Gadget)
ny - GadgetHeight(PBMap\Gadget)
*Drawing\Bounds\TopRight\x = ConvertCoordinateX(nx, ny, #PB_Coordinate_Device, #PB_Coordinate_User)
*Drawing\Bounds\TopRight\y = ConvertCoordinateY(nx, ny, #PB_Coordinate_Device, #PB_Coordinate_User)
StopVectorDrawing()
Pixel2LatLon(*Drawing\Bounds\BottomLeft, *Drawing\Bounds\SouthEast, PBMap\Zoom)
Pixel2LatLon(*Drawing\Bounds\TopRight, *Drawing\Bounds\NorthWest, PBMap\Zoom)
; Debug *Drawing\Bounds\NorthWest\Latitude
; Debug *Drawing\Bounds\NorthWest\Longitude
; Debug *Drawing\Bounds\SouthEast\Latitude
; Debug *Drawing\Bounds\SouthEast\Longitude
;*Drawing\Width = (SE\x / Pow(2, PBMap\Zoom) * 360.0) - (NW\x / Pow(2, PBMap\Zoom) * 360.0) ;Calculus without clipping ;*Drawing\Width = (SE\x / Pow(2, PBMap\Zoom) * 360.0) - (NW\x / Pow(2, PBMap\Zoom) * 360.0) ;Calculus without clipping
;*Drawing\Height = *Drawing\Bounds\NorthWest\Latitude - *Drawing\Bounds\SouthEast\Latitude ;*Drawing\Height = *Drawing\Bounds\NorthWest\Latitude - *Drawing\Bounds\SouthEast\Latitude
;*** ;***
; Main drawing stuff ; Main drawing stuff
StartVectorDrawing(CanvasVectorOutput(PBMap\Gadget)) StartVectorDrawing(CanvasVectorOutput(PBMap\Gadget))
;Main rotation
RotateCoordinates(*Drawing\CenterX, *Drawing\CenterY, PBMap\Angle)
;Clearscreen ;Clearscreen
VectorSourceColor(RGBA(150, 150, 150, 255)) VectorSourceColor(RGBA(150, 150, 150, 255))
FillVectorOutput() FillVectorOutput()
@@ -1603,16 +1462,15 @@ Module PBMap
ForEach PBMap\Layers() ForEach PBMap\Layers()
DrawTiles(*Drawing, ListIndex(PBMap\Layers())) DrawTiles(*Drawing, ListIndex(PBMap\Layers()))
Next Next
If PBMap\Options\ShowDegrees And PBMap\Zoom > 2
DrawDegrees(*Drawing, 192)
EndIf
If PBMap\Options\ShowTrack If PBMap\Options\ShowTrack
DrawTracks(*Drawing) DrawTracks(*Drawing)
EndIf EndIf
If PBMap\Options\ShowMarkers If PBMap\Options\ShowMarkers
DrawMarkers(*Drawing) DrawMarkers(*Drawing)
EndIf EndIf
ResetCoordinates() If PBMap\Options\ShowDegrees And PBMap\Zoom > 2
DrawDegrees(*Drawing, 192)
EndIf
If PBMap\Options\ShowPointer If PBMap\Options\ShowPointer
DrawPointer(*Drawing) DrawPointer(*Drawing)
EndIf EndIf
@@ -1632,27 +1490,27 @@ Module PBMap
EndProcedure EndProcedure
Procedure.d Pixel2Lon(x) Procedure.d Pixel2Lon(x)
Protected NewX.d = (PBMap\PixelCoordinates\x - GadgetWidth(PBMap\Gadget) / 2 + x) / PBMap\TileSize Protected NewX.d = (PBMap\PixelCoordinates\x - PBMap\Drawing\RadiusX + x) / PBMap\TileSize
Protected n.d = Pow(2.0, PBMap\Zoom) Protected n.d = Pow(2.0, PBMap\Zoom)
; double mod is to ensure the longitude to be in the range [-180;180[ ; double mod is to ensure the longitude to be in the range [-180;180[
ProcedureReturn Mod(Mod(NewX / n * 360.0, 360.0) + 360.0, 360.0) - 180 ProcedureReturn Mod(Mod(NewX / n * 360.0, 360.0) + 360.0, 360.0) - 180
EndProcedure EndProcedure
Procedure.d Pixel2Lat(y) Procedure.d Pixel2Lat(y)
Protected NewY.d = (PBMap\PixelCoordinates\y - GadgetHeight(PBMap\Gadget) / 2 + y) / PBMap\TileSize Protected NewY.d = (PBMap\PixelCoordinates\y - PBMap\Drawing\RadiusY + y) / PBMap\TileSize
Protected n.d = Pow(2.0, PBMap\Zoom) Protected n.d = Pow(2.0, PBMap\Zoom)
ProcedureReturn Degree(ATan(SinH(#PI * (1.0 - 2.0 * NewY / n)))) ProcedureReturn Degree(ATan(SinH(#PI * (1.0 - 2.0 * NewY / n))))
EndProcedure EndProcedure
Procedure.d MouseLongitude() Procedure.d MouseLongitude()
Protected MouseX.d = (PBMap\PixelCoordinates\x - GadgetWidth(PBMap\Gadget) / 2 + GetGadgetAttribute(PBMap\Gadget, #PB_Canvas_MouseX)) / PBMap\TileSize Protected MouseX.d = (PBMap\PixelCoordinates\x - PBMap\Drawing\RadiusX + GetGadgetAttribute(PBMap\Gadget, #PB_Canvas_MouseX)) / PBMap\TileSize
Protected n.d = Pow(2.0, PBMap\Zoom) Protected n.d = Pow(2.0, PBMap\Zoom)
; double mod is to ensure the longitude to be in the range [-180;180[ ; double mod is to ensure the longitude to be in the range [-180;180[
ProcedureReturn Mod(Mod(MouseX / n * 360.0, 360.0) + 360.0, 360.0) - 180 ProcedureReturn Mod(Mod(MouseX / n * 360.0, 360.0) + 360.0, 360.0) - 180
EndProcedure EndProcedure
Procedure.d MouseLatitude() Procedure.d MouseLatitude()
Protected MouseY.d = (PBMap\PixelCoordinates\y - GadgetHeight(PBMap\Gadget) / 2 + GetGadgetAttribute(PBMap\Gadget, #PB_Canvas_MouseY)) / PBMap\TileSize Protected MouseY.d = (PBMap\PixelCoordinates\y - PBMap\Drawing\RadiusY + GetGadgetAttribute(PBMap\Gadget, #PB_Canvas_MouseY)) / PBMap\TileSize
Protected n.d = Pow(2.0, PBMap\Zoom) Protected n.d = Pow(2.0, PBMap\Zoom)
ProcedureReturn Degree(ATan(SinH(#PI * (1.0 - 2.0 * MouseY / n)))) ProcedureReturn Degree(ATan(SinH(#PI * (1.0 - 2.0 * MouseY / n))))
EndProcedure EndProcedure
@@ -1694,17 +1552,17 @@ Module PBMap
Procedure ZoomToArea(MinY.d, MaxY.d, MinX.d, MaxX.d) Procedure ZoomToArea(MinY.d, MaxY.d, MinX.d, MaxX.d)
;Source => http://gis.stackexchange.com/questions/19632/how-to-calculate-the-optimal-zoom-level-to-display-two-or-more-points-on-a-map ;Source => http://gis.stackexchange.com/questions/19632/how-to-calculate-the-optimal-zoom-level-to-display-two-or-more-points-on-a-map
;bounding box in long/lat coords (x=long, y=lat) ;bounding box in long/lat coords (x=long, y=lat)
Protected DeltaX.d=MaxX-MinX ;assumption ! In original code DeltaX have no source Protected DeltaX.d = MaxX - MinX ;assumption ! In original code DeltaX have no source
Protected centerX.d=MinX+DeltaX/2 ; assumption ! In original code CenterX have no source Protected centerX.d = MinX + DeltaX / 2 ; assumption ! In original code CenterX have no source
Protected paddingFactor.f= 1.2 ;paddingFactor: this can be used to get the "120%" effect ThomM refers to. Value of 1.2 would get you the 120%. Protected paddingFactor.f= 1.2 ;paddingFactor: this can be used to get the "120%" effect ThomM refers to. Value of 1.2 would get you the 120%.
Protected ry1.d = Log((Sin(Radian(MinY)) + 1) / Cos(Radian(MinY))) Protected ry1.d = Log((Sin(Radian(MinY)) + 1) / Cos(Radian(MinY)))
Protected ry2.d = Log((Sin(Radian(MaxY)) + 1) / Cos(Radian(MaxY))) Protected ry2.d = Log((Sin(Radian(MaxY)) + 1) / Cos(Radian(MaxY)))
Protected ryc.d = (ry1 + ry2) / 2 Protected ryc.d = (ry1 + ry2) / 2
Protected centerY.d = Degree(ATan(SinH(ryc))) Protected centerY.d = Degree(ATan(SinH(ryc)))
Protected resolutionHorizontal.d = DeltaX / GadgetWidth(PBMap\Gadget) Protected resolutionHorizontal.d = DeltaX / (PBMap\Drawing\RadiusX * 2)
Protected vy0.d = Log(Tan(#PI*(0.25 + centerY/360))); Protected vy0.d = Log(Tan(#PI*(0.25 + centerY/360)));
Protected vy1.d = Log(Tan(#PI*(0.25 + MaxY/360))) ; Protected vy1.d = Log(Tan(#PI*(0.25 + MaxY/360))) ;
Protected viewHeightHalf.d = GadgetHeight(PBMap\Gadget)/2; Protected viewHeightHalf.d = PBMap\Drawing\RadiusY ;
Protected zoomFactorPowered.d = viewHeightHalf / (40.7436654315252*(vy1 - vy0)) Protected zoomFactorPowered.d = viewHeightHalf / (40.7436654315252*(vy1 - vy0))
Protected resolutionVertical.d = 360.0 / (zoomFactorPowered * PBMap\TileSize) Protected resolutionVertical.d = 360.0 / (zoomFactorPowered * PBMap\TileSize)
If resolutionHorizontal<>0 And resolutionVertical<>0 If resolutionHorizontal<>0 And resolutionVertical<>0
@@ -1825,22 +1683,14 @@ Module PBMap
;Zoom on x, y position relative to the canvas gadget ;Zoom on x, y position relative to the canvas gadget
Procedure ZoomOnPixelRel(x, y, zoom) Procedure ZoomOnPixelRel(x, y, zoom)
Protected CenterX = GadgetWidth(PBMap\Gadget) / 2 ZoomOnPixel(x - PBMap\Drawing\RadiusX, y - PBMap\Drawing\RadiusY, zoom)
Protected CenterY = GadgetHeight(PBMap\Gadget) / 2
x - CenterX
y - CenterY
ZoomOnPixel(x, y, zoom)
EndProcedure EndProcedure
;Go to x, y position relative to the canvas gadget left up ;Go to x, y position relative to the canvas gadget left up
Procedure GotoPixelRel(x, y) Procedure GotoPixelRel(x, y)
Protected CenterX = GadgetWidth(PBMap\Gadget) / 2
Protected CenterY = GadgetHeight(PBMap\Gadget) / 2
x - CenterX
y - CenterY
LatLon2Pixel(@PBMap\GeographicCoordinates, @PBMap\PixelCoordinates, PBMap\Zoom) LatLon2Pixel(@PBMap\GeographicCoordinates, @PBMap\PixelCoordinates, PBMap\Zoom)
PBMap\PixelCoordinates\x + x PBMap\PixelCoordinates\x + x - PBMap\Drawing\RadiusX
PBMap\PixelCoordinates\y + y PBMap\PixelCoordinates\y + y - PBMap\Drawing\RadiusY
Pixel2LatLon(@PBMap\PixelCoordinates, @PBMap\GeographicCoordinates, PBMap\Zoom) Pixel2LatLon(@PBMap\PixelCoordinates, @PBMap\GeographicCoordinates, PBMap\Zoom)
; Start drawing ; Start drawing
PBMap\Redraw = #True PBMap\Redraw = #True
@@ -1880,16 +1730,17 @@ Module PBMap
EndProcedure EndProcedure
Procedure NominatimGeoLocationQuery(Address.s, *ReturnPosition.GeographicCoordinates = 0) Procedure NominatimGeoLocationQuery(Address.s, *ReturnPosition.GeographicCoordinates = 0)
Protected Size.i
Protected Query.s = "http://nominatim.openstreetmap.org/search/" + Protected Query.s = "http://nominatim.openstreetmap.org/search/" +
URLEncoder(Address) + URLEncoder(Address) +
;"Unter%20den%20Linden%201%20Berlin" +
"?format=json&addressdetails=0&polygon=0&limit=1" "?format=json&addressdetails=0&polygon=0&limit=1"
Protected JSONFileName.s = PBMap\Options\HDDCachePath + "nominatimresponse.json" Protected JSONFileName.s = PBMap\Options\HDDCachePath + "nominatimresponse.json"
; Protected *Buffer = CurlReceiveHTTPToMemory("http://nominatim.openstreetmap.org/search/Unter%20den%20Linden%201%20Berlin?format=json&addressdetails=1&limit=1&polygon_svg=1", PBMap\Options\ProxyURL, PBMap\Options\ProxyPort, PBMap\Options\ProxyUser, PBMap\Options\ProxyPassword) ; Protected *Buffer = CurlReceiveHTTPToMemory("http://nominatim.openstreetmap.org/search/Unter%20den%20Linden%201%20Berlin?format=json&addressdetails=1&limit=1&polygon_svg=1", PBMap\Options\ProxyURL, PBMap\Options\ProxyPort, PBMap\Options\ProxyUser, PBMap\Options\ProxyPassword)
; Debug *Buffer ; Debug *Buffer
; Debug MemorySize(*Buffer) ; Debug MemorySize(*Buffer)
; Protected JSon.s = PeekS(*Buffer, MemorySize(*Buffer), #PB_UTF8) ; Protected JSon.s = PeekS(*Buffer, MemorySize(*Buffer), #PB_UTF8)
Protected Size.i = CurlReceiveHTTPToFile(Query, JSONFileName, PBMap\Options\ProxyURL, PBMap\Options\ProxyPort, PBMap\Options\ProxyUser, PBMap\Options\ProxyPassword) HTTPProxy(PBMap\Options\ProxyURL + ":" + PBMap\Options\ProxyPort, PBMap\Options\ProxyUser, PBMap\Options\ProxyPassword)
Size = ReceiveHTTPFile(Query, JSONFileName)
If LoadJSON(0, JSONFileName) = 0 If LoadJSON(0, JSONFileName) = 0
;Demivec's code ;Demivec's code
MyDebug( JSONErrorMessage() + " at position " + MyDebug( JSONErrorMessage() + " at position " +
@@ -1916,6 +1767,67 @@ Module PBMap
EndIf EndIf
EndProcedure EndProcedure
;(c) ts-soft http://www.purebasic.fr/english/viewtopic.php?f=12&t=58657&hilit=createdirectory&view=unread#unread
CompilerSelect #PB_Compiler_OS
CompilerCase #PB_OS_Windows
#FILE_ATTRIBUTE_DEVICE = 64 ;(0x40)
#FILE_ATTRIBUTE_INTEGRITY_STREAM = 32768 ;(0x8000)
#FILE_ATTRIBUTE_NOT_CONTENT_INDEXED = 8192;(0x2000)
#FILE_ATTRIBUTE_NO_SCRUB_DATA = 131072;(0x20000)
#FILE_ATTRIBUTE_VIRTUAL = 65536;(0x10000)
#FILE_ATTRIBUTE_DONTSETFLAGS = ~(#FILE_ATTRIBUTE_DIRECTORY|
#FILE_ATTRIBUTE_SPARSE_FILE|
#FILE_ATTRIBUTE_OFFLINE|
#FILE_ATTRIBUTE_NOT_CONTENT_INDEXED|
#FILE_ATTRIBUTE_VIRTUAL|
0)
Macro SetFileAttributesEx(Name, Attribs)
SetFileAttributes(Name, Attribs & #FILE_ATTRIBUTE_DONTSETFLAGS)
EndMacro
CompilerDefault
Macro SetFileAttributesEx(Name, Attribs)
SetFileAttributes(Name, Attribs)
EndMacro
CompilerEndSelect
Procedure CreateDirectoryEx(DirectoryName.s, FileAttribute = #PB_Default)
Protected i, c, tmp.s
If Right(DirectoryName, 1) = slash
DirectoryName = Left(DirectoryName, Len(DirectoryName) -1)
EndIf
c = CountString(DirectoryName, slash) + 1
For i = 1 To c
tmp + StringField(DirectoryName, i, slash)
If FileSize(tmp) <> -2
CreateDirectory(tmp)
EndIf
tmp + slash
Next
If FileAttribute <> #PB_Default
SetFileAttributesEx(DirectoryName, FileAttribute)
EndIf
If FileSize(DirectoryName) = -2
ProcedureReturn #True
EndIf
EndProcedure
Procedure.i ClearDiskCache()
If PBMap\Options\Warning
Protected Result.i = MessageRequester("Warning", "You will clear all cache content in " + PBMap\Options\HDDCachePath + ". Are you sure ?",#PB_MessageRequester_YesNo)
If Result = #PB_MessageRequester_No ; Quit if "no" selected
ProcedureReturn #False
EndIf
EndIf
If DeleteDirectory(PBMap\Options\HDDCachePath, "", #PB_FileSystem_Recursive)
MyDebug("Cache in : " + PBMap\Options\HDDCachePath + " cleared")
CreateDirectoryEx(PBMap\Options\HDDCachePath)
ProcedureReturn #True
Else
MyDebug("Can't clear cache in " + PBMap\Options\HDDCachePath)
ProcedureReturn #False
EndIf
EndProcedure
Procedure CanvasEvents() Procedure CanvasEvents()
Protected CanvasMouseX.d, CanvasMouseY.d, MouseX.d, MouseY.d Protected CanvasMouseX.d, CanvasMouseY.d, MouseX.d, MouseY.d
Protected MarkerCoords.PixelCoordinates, *Tile.Tile, MapWidth = Pow(2, PBMap\Zoom) * PBMap\TileSize Protected MarkerCoords.PixelCoordinates, *Tile.Tile, MapWidth = Pow(2, PBMap\Zoom) * PBMap\TileSize
@@ -1923,17 +1835,18 @@ Module PBMap
Protected Pixel.PixelCoordinates Protected Pixel.PixelCoordinates
Static CtrlKey Static CtrlKey
PBMap\Moving = #False PBMap\Moving = #False
MouseX = GetGadgetAttribute(PBMap\Gadget, #PB_Canvas_MouseX) - PBMap\Drawing\CenterX CanvasMouseX = GetGadgetAttribute(PBMap\Gadget, #PB_Canvas_MouseX) - PBMap\Drawing\RadiusX
MouseY = GetGadgetAttribute(PBMap\Gadget, #PB_Canvas_MouseY) - PBMap\Drawing\CenterY CanvasMouseY = GetGadgetAttribute(PBMap\Gadget, #PB_Canvas_MouseY) - PBMap\Drawing\RadiusY
StartVectorDrawing(CanvasVectorOutput(PBMap\Gadget)) ; rotation wip
RotateCoordinates(0, 0, PBMap\Angle) ; StartVectorDrawing(CanvasVectorOutput(PBMap\Gadget))
CanvasMouseX = ConvertCoordinateX(MouseX, MouseY, #PB_Coordinate_Device, #PB_Coordinate_User) ; RotateCoordinates(0, 0, PBMap\Angle)
CanvasMouseY = ConvertCoordinateY(MouseX, MouseY, #PB_Coordinate_Device, #PB_Coordinate_User) ; CanvasMouseX = ConvertCoordinateX(MouseX, MouseY, #PB_Coordinate_Device, #PB_Coordinate_User)
StopVectorDrawing() ; CanvasMouseY = ConvertCoordinateY(MouseX, MouseY, #PB_Coordinate_Device, #PB_Coordinate_User)
; StopVectorDrawing()
Select EventType() Select EventType()
Case #PB_EventType_Focus Case #PB_EventType_Focus
PBMap\Drawing\CenterX = GadgetWidth(PBMap\Gadget) / 2 PBMap\Drawing\RadiusX = GadgetWidth(PBMap\Gadget) / 2
PBMap\Drawing\CenterY = GadgetHeight(PBMap\Gadget) / 2 PBMap\Drawing\RadiusY = GadgetHeight(PBMap\Gadget) / 2
Case #PB_EventType_KeyUp Case #PB_EventType_KeyUp
Select GetGadgetAttribute(PBMap\Gadget, #PB_Canvas_Key) Select GetGadgetAttribute(PBMap\Gadget, #PB_Canvas_Key)
Case #PB_Shortcut_Delete Case #PB_Shortcut_Delete
@@ -2101,7 +2014,6 @@ Module PBMap
If ListSize(\Track()) > 0 If ListSize(\Track()) > 0
If \Visible If \Visible
StartVectorDrawing(CanvasVectorOutput(PBMap\Gadget)) StartVectorDrawing(CanvasVectorOutput(PBMap\Gadget))
RotateCoordinates(PBMap\Drawing\CenterX, PBMap\Drawing\CenterY, PBMap\Angle)
;Simulate tracks drawing ;Simulate tracks drawing
ForEach \Track() ForEach \Track()
LatLon2Pixel(@PBMap\TracksList()\Track(), @Pixel, PBMap\Zoom) LatLon2Pixel(@PBMap\TracksList()\Track(), @Pixel, PBMap\Zoom)
@@ -2148,8 +2060,8 @@ Module PBMap
EndSelect EndSelect
EndProcedure EndProcedure
; Redraws at regular intervals
Procedure TimerEvents() Procedure TimerEvents()
;Redraw at regular intervals
If EventTimer() = PBMap\Timer And (PBMap\Redraw Or PBMap\Dirty) If EventTimer() = PBMap\Timer And (PBMap\Redraw Or PBMap\Dirty)
Drawing() Drawing()
EndIf EndIf
@@ -2161,8 +2073,8 @@ Module PBMap
BindGadgetEvent(PBMap\Gadget, @CanvasEvents()) BindGadgetEvent(PBMap\Gadget, @CanvasEvents())
AddWindowTimer(PBMap\Window, PBMap\Timer, PBMap\Options\TimerInterval) AddWindowTimer(PBMap\Window, PBMap\Timer, PBMap\Options\TimerInterval)
BindEvent(#PB_Event_Timer, @TimerEvents()) BindEvent(#PB_Event_Timer, @TimerEvents())
PBMap\Drawing\CenterX = GadgetWidth(PBMap\Gadget) / 2 PBMap\Drawing\RadiusX = GadgetWidth(PBMap\Gadget) / 2
PBMap\Drawing\CenterX = GadgetHeight(PBMap\Gadget) / 2 PBMap\Drawing\RadiusY = GadgetHeight(PBMap\Gadget) / 2
EndProcedure EndProcedure
; Creates a canvas and attach our map ; Creates a canvas and attach our map
@@ -2178,9 +2090,6 @@ Module PBMap
Procedure InitPBMap(Window) Procedure InitPBMap(Window)
Protected Result.i Protected Result.i
If Verbose
OpenConsole()
EndIf
PBMap\ZoomMin = 0 PBMap\ZoomMin = 0
PBMap\ZoomMax = 18 PBMap\ZoomMax = 18
PBMap\MoveStartingPoint\x = - 1 PBMap\MoveStartingPoint\x = - 1
@@ -2192,17 +2101,25 @@ Module PBMap
PBMap\Timer = 1 PBMap\Timer = 1
PBMap\Mode = #MODE_DEFAULT PBMap\Mode = #MODE_DEFAULT
LoadOptions() LoadOptions()
If PBMap\Options\Verbose
OpenConsole()
EndIf
CreateDirectoryEx(PBMap\Options\HDDCachePath)
If PBMap\Options\DefaultOSMServer <> "" If PBMap\Options\DefaultOSMServer <> ""
AddMapServerLayer("OSM", 1, PBMap\Options\DefaultOSMServer) AddMapServerLayer("OSM", 1, PBMap\Options\DefaultOSMServer)
EndIf EndIf
curl_global_init(#CURL_GLOBAL_WIN32)
TechnicalImagesCreation() TechnicalImagesCreation()
SetLocation(0, 0) SetLocation(0, 0)
EndProcedure EndProcedure
EndModule EndModule
;-**** Example of application **** ;****************************************************************
;
;- Example of application
;
;****************************************************************
CompilerIf #PB_Compiler_IsMainFile CompilerIf #PB_Compiler_IsMainFile
InitNetwork() InitNetwork()
@@ -2213,8 +2130,8 @@ CompilerIf #PB_Compiler_IsMainFile
#Gdt_Right #Gdt_Right
#Gdt_Up #Gdt_Up
#Gdt_Down #Gdt_Down
#Gdt_RotateLeft ;#Gdt_RotateLeft
#Gdt_RotateRight ;#Gdt_RotateRight
#Button_4 #Button_4
#Button_5 #Button_5
#Combo_0 #Combo_0
@@ -2230,6 +2147,7 @@ CompilerIf #PB_Compiler_IsMainFile
#Gdt_AddOpenseaMap #Gdt_AddOpenseaMap
#Gdt_Degrees #Gdt_Degrees
#Gdt_EditMode #Gdt_EditMode
#Gdt_ClearDiskCache
#TextGeoLocationQuery #TextGeoLocationQuery
#StringGeoLocationQuery #StringGeoLocationQuery
EndEnumeration EndEnumeration
@@ -2282,8 +2200,8 @@ CompilerIf #PB_Compiler_IsMainFile
ResizeGadget(#Text_1,WindowWidth(#Window_0)-170,#PB_Ignore,#PB_Ignore,#PB_Ignore) ResizeGadget(#Text_1,WindowWidth(#Window_0)-170,#PB_Ignore,#PB_Ignore,#PB_Ignore)
ResizeGadget(#Gdt_Left, WindowWidth(#Window_0) - 150 ,#PB_Ignore,#PB_Ignore,#PB_Ignore) ResizeGadget(#Gdt_Left, WindowWidth(#Window_0) - 150 ,#PB_Ignore,#PB_Ignore,#PB_Ignore)
ResizeGadget(#Gdt_Right,WindowWidth(#Window_0) - 90 ,#PB_Ignore,#PB_Ignore,#PB_Ignore) ResizeGadget(#Gdt_Right,WindowWidth(#Window_0) - 90 ,#PB_Ignore,#PB_Ignore,#PB_Ignore)
ResizeGadget(#Gdt_RotateLeft, WindowWidth(#Window_0) - 150 ,#PB_Ignore,#PB_Ignore,#PB_Ignore) ;ResizeGadget(#Gdt_RotateLeft, WindowWidth(#Window_0) - 150 ,#PB_Ignore,#PB_Ignore,#PB_Ignore)
ResizeGadget(#Gdt_RotateRight,WindowWidth(#Window_0) - 90 ,#PB_Ignore,#PB_Ignore,#PB_Ignore) ;ResizeGadget(#Gdt_RotateRight,WindowWidth(#Window_0) - 90 ,#PB_Ignore,#PB_Ignore,#PB_Ignore)
ResizeGadget(#Gdt_Up, WindowWidth(#Window_0) - 120 ,#PB_Ignore,#PB_Ignore,#PB_Ignore) ResizeGadget(#Gdt_Up, WindowWidth(#Window_0) - 120 ,#PB_Ignore,#PB_Ignore,#PB_Ignore)
ResizeGadget(#Gdt_Down, WindowWidth(#Window_0) - 120 ,#PB_Ignore,#PB_Ignore,#PB_Ignore) ResizeGadget(#Gdt_Down, WindowWidth(#Window_0) - 120 ,#PB_Ignore,#PB_Ignore,#PB_Ignore)
ResizeGadget(#Text_2,WindowWidth(#Window_0)-170,#PB_Ignore,#PB_Ignore,#PB_Ignore) ResizeGadget(#Text_2,WindowWidth(#Window_0)-170,#PB_Ignore,#PB_Ignore,#PB_Ignore)
@@ -2298,6 +2216,7 @@ CompilerIf #PB_Compiler_IsMainFile
ResizeGadget(#Gdt_AddOpenseaMap,WindowWidth(#Window_0)-170,#PB_Ignore,#PB_Ignore,#PB_Ignore) ResizeGadget(#Gdt_AddOpenseaMap,WindowWidth(#Window_0)-170,#PB_Ignore,#PB_Ignore,#PB_Ignore)
ResizeGadget(#Gdt_Degrees,WindowWidth(#Window_0)-170,#PB_Ignore,#PB_Ignore,#PB_Ignore) ResizeGadget(#Gdt_Degrees,WindowWidth(#Window_0)-170,#PB_Ignore,#PB_Ignore,#PB_Ignore)
ResizeGadget(#Gdt_EditMode,WindowWidth(#Window_0)-170,#PB_Ignore,#PB_Ignore,#PB_Ignore) ResizeGadget(#Gdt_EditMode,WindowWidth(#Window_0)-170,#PB_Ignore,#PB_Ignore,#PB_Ignore)
ResizeGadget(#Gdt_ClearDiskCache,WindowWidth(#Window_0)-170,#PB_Ignore,#PB_Ignore,#PB_Ignore)
ResizeGadget(#TextGeoLocationQuery,WindowWidth(#Window_0)-170,#PB_Ignore,#PB_Ignore,#PB_Ignore) ResizeGadget(#TextGeoLocationQuery,WindowWidth(#Window_0)-170,#PB_Ignore,#PB_Ignore,#PB_Ignore)
ResizeGadget(#StringGeoLocationQuery,WindowWidth(#Window_0)-170,#PB_Ignore,#PB_Ignore,#PB_Ignore) ResizeGadget(#StringGeoLocationQuery,WindowWidth(#Window_0)-170,#PB_Ignore,#PB_Ignore,#PB_Ignore)
PBMap::Refresh() PBMap::Refresh()
@@ -2311,8 +2230,8 @@ CompilerIf #PB_Compiler_IsMainFile
LoadFont(2, "Arial", 8) LoadFont(2, "Arial", 8)
TextGadget(#Text_1, 530, 50, 60, 15, "Movements") TextGadget(#Text_1, 530, 50, 60, 15, "Movements")
ButtonGadget(#Gdt_RotateLeft, 550, 070, 30, 30, "LRot") : SetGadgetFont(#Gdt_RotateLeft, FontID(2)) ;ButtonGadget(#Gdt_RotateLeft, 550, 070, 30, 30, "LRot") : SetGadgetFont(#Gdt_RotateLeft, FontID(2))
ButtonGadget(#Gdt_RotateRight, 610, 070, 30, 30, "RRot") : SetGadgetFont(#Gdt_RotateRight, FontID(2)) ;ButtonGadget(#Gdt_RotateRight, 610, 070, 30, 30, "RRot") : SetGadgetFont(#Gdt_RotateRight, FontID(2))
ButtonGadget(#Gdt_Left, 550, 100, 30, 30, Chr($25C4)) : SetGadgetFont(#Gdt_Left, FontID(0)) ButtonGadget(#Gdt_Left, 550, 100, 30, 30, Chr($25C4)) : SetGadgetFont(#Gdt_Left, FontID(0))
ButtonGadget(#Gdt_Right, 610, 100, 30, 30, Chr($25BA)) : SetGadgetFont(#Gdt_Right, FontID(0)) ButtonGadget(#Gdt_Right, 610, 100, 30, 30, Chr($25BA)) : SetGadgetFont(#Gdt_Right, FontID(0))
ButtonGadget(#Gdt_Up, 580, 070, 30, 30, Chr($25B2)) : SetGadgetFont(#Gdt_Up, FontID(0)) ButtonGadget(#Gdt_Up, 580, 070, 30, 30, Chr($25B2)) : SetGadgetFont(#Gdt_Up, FontID(0))
@@ -2329,8 +2248,9 @@ CompilerIf #PB_Compiler_IsMainFile
ButtonGadget(#Gdt_AddOpenseaMap, 530, 340, 150, 30, "Show/Hide OpenSeaMap", #PB_Button_Toggle) ButtonGadget(#Gdt_AddOpenseaMap, 530, 340, 150, 30, "Show/Hide OpenSeaMap", #PB_Button_Toggle)
ButtonGadget(#Gdt_Degrees, 530, 370, 150, 30, "Show/Hide Degrees", #PB_Button_Toggle) ButtonGadget(#Gdt_Degrees, 530, 370, 150, 30, "Show/Hide Degrees", #PB_Button_Toggle)
ButtonGadget(#Gdt_EditMode, 530, 400, 150, 30, "Edit mode ON/OFF", #PB_Button_Toggle) ButtonGadget(#Gdt_EditMode, 530, 400, 150, 30, "Edit mode ON/OFF", #PB_Button_Toggle)
TextGadget(#TextGeoLocationQuery, 530, 435, 150, 15, "Enter an address") ButtonGadget(#Gdt_ClearDiskCache, 530, 430, 150, 30, "Clear disk cache", #PB_Button_Toggle)
StringGadget(#StringGeoLocationQuery, 530, 450, 150, 20, "") TextGadget(#TextGeoLocationQuery, 530, 465, 150, 15, "Enter an address")
StringGadget(#StringGeoLocationQuery, 530, 480, 150, 20, "")
SetActiveGadget(#StringGeoLocationQuery) SetActiveGadget(#StringGeoLocationQuery)
AddKeyboardShortcut(#Window_0, #PB_Shortcut_Return, #MenuEventGeoLocationStringEnter) AddKeyboardShortcut(#Window_0, #PB_Shortcut_Return, #MenuEventGeoLocationStringEnter)
;*** TODO : code to remove when the SetActiveGadget(-1) will be fixed ;*** TODO : code to remove when the SetActiveGadget(-1) will be fixed
@@ -2351,6 +2271,7 @@ CompilerIf #PB_Compiler_IsMainFile
PBMap::SetOption("ShowDegrees", "0") : Degrees = 0 PBMap::SetOption("ShowDegrees", "0") : Degrees = 0
PBMap::SetOption("ShowDebugInfos", "0") PBMap::SetOption("ShowDebugInfos", "0")
PBMap::SetOption("ShowScale", "1") PBMap::SetOption("ShowScale", "1")
PBMap::SetOption("Warning", "1")
PBMap::SetOption("ShowMarkersLegend", "1") PBMap::SetOption("ShowMarkersLegend", "1")
PBMap::SetOption("ShowTrackKms", "1") PBMap::SetOption("ShowTrackKms", "1")
PBMap::SetOption("ColourFocus", "$FFFF00AA") PBMap::SetOption("ColourFocus", "$FFFF00AA")
@@ -2376,12 +2297,12 @@ CompilerIf #PB_Compiler_IsMainFile
PBMap::SetLocation(0, 10* -360 / Pow(2, PBMap::GetZoom() + 8), 0, #PB_Relative) PBMap::SetLocation(0, 10* -360 / Pow(2, PBMap::GetZoom() + 8), 0, #PB_Relative)
Case #Gdt_Right Case #Gdt_Right
PBMap::SetLocation(0, 10* 360 / Pow(2, PBMap::GetZoom() + 8), 0, #PB_Relative) PBMap::SetLocation(0, 10* 360 / Pow(2, PBMap::GetZoom() + 8), 0, #PB_Relative)
Case #Gdt_RotateLeft ;Case #Gdt_RotateLeft
PBMAP::SetAngle(-5,#PB_Relative) ; PBMAP::SetAngle(-5,#PB_Relative)
PBMap::Refresh() ; PBMap::Refresh()
Case #Gdt_RotateRight ;Case #Gdt_RotateRight
PBMAP::SetAngle(5,#PB_Relative) ; PBMAP::SetAngle(5,#PB_Relative)
PBMap::Refresh() ; PBMap::Refresh()
Case #Button_4 Case #Button_4
PBMap::SetZoom(1) PBMap::SetZoom(1)
Case #Button_5 Case #Button_5
@@ -2421,6 +2342,8 @@ CompilerIf #PB_Compiler_IsMainFile
PBMap::SetMode(PBMap::#MODE_DEFAULT) PBMap::SetMode(PBMap::#MODE_DEFAULT)
SetGadgetState(#Gdt_EditMode, 0) SetGadgetState(#Gdt_EditMode, 0)
EndIf EndIf
Case #Gdt_ClearDiskCache
PBMap::ClearDiskCache()
Case #StringGeoLocationQuery Case #StringGeoLocationQuery
Select EventType() Select EventType()
Case #PB_EventType_Focus Case #PB_EventType_Focus
@@ -2455,10 +2378,10 @@ CompilerIf #PB_Compiler_IsMainFile
CompilerEndIf CompilerEndIf
; IDE Options = PureBasic 5.42 LTS (Windows - x64) ; IDE Options = PureBasic 5.60 beta 7 (Windows - x64)
; CursorPosition = 2430 ; CursorPosition = 2250
; FirstLine = 2401 ; FirstLine = 2260
; Folding = ----------------- ; Folding = -----------------
; EnableUnicode
; EnableThread ; EnableThread
; EnableXP ; EnableXP
; EnableUnicode

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 374 KiB

After

Width:  |  Height:  |  Size: 286 KiB