Bläddra i källkod

Update bounds computation

Use D3's bounds computation per projection.
master
TheoryOfNekomata 2 år sedan
förälder
incheckning
848a817436
12 ändrade filer med 322 tillägg och 16 borttagningar
  1. +1
    -0
      .gitignore
  2. Binär
      __fixtures__/gb.png
  3. Binär
      __fixtures__/jp.png
  4. Binär
      __fixtures__/mercator.png
  5. Binär
      __fixtures__/ph.png
  6. Binär
      __fixtures__/robinson.png
  7. Binär
      __fixtures__/ru.png
  8. Binär
      __fixtures__/sinusoidal.png
  9. Binär
      __fixtures__/us.png
  10. Binär
      __fixtures__/world.png
  11. +260
    -0
      assets/ne_10m_admin_0_countries.json
  12. +61
    -16
      src/index.ts

+ 1
- 0
.gitignore Visa fil

@@ -105,3 +105,4 @@ dist
.tern-port

.npmrc
assets/

Binär
__fixtures__/gb.png Visa fil

Före Efter
Bredd: 800  |  Höjd: 406  |  Storlek: 112 KiB

Binär
__fixtures__/jp.png Visa fil

Före Efter
Bredd: 800  |  Höjd: 406  |  Storlek: 108 KiB

Binär
__fixtures__/mercator.png Visa fil

Före Efter
Bredd: 461  |  Höjd: 461  |  Storlek: 54 KiB

Binär
__fixtures__/ph.png Visa fil

Före Efter
Bredd: 200  |  Höjd: 320  |  Storlek: 24 KiB Bredd: 800  |  Höjd: 400  |  Storlek: 98 KiB

Binär
__fixtures__/robinson.png Visa fil

Före Efter
Bredd: 461  |  Höjd: 234  |  Storlek: 54 KiB

Binär
__fixtures__/ru.png Visa fil

Före Efter
Bredd: 800  |  Höjd: 406  |  Storlek: 112 KiB

Binär
__fixtures__/sinusoidal.png Visa fil

Före Efter
Bredd: 461  |  Höjd: 231  |  Storlek: 46 KiB

Binär
__fixtures__/us.png Visa fil

Före Efter
Bredd: 800  |  Höjd: 406  |  Storlek: 112 KiB

Binär
__fixtures__/world.png Visa fil

Före Efter
Bredd: 4608  |  Höjd: 4608  |  Storlek: 7.1 MiB

+ 260
- 0
assets/ne_10m_admin_0_countries.json
Filskillnaden har hållits tillbaka eftersom den är för stor
Visa fil


+ 61
- 16
src/index.ts Visa fil

@@ -1,6 +1,6 @@
import yargs from 'yargs';
import { hideBin } from 'yargs/helpers';
import { project, Bounds } from '@theoryofnekomata/orbis-core';
import { project, ProjectBounds } from '@theoryofnekomata/orbis-core';
import { writeFile } from 'fs/promises';
import { basename, dirname, resolve } from 'path';

@@ -8,10 +8,11 @@ type ProjectArgs = {
input: string,
projection: string,
output?: string,
bounds: Bounds,
bounds: ProjectBounds,
width?: number,
height?: number,
padding: [number, number],
country?: string,
};

const coerceNumber = (n?: string) => {
@@ -36,21 +37,62 @@ const coercePadding = (n?: string) => {
];
};

const coerceBounds = (n?: string): Bounds => {
const coerceBounds = (n?: string): ProjectBounds => {
if (typeof n !== 'string') {
return [
[-180, 90],
[180, -90],
] as Bounds;
return {
type: 'geojson',
value: {
type: 'Sphere',
},
};
}

return n
.split(';')
.map((p) => (
p
.split(',')
.map((c: string) => Number(c))
)) as Bounds;
const [boundsType, etcBounds] = n.split(':');

if (boundsType === 'geojson') {
const [geometryType, etcArgs] = etcBounds.split(';');

if (geometryType === 'Sphere') {
return {
type: boundsType,
value: {
type: geometryType,
},
};
}

if (geometryType === 'Polygon' || geometryType === 'MultiPolygon') {
return {
type: boundsType,
value: {
type: geometryType,
coordinates: JSON.parse(etcArgs),
},
};
}

return {
type: 'geojson',
value: {
type: 'Sphere',
},
};
}

if (boundsType === 'country') {
const [country] = etcBounds.split(';');
return {
type: boundsType,
value: country,
};
}

return {
type: 'geojson',
value: {
type: 'Sphere',
},
};
};

const main = async (argv: string | readonly string[]) => {
@@ -85,12 +127,15 @@ const main = async (argv: string | readonly string[]) => {
.coerce('height', coerceNumber)
.option('padding', {
alias: 'p',
default: [0, 0],
default: '0;0',
})
.coerce('padding', coercePadding)
.option('bounds', {
alias: 'b',
default: [[-180, 90], [180, -90]],
default: 'geojson:Sphere',
})
.option('country', {
alias: 'c',
})
.coerce('bounds', coerceBounds),
handler: async (projectArgvRaw) => {


Laddar…
Avbryt
Spara