IBM Informix с использованием пространственной базы данных - PullRequest
2 голосов
/ 26 марта 2010

Мне нужно использовать IBM Informix для моего проекта, где у меня есть координаты точек, и мне нужно найти, какие точки присутствуют в прямоугольной области запроса.

Informix имеет модуль пространственной базы данных с объектами данных ST_POINT и ST_POLYGON. Я знаю, как создавать, вставлять и создавать индекс r-дерева для таблиц с такими объектами.

Но проблема в том, как сделать оператор SELECT, который перечисляет все точки в конкретной прямоугольной области.

1 Ответ

1 голос
/ 26 марта 2010

У вас есть документация по Spatial Datablade? Он доступен в информационном центре IDS 11.50 .

Например, в разделе в главе 1 обсуждается выполнение пространственных запросов:

Выполнение пространственных запросов

Распространенной задачей в ГИС-приложении является получение видимого подмножества пространственных данных для отображения в окне. Самый простой способ сделать это - определить полигон, представляющий границу окна, а затем использовать функцию SE_EnvelopesIntersect (), чтобы найти все пространственные объекты, которые перекрывают это окно:

SELECT name, type, zone FROM sensitive_areas
   WHERE SE_EnvelopesIntersect(zone, 
      ST_PolyFromText('polygon((20000 20000,60000 20000,60000 60000,20000 60000,20000 20000))', 5));

Запросы также могут использовать пространственные столбцы в предложении SQL WHERE для определения результирующего набора; пространственный столбец вообще не должен быть в наборе результатов. Например, следующий оператор SQL извлекает каждую уязвимую область с ближайшим участком опасных отходов, если чувствительная область находится в пяти милях от опасного участка. Функция ST_Buffer () создает круговой многоугольник, представляющий радиус в пять миль вокруг каждого опасного места. Геометрия ST_Polygon, возвращаемая функцией ST_Buffer (), становится аргументом функции ST_Overlaps (), которая возвращает t (TRUE), если зона ST_Polygon таблицы Sens_areas перекрывает ST_Polygon, созданный функцией ST_Buffer ():

SELECT sa.name sensitive_area, hs.name hazardous_site
   FROM sensitive_areas sa, hazardous_sites hs
   WHERE ST_Overlaps(sa.zone, ST_Buffer(hs.location, 26400));


sensitive_area  Summerhill Elementary School
hazardous_site  Landmark Industrial

sensitive_area  Johnson County Hospital
hazardous_site  Landmark Industrial 
...