Je voudrais stocker quelques positions géométriques dans ma base de données MySQL. Pour cela, j'utilise le type de données POINT. Presque partout, j'ai lu que la fonction GeomFromText
devait être utilisée pour insérer des données dans le tableau.
Cependant, j'ai découvert que cela POINT(X,Y)
fonctionne également. Je n'ai trouvé aucune description pourquoi GeomFromText
utiliser à la place de POINT
.
Par exemple, j'ai la relation simple suivante:
CREATE TABLE Site (
SiteID BIGINT UNSIGNED,
Position POINT
);
Et je peux insérer des valeurs en utilisant les deux variantes suivantes:
INSERT INTO Site (
1,
GeomFromText( 'POINT(48.19976 16.45572)' )
);
INSERT INTO Site (
2,
POINT(48.19976, 16.45572)
);
Lorsque je vois la table ( SELECT * FROM Site
), je vois le même blob binaire pour l'emplacement, et quand je vois les coordonnées ( SELECT *, AsText(Position) FROM Site
), je vois aussi les mêmes valeurs.
Alors pourquoi utiliser GeomFromText? Existe-t-il des différences de performances (connues) entre ces deux variantes? Comment cela est-il résolu dans d'autres systèmes de base de données que MySQL?
la source
INSERT INTO Site (Position) SELECT POINT(latitude, longitude) FROM tmp
est plus simple que...SELECT GeomFromText(CONCAT('POINT(',latitude,' ',longitude,')' )) ...
Réponses:
Il existe deux formats binaires différents liés aux extensions spatiales MySQL, le format "bien connu binaire" (WKB) des normes et le
GEOMETRY
type de données interne MySQL .Avant MySQL 5.1.35, les fonctions comme
POINT()
ne renvoyaient pas le type de données interne MySQL; ils sont retournés WKB ... donc avant cela, vous deviez faire ceci:Mais maintenant, comme dans votre exemple, cela fonctionne:
Au crédit des développeurs, lorsqu'ils ont changé
Point()
et des fonctions similaires pour retourner (plus sainement) desGEOMETRY
objets, ils ont autoriséGeomFromWKB()
et des fonctions similaires à accepter réellement les données WKB ou MySQL Geometry en entrée, même si les fonctions sont destinées à accepter WKB en entrée.Le fait que la 1ère méthode fonctionne (bien qu'elle soit techniquement erronée) sur les serveurs plus récents et que la 2ème méthode ne fonctionne pas du tout avant MySQL 5.1.35 pourrait expliquer pourquoi des exemples ont été écrits en utilisant l'approche que vous avez vue - pour éviter complètement le problème. Sinon ... je n'ai rien, ici.
La concaténation puis l'analyse du texte semblent intuitivement plus lentes et plus sujettes aux erreurs que les fonctions qui acceptent les variables appropriées en entrée, donc je ne vois aucune raison de créer des chaînes concaténées et d'utiliser les fonctions basées sur le texte.
http://dev.mysql.com/doc/refman/5.1/en/creating-spatial-values.html#gis-wkb-functions
http://dev.mysql.com/doc/relnotes/mysql/5.1/en/news-5-1-35.html
la source
ST_GeomFromText()
et des fonctions de conversion similaires plutôt que d'exiger que les applications externes utilisent les fonctions SQL natives qui construisent des objets géométriques, qui se trouvent dans la référence de la fonction spatiale . Les documents pourraient être mieux organisés.MySQL 8+
Pour la postérité, la seule chose qui compte c'est que
Point(X,Y)
est un constructeur pour les nombres avec précision et ne nécessite pas de convertir d'abord en texte pour le rendre plus rapide. Il est également garanti de RETOURNERPOINT
OU D'ÉCHEC . Cela le rend fortement typé si vous voulez y penser comme ça.ST_
préfixe; le cas échéant, utilisez la version avec leST_
préfixe. Utilisez les constructeurs WKT uniquement si votre entrée est déjà du texte connu. Sinon, utilisez lePoint(x,y)
constructeur ci-dessus.ST_GeomFromText(wkt, srid)
peut renvoyer N'IMPORTE QUEL type spatial pris en charge par MySQL et représenté par WKT. Cela le rend vaguement tapé si vous voulez y penser comme ça.ST_PointFromText(wkt, srid)
unPOINT
constructeur fortement typé à partir d'un texte bien connu.Clarté
Sauter la leçon d'histoire, ne le faites JAMAIS
GeomFromText(Point(x,y))
. C'est horrible, sans support et sans papiers.la source
Avec GeomFromText ou toute autre fonction * FromText, vous pouvez spécifier le SRID . Je ne pense pas que vous puissiez le faire autrement.
la source
POINT(lng lat)
à- dire au lieu dePOINT(lat lng)