diff --git a/knex/migrations/20180522000001_titres.js b/knex/migrations/20180522000001_titres.js
index e596c5dd82b4cb2d8b349cd15ac36ce576d58527..8760922946660ab8686815fe6a3c2428f28a6978 100644
--- a/knex/migrations/20180522000001_titres.js
+++ b/knex/migrations/20180522000001_titres.js
@@ -24,6 +24,7 @@ exports.up = knex =>
     table.string('communesTitreEtapeId', 128)
     table.string('doublonTitreId', 128)
     table.jsonb('propsTitreEtapesIds')
+    table.specificType('coordonnees', 'POINT').index(null, 'GIST')
   })
 
 exports.down = knex => knex.schema.dropTable('titres')
diff --git a/package.json b/package.json
index bdaa759f623ea5cbd45fc9d951b675697331a6d9..afdae2af31a527c5199c26ecd90eff5fdd51a809 100644
--- a/package.json
+++ b/package.json
@@ -17,7 +17,7 @@
     "node": ">=14.15.0",
     "npm": ">=6.14.0"
   },
-  "main": "index.js",
+  "main": "dist/index.js",
   "scripts": {
     "bim": "npm i && npm run build && npm run db:recreate && npm run db:import",
     "build": "rm -rf dist && tsc && mkdir -p ./dist/api/graphql && cp -r ./src/api/graphql/schemas ./dist/api/graphql",
diff --git a/src/api/_format/titres.ts b/src/api/_format/titres.ts
index 05d1d335ba1ecdd11487b5792364d70fe2e9a520..e0110225ee7c01981cc7a8bde412db22a0dc238b 100644
--- a/src/api/_format/titres.ts
+++ b/src/api/_format/titres.ts
@@ -9,8 +9,7 @@ import {
 
 import {
   geojsonFeatureMultiPolygon,
-  geojsonFeatureCollectionPoints,
-  geojsonCentre
+  geojsonFeatureCollectionPoints
 } from '../../tools/geojson'
 
 import { dupRemove } from '../../tools/index'
@@ -128,20 +127,22 @@ const titreFormat = (
 ) => {
   if (!fields) return t
 
-  if (t.points?.length) {
-    if (fields.geojsonMultiPolygon) {
-      t.geojsonMultiPolygon = geojsonFeatureMultiPolygon(t.points) as IGeoJson
-    }
+  if (fields.geojsonMultiPolygon && t.points?.length) {
+    t.geojsonMultiPolygon = geojsonFeatureMultiPolygon(t.points) as IGeoJson
+  }
 
-    if (fields.geojsonPoints) {
-      t.geojsonPoints = geojsonFeatureCollectionPoints(t.points) as IGeoJson
-    }
-    if (fields.geojsonCentre) {
-      let geojsonMultiPolygon = t.geojsonMultiPolygon
-      if (!geojsonMultiPolygon) {
-        geojsonMultiPolygon = geojsonFeatureMultiPolygon(t.points) as IGeoJson
-      }
-      t.geojsonCentre = geojsonCentre(geojsonMultiPolygon, t.pointsTitreEtapeId)
+  if (fields.geojsonPoints && t.points?.length) {
+    t.geojsonPoints = geojsonFeatureCollectionPoints(t.points) as IGeoJson
+  }
+
+  if (fields.geojsonCentre && t.coordonnees && t.pointsTitreEtapeId) {
+    t.geojsonCentre = {
+      type: 'Feature',
+      geometry: {
+        type: 'Point',
+        coordinates: [t.coordonnees.x, t.coordonnees.y]
+      },
+      properties: { etapeId: t.pointsTitreEtapeId }
     }
   }
 
diff --git a/src/business/_updates-log.ts b/src/business/_updates-log.ts
index e63941d150465fa1d54981454a37162a59961d69..d47843051f009b0683306a1182a77a33f69cd827 100644
--- a/src/business/_updates-log.ts
+++ b/src/business/_updates-log.ts
@@ -30,6 +30,7 @@ const updatesLog = ({
   titresEtapesAdministrationsLocalesDeleted,
   titresPropsEtapeIdUpdated,
   titresPropsContenuUpdated,
+  titresCoordonneesUpdated,
   titresTravauxEtapesOrdreUpdated,
   titresTravauxOrdreUpdated,
   titresActivitesCreated,
@@ -62,6 +63,7 @@ const updatesLog = ({
   titresEtapesAdministrationsLocalesDeleted?: ITitreAdministrationLocale[]
   titresPropsEtapeIdUpdated?: string[]
   titresPropsContenuUpdated?: string[]
+  titresCoordonneesUpdated?: string[]
   titresTravauxEtapesOrdreUpdated?: string[]
   titresTravauxOrdreUpdated?: string[]
   titresActivitesCreated?: string[]
@@ -203,6 +205,12 @@ const updatesLog = ({
     )
   }
 
+  if (titresCoordonneesUpdated?.length) {
+    console.info(
+      `mise à jour: ${titresCoordonneesUpdated.length} titres(s) (propriétés-étapes)`
+    )
+  }
+
   if (titresTravauxEtapesOrdreUpdated?.length) {
     console.info(
       `mise à jour: ${titresTravauxEtapesOrdreUpdated.length} étape(s) de travaux (ordre)`
diff --git a/src/business/daily.ts b/src/business/daily.ts
index ceb98b8b32f0863e9d67c18d596ba40d8676cf90..bd18c0aee0c6af0e56325c4c3e5d0098ee513793 100644
--- a/src/business/daily.ts
+++ b/src/business/daily.ts
@@ -19,6 +19,7 @@ import titresTravauxOrdreUpdate from './processes/titres-travaux-ordre-update'
 import titresTravauxEtapesOrdreUpdate from './processes/titres-travaux-etapes-ordre-update'
 import { matomoCacheInit } from '../tools/api-matomo'
 import updatesLog from './_updates-log'
+import titresCoordonneesUpdate from './processes/titres-coordonnees-update'
 
 const daily = async () => {
   try {
@@ -59,6 +60,8 @@ const daily = async () => {
     } = await titresEtapesAdministrationsLocalesUpdate()
     const titresPropsEtapeIdUpdated = await titresPropsEtapeIdUpdate()
     const titresPropsContenuUpdated = await titresPropsContenuUpdate()
+
+    const titresCoordonneesUpdated = await titresCoordonneesUpdate()
     const titresTravauxEtapesOrdreUpdated = await titresTravauxEtapesOrdreUpdate()
     const titresTravauxOrdreUpdated = await titresTravauxOrdreUpdate()
     const titresActivitesCreated = await titresActivitesUpdate()
@@ -93,6 +96,7 @@ const daily = async () => {
       titresEtapesAdministrationsLocalesDeleted,
       titresPropsEtapeIdUpdated,
       titresPropsContenuUpdated,
+      titresCoordonneesUpdated,
       titresTravauxEtapesOrdreUpdated,
       titresTravauxOrdreUpdated,
       titresActivitesCreated,
diff --git a/src/business/processes/titres-coordonnees-update.test.ts b/src/business/processes/titres-coordonnees-update.test.ts
new file mode 100644
index 0000000000000000000000000000000000000000..6536a3539830e1ea69136334024c408b6272dd99
--- /dev/null
+++ b/src/business/processes/titres-coordonnees-update.test.ts
@@ -0,0 +1,73 @@
+import { mocked } from 'ts-jest/utils'
+import titreCoordonneesFind from '../rules/titre-coordonnees-find'
+import { titresGet } from '../../database/queries/titres'
+import Titres from '../../database/models/titres'
+import titresCoordonneesUpdate from './titres-coordonnees-update'
+
+jest.mock('../../database/queries/titres', () => ({
+  titreUpdate: jest.fn().mockResolvedValue(true),
+  titresGet: jest.fn()
+}))
+jest.mock('../rules/titre-coordonnees-find', () => ({
+  default: jest.fn()
+}))
+
+const titresGetMock = mocked(titresGet, true)
+const titreCoordonneesFindMock = mocked(titreCoordonneesFind, true)
+
+console.info = jest.fn()
+
+describe('coordoonnées des titres', () => {
+  test.each([{ x: 1, y: 1 }, { x: 1 }, { y: 1 }, undefined])(
+    "met à jour les coordonnees d'un titre",
+    async coordonnees => {
+      titresGetMock.mockResolvedValue([
+        { id: 'titre-id', coordonnees }
+      ] as Titres[])
+      titreCoordonneesFindMock.mockReturnValue({ x: 1, y: 0.5 })
+
+      const titresCoordonneesUpdated = await titresCoordonneesUpdate()
+
+      expect(titresCoordonneesUpdated.length).toEqual(1)
+    }
+  )
+
+  test.each([null, { x: null, y: 1 }])(
+    "enlève les coordonnees d'un titre sans points",
+    async coordonnees => {
+      titresGetMock.mockResolvedValue([
+        { id: 'titre-id', coordonnees: { x: 1, y: 1 } }
+      ] as Titres[])
+      titreCoordonneesFindMock.mockReturnValue(coordonnees)
+
+      const titresCoordonneesUpdated = await titresCoordonneesUpdate()
+
+      expect(titresCoordonneesUpdated.length).toEqual(1)
+    }
+  )
+
+  test("met à jour les coordonnees d'un titre", async () => {
+    titresGetMock.mockResolvedValue([
+      { id: 'titre-id', coordonnees: null }
+    ] as Titres[])
+    titreCoordonneesFindMock.mockReturnValue({ x: null, y: 1 })
+
+    const titresCoordonneesUpdated = await titresCoordonneesUpdate()
+
+    expect(titresCoordonneesUpdated.length).toEqual(1)
+  })
+
+  test('ne met à jour aucun titre', async () => {
+    titresGetMock.mockResolvedValue([
+      {
+        id: 'titre-type-id',
+        coordonnees: { x: 1, y: 0.5 }
+      }
+    ] as Titres[])
+    titreCoordonneesFindMock.mockReturnValue({ x: 1, y: 0.5 })
+
+    const titresCoordonneesUpdated = await titresCoordonneesUpdate()
+
+    expect(titresCoordonneesUpdated.length).toEqual(0)
+  })
+})
diff --git a/src/business/processes/titres-coordonnees-update.ts b/src/business/processes/titres-coordonnees-update.ts
new file mode 100644
index 0000000000000000000000000000000000000000..6814a570055becf301c640e3c6084259a6b1a7d8
--- /dev/null
+++ b/src/business/processes/titres-coordonnees-update.ts
@@ -0,0 +1,49 @@
+import PQueue from 'p-queue'
+
+import { titresGet, titreUpdate } from '../../database/queries/titres'
+import titreCoordoneesFind from '../rules/titre-coordonnees-find'
+
+const titresCoordonneesUpdate = async (titresIds?: string[]) => {
+  console.info()
+  console.info('coordonnées des titres…')
+  const queue = new PQueue({ concurrency: 100 })
+
+  const titres = await titresGet(
+    { ids: titresIds },
+    { fields: { points: { id: {} } } },
+    'super'
+  )
+
+  const titresCoordonneesUpdated = [] as string[]
+
+  titres.forEach(titre => {
+    const coordonnees = titreCoordoneesFind(titre.points)
+
+    if (
+      (coordonnees &&
+        titre.coordonnees &&
+        (coordonnees.x !== titre.coordonnees.x ||
+          coordonnees.y !== titre.coordonnees.y)) ||
+      !coordonnees !== !titre.coordonnees
+    ) {
+      queue.add(async () => {
+        await titreUpdate(titre.id, { coordonnees })
+
+        const log = {
+          type: 'titre : coordonnées (mise à jour) ->',
+          value: `${titre.id} : ${coordonnees?.x}, ${coordonnees?.y}`
+        }
+
+        console.info(log.type, log.value)
+
+        titresCoordonneesUpdated.push(titre.id)
+      })
+    }
+  })
+
+  await queue.onIdle()
+
+  return titresCoordonneesUpdated
+}
+
+export default titresCoordonneesUpdate
diff --git a/src/business/processes/titres-props-etape-id-update.ts b/src/business/processes/titres-props-etape-id-update.ts
index 3798d8f819d75d27315361e8f5d2cb37a8f33f1a..86dd664fb5f7d9cf08b80ce62c64f1a9e27280b8 100644
--- a/src/business/processes/titres-props-etape-id-update.ts
+++ b/src/business/processes/titres-props-etape-id-update.ts
@@ -44,7 +44,7 @@ const titresPropsEtapeIdsUpdate = async (titresIds?: string[]) => {
     'super'
   )
 
-  const titresIdsUpdated = [] as string[]
+  const titresPropsEtapeIdsUpdated = [] as string[]
 
   titres.forEach(titre => {
     const props = titrePropsEtapes.reduce(
@@ -78,14 +78,14 @@ const titresPropsEtapeIdsUpdate = async (titresIds?: string[]) => {
 
         console.info(log.type, log.value)
 
-        titresIdsUpdated.push(titre.id)
+        titresPropsEtapeIdsUpdated.push(titre.id)
       })
     }
   })
 
   await queue.onIdle()
 
-  return titresIdsUpdated
+  return titresPropsEtapeIdsUpdated
 }
 
 export { titrePropsEtapes }
diff --git a/src/business/rules/__mocks__/titre-coordonnees-find.ts b/src/business/rules/__mocks__/titre-coordonnees-find.ts
new file mode 100644
index 0000000000000000000000000000000000000000..1e0e620e57706e0d09f862676b0c21436adc92b1
--- /dev/null
+++ b/src/business/rules/__mocks__/titre-coordonnees-find.ts
@@ -0,0 +1,44 @@
+import { ITitrePoint } from '../../../types'
+
+const titrePoints = [
+  {
+    id: 'h-cx-courdemanges-1988-oct01-dpu01-1',
+    groupe: 1,
+    contour: 1,
+    point: 1,
+    coordonnees: { x: 0, y: 0 }
+  },
+  {
+    id: 'h-cx-courdemanges-1988-oct01-dpu01-2',
+    groupe: 1,
+    contour: 1,
+    point: 2,
+    coordonnees: { x: 0, y: 1 }
+  },
+  {
+    id: 'h-cx-courdemanges-1988-oct01-dpu01-3',
+    groupe: 1,
+    contour: 1,
+    point: 1,
+    coordonnees: { x: 1, y: 1 }
+  }
+] as ITitrePoint[]
+
+const titreGeojson = {
+  type: 'Feature',
+  properties: { etapeId: 'h-cx-courdemanges-1988-oct01-dpu01' },
+  geometry: {
+    type: 'MultiPolygon',
+    coordinates: [
+      [
+        [
+          [1, 1],
+          [0, 1],
+          [1, 1]
+        ]
+      ]
+    ]
+  }
+}
+
+export { titrePoints, titreGeojson }
diff --git a/src/business/rules/titre-coordonnees-find.test.ts b/src/business/rules/titre-coordonnees-find.test.ts
new file mode 100644
index 0000000000000000000000000000000000000000..7fd7e5c8b04a7c88ebe69db4d15f8835c310df03
--- /dev/null
+++ b/src/business/rules/titre-coordonnees-find.test.ts
@@ -0,0 +1,23 @@
+import { mocked } from 'ts-jest/utils'
+import titreCoordonneesFind from './titre-coordonnees-find'
+import { geojsonFeatureMultiPolygon } from '../../tools/geojson'
+
+import { titrePoints, titreGeojson } from './__mocks__/titre-coordonnees-find'
+
+jest.mock('../../tools/geojson', () => ({
+  geojsonFeatureMultiPolygon: jest.fn()
+}))
+
+const geojsonFeatureMultiPolygonMock = mocked(geojsonFeatureMultiPolygon, true)
+
+describe("coordonnées d'un titre", () => {
+  test("retourne les coordonnées d'un titre", () => {
+    geojsonFeatureMultiPolygonMock.mockReturnValue(titreGeojson)
+    expect(titreCoordonneesFind(titrePoints)).toMatchObject({ x: 0.5, y: 1 })
+  })
+
+  test("retourne null si le titre n'a pas de points", () => {
+    expect(titreCoordonneesFind([])).toBeNull()
+    expect(titreCoordonneesFind(null)).toBeNull()
+  })
+})
diff --git a/src/business/rules/titre-coordonnees-find.ts b/src/business/rules/titre-coordonnees-find.ts
new file mode 100644
index 0000000000000000000000000000000000000000..dbbd1d82150241784bf20dde86a4717c1e578c78
--- /dev/null
+++ b/src/business/rules/titre-coordonnees-find.ts
@@ -0,0 +1,14 @@
+import { ITitrePoint } from '../../types'
+import center from '@turf/center'
+import { geojsonFeatureMultiPolygon } from '../../tools/geojson'
+
+const titreCoordonneesFind = (titrePoints?: ITitrePoint[] | null) => {
+  if (!titrePoints?.length) return null
+
+  const geojson = geojsonFeatureMultiPolygon(titrePoints)
+  const [x, y] = center(geojson).geometry.coordinates
+
+  return { x, y }
+}
+
+export default titreCoordonneesFind
diff --git a/src/business/titre-demarche-update.ts b/src/business/titre-demarche-update.ts
index 4fae2fb749133816bd4babb6ec6d83601fad977e..d43beca1dd3b52554eb3f5b3e1220ed4768c3518 100644
--- a/src/business/titre-demarche-update.ts
+++ b/src/business/titre-demarche-update.ts
@@ -11,6 +11,7 @@ import titresDemarchesOrdreUpdate from './processes/titres-demarches-ordre-updat
 import titresPublicUpdate from './processes/titres-public-update'
 import { titresIdsUpdate } from './processes/titres-ids-update'
 import updatesLog from './_updates-log'
+import titresCoordonneesUpdate from './processes/titres-coordonnees-update'
 
 const titreDemarcheUpdate = async (
   titreDemarcheId: string | null,
@@ -53,6 +54,7 @@ const titreDemarcheUpdate = async (
     const titresDatesUpdated = await titresDatesUpdate([titreId])
     const titresPropsEtapeIdUpdated = await titresPropsEtapeIdUpdate([titreId])
     const titresPropsContenuUpdated = await titresPropsContenuUpdate([titreId])
+    const titresCoordonneesUpdated = await titresCoordonneesUpdate([titreId])
     const titresActivitesCreated = await titresActivitesUpdate([titreId])
 
     // met à jour l'id dans le titre par effet de bord
@@ -72,6 +74,7 @@ const titreDemarcheUpdate = async (
       titresDatesUpdated,
       titresPropsEtapeIdUpdated,
       titresPropsContenuUpdated,
+      titresCoordonneesUpdated,
       titresActivitesCreated,
       titresUpdatedIndex
     })
diff --git a/src/business/titre-etape-update.ts b/src/business/titre-etape-update.ts
index d2a7f306a4440b641c46f32b71f2297fcb955e98..3b3ead3de3f3958b25ec5a97c0ed357aa8210788 100644
--- a/src/business/titre-etape-update.ts
+++ b/src/business/titre-etape-update.ts
@@ -16,6 +16,7 @@ import titresPropsContenuUpdate from './processes/titres-props-contenu-update'
 import { titresIdsUpdate } from './processes/titres-ids-update'
 import titresPublicUpdate from './processes/titres-public-update'
 import updatesLog from './_updates-log'
+import titresCoordonneesUpdate from './processes/titres-coordonnees-update'
 
 const titreEtapeUpdate = async (
   titreEtapeId: string | null,
@@ -93,6 +94,7 @@ const titreEtapeUpdate = async (
     } = await titresEtapesAdministrationsLocalesUpdate([titreId])
     const titresPropsEtapeIdUpdated = await titresPropsEtapeIdUpdate([titreId])
     const titresPropsContenuUpdated = await titresPropsContenuUpdate([titreId])
+    const titresCoordonneesUpdated = await titresCoordonneesUpdate([titreId])
     const titresActivitesCreated = await titresActivitesUpdate([titreId])
 
     // met à jour l'id dans le titre par effet de bord
@@ -121,6 +123,7 @@ const titreEtapeUpdate = async (
       titresEtapesAdministrationsLocalesDeleted,
       titresPropsEtapeIdUpdated,
       titresPropsContenuUpdated,
+      titresCoordonneesUpdated,
       titresActivitesCreated,
       titresUpdatedIndex
     })
diff --git a/src/database/models/documents.ts b/src/database/models/documents.ts
index d99bbe1a01fa4d23ff0f1d2d76199dcc8dd1bdd0..f8857a1a1590a8df39feab59be33eafc5ef7cfc3 100644
--- a/src/database/models/documents.ts
+++ b/src/database/models/documents.ts
@@ -91,19 +91,17 @@ class Document extends Model {
   }
 
   public $formatDatabaseJson(json: Pojo): Pojo {
-    json = super.$formatDatabaseJson(json)
-
     delete json.modification
     delete json.suppression
+    json = super.$formatDatabaseJson(json)
 
     return json
   }
 
   public $parseJson(json: Pojo): Pojo {
-    json = super.$parseJson(json)
-
     delete json.modification
     delete json.suppression
+    json = super.$parseJson(json)
 
     return json
   }
diff --git a/src/database/models/titres-activites.ts b/src/database/models/titres-activites.ts
index ac0307dc608e2b80e4a7327aaa7b05d924253470..1c4a090d0d65313956eb9ac8e71de7411bf0796e 100644
--- a/src/database/models/titres-activites.ts
+++ b/src/database/models/titres-activites.ts
@@ -100,8 +100,6 @@ class TitresActivites extends Model {
   }
 
   public $parseJson(json: Pojo) {
-    json = super.$parseJson(json)
-
     if (!json.id && json.titreId && json.typeId && json.frequencePeriodeId) {
       const id = `${json.titreId}-${json.typeId}-${
         json.annee
@@ -111,15 +109,15 @@ class TitresActivites extends Model {
 
     delete json.modification
     delete json.documentsCreation
+    json = super.$parseJson(json)
 
     return json
   }
 
   public $formatDatabaseJson(json: Pojo) {
-    json = super.$formatDatabaseJson(json)
-
     delete json.modification
     delete json.documentsCreation
+    json = super.$formatDatabaseJson(json)
 
     return json
   }
diff --git a/src/database/models/titres-demarches.ts b/src/database/models/titres-demarches.ts
index 22c2212784ea8d2bed681ebfcf01909c02afb227..6740bbd565dbfb25f882e092daa1d39828f8445b 100644
--- a/src/database/models/titres-demarches.ts
+++ b/src/database/models/titres-demarches.ts
@@ -115,8 +115,6 @@ class TitresDemarches extends Model {
   }
 
   public $parseJson(json: Pojo) {
-    json = super.$parseJson(json)
-
     if (!json.id && json.titreId && json.typeId) {
       json.id = `${json.titreId}-${json.typeId}99`
     }
@@ -124,16 +122,16 @@ class TitresDemarches extends Model {
     delete json.modification
     delete json.suppression
     delete json.etapesCreation
+    json = super.$parseJson(json)
 
     return json
   }
 
   public $formatDatabaseJson(json: Pojo) {
-    json = super.$formatDatabaseJson(json)
-
     delete json.modification
     delete json.suppression
     delete json.etapesCreation
+    json = super.$formatDatabaseJson(json)
 
     return json
   }
diff --git a/src/database/models/titres-etapes.ts b/src/database/models/titres-etapes.ts
index 8a861a9b313e2ca645a77acb628b20c8196f3054..7cef04b38fb939a5f7d361357914a8c1eb4d697c 100644
--- a/src/database/models/titres-etapes.ts
+++ b/src/database/models/titres-etapes.ts
@@ -194,8 +194,6 @@ class TitresEtapes extends Model {
   }
 
   public $formatDatabaseJson(json: Pojo) {
-    json = super.$formatDatabaseJson(json)
-
     if (json.pays) {
       delete json.pays
     }
@@ -203,13 +201,12 @@ class TitresEtapes extends Model {
     delete json.modification
     delete json.suppression
     delete json.justificatifsAssociation
+    json = super.$formatDatabaseJson(json)
 
     return json
   }
 
   public $parseJson(json: Pojo) {
-    json = super.$parseJson(json)
-
     if (!json.id && json.titreDemarcheId && json.typeId) {
       json.id = `${json.titreDemarcheId}-${json.typeId}99`
     }
@@ -249,10 +246,10 @@ class TitresEtapes extends Model {
 
     delete json.geojsonMultiPolygon
     delete json.geojsonPoints
-
     delete json.modification
     delete json.suppression
     delete json.justificatifsAssociation
+    json = super.$parseJson(json)
 
     return json
   }
diff --git a/src/database/models/titres-points.ts b/src/database/models/titres-points.ts
index 699978b2ff09110aa8853bc01841410bd8d7dc8d..ead8d8b1d6655e799c336793c3217c8f0baf11fa 100644
--- a/src/database/models/titres-points.ts
+++ b/src/database/models/titres-points.ts
@@ -18,10 +18,7 @@ class TitresPoints extends Model {
       description: { type: ['string', 'null'] },
       coordonnees: {
         type: 'object',
-        properties: {
-          x: { type: 'number' },
-          y: { type: 'number' }
-        }
+        properties: { x: { type: 'number' }, y: { type: 'number' } }
       },
       groupe: { type: 'integer' },
       contour: { type: 'integer' },
diff --git a/src/database/models/titres-travaux-etapes.ts b/src/database/models/titres-travaux-etapes.ts
index d0269a042a1e539e6f98bc487d400af1a852ea8b..e21624a053882ea6c68868167e4ad2f10f5bc1a2 100644
--- a/src/database/models/titres-travaux-etapes.ts
+++ b/src/database/models/titres-travaux-etapes.ts
@@ -69,23 +69,21 @@ class TitresTravauxEtapes extends Model {
   }
 
   public $formatDatabaseJson(json: Pojo) {
-    json = super.$formatDatabaseJson(json)
-
     delete json.modification
     delete json.suppression
+    json = super.$formatDatabaseJson(json)
 
     return json
   }
 
   public $parseJson(json: Pojo) {
-    json = super.$parseJson(json)
-
     if (!json.id && json.titreTravauxId && json.typeId) {
       json.id = `${json.titreTravauxId}-${json.typeId}99`
     }
 
     delete json.modification
     delete json.suppression
+    json = super.$parseJson(json)
 
     return json
   }
diff --git a/src/database/models/titres-travaux.ts b/src/database/models/titres-travaux.ts
index cafdfaf4b6e26a8971c73f7529ebe52b15435fb0..3386caede189b1567c81c8a8ae016fd0733bb100 100644
--- a/src/database/models/titres-travaux.ts
+++ b/src/database/models/titres-travaux.ts
@@ -65,8 +65,6 @@ class TitresTravaux extends Model {
   }
 
   public $parseJson(json: Pojo) {
-    json = super.$parseJson(json)
-
     if (!json.id && json.titreId && json.typeId) {
       json.id = `${json.titreId}-${json.typeId}99`
     }
@@ -74,16 +72,16 @@ class TitresTravaux extends Model {
     delete json.modification
     delete json.suppression
     delete json.etapesCreation
+    json = super.$parseJson(json)
 
     return json
   }
 
   public $formatDatabaseJson(json: Pojo) {
-    json = super.$formatDatabaseJson(json)
-
     delete json.modification
     delete json.suppression
     delete json.etapesCreation
+    json = super.$formatDatabaseJson(json)
 
     return json
   }
diff --git a/src/database/models/titres.ts b/src/database/models/titres.ts
index 40c0a0fdcbab21615b664c0a7847014d102dcb7a..fc06a2b83f07142f9009ba992032b821a188b8df 100644
--- a/src/database/models/titres.ts
+++ b/src/database/models/titres.ts
@@ -40,7 +40,11 @@ class Titres extends Model {
       administrationsTitreEtapeId: { type: ['string', 'null'], maxLength: 128 },
       surfaceTitreEtapeId: { type: ['string', 'null'], maxLength: 128 },
       communesTitreEtapeId: { type: ['string', 'null'], maxLength: 128 },
-      propsTitreEtapesIds: { type: 'json' }
+      propsTitreEtapesIds: { type: 'json' },
+      coordonnees: {
+        type: ['object', 'null'],
+        properties: { x: { type: 'number' }, y: { type: 'number' } }
+      }
     }
   }
 
@@ -218,17 +222,19 @@ class Titres extends Model {
   }
 
   public $parseJson(json: Pojo) {
-    json = super.$parseJson(json)
-
     json = titreInsertFormat(json)
+    json = super.$parseJson(json)
 
     return json
   }
 
   public $formatDatabaseJson(json: Pojo) {
-    json = super.$formatDatabaseJson(json)
+    if (json.coordonnees) {
+      json.coordonnees = `${json.coordonnees.x},${json.coordonnees.y}`
+    }
 
     json = titreInsertFormat(json)
+    json = super.$formatDatabaseJson(json)
 
     return json
   }
diff --git a/src/database/models/utilisateurs.ts b/src/database/models/utilisateurs.ts
index d13a11969fa2b0dee685230745803d8eefad82ef..f649d294c1b4e645615388296e015213f4d83343 100644
--- a/src/database/models/utilisateurs.ts
+++ b/src/database/models/utilisateurs.ts
@@ -67,21 +67,19 @@ class Utilisateurs extends Model {
   }
 
   public $parseJson(json: Pojo) {
-    json = super.$parseJson(json)
-
     delete json.modification
     delete json.suppression
     delete json.permissionModification
+    json = super.$parseJson(json)
 
     return json
   }
 
   public $formatDatabaseJson(json: Pojo) {
-    json = super.$formatDatabaseJson(json)
-
     delete json.modification
     delete json.suppression
     delete json.permissionModification
+    json = super.$formatDatabaseJson(json)
 
     return json
   }
diff --git a/src/database/queries/graph/format.ts b/src/database/queries/graph/format.ts
index 4540df4c97de1faa05045a948c024eb718a9ef24..592739ed3cf7dc79495b3b57283da4c7dc0c5e1f 100644
--- a/src/database/queries/graph/format.ts
+++ b/src/database/queries/graph/format.ts
@@ -16,12 +16,8 @@ const fieldsOrderAsc = [
   'titresTypesTitresStatuts'
 ]
 const fieldsToRemove = ['coordonnees']
-const titreFieldsToRemove = [] as string[]
-const geoFieldsToReplace = [
-  'geojsonPoints',
-  'geojsonMultiPolygon',
-  'geojsonCentre'
-]
+const titreFieldsToRemove = ['geojsonCentre'] as string[]
+const geoFieldsToReplace = ['geojsonPoints', 'geojsonMultiPolygon']
 const titrePropsEtapesFields = ['surface']
 
 interface IFields {
diff --git a/src/tools/__mock__/geojson.ts b/src/tools/__mock__/geojson.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/tools/geojson.ts b/src/tools/geojson.ts
index ea669642c767b47eb5d873867b658f270ec133b9..082a284107630b34c3ce411f1f2aef73a8869dcd 100644
--- a/src/tools/geojson.ts
+++ b/src/tools/geojson.ts
@@ -1,6 +1,5 @@
-import { ITitrePoint, IGeometry, IGeoJson } from '../types'
+import { ITitrePoint, IGeometry } from '../types'
 import * as rewind from 'geojson-rewind'
-import center from '@turf/center'
 
 // convertit des points
 // en un geojson de type 'MultiPolygon'
@@ -38,27 +37,6 @@ const geojsonFeatureCollectionPoints = (points: ITitrePoint[]) => ({
   }))
 })
 
-const geojsonCentre = (
-  geojsonMultiPolygon: IGeoJson | undefined,
-  etapeId?: string | null
-) => {
-  if (geojsonMultiPolygon) {
-    const centreCoords = center(geojsonMultiPolygon).geometry?.coordinates
-    if (centreCoords && centreCoords.length === 2) {
-      return {
-        type: 'Feature',
-        geometry: {
-          type: 'Point',
-          coordinates: centreCoords
-        },
-        properties: { etapeId }
-      }
-    }
-  }
-
-  return undefined
-}
-
 // convertit une liste de points
 // en un tableau 'coordinates' geoJson
 // (le premier et le dernier point d'un contour ont les mêmes coordonnées)
@@ -92,8 +70,4 @@ const multiPolygonContoursClose = (groupes: number[][][][]) =>
     }, [])
   )
 
-export {
-  geojsonFeatureMultiPolygon,
-  geojsonFeatureCollectionPoints,
-  geojsonCentre
-}
+export { geojsonFeatureMultiPolygon, geojsonFeatureCollectionPoints }
diff --git a/src/types.ts b/src/types.ts
index 72abf189a6061a3c2c7ad09d04bfcd2b2d4f91c8..52cde59563c7b176d00cef2781d16ce7340384b1 100644
--- a/src/types.ts
+++ b/src/types.ts
@@ -497,6 +497,7 @@ interface ITitre {
   substances?: ISubstance[] | null
   pointsTitreEtapeId?: string | null
   points?: ITitrePoint[] | null
+  coordonnees?: ICoordonnees | null
   geojsonMultiPolygon?: IGeoJson | null
   geojsonPoints?: IGeoJson | null
   geojsonCentre?: IGeoJsonCentre | null
@@ -923,7 +924,6 @@ export {
   IFrequence,
   IGeoJson,
   IGeoJsonProperties,
-  IGeoJsonCentre,
   IApiGeoResult,
   IGeometry,
   IGeoSysteme,
diff --git a/tsconfig.json b/tsconfig.json
index 95c82ba4cd9d7e3f6cae5a46f5ce444dfa70735b..a18a74f24f4f1dd4d098c3d79df84fd15887c659 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -49,7 +49,7 @@
           ]
         },
         {
-          "title": "Developpement",
+          "title": "Développement",
           "pages": [
             {
               "title": "Introduction",