Technologie utilisée: MySQL 5.1 et PHP 5.3
Je suis juste à la conception d'une nouvelle base de données pour un site que je suis en train d'écrire. Je suis en train de regarder la meilleure façon de maintenant, le stockage de la Lat et de Gnl valeurs.
Dans le passé, j'ai été en utilisant la VIRGULE et l'utilisation de PHP/MySQL sélectionner dans le formulaire:
SQRT(POW(69.1 * (fld_lat - ( $lat )), 2) + POW(69.1 * (($lon) - fld_lon) * COS(fld_lat / 57.3 ), 2 )) AS distance
pour trouver le plus proche des lieux correspondants.
En commençant à lire plus sur les nouvelles technologies, je me demande si je dois utiliser les Extensions Spatiales. http://dev.mysql.com/doc/refman/5.1/en/geometry-property-functions.html
L'Information est assez mince sur le sol, si et a eu une question sur la façon de stocker les données. Au lieu d'utiliser la VIRGULE, j'ai maintenant l'utiliser comme un Type de données?
Aussi, une fois stockée comme un POINT est-il facile juste pour obtenir le Lat Gnl valeurs dans le cas où je veux tracer sur une carte ou dois-je en outre de stocker le lat lngs que DÉCIMALES encore ainsi?
Je sais que je devrais prob utiliser PostGIS comme la plupart des posts ici dire que je n'ai pas envie d'apprendre une nouvelle DB si!
Suivi
J'ai été à jouer avec le nouveau type de POINT. J'ai été en mesure d'ajouter Lat Gnl valeurs à l'aide des éléments suivants:
INSERT INTO spatialTable (placeName, geoPoint) VALUES( "London School of Economics", GeomFromText( 'POINT(51.514 -0.1167)' ));
Je peux alors obtenir la Lat, Lng valeurs de retour de la Db à l'aide de:
SELECT X(geoPoint), Y(geoPoint) FROM spatialTable;
Tout cela semble bon, mais le calcul de la distance est le bit j'ai besoin de résoudre. Apparemment, MySQL dispose d'une place de titulaire pour une fonction de distance, mais ne sera pas publié depuis un moment. Quelques posts que j'ai trouvé j'ai besoin de faire quelque chose comme ci-dessous, mais je pense que mon code est un peu mal:
SELECT
placeName,
ROUND(GLength(
LineStringFromWKB(
LineString(
geoPoint,
GeomFromText('POINT(52.5177, -0.0968)')
)
)
))
AS distance
FROM spatialTable
ORDER BY distance ASC;
Dans cet exemple geoPoint est un POINT d'entrée dans la DB à l'aide de l'INSÉRER au-dessus.
GeomFromText('POINT(52.5177, -0.0968)'
est un Lat de valeur du Gnl je veux calculer une distance à partir de.
Plus de Suivi
Plutôt bêtement je venais de mettre dans la partie RONDE de la SQL sans vraiment le penser. Prenant cela me donne:
SELECT
placeName,
(GLength(
LineStringFromWKB(
LineString(
geoPoint,
GeomFromText('POINT(51.5177 -0.0968)')
)
)
))
AS distance
FROM spatialTable
ORDER BY distance ASC
Qui semble me donner les distances exactes dont j'ai besoin.
Je suppose que la seule chose actuellement à laquelle il faut répondre est une pensée que je suis vient de rendre la vie difficile pour moi-même en utilisant Spatiale maintenant ou à l'avenir de l'étanchéité à moi-même...