Географические операторы




 

В MapInfo имеется несколько географических операторов. Они используются для выбора объектов на основании их взаимного расположения в пространстве. С географическими операторами в MapInfo используется специальное ключевое слово: "obj" или "object". Оно определяет, что MapInfo должно вычислить значение на основании графических объектов, а не соответствующих им в таблице числовых полей.

Имя географического оператора указывается между географическими объектами; выбрать его можно в списке "Операторы":

 

Contains Содержит Объект А содержит объект В, если центроид В лежит в границах объекта А.
Contains Entire Полностью содержит Объект А полностью содержит объект В, если граница В полностью лежит внутри границ А.
Contains Part Содержит часть Объект А содержит часть объекта В, если границы В частично лежат внутри границ А.
Within Внутри Объект А лежит внутри объекта В, если его центроид лежит и границах В.
Entirely Within Полностью внутри Объект А лежит полностью внутри объекта В, если его граница полностью лежит внутри границ В.
Partly Within Частично внутри Объект А лежит частично внутри объекта В, если его границы частично лежат внутри границ объекта В.
Intersects Пересекает Объект А пересекается с объектом В, если они имеют хотя бы одну общую точку.

 

Различие между Contains и Within, с одной стороны, и Contains Entire и Entirely Within, другой, состоит в том, что Contains и Within основаны на анализе центроида объекта, а Contains Entire и Entirely Within – на анализе всего объекта. Рисунок объясняет это различие:


 


Объект А содержит (Contains) объект В   Объект В внутри (Within) объекта А Объект А содержит (Contains) объект В   Объект В внутри (Within) объекта А Объект А полностью содержит (Contains Entire) объект В   Объект В полностью внутри (Entirely Within) объекта А   Объект А пересекает (Intersects) объект В   Объект В пересекает (Intersects) объект А

 

В обоих случаях объект А содержит объект В. Так как центроид объекта В лежит внутри границ объекта А. Однако, на рисунке слева часть объекта В лежит вне границ объекта А. А на рисунке справа весь объект В лежит внутри объекта А. Только во втором случае мы говорим, что объект полностью содержит объект В" или что "объект В лежит полностью внутри объекта А". Далее, из того, что А полностью содержит В, следует, что А содержит В; а из того, что А полностью лежит внутри В. следует, что А лежит внутри В.

При этом следует помнить, что MapInfo выполняет простые операции: содержит (Contains) и внутри (Within) гораздо быстрее, чем содержит полностью (Contains Entire) и полностью сну (Entirely Within). Поэтому, если Вам не обязательно точно знать, полностью ли один объект содержит другой, используйте Contains и Within вместо Contains Entire и Entirely Within.

Пересечение (Intersect) – единственный географический оператор, рекомендуемый для использования как в команде ВЫБРАТЬ, так как Contains, Contains Entire, Within и Entirely Within работают обычно с объектами, которые содержатся в двух разных таблицах. Эти операторы больше всего подходят для задания условия выбора и команде SQL-ЗАПРОС. А оператор Intersect может работать с объектами из одного набора, например, таблицей областей или улиц.

 

Логические операторы

and Принимает значение "истина" только том случае, если оба ее аргумента (логических выражения) истинны. Другими словами запись должна удовлетворять обоим условиям, чтобы попасть в выборку.
or Принимает значение "истина", если хотя бы один из ее аргументов имеет значение "истина". Другими словами запись должна удовлетворять хотя бы одному из условий, чтобы попасть в выборку.
not Принимает значение "истина", если аргумент имеет значение "ложь". Другими словами запись не должна удовлетворять условию, чтобы попасть в выборку.

 

 

"And" (И), "or" (ИЛИ) и "not" (HE) - это логические операторы. Они пользуются при составлении выражений в диалоге команды SQL-ЗАПРОС. MapInfo использует простые выражения как проверку, которая производится над каждой записью таблицы. Результатом каждой, проверки является ответ "да" или "нег" (т.е. "истина" или "ложь"). Комбинируя результаты проверки каждого условия с помощью логических операторов, MapInfo выдает общий ответ: удовлетворяет ли данная запись условию выбора?

Предположим, Вас интересует собственность стоимостью не мене 250000 в Калмыкии.

Выбираемые записи должны удовлетворять двум условиям, которые, можно задать двумя простыми выражениями:

29. СУММА >= 250000

30. ОБЛАСТЬ = "Калмыкия"

Сначала можно выбрать всю собственность заданной стоимости. Затем по полученной выборке будет произведен новый поиск: находится ли собственность к Калмыкии? Проще совместить две эти операции с помощью логического оператора "И" ("and").

31. ОБЛАСТЬ = "Калмыкия" and СУММА >= 250000

Теперь MapInfo будет проводить две проверки для каждой записи: является ли ОБЛАСТЬ Калмыкией? Равна или превосходит СУММА значение 250000? И если ответ на оба вопроса утвердительный (да), запись попадет в выборку. Если же хотя бы один ответ "нет", то запись не войдет в выборку.

Далее, найдем всю собственность стоимостью 250000 и более, не находящуюся в Калмыкии. Вы можете использовать оператор "not" для отрицания первой части выражения 31, чтобы получить выражение 32:

32. not (ОБЛАСТЬ = "Калмыкия") and СУММА >= 250000

Только записи, не относящиеся к Калмыкии, удовлетворяют первой части выражения 32. Рассмотрим также выражение 33:

33. not (ОБЛАСТЬ = "Калмыкия" and СУММА >= 250000)

Выражение 33 ­– это просто отрицание всего выражения 31. Все записи, не удовлетворяющие 31, будут удовлетворять 33. И наоборот, все записи, не удовлетворяющие 31. будут удовлетворять 33.

Для описания альтернатив Вы можете использовать "ИЛИ" ("or"), например:

34. ОБЛАСТЬ = "Калмыкия" or ОБЛАСТЬ = "Бурятия"

В выборку по данному условию войдут записи, относящиеся к любой из двух указанных областей. Можно, конечно, соединять с помощью ИЛИ и числовые выражения:

35. ПЛОЩАДЬ > 40 or СУММА > 250000

Здесь проверяется, что площадь больше 40 и стоимость больше 250000. Если выполнено хотя бы одно из этих двух условий, запись помещается в выборку.

Нужно внимательно составлять выражения с логическими операторами. Например, следующее выражение, которое на первый взгляд составлено правильно, некорректно:

36. ОБЛАСТЬ = "Калмыкия" or "Бурятия"

С точки зрения естественного языка смысл фразы "ОБЛАСТЬ есть Калмыкия или Бурятия" не отличается от смысла выражения 34. Но правила компьютерной логики и естественного языка несколько различаются.

MapInfo читает выражения слева направо. Программе надо определить, как в сложном выражении сгруппированы простые выражения. Представить, как идет такая группировка, можно расставив скобки в выражениях. MapInfo читает выражение 37 так же, как и выражение 34 – и это правильно отражает смысл нашего запроса. Выражение 36 MapInfo читает так, как показано в выражении 38, – смысл совсем не тот, который мы вкладывали в запрос.

37. (ОБЛАСТЬ="Калмыкия") or (ОБЛАСТЬ="Бурятия")

38. (ОБЛАСТЬ="Калмыкия") or ("Бурятия")

Оба выражения (37 и 38) имеют одинаковую первую часть (первое предложение). Но вторые предложения (после "or") совершенно различны. Второе предложение нижнего выражения - просто строка символов "Бурятия". Но правилам MapInfo, всем непустым строкам при вычислении их значения ставится в соответствие "истина". Поэтому при вычислении выражения 38, MapInfo включит все непустые записи в выборку. Причем результат первой проверки не будет иметь влияния на общий результат, так как значение второго предложения для всех непустых записей будет "истина" и, следовательно, значение всего выражения будет "истина".

Наконец, рассмотрим пример с отрицанием выражения 34:

39. not (ОБЛАСТЬ = "Бурятия" or ОБЛАСТЬ = "Калмыкия")

Выражению 34 удовлетворяют записи для Бурятии и Калмыкии, но не для Мордовии пли Хакасии, а выражению 39 – все области, кроме Бурятии или Калмыкии, в том числе Мордовия и Хакасия.

 

Числовые предложения

 

40. Доход домовладельцев не менее 65 000 и средний возраст равен 42:

ДОХОД >= 65000 and Round(СРЕД_ВОЗРАСТ, 1) = 42

Внимание: Это выражение состоит из двух предложений. Они соединены оператором "И" ("and"). Это означает, что оба предложения должны быть истинны, чтобы запись попала в выборку.

41. Все цены между 50000 и 100000:

ЦЕНА >= 50000 and ЦЕНА <= 100000

Внимание: Здесь заданы два условия, которые должны быть выполнены для записей выборки. Используя операторы "больше или равно" (>=) и "меньше или равно" (<=), мы обеспечиваем попадание записей с ценами в точности равными 50000 и 100000, в выборку. Если бы мы указали "больше" (>) и "меньше" (<), то выбирались бы записи с ценами от 50001 до 99999, но не попадали бы записи с ценами 50000 и 100000.

42. Все цены между 50000 и 100000 или между 150000 и 200000:

(ЦЕНА >= 50000 and ЦЕНА <= 100000) or (ЦЕНА >= 150000 and ЦЕНА <= 200000)

Внимание: Это сложное выражение вида: (выражение 1) или (выражение 2). Каждое из двух выражений имеет вид выражения 41.

 

Строковые предложения

 

43. Все покупатели с фамилиями от Н до Ф:

ФАМИЛИЯ >= "Н" and ФАМИЛИЯ < "Ф"

Внимание: В первом предложении этого выражения проверяется, что фамилии начинаются на "Н" или идут позднее по алфавиту. Во втором предложении проверяется, что фамилии идут по алфавиту ранее, чем буква "Ф". Этому условию удовлетворяют все фамилии на буквы с "Н" до "Ф".

44. Все покупатели с фамилиями от Н до Я:

ФАМИЛИЯ >= "Н"

Внимание: Так как "Я" - последняя буква алфавита, проводить проверку "снизу" не надо. Не может быть покупателя с фамилией, которая по алфавиту идет после фамилии на букву "Я".

45. Все покупатели с фамилиями на букву С:

ФАМИЛИЯ >= "С" and ФАМИЛИЯ < "Д"

Внимание: Логика та же, что в выражении 43.

46. Все покупатели, чьи фамилии находятся между "Се…" и "Су…":

ФАМИЛИЯ => "СЕ" and ФАМИЛИЯ < "СУ"

Внимание: Логика та же, что в выражении 45.

47. Все записи, не относящиеся к штату Техас:

not ШТАТ = "ТХ"

Внимание: Это выражение задает проверку значений в колонке ШТАТ. Если значение в ней отличается от "ТХ", то запись попадает в выборку.

 

Предложения с датами

 

48. Все записи о доставке в августе 1990 года:

Month(ДОСТАВЛЕНО) = 8 and Year(ДОСТАВЛЕНО) = 1990

Внимание: В этом выражении мы явно указали год с помощью функции "year (<название_колонки>)".

49. ДОСТАВЛЕНО >= "8-1-90" and ДОСТАВЛЕНО <= "8-31-90"

Внимание: В этом выражение мы вместо явного указания месяца и года используем формулировку, которая по-русски звучала бы так: записи о получении с 1 августа 1990 года по 31 августа 1990 включительно. Выражения 49 и 50 дают одинаковый результат.

50. Все записи о доставке в июле или сентябре:

Month(ДОСТАВЛЕНО) = 7 or Month(ДОСТАВЛЕНО) = 9

Внимание: Как и в предыдущем примере, год не указан явно. Это может создать проблемы, если Вы имеете в виду конкретный год, а в таблице хранятся данные за несколько лет. Если Вы хотите указать год:

51. Записи о получении в июле или сентябре 1989 года:

month(ДОСТАВЛЕНО) = any(7, 9) and year(ДОСТАВЛЕНО) = 89

Внимание: В первом предложении этого выражения использовано ключевое слово "any", которое будет описано ниже. Первое предложение истинно, если месяц равен одному из параметров в скобках – в нашем случае, июлю или сентябрю.

 

Ключевые слова

 

В MapInfo используются ключевые слова "any", "all", "in" и "between…and". При создании выражений их надо набирать с клавиатуры.

Слово "any" обозначает, что надо выбрать один из элементов.

52. АББР = any("AL", "MN", "ТХ")

Выражение 52 истинно для любой записи, относящейся к штатам Алабама, Миннесота или Техас. Чтобы понять действие "all", рассмотрим выражение 53:

53. АББР <> all ("All", "MN", "ТХ")

Оно означает: выбрать записи, не относящиеся ни к одному из штатов: Алабама, Миннесота, Техас. То есть выбираются все записи, кроме относящихся к Алабаме, Миннесоте или Техасу. Сравним с тем, что произойдет в примере 54:

54. АББР <> any("AL", "MN", "ТХ")

Записи для Алабамы будут выбраны, так как они не относятся к Миннесоте или Техасу; по тем же соображениям будут выбраны записи для Миннесоты и Техаса.

Пример применения "in":

55. АББР in("AL", "MN", "ТХ")

Он дает тот же результат, что и 54.

Заметим что "in" эквивалентно "=any", a "not in" эквивалентно "<>all".

Наконец примеры 56 и 57 показывают применение "between…and":

56. ЦЕНА between 50000 and 100000

57. ЦЕНА between 50000 and 100000) or (ЦЕНА between 150000 and 200000)

Эти выражения имеют те же значения, что 40 и 41 соответственно. Оператор between…and можно применять и к строкам (аналогично примерам 42, 44 и 45).



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2019-12-18 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: