Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    3 indirizzi vicini da database MSSQL

    Buongiorno a tutti, tra amici abbiamo una specie di progetto (che devo sviluppare io ma mi si è grippato il cervello e non riesco a capire come svilupparlo):

    Abbiamo svariati indirizzi (via, cap, città, latitudine, longitudine) in un database SQL Server. Noi vorremmo che, tramite PHP, inserendo un indirizzo in un campo venissero estratti dal database i 3 luoghi più vicini a quell'indirizzo.... ho già una funzione che mi trova le coordinate dell'indirizzo, ma non so come impostare la query...


    Please help me

  2. #2
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,503
    Non credo che ti serva "come impostare la query", nel senso che con SQL non fai niente del genere.
    Dovresti prendere tutti gli indirizzi che hai nel db, uno per uno calcolare la distanza dall'indirizzo di riferimento mettendoli ad esempio in un array, ordinare poi tale array in base alla distanza crescente e prendere i primi 3 elementi.

    Ovviamente se hai tantissimi indirizzi non è il massimo delle prestazioni, ma se organizzi bene il db si può rimediare, per esempio se prevedi indirizzi in tutta Italia e sai che l'indirizzo di riferimento è nel Lazio, è inutile che vai a prendere indirizzi che si trovano in Lombardia da confrontare, così già restringi un bel po' le ricerche.

  3. #3
    Utente di HTML.it L'avatar di MySQL
    Registrato dal
    May 2015
    Messaggi
    729
    Soprattutto intendi "distanza" come distanza in linea d'aria, o su strada?
    Perchè nel secondo caso diventa un mezzo delirio: devi interrogare (ad esempio) google map per ottenere la distanza effettiva

  4. #4
    Quote Originariamente inviata da Alhazred Visualizza il messaggio
    Non credo che ti serva "come impostare la query", nel senso che con SQL non fai niente del genere.
    Dovresti prendere tutti gli indirizzi che hai nel db, uno per uno calcolare la distanza dall'indirizzo di riferimento mettendoli ad esempio in un array, ordinare poi tale array in base alla distanza crescente e prendere i primi 3 elementi.

    Ovviamente se hai tantissimi indirizzi non è il massimo delle prestazioni, ma se organizzi bene il db si può rimediare, per esempio se prevedi indirizzi in tutta Italia e sai che l'indirizzo di riferimento è nel Lazio, è inutile che vai a prendere indirizzi che si trovano in Lombardia da confrontare, così già restringi un bel po' le ricerche.
    Quote Originariamente inviata da MySQL Visualizza il messaggio
    Soprattutto intendi "distanza" come distanza in linea d'aria, o su strada?
    Perchè nel secondo caso diventa un mezzo delirio: devi interrogare (ad esempio) google map per ottenere la distanza effettiva
    allora, come distanza intendo x via aerea...
    ho scritto una funzione che interroga google maps e che mi restituisce le coordinate dell'indirizzo che immetto..

    e in rete ho trovato una funzione che mi restituisce la distanza x via aerea tra due punti cardinali... solo che ho parecchi indirizzi dentro al db..

    tempo fa avevo trovato una funzione che tramite ACOS-COS-SIN e RADIUS mi calcolava la distanza direttamente dal db e me li ordinava in una colonna alias.. in questo caso mi basterebbe fare la selezione dei primi tre, ma questa funzione era per MySql e io uso MSSQL

  5. #5
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,503
    Ma quindi hai anche le coordinate nel db?
    Non capisco perché prima dici che nel db ci sono, ma poi dici che devi chiederle a Google Maps.
    Se hai già le coordinate nel DB, Gooogle Maps non ti serve a niente e puoi fare con MSSQL quello che facevi in MySQL, entrambi usano SQL, ma con qualche piccola differenza, basta che ti documenti un po' per "tradurre" la query da MySQL a MSSQL.

    Questa documentazione però: su un motore di ricerca, oppure qui sul forum, ma nella sezione Database, non qui.

  6. #6
    Quote Originariamente inviata da Alhazred Visualizza il messaggio
    Ma quindi hai anche le coordinate nel db?
    Non capisco perché prima dici che nel db ci sono, ma poi dici che devi chiederle a Google Maps.
    Se hai già le coordinate nel DB, Gooogle Maps non ti serve a niente e puoi fare con MSSQL quello che facevi in MySQL, entrambi usano SQL, ma con qualche piccola differenza, basta che ti documenti un po' per "tradurre" la query da MySQL a MSSQL.

    Questa documentazione però: su un motore di ricerca, oppure qui sul forum, ma nella sezione Database, non qui.
    sisi le ho... allora mi spiego meglio:

    io ho degli indirizzi nel db con le coordinate
    una pagina web in cui inserisco un indirizzo senza cordinate

    devo:
    1) immettere l'indirizzo e questo è ok
    2) ricavare le coordinate dell'indirizzo e anche questo è ok
    3) ricavare i 3 record che siano più vicini all'indirizzo immesso

    scusate ma la notte fa troppo caldo, dormo male e la mattina sono rinc....

    ok provo a cercare nella sezione database

  7. #7
    risolto per conto mio

  8. #8
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,503
    Potresti anche dire come hai fatto in modo che se qualcuno dopo di te dovesse avere lo stesso problema possa trovare la soluzione.

  9. #9
    allora... l'utente immette l'indirizzo in una form che manda tutto a questa funzione

    Codice PHP:
    public static function  lat_long($indirizzo){        
             
    $cordinate = array();        
             if (!
    is_string($indirizzo))die("gli indirizzi devono essere mandati come stringa");             
             
    $encoding_address urlencode($indirizzo);          
             
    $GoogleAPI 'http://maps.google.com/maps/api/geocode/xml?address='.$encoding_address.'&sensor=false';          
             
    $XMLresult file_get_contents($GoogleAPI);            
             
    $XMLobject = new SimpleXMLElement($XMLresult);         
             if(
    $XMLobject->status=='OK') {
                    
    $cordinate['lat'] = $XMLobject->result->geometry->location->lat;          
                    
    $cordinate['long'] = $XMLobject->result->geometry->location->lng;        
             }        
             return 
    $cordinate;    

    poi tutto passa attraverso questa query:
    Codice PHP:
    "SELECT TOP 3 *, (6378.8 * ACOS(SIN(".$lat." / 57.2958) * SIN(lat / 57.2958) + COS(".$lat." / 57.2958) * COS(lat / 57.2958)  * COS(lon / 57.2958 - ".$long." / 57.2958))) AS distanza             FROM luoghi
            WHERE lat IS NOT NULL AND lon IS NOT NULL AND "
    .$lat.">=lat-0.9 AND ".$lat."<=lat+0.9 AND ".$long.">=lon-0.9 AND ".$long."<=lon+0.9
            AND (6378.8 * ACOS(SIN("
    .$lat." / 57.2958) * SIN(lat / 57.2958) + COS(".$lat." / 57.2958) * COS(lat / 57.2958)  * COS(lon / 57.2958 - ".$long." / 57.2958)))< 100 ORDER BY distanza ASC " 
    in pratica ho ridotto tutti i record ad un "raggio" (in realtà è un quadrato) di 100km dal luogo di partenza (ricordo che per passare dal raggio in km a radianti bisogna moltiplicare per 0,009) in modo da poter snellire le operazioni da db
    Ultima modifica di simovik90; 15-07-2015 a 10:24 Motivo: indentazione del codice

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.