Как найти адрес по географическим координатам.

Решение в лоб

Сортируем контуры домов по удалению от заданной точки.

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 может считать разными способами.

Результат

citynamenameDistance
ОмскУчебная830.000078
ОмскСъездовская500.000432
ОмскУчебная83а0.000461
ОмскУчебная830.000493
ОмскУчебная790.000640

Цена

selectidorderfromdetail
000SCAN TABLE building AS b
011SEARCH TABLE street AS s USING INTEGER PRIMARY KEY (rowid=?)
000USE 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 использование геоиндексов выглядит так странно).

Результат

citynamenameDistance
ОмскУчебная830.000078
ОмскУчебная83а0.000461
ОмскУчебная830.000493
ОмскУчебная790.000640
ОмскМартынова бульвар170.000959

Цена

selectidorderfromdetail
000SEARCH TABLE building AS b USING INTEGER PRIMARY KEY (rowid=?)
000EXECUTE LIST SUBQUERY 1
100SCAN TABLE idx_building_geom VIRTUAL TABLE INDEX 2:EaCbEcCd
011SEARCH TABLE street AS s USING INTEGER PRIMARY KEY (rowid=?)
000USE TEMP B-TREE FOR ORDER BY

Идет сканирование по виртуальной таблице idx_building_geom, а на самом деле — просмотр геоиндекса, представленного этой виртуальной таблицей.