Openstreetmap et calcul d'itinéraire

Programmation d'applications complexes
totorcalais
Messages : 67
Inscription : mer. 27/sept./2006 12:45

Openstreetmap et calcul d'itinéraire

Message par totorcalais »

Bonjour,

J'ai en projet de mijoter une application qui calculerait les itinéraires entre plusieurs villes et faire des estimations sur le lien entre distance et temps de déplacements (carte représentant les éloignements des destinations par rapport à un point de départ).

Dans un premier temps, je m'intéresse à la possibilités de trouver les données (noms ville et géolocalisations) via openstreetmap.

J'ai vu le remarquable travail de djes et typhoon sur un autre fil avec l'intégration de cartes OSM dans un canvas (avec interaction directe avec le site) : http://forums.purebasic.fr/french/viewt ... =3&t=16160

Ca peut être un bon début pour comprendre les interactions avec le serveur. Mon but est d'obtenir les temps d'itinéraires entre villes et construire une carte à partir de cela.
OSM le permet de base (2 coordonnées géographiques).

Mes difficultés sont :
- Obtenir les villes inscrites dans une zone autour d'un point.
En interaction avec le serveur osm, je ne sais pas le type de requête permettant cela.

Par contre, j'ai déniché ce type de requete : http://www.overpass-api.de/api/xapi?node[place=*][ref:INSEE=*][bbox=-2.10049,48.4397,0.75595,49.79148][@meta]
qui me donne un fichier contenant les villes inscrites dans la zone BBOX dont voici une des données recueilles dans le ficher téléchargé:

Code : Tout sélectionner

<node id="26638997" lat="49.6679883" lon="-1.4046471" version="4" timestamp="2013-12-24T10:33:05Z" changeset="19615050" uid="10610" user="RedFox">
    <tag k="addr:postcode" v="50330"/>
    <tag k="name" v="Saint-Pierre-Église"/>
    <tag k="place" v="village"/>
    <tag k="population" v="1785"/>
    <tag k="ref:INSEE" v="50539"/>
    <tag k="source:population" v="INSEE 2013"/>
    <tag k="wikipedia" v="fr:Saint-Pierre-Église"/>
  </node>
Cela pourrait me permettre de construire ma map (qui sera retravaillée en fonction des distance (les temps les plus courts se rapprocheront du point de départ et les plus éloignés s'en écarteront suivant une échelle de temps) : (c'est le but final de mon application).

- Calculer les temps de déplacements


Il me faut désormais trouver un moyen d'interagir avec OSM à partir des coordonnées récupérées pour chaque distance et tracer mes points.
Je vais essayer également d'automatiser la récupération du fichier (construire la requete et l'envoyer via purebasic).
Je vais donc regarder de plus près le code de DJES et TYPHON mais si quelqu'un a une idée ou déjà planché sur ce point.

Merci par avance de vos conseils.
totorcalais
Messages : 67
Inscription : mer. 27/sept./2006 12:45

Re: Openstreetmap et calcul d'itinéraire

Message par totorcalais »

Salut, je me réponds à moi-même.

J'ai donc réussi (grâce à mes pérégrinations sur ce forum et à partir de ce code (voir ci-après)) à créer un programme qui travaille en deux temps:
1er temps : préparation
- Récupération par api des communes situées dans un quadrilatère (via openstreetmap)
- mise en forme du fichier jason
- création d'un fichier de travail qui contient les coordonnées lat et long, nom, code postal, population, référence insee (année du recensement).
2eme temps : calcul
- a partir du fichier de travail, récupération des informations injectées via api googlemap avec création d'un fichier json (obligation d'ajouter un délai car si cela va trop vite, le serveur bloque devant des requêtes trop proches les unes des autres).
- extraction des données temps et distance de ce fichier
- élaboration d'un fichier csv qui contient la ville de départ puis les temps/distance à partir de cette ville vers toutes les communes référencées dans le quadrilatère défini en phase 1.

Suivant la taille du quadrilatère et donc des communes à calculer, cela peut prendre quelques minutes pour finaliser l'action de la phase 2 (à cause du délai imposé). Il y a aussi un probleme de limite de requêtes journalière car je n'ai pas de key... (à voir).

Il me reste à peaufiner tout cela, optimiser le code et créer une carte anamorphe à partir de ces données. Il est possible qu'il y ait plus facile ou plus simple, mais j'ai beaucoup cherché et pas trouvé d'autres pistes sur cette recherche particulière.

Code qui m'a servi à dénouer fa faisabilité de mon projet :
Ce n'est pas mon code (mais celui trouvé dans un package intitulé HTTPGetFromWeb mais la base (je mettrai le mien dès que j'aurai fait le ménage):

Code : Tout sélectionner

IncludeFile #PB_Compiler_FilePath + "..\HTTPGetFromWeb.pb"

Define tHTTP.T_HTTP_GET
Define Temp1.String, Temp2.String
Define iRetVal

Procedure MyCallStart (*tHTTP.T_HTTP_GET, hRequest)

 Protected Text$, iCount
 Protected Buffer$ = Space(1024), iStringBufferSize = 1024
  
 Text$ = "-> MyCallStart() called ... this means the download is about to start." 
 Debug Text$
 Debug ""
 
 Text$ = "You can access all params stored in *tHTTP here."
 Debug Text$
 
 Text$ = "And you can access the handle of the HTTP request using HttpQueryInfo(), if you care."
 Debug Text$
 Debug ""
 
 ; *** Example of querying various info *** 
 
 Debug "#HTTP_QUERY_RAW_HEADERS_CRLF = "

 If (HttpQueryInfo_(hRequest, #HTTP_QUERY_RAW_HEADERS_CRLF, @Buffer$, @iStringBufferSize, #Null))
    Repeat 
        iCount + 1
        Text$ = StringField(Buffer$, iCount, #CR$)        
        If Left(Text$, 1) = #LF$        
            Text$ = Right(Text$, Len(Text$) - 1)
        EndIf            
        Debug Text$ 
        If Len(Text$) = 0: Break: EndIf
    ForEver    
 EndIf
 
 If (HttpQueryInfo_(hRequest, #HTTP_QUERY_CONTENT_TYPE, @Buffer$, @iStringBufferSize, #Null))
    Debug "HTTP_QUERY_CONTENT_TYPE = " + Buffer$    
 EndIf
 
 If (HttpQueryInfo_(hRequest, #HTTP_QUERY_CONTENT_LENGTH , @Buffer$, @iStringBufferSize, #Null))
    Debug "HTTP_QUERY_CONTENT_LENGTH = " + Buffer$    
 EndIf

 If (HttpQueryInfo_(hRequest, #HTTP_QUERY_STATUS_CODE, @Buffer$, @iStringBufferSize, #Null))
    Debug "HTTP_QUERY_STATUS_CODE = " + Buffer$    
 EndIf
 
  If (HttpQueryInfo_(hRequest, #HTTP_QUERY_STATUS_TEXT, @Buffer$, @iStringBufferSize, #Null))
    Debug "HTTP_QUERY_STATUS_TEXT = " + Buffer$    
 EndIf

 Debug ""
 Text$ = "-> MyCallStart() ends here"
 Debug Text$
 Debug ""
  
EndProcedure


Procedure MyCallEnd (*tHTTP.T_HTTP_GET, iRetVal, iBytesReceived, iSize, iElapsedTime)
 Protected Text$
 
 Text$ = "-> MyCallEnd (ErrCode = " + Str(iRetVal) + ", Bytes = " + Str(iBytesReceived) + ", Size = " + Str(iSize) + ", Elapsed = " + Str(iElapsedTime) + ")" 
 
 Debug ""
 Debug Text$
EndProcedure

 
Procedure.i MyCallWorking (*tHTTP.T_HTTP_GET, iBytesReceived, iSize, iElapsedTime)

 Protected Text$
 
 Text$ = "-> MyCallBack (Bytes = " + Str(iBytesReceived) + ", Size = " + Str(iSize) + ", Elapsed = " + Str(iElapsedTime) + ")" 
 
 If (iElapsedTime > 0)
    Text$ + " - Speed = " + Str (iBytesReceived / iElapsedTime / 1024) + " KB/sec"
 EndIf
 
 Debug Text$
 
 ProcedureReturn #True ; return #False to abort download
EndProcedure
 
 
; error 404 example
; tHTTP\URL$ = "http://www.somedomain.com/foo/bar.zip"  
 
 
; content length unknown and automatic redirection enabled example
; tHTTP\URL$ = "http://finance.yahoo.com/d/quotes.csv?s=MVC+MIDD+BWLD+AAPL&f=sl1d1t1" 

; try to test again the above URL but this time disabling redirection with
; tHTTP\iFlags = #INTERNET_FLAG_NO_UI | #INTERNET_FLAG_RELOAD | #INTERNET_FLAG_NO_AUTO_REDIRECT
 
 
tHTTP\URL$ = "http://www.purebasic.com/download/PureBasic_Demo.exe" 

tHTTP\iThreadID = 0
tHTTP\iDestination = #WEB_WRITE_TO_FILE
tHTTP\iChunkSize = 512*1024 ; 512 KB
tHTTP\fpCB_Start = @MyCallStart()
tHTTP\fpCB_Working = @MyCallWorking()
tHTTP\fpCB_End = @MyCallEnd()
tHTTP\FullFileName$ = GetTemporaryDirectory() + "PureBasic_Demo.exe"

URLGetDomain (tHTTP\URL$, @Temp1)
Debug "URLGetDomain = " + Temp1\s

URLGetFullPath (tHTTP\URL$, @Temp1)
Debug "URLGetFullPath = " + Temp1\s

URLGetBasicAuth (tHTTP\URL$, @Temp1, @Temp2)
Debug "URLGetBasicAuth = " + Temp1\s + ":" + Temp2\s

Debug  ""

iRetVal = HTTPGetFromWeb (@tHTTP)

Debug  ""

Select iRetVal
    Case #WEB_OK    
        Debug "HTTPGetFromWeb() successful."
        Debug Str(tHTTP\iTotBytesRead) + " bytes read from Internet."
        
        Select tHTTP\iDestination
            Case #WEB_WRITE_TO_MEMORY
                 Debug Str(MemorySize(tHTTP\DestBuffer)) +  " bytes currently allocated in memory."
                 
            Case #WEB_WRITE_TO_FILE
                 Debug Str(tHTTP\iTotBytesRead) + " bytes written to " + tHTTP\FullFileName$
        EndSelect

        
    Case #WEB_ERR_HTTP_OPEN                
        Debug "Error initializing the WININET.DLL API."
        
    Case #WEB_ERR_HTTP_CONNECT
        Debug "Error opening the session to the given site."
        
    Case #WEB_ERR_HTTP_SET_PROXY
        Debug "Error setting the options for the proxy server."
        
    Case #WEB_ERR_HTTP_HTTP_OPEN
        Debug "Error creating the HTTP request handle."
        
    Case #WEB_ERR_HTTP_HTTP_SEND
        Debug "Error sending the HTTP request to the server."
        
    Case #WEB_ERR_HTTP_HTTP_QUERY_STATUS
        Debug "Error retrieving the HTTP status code."
        
    Case #WEB_ERR_HTTP_READ
        Debug "Error reading data from the opened session."
        
    Case #WEB_ERR_HTTP_CLOSE
        Debug "Error closing the Internet handle."
    
    Case #WEB_ERR_HTTP_BASIC_AUTH
        Debug "Error setting the options for basic authentication."
    
    Case #WEB_ERR_HTTP_STATUS                      
        Debug "HTTP status code = " + Str(tHTTP\iErrorCodeEx)

    Case #WEB_ERR_FILE_CREATION                
        Debug "Cannot create the file " + tHTTP\FullFileName$
        
    Case #WEB_ERR_FILE_IO                      
        Debug "Error writing to the file " + tHTTP\FullFileName$

    Case #WEB_ERR_INVALID_PARAMETERS
        Debug "Check procedure parameters."
                
    Case #WEB_ERR_OUT_OF_MEMORY                        
        Debug "Out of memory." 

    Case #WEB_ERR_USER_ABORT
        Debug "Download aborted."                    
        
    Default
        Debug "Unexpected error = " + Str(iRetVal)        
EndSelect

; IDE Options = PureBasic 5.10 Beta 5 (Windows - x86)
; Folding = -
; EnableThread
; CPU = 1
; CompileSourceDirectory
; EnableBuildCount = 0
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Openstreetmap et calcul d'itinéraire

Message par djes »

C'est très bien, super ! :)
A vrai dire, c'était sur notre todo list pour PBMap, mais on n'a pas encore attaqué. Il y a beaucoup de sites de routing (voir http://wiki.openstreetmap.org/wiki/List ... es#Routing), et notamment http://project-osrm.org/. Le principe est toujours le même. Si tu veux l'intégrer à PBMap, tu es le bienvenu !
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Openstreetmap et calcul d'itinéraire

Message par Zorro »

on peut aussi utiliser Google map pour ça :)

http://www.purebasic.fr/french/viewtopi ... re#p185080
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Répondre