Curl option, cache clean function, and cache directory better handling

+ some cleaning
This commit is contained in:
djes
2017-03-01 12:55:28 +01:00
parent deb766c4c5
commit 751ec96070

441
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
@@ -16,10 +16,6 @@ CompilerIf #PB_Compiler_Thread = #False
End End
CompilerEndIf CompilerEndIf
CompilerIf #PB_Compiler_OS = #PB_OS_Linux
#Red = 255
compilerEndif
EnableExplicit EnableExplicit
InitNetwork() InitNetwork()
@@ -27,10 +23,22 @@ UsePNGImageDecoder()
UsePNGImageEncoder() UsePNGImageEncoder()
DeclareModule PBMap DeclareModule PBMap
;-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
@@ -80,6 +88,7 @@ DeclareModule PBMap
Declare.i GetMode() Declare.i GetMode()
Declare SetMode(Mode.i = #MODE_DEFAULT) Declare SetMode(Mode.i = #MODE_DEFAULT)
Declare NominatimGeoLocationQuery(Address.s, *ReturnPosition= 0) ;Send back the position *ptr.GeographicCoordinates Declare NominatimGeoLocationQuery(Address.s, *ReturnPosition= 0) ;Send back the position *ptr.GeographicCoordinates
Declare.i CleanCache()
EndDeclareModule EndDeclareModule
Module PBMap Module PBMap
@@ -182,6 +191,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
@@ -272,7 +283,7 @@ 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
@@ -287,7 +298,7 @@ Module PBMap
IncludeFile "libcurl.pbi" ; https://github.com/deseven/pbsamples/tree/master/crossplatform/libcurl IncludeFile "libcurl.pbi" ; https://github.com/deseven/pbsamples/tree/master/crossplatform/libcurl
Global *ReceiveHTTPToMemoryBuffer, ReceiveHTTPToMemoryBufferPtr.i, ReceivedData.s Global *ReceiveHTTPToMemoryBuffer, ReceiveHTTPToMemoryBufferPtr.i, ReceivedData.s
ProcedureC ReceiveHTTPWriteToMemoryFunction(*ptr, Size.i, NMemB.i, *Stream) ProcedureC ReceiveHTTPWriteToMemoryFunction(*ptr, Size.i, NMemB.i, *Stream)
Protected SizeProper.i = Size & 255 Protected SizeProper.i = Size & 255
Protected NMemBProper.i = NMemB Protected NMemBProper.i = NMemB
@@ -319,7 +330,7 @@ Module PBMap
curl_easy_setopt(curl, #CURLOPT_HEADER, 0) curl_easy_setopt(curl, #CURLOPT_HEADER, 0)
curl_easy_setopt(curl, #CURLOPT_FOLLOWLOCATION, 1) curl_easy_setopt(curl, #CURLOPT_FOLLOWLOCATION, 1)
curl_easy_setopt(curl, #CURLOPT_TIMEOUT, Timeout) curl_easy_setopt(curl, #CURLOPT_TIMEOUT, Timeout)
If Verbose If PBMap\Options\Verbose
curl_easy_setopt(curl, #CURLOPT_VERBOSE, 1) curl_easy_setopt(curl, #CURLOPT_VERBOSE, 1)
EndIf EndIf
curl_easy_setopt(curl, #CURLOPT_FAILONERROR, 1) curl_easy_setopt(curl, #CURLOPT_FAILONERROR, 1)
@@ -387,7 +398,7 @@ Module PBMap
curl_easy_setopt(curl, #CURLOPT_HEADER, 0) curl_easy_setopt(curl, #CURLOPT_HEADER, 0)
curl_easy_setopt(curl, #CURLOPT_FOLLOWLOCATION, 1) curl_easy_setopt(curl, #CURLOPT_FOLLOWLOCATION, 1)
curl_easy_setopt(curl, #CURLOPT_TIMEOUT, Timeout) curl_easy_setopt(curl, #CURLOPT_TIMEOUT, Timeout)
If Verbose If PBMap\Options\Verbose
curl_easy_setopt(curl, #CURLOPT_VERBOSE, 1) curl_easy_setopt(curl, #CURLOPT_VERBOSE, 1)
EndIf EndIf
curl_easy_setopt(curl, #CURLOPT_FAILONERROR, 1) curl_easy_setopt(curl, #CURLOPT_FAILONERROR, 1)
@@ -426,7 +437,7 @@ Module PBMap
EndIf EndIf
ProcedureReturn #False ProcedureReturn #False
EndProcedure EndProcedure
;- *** ;- ***
Procedure TechnicalImagesCreation() Procedure TechnicalImagesCreation()
@@ -516,12 +527,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 "cleancache" Case "verbose"
if DeleteDirectory(PBMap\Options\HDDCachePath, "", #PB_FileSystem_Recursive) SelBool(Verbose)
MyDebug("Cache : " + PBMap\Options\HDDCachePath + " cleaned") Case "warning"
else SelBool(Warning)
MyDebug("Can't clean cache in " + PBMap\Options\HDDCachePath)
endif
Case "usecurl" Case "usecurl"
SelBool(UseCurl) SelBool(UseCurl)
Case "wheelmouserelative" Case "wheelmouserelative"
@@ -563,35 +572,37 @@ Module PBMap
CreatePreferences(PreferencesFile) CreatePreferences(PreferencesFile)
EndIf EndIf
With PBMap\Options With PBMap\Options
PreferenceGroup("PROXY") PreferenceGroup("PROXY")
WritePreferenceInteger("Proxy", \Proxy) WritePreferenceInteger("Proxy", \Proxy)
WritePreferenceString("ProxyURL", \ProxyURL) WritePreferenceString("ProxyURL", \ProxyURL)
WritePreferenceString("ProxyPort", \ProxyPort) WritePreferenceString("ProxyPort", \ProxyPort)
WritePreferenceString("ProxyUser", \ProxyUser) WritePreferenceString("ProxyUser", \ProxyUser)
PreferenceGroup("URL") PreferenceGroup("URL")
WritePreferenceString("DefaultOSMServer", \DefaultOSMServer) WritePreferenceString("DefaultOSMServer", \DefaultOSMServer)
PreferenceGroup("PATHS") PreferenceGroup("PATHS")
WritePreferenceString("TilesCachePath", \HDDCachePath) WritePreferenceString("TilesCachePath", \HDDCachePath)
PreferenceGroup("OPTIONS") PreferenceGroup("OPTIONS")
WritePreferenceInteger("WheelMouseRelative", \WheelMouseRelative) WritePreferenceInteger("WheelMouseRelative", \WheelMouseRelative)
WritePreferenceInteger("MaxMemCache", \MaxMemCache) WritePreferenceInteger("MaxMemCache", \MaxMemCache)
WritePreferenceInteger("UseCurl", \UseCurl) WritePreferenceInteger("Verbose", \Verbose)
WritePreferenceInteger("ShowDegrees", \ShowDegrees) WritePreferenceInteger("Warning", \Warning)
WritePreferenceInteger("ShowDebugInfos", \ShowDebugInfos) WritePreferenceInteger("UseCurl", \UseCurl)
WritePreferenceInteger("ShowScale", \ShowScale) WritePreferenceInteger("ShowDegrees", \ShowDegrees)
WritePreferenceInteger("ShowMarkers", \ShowMarkers) WritePreferenceInteger("ShowDebugInfos", \ShowDebugInfos)
WritePreferenceInteger("ShowPointer", \ShowPointer) WritePreferenceInteger("ShowScale", \ShowScale)
WritePreferenceInteger("ShowTrack", \ShowTrack) WritePreferenceInteger("ShowMarkers", \ShowMarkers)
WritePreferenceInteger("ShowTrackKms", \ShowTrackKms) WritePreferenceInteger("ShowPointer", \ShowPointer)
WritePreferenceInteger("ShowMarkersNb", \ShowMarkersNb) WritePreferenceInteger("ShowTrack", \ShowTrack)
WritePreferenceInteger("ShowMarkersLegend", \ShowMarkersLegend) WritePreferenceInteger("ShowTrackKms", \ShowTrackKms)
PreferenceGroup("DRAWING") WritePreferenceInteger("ShowMarkersNb", \ShowMarkersNb)
WritePreferenceInteger("StrokeWidthTrackDefault", \StrokeWidthTrackDefault) WritePreferenceInteger("ShowMarkersLegend", \ShowMarkersLegend)
;Colours; PreferenceGroup("DRAWING")
WritePreferenceInteger("ColourFocus", \ColourFocus) WritePreferenceInteger("StrokeWidthTrackDefault", \StrokeWidthTrackDefault)
WritePreferenceInteger("ColourSelected", \ColourSelected) ;Colours;
WritePreferenceInteger("ColourTrackDefault", \ColourTrackDefault) WritePreferenceInteger("ColourFocus", \ColourFocus)
ClosePreferences() WritePreferenceInteger("ColourSelected", \ColourSelected)
WritePreferenceInteger("ColourTrackDefault", \ColourTrackDefault)
ClosePreferences()
EndWith EndWith
EndProcedure EndProcedure
@@ -615,53 +626,47 @@ Module PBMap
; WritePreferenceString("ProxyPass", "myproxypass") ;TODO !Warning! !not encoded! ; WritePreferenceString("ProxyPass", "myproxypass") ;TODO !Warning! !not encoded!
; ClosePreferences() ; ClosePreferences()
With PBMap\Options With PBMap\Options
PreferenceGroup("PROXY") PreferenceGroup("PROXY")
\Proxy = ReadPreferenceInteger("Proxy", #False) \Proxy = ReadPreferenceInteger("Proxy", #False)
If \Proxy If \Proxy
\ProxyURL = ReadPreferenceString("ProxyURL", "") ;InputRequester("ProxyServer", "Do you use a Proxy Server? Then enter the full url:", "") \ProxyURL = ReadPreferenceString("ProxyURL", "") ;InputRequester("ProxyServer", "Do you use a Proxy Server? Then enter the full url:", "")
\ProxyPort = ReadPreferenceString("ProxyPort", "") ;InputRequester("ProxyPort" , "Do you use a specific port? Then enter it", "") \ProxyPort = ReadPreferenceString("ProxyPort", "") ;InputRequester("ProxyPort" , "Do you use a specific port? Then enter it", "")
\ProxyUser = ReadPreferenceString("ProxyUser", "") ;InputRequester("ProxyUser" , "Do you use a user name? Then enter it", "") \ProxyUser = ReadPreferenceString("ProxyUser", "") ;InputRequester("ProxyUser" , "Do you use a user name? Then enter it", "")
\ProxyPassword = InputRequester("ProxyPass", "Do you use a password ? Then enter it", "") ;TODO \ProxyPassword = InputRequester("ProxyPass", "Do you use a password ? Then enter it", "") ;TODO
EndIf EndIf
PreferenceGroup("URL") PreferenceGroup("URL")
\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
\UseCurl = ReadPreferenceInteger("UseCurl", #True) \Verbose = ReadPreferenceInteger("Verbose", #True)
\ShowDegrees = ReadPreferenceInteger("ShowDegrees", #False) \Warning = ReadPreferenceInteger("Warning", #False)
\ShowDebugInfos = ReadPreferenceInteger("ShowDebugInfos", #False) \UseCurl = ReadPreferenceInteger("UseCurl", #True)
\ShowScale = ReadPreferenceInteger("ShowScale", #False) \ShowDegrees = ReadPreferenceInteger("ShowDegrees", #False)
\ShowMarkers = ReadPreferenceInteger("ShowMarkers", #True) \ShowDebugInfos = ReadPreferenceInteger("ShowDebugInfos", #False)
\ShowPointer = ReadPreferenceInteger("ShowPointer", #True) \ShowScale = ReadPreferenceInteger("ShowScale", #False)
\ShowTrack = ReadPreferenceInteger("ShowTrack", #True) \ShowMarkers = ReadPreferenceInteger("ShowMarkers", #True)
\ShowTrackKms = ReadPreferenceInteger("ShowTrackKms", #False) \ShowPointer = ReadPreferenceInteger("ShowPointer", #True)
\ShowMarkersNb = ReadPreferenceInteger("ShowMarkersNb", #True) \ShowTrack = ReadPreferenceInteger("ShowTrack", #True)
\ShowMarkersLegend = ReadPreferenceInteger("ShowMarkersLegend", #False) \ShowTrackKms = ReadPreferenceInteger("ShowTrackKms", #False)
PreferenceGroup("DRAWING") \ShowMarkersNb = ReadPreferenceInteger("ShowMarkersNb", #True)
\StrokeWidthTrackDefault = ReadPreferenceInteger("StrokeWidthTrackDefault", 10) \ShowMarkersLegend = ReadPreferenceInteger("ShowMarkersLegend", #False)
PreferenceGroup("COLOURS") PreferenceGroup("DRAWING")
\ColourFocus = ReadPreferenceInteger("ColourFocus", RGBA(255, 255, 0, 255)) \StrokeWidthTrackDefault = ReadPreferenceInteger("StrokeWidthTrackDefault", 10)
\ColourSelected = ReadPreferenceInteger("ColourSelected", RGBA(225, 225, 0, 255)) PreferenceGroup("COLOURS")
\ColourTrackDefault = ReadPreferenceInteger("ColourTrackDefault", RGBA(0, 255, 0, 150)) \ColourFocus = ReadPreferenceInteger("ColourFocus", RGBA(255, 255, 0, 255))
\TimerInterval = 20 \ColourSelected = ReadPreferenceInteger("ColourSelected", RGBA(225, 225, 0, 255))
ClosePreferences() \ColourTrackDefault = ReadPreferenceInteger("ColourTrackDefault", RGBA(0, 255, 0, 150))
\TimerInterval = 20
ClosePreferences()
EndWith EndWith
EndProcedure EndProcedure
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
@@ -703,9 +708,9 @@ Module PBMap
Next Next
Delay(10) Delay(10)
Until MapSize(PBMap\MemCache\Images()) = 0 Until MapSize(PBMap\MemCache\Images()) = 0
If PBMap\Options\Curl If PBMap\Options\UseCurl
curl_global_cleanup() curl_global_cleanup()
endif EndIf
EndProcedure EndProcedure
Macro Min(a,b) Macro Min(a,b)
@@ -765,7 +770,7 @@ Module PBMap
Procedure.d ClipLongitude(Longitude.d) Procedure.d ClipLongitude(Longitude.d)
ProcedureReturn Mod(Mod(Longitude + 180, 360.0) + 360.0, 360.0) - 180 ProcedureReturn Mod(Mod(Longitude + 180, 360.0) + 360.0, 360.0) - 180
EndProcedure EndProcedure
;Lat Lon coordinates 2 pixel absolute [0 to 2^Zoom * TileSize [ ;Lat Lon coordinates 2 pixel absolute [0 to 2^Zoom * TileSize [
Procedure LatLon2Pixel(*Location.GeographicCoordinates, *Pixel.PixelCoordinates, Zoom) Procedure LatLon2Pixel(*Location.GeographicCoordinates, *Pixel.PixelCoordinates, Zoom)
Protected tilemax = Pow(2.0, Zoom) * PBMap\TileSize Protected tilemax = Pow(2.0, Zoom) * PBMap\TileSize
@@ -846,7 +851,7 @@ Module PBMap
ProcedureReturn #False ProcedureReturn #False
EndIf EndIf
EndProcedure EndProcedure
;TODO : rotation fix ;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
@@ -874,7 +879,7 @@ Module PBMap
ProcedureReturn #False ProcedureReturn #False
EndIf EndIf
EndProcedure EndProcedure
;-*** These are threaded ;-*** These are threaded
Procedure.i GetTileFromHDD(CacheFile.s) Procedure.i GetTileFromHDD(CacheFile.s)
Protected nImage.i Protected nImage.i
@@ -896,7 +901,7 @@ Module PBMap
Protected *Buffer Protected *Buffer
Protected nImage.i = -1 Protected nImage.i = -1
Protected FileSize.i, timg Protected FileSize.i, timg
If PBMap\Options\Curl If PBMap\Options\UseCurl
FileSize = CurlReceiveHTTPToFile(TileURL, CacheFile, PBMap\Options\ProxyURL, PBMap\Options\ProxyPort, PBMap\Options\ProxyUser, PBMap\Options\ProxyPassword) FileSize = CurlReceiveHTTPToFile(TileURL, CacheFile, PBMap\Options\ProxyURL, PBMap\Options\ProxyPort, PBMap\Options\ProxyUser, PBMap\Options\ProxyPassword)
If FileSize > 0 If FileSize > 0
MyDebug("Loaded from web " + TileURL + " as CacheFile " + CacheFile, 3) MyDebug("Loaded from web " + TileURL + " as CacheFile " + CacheFile, 3)
@@ -905,7 +910,7 @@ Module PBMap
MyDebug("Problem loading from web " + TileURL, 3) MyDebug("Problem loading from web " + TileURL, 3)
EndIf EndIf
Else Else
HTTPProxy(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) 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)
@@ -913,7 +918,7 @@ Module PBMap
Else Else
MyDebug("Problem loading from web " + TileURL, 3) MyDebug("Problem loading from web " + TileURL, 3)
EndIf EndIf
Endif EndIf
; **** IMPORTANT NOTICE ; **** IMPORTANT NOTICE
; 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 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)
@@ -1062,23 +1067,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)
@@ -1390,7 +1407,7 @@ Module PBMap
ProcedureReturn *NewTrack ProcedureReturn *NewTrack
EndIf EndIf
EndProcedure EndProcedure
Procedure ClearMarkers() Procedure ClearMarkers()
ClearList(PBMap\Markers()) ClearList(PBMap\Markers())
@@ -1466,7 +1483,7 @@ Module PBMap
EndIf EndIf
EndProcedure EndProcedure
;-*** ;-***
Procedure DrawMarker(x.i, y.i, Nb.i, *Marker.Marker) Procedure DrawMarker(x.i, y.i, Nb.i, *Marker.Marker)
Protected Text.s Protected Text.s
VectorSourceColor(*Marker\Color) VectorSourceColor(*Marker\Color)
@@ -1521,7 +1538,7 @@ Module PBMap
DrawVectorParagraph(*Marker\Legend, 100, Height, #PB_VectorParagraph_Center) DrawVectorParagraph(*Marker\Legend, 100, Height, #PB_VectorParagraph_Center)
EndIf EndIf
EndProcedure EndProcedure
; Draw all markers ; Draw all markers
Procedure DrawMarkers(*Drawing.DrawingParameters) Procedure DrawMarkers(*Drawing.DrawingParameters)
Protected Pixel.PixelCoordinates Protected Pixel.PixelCoordinates
@@ -1590,14 +1607,14 @@ 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\RadiusX / ts ;How many tiles around the point nx = *Drawing\RadiusX / ts ;How many tiles around the point
ny = *Drawing\RadiusY / 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)
;*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
;*** ;***
@@ -1705,8 +1722,8 @@ Module PBMap
;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
@@ -1714,7 +1731,7 @@ Module PBMap
Protected resolutionHorizontal.d = DeltaX / (PBMap\Drawing\RadiusX * 2) 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 = PBMap\Drawing\RadiusY; 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
@@ -1782,7 +1799,7 @@ Module PBMap
EndIf EndIf
PBMap\Redraw = #True PBMap\Redraw = #True
EndProcedure EndProcedure
Procedure SetCallBackLocation(CallBackLocation.i) Procedure SetCallBackLocation(CallBackLocation.i)
PBMap\CallBackLocation = CallBackLocation PBMap\CallBackLocation = CallBackLocation
EndProcedure EndProcedure
@@ -1882,6 +1899,7 @@ 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" + ;"Unter%20den%20Linden%201%20Berlin" +
@@ -1891,7 +1909,12 @@ Module PBMap
; 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) If PBMap\Options\UseCurl
Size = CurlReceiveHTTPToFile(Query, JSONFileName, PBMap\Options\ProxyURL, PBMap\Options\ProxyPort, PBMap\Options\ProxyUser, PBMap\Options\ProxyPassword)
Else
HTTPProxy(PBMap\Options\ProxyURL + ":" + PBMap\Options\ProxyPort, PBMap\Options\ProxyUser, PBMap\Options\ProxyPassword)
Size = CurlReceiveHTTPToFile(Query, JSONFileName)
EndIf
If LoadJSON(0, JSONFileName) = 0 If LoadJSON(0, JSONFileName) = 0
;Demivec's code ;Demivec's code
MyDebug( JSONErrorMessage() + " at position " + MyDebug( JSONErrorMessage() + " at position " +
@@ -1917,7 +1940,68 @@ Module PBMap
EndIf EndIf
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 CleanCache()
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 + " cleaned")
CreateDirectoryEx(PBMap\Options\HDDCachePath)
ProcedureReturn #True
Else
MyDebug("Can't clean 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
@@ -1948,32 +2032,32 @@ Module PBMap
EndIf EndIf
Case #PB_EventType_KeyDown Case #PB_EventType_KeyDown
With PBMap\Markers() With PBMap\Markers()
Select GetGadgetAttribute(PBMap\Gadget, #PB_Canvas_Key) Select GetGadgetAttribute(PBMap\Gadget, #PB_Canvas_Key)
Case #PB_Shortcut_Left Case #PB_Shortcut_Left
ForEach PBMap\Markers() ForEach PBMap\Markers()
If \Selected If \Selected
\GeographicCoordinates\Longitude = ClipLongitude( \GeographicCoordinates\Longitude - 10* 360 / Pow(2, PBMap\Zoom + 8)) \GeographicCoordinates\Longitude = ClipLongitude( \GeographicCoordinates\Longitude - 10* 360 / Pow(2, PBMap\Zoom + 8))
EndIf EndIf
Next Next
Case #PB_Shortcut_Up Case #PB_Shortcut_Up
ForEach PBMap\Markers() ForEach PBMap\Markers()
If \Selected If \Selected
\GeographicCoordinates\Latitude + 10* 360 / Pow(2, PBMap\Zoom + 8) \GeographicCoordinates\Latitude + 10* 360 / Pow(2, PBMap\Zoom + 8)
EndIf EndIf
Next Next
Case #PB_Shortcut_Right Case #PB_Shortcut_Right
ForEach PBMap\Markers() ForEach PBMap\Markers()
If \Selected If \Selected
\GeographicCoordinates\Longitude = ClipLongitude( \GeographicCoordinates\Longitude + 10* 360 / Pow(2, PBMap\Zoom + 8)) \GeographicCoordinates\Longitude = ClipLongitude( \GeographicCoordinates\Longitude + 10* 360 / Pow(2, PBMap\Zoom + 8))
EndIf EndIf
Next Next
Case #PB_Shortcut_Down Case #PB_Shortcut_Down
ForEach PBMap\Markers() ForEach PBMap\Markers()
If \Selected If \Selected
\GeographicCoordinates\Latitude - 10* 360 / Pow(2, PBMap\Zoom + 8) \GeographicCoordinates\Latitude - 10* 360 / Pow(2, PBMap\Zoom + 8)
EndIf EndIf
Next Next
EndSelect EndSelect
EndWith EndWith
PBMap\Redraw = #True PBMap\Redraw = #True
If GetGadgetAttribute(PBMap\Gadget, #PB_Canvas_Modifiers)&#PB_Canvas_Control <> 0 If GetGadgetAttribute(PBMap\Gadget, #PB_Canvas_Modifiers)&#PB_Canvas_Control <> 0
@@ -2179,9 +2263,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
@@ -2193,10 +2274,16 @@ 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) If PBMap\Options\UseCurl
curl_global_init(#CURL_GLOBAL_WIN32)
EndIf
TechnicalImagesCreation() TechnicalImagesCreation()
SetLocation(0, 0) SetLocation(0, 0)
EndProcedure EndProcedure
@@ -2353,8 +2440,10 @@ CompilerIf #PB_Compiler_IsMainFile
PBMap::SetOption("ShowDebugInfos", "0") PBMap::SetOption("ShowDebugInfos", "0")
PBMap::SetOption("ShowScale", "1") PBMap::SetOption("ShowScale", "1")
PBMap::SetOption("ShowMarkersLegend", "1") PBMap::SetOption("ShowMarkersLegend", "1")
PBMap::SetOption("ShowTrackKms", "1") PBMap::SetOption("ShowTrackKms", "1")
PBMap::SetOption("UseCurl", "0")
PBMap::SetOption("ColourFocus", "$FFFF00AA") PBMap::SetOption("ColourFocus", "$FFFF00AA")
;PBMap::CleanCache()
PBMap::MapGadget(#Map, 10, 10, 512, 512) PBMap::MapGadget(#Map, 10, 10, 512, 512)
PBMap::SetCallBackMainPointer(@MainPointer()) ; To change the main pointer (center of the view) PBMap::SetCallBackMainPointer(@MainPointer()) ; To change the main pointer (center of the view)
PBMap::SetCallBackLocation(@UpdateLocation()) ; To obtain realtime coordinates PBMap::SetCallBackLocation(@UpdateLocation()) ; To obtain realtime coordinates
@@ -2424,30 +2513,30 @@ CompilerIf #PB_Compiler_IsMainFile
EndIf EndIf
Case #StringGeoLocationQuery Case #StringGeoLocationQuery
Select EventType() Select EventType()
Case #PB_EventType_Focus Case #PB_EventType_Focus
AddKeyboardShortcut(#Window_0, #PB_Shortcut_Return, #MenuEventGeoLocationStringEnter) AddKeyboardShortcut(#Window_0, #PB_Shortcut_Return, #MenuEventGeoLocationStringEnter)
Case #PB_EventType_LostFocus Case #PB_EventType_LostFocus
RemoveKeyboardShortcut(#Window_0, #PB_Shortcut_Return) RemoveKeyboardShortcut(#Window_0, #PB_Shortcut_Return)
EndSelect EndSelect
EndSelect EndSelect
Case #PB_Event_SizeWindow Case #PB_Event_SizeWindow
ResizeAll() ResizeAll()
Case #PB_Event_Menu Case #PB_Event_Menu
;Receive "enter" key events ;Receive "enter" key events
Select EventMenu() Select EventMenu()
Case #MenuEventGeoLocationStringEnter Case #MenuEventGeoLocationStringEnter
If GetGadgetText(#StringGeoLocationQuery) <> "" If GetGadgetText(#StringGeoLocationQuery) <> ""
PBMap::NominatimGeoLocationQuery(GetGadgetText(#StringGeoLocationQuery)) PBMap::NominatimGeoLocationQuery(GetGadgetText(#StringGeoLocationQuery))
PBMap::Refresh()
EndIf
;*** TODO : code to change when the SetActiveGadget(-1) will be fixed
SetActiveGadget(Dummy)
;***
Case #MenuEventLonLatStringEnter
PBMap::SetLocation(ValD(GetGadgetText(#StringLatitude)), ValD(GetGadgetText(#StringLongitude))) ; Change the PBMap coordinates
PBMap::Refresh() PBMap::Refresh()
EndIf EndSelect
;*** TODO : code to change when the SetActiveGadget(-1) will be fixed EndSelect
SetActiveGadget(Dummy)
;***
Case #MenuEventLonLatStringEnter
PBMap::SetLocation(ValD(GetGadgetText(#StringLatitude)), ValD(GetGadgetText(#StringLongitude))) ; Change the PBMap coordinates
PBMap::Refresh()
EndSelect
EndSelect
Until Quit = #True Until Quit = #True
PBMap::Quit() PBMap::Quit()
@@ -2457,9 +2546,9 @@ CompilerEndIf
; IDE Options = PureBasic 5.60 beta 7 (Windows - x64) ; IDE Options = PureBasic 5.60 beta 7 (Windows - x64)
; CursorPosition = 2191 ; CursorPosition = 908
; FirstLine = 2173 ; FirstLine = 898
; Folding = ----------------- ; Folding = ------------------
; EnableThread ; EnableThread
; EnableXP ; EnableXP
; EnableUnicode ; EnableUnicode