Utiliser les extensions spatiales MySQL pour sélectionner des points dans le cercle
J'ai une table appelée flags
qui contient une colonne appelée coordinates
qui est plein de MySQL 'points'. J'ai besoin d'effectuer une requête où je reçois tous les drapeaux à l'intérieur d'un cercle pour la latitude et la longitude de la position avec rayon de 100 m.
À partir de l'utilisation de point de vue est basé autour de la position de l'utilisateur. Par exemple, le téléphone mobile serait de donner à l'utilisateur la latitude et longitude de la position et de le passer à cette partie de l'API. C'est ensuite à l'API pour créer un cercle invisible autour de l'utilisateur avec un rayon de 100 mètres, puis les retourner et les indicateurs qui sont dans ce cercle.
C'est cette partie de l'API, je ne suis pas sûr de savoir comment créer comme je ne suis pas sûr comment utiliser SQL pour créer ce cercle invisible et sélectionnez les points de seul au sein de ce rayon.
Est-ce possible? Est-il un MySQL fonction spatiale qui va m'aider à faire cela?
Je crois que le Buffer()
fonction peut le faire, mais je ne trouve pas de documentation quant à la façon de l'utiliser (par exemple, exemple SQL). Idéalement, j'ai besoin d'une réponse qui me montre comment utiliser cette fonction, ou le plus proche d'elle. Là où je suis le stockage de ces coordonnées géospatiales points que je devrais utiliser un géospatiales fonction pour faire ce que je demande, afin de maximiser l'efficacité.
Drapeaux de table:
- id
- coordonnées
- nom
Exemple de ligne:
1 | [GÉOMÉTRIE - 25B] | Tenacy AB
Pour les drapeaux de table, j'ai la latitude, la longitude positions et l'ordonnée et l'abscisse (UTM)
La localisation de l'utilisateur est tout simplement norme latitude/longitude, mais j'ai une bibliothèque qui peut conver cette position UTM
source d'informationauteur jskidd3
Vous devez vous connecter pour publier un commentaire.
Il n'y a pas géospatiales fonctions d'extension MySQL à l'appui de la latitude /longitude calculs de distance.Il n'y a que de MySQL 5.7.Vous demandons de proximité cercles sur la surface de la terre. Vous mentionnez dans votre question que vous avez lat/long valeurs pour chaque ligne de votre
flags
table, et aussi universelle transverse de Mercator (UTM) valeurs projetées dans l'un des différents UTM zones. Si je me souviens de mon royaume-UNI de l'Ordnance Survey correctement les cartes, UTM est utile pour rechercher des éléments sur ces cartes.C'est une question simple pour calculer la distance entre deux points dans la même zone en UTM: la rupture Cartésienne distance fait le tour. Mais, quand les points sont dans des zones différentes, que le calcul ne fonctionne pas.
En conséquence, pour l'application décrite dans votre question, il est nécessaire d'utiliser le Distance Orthodromiquequi est calculée à l'aide de la haversine ou d'une autre, formule convenable.
MySQL, augmentée avec géospatiales extensions, prend en charge une façon de représenter diverses formes planes (points, polylignes, polygones, et ainsi de suite) comme des primitives géométriques. MySQL 5.6 met en œuvre un sans-papiers fonction de distance
st_distance(p1, p2)
. Cependant, cette fonction renvoie Cartésien distances. Il est donc totalement inadaptées pour la latitude et la longitude en fonction des calculs. À des latitudes tempérées d'un degré de latitude représente près de deux fois la distance de la surface (nord-sud), un degré de longitude(est-ouest), car les lignes de latitude grandir rapprocher plus près des pôles.Ainsi, une circulaire de la proximité de la formule de besoins à l'origine de la latitude et de la longitude.
Dans votre application, vous pouvez trouver toutes les
flags
points dans un délai de dix milles d'unlatpoint,longpoint
avec une requête comme ceci:Si vous voulez chercher des points à moins de 20 km, modifiez cette ligne de la requête
par exemple
r
est le rayon dans lequel vous souhaitez rechercher.units
sont les unités de distance (miles, km, de loin, tout ce que vous voulez) par degré de latitude sur la surface de la terre.Cette requête utilise un cadre lat/long avec
MbrContains
d'exclure les points qui sont vraiment trop loin de votre point de départ, puis utilise la distance orthodromique formule pour générer les distances des points restants. Un l'explication de tout ce qui peut être trouvé ici. Si votre table utilise le MyISAM méthode d'accès et possède un index spatial,MbrContains
va exploiter cet indice pour vous la recherche rapide.Enfin, la requête ci-dessus permet de sélectionner tous les points dans le rectangle. Pour étroit que que les points du cercle, et de les ordonner en fonction de leur proximité, enveloppez la requête comme ceci:
Cela suppose que les coordonnées dans la table sont stockées comme un POINT() le type de données dans une colonne intitulée "point". La fonction X () et Y(point) extraire les valeurs de latitude et longitude de la valeur du point respectivement.
Si vous voulez le faire en miles, remplacer la constante 6373 avec 3959
Pour ceux qui veulent réduire la syntaxe de la requête, voici une mise en œuvre commune d'un définis par l'utilisateur MySQL fonction de la mise en œuvre d'une fonction de distance basée sur la Haversine formules.
Mise à JOUR
Utilisation ST_Distance_Sphere() pour calculer les distances à l'aide d'un lat/long
http://dev.mysql.com/doc/refman/5.7/en/spatial-convenience-functions.html#function_st-distance-sphere
Tampons ne vous aidera pas beaucoup dans MySQL < 5.6, depuis tampon est un polygone, polygone opérations dans MySQL < 5.6 sont implémentées comme des "Minimes de Délimitation des Rectangles" (MBR), qui sont assez inutile.
Depuis MySQL 5.6, le plein de non-MBR
st_*
opérations ont été mises en œuvre. Mais la meilleure solution pour vous, dans le cas du cercle, est d'utiliser sans-papiers fonctionst_distance
:C'était dur à trouver, car il est sans-papiers 🙂 Mais c'est mentionné sur ce blogdont l'auteur a également rempli la mentionné rapport de bogue. Il y a des bémols (citant le blog):
Point 1) signifie que l'unité de distance sera la même que l'unité de coordonnées (degrés en cas de WGS84). Si vous avez besoin de la distance en mètres, vous devez utiliser les projections de la coordination du système (par exemple, UTM ou similaire) qui a des unités correspondant à des mètres.
Donc dans le cas où vous ne voulez pas aller avec ces mises en garde, ou, dans le cas de MySQL < 5.6, vous devrez écrire votre propre fonction de distance.
Espère que ma version vous aide
détails ici http://dexxtr.com/post/83498801191/how-to-determine-point-inside-circle-using-mysql
à partir de:
https://gis.stackexchange.com/questions/31628/find-points-within-a-distance-using-mysql
(n'oubliez pas de remplacer toutes les constantes, cet exemple est de kilomètres)
Vous pouvez utiliser:
L'expression: 0.00001*1000 à l'intérieur de tresorerie ci-dessus vous donne un cercle avec 1000 Mètres de diamètre,
son application d'un point de vue ici, le nom de la colonne est juste une étiquette à point , mypoint est le nom de mon point de colonne,
lat a été calculé à l'intérieur de vue avec ST_X(mytable.mypoint) et
le gnl avec ST_Y(mytable.mypoint) et ils montrent simplement moi te des valeurs littérales de la lat et de gnl.
Il vous donnera toutes les coordonnées qui appartient au cercle.
par souci d'exhaustivité, MySQL 5.7.6. vous pouvez utiliser le ST_Distance_Sphere fonction qui donne le même résultat:
Dans ce cas, nous fournissons le rayon moyen de la Terre en kilomètres (6373) et un point (@pt1). Ce code permet de calculer la distance (en kilomètre) entre ce point (long 12.3456, lat 34.5678) et de tous les points contenus dans la base de données où la distance est de 30 km ou moins.