Description
PBMap est un module servant à l'intégration de cartes telles que OpenStreetMap, Here, Geoserver/geocache dans un gadget de type Canvas. Le projet est basé sur le code de Progi1984 et d'autres.
Utilisation
Le programme de démonstration dans demo.pb affiche une fenêtre avec le gadget pbmap fonctionnel permettant :
- le déplacement à la souris, (cliquer/déplacer, roulette pour zoomer, double-clic),
- le redimensionnement,
- la pose et le déplacement de balises (avec l'édition en cliquant sur le bouton edit mode et double clic),
- la lecture, le dessin et la sélection de fichiers GPX, la sauvegarde (partielle)
- l'affichage de calques avec les services OpenSea, vue aérienne HERE, Geoserver (représentation type google maps, voir http://geowebcache.org/docs/current/services/gmaps.html)
- la recherche par adresse.
Le programme Multiple-PBMaps-Demo.pb montre comment utiliser plusieurs gadgets pbmap dans vos projets.
Version
0.91 (PB 5.60 mini), versions plus anciennes disponible sur le dépôt.
Ce programme est en version beta, l'utilisation est de votre responsabilité.
Téléchargement
Etant donné que le développement est toujours en cours, vous trouverez les fichiers sources ici : https://github.com/djes/PBMap
Participer
N'importe qui peut participer au projet, n'hésitez pas à poster vos démos et vos améliorations. Vous pouvez également disposer d'un accès GIT pour pouvoir faire vos tests et vos intégrations directement dans le code source.
Actuellement, le dépôt est maintenu par Thyphoon (qui a lancé le projet), djes et a reçu des contributions d'Idle.
Copyright
Auteurs : Thyphoon, djes, Idle, yves86
Merci : Progi1984, falsam, fred et l'équipe de Fantaisie Software
PBMap est open source, sentez-vous libre de l'utiliser comme bon vous semble, crédits et remerciements appréciés.
OpenStreetMap : https://www.openstreetmap.org/copyright
-------------------------------
Ci-dessous, pour mémoire
Bonjour,
Voilà déjà plusieurs mois que je bosse sur un gros projet que j'éspère bientôt pouvoir partager avec vous.
ça fait déjà quelques semaines que je bosse pour ce projet a intégré une carte OpenStreetMap. Le but étant au final d'avoir la simplicité d'utilisation d'un google Map. d'afficher des points et de les déplacer sur cette même carte, mais aussi l'affichage de fichier GPX. Au départ j'ai fait mes propres tentative et ça n'a pas donné grand chose. Et j'ai découvert que Progi1984 c'était penché sur le problème donc depuis 2 jours je torture son code.
j'ai essayé de reprendre son travail et de le modifier pour l'intégré dans un canvas voici ou j'en suis. Le code est pas super propre c'est vraiment du bidouillage pour l'instant mais si j'arrive a faire fonctionner ça je ferais un module propre.
Mon souci actuellement est lorsque je fais glisser la carte de plus d'une case... en rafraîchissant il en saute une ... mais je vois pas pourquoi. Si quelqu'un a une idée ...
Je mettrai le code a jour ici au fur et a mesure.
Code : Tout sélectionner
#USEPROXY=#False
UsePNGImageDecoder()
UsePNGImageEncoder()
CompilerIf #USEPROXY=#True
IncludeFile("C:\Users\lebrun_y_413\Documents\Developpement\Purebasic\includes Share\http.pbi")
CompilerEndIf
EnableExplicit
InitNetwork()
UsePNGImageDecoder()
UseSQLiteDatabase()
Structure osm
gfLatitude.d ;49.0422777
gfLongitude.d ;2.035566
gfxTile.d
gfyTile.d
glZoom.l ;= 17
sName.s
sURL.s
lZoomMin.l
lZoomMax.l
cachePath.S
StartCursorX.l
StartCursorY.l
DeltaCursorX.l
DeltaCursorY.l
EndStructure
Global osm.osm
osm\gfLatitude = 49.04599
osm\gfLongitude = 2.03347
osm\glZoom = 17
osm\sName="OSM Mapnik"
osm\sURL="http://tile.openstreetmap.org/"
osm\lZoomMin=0
osm\lZoomMax=18
osm\cachePath.s=GetTemporaryDirectory()
;@desc Permits to translate XY Coordinates to Lon/Lat Coordinates
;@author Progi1984
Procedure OSM_LatLon2XY()
Protected n.l = Pow(2, osm\glZoom)
osm\gfxTile = (((osm\gfLongitude + 180) / 360) * n)
osm\gfyTile = ((1-(Log(Tan(osm\gfLatitude * #PI / 180)+(1/Cos(osm\gfLatitude*#PI/180)))/#PI))/2*n)
EndProcedure
;@desc Permits to translate Lon/Lat Coordinates to XY Coordinates
;@author Progi1984
Procedure OSM_XY2LatLon()
Protected n.l = Pow(2, osm\glZoom)
Protected pfLatitudeRad.f
osm\gfLongitude = osm\gfxTile / n * 360.0 - 180.0
pfLatitudeRad = ATan(SinH(#PI * (1 - 2 * osm\gfyTile / n)))
osm\gfLatitude = pfLatitudeRad * 180.0 / #PI
EndProcedure
Procedure OSM_GetImage(Image.l, Zoom.l, XTile.l, YTile.l)
Protected plMemory.l
Protected psURL.s = osm\sURL+Str(Zoom)+"/"+Str(XTile)+"/"+Str(YTile)+".png"
Protected plImageSize.l
Protected plImageMem.l
Protected psSQLRequest.s
Protected pbImageOK.b
Protected plRes.l
; Test if in cache else download it
Protected cacheFile.s="OSM_"+Str(Zoom)+"_"+Str(XTile)+"_"+Str(YTile)+".png"
;Debug osm\cachePath+cacheFile
If FileSize(osm\cachePath+cacheFile)>0
;Debug "Use Cache :"+cacheFile
LoadImage(Image,osm\cachePath+cacheFile)
Else
;Debug "DOWNLOAD : "+psURL
CompilerIf #USEPROXY=#True
Protected http.HTTP_Query
HTTP_proxy(@http,"spxy.bpi.fr",3128)
HTTP_DownloadToMem(@http,psURL)
If IsImage(image)
FreeImage(image)
EndIf
If CatchImage(image, http\data, MemorySize(http\data))
SaveImage(image,osm\cachePath+cacheFile,#PB_ImagePlugin_PNG)
EndIf
CompilerElse
plMemory = ReceiveHTTPMemory(psURL)
If IsImage(Image)
FreeImage(Image)
EndIf
If CatchImage(Image, plMemory, MemorySize(plMemory))
SaveImage(image,osm\cachePath+cacheFile,#PB_ImagePlugin_PNG)
FreeMemory(plMemory)
EndIf
CompilerEndIf
EndIf
EndProcedure
Procedure OSM_GetSquareTile()
Protected x.l,y.l,nx.l,ny.l,mx.l,my.l,n.l=0,tx.l,ty.l
nx=Round(512/256,#PB_Round_Up ):
ny=Round(512/256,#PB_Round_Up ):
For x=0 To nx
For y=0 To ny
tx=x-Int(nx/2)
ty=y-Int(ny/2)
OSM_GetImage(n, osm\glZoom+1,Int(2*osm\gfxTile+tx) ,Int(2*osm\gfyTile+ty))
n=n+1
Next
Next
EndProcedure
Procedure drawmap()
Protected x.l,y.l,nx.l,ny.l,mx.l,my.l,n.l=0
Protected deltaX.l,deltaY.l
Protected cx.l,cy.l,tx.l,ty.l
deltaX=512*(osm\gfxTile-Int(osm\gfxTile))-256
deltaY=512*(osm\gfyTile-Int(osm\gfyTile))-256
nx=Round(512/256,#PB_Round_Up ):
ny=Round(512/256,#PB_Round_Up ):
Box(0,0,512,512,RGB(255,255,255))
cx=512/2
cy=512/2
For x=0 To nx
For y=0 To ny
tx=(x-Int(nx/2))*256-deltaX+osm\DeltaCursorX
ty=(y-Int(ny/2))*256-deltaY+osm\DeltaCursorY
If IsImage(n):DrawImage(ImageID(n), tx, ty, 254, 254):EndIf
DrawText( tx,ty,Str(x-Int(nx/2))+","+Str(y-Int(ny/2)))
n=n+1
Next
Next
Circle(256,256,5,#Red)
DrawText(0,0,"DeltaCursorX:"+Str(osm\DeltaCursorX)+" deltaX:"+Str(deltaX)+" gfxTile:"+StrD(osm\gfxTile))
EndProcedure
Procedure move(tx.d,ty.d)
Debug "-move-"
Debug tx
Debug osm\gfxTile
Protected l.l,pfValue.f
If tx<>0
pfValue = osm\gfxTile - tx
If pfValue > Pow(2, osm\glZoom) - 1
osm\gfxTile = Pow(2, osm\glZoom) - 2
ElseIf pfValue < 0
osm\gfxTile = Pow(2, osm\glZoom) - 2
Else
osm\gfxTile = pfValue
EndIf
EndIf
If ty<>0
pfValue = osm\gfyTile - ty
If pfValue > Pow(2, osm\glZoom) - 1
osm\gfyTile = Pow(2, osm\glZoom) - 2
ElseIf pfValue < 0
osm\gfyTile = Pow(2, osm\glZoom) - 2
Else
osm\gfyTile = pfValue
EndIf
EndIf
Debug osm\gfxTile
OSM_GetSquareTile()
OSM_XY2LatLon()
EndProcedure
CompilerIf #PB_Compiler_IsMainFile
Enumeration
#Window_0
#Map
#Button_0
#Button_1
#Button_2
#Button_3
#Button_4
#Button_5
#Combo_0
#Text_0
#Text_1
#Text_2
#Text_3
#Text_4
#String_0
#String_1
EndEnumeration
If OpenWindow(#Window_0, 260, 225, 700, 571, "OpenStreetMap", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered )
LoadFont(0,"Wingdings",12)
LoadFont(1,"Arial",12,#PB_Font_Bold)
CanvasGadget(#Map,10,10,512,512)
TextGadget(#Text_1, 530, 50, 60, 15, "Movements :")
ButtonGadget(#Button_0, 550, 100, 30, 30, Chr($E7)) : SetGadgetFont(#Button_0, FontID(0))
ButtonGadget(#Button_1, 610, 100, 30, 30, Chr($E8)) : SetGadgetFont(#Button_1, FontID(0))
ButtonGadget(#Button_2, 580, 070, 30, 30, Chr($E9)) : SetGadgetFont(#Button_2, FontID(0))
ButtonGadget(#Button_3, 580, 130, 30, 30, Chr($EA)) : SetGadgetFont(#Button_3, FontID(0))
TextGadget(#Text_2, 530, 160, 60, 15, "Zoom :")
ButtonGadget(#Button_4, 550, 180, 50, 30, "+") : SetGadgetFont(#Button_4, FontID(1))
ButtonGadget(#Button_5, 600, 180, 50, 30, "-") : SetGadgetFont(#Button_5, FontID(1))
TextGadget(#Text_3, 530, 230, 60, 15, "Latitude :")
StringGadget(#String_0, 600, 230, 90, 20, StrD(osm\gfLatitude))
TextGadget(#Text_4, 530, 250, 60, 15, "Longitude :")
StringGadget(#String_1, 600, 250, 90, 20, StrD(osm\gfLongitude))
Define Event.l,Gadget.l,Quit.b=#False
Define pfValue.f
OSM_LatLon2XY()
OSM_GetSquareTile()
StartDrawing(CanvasOutput(#Map))
drawmap()
StopDrawing()
Repeat
Event = WaitWindowEvent()
Select Event
Case #PB_Event_CloseWindow : Quit = 1
Case #PB_Event_Gadget ;{
Gadget = EventGadget()
Select Gadget
Case #Button_0 ;{ To left
pfValue = osm\gfxTile - 0.5
If pfValue < 0
osm\gfxTile = Pow(2, osm\glZoom) - 2
Else
osm\gfxTile = pfValue
EndIf
OSM_GetSquareTile()
OSM_XY2LatLon()
SetGadgetText(#String_1, StrD(osm\gfLongitude))
;}
Case #Button_1 ;{ To Right
Debug osm\gfxTile
pfValue = osm\gfxTile + 0.5
If pfValue > Pow(2, osm\glZoom) - 1
osm\gfxTile = Pow(2, osm\glZoom) - 2
Else
osm\gfxTile = pfValue
EndIf
Debug osm\gfxTile
OSM_GetSquareTile()
OSM_XY2LatLon()
SetGadgetText(#String_1, StrD(osm\gfLongitude))
;}
Case #Button_2 ;{ To Top
pfValue = osm\gfyTile - 0.5
If pfValue < 0
osm\gfyTile = Pow(2, osm\glZoom) - 2
Else
osm\gfyTile = pfValue
EndIf
OSM_GetSquareTile()
OSM_XY2LatLon()
SetGadgetText(#String_0, StrD(osm\gfLatitude))
;}
Case #Button_3 ;{ To Bottom
pfValue = osm\gfyTile + 0.5
If pfValue > Pow(2, osm\glZoom) - 1
osm\gfyTile = Pow(2, osm\glZoom) - 2
Else
osm\gfyTile = pfValue
EndIf
OSM_GetSquareTile()
OSM_XY2LatLon()
SetGadgetText(#String_0, StrD(osm\gfLatitude))
;}
Case #Button_4 ;{ Zoom +
If osm\glZoom < osm\lZoomMax
osm\glZoom + 1
OSM_LatLon2XY()
OSM_GetSquareTile()
EndIf
;}
Case #Button_5 ;{ Zoom -
If osm\glZoom > osm\lZoomMin
osm\glZoom - 1
OSM_LatLon2XY()
OSM_GetSquareTile()
EndIf
;}
; Case #Image_0 ;{
; gfxTile = 2*gfxTile
; gfyTile = 2*gfyTile
; glZoom + 1
; OSM_XY2LatLon()
; OSM_GetSquareTile()
; ;}
; Case #Image_1 ;{
; gfxTile = 2*gfxTile +1
; gfyTile = 2*gfyTile
; glZoom + 1
; OSM_XY2LatLon()
; OSM_GetSquareTile()
; ;}
; Case #Image_2 ;{
; gfxTile = 2*gfxTile
; gfyTile = 2*gfyTile+1
; glZoom + 1
; OSM_XY2LatLon()
; OSM_GetSquareTile()
; ;}
; Case #Image_3 ;{
; gfxTile = 2*gfxTile +1
; gfyTile = 2*gfyTile+1
; glZoom + 1
; OSM_XY2LatLon()
; OSM_GetSquareTile()
; ;}
Case #String_0,#String_1
osm\gfLatitude=ValD(GetGadgetText(#String_0))
osm\gfLongitude=ValD(GetGadgetText(#String_1))
OSM_LatLon2XY()
OSM_GetSquareTile()
Case #Map
Select EventType()
Case #PB_EventType_LeftButtonDown
osm\StartCursorX=GetGadgetAttribute(#Map, #PB_Canvas_MouseX)
osm\StartCursorY=GetGadgetAttribute(#Map, #PB_Canvas_MouseY)
Case #PB_EventType_MouseMove
If osm\StartCursorX<>0 And osm\StartCursorY<>0
osm\DeltaCursorX=GetGadgetAttribute(#Map, #PB_Canvas_MouseX)-osm\StartCursorX
osm\DeltaCursorY=GetGadgetAttribute(#Map, #PB_Canvas_MouseY)-osm\StartCursorY
EndIf
Case #PB_EventType_LeftButtonUp
Define tx.d,ty.d
tx=(osm\DeltaCursorX/512)
ty=(osm\DeltaCursory/512)
osm\StartCursorY=0
osm\StartCursorX=0
osm\DeltaCursorX=0
osm\DeltaCursorY=0
Debug tx
move(tx,ty)
SetGadgetText(#String_1, StrD(osm\gfLongitude))
SetGadgetText(#String_0, StrD(osm\gfLatitude))
EndSelect
EndSelect
StartDrawing(CanvasOutput(#Map))
drawmap()
StopDrawing()
;}
EndSelect
Until Quit = #True
EndIf
CompilerEndIf