2011-03-10 2 views
1

J'utilise codeigniter et datamapper pour construire un service d'API (sur mysql), et une partie implique la géolocalisation - mais je n'arrive pas à trouver une solution de contournement pour utiliser le type de données point. Si j'essaie d'insérer GeomFromText, le système le traite comme une chaîne.Comment utiliser un type Point ou Géométrie dans Datamapper (codeigniter)

Quelqu'un peut-il aider?

Cheers, Marque.

Répondre

1

Essayez

CREATE TABLE Points ( 
    ID INT(10) PRIMARY KEY NOT NULL AUTO_INCREMENT, 
    location POINT NOT NULL, 
    SPATIAL INDEX(location) 
) ENGINE= MYISAM 

En CodeIgniter:

$this->db->set("location",'geomfromtext("POINT(30.2 40.3)")',false); 
$this->db->insert("Points"); 

En CodeIgniter avec Datamaper (voir l'aide pour "Utilisation de formules dans les mises à jour" dans la documentation) ...

$point = new Point(); 
$point->update('location','geomfromtext("POINT(30.2 40.3)")',FALSE); 
0

Utilisez FLOAT comme type de données de base de données.

+0

[Manuel MySQL] (http://dev.mysql.com/doc/refman/5.0/en/problems-with-float.html). MySQL effectue l'arrondissement lors de l'enregistrement des valeurs, donc si vous insérez 999.00009 dans une colonne FLOAT (7,4), le résultat approximatif est 999.0001. Si vous ne pouvez pas utiliser le point, il est préférable d'utiliser le point décimal. –

+0

Eh bien, j'ai fait une bibliothèque de proxy qui prend en charge la géolocalisation (en utilisant google map service) dans Codeigniter: http://codeigniter.com/forums/viewthread/186250/, et fonctionne très bien avec mon type de données float sur ma base de données. – toopay

+0

Ce n'est pas le même pays que les adresses postales, et la précision des échecs dans MySQL est une fonctionnalité de conception. Dans le manuel, reportez-vous à ces champs comme "Types à virgule flottante (valeur approximative)" ... [Manuel MySQL] (http://dev.mysql.com/doc/refman/5.0/fr/numeric-types.html –

1

Comme il est expliqué dans le Guide de l'utilisateur CodeIgniter: Fonction

$this->db->set(); 

set vous permet de définir des valeurs pour les insertions ou les mises à jour. Set() acceptera un troisième paramètre ($ escape) qui empêchera l'échappement des données s'il est défini sur FALSE.

$this->db->set('geo', "ST_GeomFromText('{$data['geo']}')", FALSE); 
$this->db->insert('tableName'); 

return $this->db->insert_id() ? $this->db->insert_id() : FALSE; 
+2

Pouvez-vous expliquer un peu ce que fait votre code? Une réponse codée peut être mal interprétée par l'OP. –

Questions connexes