{"_id":"@allmaps/project","_rev":"9-332c95d6aefed8e680038eb56d491cf6","name":"@allmaps/project","dist-tags":{"beta":"1.0.0-beta.2","latest":"1.0.0-beta.9"},"versions":{"1.0.0-beta.1":{"name":"@allmaps/project","version":"1.0.0-beta.1","keywords":["projection","georeference","map"],"license":"MIT","_id":"@allmaps/project@1.0.0-beta.1","maintainers":[{"name":"bertspaan","email":"hello@bertspaan.nl"}],"contributors":[{"url":"https://manuelclaeysbouuaert.be","name":"Manuel Claeys Bouuaert","email":"manuel.claeys.b@gmail.com"},{"url":"https://bertspaan.nl","name":"Bert Spaan","email":"hello@bertspaan.nl"}],"homepage":"https://allmaps.org","dist":{"shasum":"f3932ab2dd69a369177530725580ff3b4beb42fc","tarball":"https://registry.npmjs.org/@allmaps/project/-/project-1.0.0-beta.1.tgz","fileCount":11,"integrity":"sha512-vxCAiO18v7J6MOPHIF35nuBYoEy7kmud2uddP5hKlOWrjrxsJQl0vKpw3wGy4b4I3xHTH+VG2RYMzlqD977LMg==","signatures":[{"sig":"MEYCIQDUsWdbrt0XbgoaMxm4/nr51n8N6P6SfPLJ+mOprZrmFwIhALIlWhT1aZbYuzQv0SewyGhqHAfR9yKftMPY9FvwbRBM","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":47589},"type":"module","exports":"./dist/index.js","gitHead":"52a33f5d89519a0fd621c4847b2c7b5b63d52ef2","scripts":{"lint":"prettier --check src test && eslint src test --ext .js,.ts","test":"NODE_ENV=test pnpm run build && mocha","bench":"node bench/index.js","build":"tsc && pnpm run documentation","types":"tsc --noEmit","watch":"tsc --watch","format":"prettier --write src test","preversion":"pnpm run lint && pnpm test","documentation":"remark . --output --use remark-api"},"_npmUser":{"name":"bertspaan","email":"hello@bertspaan.nl"},"repository":{"url":"https://github.com/allmaps/allmaps.git","type":"git","directory":"packages/project"},"_npmVersion":"lerna/4.1.2/node@v23.11.0+arm64 (darwin)","description":"Projection functions","directories":{},"_nodeVersion":"23.11.0","dependencies":{"proj4":"^2.15.0","@allmaps/stdlib":"^1.0.0-beta.34","@allmaps/transform":"^1.0.0-beta.44"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.3.6","mocha":"^10.8.2","eslint":"^8.56.0","prettier":"^3.4.2","remark-api":"^1.1.0","remark-cli":"^12.0.1","typescript":"^5.7.0","@types/proj4":"^2.5.6","@types/eslint":"^8.56.0","@allmaps/types":"^1.0.0-beta.18","@allmaps/annotation":"^1.0.0-beta.33","eslint-config-prettier":"^9.1.0","chai-shallow-deep-equal":"^1.4.6","@typescript-eslint/parser":"^7.0.0","@typescript-eslint/eslint-plugin":"^7.0.0"},"_npmOperationalInternal":{"tmp":"tmp/project_1.0.0-beta.1_1747907475811_0.7091339015990337","host":"s3://npm-registry-packages-npm-production"}},"1.0.0-beta.2":{"name":"@allmaps/project","version":"1.0.0-beta.2","keywords":["projection","georeference","map"],"license":"MIT","_id":"@allmaps/project@1.0.0-beta.2","maintainers":[{"name":"bertspaan","email":"hello@bertspaan.nl"}],"contributors":[{"url":"https://manuelclaeysbouuaert.be","name":"Manuel Claeys Bouuaert","email":"manuel.claeys.b@gmail.com"},{"url":"https://bertspaan.nl","name":"Bert Spaan","email":"hello@bertspaan.nl"}],"homepage":"https://allmaps.org","dist":{"shasum":"36a8425818b89c4f36c555c3a788d8a9f5722151","tarball":"https://registry.npmjs.org/@allmaps/project/-/project-1.0.0-beta.2.tgz","fileCount":11,"integrity":"sha512-friGMTE3mlF43Z5wdIi5+v7FtuMyNPjqDQqgFTlriHkPZ0sShUko8+aIEXpz3QxhiLNUuGS+8iZhWNIpfotVOw==","signatures":[{"sig":"MEQCIH2NIQfzBcjaVAmx2pLNtfYAgUWLWbq3Jdkr/KyXwW8WAiAn5zOMzYaYe4Zyrl1LX2qFDLE/sY53eeV3NLBPG32BKQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":47589},"type":"module","exports":"./dist/index.js","gitHead":"f957eb89308c65fed8dd36ec3e39b61c15eaa7eb","scripts":{"lint":"prettier --check src test && eslint src test --ext .js,.ts","test":"NODE_ENV=test pnpm run build && mocha","bench":"node bench/index.js","build":"tsc && pnpm run documentation","types":"tsc --noEmit","watch":"tsc --watch","format":"prettier --write src test","preversion":"pnpm run lint && pnpm test","documentation":"remark . --output --use remark-api"},"_npmUser":{"name":"bertspaan","email":"hello@bertspaan.nl"},"repository":{"url":"https://github.com/allmaps/allmaps.git","type":"git","directory":"packages/project"},"_npmVersion":"lerna/4.1.2/node@v23.11.0+arm64 (darwin)","description":"Projection functions","directories":{},"_nodeVersion":"23.11.0","dependencies":{"proj4":"^2.15.0","@allmaps/stdlib":"^1.0.0-beta.34","@allmaps/transform":"^1.0.0-beta.45"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.3.6","mocha":"^10.8.2","eslint":"^8.56.0","prettier":"^3.4.2","remark-api":"^1.1.0","remark-cli":"^12.0.1","typescript":"^5.7.0","@types/proj4":"^2.5.6","@types/eslint":"^8.56.0","@allmaps/types":"^1.0.0-beta.18","@allmaps/annotation":"^1.0.0-beta.33","eslint-config-prettier":"^9.1.0","chai-shallow-deep-equal":"^1.4.6","@typescript-eslint/parser":"^7.0.0","@typescript-eslint/eslint-plugin":"^7.0.0"},"_npmOperationalInternal":{"tmp":"tmp/project_1.0.0-beta.2_1747914847979_0.5336014796124633","host":"s3://npm-registry-packages-npm-production"}},"1.0.0-beta.3":{"name":"@allmaps/project","version":"1.0.0-beta.3","keywords":["projection","georeference","map"],"license":"MIT","_id":"@allmaps/project@1.0.0-beta.3","maintainers":[{"name":"bertspaan","email":"hello@bertspaan.nl"}],"contributors":[{"url":"https://manuelclaeysbouuaert.be","name":"Manuel Claeys Bouuaert","email":"manuel.claeys.b@gmail.com"},{"url":"https://bertspaan.nl","name":"Bert Spaan","email":"hello@bertspaan.nl"}],"homepage":"https://allmaps.org","dist":{"shasum":"c6a31c39d5454a794c15df0f2d3966ec3079c8ad","tarball":"https://registry.npmjs.org/@allmaps/project/-/project-1.0.0-beta.3.tgz","fileCount":11,"integrity":"sha512-9wlT/4sFw38aB+Ry5+eJhDhoczK6e0Qj1bpq/4rHTFdlXcFgeJ3JuvK1baN3IjscrIn+4GlqddFuLhpnemfepw==","signatures":[{"sig":"MEUCIQCr4FS+0FbS3v5UMRWHWhfJ7XxGc/6o4XHdV7UuLuvqZAIge1IvLoqVaDNZ/85SgmkM1EESwT5FtO/JCLWbvC3cGMc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":50307},"type":"module","exports":"./dist/index.js","gitHead":"b0528a2ee528dd035a4cb9188f838adca307c7b3","scripts":{"lint":"prettier --check src test && eslint src test --ext .js,.ts","test":"NODE_ENV=test pnpm run build && mocha","bench":"node bench/index.js","build":"tsc && pnpm run documentation","types":"tsc --noEmit","watch":"tsc --watch","format":"prettier --write src test","documentation":"remark . --output --use remark-api"},"_npmUser":{"name":"bertspaan","actor":{"name":"bertspaan","type":"user","email":"hello@bertspaan.nl"},"email":"hello@bertspaan.nl"},"repository":{"url":"https://github.com/allmaps/allmaps.git","type":"git","directory":"packages/project"},"_npmVersion":"lerna/4.5.1/node@v23.11.0+arm64 (darwin)","description":"Projection functions","directories":{},"_nodeVersion":"23.11.0","dependencies":{"proj4":"^2.19.0","@allmaps/stdlib":"^1.0.0-beta.35","@allmaps/transform":"^1.0.0-beta.46"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.3.6","mocha":"^10.8.2","eslint":"^8.56.0","prettier":"^3.4.2","remark-api":"^1.1.0","remark-cli":"^12.0.1","typescript":"^5.7.0","@types/eslint":"^8.56.0","@allmaps/types":"^1.0.0-beta.19","@allmaps/annotation":"^1.0.0-beta.34","eslint-config-prettier":"^9.1.0","chai-shallow-deep-equal":"^1.4.6","@typescript-eslint/parser":"^7.0.0","@typescript-eslint/eslint-plugin":"^7.0.0"},"_npmOperationalInternal":{"tmp":"tmp/project_1.0.0-beta.3_1751899549139_0.4550470051954567","host":"s3://npm-registry-packages-npm-production"}},"1.0.0-beta.4":{"name":"@allmaps/project","version":"1.0.0-beta.4","keywords":["projection","georeference","map"],"license":"MIT","_id":"@allmaps/project@1.0.0-beta.4","maintainers":[{"name":"bertspaan","email":"hello@bertspaan.nl"}],"contributors":[{"url":"https://manuelclaeysbouuaert.be","name":"Manuel Claeys Bouuaert","email":"manuel.claeys.b@gmail.com"},{"url":"https://bertspaan.nl","name":"Bert Spaan","email":"hello@bertspaan.nl"}],"homepage":"https://allmaps.org","dist":{"shasum":"96a8a3b5c136266a7e2f28955581ef004aaec94b","tarball":"https://registry.npmjs.org/@allmaps/project/-/project-1.0.0-beta.4.tgz","fileCount":11,"integrity":"sha512-3sHXMfpVs7XN5DhLXirSHvUquEDPWJ/yl7L7GyuwUUG0zwsfKmA8pAAQoxpukVLg3ipeKaLKhiEaaPMlolyrOw==","signatures":[{"sig":"MEUCIFMoRHWZr63pdzold5XNSH37rp0ekf/WleWbHM2bBYeGAiEAmuiKuK61sKCgvwqHyhkaieDo6v5BbobtlwFEx1hBIwo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":50343},"type":"module","exports":"./dist/index.js","gitHead":"6b93e4d938c15ef1ea0e6ba15dc6585c80f6687b","scripts":{"lint":"prettier --check src test && eslint src test --ext .js,.ts","test":"NODE_ENV=test mocha","bench":"node bench/index.js","build":"tsc","types":"tsc --noEmit","watch":"tsc --watch","format":"prettier --write src test","documentation":"remark . --output --use remark-api"},"_npmUser":{"name":"bertspaan","actor":{"name":"bertspaan","type":"user","email":"hello@bertspaan.nl"},"email":"hello@bertspaan.nl"},"repository":{"url":"https://github.com/allmaps/allmaps.git","type":"git","directory":"packages/project"},"_npmVersion":"lerna/4.5.1/node@v23.11.0+arm64 (darwin)","description":"Projection functions","directories":{},"_nodeVersion":"23.11.0","dependencies":{"proj4":"^2.19.0","@allmaps/stdlib":"^1.0.0-beta.36","@allmaps/transform":"^1.0.0-beta.47"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.3.6","mocha":"^10.8.2","eslint":"^8.56.0","prettier":"^3.4.2","remark-api":"^1.1.0","remark-cli":"^12.0.1","typescript":"^5.7.0","@types/eslint":"^8.56.0","@allmaps/types":"^1.0.0-beta.20","@allmaps/annotation":"^1.0.0-beta.35","eslint-config-prettier":"^9.1.0","chai-shallow-deep-equal":"^1.4.6","@typescript-eslint/parser":"^7.0.0","@typescript-eslint/eslint-plugin":"^7.0.0"},"_npmOperationalInternal":{"tmp":"tmp/project_1.0.0-beta.4_1752089466918_0.2157355926283313","host":"s3://npm-registry-packages-npm-production"}},"1.0.0-beta.5":{"name":"@allmaps/project","version":"1.0.0-beta.5","keywords":["projection","georeference","map"],"license":"MIT","_id":"@allmaps/project@1.0.0-beta.5","maintainers":[{"name":"bertspaan","email":"hello@bertspaan.nl"}],"contributors":[{"url":"https://manuelclaeysbouuaert.be","name":"Manuel Claeys Bouuaert","email":"manuel.claeys.b@gmail.com"},{"url":"https://bertspaan.nl","name":"Bert Spaan","email":"hello@bertspaan.nl"}],"homepage":"https://allmaps.org","dist":{"shasum":"f336ad6454b9eba7d673f6169f2ffb17565f1bbb","tarball":"https://registry.npmjs.org/@allmaps/project/-/project-1.0.0-beta.5.tgz","fileCount":11,"integrity":"sha512-DohWTyrkWkaPY0RNt5apBXyBPeCwUL3q1HB81PGP3iFLeNlNWxwG4DuL3q3104bUbvm5MB9eTb5yqwy9lOMrvg==","signatures":[{"sig":"MEYCIQD0Zy742T3WYYStaMxwbZQQE+Y9zES+ReW8naeKvSsN2QIhAK9lBw5k/4pyKcpWXr4n6RQf9qNETd0veE6riM6Ikbvw","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":50343},"type":"module","exports":"./dist/index.js","gitHead":"d7e8b2ee5a5496bffb70cfcd1143cfabce4d5760","scripts":{"lint":"prettier --check src test && eslint src test --ext .js,.ts","test":"NODE_ENV=test mocha","bench":"node bench/index.js","build":"tsc","types":"tsc --noEmit","watch":"tsc --watch","format":"prettier --write src test","documentation":"remark . --output --use remark-api"},"_npmUser":{"name":"bertspaan","email":"hello@bertspaan.nl"},"repository":{"url":"https://github.com/allmaps/allmaps.git","type":"git","directory":"packages/project"},"_npmVersion":"lerna/4.5.1/node@v23.11.0+arm64 (darwin)","description":"Projection functions","directories":{},"_nodeVersion":"23.11.0","dependencies":{"proj4":"^2.19.0","@allmaps/stdlib":"^1.0.0-beta.37","@allmaps/transform":"^1.0.0-beta.48"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.3.6","mocha":"^10.8.2","eslint":"^8.56.0","prettier":"^3.4.2","remark-api":"^1.1.0","remark-cli":"^12.0.1","typescript":"^5.7.0","@types/eslint":"^8.56.0","@allmaps/types":"^1.0.0-beta.20","@allmaps/annotation":"^1.0.0-beta.35","eslint-config-prettier":"^9.1.0","chai-shallow-deep-equal":"^1.4.6","@typescript-eslint/parser":"^7.0.0","@typescript-eslint/eslint-plugin":"^7.0.0"},"_npmOperationalInternal":{"tmp":"tmp/project_1.0.0-beta.5_1752946886921_0.7122178178373335","host":"s3://npm-registry-packages-npm-production"}},"1.0.0-beta.6":{"name":"@allmaps/project","version":"1.0.0-beta.6","keywords":["projection","georeference","map"],"license":"MIT","_id":"@allmaps/project@1.0.0-beta.6","maintainers":[{"name":"bertspaan","email":"hello@bertspaan.nl"}],"contributors":[{"url":"https://manuelclaeysbouuaert.be","name":"Manuel Claeys Bouuaert","email":"manuel.claeys.b@gmail.com"},{"url":"https://bertspaan.nl","name":"Bert Spaan","email":"hello@bertspaan.nl"}],"homepage":"https://allmaps.org","bugs":{"url":"https://github.com/allmaps/allmaps/issues"},"dist":{"shasum":"d7e98c599587f2ac47ad6adceeb400a4c452f3f3","tarball":"https://registry.npmjs.org/@allmaps/project/-/project-1.0.0-beta.6.tgz","fileCount":11,"integrity":"sha512-PuNjKL2m2j9UFe4HiHMUv/IiFu1aGgWmwd9kbBpO14HcTeUTKDt1Kn0uV3ixUErcdh3nyqoKiTGEFjXx7RLdJg==","signatures":[{"sig":"MEUCIQCctpD0/8JJcmY2EvCFuJFyjwk1qjGgfCGLbbA7PTBiHgIgFDsGQ6NqWgnbkLwTr9wit0lSMZ/df3XEZvqhHBprYoE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":56572},"type":"module","exports":"./dist/index.js","gitHead":"dfe8dc3b15ae53f3dec0627144a0778de3a51779","scripts":{"lint":"prettier --check src test && eslint src test --ext .js,.ts","test":"NODE_ENV=test vitest run","bench":"node bench/index.js","build":"tsc","types":"tsc --noEmit","watch":"tsc --watch","format":"prettier --write src test","documentation":"remark . --output --use remark-api"},"_npmUser":{"name":"bertspaan","email":"hello@bertspaan.nl"},"repository":{"url":"git+https://github.com/allmaps/allmaps.git","type":"git","directory":"packages/project"},"_npmVersion":"lerna/4.7.0/node@v24.10.0+arm64 (darwin)","description":"Projection functions","directories":{},"_nodeVersion":"24.10.0","dependencies":{"proj4":"^2.19.0","@allmaps/stdlib":"^1.0.0-beta.38","@allmaps/transform":"^1.0.0-beta.49"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.56.0","vitest":"^4.0.4","prettier":"^3.6.2","remark-api":"^1.1.0","remark-cli":"^12.0.1","typescript":"^5.7.0","@types/eslint":"^8.56.0","@allmaps/types":"^1.0.0-beta.21","@allmaps/annotation":"^1.0.0-beta.36","eslint-config-prettier":"^9.1.0","@typescript-eslint/parser":"^7.0.0","@typescript-eslint/eslint-plugin":"^7.0.0"},"_npmOperationalInternal":{"tmp":"tmp/project_1.0.0-beta.6_1762812025377_0.33734027142183787","host":"s3://npm-registry-packages-npm-production"}},"1.0.0-beta.7":{"name":"@allmaps/project","version":"1.0.0-beta.7","keywords":["projection","georeference","map"],"license":"MIT","_id":"@allmaps/project@1.0.0-beta.7","maintainers":[{"name":"bertspaan","email":"hello@bertspaan.nl"}],"contributors":[{"url":"https://manuelclaeysbouuaert.be","name":"Manuel Claeys Bouuaert","email":"manuel.claeys.b@gmail.com"},{"url":"https://bertspaan.nl","name":"Bert Spaan","email":"hello@bertspaan.nl"}],"homepage":"https://allmaps.org","bugs":{"url":"https://github.com/allmaps/allmaps/issues"},"dist":{"shasum":"16a64b012f37d18241c2be0a273637f1388c6dfc","tarball":"https://registry.npmjs.org/@allmaps/project/-/project-1.0.0-beta.7.tgz","fileCount":11,"integrity":"sha512-943HbutFKXHU8iXB8eSq4TQC6P64yzzgnvSFkYauI7QTp0EaInx+MduZdVvHKAMx3kQpk51+78bR9r6nrjgeRQ==","signatures":[{"sig":"MEYCIQCaQGiGZmWzttPY1l+w1UeyxPXNOazD9bDGyKsSwx5FQAIhAJtb41ELb2OftexueEHMoOi2bMT2Trb3UHbSd7OFV7bH","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":56625},"type":"module","exports":"./dist/index.js","gitHead":"814686e9c8e78777708c22dcd1efc4c81d968539","scripts":{"lint":"prettier --check src test && eslint src test --ext .js,.ts","test":"NODE_ENV=test vitest run","bench":"node bench/index.js","build":"tsc","types":"tsc --noEmit","watch":"tsc --watch","format":"prettier --write src test","documentation":"remark . --output --use remark-api"},"_npmUser":{"name":"bertspaan","email":"hello@bertspaan.nl"},"repository":{"url":"git+https://github.com/allmaps/allmaps.git","type":"git","directory":"packages/project"},"_npmVersion":"lerna/4.7.0/node@v24.10.0+arm64 (darwin)","description":"Projection functions","directories":{},"_nodeVersion":"24.10.0","dependencies":{"proj4":"^2.20.0","@allmaps/stdlib":"^1.0.0-beta.39","@allmaps/transform":"^1.0.0-beta.50"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.56.0","vitest":"^4.0.4","prettier":"^3.6.2","remark-api":"^1.1.0","remark-cli":"^12.0.1","typescript":"^5.7.0","@types/eslint":"^8.56.0","@allmaps/types":"^1.0.0-beta.22","@allmaps/annotation":"^1.0.0-beta.36","eslint-config-prettier":"^9.1.0","@typescript-eslint/parser":"^7.0.0","@typescript-eslint/eslint-plugin":"^7.0.0"},"_npmOperationalInternal":{"tmp":"tmp/project_1.0.0-beta.7_1764251094227_0.6896587945956609","host":"s3://npm-registry-packages-npm-production"}},"1.0.0-beta.8":{"name":"@allmaps/project","version":"1.0.0-beta.8","keywords":["projection","georeference","map"],"license":"MIT","_id":"@allmaps/project@1.0.0-beta.8","maintainers":[{"name":"bertspaan","email":"hello@bertspaan.nl"}],"contributors":[{"url":"https://manuelclaeysbouuaert.be","name":"Manuel Claeys Bouuaert","email":"manuel.claeys.b@gmail.com"},{"url":"https://bertspaan.nl","name":"Bert Spaan","email":"hello@bertspaan.nl"}],"homepage":"https://allmaps.org","bugs":{"url":"https://github.com/allmaps/allmaps/issues"},"dist":{"shasum":"9da372e0a4bdf126cf578eeaee759c9a91db9638","tarball":"https://registry.npmjs.org/@allmaps/project/-/project-1.0.0-beta.8.tgz","fileCount":11,"integrity":"sha512-NFz4C69HwFUPEitan2I0hm5lvKlk9xRDNdvnwbo7I/J06+vLMJWGFqKEkReBwC583BxroByeUTa732cG/UaadQ==","signatures":[{"sig":"MEUCIQDvo1llNHb9i1e4XtI782Bnllvc62L6QQ8xMmnRBCPWWQIgV8HalN9iJpk0zDxiMdahunBjfPfaiPGN3fEOR3dCXzE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":60698},"type":"module","exports":"./dist/index.js","gitHead":"5801dd5a129c88cb0aaea3f45e2e288f38565d46","scripts":{"lint":"prettier --check src test && eslint src test --ext .js,.ts","test":"NODE_ENV=test vitest run","bench":"node bench/index.js","build":"tsc","types":"tsc --noEmit","watch":"tsc --watch","format":"prettier --write src test","documentation":"remark . --output --use remark-api"},"_npmUser":{"name":"bertspaan","email":"hello@bertspaan.nl"},"repository":{"url":"git+https://github.com/allmaps/allmaps.git","type":"git","directory":"packages/project"},"_npmVersion":"lerna/4.9.4/node@v24.10.0+arm64 (darwin)","description":"Projection functions","directories":{},"_nodeVersion":"24.10.0","dependencies":{"proj4":"^2.20.0","@allmaps/stdlib":"^1.0.0-beta.40","@allmaps/transform":"^1.0.0-beta.51"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.56.0","vitest":"^4.0.4","prettier":"^3.6.2","remark-api":"^1.1.0","remark-cli":"^12.0.1","typescript":"^5.7.0","@types/eslint":"^8.56.0","@allmaps/types":"^1.0.0-beta.22","@allmaps/annotation":"^1.0.0-beta.36","eslint-config-prettier":"^9.1.0","@typescript-eslint/parser":"^7.0.0","@typescript-eslint/eslint-plugin":"^7.0.0"},"_npmOperationalInternal":{"tmp":"tmp/project_1.0.0-beta.8_1770665500529_0.6263269432790175","host":"s3://npm-registry-packages-npm-production"}},"1.0.0-beta.9":{"name":"@allmaps/project","version":"1.0.0-beta.9","contributors":[{"name":"Manuel Claeys Bouuaert","email":"manuel.claeys.b@gmail.com","url":"https://manuelclaeysbouuaert.be"},{"name":"Bert Spaan","email":"hello@bertspaan.nl","url":"https://bertspaan.nl"}],"description":"Projection functions","type":"module","exports":"./dist/index.js","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/allmaps/allmaps.git","directory":"packages/project"},"homepage":"https://allmaps.org","keywords":["projection","georeference","map"],"dependencies":{"@allmaps/stdlib":"^1.0.0-beta.41","@allmaps/transform":"^1.0.0-beta.52","proj4":"^2.20.0"},"devDependencies":{"@allmaps/annotation":"^1.0.0-beta.37","@allmaps/types":"^1.0.0-beta.23","@types/eslint":"^8.56.0","@typescript-eslint/eslint-plugin":"^7.0.0","@typescript-eslint/parser":"^7.0.0","eslint":"^8.56.0","eslint-config-prettier":"^9.1.0","prettier":"^3.6.2","remark-api":"^1.1.0","remark-cli":"^12.0.1","typescript":"^5.9.3","vitest":"^4.0.4"},"scripts":{"watch":"tsc --watch --noCheck","build":"tsc --noCheck","test":"NODE_ENV=test vitest run","lint":"prettier --ignore-path ../../.gitignore --check src test && eslint src test --ext .js,.ts","types":"tsc --noEmit","format":"prettier --ignore-path ../../.gitignore --write src test","documentation":"remark . --output --use remark-api","bench":"node bench/index.js"},"license":"MIT","gitHead":"0776371fa222f670b893d87b302c6334e825ac3e","_id":"@allmaps/project@1.0.0-beta.9","bugs":{"url":"https://github.com/allmaps/allmaps/issues"},"_nodeVersion":"25.8.0","_npmVersion":"lerna/4.9.4/node@v25.8.0+arm64 (darwin)","dist":{"integrity":"sha512-IVmlvLCMIOKsfGO10Ul1lXrssvJyKzOcAF/3+U2RZXVQMRIC4nfpOGrgWZGrY36YaJI+pih6rvgS77+S1+QYOw==","shasum":"76da3ef57556f7e7a4104819ed801628462eb1a8","tarball":"https://registry.npmjs.org/@allmaps/project/-/project-1.0.0-beta.9.tgz","fileCount":11,"unpackedSize":76352,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCACa5d+lOs3j28d/eYwT/yUJb/psjQlRkO6POT9PPw3QIgPs8NPIEe5tCL2g5OmKOZdJ3LZ1eQtCYpLy/ZIIEOzgE="}]},"_npmUser":{"name":"bertspaan","email":"hello@bertspaan.nl"},"directories":{},"maintainers":[{"name":"bertspaan","email":"hello@bertspaan.nl"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/project_1.0.0-beta.9_1780001975054_0.3015592296120766"},"_hasShrinkwrap":false}},"time":{"created":"2025-05-22T09:51:15.745Z","modified":"2026-05-28T20:59:35.326Z","1.0.0-beta.1":"2025-05-22T09:51:16.011Z","1.0.0-beta.2":"2025-05-22T11:54:08.174Z","1.0.0-beta.3":"2025-07-07T14:45:49.316Z","1.0.0-beta.4":"2025-07-09T19:31:07.123Z","1.0.0-beta.5":"2025-07-19T17:41:27.108Z","1.0.0-beta.6":"2025-11-10T22:00:25.556Z","1.0.0-beta.7":"2025-11-27T13:44:54.475Z","1.0.0-beta.8":"2026-02-09T19:31:40.715Z","1.0.0-beta.9":"2026-05-28T20:59:35.201Z"},"bugs":{"url":"https://github.com/allmaps/allmaps/issues"},"license":"MIT","homepage":"https://allmaps.org","keywords":["projection","georeference","map"],"repository":{"type":"git","url":"git+https://github.com/allmaps/allmaps.git","directory":"packages/project"},"description":"Projection functions","contributors":[{"name":"Manuel Claeys Bouuaert","email":"manuel.claeys.b@gmail.com","url":"https://manuelclaeysbouuaert.be"},{"name":"Bert Spaan","email":"hello@bertspaan.nl","url":"https://bertspaan.nl"}],"maintainers":[{"name":"bertspaan","email":"hello@bertspaan.nl"}],"readme":"# @allmaps/project\n\nThis module extends the GCP Transformer class from [@allmaps/transform](../../packages/transform/) with projection functions: the Projected GCP Transformer class and its methods can **transform *and project* Points, LineStrings, Polygons** and other spatial features from image 'resource' space to a '*projected* geo' space.\n\nProjections are handled by the [Proj4js](https://github.com/proj4js/proj4js) library. This package this supports any projection (or more generally, coordinate reference system or CRS) supported by Proj4js.\n\nWithin the Allmaps project, this module is used a.o. in [@allmaps/render](../../packages/render/) and [@allmaps/tileserver](../../apps/tileserver/), two places where we transform a IIIF image from the 'resource' space of the image to the 'projected geospatial' space of a map projection (in most cases WebMercator), using the Ground Control Points and transformation type defined in the map's Georeference Annotation.\n\n## How it works\n\nThis package exports the `ProjectedGcpTransformer` class, which extends the `GcpTransformer` class from [@allmaps/transform](../../packages/transform/).\n\nLike instances of the `GcpTransformer` class, instances of the `ProjectedGcpTransformer` class are constructed from **a set of Control Points**, who's coordinates are known in both spaces (and who's geo coordinates are given in lon-lat `EPSG:4326` projection), and a specific **type of transformation** algorithm. Additionally, an internal projection and projection can be defined, in order to transform not from 'resource' to 'geo' space, but from 'resource' to 'projected geo' space of the viewport, optionally passing through an 'internal projected geo' space of the map. This is achieved using the `toProjectedGeo()` and `toResource()` methods (or `toGeo()` to obtain points in `EPSG:4326` projection).\n\nThe **projection** defines the 'projected geo' space of the viewport. Since we will render our geometries in the projected space of our viewport, it is logical to make the transformer aware of this space by supplying its projection, so it can bring the results to this space. It defaults to WebMercator `EPSG:3857`, the projection used by default in most webmaps.\n\nThe **internal projection** defines the 'internal projected geo' space. This is the space of the known or supposed projection in which the map was made. When we know this projection, it is important, e.g. when transforming `toGeo`, to build a `toGeoTransfromation` between the 'resource' space of the image and the 'internal projected geo' space of this known or supposed projection. This way we make the transformation account *only* for the warping of the image onto its intended projection space, and not for any other warping due to the choice of viewport projection (which could be different than the map projection). To bring the results from the 'internal projected geo' space of the map to the 'projected geo' space of the viewport, a projection function from 'internal projected geo' to 'projected geo' space is set as the `postToGeo` option (that is part of the GCP Transform options), and executed at the end of the transformer's `toProjectedGeo()` method. Similarly when calling the `toResource()` method a `preToResource()` is executed to go from 'projected geo' space to 'internal projected geo' space, before evaluating the `toResourceTransformation` and arriving in 'resource' space. The 'internal projected geo' space also defaults to WebMercator `EPSG:3857` (due to its 'conformal' properties that make it a good general guess for a map's projection at large scales). When the internal projection and projection are identical (as is the default) the `postToGeo()` function is an identity projection with no effect.\n\nThe GCPs must be provided in lon-lat `EPSG:4326` projection (since this is the default projection used by GeoJSON and Georeference Annotations) and are projected to the 'projected geo' space before building the GCP Transformer (who will project them to the 'internal projected geo' space).\n\n## Installation\n\nThis is an ESM-only module that works in browsers and in Node.js.\n\nInstall with pnpm:\n\n```sh\npnpm install @allmaps/project\n```\n\n## Usage\n\n### Quickstart\n\nSimilar to GCP Transformers, when starting from an **Annotation** or **Georeferenced Map**, the fastest way to build a Projected GCP Transformer is:\n\n```js\nimport { parseAnnotation } from '@allmaps/annotation'\nimport { ProjectedGcpTransformer } from '@allmaps/project'\n\n// Fetch an annotation\nconst annotation = await fetch(annoationUrl).then((response) => response.json())\n\n// Create a georeferencedMap from the annotation\nconst georeferencedMaps = parseAnnotation(annotation)\nconst georeferencedMap = georeferencedMaps[0]\n\n// Build Projected GCP Transformer\nconst projectedTransformer =\n  ProjectedGcpTransformer.fromGeoreferencedMap(georeferencedMap)\n\n// Use it to transform geometries, as below. E.g.:\nconst projectedGeoPoint = projectedTransformer.transformToProjectedGeo(resourcePoint)\n```\n\nThis is equivalent to constructing a projected transformer from the Annotation's or Georeferenced Map's GCPs, transformation type and projection, as in the examples below.\n\nThis projected transformer can then be used to transform geometries between 'resource' space and 'projected geo' space.\n\nWhen **rendering** maps, another way to quickly obtain a projected transformer is to access it directly from a **Warped Map** in the renderer's Warped Map List:\n\n```js\n// Create a renderer from your canvas\nconst renderer = new WebGL2Renderer(gl)\n// Fetch and parse annotations, add them to the renderer ...\n\n// There are multiple ways to access the renderer's Warped Map List's Warped Maps, e.g.:\nconst warpedMap = renderer.warpedMapList.getWarpedMap(mapId)\n\n// Access the Projected GCP Transformer, in the Warped Map's current transformation type\nconst projectedTransformer = warpedMap.projectedTransformer\n// Or select or create the Projected GCP Transformer of a different transformation type\nconst projectedHelmertTransformer = warpedMap.getProjectedTransformer('helmert')\n```\n\n### Using a transformer with the default WebMercator `EPSG:3857` projections\n\nIn this example we create a projected transformer with a Thin Plate Spline transformation and the default internal projection and projection: WebMercator `EPSG:3857`.\n\nThis projected transformer thus gives WebMercator `EPSG:3857` coordinates when transforming forward.\n\n```js\nimport { ProjectedGcpTransformer } from '@allmaps/project'\n\nconst gcps6 = [\n  {\n    resource: [1344, 4098],\n    geo: [4.4091165, 51.9017125]\n  },\n  {\n    resource: [4440, 3441],\n    geo: [4.5029222, 51.9164451]\n  },\n  {\n    resource: [3549, 4403],\n    geo: [4.4764224, 51.897309]\n  },\n  {\n    resource: [1794, 2130],\n    geo: [4.4199066, 51.9391509]\n  },\n  {\n    resource: [3656, 2558],\n    geo: [4.4775683, 51.9324358]\n  },\n  {\n    resource: [2656, 3558],\n    geo: [4.4572643, 51.9143043]\n  }\n]\n\nconst options = {\n  minOffsetRatio: 0.001,\n  maxDepth: 1\n}\n\nconst projectedTransformer = new ProjectedGcpTransformer(\n  gcps6,\n  'thinPlateSpline',\n  options\n)\n\nconst resourceLineString = [\n  [3655, 2212],\n  [2325, 3134],\n  [3972, 325],\n  [3451, 2876],\n  [2067, 920],\n  [622, 941]\n]\n\nconst projectedGeoLineString =\n  projectedTransformer.transformToProjectedGeo(resourceLineString)\n// projectedGeoLineString = [\n//   [498246.8195647142, 6789061.316027705],\n//   [496595.9732655353, 6787546.801212325],\n//   [494783.7898554361, 6785995.114473057],\n//   [496391.8586632488, 6790623.562354985],\n//   [498497.64212101337, 6795403.988950945],\n//   [498135.8154413349, 6791100.393518668],\n//   [498076.9264938777, 6786883.571136022],\n//   [495239.5461210053, 6790036.9871731205],\n//   [492300.2095900435, 6793167.011607833],\n//   [489770.9992948517, 6793018.672759057],\n//   [487201.94796965295, 6792860.379165613]\n// ]\n```\n\nNotice how this returns a lineString in WebMercator coordinates.\n\n### Using a transformer with a specific internal projection\n\nIn this example we create a projected transformer with a Thin Plate Spline transformation, the internal projection set to 'BD72 / Belgian Lambert 72' `EPSG:31370` and the projection set to the WebMercator `EPSG:3857`.\n\n```js\nimport { ProjectedGcpTransformer } from '@allmaps/project'\n\nconst gcps6 = ... // See above\n\nconst epsg31370 =\n  '+proj=lcc +lat_0=90 +lon_0=4.36748666666667 +lat_1=51.1666672333333 +lat_2=49.8333339 +x_0=150000.013 +y_0=5400088.438 +ellps=intl +towgs84=-106.8686,52.2978,-103.7239,0.3366,-0.457,1.8422,-1.2747 +units=m +no_defs +type=crs'\n\nconst options = {\n  minOffsetRatio: 0.001,\n  maxDepth: 1,\n  internalProjection: epsg31370\n}\n\nconst projectedTransformer = new ProjectedGcpTransformer(gcps6, 'thinPlateSpline', options)\n\nconst resourceLineString = [\n  [3655, 2212],\n  [2325, 3134],\n  [3972, 325],\n  [3451, 2876],\n  [2067, 920],\n  [622, 941]\n]\n\nconst projectedGeoLineString = projectedTransformer.transformToProjectedGeo(resourceLineString)\n// const projectedGeoLineString = [\n//   [498247.196090505, 6789061.7676701555],\n//   [496596.0857961293, 6787546.818863111],\n//   [494783.8626652385, 6785995.157771795],\n//   [496392.4627162781, 6790624.950878147],\n//   [498501.57678734255, 6795410.032138047],\n//   [498137.15972611686, 6791102.130838948],\n//   [498076.85849569837, 6786883.389086489],\n//   [495239.9136289843, 6790037.973029668],\n//   [492298.9972965987, 6793169.702451241],\n//   [489767.88734149706, 6793019.906716891],\n//   [487196.5540720398, 6792859.377809678]\n// ]\n```\n\nNotice how this return a lineString in WebMercator coordinates with different points than previously, since its transformation used another internal projection before projecting the result to WebMercator.\n\n### Using a transformer with a specific internal projection and projection\n\nLikewise, it's possible to specify both the internal projection and projection.\n\nIn this example we create a projected transformer with a Thin Plate Spline transformation from the 'resource' space to the 'internal projected' space in the `EPSG:31370` projection, and bring the results to the (default) 'projected geo' space in the 'Amersfoort / RD' New `EPSG:28992` projection.\n\n```js\nimport { ProjectedGcpTransformer } from '@allmaps/project'\n\nconst gcps6 = ... // See above\n\nconst epsg31370 = ... // See above\nconst epsg28992 = \"+proj=sterea +lat_0=52.1561605555556 +lon_0=5.38763888888889 +k=0.9999079 +x_0=155000 +y_0=463000 +ellps=bessel +towgs84=565.4171,50.3319,465.5524,1.9342,-1.6677,9.1019,4.0725 +units=m +no_defs +type=crs\"\n\nconst options = {\n  minOffsetRatio: 0.001,\n  maxDepth: 1,\n  internalProjection: epsg31370,\n  projection: epsg28992\n}\n\nconst projectedTransformer = new ProjectedGcpTransformer(gcps6, 'thinPlateSpline', options)\n\nconst resourceLineString = [\n  [3655, 2212],\n  [2325, 3134],\n  [3972, 325],\n  [3451, 2876],\n  [2067, 920],\n  [622, 941]\n]\n\nconst projectedGeoLineString = projectedTransformer.transformToProjectedGeo(resourceLineString)\n// const projectedGeoLineString = [\n//   [92171.96319801327, 439250.7392195241],\n//   [91140.1318550074, 438330.2059945731],\n//   [90008.06902330121, 437388.3781427277],\n//   [91038.64166624477, 440228.31014306704],\n//   [92378.19922071013, 443158.54244443506],\n//   [92119.83597131, 440508.5490631829],\n//   [92049.81893950628, 437909.7404415105],\n//   [90322.16486404435, 439875.89373726887],\n//   [88531.49536626287, 441828.6782593381],\n//   [86967.57638718556, 441757.502798549],\n//   [85378.67808803722, 441680.55210508476]\n// ]\n```\n\nNotice how this returns a lineString in WebMercator coordinates with the same points as previously but projected to EPSG:28992\n\n### Transforming to a different projection\n\nSince `projection` is a *transform* option, it can be set on every transform method call. This allows us to change the requested projection from the one specified during a projected transformer creation to *any* projection. Thus, we don't need to create a projected transformer for every projection of interest: we can reuse a transformer and its toGeo and/or toResource transformations (who's computation can be expensive when there are many GCPs).\n\nWe can request the result of a 'toGeo' transform using the projected transformer above as follows:\n\n```js\n// Same projectedTransformer as above:\n// internalProjection: epsg31370,\n// projection: epsg28992\n\nconst projectedGeoLineString = projectedTransformer.transformToProjectedGeo(\n  resourceLineString,\n  { projection: { definition: 'EPSG:3857' } }\n)\n// const projectedGeoLineString = [\n//   [ 498247.1996476347, 6789061.760253225 ],\n//   [ 496596.08934986574, 6787546.81144527 ],\n//   [ 494783.8662153203, 6785995.150353045 ],\n//   [ 496392.4662716557, 6790624.943463034 ],\n//   [ 498501.58034885704, 6795410.0247265855 ],\n//   [ 498137.16328437213, 6791102.123423815 ],\n//   [ 498076.8620512022, 6786883.381667706 ],\n//   [ 495239.91718228994, 6790037.965614326 ],\n//   [ 492299.00084753655, 6793169.695039346 ],\n//   [ 489767.8908886019, 6793019.899305481 ],\n//   [ 487196.5576152448, 6792859.370398756 ]\n// ]\n```\n\nNotice how this returns a result very close to the earlier result for projectedTransformer with internalProjection `EPSG:31370` and default projection WebMercator `EPSG:3857`.\n\nTo change a projected transformer's projection in the *transformer* options (such that it will always be used by default), use the `setProjection()` method.\n\nPassing a projection in a transform call, as above, has been implemented as passing a `postToGeo` function that projects from the transformer's internal projection to the requested projection.\n\nNote: there is no equivalent option for the internal projection.\n\n## Creating and using a projected transformer\n\nSince the Projected GCP Transformer class extends the GCP Transformer class, a lot of its usage is similar. (See the [@allmaps/transform](../../packages/transform/) package for more information on the items below).\n\nWhen creating an instance from the Projected GCP Transformer class:\n\n* The **GCPs** are specified using the `Gcp` type and with geo component in lon-lat 'EPSG:4326'.\n* The same **transformation types** are supported: `polynomial`, `thinPlateSpline`, ...\n* Two **extra options** can be set: `projection` specifies the projected geo space (defaults to WebMercator `EPSG:3857`), and `intenalProjection` specifies the projected using when computing the transformation (also defaults to WebMercator `EPSG:3857`). As with a GCP Transformer, the `differentHandedness` is true by default.\n\nWhen using its main methods:\n\n* The method `transformToProjectedGeo()` transforms input geometries from 'resource' space to 'projected geo' space, as the method `transformToResource()` transforms input geometries from 'projected geo' space to 'resource' space.\n* An additional method `transformToGeo()` transforms input geometries from 'resource' space to 'geo' in lon-lat 'EPSG:4326'.\n* Inputs are following the Allmaps Geometries types. To handle GeoJSON Geometries or SVG Geometries, convert to and from these geometry types using the functions available in [@allmaps/stdlib](../../packages/stdlib/).\n* **GCP Transform options** can be specified and manage a.o. how geometries are refined and which distortions are computed. The projection functions are now considered when refining geometries and recursively adding midpoints.\n* A **'return type function'** can be used to extract distortion information or modify the results.\n\nFor faster transformation between SVG Geometries and GeoJSON Geometries, the same shortcut static methods are available for GcpTransformers: `transformSvgToGeojson()`, `transformSvgStringToGeojsonFeatureCollection()`, `transformGeojsonToSvg()`, `transformGeojsonFeatureCollectionToSvgString()`.\n\nNote: Distortions only describe the warping of the transformation, from 'resource' space to 'internal projected geo' space. (Describing the warping up until 'projected geo' space would require applying the chain rule and having access to the partial derivatives of the projection functions.)\n\n### Projected GCP Transformer options\n\nAn extra 'transformer option' is available for Projected GCP Transformers:\n\n| Option               | Description                                                      | Type         | Default                 |\n| :------------------- | :--------------------------------------------------------------- | :----------- | :---------------------- |\n| `internalProjection` | The geographic projection used internally in the transformation. | `Projection` | WebMercator `EPSG:3857` |\n\nSince the internal projection defines the internal projected space to and from which the transformations have been computed, transform calls can't specify a different internal projection.\n\n### Projected GCP Transform options\n\nAn extra 'transform option' is available for Projected GCP Transformers:\n\n| Option       | Description                                         | Type         | Default                 |\n| :----------- | :-------------------------------------------------- | :----------- | :---------------------- |\n| `projection` | The geographic projection rendered in the viewport. | `Projection` | WebMercator `EPSG:3857` |\n\nAs with a GCP Transformer, passing this transform option during the transformer's construction here it the default when using the transform methods.\n\nLike other GCP *Transform* options, this option can be set when constructing a transformer *and* when transform geometries. This can be useful, since it allows us to reusing the toGeo and/or toResource transformations of a transformer (which can be expensive to compute for when there are many GCPs) to transform to a new projection. (See example above.)\n\n## Typing\n\nProjections are defined as follows:\n\n```ts\nexport type Projection = {\n  name?: string\n  definition: string | proj4.PROJJSONDefinition\n}\n```\n\nProjection definitions can be anything compatible with [Proj4js](https://github.com/proj4js/proj4js), e.g.\none of the two default named projections `'EPSG:3857'` `'EPSG:4326'`, a proj4-string `'+proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defs +type=crs'`, a WKT-string or (since Proj4js version 2.19) a [PROJJSON](https://proj.org/en/stable/specifications/projjson.html) definition.\n\n## Benchmark\n\nHere are some benchmarks on building and using a transformer, as computed on a 2023 MacBook Air M2 with 16 GB RAM.\n\nThis benchmark can be run with `pnpm run bench`. For more information, see [`./bench/index.js`](`./bench/index.js`).\n\nTo create a projected transformer (with 10 points) and compute its 'toGeo' transformation:\n\n| Type            | Ops/s |\n| --------------- | ----- |\n| helmert         | 31178 |\n| polynomial1     | 39583 |\n| polynomial2     | 31907 |\n| polynomial3     | 20137 |\n| thinPlateSpline | 17325 |\n| projective      | 20322 |\n\nTo use a projected transformer (with 10 points, and its 'toGeo' transformation already computed) and transform a point 'toGeo':\n\n| Type            | Ops/s   |\n| --------------- | ------- |\n| helmert         | 3906562 |\n| polynomial1     | 3595760 |\n| polynomial2     | 3568346 |\n| polynomial3     | 2087742 |\n| thinPlateSpline | 1759935 |\n| projective      | 3621210 |\n\n## License\n\nMIT\n\n## API\n\n### `InternalProjectionInputs`\n\n###### Fields\n\n* `internalProjection?` (`{id?: string; name?: string; definition: ProjectionDefinition}`)\n\n### `ProjectedGcpTransformOptions`\n\n###### Type\n\n```ts\nProjectionInputs & {\n  maxDepth: number\n  minSourceDistance: number\n  minDestinationDistance: number\n  minOffsetRatio: number\n  minOffsetDistance: number\n  distortionMeasures: DistortionMeasure[]\n  referenceScale: number\n  postToGeo: ProjectionFunction\n  preToResource: ProjectionFunction\n} & MultiGeometryOptions\n```\n\n### `new ProjectedGcpTransformer(gcps, type, partialProjectedGcpTransformerOptions)`\n\nCreate a ProjectedGcpTransformer\n\n###### Parameters\n\n* `gcps` (`Array<Gcp>`)\n  * An array of Ground Control Points (GCPs) in lon-lat 'EPSG:4326'\n* `type` (`TransformationType | undefined`)\n  * The transformation type\n* `partialProjectedGcpTransformerOptions?` (`Partial<ProjectedGcpTransformerOptions> | undefined`)\n  * Projected GCP Transformer options\n\n###### Returns\n\n`ProjectedGcpTransformer`.\n\n###### Extends\n\n* `GcpTransformer`\n\n### `ProjectedGcpTransformer#gcps`\n\nGet GCPs as they were inputed to the GCP Transformer (`Array<Gcp>`).\n\nFor a Projected GCP Transformer, these are the GCPs in projected coordinates.\n\n### `ProjectedGcpTransformer#getToGeoTransformationResolution(resourceBbox, partialProjectedGcpTransformOptions)`\n\nGet the resolution of the toGeo transformation in resource space, within a given bbox.\n\nThis informs you in how fine the warping is, in resource space.\nIt can be useful e.g. to create a triangulation in resource space\nthat is fine enough for this warping or set the minSourceDistance options.\n\nIt is obtained by transforming toGeo two linestring,\nnamely the horizontal and vertical midlines of the given bbox.\nThe toGeo transformation will refine these lines:\nit will break them in small enough pieces to obtain a near continuous result.\n\nResolution returned in the length of the shortest piece, measured in resource coordinates,\nor undefined if no refinements were needed.\n\n###### Parameters\n\n* `resourceBbox?` (`Bbox | undefined`)\n  * BBox in resource space where the resolution is requested, or undefined to get this from the GCPs\n* `partialProjectedGcpTransformOptions?` (`Partial<ProjectedGcpTransformOptions> | undefined`)\n\n###### Returns\n\nResolution of the toGeo transformation in resource space (`number | undefined`).\n\n### `ProjectedGcpTransformer#getToProjectedGeoTransformationResolution(resourceBbox, partialProjectedGcpTransformOptions)`\n\nGet the resolution of the toProjectedGeo transformation in resource space, within a given bbox.\n\nThis informs you in how fine the warping is, in resource space.\nIt can be useful e.g. to create a triangulation in resource space\nthat is fine enough for this warping or set the minSourceDistance options.\n\nIt is obtained by transforming toProjectedGeo two linestring,\nnamely the horizontal and vertical midlines of the given bbox.\nThe toProjectedGeo transformation will refine these lines:\nit will break them in small enough pieces to obtain a near continuous result.\n\nResolution returned in the length of the shortest piece, measured in resource coordinates,\nor undefined if no refinements were needed.\n\n###### Parameters\n\n* `resourceBbox?` (`Bbox | undefined`)\n  * BBox in resource space where the resolution is requested, or undefined to get this from the GCPs\n* `partialProjectedGcpTransformOptions?` (`Partial<ProjectedGcpTransformOptions> | undefined`)\n\n###### Returns\n\nResolution of the toProjectedGeo transformation in resource space (`number | undefined`).\n\n### `ProjectedGcpTransformer#getToResourceTransformationResolution(projectedGeoBbox, partialProjectedGcpTransformOptions)`\n\nGet the resolution of the toResource transformation in projected geo space, within a given bbox.\n\nThis informs you in how fine the warping is, in projected geo space.\nIt can be useful e.g. to create a triangulation in projected geo space\nthat is fine enough for this warping or set the minDestionationDistance options.\n\nIt is obtained by transforming toResource two linestring,\nnamely the horizontal and vertical midlines of the given bbox.\nThe toResource transformation will refine these lines:\nit will break them in small enough pieces to obtain a near continuous result.\n\nResolution returned in the length of the shortest piece, measured in internal projected geo coordinates,\nor undefined if no refinements were needed.\n\n###### Parameters\n\n* `projectedGeoBbox?` (`Bbox | undefined`)\n  * BBox in projected geo space where the resolution is requested, or undefined to get this from the GCPs\n* `partialProjectedGcpTransformOptions?` (`Partial<ProjectedGcpTransformOptions> | undefined`)\n\n###### Returns\n\nResolution of the toResource transformation in internal projected geo space (`number | undefined`).\n\n### `ProjectedGcpTransformer#interalProjectedGcps`\n\nGet GCPs in interal projected coordinates (`Array<Gcp>`).\n\n### `ProjectedGcpTransformer#internalProjection`\n\n###### Type\n\n```ts\n{id?: string; name?: string; definition: ProjectionDefinition}\n```\n\n### `ProjectedGcpTransformer#internalProjectionToProjection`\n\n###### Type\n\n```ts\n(point: Point) => Point\n```\n\n### `ProjectedGcpTransformer#isNonWarping()`\n\n###### Parameters\n\nThere are no parameters.\n\n###### Returns\n\n`boolean`.\n\n### `ProjectedGcpTransformer#lonLatToProjection`\n\n###### Type\n\n```ts\n(point: Point) => Point\n```\n\n### `ProjectedGcpTransformer#lonlatGcps`\n\nGet GCPs in interal projected coordinates (`Array<Gcp>`).\n\n### `ProjectedGcpTransformer#projectedGcps`\n\nGet GCPs in projected coordinates (`Array<Gcp>`).\n\n### `ProjectedGcpTransformer#projection`\n\n###### Type\n\n```ts\n{id?: string; name?: string; definition: ProjectionDefinition}\n```\n\n### `ProjectedGcpTransformer#projectionToInternalProjection`\n\n###### Type\n\n```ts\n(point: Point) => Point\n```\n\n### `ProjectedGcpTransformer#projectionToLonLat`\n\n###### Type\n\n```ts\n(point: Point) => Point\n```\n\n### `ProjectedGcpTransformer#transformToGeo(resourcePoint, partialGcpTransformOptions, gcpToP)`\n\n###### Parameters\n\n* `resourcePoint` (`[number, number]`)\n* `partialGcpTransformOptions?` (`Partial<ProjectedGcpTransformOptions> | undefined`)\n* `gcpToP?` (`((gcp: GcpAndDistortions) => P) | undefined`)\n\n###### Returns\n\n`P`.\n\n### `ProjectedGcpTransformer#transformToProjectedGeo(resourcePoint, partialGcpTransformOptions, gcpToP)`\n\n###### Parameters\n\n* `resourcePoint` (`[number, number]`)\n* `partialGcpTransformOptions?` (`Partial<ProjectedGcpTransformOptions> | undefined`)\n* `gcpToP?` (`((gcp: GcpAndDistortions) => P) | undefined`)\n\n###### Returns\n\n`P`.\n\n### `ProjectedGcpTransformer#transformToResource(projectedGeoPoint, partialGcpTransformOptions, gcpToP)`\n\n###### Parameters\n\n* `projectedGeoPoint` (`[number, number]`)\n* `partialGcpTransformOptions?` (`Partial<ProjectedGcpTransformOptions> | undefined`)\n* `gcpToP?` (`((gcp: GcpAndDistortions) => P) | undefined`)\n\n###### Returns\n\n`P`.\n\n### `ProjectedGcpTransformer.fromGeoreferencedMap(georeferencedMap, options)`\n\nCreate a Projected GCP Transformer from a Georeferenced Map\n\n###### Parameters\n\n* `georeferencedMap` (`{ type: \"GeoreferencedMap\"; resource: { id: string; type: \"ImageService1\" | \"ImageService2\" | \"ImageService3\" | \"Canvas\"; height?: number | undefined; width?: number | undefined; partOf?: Array<PartOfItemType> | undefined; provider?: Array<{ ...; }> | undefined; }; ... 8 more ...; _allmaps?: unknown; }`)\n  * A Georeferenced Map\n* `options?` (`Partial<{ internalProjection: Projection; projection: Projection; } & { differentHandedness: boolean; } & { maxDepth: number; minSourceDistance: number; minDestinationDistance: number; ... 5 more ...; preToResource: ProjectionFunction; } & MultiGeometryOptions & TransformationTypeInputs> | undefined`)\n  * Options, including Projected GCP Transformer Options, and a transformation type to overrule the type defined in the Georeferenced Map\n\n###### Returns\n\nA Projected GCP Transformer (`ProjectedGcpTransformer`).\n\n### `ProjectedGcpTransformer.setProjection(projectedTransformer, projection)`\n\nSet the projection.\n\nTo transform 'toGeo' or 'toResource' to or from a different projection\nthan set on a transformer's construction (but using the same internal projection)\nit's possible to specify the requested projection in the transform options.\n\nThis way we circumvent a possibly expensive recomputation\nof the toGeo and/or toResource transformations.\n\nTo do this more systematically, it's possible to set\na projected gcp transformer's projection using this method.\n\nCombine this with a deep clone of the transformer instance\nto keep the original transformer as well.\n\n###### Parameters\n\n* `projectedTransformer` (`ProjectedGcpTransformer`)\n* `projection` (`{id?: string; name?: string; definition: ProjectionDefinition}`)\n\n###### Returns\n\nthis (`ProjectedGcpTransformer`).\n\n### `ProjectedGcpTransformerInputs`\n\n###### Type\n\n```ts\nGcpsInputs &\n  TransformationTypeInputs &\n  InternalProjectionInputs &\n  ProjectionInputs\n```\n\n### `ProjectedGcpTransformerOptions`\n\n###### Type\n\n```ts\n{ internalProjection: Projection; projection: Projection; } & { differentHandedness: boolean; } & { maxDepth: number; minSourceDistance: number; minDestinationDistance: number; ... 5 more ...; preToResource: ProjectionFunction; } & MultiGeometryOptions\n```\n\n### `Projection`\n\n###### Fields\n\n* `definition` (`Definition`)\n* `id?` (`string`)\n* `name?` (`string`)\n\n### `ProjectionDefinition`\n\n###### Type\n\n```ts\nstring | PROJJSONDefinition\n```\n\n### `ProjectionInputs`\n\n###### Fields\n\n* `projection?` (`{id?: string; name?: string; definition: ProjectionDefinition}`)\n\n### `defaultProjectedGcpTransformOptions`\n\n###### Fields\n\n* `projection` (`{id?: string; name?: string; definition: string}`)\n\n### `defaultProjectedGcpTransformerOptions`\n\n###### Fields\n\n* `internalProjection` (`{id?: string; name?: string; definition: string}`)\n* `projection` (`{id?: string; name?: string; definition: string}`)\n\n### `getLonLatDefinition(partialProjectionDefinitionOptions)`\n\n###### Parameters\n\n* `partialProjectionDefinitionOptions?` (`Partial<ProjectionDefinitionOptions> | undefined`)\n\n###### Returns\n\n`string`.\n\n### `getWebMercatorDefinition(partialProjectionDefinitionOptions)`\n\n###### Parameters\n\n* `partialProjectionDefinitionOptions?` (`Partial<ProjectionDefinitionOptions> | undefined`)\n\n###### Returns\n\n`string`.\n\n### `isEqualProjection(projection0, projection1)`\n\n###### Parameters\n\n* `projection0` (`{id?: string; name?: string; definition: ProjectionDefinition}`)\n* `projection1` (`{id?: string; name?: string; definition: ProjectionDefinition}`)\n\n###### Returns\n\n`boolean`.\n\n### `lonLatProjection`\n\nlonLatProjection\n\n`EPSG:4326` projection with definition: `\"+title=WGS 84 (long/lat) +proj=longlat +ellps=WGS84 +datum=WGS84 +units=degrees +over\"`\n\nNote that `+over` was added to support wrapping around the antimeridian\n\n###### Fields\n\n* `definition` (`string`)\n* `id` (`string`)\n* `name` (`string`)\n\n### `projectionDefinitionToAntialiasedDefinition(stringProjectionDefinition, partialProjectionDefinitionOptions)`\n\n###### Parameters\n\n* `stringProjectionDefinition` (`string`)\n* `partialProjectionDefinitionOptions?` (`Partial<ProjectionDefinitionOptions> | undefined`)\n\n###### Returns\n\n`string`.\n\n### `projectionToAntialiasedProjection(projection, partialProjectionDefinitionOptions)`\n\n###### Parameters\n\n* `projection` (`{id?: string; name?: string; definition: ProjectionDefinition}`)\n* `partialProjectionDefinitionOptions?` (`Partial<ProjectionDefinitionOptions> | undefined`)\n\n###### Returns\n\n`{id?: string; name?: string; definition: ProjectionDefinition}`.\n\n### `webMercatorProjection`\n\nwebMercatorProjection\n\n`EPSG:3857` projection with definition: `\"+proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defs +type=crs +over\"`\n\nNote that `+over` was added to support wrapping around the antimeridian\n\n###### Fields\n\n* `definition` (`string`)\n* `id` (`string`)\n* `name` (`string`)\n","readmeFilename":"README.md"}