Skip to content

Commit 49e486f

Browse files
TheoLechemiajoelclemscamillemonchicourt
authored
Release 1.4 (#15)
* ref point & cor_linear & cor_areas * Changelog 1.4.0 - Review * prepa release --------- Co-authored-by: joel.clement <joelclems@gmail.com> Co-authored-by: Camille Monchicourt <camille.monchicourt@ecrins-parcnational.fr>
1 parent 2272603 commit 49e486f

File tree

7 files changed

+284
-10
lines changed

7 files changed

+284
-10
lines changed

CHANGELOG.md

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,27 @@
11
CHANGELOG
22
=========
33

4+
1.4.0 (2023-09-14)
5+
------------------
6+
7+
**🚀 Nouveautés**
8+
9+
* Ajout d'un référentiel de couches de *points* (table des types de points et table de géometries + modèles) (#12)
10+
* Ajout de tables de correspondance entre les linéaires et les zonages (+ relations associées dans les modèles) (#12)
11+
12+
**⚠️ Notes de version**
13+
14+
* Les nouvelles tables de correspondances `ref_geo.cor_areas` et `ref_geo.cor_linear_area` ne sont pas remplies par défaut pour ne pas alourdir la base de données et ses calculs, alors qu'elles ne sont pas utilisées actuellement par GeoNature
15+
* Exemple de requête pour remplir la table `ref_geo.cor_area_linear` pour les régions, départements et communes :
16+
```
17+
INSERT INTO ref_geo.cor_linear_area (id_linear, id_area)
18+
SELECT id_linear, id_area
19+
FROM ref_geo.l_areas la
20+
JOIN ref_geo.l_linears ll ON la.geom && ll.geom
21+
JOIN ref_geo.bib_areas_types bat ON bat.id_type =la.id_type
22+
WHERE bat.type_code IN ('DEP', 'REG', 'COM')
23+
```
24+
425
1.3.0 (2023-03-03)
526
------------------
627

VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1.3.0
1+
1.4.0
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
-- cor_areas
2+
-- - table de correspondance entre un groupe de zonage et ses éléments
3+
-- par exemple une régions et ses départements ou ses communes.
4+
5+
CREATE TABLE ref_geo.cor_areas (
6+
id_area_group integer,
7+
id_area integer
8+
);
9+
10+
COMMENT ON TABLE ref_geo.cor_areas IS 'Table de correspondance des intersections des zonages. Non remplie par défaut.';
11+
12+
ALTER TABLE ref_geo.cor_areas
13+
ADD CONSTRAINT fk_ref_geo_cor_areas_id_area_group FOREIGN KEY (id_area_group)
14+
REFERENCES ref_geo.l_areas(id_area)
15+
ON UPDATE CASCADE ON DELETE CASCADE;
16+
17+
ALTER TABLE ref_geo.cor_areas
18+
ADD CONSTRAINT fk_ref_geo_cor_areas_id_area FOREIGN KEY (id_area)
19+
REFERENCES ref_geo.l_areas(id_area)
20+
ON UPDATE CASCADE ON DELETE CASCADE;
21+
22+
CREATE INDEX ref_geo_cor_areas_id_area ON ref_geo.cor_areas USING btree(id_area);
23+
CREATE INDEX ref_geo_cor_areas_id_area_group ON ref_geo.cor_areas USING btree(id_area_group);
24+
25+
26+
-- cor_linear_area
27+
-- - Table de correspondance entre les éléments lineaires et les éléments de zonage
28+
-- par exemple pour trouver rapidement les routes d'une communes
29+
-- ou inversement les communes traversée par un linéaire
30+
31+
32+
CREATE TABLE ref_geo.cor_linear_area (
33+
id_linear integer,
34+
id_area integer
35+
);
36+
37+
COMMENT ON TABLE ref_geo.cor_areas IS 'Table de correspondance entre les éléments lineaires et les éléments de zonage. Non remplie par défaut';
38+
39+
40+
ALTER TABLE ref_geo.cor_linear_area
41+
ADD CONSTRAINT fk_ref_geo_cor_linear_id_area_group FOREIGN KEY (id_area)
42+
REFERENCES ref_geo.l_areas(id_area)
43+
ON UPDATE CASCADE ON DELETE CASCADE;
44+
45+
ALTER TABLE ref_geo.cor_linear_area
46+
ADD CONSTRAINT fk_ref_geo_cor_linear_id_lineair_group FOREIGN KEY (id_linear)
47+
REFERENCES ref_geo.l_linears(id_linear)
48+
ON UPDATE CASCADE ON DELETE CASCADE;
49+
50+
CREATE INDEX ref_geo_cor_linear_area_id_area ON ref_geo.cor_linear_area USING btree(id_area);
51+
CREATE INDEX ref_geo_cor_linear_area_id_linear ON ref_geo.cor_linear_area USING btree(id_linear);
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
-- tables pour gérer les référentiels géographiques points (PK/PR, ..)
2+
3+
4+
-- table des type de points
5+
6+
CREATE TABLE ref_geo.bib_points_types (
7+
id_type SERIAL NOT NULL,
8+
type_name character varying(200) NOT NULL,
9+
type_code character varying(25) NOT NULL,
10+
type_desc text,
11+
ref_name character varying(200),
12+
ref_version integer,
13+
num_version character varying(50),
14+
meta_create_date timestamp without time zone,
15+
meta_update_date timestamp without time zone,
16+
CONSTRAINT pk_ref_geo_bib_points_types_id_type PRIMARY KEY (id_type),
17+
UNIQUE(type_code)
18+
);
19+
20+
21+
-- table des points (PK/PR, ...)
22+
23+
CREATE TABLE ref_geo.l_points (
24+
id_point SERIAL NOT NULL,
25+
id_type INTEGER NOT NULL,
26+
point_name character varying(250) NOT NULL,
27+
point_code character varying(25) NOT NULL,
28+
enable BOOLEAN NOT NULL DEFAULT (TRUE),
29+
geom GEOMETRY(GEOMETRY, :local_srid),
30+
geojson_4326 VARCHAR,
31+
source character varying(250),
32+
additional_data jsonb NULL,
33+
meta_create_date timestamp without time zone,
34+
meta_update_date timestamp without time zone,
35+
36+
UNIQUE (id_type, point_code),
37+
38+
CONSTRAINT pk_ref_geo_l_points_id_point PRIMARY KEY (id_point),
39+
CONSTRAINT fk_ref_geo_l_points_id_type FOREIGN KEY (id_type)
40+
REFERENCES ref_geo.bib_points_types(id_type)
41+
ON UPDATE CASCADE ON DELETE NO ACTION
42+
);
43+
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
"""cor_areas & cor_linear_areas
2+
3+
Revision ID: 795f6ea8ec45
4+
Revises: dea1645de8c0
5+
Create Date: 2023-08-02 11:48:06.329936
6+
7+
"""
8+
9+
import sqlalchemy as sa
10+
import importlib
11+
12+
from alembic import op
13+
from sqlalchemy.sql import text
14+
15+
16+
# revision identifiers, used by Alembic.
17+
revision = "795f6ea8ec45"
18+
down_revision = "dea1645de8c0"
19+
branch_labels = None
20+
depends_on = None
21+
22+
23+
def upgrade():
24+
stmt = text(importlib.resources.read_text("ref_geo.migrations.data", "ref_geo_cor.sql"))
25+
op.get_bind().execute(stmt)
26+
27+
28+
def downgrade():
29+
op.get_bind().execute(
30+
"""
31+
DROP TABLE ref_geo.cor_linear_area;
32+
DROP TABLE ref_geo.cor_areas;
33+
"""
34+
)
35+
36+
pass
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
""" Référentiel point, cor (area, linear, point)
2+
3+
Revision ID: dea1645de8c0
4+
Revises: f7374cd6e38d
5+
Create Date: 2023-07-27 12:13:01.748452
6+
7+
"""
8+
import importlib
9+
10+
from alembic import op
11+
import sqlalchemy as sa
12+
from sqlalchemy.sql import text
13+
from ref_geo.utils import (
14+
get_local_srid,
15+
)
16+
17+
# revision identifiers, used by Alembic.
18+
revision = "dea1645de8c0"
19+
down_revision = "f7374cd6e38d"
20+
branch_labels = None
21+
depends_on = None
22+
23+
24+
def upgrade():
25+
stmt = text(importlib.resources.read_text("ref_geo.migrations.data", "ref_geo_point.sql"))
26+
op.get_bind().execute(stmt, {"local_srid": get_local_srid(op.get_bind())})
27+
28+
pass
29+
30+
31+
def downgrade():
32+
op.get_bind().execute(
33+
"""
34+
DROP TABLE ref_geo.l_points;
35+
DROP TABLE ref_geo.bib_points_types;
36+
"""
37+
)
38+
pass

src/ref_geo/models.py

Lines changed: 94 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22

33
from geoalchemy2 import Geometry
44
from sqlalchemy import ForeignKey
5-
from sqlalchemy.orm import deferred
5+
from sqlalchemy.orm import deferred, column_property
6+
from sqlalchemy.sql import func
7+
68
from sqlalchemy.dialects.postgresql import JSONB
79

810
from utils_flask_sqla.serializers import serializable
@@ -26,6 +28,24 @@ class BibAreasTypes(db.Model):
2628
num_version = db.Column(db.Unicode)
2729

2830

31+
cor_areas = db.Table(
32+
"cor_areas",
33+
db.Column(
34+
"id_area_group",
35+
db.Integer,
36+
ForeignKey("ref_geo.l_areas.id_area"),
37+
primary_key=True,
38+
),
39+
db.Column(
40+
"id_area",
41+
db.Integer,
42+
ForeignKey("ref_geo.l_areas.id_area"),
43+
primary_key=True,
44+
),
45+
schema="ref_geo",
46+
)
47+
48+
2949
@geoserializable
3050
class LAreas(db.Model):
3151
__tablename__ = "l_areas"
@@ -42,6 +62,14 @@ class LAreas(db.Model):
4262
meta_create_date = db.Column(db.DateTime, default=datetime.now)
4363
meta_update_date = db.Column(db.DateTime, default=datetime.now, onupdate=datetime.now)
4464
area_type = db.relationship("BibAreasTypes", lazy="select")
65+
parent_areas = db.relationship(
66+
"LAreas",
67+
secondary=cor_areas,
68+
primaryjoin=id_area == cor_areas.c.id_area,
69+
secondaryjoin=cor_areas.c.id_area_group == id_area,
70+
backref="child_areas",
71+
lazy="raise",
72+
)
4573

4674

4775
@serializable
@@ -57,19 +85,40 @@ class BibLinearsTypes(db.Model):
5785
num_version = db.Column(db.Unicode(length=50))
5886

5987

60-
class CorLinearGroup(db.Model):
61-
__table_name__ = "cor_linear_group"
62-
__table_args__ = {"schema": "ref_geo"}
63-
id_group = db.Column(
88+
cor_linear_group = db.Table(
89+
"cor_linear_group",
90+
db.Column(
91+
"id_group",
6492
db.Integer,
6593
ForeignKey("ref_geo.t_linear_groups.id_group"),
6694
primary_key=True,
67-
)
68-
id_linear = db.Column(
95+
),
96+
db.Column(
97+
"id_linear",
6998
db.Integer,
7099
ForeignKey("ref_geo.l_linears.id_linear"),
71100
primary_key=True,
72-
)
101+
),
102+
schema="ref_geo",
103+
)
104+
105+
106+
cor_linear_area = db.Table(
107+
"cor_linear_area",
108+
db.Column(
109+
"id_area",
110+
db.Integer,
111+
ForeignKey("ref_geo.l_areas.id_area"),
112+
primary_key=True,
113+
),
114+
db.Column(
115+
"id_linear",
116+
db.Integer,
117+
ForeignKey("ref_geo.l_linears.id_linear"),
118+
primary_key=True,
119+
),
120+
schema="ref_geo",
121+
)
73122

74123

75124
@geoserializable
@@ -90,8 +139,9 @@ class LLinears(db.Model):
90139
meta_update_date = db.Column(db.DateTime, default=datetime.now, onupdate=datetime.now)
91140
type = db.relationship("BibLinearsTypes")
92141
groups = db.relationship(
93-
"TLinearGroups", secondary=CorLinearGroup.__table__, backref="linears"
142+
"TLinearGroups", secondary=cor_linear_group, backref="linears", lazy="raise"
94143
)
144+
areas = db.relationship("LAreas", secondary=cor_linear_area, backref="linears", lazy="raise")
95145

96146

97147
@serializable
@@ -103,6 +153,41 @@ class TLinearGroups(db.Model):
103153
code = db.Column(db.Unicode(length=25), unique=True)
104154

105155

156+
@serializable
157+
class BibPointsTypes(db.Model):
158+
__tablename__ = "bib_points_types"
159+
__table_args__ = {"schema": "ref_geo"}
160+
id_type = db.Column(db.Integer, primary_key=True)
161+
type_name = db.Column(db.Unicode(length=200), nullable=False)
162+
type_code = db.Column(db.Unicode(length=25), nullable=False)
163+
type_desc = db.Column(db.Unicode)
164+
ref_name = db.Column(db.Unicode(length=200))
165+
ref_version = db.Column(db.Integer)
166+
num_version = db.Column(db.Unicode(length=50))
167+
168+
169+
@geoserializable
170+
class LPoints(db.Model):
171+
__tablename__ = "l_points"
172+
__table_args__ = {"schema": "ref_geo"}
173+
id_point = db.Column(db.Integer, primary_key=True)
174+
id_type = db.Column(db.Integer, ForeignKey("ref_geo.bib_points_types.id_type"), nullable=False)
175+
point_name = db.Column(db.Unicode(length=250))
176+
point_code = db.Column(db.Unicode(length=25))
177+
geom = db.Column(Geometry("GEOMETRY"))
178+
source = db.Column(db.Unicode(length=250))
179+
enable = db.Column(db.Boolean, nullable=False, default=True)
180+
additional_data = db.Column(JSONB)
181+
meta_create_date = db.Column(db.DateTime, default=datetime.now)
182+
meta_update_date = db.Column(db.DateTime, default=datetime.now, onupdate=datetime.now)
183+
type = db.relationship("BibPointsTypes")
184+
185+
geom_4326 = column_property(
186+
func.ST_TRANSFORM(geom, 4326),
187+
deferred=True,
188+
)
189+
190+
106191
@serializable
107192
class LiMunicipalities(db.Model):
108193
__tablename__ = "li_municipalities"

0 commit comments

Comments
 (0)