Как найти адрес по географическим координатам.
[ Решение в лоб ] [ Используем индекс ]
Решение в лоб
Сортируем контуры домов по удалению от заданной точки.
select s.city, s.name, b.name, Distance(MakePoint(73.391631, 54.976775, 4326), b.geom) from building b join street s on b.id_street = s.id_street order by 4 limit 5;
Первая координата — X — это долгота. Вторая координата — Y — это широта. (Такой порядок определен в спецификациях GIS расширения БД).
Вот такая местность: http://maps.yandex.ru/?text=54.976775,73.391631
Функция Distance может считать разными способами.
Результат
city | name | name | Distance |
---|---|---|---|
Омск | Учебная | 83 | 0.000078 |
Омск | Съездовская | 50 | 0.000432 |
Омск | Учебная | 83а | 0.000461 |
Омск | Учебная | 83 | 0.000493 |
Омск | Учебная | 79 | 0.000640 |
Цена
selectid | order | from | detail |
---|---|---|---|
0 | 0 | 0 | SCAN TABLE building AS b |
0 | 1 | 1 | SEARCH TABLE street AS s USING INTEGER PRIMARY KEY (rowid=?) |
0 | 0 | 0 | USE TEMP B-TREE FOR ORDER BY |
Полный скан таблицы building.
Используем индекс
Отсекаем контуры в пределах определенной (прямоугольной) области перед сортировкой.
select s.city, s.name, b.name, Distance(MakePoint(73.391631, 54.976775, 4326), b.geom) from building b join street s on b.id_street = s.id_street where b.rowid in (select pkid from idx_building_geom where xmin > 73.390 and xmax < 73.393 and ymin > 54.975 and ymax < 54.978) order by 4 limit 5;
(В SpatiaLite использование геоиндексов выглядит так странно).
Результат
city | name | name | Distance |
---|---|---|---|
Омск | Учебная | 83 | 0.000078 |
Омск | Учебная | 83а | 0.000461 |
Омск | Учебная | 83 | 0.000493 |
Омск | Учебная | 79 | 0.000640 |
Омск | Мартынова бульвар | 17 | 0.000959 |
Цена
selectid | order | from | detail |
---|---|---|---|
0 | 0 | 0 | SEARCH TABLE building AS b USING INTEGER PRIMARY KEY (rowid=?) |
0 | 0 | 0 | EXECUTE LIST SUBQUERY 1 |
1 | 0 | 0 | SCAN TABLE idx_building_geom VIRTUAL TABLE INDEX 2:EaCbEcCd |
0 | 1 | 1 | SEARCH TABLE street AS s USING INTEGER PRIMARY KEY (rowid=?) |
0 | 0 | 0 | USE TEMP B-TREE FOR ORDER BY |
Идет сканирование по виртуальной таблице idx_building_geom, а на самом деле — просмотр геоиндекса, представленного этой виртуальной таблицей.