263 lines
8.6 KiB
Nix
263 lines
8.6 KiB
Nix
{
|
|
description = "spacial-data-experiments";
|
|
|
|
inputs = {
|
|
nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-unstable";
|
|
flake-utils.url = "github:numtide/flake-utils";
|
|
quebec-cities-poly = {
|
|
url = "github:didiercrunch/cities";
|
|
flake = false;
|
|
};
|
|
};
|
|
outputs = { self, nixpkgs, flake-utils, quebec-cities-poly }:
|
|
flake-utils.lib.eachDefaultSystem (system:
|
|
let
|
|
pkgs = nixpkgs.legacyPackages.${system};
|
|
|
|
poly2geojson = pkgs.rustPlatform.buildRustPackage rec {
|
|
pname = "poly2geojson";
|
|
version = "0.1.3";
|
|
|
|
src = pkgs.fetchFromGitHub {
|
|
owner = "frafra";
|
|
repo = pname;
|
|
rev = "2fbf2383765fe043d43d53b91ddbfe50c0129bb1";
|
|
hash = "sha256-BMRl6fRqQlibuGxg5hBHz7r1cvionNYEZe9YcZuL0oU=";
|
|
};
|
|
cargoHash = "sha256-pCegHF6SsCIsCQ/b+N34xTMjw2PjPB0pi30Y9sWIcV4=";
|
|
};
|
|
|
|
osmosis = pkgs.stdenv.mkDerivation {
|
|
name = "osmosis";
|
|
src = pkgs.fetchzip {
|
|
url =
|
|
"https://github.com/openstreetmap/osmosis/releases/download/0.49.2/osmosis-0.49.2.zip";
|
|
hash = "sha256-hmD/pnEEJsl2NkODon4XZcZ3ZQ7+fx/JvWTR4xrRoug=";
|
|
};
|
|
buildInputs = [ ];
|
|
buildPhase = "";
|
|
installPhase = ''
|
|
cp -r . $out
|
|
'';
|
|
};
|
|
|
|
custom-osmium-tool = pkgs.stdenv.mkDerivation rec {
|
|
pname = "osmium-tool";
|
|
version = "1.16.0";
|
|
|
|
src = pkgs.fetchFromGitHub {
|
|
owner = "osmcode";
|
|
repo = "osmium-tool";
|
|
rev = "8ed94a5da2a24b233a77732bfaa8c75fc32ea505";
|
|
sha256 = "sha256-YxjInUqcVfrBvAdBA/pd2J7NEBp6FvoQ97S+aW9x7jE=";
|
|
};
|
|
|
|
nativeBuildInputs = with pkgs; [ cmake installShellFiles pandoc ];
|
|
|
|
buildInputs = with pkgs; [
|
|
boost
|
|
bzip2
|
|
expat
|
|
libosmium
|
|
lz4
|
|
protozero
|
|
zlib
|
|
nlohmann_json
|
|
];
|
|
|
|
doCheck = false;
|
|
doInstallCheck = false;
|
|
|
|
postInstall = ''
|
|
installShellCompletion --zsh ../zsh_completion/_osmium
|
|
'';
|
|
};
|
|
|
|
duckdb-spatial = pkgs.clangStdenv.mkDerivation rec {
|
|
pname = "duckdb-spatial";
|
|
version = "master";
|
|
|
|
src = pkgs.fetchFromGitHub {
|
|
owner = "duckdb";
|
|
repo = "duckdb-spatial";
|
|
rev = "7f861c037567dadaeff9cb5dcde4e5f2e87a4e14";
|
|
sha256 = "sha256-8kfNofzbmPJ7+qKKzsr7LVu1mMDwGhy5nQj6/kRhYLg=";
|
|
};
|
|
librarySystemDepends = [ pkgs.zlib ];
|
|
executableSystemDepends = [ pkgs.zlib ];
|
|
|
|
cmakeFlags =
|
|
[ "-DVCPKG_TARGET_TRIPLET=${system}" "-DSPATIAL_USE_NETWORK=0" ];
|
|
|
|
nativeBuildInputs = with pkgs; [
|
|
cmake
|
|
installShellFiles
|
|
pandoc
|
|
pkg-config
|
|
zlib
|
|
];
|
|
|
|
buildInputs = with pkgs; [ geographiclib openssl geos curl zlib ];
|
|
|
|
doCheck = false;
|
|
};
|
|
|
|
static-server-url = "https://static.home.all-dressed-programming.com";
|
|
geofabrik-base-url =
|
|
"${static-server-url}/download.geofabrik.de/north-america/canada/";
|
|
|
|
osm-quebec."2020" = pkgs.fetchurl {
|
|
url = "${geofabrik-base-url}quebec-200101.osm.pbf";
|
|
hash = "sha256-RYoz4Qo/xwiEVBoA4xRHHpt8kvNS/mHskJBmR4+3vQk=";
|
|
};
|
|
osm-quebec."2021" = pkgs.fetchurl {
|
|
url = "${geofabrik-base-url}quebec-210101.osm.pbf";
|
|
hash = "sha256-kKi/5hCVHaVvMVFAJWpJGPybmKwDu0QXePimYnHBKKk=";
|
|
};
|
|
osm-quebec."2022" = pkgs.fetchurl {
|
|
url = "${geofabrik-base-url}quebec-220101.osm.pbf";
|
|
hash = "sha256-iZUm+vMiDH6eyf4kmee6O8z+lN/voyjAt4RtzmSU6Wo=";
|
|
};
|
|
osm-quebec."2023" = pkgs.fetchurl {
|
|
url = "${geofabrik-base-url}quebec-230101.osm.pbf";
|
|
hash = "sha256-AReFCvBIz42RBcOYgC25ZJaBXADW1lIzSpCI+vdrWX0=";
|
|
};
|
|
osm-quebec."2024" = pkgs.fetchurl {
|
|
url = "${geofabrik-base-url}quebec-240101.osm.pbf";
|
|
hash = "sha256-lcbn4mks4NlnwU3QwQOFdLICxFGapDC0PR/h0HlIR1E=";
|
|
};
|
|
osm-quebec."2025" = pkgs.fetchurl {
|
|
url = "${geofabrik-base-url}quebec-250101.osm.pbf";
|
|
hash = "sha256-QLIflsZuv8r2+mGVARrGkXyjWZ7qGzdSODpVka8iK8c=";
|
|
};
|
|
|
|
data-dir = osm-data:
|
|
pkgs.stdenv.mkDerivation {
|
|
name = "data-dir";
|
|
src = ./scripts;
|
|
buildInputs =
|
|
[ poly2geojson pkgs.jdk23 osmosis custom-osmium-tool ];
|
|
buildPhase = ''
|
|
mkdir -p cities/canada/quebec
|
|
cp ${quebec-cities-poly}/canada/quebec/* cities/canada/quebec
|
|
chmod u+w cities/canada/quebec
|
|
${pkgs.babashka}/bin/bb to-geojson.clj --osm-file ${osm-data} --paths cities/canada/quebec/*.poly
|
|
'';
|
|
installPhase = ''
|
|
cp -r cities $out
|
|
'';
|
|
};
|
|
|
|
historical-data-dir = pkgs.stdenv.mkDerivation {
|
|
name = "historical-data-dir";
|
|
src = ./scripts;
|
|
buildInputs = [ ];
|
|
buildPhase = "";
|
|
installPhase = ''
|
|
mkdir -p $out
|
|
ln -s ${data-dir osm-quebec."2020"} $out/2020
|
|
ln -s ${data-dir osm-quebec."2021"} $out/2021
|
|
ln -s ${data-dir osm-quebec."2022"} $out/2022
|
|
ln -s ${data-dir osm-quebec."2023"} $out/2023
|
|
ln -s ${data-dir osm-quebec."2024"} $out/2024
|
|
ln -s ${data-dir osm-quebec."2025"} $out/2025
|
|
'';
|
|
};
|
|
|
|
processed-duckdb-file = pkgs.fetchurl {
|
|
url = "${static-server-url}/yongestreet/duckdb/2025-01-06.duckdb";
|
|
hash = "sha256-jZEkKg/D3MOVWprVGmsc/ev2fY6TVcN3tD3NH23B2h4=";
|
|
};
|
|
|
|
web-server = pkgs.buildDotnetModule {
|
|
pname = "YongeStreet";
|
|
version = "0.1.0";
|
|
src = ./.;
|
|
nugetDeps = ./nuget-deps.nix;
|
|
projectFile = "YongeStreet/YongeStreet.csproj";
|
|
dotnetBuildFlags = [ "--no-self-contained" ];
|
|
dotnet-sdk = pkgs.dotnetCorePackages.sdk_8_0;
|
|
dotnet-runtime = pkgs.dotnetCorePackages.aspnetcore_8_0;
|
|
};
|
|
|
|
yonge-street = pkgs.writeShellApplication {
|
|
name = "yong-street";
|
|
runtimeInputs = [ ];
|
|
text = ''
|
|
cd ${web-server}/lib/YongeStreet
|
|
exec ${web-server}/bin/YongeStreet
|
|
'';
|
|
};
|
|
|
|
python-virtual-env = pkgs.python312.withPackages (ps: [
|
|
ps.matplotlib
|
|
ps.jupyter
|
|
ps.tqdm
|
|
ps.duckdb
|
|
ps.pandas
|
|
ps.unidecode
|
|
ps.geopy
|
|
ps.click
|
|
ps.jinja2
|
|
]);
|
|
|
|
in {
|
|
packages = {
|
|
default = yonge-street;
|
|
yonge-street = yonge-street;
|
|
historical-data-dir = historical-data-dir;
|
|
poly2geojson = poly2geojson;
|
|
osmosis = osmosis;
|
|
duckdb-spatial = duckdb-spatial;
|
|
web-server = web-server;
|
|
};
|
|
devShell = pkgs.mkShell {
|
|
name = "spacial-data-experiments";
|
|
buildInputs = with pkgs; [
|
|
duckdb
|
|
http-server
|
|
sqlfluff
|
|
poly2geojson
|
|
gdal
|
|
custom-osmium-tool
|
|
python-virtual-env
|
|
dotnet-sdk_8
|
|
nuget-to-nix
|
|
];
|
|
};
|
|
nixosModules = { config, lib, ... }: {
|
|
options.services.all-dressed-programming.yonge-street = {
|
|
enable = lib.mkEnableOption "enable YongeStreet server";
|
|
port = lib.mkOption {
|
|
type = lib.types.int;
|
|
default = 9876;
|
|
description = "The tcp port the YongeStreet will serve on.";
|
|
};
|
|
};
|
|
# options.services.all-dressed-programming.yonge-street
|
|
config = lib.mkIf
|
|
config.services.all-dressed-programming.yonge-street.enable {
|
|
users.groups.yonge-street = { };
|
|
|
|
users.users.yonge-street = {
|
|
createHome = false;
|
|
isSystemUser = true;
|
|
group = "yonge-street";
|
|
};
|
|
|
|
systemd.services.yonge-street = {
|
|
wantedBy = [ "multi-user.target" ];
|
|
environment.DOTNET_HTTP_PORTS = (builtins.toString
|
|
config.services.all-dressed-programming.yonge-street.port);
|
|
serviceConfig = {
|
|
User = "yonge-street";
|
|
Group = "yonge-street";
|
|
Restart = "always";
|
|
ExecStart = "${yonge-street}/bin/yonge-street";
|
|
};
|
|
};
|
|
};
|
|
};
|
|
});
|
|
}
|