OpenStreetMap embarqué dans votre application

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
MetalOS
Messages : 1492
Inscription : mar. 20/juin/2006 22:17
Localisation : Lorraine
Contact :

Re: OpenStreetMap embarqué dans votre application

Message par MetalOS »

C'est ce que j'ai fait mais je ne voie rien de particulier. Merci de ton aide djes. Si quelqu'un d'autre peut tester sur Mac OS X...
Avatar de l’utilisateur
MetalOS
Messages : 1492
Inscription : mar. 20/juin/2006 22:17
Localisation : Lorraine
Contact :

Re: OpenStreetMap embarqué dans votre application

Message par MetalOS »

Personne n'a de Mac pour faire un test ? SVP
Avatar de l’utilisateur
GallyHC
Messages : 1703
Inscription : lun. 17/déc./2007 12:44

Re: OpenStreetMap embarqué dans votre application

Message par GallyHC »

Faudrait que je rebranche mon mini mac ;), je verrais cela demain.

GallyHC
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Avatar de l’utilisateur
MetalOS
Messages : 1492
Inscription : mar. 20/juin/2006 22:17
Localisation : Lorraine
Contact :

Re: OpenStreetMap embarqué dans votre application

Message par MetalOS »

Cool merci et si ont arrive à faire fonctionner ce code il faudra le mettre sur ton site.
Avatar de l’utilisateur
MetalOS
Messages : 1492
Inscription : mar. 20/juin/2006 22:17
Localisation : Lorraine
Contact :

Re: OpenStreetMap embarqué dans votre application

Message par MetalOS »

Tu à réussi à tester GallyHC ?

De mon côté j'ai testé un autre code de Progi1984 :

http://f-lefevre.developpez.com/tutorie ... ncontacts/

Code : Tout sélectionner

Enumeration
  #Window_0
  #Listview_0
  #Button_0
  #Button_1
  #Button_2
  #Button_3
  #Button_4
  #Image_0
  #Text_0
  #Text_1
  #Text_2
  #Text_4
  #Text_5
  #Text_6
  #Text_7
  #Text_8
  #Text_9
  #Text_10
  #Text_11
  #Text_12
  #String_0
  #String_1
  #String_2
  #String_3
  #String_4
  #String_5
  #String_6
  #String_7
  #String_8
  #String_9
  #String_10
EndEnumeration

Global glDBSQLite.l
Global glListviewItemSelected.l = -1
Global glImageMemory.l

UseJPEG2000ImageDecoder()
UseJPEG2000ImageEncoder()
UseJPEGImageDecoder()
UseJPEGImageEncoder()
UsePNGImageDecoder()
UsePNGImageEncoder()

Procedure Main_WindowOpen()
  If OpenWindow(#Window_0, 200, 200, 800, 390, "DVP - Gestion de Contacts",  #PB_Window_SystemMenu | #PB_Window_TitleBar | #PB_Window_ScreenCentered )
    ListViewGadget(#Listview_0, 10, 10, 300, 370)
    ButtonGadget(#Button_0, 320, 350, 080, 30, "Reset")
    ButtonGadget(#Button_1, 400, 350, 100, 30, "Ajouter")
    ButtonGadget(#Button_2, 500, 350, 100, 30, "Mettre à jour")
    ButtonGadget(#Button_3, 600, 350, 100, 30, "Supprimer")
    ButtonGadget(#Button_4, 700, 350, 100, 30, "Parcourir")
    TextGadget(#Text_0, 320, 20, 110, 20, "Nom :")
    TextGadget(#Text_1, 320, 50, 110, 20, "Prénom : ")
    TextGadget(#Text_2, 320, 80, 110, 20, "Profession : ")
    TextGadget(#Text_4, 320, 110, 110, 20, "Société :")
    TextGadget(#Text_5, 320, 140, 110, 20, "Adresse :")
    TextGadget(#Text_6, 320, 170, 110, 20, "Code Postal :")
    TextGadget(#Text_7, 320, 200, 110, 20, "Ville :")
    TextGadget(#Text_8, 320, 230, 110, 20, "Pays :")
    TextGadget(#Text_9, 320, 260, 110, 20, "Téléphone :")
    TextGadget(#Text_10, 320, 290, 110, 20, "Fax : ")
    TextGadget(#Text_11, 320, 320, 110, 20, "Mail :")
    TextGadget(#Text_12, 620, 20, 110, 20, "Photo :")
    StringGadget(#String_0, 450, 20, 150, 20, "")
    StringGadget(#String_1, 450, 50, 150, 20, "")
    StringGadget(#String_2, 450, 80, 150, 20, "")
    StringGadget(#String_3, 450, 110, 150, 20, "")
    StringGadget(#String_4, 450, 140, 150, 20, "")
    StringGadget(#String_5, 450, 170, 150, 20, "")
    StringGadget(#String_6, 450, 200, 150, 20, "")
    StringGadget(#String_7, 450, 230, 150, 20, "")
    StringGadget(#String_8, 450, 260, 150, 20, "")
    StringGadget(#String_9, 450, 290, 150, 20, "")
    StringGadget(#String_10, 450, 320, 150, 20, "")
    ImageGadget(#Image_0, 620, 50, 160, 240, 0, #PB_Image_Border)
  EndIf
EndProcedure
Procedure DB_Init()
  Protected plFile.l
  Protected psSQLRequest.s
  UseSQLiteDatabase()
  If FileSize(#PB_Compiler_FilePath+"GestionContacts.sqlite") < 0
    plFile = CreateFile(#PB_Any, #PB_Compiler_FilePath+"GestionContacts.sqlite")
    If plFile
      CloseFile(plFile)
    EndIf
  EndIf
  
  glDBSQLite = OpenDatabase(#PB_Any, #PB_Compiler_FilePath+"GestionContacts.sqlite", "", "", #PB_Database_SQLite)
  If glDBSQLite = 0
    MessageRequester("DVP - Gestion de Contacts", DatabaseError())
    End
  ElseIf plFile
    psSQLRequest = "CREATE TABLE IF NOT EXISTS contacts ("
    psSQLRequest + "id_contact INTEGER PRIMARY KEY AUTOINCREMENT Not NULL, "
    psSQLRequest + "contact_nom TEXT Not NULL, "
    psSQLRequest + "contact_prenom TEXT Not NULL, "
    psSQLRequest + "contact_job TEXT, "
    psSQLRequest + "contact_company TEXT, "
    psSQLRequest + "contact_address TEXT, "
    psSQLRequest + "contact_postalcode TEXT, "
    psSQLRequest + "contact_city TEXT, "
    psSQLRequest + "contact_country TEXT, "
    psSQLRequest + "contact_phone TEXT, "
    psSQLRequest + "contact_fax TEXT, "
    psSQLRequest + "contact_mail TEXT, "
    psSQLRequest + "contact_photo BLOB, "
    psSQLRequest + "contact_photo_size INTEGER"
    psSQLRequest + ")"
    ; Debug psSQLRequest
    If DatabaseUpdate(glDBSQLite, psSQLRequest) = 0
      MessageRequester("DVP - Gestion de Contacts - DB_Init()", DatabaseError())
    EndIf
  EndIf
  
  If DatabaseQuery(glDBSQLite, "SELECT * FROM contacts") <> 0
    While NextDatabaseRow(glDBSQLite)
      AddGadgetItem(#Listview_0, CountGadgetItems(#Listview_0), GetDatabaseString(glDBSQLite, 1) + " " + GetDatabaseString(glDBSQLite, 2))
      SetGadgetItemData(#Listview_0, CountGadgetItems(#Listview_0)-1, GetDatabaseLong(glDBSQLite, 0))
    Wend
    FinishDatabaseQuery(glDBSQLite)
  EndIf
EndProcedure
Procedure DB_InsertContact()
  Protected psSQLRequest.s
  psSQLRequest = "INSERT INTO contacts"
  psSQLRequest + "(contact_nom, contact_prenom, contact_job, contact_company, contact_address, "
  psSQLRequest + "contact_postalcode, contact_city, contact_country, contact_phone, contact_fax, contact_mail, contact_photo, contact_photo_size)"
  psSQLRequest + "VALUES ("
  psSQLRequest + "'"+GetGadgetText(#String_0)+"',"
  psSQLRequest + "'"+GetGadgetText(#String_1)+"',"
  psSQLRequest + "'"+GetGadgetText(#String_2)+"',"
  psSQLRequest + "'"+GetGadgetText(#String_3)+"',"
  psSQLRequest + "'"+GetGadgetText(#String_4)+"',"
  psSQLRequest + "'"+GetGadgetText(#String_5)+"',"
  psSQLRequest + "'"+GetGadgetText(#String_6)+"',"
  psSQLRequest + "'"+GetGadgetText(#String_7)+"',"
  psSQLRequest + "'"+GetGadgetText(#String_8)+"',"
  psSQLRequest + "'"+GetGadgetText(#String_9)+"',"
  psSQLRequest + "'"+GetGadgetText(#String_10)+"',"
  psSQLRequest + "?,"
  If glImageMemory
    psSQLRequest + Str(MemorySize(glImageMemory))
  Else
    psSQLRequest + "0"
  EndIf
  psSQLRequest + ")"
  ;Debug psSQLRequest
  If glImageMemory
    SetDatabaseBlob(glDBSQLite, 0, glImageMemory, MemorySize(glImageMemory))
  Else
    ReplaceString(psSQLRequest, "?", "'0'")
  EndIf
  If DatabaseUpdate(glDBSQLite, psSQLRequest) = 0
    MessageRequester("DVP - Gestion de Contacts - DB_InsertContact()", DatabaseError())
  EndIf
  
  ; Ajoute le dernier element ajouté à la base
  If DatabaseQuery(glDBSQLite, "SELECT max(id_contact), contact_nom, contact_prenom FROM contacts") <> 0
    While NextDatabaseRow(glDBSQLite)
      AddGadgetItem(#Listview_0, CountGadgetItems(#Listview_0), GetDatabaseString(glDBSQLite, 1) + " " + GetDatabaseString(glDBSQLite, 2))
      SetGadgetItemData(#Listview_0, CountGadgetItems(#Listview_0)-1, GetDatabaseLong(glDBSQLite, 0))
    Wend
    FinishDatabaseQuery(glDBSQLite)
  Else
    MessageRequester("DVP - Gestion de Contacts - DB_InsertContact", DatabaseError())
  EndIf
EndProcedure
Procedure DB_SelectContact(GadgetItem.l)
  Protected psSQLRequest.s
  Protected plFileImageSize.l
  Protected plFileImage.l
  psSQLRequest = "SELECT * FROM contacts WHERE id_contact="+Str(GetGadgetItemData(#Listview_0, GadgetItem))
  ;Debug psSQLRequest
  If DatabaseQuery(glDBSQLite, psSQLRequest) <> 0
    While NextDatabaseRow(glDBSQLite)
      SetGadgetText(#String_0, GetDatabaseString(glDBSQLite, 1))
      SetGadgetText(#String_1, GetDatabaseString(glDBSQLite, 2))
      SetGadgetText(#String_2, GetDatabaseString(glDBSQLite, 3))
      SetGadgetText(#String_3, GetDatabaseString(glDBSQLite, 4))
      SetGadgetText(#String_4, GetDatabaseString(glDBSQLite, 5))
      SetGadgetText(#String_5, GetDatabaseString(glDBSQLite, 6))
      SetGadgetText(#String_6, GetDatabaseString(glDBSQLite, 7))
      SetGadgetText(#String_7, GetDatabaseString(glDBSQLite, 8))
      SetGadgetText(#String_8, GetDatabaseString(glDBSQLite, 9))
      SetGadgetText(#String_9, GetDatabaseString(glDBSQLite, 10))
      SetGadgetText(#String_10, GetDatabaseString(glDBSQLite, 11))
      plFileImageSize = GetDatabaseLong(glDBSQLite, 13)
      If plFileImageSize > 0
        glImageMemory = AllocateMemory(plFileImageSize)
        GetDatabaseBlob(glDBSQLite, 12, glImageMemory, plFileImageSize)
        plFileImage = CatchImage(#PB_Any, glImageMemory, plFileImageSize)
        If plFileImage
          ResizeImage(plFileImage, 160, 240)
          SetGadgetState(#Image_0, ImageID(plFileImage))
          FreeImage(plFileImage) 
        EndIf
      Else
        SetGadgetState(#Image_0, 0)
      EndIf
    Wend
    FinishDatabaseQuery(glDBSQLite)
  Else
    MessageRequester("DVP - Gestion de Contacts - DB_SelectContact", DatabaseError())
  EndIf
EndProcedure
Procedure DB_UpdateContact(GadgetItem.l)
  Protected psSQLRequest.s
  psSQLRequest = "UPDATE contacts SET "
  psSQLRequest + "contact_nom='"+GetGadgetText(#String_0)+"', "
  psSQLRequest + "contact_prenom='"+GetGadgetText(#String_1)+"', "
  psSQLRequest + "contact_job='"+GetGadgetText(#String_2)+"', "
  psSQLRequest + "contact_company='"+GetGadgetText(#String_3)+"', "
  psSQLRequest + "contact_address='"+GetGadgetText(#String_4)+"', "
  psSQLRequest + "contact_postalcode='"+GetGadgetText(#String_5)+"', "
  psSQLRequest + "contact_city='"+GetGadgetText(#String_6)+"', "
  psSQLRequest + "contact_country='"+GetGadgetText(#String_7)+"', "
  psSQLRequest + "contact_phone='"+GetGadgetText(#String_8)+"', "
  psSQLRequest + "contact_fax='"+GetGadgetText(#String_9)+"', "
  psSQLRequest + "contact_mail='"+GetGadgetText(#String_10)+"', "
  psSQLRequest + "contact_photo = ?,"
  If glImageMemory
    psSQLRequest + "contact_photo_size = " + Str(MemorySize(glImageMemory))
  Else
    psSQLRequest + "contact_photo_size = 0"
  EndIf
  psSQLRequest + " WHERE id_contact="+Str(GetGadgetItemData(#Listview_0, GadgetItem))
  ;Debug psSQLRequest
  If glImageMemory
    SetDatabaseBlob(glDBSQLite, 0, glImageMemory, MemorySize(glImageMemory))
  Else
    ReplaceString(psSQLRequest, "?", "'0'")
  EndIf
  If DatabaseUpdate(glDBSQLite, psSQLRequest) = 0
    MessageRequester("DVP - Gestion de Contacts - DB_UpdateContact()", DatabaseError())
  Else
    SetGadgetItemText(#Listview_0, GadgetItem, GetGadgetText(#String_0)+" "+GetGadgetText(#String_1))
  EndIf
EndProcedure
Procedure DB_DeleteContact(GadgetItem.l)
  Protected psSQLRequest.s
  psSQLRequest = "DELETE FROM contacts WHERE id_contact="+Str(GetGadgetItemData(#Listview_0, GadgetItem))
  ;Debug psSQLRequest
  If DatabaseUpdate(glDBSQLite, psSQLRequest) = 0
    MessageRequester("DVP - Gestion de Contacts - DB_DeleteContact()", DatabaseError())
  Else
    RemoveGadgetItem(#Listview_0, GadgetItem)
  EndIf
EndProcedure

Main_WindowOpen()
DB_Init()

Repeat
  glEvent = WaitWindowEvent()
  glGadget= EventGadget()
  glType = EventType()
  If glEvent = #PB_Event_Gadget
    Select glGadget
      Case #Listview_0 ;{
        If GetGadgetState(#Listview_0) >= 0 And GetGadgetState(#Listview_0) <= CountGadgetItems(#Listview_0)
          If GetGadgetState(#Listview_0) <> glListviewItemSelected
            glListviewItemSelected = GetGadgetState(#Listview_0)
            DB_SelectContact(GetGadgetState(#Listview_0))
          EndIf
        EndIf
      ;}
      Case #Button_0 ;{ Reset
        If glType = #PB_EventType_LeftClick
          Define.l dlInc
          For dlInc = #String_0 To #String_10
            SetGadgetText(dlInc, "")
          Next
          SetGadgetState(#Image_0, 0)
          If glImageMemory
            FreeMemory(glImageMemory)
            glImageMemory = 0
          EndIf
          glListviewItemSelected = -1
        EndIf
      ;}
      Case #Button_1 ;{ Ajouter
        If GetGadgetText(#String_0) <> "" And GetGadgetText(#String_1) <> ""
          If glType = #PB_EventType_LeftClick
            DB_InsertContact()
          EndIf
        EndIf
      ;}
      Case #Button_2 ;{ Mettre à jour
        If GetGadgetState(#Listview_0) >= 0 And GetGadgetState(#Listview_0) <= CountGadgetItems(#Listview_0)-1
          If glType = #PB_EventType_LeftClick
            DB_UpdateContact(GetGadgetState(#Listview_0))
          EndIf
        EndIf
      ;}
      Case #Button_3 ;{ Supprimer
        If GetGadgetState(#Listview_0) >= 0 And GetGadgetState(#Listview_0) <= CountGadgetItems(#Listview_0)-1
          If glType = #PB_EventType_LeftClick
            If MessageRequester("DVP - Gestion de Contacts", "Voulez vous vraiment supprimer le contact courant "+Chr(34)+GetGadgetItemText(#Listview_0, GetGadgetState(#Listview_0))+Chr(34)+" ?", #PB_MessageRequester_YesNo) = #PB_MessageRequester_Yes
              DB_DeleteContact(GetGadgetState(#Listview_0))
            EndIf
          EndIf
        EndIf
      ;}
      Case #Button_4 ;{ Parcourir
        Define.s psFileImage
        Define.l plFileImage
        ; Ouvre une boîte de dialogue standard pour choisir une image
        psFileImage = OpenFileRequester("Choisissez une image à charger", "", "Fichiers Images|*.png;*.bmp;*.jpg;*.jpeg|Tous les fichiers (*.*)|*.*", 0)
        If psFileImage
          ; Charge une image
          plFileImage = LoadImage(#PB_Any, psFileImage)
          If plFileImage
            ; Redimensionne l'image à la taille de l'ImageGadget
            ResizeImage(plFileImage, 160, 240)
            ; Change l'image affichée par l' ImageGadget
            SetGadgetState(#Image_0, ImageID(plFileImage))
            ; Libère l'image
            FreeImage(plFileImage)
            ; Charge l'image dans la zone mémoire globale dédiée 'glImageMemory'
            plFileImage = OpenFile(#PB_Any, psFileImage)
            If plFileImage
              glImageMemory = AllocateMemory(Lof(plFileImage))
              If glImageMemory 
                ReadData(plFileImage, glImageMemory, Lof(plFileImage))
              EndIf
              CloseFile(plFileImage)
            EndIf
          EndIf
        EndIf
      ;}
    EndSelect
  EndIf
Until glEvent = #PB_Event_CloseWindow
End 
Sur la gestion d'une base de données SQLite et j'ai le même problème. Soit la facon de coder sur PB5.22 LTS n'est plus la même soit il y à un bogue sur la version Mac de PB.

Franchement je ne voie pas.

PS: Je vient de tester sur PB 5.30 béta (x64) et j'ai le même problème.
Avatar de l’utilisateur
Mindphazer
Messages : 639
Inscription : mer. 24/août/2005 10:42

Re: OpenStreetMap embarqué dans votre application

Message par Mindphazer »

Je viens de tester
Ca fonctionne très bien sur PC, et j'ai le même problème que toi sur Mac
J'ai résolu en enlevant .l à la déclaration de plFile et glDBSQLite

J'imagine que sur OSX les .l ne sont pas gérés de la même manière que sur Windows....
Bureau : Win10 64bits
Maison : Macbook Pro M1 14" SSD 512 Go / Ram 16 Go - iPad Pro 32 Go (pour madame) - iPhone 15 Pro Max 256 Go
Avatar de l’utilisateur
MetalOS
Messages : 1492
Inscription : mar. 20/juin/2006 22:17
Localisation : Lorraine
Contact :

Re: OpenStreetMap embarqué dans votre application

Message par MetalOS »

Effectivement j'ai retirer aussi les .l et le code fonctionne. J'ai donc essayer sur le code d'OpenStreetMap et je n'est plus le problème de la base de données mais le compilateur me donne maintenant une erreur sur la ligne 149 du fichier RW_LibCurl_Inc.pb.

Code : Tout sélectionner

*LibCurl_NewMemory = AllocateMemory(MemorySize(*LibCurl_SharedMem))
Message du compilateur:
L'argument '*MemoryID' spécifié est nul.
Avatar de l’utilisateur
MetalOS
Messages : 1492
Inscription : mar. 20/juin/2006 22:17
Localisation : Lorraine
Contact :

Re: OpenStreetMap embarqué dans votre application

Message par MetalOS »

Je laisse tombé ce code me rend fou, je passe à autre chose. Merci à tous ceux qui m'on aidés :wink:
Avatar de l’utilisateur
MetalOS
Messages : 1492
Inscription : mar. 20/juin/2006 22:17
Localisation : Lorraine
Contact :

Re: OpenStreetMap embarqué dans votre application

Message par MetalOS »

Je me suis remis sur ce code et j'ai enfin réussi à corriger toutes les erreurs que me donne le compilateur. Il me reste un seul soucis...rien ne s'affiche au niveau carte alors que tous semble fonctionner.

Voici une capture du problème :

Image

Quelqu'un aurait une idée ?
Avatar de l’utilisateur
MetalOS
Messages : 1492
Inscription : mar. 20/juin/2006 22:17
Localisation : Lorraine
Contact :

Re: OpenStreetMap embarqué dans votre application

Message par MetalOS »

Personne pour une petite idée ?
Avatar de l’utilisateur
MetalOS
Messages : 1492
Inscription : mar. 20/juin/2006 22:17
Localisation : Lorraine
Contact :

Re: OpenStreetMap embarqué dans votre application

Message par MetalOS »

Je relance le sujet au cas ou quelqu'un aurai une idée du problème. Merci d'avance.
Avatar de l’utilisateur
MetalOS
Messages : 1492
Inscription : mar. 20/juin/2006 22:17
Localisation : Lorraine
Contact :

Re: OpenStreetMap embarqué dans votre application

Message par MetalOS »

Personne n'a trouvé de solution pour embarquer OpenStreetMap dans un programme. Ca serais cool un MapGadget() qui utilise OpenStreetMap en natif dans PB. Peut être voir du côté de Mapnik http://mapnik.org/ mais il faut toucher en c++.
Avatar de l’utilisateur
Thyphoon
Messages : 2697
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Re: OpenStreetMap embarqué dans votre application

Message par Thyphoon »

code mis a jour a ma sauce pour faire des testes ...

Code : Tout sélectionner

;@author Progi1984
;@changelog 1.0 24/08/09 Initial release (cache, zoom, moving, layers)
;@changelog 1.1 31/08/09 ADDED : Mimize Window
;@+                   ADDED : Zoom with click on the ImageGadget
;@thanks akj (http://www.purebasic.fr/english/profile.php?mode=viewprofile&u=292) for ideas and bug reporting
;@thanks netmaestro (http://www.purebasic.fr/english/profile.php?mode=viewprofile&u=1912) for tests (Vista) and bug reporting
;@misc : Prerequisites : For Windows, http://www.microsoft.com/downloads/details.aspx?FamilyID=a5c84275-3b97-4ab7-a40d-3802b2af5fc2&displaylang=en
;@changelog by thyphoon remove curl dependencies and add latitude/longitude gadget edit

InitNetwork()
IncludePath ""

UsePNGImageDecoder()
UseSQLiteDatabase()
EnableExplicit
Enumeration
  #Window_0
  #Image_0
  #Image_1
  #Image_2
  #Image_3
  #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
#_DQ_ = Chr(34)
Global gfLatitude.d   = 49.0422777
Global gfLongitude.d  = 2.035566
Global gfxTile.f
Global gfyTile.f
Global glZoom.l       = 17
Global glLayerCur.l   = 0
Global glSQLiteDB.l
Global gsSQLiteDBPath.s = ""
Global glGadget.l
Global glEvent.l
Global glQuit.l

Structure S_OSM_Layers
  sName.s
  sURL.s
  lZoomMin.l
  lZoomMax.l
EndStructure
#OSM_Layers_Num = 5
Global Dim OSM_Layers_Dim.S_OSM_Layers(#OSM_Layers_Num)
OSM_Layers_Dim(0)\sName     = "OSM Mapnik"
OSM_Layers_Dim(0)\sURL      = "http://tile.openstreetmap.org/"
OSM_Layers_Dim(0)\lZoomMin  = 0
OSM_Layers_Dim(0)\lZoomMax  = 18
OSM_Layers_Dim(1)\sName     = "OSM Osmarender/Tiles@Home"
OSM_Layers_Dim(1)\sURL      = "http://tah.openstreetmap.org/Tiles/tile/"
OSM_Layers_Dim(1)\lZoomMin  = 0
OSM_Layers_Dim(1)\lZoomMax  = 17
OSM_Layers_Dim(2)\sName     = "OSM Cycle Map"
OSM_Layers_Dim(2)\sURL      = "http://andy.sandbox.cloudmade.com/tiles/cycle/"
OSM_Layers_Dim(2)\lZoomMin  = 0
OSM_Layers_Dim(2)\lZoomMax  = 18
OSM_Layers_Dim(3)\sName     = "OSM Maplint"
OSM_Layers_Dim(3)\sURL      = "http://tah.openstreetmap.org/Tiles/maplint/"
OSM_Layers_Dim(3)\lZoomMin  = 12
OSM_Layers_Dim(3)\lZoomMax  = 16
OSM_Layers_Dim(4)\sName     = "NPE out-of-copyright map "
OSM_Layers_Dim(4)\sURL      = "http://richard.dev.openstreetmap.org/npe/"
OSM_Layers_Dim(4)\lZoomMin  = 13
OSM_Layers_Dim(4)\lZoomMax  = 15


Define.f pfValue

;@desc Open the main window
;@author Progi1984
Procedure WindowMain_Open()
  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)
  
    ImageGadget(#Image_0, 10, 10, 256, 256, 0)
    ImageGadget(#Image_1, 266, 10, 256, 256, 0)
    ImageGadget(#Image_2, 10, 266, 256, 256, 0)
    ImageGadget(#Image_3, 266, 266, 256, 256, 0)
    
    TextGadget(#Text_0, 530, 10, 60, 15, "Layers :")
    ComboBoxGadget(#Combo_0, 550, 30, 130, 20)
      AddGadgetItem(#Combo_0, 0, OSM_Layers_Dim(0)\sName)
      AddGadgetItem(#Combo_0, 1, OSM_Layers_Dim(1)\sName)
      AddGadgetItem(#Combo_0, 2, OSM_Layers_Dim(2)\sName)
      AddGadgetItem(#Combo_0, 3, OSM_Layers_Dim(3)\sName)
      AddGadgetItem(#Combo_0, 4, OSM_Layers_Dim(4)\sName)
      SetGadgetState(#Combo_0, 0)
    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(gfLatitude))
    TextGadget(#Text_4, 530, 250, 60, 15, "Longitude :")
    StringGadget(#String_1, 600, 250, 90, 20, StrD(gfLongitude))
  EndIf
EndProcedure
;@desc Permits to translate XY Coordinates to Lon/Lat Coordinates
;@author Progi1984
Procedure OSM_LatLon2XY()
  Protected n.l = Pow(2, glZoom)
  gfxTile = Int(((gfLongitude + 180) / 360) * n)
  gfyTile = Int((1-(Log(Tan(gfLatitude * #PI / 180)+(1/Cos(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, glZoom)
  Protected pfLatitudeRad.f
  gfLongitude   = gfxTile / n * 360.0 - 180.0
  pfLatitudeRad = ATan(SinH(#PI * (1 - 2 * gfyTile / n)))
  gfLatitude    = pfLatitudeRad * 180.0 / #PI
  SetGadgetText(#String_0,StrD(gfLatitude))
  SetGadgetText(#String_1,StrD(gfLongitude))
EndProcedure
;@desc Draws 4 subtiles for the XY Coordinates
;@author Progi1984
Macro OSM_GetSquareTile()
  Debug "======"
  OSM_GetImage(0, glZoom+1,2*gfxTile  ,2*gfyTile)
  OSM_GetImage(1, glZoom+1,2*gfxTile+1,2*gfyTile)
  OSM_GetImage(2, glZoom+1,2*gfxTile  ,2*gfyTile+1)
  OSM_GetImage(3, glZoom+1,2*gfxTile+1,2*gfyTile+1)
  Debug "======"
EndMacro
Macro OSM_TestXYCoordinates(_CoordTile_, _Inc_, _Test_)
  pfValue = _CoordTile_ _Inc_ 0.5
  If pfValue _Test_ 
    _CoordTile_ = Pow(2, glZoom) - 2
  Else
    _CoordTile_ = pfValue
  EndIf
EndMacro
Procedure OSM_GetImage(Image.l, Zoom.l, XTile.l, YTile.l)
  Protected plMemory.l
  Protected psURL.s = OSM_Layers_Dim(glLayerCur)\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
  DatabaseQuery(glSQLiteDB, "SELECT * FROM cache WHERE cache_layer="+#_DQ_+Str(glLayerCur)+#_DQ_+" AND cache_zoom="+#_DQ_+Str(Zoom)+#_DQ_+" AND cache_x="+#_DQ_+Str(XTile)+#_DQ_+" AND cache_y="+#_DQ_+Str(YTile)+#_DQ_+"")
  If FirstDatabaseRow(glSQLiteDB)
    Debug "CACHE : "+Str(glLayerCur)+"\"+Str(Zoom)+"\"+Str(XTile)+"\"+Str(Ytile)
    plImageSize = GetDatabaseLong(glSQLiteDB,6)
    If plImageSize
      plImageMem = AllocateMemory(plImageSize)
      GetDatabaseBlob(glSQLiteDB, 5, plImageMem, plImageSize)
      FinishDatabaseQuery(glSQLiteDB)
      If IsImage(Image)
        FreeImage(Image)
      EndIf
      If CatchImage(Image, plImageMem)
        SetGadgetState(#Image_0+Image, ImageID(Image))
        FreeMemory(plImageMem)
      EndIf
      pbImageOK = #True
    EndIf
  Else
    Debug DatabaseError()
  EndIf
  If pbImageOK = #False
    Debug "DOWNLOAD : "+Str(glLayerCur)+"\"+Str(Zoom)+"\"+Str(XTile)+"\"+Str(Ytile)
    plMemory = ReceiveHTTPMemory(psURL)
    If plMemory
      psSQLRequest = "INSERT INTO cache(cache_layer, cache_zoom, cache_x, cache_y, cache_image, cache_imagesize) VALUES ("
      psSQLRequest + Str(glLayerCur)+","
      psSQLRequest + Str(Zoom)+","
      psSQLRequest + Str(XTile)+","
      psSQLRequest + Str(YTile)+","
      psSQLRequest + "?,"
      psSQLRequest + Str(MemorySize(plMemory))+")"
      SetDatabaseBlob(glSQLiteDB, 0, plMemory, MemorySize(plMemory))
      plRes = DatabaseUpdate(glSQLiteDB, psSQLRequest)
      If plRes = 0
        Debug psSQLRequest
        Debug DatabaseError()
      EndIf
      If IsImage(Image)
        FreeImage(Image)
      EndIf
      If CatchImage(Image, plMemory, MemorySize(plMemory))
        SetGadgetState(#Image_0+Image, ImageID(Image))
        FreeMemory(plMemory)
      EndIf
    EndIf
  EndIf
EndProcedure
Procedure OSM_CacheInit()
  Protected psSQLRequest.s
  If gsSQLiteDBPath = ""
    gsSQLiteDBPath = GetCurrentDirectory()+"OSMCache.sqlite"
  EndIf
  If FileSize(gsSQLiteDBPath) <= 0
    If CreateFile(0, gsSQLiteDBPath)
      CloseFile(0)
    EndIf
    glSQLiteDB = OpenDatabase(#PB_Any, gsSQLiteDBPath, "", "")
    If glSQLiteDB
      psSQLRequest = "CREATE  TABLE "+#_DQ_+"main"+#_DQ_+"."+#_DQ_+"cache"+#_DQ_+" ("
      psSQLRequest + #_DQ_+"id_cache"+#_DQ_+" INTEGER PRIMARY KEY  AUTOINCREMENT  Not NULL , "
      psSQLRequest + #_DQ_+"cache_layer"+#_DQ_+" INTEGER Not NULL  Default 0, "
      psSQLRequest + #_DQ_+"cache_zoom"+#_DQ_+" INTEGER Not NULL , "
      psSQLRequest + #_DQ_+"cache_x"+#_DQ_+" INTEGER Not NULL , "
      psSQLRequest + #_DQ_+"cache_y"+#_DQ_+"  INTEGER Not NULL , "
      psSQLRequest + #_DQ_+"cache_image"+#_DQ_+" BLOB, "
      psSQLRequest + #_DQ_+"cache_imagesize"+#_DQ_+"  INTEGER Not NULL"
      psSQLRequest + ")"
      DatabaseUpdate(glSQLiteDB, psSQLRequest)
    EndIf
  Else
    glSQLiteDB = OpenDatabase(#PB_Any, gsSQLiteDBPath, "", "")
  EndIf  
EndProcedure

  WindowMain_Open()
  ; Init DB
  OSM_CacheInit()
  ; Init Map
  OSM_LatLon2XY()
  OSM_GetSquareTile()
  
  
  Repeat
    glEvent = WaitWindowEvent()
    Select glEvent
      Case #PB_Event_CloseWindow : glQuit = 1
      Case #PB_Event_Gadget ;{
        glGadget = EventGadget()
        Select glGadget
          Case #Button_0 ;{ To left
            OSM_TestXYCoordinates(gfxTile, -, < 0)
            OSM_GetSquareTile()
            OSM_XY2LatLon()
            SetGadgetText(#String_1, StrF(gfLongitude))
          ;}
          Case #Button_1 ;{ To Right
            OSM_TestXYCoordinates(gfxTile, +,> Pow(2, glZoom) - 1)
            OSM_GetSquareTile()
            OSM_XY2LatLon()
            SetGadgetText(#String_1, StrF(gfLongitude))
          ;}
          Case #Button_2 ;{ To Top
            OSM_TestXYCoordinates(gfyTile, -, < 0)
            OSM_GetSquareTile()
            OSM_XY2LatLon()
            SetGadgetText(#String_0, StrF(gfLatitude))
          ;}
          Case #Button_3 ;{ To Bottom
            OSM_TestXYCoordinates(gfyTile, +, > Pow(2, glZoom) - 1)
            OSM_GetSquareTile()
            OSM_XY2LatLon()
            SetGadgetText(#String_0, StrF(gfLatitude))
          ;}
          Case #Button_4 ;{ Zoom +
            If glZoom < OSM_Layers_Dim(glLayerCur)\lZoomMax
              glZoom + 1
              OSM_LatLon2XY()
              OSM_GetSquareTile()
            EndIf
          ;}
          Case #Button_5 ;{ Zoom -
            If glZoom > OSM_Layers_Dim(glLayerCur)\lZoomMin
              glZoom - 1
              OSM_LatLon2XY()
              OSM_GetSquareTile()
            EndIf
          ;}
          Case #Combo_0  ;{ Layers
            pfValue = GetGadgetState(#Combo_0)
            If pfValue >= 0 And pfValue < #OSM_Layers_Num And pfValue <> glLayerCur
              ; Current Layer
              glLayerCur = pfValue
              ; Zoom
              If glZoom < OSM_Layers_Dim(glLayerCur)\lZoomMin
                glZoom = OSM_Layers_Dim(glLayerCur)\lZoomMin +1
              EndIf
              If glZoom > OSM_Layers_Dim(glLayerCur)\lZoomMax
                glZoom = OSM_Layers_Dim(glLayerCur)\lZoomMax
              EndIf
              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
            gfLatitude=ValD(GetGadgetText(#String_0))
            gfLongitude=ValD(GetGadgetText(#String_1))
             OSM_LatLon2XY()
             OSM_GetSquareTile()
 
        EndSelect
      ;}
    EndSelect
  Until glQuit = 1

Avatar de l’utilisateur
MetalOS
Messages : 1492
Inscription : mar. 20/juin/2006 22:17
Localisation : Lorraine
Contact :

Re: OpenStreetMap embarqué dans votre application

Message par MetalOS »

Je test dès que je trouve du temps de libre. Merci
Avatar de l’utilisateur
Thyphoon
Messages : 2697
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Re: OpenStreetMap embarqué dans votre application

Message par Thyphoon »

MetalOS a écrit :Je test dès que je trouve du temps de libre. Merci
j'ai ouvert un autre sujet a propos de OpenStreetMap car j'essaye aussi de mon côté de faire un module utilisable de partout
http://www.purebasic.fr/french/viewtopi ... =3&t=16160
Répondre