在MySQL中查找最近的纬度经度点查询不起作用

时间:2013-05-17 22:29:00

标签: mysql sql gis geospatial spatial

我在这里使用了答案来设置我的查询:

https://stackoverflow.com/a/1006668/211457

我正在运行此查询:

SELECT  * 
FROM    users 
WHERE   MBRContains(LineFromText(CONCAT( 
    '('    , 39.76784253493 + 10 / ( 111.1 / cos(RADIANS(39.76784253493)))
    , ' '
    , -75.871009379625 + 10 / 111.1
    , ','
    , 39.76784253493 - 10 / ( 111.1 / cos(RADIANS(-75.871009379625)))
    , ' '
    , -75.871009379625 - 10 / 111.1 
    , ')' ))
    ,location)

我的数据库包含以下条目

CREATE TABLE `users` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `location` point NOT NULL,
  PRIMARY KEY (`id`),
  SPATIAL KEY `sx_place_location` (`location`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

INSERT INTO `users` (`id`, `location`)
VALUES
    (1,X'000000000101000000E17A14AE47E1434088855AD3BCF752C0'),   
    (2,X'000000000101000000E9FF1F9EBEF752C0440008AA48E24340');

当我希望返回第二行时,不会返回任何结果,因为这是我在查询中使用的值。我检查的一件事是我是否切换了经度和纬度的值,但在这两种情况下都没有返回任何内容。当我对查询进行解释时,它说“在读取const表之后不可能注意到”。我正在使用MySQL 5.1.39。

由于导出是在某种编码中,或者某些东西是一个点,这里是截图。忽略额外的列。

screenshot

编辑:我最终切换到Postgresql。类似的查询更短,并且有效。

1 个答案:

答案 0 :(得分:1)

我使用Postgresql而不是更容易。

我用于查找附近用户的查询是:

$ sql =" SELECT *,st_astext(location_geometry)作为latlon FROM用户,其中id!=?和年龄之间?和? $ gender_sql $ interested_in_sql和id not in(从from_id =?中选择to_id)ORDER BY location_geometry< - >" " st_setsrid(st_makepoint(?,?),4326)限制10&#34 ;;

这使用< - >运算符,在这种情况下排序经度lattidude列。您可以忽略$ gender_sql和$ interested_in_sql,因为它是特定于应用程序的。

st_makepoint中的两个参数是纬度和经度。

这使用PostGIS扩展。我使用Bitnami安装服务器软件,默认情况下启用了该扩展程序。