From 1f78920f63db67ee0912e65f9f2dc3cc3c9593b8 Mon Sep 17 00:00:00 2001 From: Shelby Switzer Date: Fri, 8 Oct 2021 13:12:03 -0400 Subject: [PATCH] Update diagrams in architecture docs (#790) * Update diagrams in architecture docs * Updates overall diagram to represent current arch and process (including vision for data selection) * Updates geo data pipleline arch diagram and removes geoplatform version since we only have one version of this for the foreseeable future and we're using geoplatform infradstructure * Update diagram to remove something we do not yet do * Updating Diagram Co-authored-by: Shelby Switzer Co-authored-by: GitHub Action --- docs/architecture/README.md | 6 +-- docs/architecture/architecture-mmd.svg | 2 +- docs/architecture/architecture.mmd | 34 ++++++-------- .../geodata-pipeline-arch-geoplatform-mmd.svg | 1 - .../geodata-pipeline-arch-geoplatform.mmd | 28 ----------- .../geodata-pipeline-arch-mmd.png | Bin 70783 -> 0 bytes .../geodata-pipeline-arch-mmd.svg | 1 + docs/architecture/geodata-pipeline-arch.mmd | 44 ++++++++++++------ 8 files changed, 45 insertions(+), 71 deletions(-) delete mode 100644 docs/architecture/geodata-pipeline-arch-geoplatform-mmd.svg delete mode 100644 docs/architecture/geodata-pipeline-arch-geoplatform.mmd delete mode 100644 docs/architecture/geodata-pipeline-arch-mmd.png create mode 100644 docs/architecture/geodata-pipeline-arch-mmd.svg diff --git a/docs/architecture/README.md b/docs/architecture/README.md index 52c74769..d5c6e8fa 100644 --- a/docs/architecture/README.md +++ b/docs/architecture/README.md @@ -4,14 +4,10 @@ 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). +The following is a more detailed diagram of the data pipeline architecture utilizing S3 buckets for file/data hosting on Geoplatform.gov. ![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.png) - ## Updating the Diagram **Note: Do Not directly modify the svg file, it is generated automatically!** diff --git a/docs/architecture/architecture-mmd.svg b/docs/architecture/architecture-mmd.svg index d7dcc836..52352c63 100644 --- a/docs/architecture/architecture-mmd.svg +++ b/docs/architecture/architecture-mmd.svg @@ -1 +1 @@ -
Other Clients
Geoplatform.gov
Data Pipeline (Justice40 Repo)
Server
Justice40 Client
Data Selection
Community
API
API
API
Third Party Apps
Justice40 Visualization Library
Tile Styling
Justice40 Static Site Frontend
GeoJSON
Feature Database
Tile Server
Approved Datasets
Properties
Geometries
Processing
Intake
Evolution
Voting
Community Input
\ No newline at end of file +
Other Clients
Hosted by Geoplatform.gov
Data Pipeline (Justice40 Repo)
Justice40 Client
Data Selection (vision)
Community
ETL
Score Generation
API (S3 Access)
API (S3 Access)
API (S3 Access)
API (S3 Access)
Data Scientists
Third Party Apps
Justice40 Visualization Library (MapLibre)
Justice40 Static Site Frontend (Gatsby)
Approved Datasets
Normalized CSVs
Full CSV with Data and Score
GeoJSON
Uncompressed MVT Tiles
Intake
Evolution
Voting
Community Input
\ No newline at end of file diff --git a/docs/architecture/architecture.mmd b/docs/architecture/architecture.mmd index 70655a47..123fbd60 100644 --- a/docs/architecture/architecture.mmd +++ b/docs/architecture/architecture.mmd @@ -3,37 +3,29 @@ graph LR input["Community Input"] end - subgraph ds["Data Selection"] + subgraph ds["Data Selection (vision)"] input --> Intake input --> Evolution input --> Voting Intake --> Evolution --> Voting end - subgraph s["Geoplatform.gov"] + subgraph s["Hosted by Geoplatform.gov"] subgraph dp["Data Pipeline (Justice40 Repo)"] Voting --> a["Approved Datasets"] - a --> Properties - a --> Geometries - Properties --> Processing - Geometries --> Processing - input --> Processing + a -- ETL --> ncsv["Normalized CSVs"] + ncsv--"Score Generation"--> ScoreCSV["Full CSV with Data and Score"] + ScoreCSV-->GeoJSON + GeoJSON-->MVT["Uncompressed MVT Tiles"] end - subgraph Server - Processing --> GeoJSON - GeoJSON --> db[("Feature Database")] - db --> tileserv["Tile Server"] - end - subgraph j40["Justice40 Client"] - tileserv --> vl - ts["Tile Styling"] --> vl["Justice40 Visualization Library"] - vl --> fe["Justice40 Static Site Frontend"] + subgraph j40["Justice40 Client"] + MVT --"API (S3 Access)"--> vl["Justice40 Visualization Library (MapLibre)"] + vl --> fe["Justice40 Static Site Frontend (Gatsby)"] end end subgraph oc["Other Clients"] - tileserv -- API --> 3p["Third Party Apps"] - GeoJSON -- API --> 3p - db -- API --> 3p - end - \ No newline at end of file + ScoreCSV --"API (S3 Access)" --> DS["Data Scientists"] + GeoJSON -- "API (S3 Access)" --> 3["Third Party Apps"] + MVT -- "API (S3 Access)" --> 3["Third Party Apps"] + end \ No newline at end of file diff --git a/docs/architecture/geodata-pipeline-arch-geoplatform-mmd.svg b/docs/architecture/geodata-pipeline-arch-geoplatform-mmd.svg deleted file mode 100644 index b9c77dc4..00000000 --- a/docs/architecture/geodata-pipeline-arch-geoplatform-mmd.svg +++ /dev/null @@ -1 +0,0 @@ -
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 deleted file mode 100644 index e64be0a2..00000000 --- a/docs/architecture/geodata-pipeline-arch-geoplatform.mmd +++ /dev/null @@ -1,28 +0,0 @@ -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 deleted file mode 100644 index bef89b167a44663523ca7be75e26ab29e983578e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 70783 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 diff --git a/docs/architecture/geodata-pipeline-arch-mmd.svg b/docs/architecture/geodata-pipeline-arch-mmd.svg new file mode 100644 index 00000000..ba843576 --- /dev/null +++ b/docs/architecture/geodata-pipeline-arch-mmd.svg @@ -0,0 +1 @@ +
development
production
Census Data ETL
ETL and Score Generation
Option 1
Option 2
XYZ URL
XYZ URL
Tileserver-GL
Locally stored tiles
Compressed high and low .mbtile files (S3)
Uncompressed MVT high and low directories (S3)
TIGER GeoJSON State Files(S3)
Create GeoJSON from Shapefile with ogr2ogr
Combine Census State Files with Geopandas
National Census GeoJSON (S3)
Normalized CSV (S3)
ETL for Dataset 1
Normalized CSV (S3)
ETL for Dataset 2
Generate Score (score-run)
Downloadable zip
Full CSV (S3)
Dataset 1
Dataset 2
Gatsby+MapLibre
Census TIGER Data Shapefiles (hosted by Census)
Combine with ogr2ogr + Create GeoJSON (score-geo)
GeoJSON files (high and low zoom) (S3)
Create and Send Tiles using Tippecanoe
\ No newline at end of file diff --git a/docs/architecture/geodata-pipeline-arch.mmd b/docs/architecture/geodata-pipeline-arch.mmd index dbfb0f72..f7036428 100644 --- a/docs/architecture/geodata-pipeline-arch.mmd +++ b/docs/architecture/geodata-pipeline-arch.mmd @@ -1,22 +1,36 @@ 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"] + Dataset1["Dataset 1"]-->ETL1 + Dataset2["Dataset 2"]-->ETL2 + subgraph "ETL and Score Generation" + ETL1["ETL for Dataset 1"]-->ncsv1("Normalized CSV (S3)") + ETL2["ETL for Dataset 2"]-->ncsv2("Normalized CSV (S3)") + ncsv1-->Score + ncsv2-->Score + Score-->DL("Downloadable zip") + Score["Generate Score (score-run)"]-->CSV end + DL-->Client + + Census["Census TIGER Data Shapefiles (hosted by Census)"]-->CGTiger + subgraph "Census Data ETL" + CGTiger["Create GeoJSON from Shapefile with ogr2ogr"]-->TS3 + TS3("TIGER GeoJSON State Files(S3)")-->CombineCensus["Combine Census State Files with Geopandas"] + CombineCensus-->NCS3("National Census GeoJSON (S3)") + end + + CSV("Full CSV (S3)")-->CGJ + NCS3-->CGJ + CGJ["Combine with ogr2ogr + Create GeoJSON (score-geo)"]-->GeoJSON + GeoJSON("GeoJSON files (high and low zoom) (S3)")-->Tip + Tip["Create and Send Tiles using Tippecanoe"]-->Uncompressed + Tip-->Compressed subgraph production - CreateMVT-->Uncompressed("Uncompressed MVT (S3)") + Uncompressed("Uncompressed MVT high and low directories (S3)") end subgraph development - CreateMVT-->Compressed("MBTiles (S3)")-->TS[/Tileserver-GL/] + Local("Locally stored tiles")--"Option 1"-->TS + Compressed("Compressed high and low .mbtile files (S3)")--"Option 2"-->TS[/Tileserver-GL/] end + TS--"XYZ URL"-->Client - Uncompressed--"XYZ URL"-->Client["Gatsby+OpenLayers"] + Uncompressed--"XYZ URL"-->Client["Gatsby+MapLibre"]