Import circonscriptions et contours
This commit is contained in:
parent
a85739159f
commit
d913379421
@ -1,8 +1,8 @@
|
|||||||
"""initial
|
"""initial
|
||||||
|
|
||||||
Revision ID: 5bf5e6526891
|
Revision ID: d7fed76a55bd
|
||||||
Revises:
|
Revises:
|
||||||
Create Date: 2024-06-14 23:04:55.436991
|
Create Date: 2024-06-15 00:03:00.687812
|
||||||
|
|
||||||
"""
|
"""
|
||||||
from typing import Sequence, Union
|
from typing import Sequence, Union
|
||||||
@ -12,7 +12,7 @@ import sqlalchemy as sa
|
|||||||
|
|
||||||
|
|
||||||
# revision identifiers, used by Alembic.
|
# revision identifiers, used by Alembic.
|
||||||
revision: str = '5bf5e6526891'
|
revision: str = 'd7fed76a55bd'
|
||||||
down_revision: Union[str, None] = None
|
down_revision: Union[str, None] = None
|
||||||
branch_labels: Union[str, Sequence[str], None] = None
|
branch_labels: Union[str, Sequence[str], None] = None
|
||||||
depends_on: Union[str, Sequence[str], None] = None
|
depends_on: Union[str, Sequence[str], None] = None
|
||||||
@ -106,6 +106,7 @@ def upgrade() -> None:
|
|||||||
sa.Column('id', sa.String(length=6), nullable=False),
|
sa.Column('id', sa.String(length=6), nullable=False),
|
||||||
sa.Column('departement_code', sa.String(length=3), nullable=False),
|
sa.Column('departement_code', sa.String(length=3), nullable=False),
|
||||||
sa.Column('numero', sa.Integer(), nullable=False),
|
sa.Column('numero', sa.Integer(), nullable=False),
|
||||||
|
sa.Column('geometry', sa.JSON(), nullable=False),
|
||||||
sa.ForeignKeyConstraint(['departement_code'], ['departement.code_insee'], ),
|
sa.ForeignKeyConstraint(['departement_code'], ['departement.code_insee'], ),
|
||||||
sa.PrimaryKeyConstraint('id')
|
sa.PrimaryKeyConstraint('id')
|
||||||
)
|
)
|
@ -52,6 +52,7 @@ class Circonscription(Base):
|
|||||||
id: Mapped[str] = mapped_column(String(6), primary_key=True)
|
id: Mapped[str] = mapped_column(String(6), primary_key=True)
|
||||||
departement_code: Mapped[str] = mapped_column(ForeignKey("departement.code_insee"))
|
departement_code: Mapped[str] = mapped_column(ForeignKey("departement.code_insee"))
|
||||||
numero: Mapped[int] = mapped_column(Integer())
|
numero: Mapped[int] = mapped_column(Integer())
|
||||||
|
geometry: Mapped[dict] = mapped_column(JSON())
|
||||||
|
|
||||||
departement: Mapped[Departement] = relationship(Departement)
|
departement: Mapped[Departement] = relationship(Departement)
|
||||||
bureaux_vote: Mapped[List["BureauVote"]] = relationship("BureauVote", back_populates="circonscription")
|
bureaux_vote: Mapped[List["BureauVote"]] = relationship("BureauVote", back_populates="circonscription")
|
||||||
|
@ -67,6 +67,52 @@ def importer_departements(engine: Engine, verbose: bool = False) -> None:
|
|||||||
session.commit()
|
session.commit()
|
||||||
|
|
||||||
|
|
||||||
|
def importer_circonscriptions(engine: Engine, verbose: bool = False) -> None:
|
||||||
|
file = get_file("https://www.data.gouv.fr/fr/datasets/r/67c0f382-dc8d-4d1f-8a76-1162c53b9dfe",
|
||||||
|
"circonscriptions-legislatives-p10.geojson")
|
||||||
|
|
||||||
|
with file.open('r') as f:
|
||||||
|
features = json.load(f)['features']
|
||||||
|
|
||||||
|
with Session(engine) as session:
|
||||||
|
for feature in tqdm(features, desc="Circonscriptions", disable=not verbose):
|
||||||
|
circo_dict = feature['properties']
|
||||||
|
code_circo = circo_dict['codeCirconscription']
|
||||||
|
code_dpt = circo_dict['codeDepartement']
|
||||||
|
|
||||||
|
match code_dpt:
|
||||||
|
case "ZA":
|
||||||
|
code_dpt = "971"
|
||||||
|
case "ZB":
|
||||||
|
code_dpt = "972"
|
||||||
|
case "ZC":
|
||||||
|
code_dpt = "973"
|
||||||
|
case "ZD":
|
||||||
|
code_dpt = "974"
|
||||||
|
case "ZS":
|
||||||
|
code_dpt = "975"
|
||||||
|
case "ZM":
|
||||||
|
code_dpt = "976"
|
||||||
|
|
||||||
|
numero_circo = int(code_circo[len(code_dpt):])
|
||||||
|
circo_id = f"{code_dpt}-{numero_circo:02d}"
|
||||||
|
|
||||||
|
if not session.execute(select(Departement).filter_by(code_insee=code_dpt)).scalar_one_or_none():
|
||||||
|
print("Département non trouvé avec le code", code_dpt)
|
||||||
|
continue
|
||||||
|
|
||||||
|
if circo := session.execute(select(Circonscription).filter_by(id=circo_id)).scalar_one_or_none():
|
||||||
|
circo.departement_code = code_dpt
|
||||||
|
circo.numero = numero_circo
|
||||||
|
circo.geometry = feature['geometry']
|
||||||
|
else:
|
||||||
|
circo = Circonscription(id=circo_id, departement_code=code_dpt, numero=numero_circo,
|
||||||
|
geometry=feature['geometry'])
|
||||||
|
session.add(circo)
|
||||||
|
|
||||||
|
session.commit()
|
||||||
|
|
||||||
|
|
||||||
def importer_communes(engine: Engine, verbose: bool = False) -> None:
|
def importer_communes(engine: Engine, verbose: bool = False) -> None:
|
||||||
etag = requests.get(
|
etag = requests.get(
|
||||||
"https://public.opendatasoft.com/api/explore/v2.1/catalog/datasets"
|
"https://public.opendatasoft.com/api/explore/v2.1/catalog/datasets"
|
||||||
@ -138,5 +184,6 @@ def importer_bureaux_vote(engine: Engine, verbose: bool = False) -> None:
|
|||||||
def run(engine: Engine, verbose: bool = False) -> None:
|
def run(engine: Engine, verbose: bool = False) -> None:
|
||||||
importer_regions(engine, verbose)
|
importer_regions(engine, verbose)
|
||||||
importer_departements(engine, verbose)
|
importer_departements(engine, verbose)
|
||||||
|
importer_circonscriptions(engine, verbose)
|
||||||
importer_communes(engine, verbose)
|
importer_communes(engine, verbose)
|
||||||
importer_bureaux_vote(engine, verbose)
|
importer_bureaux_vote(engine, verbose)
|
||||||
|
Loading…
Reference in New Issue
Block a user