Найти расстояние между двумя точками в MYSQL.(используя тип данных Point) - PullRequest
7 голосов
/ 16 февраля 2010

Предположим, у меня есть таблица из 2 столбцов, подобная этой:

| user_id      | int(11) | NO   | UNI | NULL    |                |
| utm          | point   | NO   | MUL | NULL    |                |

Как видите, все очень просто.utm - это тип данных Point .Я вставляю это так:

INSERT INTO mytable(user_id, utm) VALUES(1, PointFromWKB(point(50, 50)));

Затем я создаю пространственный индекс.

ALTER TABLE mytable ...add spatial index on(utm) or something. (forgot)

Хорошо, все хорошо.Теперь я хочу выбрать *, где расстояние <99999. </strong> Но это не работает!

//This is supposed to select all where the distance is less than 99999999.
set @mypoint = PointFromWKB(point(20,20))
select * from mytable where GLength(LineString(utm, @mypoint)) < 9999999;
Empty set (0.00 sec)
select * from mytable where GLength(LineStringFromWKB(LineString(utm, @mypoint))) < 9999;
Empty set (0.00 sec)

Кстати, я пытался вставить INTO без PointFromWKB ...и это не сработало ... вот почему кто-то предложил мне PointFromWKB.

Ответы [ 3 ]

3 голосов
/ 16 февраля 2010

решаемая. Вот что я сделал:

where GLength(LineStringFromWKB(LineString(asbinary(utm), asbinary(@mypoint)))) < 9999999999999;
1 голос
/ 08 марта 2012

Вы также можете сделать это таким образом. Не уверен, быстрее это или нет.

select * from mytable where glength(geomfromtext(concat('linestring(', x(utm), ' ', y(utm), ',20 20', ')'))) < 99999999
0 голосов
/ 17 марта 2016

Насколько я знаю, вы должны попробовать этот путь-

select * from mytable
   where 
    (
        GLength(
          LineStringFromWKB(
            LineString(
              geoPoint, 
              GeomFromText('POINT(51.5177 -0.0968)')
            )
          )
        )
      ) < 99999999

Подробнее этот ответ .

...