I have the following code:
set @lon = 121.4732134;
set @lat = 31.2304321;
set @point = point(@lon, @lat);
set @radius = .5;
set @polygon = ST_Buffer(@point, @radius);
select l.city,l.latitude,l.longitude,
st_distance_sphere(l.latlngindex, point(@lon, @lat)) as distance
from table_locations l
where st_within(l.latlngindex, @polygon)
order by distance
;
It runs fine, gives result, but only first 5 or 6 are accurate wrt distance between them. Rest of them are inaccurate, I verified this on a couple of sites.
Table structure-
`locationid`,
`latitude`,
`longitude`,
`latlngindex` point not null,
spatial index `latlngindex` (`latlngindex`)
Sample insertions :
insert into `table_locations` values(2001,31.2372705, 121.4705291, Point(121.2372705, 31.4705291));
insert into `table_locations` values(2002,31.2328741, 121.4741493, Point(121.2328741, 31.4741493));
insert into `table_locations` values(2003,31.2300200, 121.4749245, Point(121.2300200, 31.4749245));
insert into `table_locations` values(2004,31.2302308, 121.4705508, Point(121.2302308, 31.4705508));
insert into `table_locations` values(2005,31.2391562, 121.4771425, Point(121.2391562, 31.4771425));
insert into `table_locations` values(2006,31.2331857, 121.4779539, Point(121.2331857, 31.4779539));
Sample result row :
Lat Long distance
31.2397267', '121.4742061', '35019.00977766075'
Distance between (31.2397267, 121.4742061) and (31.2304321, 121.4732134) should be 1004m, while it gives it to be 35019m.
Looks like you mixed up lat and lon
DROP TABLE IF EXISTS `table_locations`;
CREATE TABLE `table_locations` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`latitude` DOUBLE NOT NULL,
`longitude` DOUBLE NOT NULL,
PRIMARY KEY (`id`)
);
INSERT INTO `table_locations` VALUES (1, 31.2396691, 121.4798393);
INSERT INTO `table_locations` VALUES (2001, 31.2372705, 121.4705291);
INSERT INTO `table_locations` VALUES (2002, 31.2328741, 121.4741493);
INSERT INTO `table_locations` VALUES (2003, 31.2300200, 121.4749245);
INSERT INTO `table_locations` VALUES (2004, 31.2302308, 121.4705508);
INSERT INTO `table_locations` VALUES (2005, 31.2391562, 121.4771425);
INSERT INTO `table_locations` VALUES (2006, 31.2331857, 121.4779539);
INSERT INTO `table_locations` VALUES (2007, 31.2397267, 121.4742061);
SET @lat = 31.2304321;
SET @lon = 121.4732134;
SET @p = point(@lon, @lat);
SET @r = 43.0;
SET @POLY = ST_Buffer(@p, @r);
SELECT
id
, latitude
, longitude
, ST_Distance_Sphere(POINT(longitude, latitude), @p) as dist
FROM
table_locations
WHERE st_within(POINT(longitude, latitude), @POLY)
ORDER BY
dist
;
Returns values and shows distance 1204.9090584034252 for the first location