Problema Cluster

mauro1388

Nuovo Utente
28 Ago 2012
7
0
0
salve a tutti
devo fare un progetto e ho un problema:
ho delle città con coordinate (latitudine,longitudine)

mi è stato chiesto di raggrupparle in cluster (per vicinanza). In pratica vari gruppi, contenenti le città "vicine". Posso passare un parametro (es. 10 km, in ogni gruppo ci sono le città vicine 10 km)

mi è stato consigliato di usare il clustering gerarchico http://it.wikipedia.org/wiki/Clustering

e per fare questa cosa devo usare viste materializzate (o tabelle)

solo che non ho idea, non so nemmeno da dove iniziare.

è un progetto che ho praticamente finito, mi manca solo quest'ultima parte

grazie dell'aiuto
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
ciao se non ho capito male
credo che per prima cosa sia da calcolare la distanza tra i punti.
prova questa funzione (l'ho buttata giù al volo anche scopiazzando, è un pezzo che non uso la trigonometria) mettendo delle coordinate reali e verificando se (salvo arrotondamenti) di da la distanza giusta.
cioè calcolando la distanza su una cartina tra due punti ed inserendo le loro coordinate

PHP:
<?php
//latA, lonA, latB, lonB = latitudine e longitudine espressa in gradi decimali
function trova_distanza($latA, $lonA, $latB, $lonB){
	define("RAGGIO", 6371);// raggio terrestre in km
	define("PIGRECO", 3.1415927);
	//conversione degli angoli decimali in radianti
	$latA= PIGRECO * $latA /180;
	$lonA= PIGRECO * $lonA /180;
	$latB= PIGRECO * $latB /180;
	$lonB= PIGRECO * $lonB /180;
	//calcolo l'angolo compreso
	$phi=abs($lonA-$lonB);
	//calcolo lato trinagolo
	$lato=acos(sin($latA)*sin($latB) + cos($latA)*cos($latB)*cos($phi));//questo può essere il punto da riguardare
	//calcolo la distanza sulla superficie
	$d=$lato*RAGGIO;
	return number_format($d, 3);//distanza in km con tre cifre decimali
}
?>
poi proveremo (se riesco) il raggruppamento
 

mauro1388

Nuovo Utente
28 Ago 2012
7
0
0
ciao se non ho capito male
credo che per prima cosa sia da calcolare la distanza tra i punti.
prova questa funzione (l'ho buttata giù al volo anche scopiazzando, è un pezzo che non uso la trigonometria) mettendo delle coordinate reali e verificando se (salvo arrotondamenti) di da la distanza giusta.
cioè calcolando la distanza su una cartina tra due punti ed inserendo le loro coordinate

PHP:
<?php
//latA, lonA, latB, lonB = latitudine e longitudine espressa in gradi decimali
function trova_distanza($latA, $lonA, $latB, $lonB){
	define("RAGGIO", 6371);// raggio terrestre in km
	define("PIGRECO", 3.1415927);
	//conversione degli angoli decimali in radianti
	$latA= PIGRECO * $latA /180;
	$lonA= PIGRECO * $lonA /180;
	$latB= PIGRECO * $latB /180;
	$lonB= PIGRECO * $lonB /180;
	//calcolo l'angolo compreso
	$phi=abs($lonA-$lonB);
	//calcolo lato trinagolo
	$lato=acos(sin($latA)*sin($latB) + cos($latA)*cos($latB)*cos($phi));//questo può essere il punto da riguardare
	//calcolo la distanza sulla superficie
	$d=$lato*RAGGIO;
	return number_format($d, 3);//distanza in km con tre cifre decimali
}
?>
poi proveremo (se riesco) il raggruppamento

Si questa funzione già l'ho implementata e funziona

il problema è raggruppamento. Ho N città,ho un paramentro (es 10 km) e devo creare gruppi con città che stan vicino al massimo di 10 km.

ho pensato a k-means però li gli passo il numero di gruppi che voglio e lui me li suddivide, ma nn voglio questo. voglio appunto che mi crei lui i gruppi in base alle distanze
 

alessandro1997

Utente Attivo
6 Ott 2009
5.302
1
0
26
Roma
alessandro1997.netsons.org
L'algoritmo dovrebbe essere simile a questo. Creerà un gruppo per ogni città:
PHP:
<?php
// http://snipplr.com/view/2531/
function distance($lat1, $lng1, $lat2, $lng2, $miles = true)
{
    $pi80 = M_PI / 180;
    $lat1 *= $pi80;
    $lng1 *= $pi80;
    $lat2 *= $pi80;
    $lng2 *= $pi80;
     
    $r = 6372.797;
    $dlat = $lat2 - $lat1;
    $dlng = $lng2 - $lng1;
    $a = sin($dlat / 2) * sin($dlat / 2) + cos($lat1) * cos($lat2) * sin($dlng / 2) * sin($dlng / 2);
    $c = 2 * atan2(sqrt($a), sqrt(1 - $a));
    $km = $r * $c;
     
    return ($miles ? ($km * 0.621371192) : $km);
}

$groups = array();

// supponendo che $cities contenga le città

foreach ($cities as $city) {
    $groups[$city['id']] = array();
    $cities2 = $cities;

    foreach ($cities2 as $city2) {
        if ($city2['id'] == $city['id']) {
            continue;
        }

        if (distance($city['latitudine'], $city['longitudine'], $city2['latitudine'], $city2['longitudine'], false) <= 10) {
            $groups[$city['id']][] = $city2['id'];
        }
    }
}

return $groups;
?>
Il problema è che richiede una discreta potenza di calcolo: se le città sono tante lo script potrebbe venire eseguito per minuti interi. Se davvero vuoi fare una cosa del genere devi implementare un sistema di cache, ed eseguire i calcoli in background, magari con un cronjob.
 
Ultima modifica:

mauro1388

Nuovo Utente
28 Ago 2012
7
0
0
Grazie a tutti per avere risposto!!!!!!!!

Alla fine ho risolto modificando questo algoritmo jonisalonen.com/2012/k-means-clustering-in-mysql/

Non fa proprio la stessa cosa ma con qualche (moltissime) modifica ho risolto


grazie ancora
 

mauro1388

Nuovo Utente
28 Ago 2012
7
0
0
cioa a tutti
ho risposto anche ieri sera ma non so perchè mi han cancellato il messaggio

ho un altro problema simile:

ho dei prezzi e li devo raggruppare dato un parametro.
Es parametro = 200€, i gruppi saranno formati dai prezzi con differenza <=100€

es 200, 250, 5000, 5020, 100, 8000

gruppo1: 100,200,250
gruppo2: 5000,5020
gruppo3: 8000

Come posso fare? il problema del primo post l'ho risolto incasinando un algoritmo, e diventa infattibile adattarlo.
Idee?

grazie
 

mauro1388

Nuovo Utente
28 Ago 2012
7
0
0
ah ok, mi avete creato voi un altro topic... ( forse sono stordito io che ieri sera anziche rispondere ne ho creato un altro...)

ok vado li :byebye:
 
Ultima modifica:
Discussioni simili
Autore Titolo Forum Risposte Data
I Sto progettando nuovi siti utilizzando bootstrap e devo dire funziona bene, l'unico problema e la maschera -moz- HTML e CSS 0
K Problema form update PHP 2
O problema con dvr dahua xvr5116 IP Cam e Videosorveglianza 0
S Problema nel ciclare un json Javascript 0
G Problema con Xampp Web Server 1
andrea barletta Problema con miniature comandi Photoshop 0
I problema con alice Posta Elettronica 0
K Problema Inner join PHP 1
F firefox problema http Linux e Software 0
N Problema con position absolute e overflow HTML e CSS 4
E Problema jquery Success jQuery 2
L Problema con inner join PHP 11
K [php] Problema con inner join PHP 4
E problema selezione sfumata Photoshop 2
K [PHP] Problema con variabili concatenate. PHP 1
A Problema filtro fluidifica Photoshop Photoshop 1
H Problema Bordi Scontorno Photoshop 1
O problema con query PHP 4
R Problema installazione Realtek WiFi USB rtl8821 Reti LAN e Wireless 1
I problema con 2 account Posta Elettronica 1
L problema collegamento file css con html HTML e CSS 1
Y Problema percorso file in rete PHP 1
N Problema SEO "L'URL non si trova su Google" SEO e Posizionamento 4
E Problema accesso a file con app sviluppata con MIT APP INVENTOR 2 Sviluppo app per Android 0
P Problema acquisizione clienti Webdesign e Grafica 1
F NetBeans problema creazione progetto Java Windows e Software 0
M Problema con Try Catch PHP 0
C problema seo + cerco esperto SEO e Posizionamento 11
Sergio Unia Problema con gli eventi del mouse su una data table: Javascript 2
T PROBLEMA CON SESSIONI PHP 3
A Problema, non so, di scale() o transform, oppure altro? HTML e CSS 0
T ALTRO PROBLEMA CON ARRAY PHP PHP 1
R problema con else PHP 0
T PROBLEMA CON ARRAY PHP 8
L problema con query select PHP 2
R Problema query con ricerca id numerico PHP 2
F Problema con risposta PHP 0
S problema con recupero dati tabella mysql PHP 2
Z Problema con il mio tp-l i nk Reti LAN e Wireless 1
I PROBLEMA: Sostituzione sito XAMPP E-Commerce 0
T problema data 30/11/-1 PHP 0
L Problema RAM con Tomcat 8 Apache 0
napuleone problema con sort e asort PHP 4
Y Problema incolonnamento tabella PHP 7
S problema salvataggio immagini Photoshop 0
Z Problema con INT MySQL PHP 1
Z Problema database MySQL con XAMPP PHP 0
M Problema con controllo form in real time jQuery 6
D problema php mysql PHP 1
D problema php mysql PHP 1

Discussioni simili