From b61d971f15b425306b726a2c70b0981fe6e76e10 Mon Sep 17 00:00:00 2001 From: Shelby Switzer Date: Fri, 18 Jun 2021 10:21:23 -0400 Subject: [PATCH] Add diagrams detailing our geo data pipeline (#170) * Detailed flow for data inputs, census data, score creation, and geo data generation (geoJSON and MVT) * Include diagram showing vision for geoplatform ownership Co-authored-by: Shelby Switzer --- docs/architecture/README.md | 8 +++++ .../geodata-pipeline-arch-geoplatform-mmd.svg | 1 + .../geodata-pipeline-arch-geoplatform.mmd | 28 ++++++++++++++++++ .../geodata-pipeline-arch-mmd.png | Bin 0 -> 70783 bytes docs/architecture/geodata-pipeline-arch.mmd | 22 ++++++++++++++ 5 files changed, 59 insertions(+) create mode 100644 docs/architecture/geodata-pipeline-arch-geoplatform-mmd.svg create mode 100644 docs/architecture/geodata-pipeline-arch-geoplatform.mmd create mode 100644 docs/architecture/geodata-pipeline-arch-mmd.png create mode 100644 docs/architecture/geodata-pipeline-arch.mmd diff --git a/docs/architecture/README.md b/docs/architecture/README.md index 2e642520..d173a664 100644 --- a/docs/architecture/README.md +++ b/docs/architecture/README.md @@ -4,6 +4,14 @@ The below is a general architecture of our proposed system: ![Architecture](architecture-mmd.svg) +The following is a more detailed diagram of the geo data pipeline architecture (the Data Pipeline and Server boxes in the general architecture diagram above). + +![Geo Data Pipeline](geodata-pipeline-arch-mmd.svg) + +We are partnering with Geoplatform to turn some of these pieces into open source shared services that they would own. The following is a modified diagram showing which pieces would tentatively be owned by Geoplatform. + +![Geo Data Pipeline](geodata-pipeline-arch-geoplatform-mmd.svg) + ## Updating the Diagram **Note: Do Not directly modify the svg file, it is generated automatically!** diff --git a/docs/architecture/geodata-pipeline-arch-geoplatform-mmd.svg b/docs/architecture/geodata-pipeline-arch-geoplatform-mmd.svg new file mode 100644 index 00000000..b9c77dc4 --- /dev/null +++ b/docs/architecture/geodata-pipeline-arch-geoplatform-mmd.svg @@ -0,0 +1 @@ +
development
production
Owned by Geoplatform
Owned by Geoplatform
Owned by Geoplatform
Event Notification
Event Notification (Geoplatform)
Event Notification
Access non-geo data
XYZ URL
XYZ URL
Tileserver-GL
MBTiles (GeoPlatform S3)
MBTiles
Uncompressed MVT (Geoplatform S3)
Create and Send MVT
Tippecanoe
GeoJSON (S3)
Combine (ogr2ogr)+ Create GeoJSON
TIGER GeoJSON (S3)
Create GeoJSON from Shapefile with osgeo/gdal
Dataset 1
Create Score CSV
Dataset 2
Census TIGER Data
CSV (S3)
Gatsby+OpenLayers Client
\ No newline at end of file diff --git a/docs/architecture/geodata-pipeline-arch-geoplatform.mmd b/docs/architecture/geodata-pipeline-arch-geoplatform.mmd new file mode 100644 index 00000000..e64be0a2 --- /dev/null +++ b/docs/architecture/geodata-pipeline-arch-geoplatform.mmd @@ -0,0 +1,28 @@ +graph TD + Dataset1["Dataset 1"]-->Score + Dataset2["Dataset 2"]-->Score + Census["Census TIGER Data"]-->CGTiger + subgraph "Owned by Geoplatform" + CGTiger["Create GeoJSON from Shapefile with osgeo/gdal"]-->TS3 + + end + TS3("TIGER GeoJSON (S3)")-->CGJ + Score["Create Score CSV"]--Event Notification-->CSV + CSV("CSV (S3)")--"Event Notification (Geoplatform)"-->CGJ + subgraph "Owned by Geoplatform" + CGJ["Combine (ogr2ogr)+ Create GeoJSON"]--Event Notification-->GeoJSON + end + GeoJSON("GeoJSON (S3)")-->Tip + GeoJSON--"Access non-geo data"-->Client + subgraph "Owned by Geoplatform" + Tip[/Tippecanoe/]-->CreateMVT["Create and Send MVT"] + end + subgraph production + CreateMVT-->MBTiles + MBTiles-->Uncompressed("Uncompressed MVT (Geoplatform S3)") + end + subgraph development + CreateMVT-->Compressed("MBTiles (GeoPlatform S3)")-->TS[/Tileserver-GL/] + end + TS--"XYZ URL"-->Client + Uncompressed--"XYZ URL"-->Client["Gatsby+OpenLayers Client"] diff --git a/docs/architecture/geodata-pipeline-arch-mmd.png b/docs/architecture/geodata-pipeline-arch-mmd.png new file mode 100644 index 0000000000000000000000000000000000000000..bef89b167a44663523ca7be75e26ab29e983578e GIT binary patch literal 70783 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 literal 0 HcmV?d00001 diff --git a/docs/architecture/geodata-pipeline-arch.mmd b/docs/architecture/geodata-pipeline-arch.mmd new file mode 100644 index 00000000..dbfb0f72 --- /dev/null +++ b/docs/architecture/geodata-pipeline-arch.mmd @@ -0,0 +1,22 @@ +graph TD + Dataset1["Dataset 1"]-->Score + Dataset2["Dataset 2"]-->Score + Census["Census TIGER Data"]-->CGTiger + CGTiger["Create GeoJSON from Shapefile with osgeo/gdal"]-->TS3 + TS3("TIGER GeoJSON (S3)")-->CGJ + Score["Create Score CSV"]-->CSV + CSV("CSV (S3)")-->CGJ + CGJ["Combine (ogr2ogr)+ Create GeoJSON"]-->GeoJSON + GeoJSON("GeoJSON (S3)")-->Tip + GeoJSON--"Access non-geo data"-->Client + subgraph "Generate MVT" + Tip[/Tippecanoe/]-->CreateMVT["Create and Send MVT"] + end + subgraph production + CreateMVT-->Uncompressed("Uncompressed MVT (S3)") + end + subgraph development + CreateMVT-->Compressed("MBTiles (S3)")-->TS[/Tileserver-GL/] + end + TS--"XYZ URL"-->Client + Uncompressed--"XYZ URL"-->Client["Gatsby+OpenLayers"]