diff --git a/.DS_Store b/.DS_Store index f5a060a..1f495fe 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/_freeze/adv_05_PostGIS/execute-results/html.json b/_freeze/adv_05_PostGIS/execute-results/html.json index 41c5701..d34742a 100644 --- a/_freeze/adv_05_PostGIS/execute-results/html.json +++ b/_freeze/adv_05_PostGIS/execute-results/html.json @@ -1,7 +1,7 @@ { - "hash": "d742e532f3665d58ee4ad47f85ef236c", + "hash": "29de79a3535f0842d0aa0893b1b27695", "result": { - "markdown": "---\ntitle: \"PostGIS\"\nsubtitle: \"Геоинформатика I. Базы пространственных данных\"\ndate: today\ndate-format: long\nauthor: \"Самсонов Тимофей Евгеньевич\"\nexecute:\n echo: false\n freeze: true\nengine: knitr\nformat:\n revealjs: \n theme: [default, custom.scss]\n margin: 0.2\n width: 1280\n height: 720\n slide-number: true\n footer: \"Самсонов Т. Е. Геоинформатика: курс лекций\"\n header-includes: \nbibliography: references.yaml\nmainfont: PT Sans\n---\n\n\n## Базовые библиотеки\n\nФункциональность **PostGIS** опирается на 4 библиотеки:\n\n::: columns\n::: {.column width=\"50%\"}\n::: columns\n::: {.column width=\"30%\"}\n![](images/gdalicon.png){width=\"100%\"}\n:::\n\n::: {.column width=\"70%\"}\n**GDAL** выполняет конвертацию между форматами данных и растровые операции\n:::\n:::\n\n**PROJ** выполняет преобразования систем координат\n\n![](images/projicon.png){width=\"70%\"}\n:::\n\n::: {.column width=\"50%\"}\n**GEOS** выполняет геометрические операции в *2D*\n\n![](images/geosicon.png)\n\n**\\[SF\\]CGAL** выполняет геометрические операции в *3D*\n\n![](images/CGAL.png){width=\"70%\"}\n:::\n:::\n\n## Структура базы данных\n\n![](images/pg_database.svg){width=\"100%\"}\n\n## Структура схемы\n\n![](images/pg_schema1.svg){width=\"100%\"}\n\n## Структура схемы (продолжение)\n\n![](images/pg_schema2.svg){width=\"100%\"}\n\n## Библиография\n", + "markdown": "---\ntitle: \"PostGIS\"\nsubtitle: \"Геоинформатика I. Базы пространственных данных\"\ndate: today\ndate-format: long\nauthor: \"Самсонов Тимофей Евгеньевич\"\nexecute:\n echo: false\n freeze: true\nengine: knitr\nformat:\n revealjs: \n theme: [default, custom.scss]\n margin: 0.2\n width: 1280\n height: 720\n slide-number: true\n footer: \"Самсонов Т. Е. Геоинформатика: курс лекций\"\n header-includes: \nbibliography: references.yaml\nmainfont: PT Sans\n---\n\n\n## Базовые библиотеки\n\nФункциональность **PostGIS** опирается на 4 библиотеки:\n\n::: columns\n::: {.column width=\"50%\"}\n::: columns\n::: {.column width=\"30%\"}\n![](images/gdalicon.png){width=\"100%\"}\n:::\n\n::: {.column width=\"70%\"}\n**GDAL** выполняет конвертацию между форматами данных и растровые операции\n:::\n:::\n\n**PROJ** выполняет преобразования систем координат\n\n![](images/projicon.png){width=\"70%\"}\n:::\n\n::: {.column width=\"50%\"}\n**GEOS** выполняет геометрические операции в *2D*\n\n![](images/geosicon.png)\n\n**\\[SF\\]CGAL** выполняет геометрические операции в *3D*\n\n![](images/CGAL.png){width=\"70%\"}\n:::\n:::\n\n## Структура базы данных\n\n![](images/pg_database.svg){width=\"100%\"}\n\n## Структура схемы\n\n![](images/pg_schema1.svg){width=\"100%\"}\n\n## Структура схемы (продолжение)\n\n![](images/pg_schema2.svg){width=\"100%\"}\n\n## Создание пустой БД\n\n**Создание БД** (запрос к любой существующей БД)\n\n``` sql\nCREATE DATABASE satino;\n```\n\n**Создание схемы и активация расширения**\n\n``` sql\nCREATE SCHEMA postgis;\nGRANT USAGE ON schema postgis to public; -- доступ для всех\nCREATE EXTENSION postgis SCHEMA postgis; -- включить postgis для схемы\nCREATE EXTENSION postgis_raster SCHEMA postgis; -- включить растры для схемы\nALTER DATABASE satino SET search_path=public,postgis; -- добавить в путь поиска\n```\n\n**Проверка установки**\n\n``` sql\nSELECT postgis_full_version();\n```\n\n::: callout-important\n## Внимание\n\nУстановка расширения `postgis` через графический интерфейс не позволяет выбрать схему и выполняется в схеме `public`.\n:::\n\n## Типы пространственных данных\n\nВ PostGIS существует 4 типа пространственных данных\n\n| | Тип | Особенности |\n|-----|-------------|-------------------------------------------------|\n| 1 | `geometry` | Векторные данные в декартовой системе координат |\n| 2 | `geography` | Векторные данные в угловой системе координат |\n| 3 | `raster` | Растровые данные (многомерные) |\n| 4 | `topology` | Топологические данные (вершины и грани). |\n\n::: callout-note\n## Топологические данные\n\nТип данных `topology` используется для хранения топологических покрытий и сетевых данных. Для анализа последних применяется отдельное расширение **pgRouting**.\n:::\n\n::: callout-tip\n## Интересный факт\n\nPostGIS позволяет хранить несколько пространственных столбцов в одной таблице\n:::\n\n## Каталог систем координат\n\n::: columns\n::: {.column width=\"30%\"}\nСистемы координат хранятся в таблице `spatial_ref_sys`\n\n::: callout-note\n#### SRS vs CRS\n\nНесмотря на то, что каталог имеет называется *SRS (Spatial Reference Systems)*, по факту он хранит описание *CRS (Coordinate Reference Systems)*.\n:::\n\n::: callout-important\n#### Терминология WKT\n\nТерминология WKT при описании CRS может не полностью соответствовать стандартами ISO / OGC\n:::\n:::\n\n::: {.column width=\"70%\"}\n![](images/srs_postgis.png)\n:::\n:::\n\n## Создание пространственных таблиц\n\nПри создании пространственных таблиц необходимо указать\n\n- уникальный идентификатор\n\n- геометрический столбец заданного типа и КСО\n\nНапример, таблица точек гидрологических промеров может иметь следующий состав:\n\n``` sql\nCREATE TABLE postgis.hydro_measures (\n\tfid serial primary key,\n\tdepth real,\n\tgeom geography(point, 4326)\n)\n```\n\n## Ручное создание данных\n\nВставка новых строк выполняется посредством стандартной команды INSERT:\n\n``` sql\nINSERT INTO postgis.hydro_measures(fid, depth, geom)\nVALUES\n\t(1, 1.23, ST_GeomFromText('POINT (36.37802128 55.21121827)')),\n\t(2, 1.57, ST_GeomFromText('POINT (36.37834198 55.21127511)')),\n\t(3, 0.78, ST_GeomFromText('POINT (36.37861509 55.21139158)')),\n\t(4, 0.95, ST_GeomFromText('POINT (36.37905934 55.21137259)')),\n\t(5, 1.11, ST_GeomFromText('POINT (36.37938529 55.21125473)'));\n```\n\nАльтернативный синтаксис через преобразование строки к типу данных:\n\n``` sql\nINSERT INTO postgis.hydro_measures(fid, depth, geom)\nVALUES\n\t(1, 1.23, 'POINT (36.37802128 55.21121827)'::geography),\n\t(2, 1.57, 'POINT (36.37834198 55.21127511)'::geography),\n\t(3, 0.78, 'POINT (36.37861509 55.21139158)'::geography),\n\t(4, 0.95, 'POINT (36.37905934 55.21137259)'::geography),\n\t(5, 1.11, 'POINT (36.37938529 55.21125473)'::geography);\n```\n\n## Импорт из CSV\n\nДля импорта можно использовать команду `COPY` :\n\n``` sql\nCREATE TABLE IF NOT EXISTS postgis.geo_points (\n\tfid serial primary key,\n\tname text,\n\tcomment text,\n\theight_abs real,\n\theight_add real,\n\ttype text,\n\tx real, \n\ty real\n);\n\nDELETE FROM postgis.geo_points; -- опционально, если хотите очистить\n\nCOPY postgis.geo_points \n\tFROM '/Volumes/Data/Spatial/Satino/geo_points.csv' \n\tDELIMITER as ',' \n\tCSV HEADER;\n```\n\n## Библиография\n", "supporting": [], "filters": [ "rmarkdown/pagebreak.lua" diff --git a/adv_03_WKT_WKB.qmd b/adv_03_WKT_WKB.qmd index 6fda156..e1db885 100644 --- a/adv_03_WKT_WKB.qmd +++ b/adv_03_WKT_WKB.qmd @@ -99,21 +99,15 @@ mainfont: PT Sans **БНФ** базируется на следующих обозначениях: -+---------+------------------------------------------------------------------------------------------------------------------------------+ -| `{}` | Опциональный (необязательный) токен; фигурные скобки используются для обозначения и не являются частью токена | -+---------+------------------------------------------------------------------------------------------------------------------------------+ -| `()` | Группировка последовательности токенов в один токен; круглые скобки используются для обозначения и не являются частью токена | -+---------+------------------------------------------------------------------------------------------------------------------------------+ -| `*` | Опциональное (необязательное) использование множества экземпляров токена | -+---------+------------------------------------------------------------------------------------------------------------------------------+ -| `|` | Разделитель альтернативных токенов; не включается в результат | -+---------+------------------------------------------------------------------------------------------------------------------------------+ -| `<>` | Определяемый нетерминальный токен | -+---------+------------------------------------------------------------------------------------------------------------------------------+ -| `::=` | Оператор, обозначающий производящее правило: левый операнд может быть заменен на правый. | -+---------+------------------------------------------------------------------------------------------------------------------------------+ -| | Последовательность символов без обозначений представляет собой терминальный токен | -+---------+------------------------------------------------------------------------------------------------------------------------------+ +| | | +|-------|------------------------------------------------------------------------------------------------------------------------------| +| `{}` | Опциональный (необязательный) токен; фигурные скобки используются для обозначения и не являются частью токена | +| `()` | Группировка последовательности токенов в один токен; круглые скобки используются для обозначения и не являются частью токена | +| `*` | Опциональное (необязательное) использование множества экземпляров токена | +| `|` | Разделитель альтернативных токенов; не включается в результат | +| `<>` | Определяемый нетерминальный токен | +| `::=` | Оператор, обозначающий производящее правило: левый операнд может быть заменен на правый. | +| | Последовательность символов без обозначений представляет собой терминальный токен | ## Определение WKT @@ -138,27 +132,18 @@ mainfont: PT Sans ## Определение WKT -+---------------------------------------------------------------------------------------------------------------------------+ +| | +|---------------------------------------------------------------------------------------------------------------------------| | ` ::= {{}}|` | -+---------------------------------------------------------------------------------------------------------------------------+ | ` ::= ` | -+---------------------------------------------------------------------------------------------------------------------------+ | ` ::= ` | -+---------------------------------------------------------------------------------------------------------------------------+ | ` ::= E` | -+---------------------------------------------------------------------------------------------------------------------------+ | ` ::= | ` | -+---------------------------------------------------------------------------------------------------------------------------+ | ` ::= {}` | -+---------------------------------------------------------------------------------------------------------------------------+ | ` ::= ` | -+---------------------------------------------------------------------------------------------------------------------------+ | ` ::= ` | -+---------------------------------------------------------------------------------------------------------------------------+ | ` ::= ` | -+---------------------------------------------------------------------------------------------------------------------------+ | ` ::= ` | -+---------------------------------------------------------------------------------------------------------------------------+ ## Разложение действительного числа @@ -200,13 +185,11 @@ mainfont: PT Sans ## Определение $2D$-геометрий -+------------------------------------------------------------------------------------------------------------------+ +| | +|------------------------------------------------------------------------------------------------------------------| | ` ::= | { }* ` | -+------------------------------------------------------------------------------------------------------------------+ | ` ::= polyhedralsurface ` | -+------------------------------------------------------------------------------------------------------------------+ | ` ::= tin ` | -+------------------------------------------------------------------------------------------------------------------+ ![](images/tin_tagged.svg){width="100%"} @@ -285,13 +268,10 @@ mainfont: PT Sans 3. Интерфейс объектов с $M$-геометрией содержит дополнительные методы `LocateAlong()` и `LocateBetween()`. -+-------------------------+-------------------------------------------------------------------------------------------+ | Метод | Назначение | -+=========================+===========================================================================================+ +|-------------------------|-------------------------------------------------------------------------------------------| | `LocateAlong(m)` | Возвращает производную геометрическую коллекцию, которая соответствует `m` | -+-------------------------+-------------------------------------------------------------------------------------------+ | `LocateBetween(m1, m2)` | Возвращает производную геометрическую коллекцию, которая соответствует отрезку `[m1, m2]` | -+-------------------------+-------------------------------------------------------------------------------------------+ ## Дополнительные измерения @@ -365,31 +345,20 @@ plt.show() ## Коды геометрических типов {.table-small} -+----------------------------------+---------+---------+---------+----------+ -| **Тип** | **XY** | **XYZ** | **XYM** | **XYZM** | -+----------------------------------+---------+---------+---------+----------+ -| `GEOMETRY` | `0` | `1000` | `2000` | `3000` | -+----------------------------------+---------+---------+---------+----------+ -| `POINT` | `1` | `1001` | `2001` | `3001` | -+----------------------------------+---------+---------+---------+----------+ -| `LINESTRING` | `2` | `1002` | `2002` | `3002` | -+----------------------------------+---------+---------+---------+----------+ -| `POLYGON` | `3` | `1003` | `2003` | `3003` | -+----------------------------------+---------+---------+---------+----------+ -| `MULTIPOINT` | `4` | `1004` | `2004` | `3004` | -+----------------------------------+---------+---------+---------+----------+ -| `MULTILINESTRING` | `5` | `1005` | `2005` | `3005` | -+----------------------------------+---------+---------+---------+----------+ -| `MULTIPOLYGON` | `6` | `1006` | `2006` | `3006` | -+----------------------------------+---------+---------+---------+----------+ -| `GEOMETRYCOLLECTION` | `7` | `1007` | `2007` | `3007` | -+----------------------------------+---------+---------+---------+----------+ -| $\texttt{CIRCULARSTRING}^ \star$ | `8` | `1008` | `2008` | `3008` | -+----------------------------------+---------+---------+---------+----------+ -| $\texttt{COMPOUNDCURVE}^\star$ | `9` | `1009` | `2009` | `3009` | -+----------------------------------+---------+---------+---------+----------+ -| $\texttt{CURVEPOLYGON}^\star$ | `10` | `1010` | `2010` | `3010` | -+----------------------------------+---------+---------+---------+----------+ +| | | | | | +|----------------------------------|--------|---------|---------|----------| +| **Тип** | **XY** | **XYZ** | **XYM** | **XYZM** | +| `GEOMETRY` | `0` | `1000` | `2000` | `3000` | +| `POINT` | `1` | `1001` | `2001` | `3001` | +| `LINESTRING` | `2` | `1002` | `2002` | `3002` | +| `POLYGON` | `3` | `1003` | `2003` | `3003` | +| `MULTIPOINT` | `4` | `1004` | `2004` | `3004` | +| `MULTILINESTRING` | `5` | `1005` | `2005` | `3005` | +| `MULTIPOLYGON` | `6` | `1006` | `2006` | `3006` | +| `GEOMETRYCOLLECTION` | `7` | `1007` | `2007` | `3007` | +| $\texttt{CIRCULARSTRING}^ \star$ | `8` | `1008` | `2008` | `3008` | +| $\texttt{COMPOUNDCURVE}^\star$ | `9` | `1009` | `2009` | `3009` | +| $\texttt{CURVEPOLYGON}^\star$ | `10` | `1010` | `2010` | `3010` | $\star$ --- зарезервированные типы @@ -520,11 +489,10 @@ $$ Число $11789422_{10}$ ($\texttt{0x}\color{red}{\texttt{B3}}\color{green}{\texttt{E4}}\color{blue}{\texttt{6E}}_{16}$) можно записать двумя способами: -+--------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| | | +|--------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | $\texttt{Big Endian}$ | $\color{red}{A_{n-1}}...\color{green}{A_1}\color{blue}{A_0} \rightarrow \color{red}{\texttt{1011 0011}}~\color{green}{\texttt{1110 0100}}~\color{blue}{\texttt{0110 1110}}$ | -+--------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | $\texttt{Little Endian}$ | $\color{blue}{A_0}\color{green}{A_1}...\color{red}{A_{n-1}} \rightarrow \color{blue}{\texttt{0110 1110}}~\color{green}{\texttt{1110 0100}}~\color{red}{\texttt{1011 0011}}$ | -+--------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ ## IEEE 754 `binary64` diff --git a/adv_05_PostGIS.qmd b/adv_05_PostGIS.qmd index d44f16f..79839c3 100644 --- a/adv_05_PostGIS.qmd +++ b/adv_05_PostGIS.qmd @@ -65,4 +65,149 @@ mainfont: PT Sans ![](images/pg_schema2.svg){width="100%"} +## Создание пустой БД + +**Создание БД** (запрос к любой существующей БД) + +``` sql +CREATE DATABASE satino; +``` + +**Создание схемы и активация расширения** + +``` sql +CREATE SCHEMA postgis; +GRANT USAGE ON schema postgis to public; -- доступ для всех +CREATE EXTENSION postgis SCHEMA postgis; -- включить postgis для схемы +CREATE EXTENSION postgis_raster SCHEMA postgis; -- включить растры для схемы +ALTER DATABASE satino SET search_path=public,postgis; -- добавить в путь поиска +``` + +**Проверка установки** + +``` sql +SELECT postgis_full_version(); +``` + +::: callout-important +## Внимание + +Установка расширения `postgis` через графический интерфейс не позволяет выбрать схему и выполняется в схеме `public`. +::: + +## Типы пространственных данных + +В PostGIS существует 4 типа пространственных данных + +| | Тип | Особенности | +|-----|-------------|-------------------------------------------------| +| 1 | `geometry` | Векторные данные в декартовой системе координат | +| 2 | `geography` | Векторные данные в угловой системе координат | +| 3 | `raster` | Растровые данные (многомерные) | +| 4 | `topology` | Топологические данные (вершины и грани). | + +::: callout-note +## Топологические данные + +Тип данных `topology` используется для хранения топологических покрытий и сетевых данных. Для анализа последних применяется отдельное расширение **pgRouting**. +::: + +::: callout-tip +## Интересный факт + +PostGIS позволяет хранить несколько пространственных столбцов в одной таблице +::: + +## Каталог систем координат + +::: columns +::: {.column width="30%"} +Системы координат хранятся в таблице `spatial_ref_sys` + +::: callout-note +#### SRS vs CRS + +Несмотря на то, что каталог имеет называется *SRS (Spatial Reference Systems)*, по факту он хранит описание *CRS (Coordinate Reference Systems)*. +::: + +::: callout-important +#### Терминология WKT + +Терминология WKT при описании CRS может не полностью соответствовать стандартами ISO / OGC +::: +::: + +::: {.column width="70%"} +![](images/srs_postgis.png) +::: +::: + +## Создание пространственных таблиц + +При создании пространственных таблиц необходимо указать + +- уникальный идентификатор + +- геометрический столбец заданного типа и КСО + +Например, таблица точек гидрологических промеров может иметь следующий состав: + +``` sql +CREATE TABLE postgis.hydro_measures ( + fid serial primary key, + depth real, + geom geography(point, 4326) +) +``` + +## Ручное создание данных + +Вставка новых строк выполняется посредством стандартной команды INSERT: + +``` sql +INSERT INTO postgis.hydro_measures(fid, depth, geom) +VALUES + (1, 1.23, ST_GeomFromText('POINT (36.37802128 55.21121827)')), + (2, 1.57, ST_GeomFromText('POINT (36.37834198 55.21127511)')), + (3, 0.78, ST_GeomFromText('POINT (36.37861509 55.21139158)')), + (4, 0.95, ST_GeomFromText('POINT (36.37905934 55.21137259)')), + (5, 1.11, ST_GeomFromText('POINT (36.37938529 55.21125473)')); +``` + +Альтернативный синтаксис через преобразование строки к типу данных: + +``` sql +INSERT INTO postgis.hydro_measures(fid, depth, geom) +VALUES + (1, 1.23, 'POINT (36.37802128 55.21121827)'::geography), + (2, 1.57, 'POINT (36.37834198 55.21127511)'::geography), + (3, 0.78, 'POINT (36.37861509 55.21139158)'::geography), + (4, 0.95, 'POINT (36.37905934 55.21137259)'::geography), + (5, 1.11, 'POINT (36.37938529 55.21125473)'::geography); +``` + +## Импорт из CSV + +Для импорта можно использовать команду `COPY` : + +``` sql +CREATE TABLE IF NOT EXISTS postgis.geo_points ( + fid serial primary key, + name text, + comment text, + height_abs real, + height_add real, + type text, + x real, + y real +); + +DELETE FROM postgis.geo_points; -- опционально, если хотите очистить + +COPY postgis.geo_points + FROM '/Volumes/Data/Spatial/Satino/geo_points.csv' + DELIMITER as ',' + CSV HEADER; +``` + ## Библиография diff --git a/docs/adv_05_PostGIS.html b/docs/adv_05_PostGIS.html index feb3acd..3e6cf3b 100644 --- a/docs/adv_05_PostGIS.html +++ b/docs/adv_05_PostGIS.html @@ -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 { display: inline-block; 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 */ @@ -338,7 +403,7 @@

PostGIS

-

21 сентября 2023 г.

+

24 сентября 2023 г.

Базовые библиотеки

@@ -374,6 +439,183 @@

Структура схемы

Структура схемы (продолжение)

+
+

Создание пустой БД

+

Создание БД (запрос к любой существующей БД)

+
CREATE DATABASE satino;
+

Создание схемы и активация расширения

+
CREATE SCHEMA postgis;
+GRANT USAGE ON schema postgis to public; -- доступ для всех
+CREATE EXTENSION postgis SCHEMA postgis; -- включить postgis для схемы
+CREATE EXTENSION postgis_raster SCHEMA postgis; -- включить растры для схемы
+ALTER DATABASE satino SET search_path=public,postgis; -- добавить в путь поиска
+

Проверка установки

+
SELECT postgis_full_version();
+
+
+
+
+ +
+

Внимание

+
+
+

Установка расширения postgis через графический интерфейс не позволяет выбрать схему и выполняется в схеме public.

+
+
+
+
+
+

Типы пространственных данных

+

В PostGIS существует 4 типа пространственных данных

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ТипОсобенности
1geometryВекторные данные в декартовой системе координат
2geographyВекторные данные в угловой системе координат
3rasterРастровые данные (многомерные)
4topologyТопологические данные (вершины и грани).
+
+
+
+
+ +
+

Топологические данные

+
+
+

Тип данных topology используется для хранения топологических покрытий и сетевых данных. Для анализа последних применяется отдельное расширение pgRouting.

+
+
+
+
+
+
+
+ +
+

Интересный факт

+
+
+

PostGIS позволяет хранить несколько пространственных столбцов в одной таблице

+
+
+
+
+
+

Каталог систем координат

+
+
+

Системы координат хранятся в таблице spatial_ref_sys

+
+
+
+
+ +
+

SRS vs CRS

+
+
+

Несмотря на то, что каталог имеет называется SRS (Spatial Reference Systems), по факту он хранит описание CRS (Coordinate Reference Systems).

+
+
+
+
+
+
+
+ +
+

Терминология WKT

+
+
+

Терминология WKT при описании CRS может не полностью соответствовать стандартами ISO / OGC

+
+
+
+
+

+
+
+
+
+

Создание пространственных таблиц

+

При создании пространственных таблиц необходимо указать

+
    +
  • уникальный идентификатор

  • +
  • геометрический столбец заданного типа и КСО

  • +
+

Например, таблица точек гидрологических промеров может иметь следующий состав:

+
CREATE TABLE postgis.hydro_measures (
+    fid serial primary key,
+    depth real,
+    geom geography(point, 4326)
+)
+
+
+

Ручное создание данных

+

Вставка новых строк выполняется посредством стандартной команды INSERT:

+
INSERT INTO postgis.hydro_measures(fid, depth, geom)
+VALUES
+    (1, 1.23, ST_GeomFromText('POINT (36.37802128 55.21121827)')),
+    (2, 1.57, ST_GeomFromText('POINT (36.37834198 55.21127511)')),
+    (3, 0.78, ST_GeomFromText('POINT (36.37861509 55.21139158)')),
+    (4, 0.95, ST_GeomFromText('POINT (36.37905934 55.21137259)')),
+    (5, 1.11, ST_GeomFromText('POINT (36.37938529 55.21125473)'));
+

Альтернативный синтаксис через преобразование строки к типу данных:

+
INSERT INTO postgis.hydro_measures(fid, depth, geom)
+VALUES
+    (1, 1.23, 'POINT (36.37802128 55.21121827)'::geography),
+    (2, 1.57, 'POINT (36.37834198 55.21127511)'::geography),
+    (3, 0.78, 'POINT (36.37861509 55.21139158)'::geography),
+    (4, 0.95, 'POINT (36.37905934 55.21137259)'::geography),
+    (5, 1.11, 'POINT (36.37938529 55.21125473)'::geography);
+
+
+

Импорт из CSV

+

Для импорта можно использовать команду COPY :

+
CREATE TABLE IF NOT EXISTS postgis.geo_points (
+    fid serial primary key,
+    name text,
+    comment text,
+    height_abs real,
+    height_add real,
+    type text,
+    x real, 
+    y real
+);
+
+DELETE FROM postgis.geo_points; -- опционально, если хотите очистить
+
+COPY postgis.geo_points 
+    FROM '/Volumes/Data/Spatial/Satino/geo_points.csv' 
+    DELIMITER as ',' 
+    CSV HEADER;
+

Библиография

diff --git a/docs/images/srs_postgis-01.png b/docs/images/srs_postgis-01.png new file mode 100644 index 0000000..04a65f4 Binary files /dev/null and b/docs/images/srs_postgis-01.png differ diff --git a/docs/images/srs_postgis.png b/docs/images/srs_postgis.png new file mode 100644 index 0000000..a7a0e39 Binary files /dev/null and b/docs/images/srs_postgis.png differ diff --git a/docs/search.json b/docs/search.json index cf61c98..8cadaed 100644 --- a/docs/search.json +++ b/docs/search.json @@ -5521,5 +5521,54 @@ "title": "PostGIS", "section": "Структура схемы (продолжение)", "text": "Структура схемы (продолжение)" + }, + { + "objectID": "adv_05_PostGIS.html#создание-пустой-бд", + "href": "adv_05_PostGIS.html#создание-пустой-бд", + "title": "PostGIS", + "section": "Создание пустой БД", + "text": "Создание пустой БД\nСоздание БД (запрос к любой существующей БД)\nCREATE DATABASE satino;\nСоздание схемы и активация расширения\nCREATE SCHEMA postgis;\nGRANT USAGE ON schema postgis to public; -- доступ для всех\nCREATE EXTENSION postgis SCHEMA postgis; -- включить postgis для схемы\nCREATE EXTENSION postgis_raster SCHEMA postgis; -- включить растры для схемы\nALTER DATABASE satino SET search_path=public,postgis; -- добавить в путь поиска\nПроверка установки\nSELECT postgis_full_version();\n\n\n\n\n\n\nВнимание\n\n\nУстановка расширения postgis через графический интерфейс не позволяет выбрать схему и выполняется в схеме public." + }, + { + "objectID": "adv_05_PostGIS.html#проверка-установки", + "href": "adv_05_PostGIS.html#проверка-установки", + "title": "PostGIS", + "section": "Проверка установки", + "text": "Проверка установки\nSELECT postgis_full_version();\nPOSTGIS=\"3.3.1 3786b21\" [EXTENSION] \nPGSQL=\"150\" GEOS=\"3.9.1-CAPI-1.14.2\" PROJ=\"8.0.0\" \nLIBXML=\"2.9.14\" LIBJSON=\"0.16\"" + }, + { + "objectID": "adv_05_PostGIS.html#типы-пространственных-данных", + "href": "adv_05_PostGIS.html#типы-пространственных-данных", + "title": "PostGIS", + "section": "Типы пространственных данных", + "text": "Типы пространственных данных\nВ PostGIS существует 4 типа пространственных данных\n\n\n\n\nТип\nОсобенности\n\n\n\n\n1\ngeometry\nВекторные данные в декартовой системе координат\n\n\n2\ngeography\nВекторные данные в угловой системе координат\n\n\n3\nraster\nРастровые данные (многомерные)\n\n\n4\ntopology\nТопологические данные (вершины и грани).\n\n\n\n\n\n\n\n\n\nТопологические данные\n\n\nТип данных topology используется для хранения топологических покрытий и сетевых данных. Для анализа последних применяется отдельное расширение pgRouting.\n\n\n\n\n\n\n\n\n\nИнтересный факт\n\n\nPostGIS позволяет хранить несколько пространственных столбцов в одной таблице" + }, + { + "objectID": "adv_05_PostGIS.html#каталог-систем-координат", + "href": "adv_05_PostGIS.html#каталог-систем-координат", + "title": "PostGIS", + "section": "Каталог систем координат", + "text": "Каталог систем координат\n\n\nСистемы координат хранятся в таблице spatial_ref_sys\n\n\n\n\n\n\nSRS vs CRS\n\n\nНесмотря на то, что каталог имеет называется SRS (Spatial Reference Systems), по факту он хранит описание CRS (Coordinate Reference Systems).\n\n\n\n\n\n\n\n\n\nТерминология WKT\n\n\nТерминология WKT при описании CRS может не полностью соответствовать стандартами ISO / OGC" + }, + { + "objectID": "adv_05_PostGIS.html#создание-пространственных-таблиц", + "href": "adv_05_PostGIS.html#создание-пространственных-таблиц", + "title": "PostGIS", + "section": "Создание пространственных таблиц", + "text": "Создание пространственных таблиц\nПри создании пространственных таблиц необходимо указать\n\nуникальный идентификатор\nгеометрический столбец заданного типа и КСО\n\nНапример, таблица точек гидрологических промеров может иметь следующий состав:\nCREATE TABLE postgis.hydro_measures (\n fid serial primary key,\n depth real,\n geom geography(point, 4326)\n)" + }, + { + "objectID": "adv_05_PostGIS.html#ручное-создание-данных", + "href": "adv_05_PostGIS.html#ручное-создание-данных", + "title": "PostGIS", + "section": "Ручное создание данных", + "text": "Ручное создание данных\nВставка новых строк выполняется посредством стандартной команды INSERT:\nINSERT INTO postgis.hydro_measures(fid, depth, geom)\nVALUES\n (1, 1.23, ST_GeomFromText('POINT (36.37802128 55.21121827)')),\n (2, 1.57, ST_GeomFromText('POINT (36.37834198 55.21127511)')),\n (3, 0.78, ST_GeomFromText('POINT (36.37861509 55.21139158)')),\n (4, 0.95, ST_GeomFromText('POINT (36.37905934 55.21137259)')),\n (5, 1.11, ST_GeomFromText('POINT (36.37938529 55.21125473)'));\nАльтернативный синтаксис через преобразование строки к типу данных:\nINSERT INTO postgis.hydro_measures(fid, depth, geom)\nVALUES\n (1, 1.23, 'POINT (36.37802128 55.21121827)'::geography),\n (2, 1.57, 'POINT (36.37834198 55.21127511)'::geography),\n (3, 0.78, 'POINT (36.37861509 55.21139158)'::geography),\n (4, 0.95, 'POINT (36.37905934 55.21137259)'::geography),\n (5, 1.11, 'POINT (36.37938529 55.21125473)'::geography);" + }, + { + "objectID": "adv_05_PostGIS.html#импорт-из-csv", + "href": "adv_05_PostGIS.html#импорт-из-csv", + "title": "PostGIS", + "section": "Импорт из CSV", + "text": "Импорт из CSV\nДля импорта можно использовать команду COPY :\nCREATE TABLE IF NOT EXISTS postgis.geo_points (\n fid serial primary key,\n name text,\n comment text,\n height_abs real,\n height_add real,\n type text,\n x real, \n y real\n);\n\nDELETE FROM postgis.geo_points; -- опционально, если хотите очистить\n\nCOPY postgis.geo_points \n FROM '/Volumes/Data/Spatial/Satino/geo_points.csv' \n DELIMITER as ',' \n CSV HEADER;" } ] \ No newline at end of file diff --git a/images/psql.png b/images/psql.png new file mode 100644 index 0000000..9b0c4ac Binary files /dev/null and b/images/psql.png differ diff --git a/images/srs_postgis.png b/images/srs_postgis.png new file mode 100644 index 0000000..a7a0e39 Binary files /dev/null and b/images/srs_postgis.png differ diff --git a/sql/ch01-1.sql b/sql/ch01-1.sql new file mode 100644 index 0000000..6ab2223 --- /dev/null +++ b/sql/ch01-1.sql @@ -0,0 +1,4 @@ +CREATE SCHEMA IF NOT EXISTS postgis; +GRANT USAGE ON schema postgis to public; +CREATE EXTENSION IF NOT EXISTS postgis SCHEMA postgis; +ALTER DATABASE satino SET search_path=public,postgis; \ No newline at end of file diff --git a/sql/ch01_CopyCSV.sql b/sql/ch01_CopyCSV.sql new file mode 100644 index 0000000..95d46b1 --- /dev/null +++ b/sql/ch01_CopyCSV.sql @@ -0,0 +1,13 @@ +CREATE TABLE IF NOT EXISTS postgis.geo_points ( + fid serial primary key, + name text, + comment text, + height_abs real, + height_add real, + type text, + x real, + y real +); +COPY postgis.geo_points + FROM '/Volumes/Data/Spatial/Satino/geo_points.csv' + DELIMITER as ','; \ No newline at end of file diff --git a/sql/ch01_CreateTable.sql b/sql/ch01_CreateTable.sql new file mode 100644 index 0000000..a90c02a --- /dev/null +++ b/sql/ch01_CreateTable.sql @@ -0,0 +1,5 @@ +CREATE TABLE postgis.hydro_measures ( + fid serial primary key, + depth real, + geom geography(point, 4326) +) \ No newline at end of file diff --git a/sql/ch01_InsertPoints.sql b/sql/ch01_InsertPoints.sql new file mode 100644 index 0000000..83f6fe7 --- /dev/null +++ b/sql/ch01_InsertPoints.sql @@ -0,0 +1,16 @@ +DELETE from postgis.hydro_measures; +-- INSERT INTO postgis.hydro_measures(fid, depth, geom) +-- VALUES +-- (1, 1.23, ST_GeomFromText('POINT (36.37802128 55.21121827)')), +-- (2, 1.57, ST_GeomFromText('POINT (36.37834198 55.21127511)')), +-- (3, 0.78, ST_GeomFromText('POINT (36.37861509 55.21139158)')), +-- (4, 0.95, ST_GeomFromText('POINT (36.37905934 55.21137259)')), +-- (5, 1.11, ST_GeomFromText('POINT (36.37938529 55.21125473)')); + +INSERT INTO postgis.hydro_measures(fid, depth, geom) +VALUES + (1, 1.23, 'POINT (36.37802128 55.21121827)'::geography), + (2, 1.57, 'POINT (36.37834198 55.21127511)'::geography), + (3, 0.78, 'POINT (36.37861509 55.21139158)'::geography), + (4, 0.95, 'POINT (36.37905934 55.21137259)'::geography), + (5, 1.11, 'POINT (36.37938529 55.21125473)'::geography); \ No newline at end of file