Я основывал свой запрос ниже, чтобы выбрать точки вблизи пространственной точки, называемой point
на другом SO-решении , но я не смог заставить ее вернуть какие-либо результаты за последние несколько часов, и я немного острый Теперь…
Моя таблица lastcrawl
имеет простую схему:
id (первичный int, autoinc) точка (пространственная точка)
(Добавлен пространственный ключ через 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 , ')') ') , Точка)», $ LNG, $ LNG, $ ш, $ LNG, $ ш, $ ш); $ result = mysql_query ($ query) или 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)
Я немного скорректировал формулу.
Это работает для меня:
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 );