2011-01-18 19 views
9

Desidero memorizzare i valori di latitudine e longitudine di posti in una tabella di database mysql. Con il futuro in mente, voglio essere in grado di trovare questi luoghi entro un certo raggio di una posizione specifica. Detto questo, quali tipi di dati dovrei memorizzare i valori di latitudine e longitudine in? Si prega mi può fornire con uno script creare la tabella per le colonne in questo modo:Impostazione tabella latitudine e longitudine di MySQL

place_id | lat | long 

c'è forse una colonna che mi manca nella tabella qui sopra, che mi fornirà ulteriori informazioni che io non veda ho bisogno al ora attuale?

Grazie per qualsiasi aiuto.

+0

possibile duplicato di [Qual è il tipo di dati ideale da utilizzare quando si memorizzano latitudine/longitudini in un database MySQL?] (Http://stackoverflow.com/questions/159255/what-is-the-ideal-data-type -uso-quando-memorizzazione-latitudine-longitudes-in-a-mysql) – Gajus

risposta

21

funzione consente di memorizzare i punti in una colonna singe di tipo di dati Point cui è possibile indice con un indice SPATIAL (se il tipo di tabella è MyISAM):

CREATE SPATIAL INDEX sx_place_location ON place (location) 

SELECT * 
FROM mytable 
WHERE MBRContains 
       (
       LineString 
         (
         Point($x - $radius, $y - $radius), 
         Point($x + $radius, $y + $radius) 
         ) 
       location 
       ) 
     AND Distance(Point($x, $y), location) <= $radius 

Questo sarà drasticamente migliorare la velocità di query come " trova tutto entro un determinato raggio ".

Si noti che è preferibile utilizzare le coordinate metriche semplici (est e nord) anziché polari (latitudine e longitudine) TM. Per piccoli raggi, sono abbastanza precisi e i calcoli sono semplificati notevolmente. Se tutti i tuoi punti sono in un emishpere e sono lontani dai poli, puoi usare un singolo meridiano centrale.

È comunque possibile utilizzare le coordinate polari, ma le formule per calcolare lo MBR e la distanza saranno più complesse.

+1

Tutte le mie tabelle usano InnoDB mentre uso le chiavi esterne. Non è un problema avere tabelle sia in InnoDB che in MyISAM? – Martin

+0

@Martin: 'MyISAM' è senza transazioni e non è possibile utilizzare i vincoli' FOREIGN KEY' su di esso. Solo per le query 'SELECT', non ci sono problemi nel mescolare le tabelle di tipi diversi. – Quassnoi

+0

Sì. Capisco che le chiavi esterne non funzionano in MyISAM, tuttavia se ho una tabella aggiuntiva per le coordinate e ho questo come MyISAM e tutte le altre mie tabelle sono InnoDB, non è un problema? – Martin

0

Ho scavato poche ore attraverso tonnellate di argomenti e non sono riuscito a trovare nessuna query, restituendo punti in un raggio, definito in km. ST_Distance_Sphere lo fa, tuttavia, il server è MariaDB 5.5, che non supporta ST_Distance_Sphere().

Siamo riusciti a trovare qualcosa di lavoro, ecco la mia soluzione, compatibile con la dottrina 2.5 e la Dottrina CrEOF spaziale libreria:

$sqlPoint = sprintf('POINT(%f %f)', $lng, $lat); 

    $rsm = new ResultSetMappingBuilder($this->manager); 
    $rsm->addRootEntityFromClassMetadata('ApiBundle\\Entity\\Place', 'p'); 

    $query = $this->manager->createNativeQuery(
     'SELECT p.*, AsBinary(p.location) as location FROM place p ' . 
     'WHERE (6371 * acos(cos(radians(Y(ST_GeomFromText(?)))) ' . 
     '* cos(radians(Y(p.location))) * cos(radians(X(p.location)) ' . 
     '- radians(X(ST_GeomFromText(?)))) + sin(radians(Y(ST_GeomFromText(?)))) * sin(radians(Y(p.location))))) <= ?', 
     $rsm 
    ); 

    $query->setParameter(1, $sqlPoint, 'string'); 
    $query->setParameter(2, $sqlPoint, 'string'); 
    $query->setParameter(3, $sqlPoint, 'string'); 
    $query->setParameter(4, $radius, 'float'); 

    $result = $query->getResult(); 

Supponendo GNL e lat è XY del punto fisso, Place è l'entità con un tipo di POINT di campo "posizione". Non ho potuto utilizzare direttamente DQL a causa di problemi con il collegamento param di MySQL, ecco perché la query nativa di basso livello. Il rsm è richiesto per mappare i risultati in oggetti entità. Può vivere senza di essa, però.

Sentitevi liberi di usarlo. Spero ti salverà un po 'di tempo.

Problemi correlati