2012-02-21 5 views
4

Я основываю свой запрос ниже, чтобы выбрать точки около пространственной точки, называемой point, с другой SO solution, но я не смог заставить ее возвращать любые результаты за последние несколько лет часов, и я немного нервничала сейчас ...MySQL - выбор около пространственной точки

Моя таблица lastcrawl имеет простую схему:

 
id (primary int, autoinc) 
point (spatial POINT) 

(Добавлен пространственный ключ через ALTER TABLE lastcrawl ADD SPATIAL INDEX(point);)

 
$query = sprintf("SELECT * FROM lastcrawl WHERE 
    MBRContains(LineFromText(CONCAT(
     '(' 
     , %F + 0.0005 * (111.1/cos(%F)) 
     , ' ' 
     , %F + 0.0005/111.1 
     , ',' 
     , %F - 0.0005/(111.1/cos(%F)) 
     , ' ' 
     , %F - 0.0005/111.1 
     , ')') 
     ,point)", 
     $lng,$lng,$lat,$lng,$lat,$lat); 
$result = mysql_query($query) or die (mysql_error()); 

Я успешно вставил несколько строк с помощью:

$query = sprintf("INSERT INTO lastcrawl (point) VALUES(GeomFromText('POINT(%F %F)'))",$lat,$lng);

Но, я просто не в состоянии запросить ближайшие точки, чтобы получить ненулевой набор результатов. Как вы получаете запрос для выбора точек, ближайших к данной пространственной точке?


После вставки $lat=40, $lng=-100, пытаясь запросить это ничего не возвращает, а также (так, даже точные координаты матча):

SELECT * FROM lastcrawl WHERE MBRContains(LineFromText(CONCAT('(' , -100.000000 + 0.0005 * (111.1/cos(-100.000000)) , ' ' , 40.000000 + 0.0005/111.1 , ',' , -100.000000 - 0.0005/(111.1/cos(40.000000)) , ' ' , 40.000000 - 0.0005/111.1 , ')')) ,point)

ответ

7

я исправил формулу немного.

Это один работает для меня:

CREATE TABLE lastcrawl (id INT NOT NULL PRIMARY KEY, pnt POINT NOT NULL) ENGINE=MyISAM; 

INSERT 
INTO lastcrawl 
VALUES (1, POINT(40, -100)); 

SET @lat = 40; 
SET @lon = -100; 

SELECT * 
FROM lastcrawl 
WHERE MBRContains 
       (
       LineString 
         (
         Point 
           (
           @lat + 10/111.1, 
           @lon + 10/(111.1/COS(RADIANS(@lat))) 
           ), 
         Point (
           @lat - 10/111.1, 
           @lon - 10/(111.1/COS(RADIANS(@lat))) 
           ) 
         ), 
       pnt 
       ); 
+0

Я попробовал это, используя MySQL 5.1.39 и никаких результатов, где возвращаемые. – Andy

+0

@ Энди: он возвращает мне 42 записи. – Quassnoi

+0

Эта формула на самом деле неверна. Вам нужно удалить паретез вокруг выражений: (111.1/COS (RADIANS (@lat))), или ваши результаты будут отключены в 2 раза. – deweydb