Oracle SQL запрос или функция для кластеризации географических данных - PullRequest
1 голос
/ 19 марта 2011

У меня есть таблица, содержащая географические данные, и я хочу сгруппировать строки по близости координат X и Y.Итак, учитывая смещение n и таблицу со столбцами X и Y, я хочу сгруппировать строки, в которых ABS (row1.X - row2.X)

Ответы [ 2 ]

2 голосов
/ 21 марта 2011

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

Градусы широты параллельны, поэтому расстояние между каждым градусом остается почти постоянным, но, поскольку градусы долготы расположены дальше друг от друга на экваторе и сходятся на полюсах, их расстояние сильно варьируется. Каждый градус широты составляет приблизительно 69 миль (111 километров) друг от друга. Диапазон варьируется (из-за слегка эллипсоидальной формы Земли) от 68,703 миль (110,567 км) на экваторе до 69,407 (111,699 км) на полюсах. Это удобно, потому что каждая минута (1/60 градуса) составляет примерно одну милю. Степень долготы широка на экваторе 69,172 миль (111,321) и постепенно уменьшается до нуля на полюсах. В 40 ° к северу или югу расстояние между градусами долготы составляет 53 мили (85 км).

Другой аспект: если Фред находится в 4 милях от Билла, а Билл в 4 милях от Тома, расстояние между Фредом и Томом может составлять 8 миль. Если ваш порог близости составляет 5 миль, Билл и Фред находятся в одной группе, Билл и Том - в одной группе, а Фред и Том - нет.

Следующий запрос может дать вам полезное начало:

select abs(abs(a.lat) - abs(b.lat)),abs(abs(a.lon) - abs(b.lon)), 
       sdo_geom.sdo_distance(a.geom, b.geom, 0.005,'unit=kilometer') dist_km
from 
  (select sdo_geometry(2001,8314,sdo_point_type(33,151, null), null,null) geom, 33 lat, 151 lon from dual) a,
  (select sdo_geometry(2001,8314,sdo_point_type(34,151, null), null,null) geom, 34 lat, 151 lon  from dual) b
1 голос
/ 20 марта 2011

У вас есть оракул пространственный? Если это так, есть ряд встроенных функций, чтобы справиться с этим для вас. Если нет - вам понадобится функция для определения катографических расстояний (а затем сгруппировать их). Я вспоминаю, как задавал вопрос о том, как написать такую ​​функцию на прошлой неделе. (На самом деле таких несколько)

Как ограничить MySQL Distance Query

Лучшая ставка. Используйте пространственные расширения. Они будут работать намного лучше.

...