Skip to content

Commit

Permalink
add st_relate
Browse files Browse the repository at this point in the history
  • Loading branch information
tsamsonov committed Oct 15, 2023
1 parent 7dc798b commit 0e9129f
Show file tree
Hide file tree
Showing 7 changed files with 266 additions and 8 deletions.
4 changes: 2 additions & 2 deletions _freeze/adv_06_Topology/execute-results/html.json

Large diffs are not rendered by default.

53 changes: 51 additions & 2 deletions adv_06_Topology.qmd
Original file line number Diff line number Diff line change
Expand Up @@ -462,10 +462,59 @@ $$
|--------------------|------------|-----------------------------------------|
| `ST_Contains` | $\lambda_2^\circ \subset \lambda_1^\circ$ | внутренность второго объекта располагается во внутренности первого |
| `ST_ContainsProperly` | $\lambda_2 \subset \lambda_1^\circ$ | второй объект располагается во внутренности первого |
| `ST_Covers` | $\lambda_2 \subset \lambda_1$ | второй объект располагается внутри первого |
| `ST_Covers` | $\lambda_2 \subset \lambda_1$ | второй объект располагается в первом |

## Геометрическое равенство
::: callout-note
## Но разница проявляется в области границы

::: columns
::: {.column width="10%"}
![](images/ST_CoversLine.svg){width="80%"}
:::

::: {.column width="90%"}
Чтобы найти линию, целиком совпадающую с границей полигона, нужно использовать `ST_Covers`. Она не располагается внутри полигона (`ST_Contains` и `ST_ContainsProperly` дадут ложь) и при этом полигон имеет пересечение с внутренностью линии (`ST_Touches` тоже даст ложь).
:::
:::
:::

## Равенство геометрий

**Пространственное равенство** означает, что геометрии совпадают на уровне множеств координат:

``` sql
SELECT ST_Equals(
ST_GeomFromText('GEOMETRYCOLLECTION (POINT (1 2), POINT (2 3))'),
ST_GeomFromText('MULTIPOINT ((1 2), (2 3))')
) -- true
```

**Геометрическое равенство** означает, что геометрии совпадают с точностью до внутреннего представления.

``` sql
SELECT ST_OrderingEquals(
ST_GeomFromText('GEOMETRYCOLLECTION (POINT (1 2), POINT (2 3))'),
ST_GeomFromText('MULTIPOINT ((1 2), (2 3))')
) -- false
```

`ST_OrderingEquals` --- дополнительная функция **PostGIS**, которая позволяет установить факт геометрического равенства. Если не учитывать информацию о СК, ее вызов соответствует выражению `ST_AsBinary(A) = ST_AsBinary(B)`

## ST_Relate: отношения общего вида

Стандарт **SQL/MM** также предписывает необходимость наличия функции `ST_Relate`, которую можно использовать для:

- проверки отношения на предмет соответствия заданному шаблону *DE-9IM*;

- вычисления фактической матрицы *DE-9IM* для заданных объектов.

| **SQL/MM** | DE-9IM | Расшифровка |
|---------|-------------|---------------------------------------------------|
| `T` | $\dim(S) \neq -$ | Пересечение существует |
| `F` | $\dim(S) = -$ | Пересечение не существует |
| `*` | --- | Наличие пересечения не имеет значения |
| `0` | $\dim(S) = 0$ | Пересечение существует и его размерность равна $0$ |
| `1` | $\dim(S) = 1$ | Пересечение существует и его размерность равна $1$ |
| `2` | $\dim(S) = 2$ | Пересечение существует и его размерность равна $2$ |

## Библиография
160 changes: 157 additions & 3 deletions docs/adv_06_Topology.html
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,71 @@
margin: 0 0.8em 0.2em -1em; /* quarto-specific, see https://github.com/quarto-dev/quarto-cli/issues/4556 */
vertical-align: middle;
}
/* CSS for syntax highlighting */
pre > code.sourceCode { white-space: pre; position: relative; }
pre > code.sourceCode > span { line-height: 1.25; }
pre > code.sourceCode > span:empty { height: 1.2em; }
.sourceCode { overflow: visible; }
code.sourceCode > span { color: inherit; text-decoration: inherit; }
div.sourceCode { margin: 1em 0; }
pre.sourceCode { margin: 0; }
@media screen {
div.sourceCode { overflow: auto; }
}
@media print {
pre > code.sourceCode { white-space: pre-wrap; }
pre > code.sourceCode > span { text-indent: -5em; padding-left: 5em; }
}
pre.numberSource code
{ counter-reset: source-line 0; }
pre.numberSource code > span
{ position: relative; left: -4em; counter-increment: source-line; }
pre.numberSource code > span > a:first-child::before
{ content: counter(source-line);
position: relative; left: -1em; text-align: right; vertical-align: baseline;
border: none; display: inline-block;
-webkit-touch-callout: none; -webkit-user-select: none;
-khtml-user-select: none; -moz-user-select: none;
-ms-user-select: none; user-select: none;
padding: 0 4px; width: 4em;
color: #aaaaaa;
}
pre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa; padding-left: 4px; }
div.sourceCode
{ color: #003b4f; background-color: #f1f3f5; }
@media screen {
pre > code.sourceCode > span > a:first-child::before { text-decoration: underline; }
}
code span { color: #003b4f; } /* Normal */
code span.al { color: #ad0000; } /* Alert */
code span.an { color: #5e5e5e; } /* Annotation */
code span.at { color: #657422; } /* Attribute */
code span.bn { color: #ad0000; } /* BaseN */
code span.bu { } /* BuiltIn */
code span.cf { color: #003b4f; } /* ControlFlow */
code span.ch { color: #20794d; } /* Char */
code span.cn { color: #8f5902; } /* Constant */
code span.co { color: #5e5e5e; } /* Comment */
code span.cv { color: #5e5e5e; font-style: italic; } /* CommentVar */
code span.do { color: #5e5e5e; font-style: italic; } /* Documentation */
code span.dt { color: #ad0000; } /* DataType */
code span.dv { color: #ad0000; } /* DecVal */
code span.er { color: #ad0000; } /* Error */
code span.ex { } /* Extension */
code span.fl { color: #ad0000; } /* Float */
code span.fu { color: #4758ab; } /* Function */
code span.im { color: #00769e; } /* Import */
code span.in { color: #5e5e5e; } /* Information */
code span.kw { color: #003b4f; } /* Keyword */
code span.op { color: #5e5e5e; } /* Operator */
code span.ot { color: #003b4f; } /* Other */
code span.pp { color: #ad0000; } /* Preprocessor */
code span.sc { color: #5e5e5e; } /* SpecialChar */
code span.ss { color: #20794d; } /* SpecialString */
code span.st { color: #20794d; } /* String */
code span.va { color: #111111; } /* Variable */
code span.vs { color: #20794d; } /* VerbatimString */
code span.wa { color: #5e5e5e; font-style: italic; } /* Warning */
/* CSS for citations */
div.csl-bib-body { }
div.csl-entry {
Expand Down Expand Up @@ -1172,14 +1237,103 @@ <h2>Contains, ContainsProperly, Covers</h2>
<tr class="odd">
<td><code>ST_Covers</code></td>
<td><span class="math inline">\(\lambda_2 \subset \lambda_1\)</span></td>
<td>второй объект располагается внутри первого</td>
<td>второй объект располагается в первом</td>
</tr>
</tbody>
</table>
<div class="callout callout-note callout-titled callout-style-default">
<div class="callout-body">
<div class="callout-title">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<p><strong>Но разница проявляется в области границы</strong></p>
</div>
<div class="callout-content">
<div class="columns">
<div class="column" style="width:10%;">
<div id="fig-539a35d47e664c97a50115a146a7f1bd-14" class="quarto-figure quarto-figure-center" width="80%">
<figure class="quarto-float quarto-float-fig">
<div>
<img data-src="images/ST_CoversLine.svg" id="fig-539a35d47e664c97a50115a146a7f1bd-14" style="width:80.0%">
</div>
</figure>
</div>
</div><div class="column" style="width:90%;">
<p>Чтобы найти линию, целиком совпадающую с границей полигона, нужно использовать <code>ST_Covers</code>. Она не располагается внутри полигона (<code>ST_Contains</code> и <code>ST_ContainsProperly</code> дадут ложь) и при этом полигон имеет пересечение с внутренностью линии (<code>ST_Touches</code> тоже даст ложь).</p>
</div>
</div>
</div>
</div>
</div>
</section>
<section id="геометрическое-равенство" class="slide level2">
<h2>Геометрическое равенство</h2>
<section id="равенство-геометрий" class="slide level2">
<h2>Равенство геометрий</h2>
<p><strong>Пространственное равенство</strong> означает, что геометрии совпадают на уровне множеств координат:</p>
<div class="sourceCode" id="cb1"><pre class="sourceCode numberSource sql number-lines code-with-copy"><code class="sourceCode sql"><span id="cb1-1"><a href="#cb1-1"></a><span class="kw">SELECT</span> ST_Equals(</span>
<span id="cb1-2"><a href="#cb1-2"></a> ST_GeomFromText(<span class="st">'GEOMETRYCOLLECTION (POINT (1 2), POINT (2 3))'</span>),</span>
<span id="cb1-3"><a href="#cb1-3"></a> ST_GeomFromText(<span class="st">'MULTIPOINT ((1 2), (2 3))'</span>)</span>
<span id="cb1-4"><a href="#cb1-4"></a>) <span class="co">-- true</span></span></code><button title="Скопировать текст" class="code-copy-button"><i class="bi"></i></button></pre></div>
<p><strong>Геометрическое равенство</strong> означает, что геометрии совпадают с точностью до внутреннего представления.</p>
<div class="sourceCode" id="cb2"><pre class="sourceCode numberSource sql number-lines code-with-copy"><code class="sourceCode sql"><span id="cb2-1"><a href="#cb2-1"></a><span class="kw">SELECT</span> ST_OrderingEquals(</span>
<span id="cb2-2"><a href="#cb2-2"></a> ST_GeomFromText(<span class="st">'GEOMETRYCOLLECTION (POINT (1 2), POINT (2 3))'</span>),</span>
<span id="cb2-3"><a href="#cb2-3"></a> ST_GeomFromText(<span class="st">'MULTIPOINT ((1 2), (2 3))'</span>)</span>
<span id="cb2-4"><a href="#cb2-4"></a>) <span class="co">-- false</span></span></code><button title="Скопировать текст" class="code-copy-button"><i class="bi"></i></button></pre></div>
<p><code>ST_OrderingEquals</code> — дополнительная функция <strong>PostGIS</strong>, которая позволяет установить факт геометрического равенства. Если не учитывать информацию о СК, ее вызов соответствует выражению <code>ST_AsBinary(A) = ST_AsBinary(B)</code></p>
</section>
<section id="st_relate-отношения-общего-вида" class="slide level2">
<h2>ST_Relate: отношения общего вида</h2>
<p>Стандарт <strong>SQL/MM</strong> также предписывает необходимость наличия функции <code>ST_Relate</code>, которую можно использовать для:</p>
<ul>
<li><p>проверки отношения на предмет соответствия заданному шаблону <em>DE-9IM</em>;</p></li>
<li><p>вычисления фактической матрицы <em>DE-9IM</em> для заданных объектов.</p></li>
</ul>
<table>
<colgroup>
<col style="width: 12%">
<col style="width: 17%">
<col style="width: 69%">
</colgroup>
<thead>
<tr class="header">
<th><strong>SQL/MM</strong></th>
<th>DE-9IM</th>
<th>Расшифровка</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><code>T</code></td>
<td><span class="math inline">\(\dim(S) \neq -\)</span></td>
<td>Пересечение существует</td>
</tr>
<tr class="even">
<td><code>F</code></td>
<td><span class="math inline">\(\dim(S) = -\)</span></td>
<td>Пересечение не существует</td>
</tr>
<tr class="odd">
<td><code>*</code></td>
<td></td>
<td>Наличие пересечения не имеет значения</td>
</tr>
<tr class="even">
<td><code>0</code></td>
<td><span class="math inline">\(\dim(S) = 0\)</span></td>
<td>Пересечение существует и его размерность равна <span class="math inline">\(0\)</span></td>
</tr>
<tr class="odd">
<td><code>1</code></td>
<td><span class="math inline">\(\dim(S) = 1\)</span></td>
<td>Пересечение существует и его размерность равна <span class="math inline">\(1\)</span></td>
</tr>
<tr class="even">
<td><code>2</code></td>
<td><span class="math inline">\(\dim(S) = 2\)</span></td>
<td>Пересечение существует и его размерность равна <span class="math inline">\(2\)</span></td>
</tr>
</tbody>
</table>
</section>
<section id="библиография" class="slide level2 smaller scrollable">
<h2>Библиография</h2>
Expand Down
9 changes: 9 additions & 0 deletions docs/images/ST_CoversLine.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading

0 comments on commit 0e9129f

Please sign in to comment.