{"id":13583561,"url":"https://github.com/proj4js/proj4js","last_synced_at":"2026-04-03T00:25:30.509Z","repository":{"id":37678046,"uuid":"10691398","full_name":"proj4js/proj4js","owner":"proj4js","description":"JavaScript library to transform coordinates from one coordinate system to another, including datum transformations","archived":false,"fork":false,"pushed_at":"2025-05-07T21:32:18.000Z","size":5687,"stargazers_count":2111,"open_issues_count":113,"forks_count":335,"subscribers_count":73,"default_branch":"master","last_synced_at":"2025-05-07T22:01:59.562Z","etag":null,"topics":["datum-transformations","epsg","geospatial","gis","javascript"],"latest_commit_sha":null,"homepage":"http://proj4js.org","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/proj4js.png","metadata":{"files":{"readme":"README.md","changelog":"changelog.md","contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":"AUTHORS","dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2013-06-14T15:00:39.000Z","updated_at":"2025-05-07T00:04:50.000Z","dependencies_parsed_at":"2023-02-13T03:00:28.103Z","dependency_job_id":"50647298-6767-49e4-9c6a-6816d56cadce","html_url":"https://github.com/proj4js/proj4js","commit_stats":{"total_commits":601,"total_committers":59,"mean_commits":"10.186440677966102","dds":0.6888519134775375,"last_synced_commit":"13ad49198a38bb7fa6f20acaa0dd61ded58a8879"},"previous_names":[],"tags_count":78,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/proj4js%2Fproj4js","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/proj4js%2Fproj4js/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/proj4js%2Fproj4js/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/proj4js%2Fproj4js/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/proj4js","download_url":"https://codeload.github.com/proj4js/proj4js/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254243353,"owners_count":22038044,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["datum-transformations","epsg","geospatial","gis","javascript"],"created_at":"2024-08-01T15:03:35.430Z","updated_at":"2025-10-19T19:05:05.030Z","avatar_url":"https://github.com/proj4js.png","language":"JavaScript","readme":"# PROJ4JS ![Build Status](https://github.com/proj4js/proj4js/actions/workflows/build-and-test.yml/badge.svg)\n\nProj4js is a JavaScript library to transform point coordinates from one coordinate system to another, including datum transformations.\nOriginally a port of [PROJ](https://proj.org/) ([then known as PROJ.4](https://proj.org/faq.html#what-happened-to-proj-4)) and GCTCP C ([Archive](https://web.archive.org/web/20130523091752/http://edcftp.cr.usgs.gov/pub/software/gctpc/)) it is\na part of the [MetaCRS](https://trac.osgeo.org/metacrs/wiki) group of projects.\n\n## Installing\n\nDepending on your preferences\n\n```bash\nnpm install proj4\nbower install proj4\ncomponent install proj4js/proj4js\n```\n\nor just manually grab the file `proj4.js` from the [latest release](https://github.com/proj4js/proj4js/releases)'s `dist/` folder.\n\nIf you do not want to download anything, Proj4js is also hosted on [cdnjs](https://www.cdnjs.com/libraries/proj4js) for direct use in your browser applications.\n\n## Using\n\nThe basic signature is:\n\n```javascript\nproj4([fromProjection, ]toProjection[, coordinates])\n```\n\nProjections can be proj or wkt strings, or PROJJSON objects.\n\nCoordinates may be an object of the form `{x:x,y:y}` or an array of the form `[x,y]`.\n\nWhen all 3 arguments  are given, the result is that the coordinates are transformed from projection1 to projection 2. And returned in the same format that they were given in.\n\n```javascript\nvar firstProjection = 'PROJCS[\"NAD83 / Massachusetts Mainland\",GEOGCS[\"NAD83\",DATUM[\"North_American_Datum_1983\",SPHEROID[\"GRS 1980\",6378137,298.257222101,AUTHORITY[\"EPSG\",\"7019\"]],AUTHORITY[\"EPSG\",\"6269\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.01745329251994328,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4269\"]],UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]],PROJECTION[\"Lambert_Conformal_Conic_2SP\"],PARAMETER[\"standard_parallel_1\",42.68333333333333],PARAMETER[\"standard_parallel_2\",41.71666666666667],PARAMETER[\"latitude_of_origin\",41],PARAMETER[\"central_meridian\",-71.5],PARAMETER[\"false_easting\",200000],PARAMETER[\"false_northing\",750000],AUTHORITY[\"EPSG\",\"26986\"],AXIS[\"X\",EAST],AXIS[\"Y\",NORTH]]';\nvar secondProjection = \"+proj=gnom +lat_0=90 +lon_0=0 +x_0=6300000 +y_0=6300000 +ellps=WGS84 +datum=WGS84 +units=m +no_defs\";\n//I'm not going to redefine those two in latter examples.\nproj4(firstProjection,secondProjection,[-122.305887, 58.9465872]);\n// [-2690575.447893817, 36622916.8071244564]\n```\n\nThe library can also parse coordinates provided with an elevation and measure, again as an object of the form `{x:x,y:y,z:z,m:m}` or an array of the form `[x,y,z,m]`.\n\n```javascript\nproj4(firstProjection,secondProjection,[-122.305887, 58.9465872,10]);\n// [-2690575.447893817, 36622916.8071244564, 10]\n```\n\nIf only 1 projection is given then it is assumed that it is being projected *from* WGS84 (fromProjection is WGS84).\n\n```javascript\nproj4(firstProjection,[-71,41]);\n// [242075.00535055372, 750123.32090043]\n```\n\nIf no coordinates are given an object with two methods is returned, its methods are `forward` which projects from the first projection to the second and `inverse` which projects from the second to the first.\n\n```javascript\nproj4(firstProjection,secondProjection).forward([-122.305887, 58.9465872]);\n// [-2690575.447893817, 36622916.8071244564]\nproj4(secondProjection,firstProjection).inverse([-122.305887, 58.9465872]);\n// [-2690575.447893817, 36622916.8071244564]\n```\n\nAnd as above if only one projection is given, it's assumed to be coming from wgs84:\n\n```javascript\nproj4(firstProjection).forward([-71,41]);\n// [242075.00535055372, 750123.32090043]\nproj4(firstProjection).inverse([242075.00535055372, 750123.32090043]);\n// [-71, 40.99999999999986]\n```\nNote: The generation of the floating point value `40.99999999999986` in this example represents the fact that some variance in precision is involved in any conversion between one coordinate reference system and another.\n\n## Named Projections\n\nIf you prefer to define a projection as a string and reference it that way, you may use the proj4.defs method which can be called 2 ways, with a name and projection:\n\n```js\nproj4.defs('WGS84', \"+title=WGS 84 (long/lat) +proj=longlat +ellps=WGS84 +datum=WGS84 +units=degrees\");\n```\n\nor with an array\n\n```js\nproj4.defs([\n  [\n    'EPSG:4326',\n    '+title=WGS 84 (long/lat) +proj=longlat +ellps=WGS84 +datum=WGS84 +units=degrees'],\n  [\n    'EPSG:4269',\n    '+title=NAD83 (long/lat) +proj=longlat +a=6378137.0 +b=6356752.31414036 +ellps=GRS80 +datum=NAD83 +units=degrees'\n  ]\n]);\n```\n\nyou can then do\n\n```js\nproj4('EPSG:4326');\n```\n\ninstead of writing out the whole proj definition, by default proj4 has the following projections predefined:\n\n- 'EPSG:4326', which has the following alias\n    - 'WGS84'\n- 'EPSG:4269'\n- 'EPSG:3857', which has the following aliases\n    - 'EPSG:3785'\n    - 'GOOGLE'\n    - 'EPSG:900913'\n    - 'EPSG:102113'\n- EPSG:32601 to EPSG:32660 (WGS84 / UTM zones 1 to 60 North)\n- EPSG:32701 to EPSG:32760 (WGS84 / UTM zones 1 to 60 South)\n- EPSG:5041 (WGS 84 / UPS North (E,N))\n- EPSG:5042 (WGS 84 / UPS South (E,N))\n\nDefined projections can also be accessed through the proj4.defs function (`proj4.defs('EPSG:4326')`).\n\nproj4.defs can also be used to define a named alias:\n\n```javascript\nproj4.defs('urn:x-ogc:def:crs:EPSG:4326', proj4.defs('EPSG:4326'));\n```\n\n## Axis order\n\nBy default, proj4 uses `[x,y]` axis order for projected (cartesian) coordinate systems and `[x=longitude,y=latitude]` for geographic coordinates. To enforce the axis order of the provided proj or wkt string, use the\n```javascript\nproj4(fromProjection, toProjection).forward(coordinate, enforceAxis);\nproj4(fromProjection, toProjection).inverse(coordinate, enforceAxis);\n```\nsignatures with `enforceAxis` set to `true`:\n```javascript\nproj4('+proj=longlat +ellps=WGS84 +datum=WGS84 +units=degrees +axis=neu', firstProjection).forward([41, -71], true);\n// [242075.00535055372, 750123.32090043]\nproj4('+proj=longlat +ellps=WGS84 +datum=WGS84 +units=degrees +axis=neu', firstProjection).inverse([242075.00535055372, 750123.32090043], true);\n//[40.99999999999986, -71]\n//the floating points to answer your question\n```\n\n## Datum Transformations\n\nProj4js has built-in Helmert transformations for many datums to transform to and from WGS84, which is used as pivot for datum transformations. If a datum is not available or not accurate enough for the desired region, custom Helmert transformations or grid based datum adjustments are supported.\n\nWKT1 definitions can contain a `TOWGS84` parameter. For proj strings, `towgs84` or `nadgrids` can be specified. When using WKT2 or PROJJSON definitions, if a `BOUNDCRS` with an `ABRIDGEDTRANDFORMATION` to WGS84 is provided, Helmert transformation parameters (like `+towgs84=` in proj strings) or the name of the parameter file (like `+nadgrids=` in proj strings) will be extracted from it.\n\n## Grid Based Datum Adjustments\n\n### NTV2 format (.gsb)\nTo use `+nadgrids=` in a proj definition or a WKT2/PROJJSON `ABRIDGEDTRANSFORM` with an `NTv2` method, first read your NTv2 `.gsb` file (e.g. from https://github.com/OSGeo/proj-datumgrid) into an ArrayBuffer, then pass it to `proj4.nadgrid`. E.g:\n\n```javascript\nconst buffer = fs.readFileSync('ntv2.gsb').buffer\nproj4.nadgrid('key', buffer);\n```\n\nthen use the given key in your definition, e.g. `+nadgrids=@key,null`. See [Grid Based Datum Adjustments](https://proj.org/usage/transformation.html?highlight=nadgrids#grid-based-datum-adjustments).\n\nOptionally, if your `.gsb` file does not contain latitude and longitude error columns, you can provide an `options` object argument to the `proj4.nadgrid` call, setting the `includeErrorFields` property to `false`, e.g:\n\n```javascript\nconst buffer = fs.readFileSync('ntv2.gsb').buffer\nproj4.nadgrid('key', buffer, {includeErrorFields:false});\n```\n\nIf the options argument is omitted, `includeErrorFields` is assumed to be true.\n\n\n### GeoTIFF format (.tif)\nTo use `+nadgrids=` in a proj definition or a WKT2/PROJJSON `ABRIDGEDTRANSFORM` with a `GeoTIFF` method, first read your `.tif` file (e.g. from https://github.com/OSGeo/PROJ-data or https://cdn.proj.org/) into a GeoTIFF instance from the [GeoTIFF.js library](https://github.com/geotiffjs/geotiff.js/), then pass it to `proj4.nadgrid`. E.g:\n```javascript\nimport { fromUrl} from \"geotiff\";\nconst tiff = await fromUrl('ca_nrc_NA83SCRS.tif');\nawait proj4.nadgrid('ca_nrc_NA83SCRS.tif', tiff).ready;\n```\n\nThen use the given key in your definition, e.g. `proj4.defs(\"EPSG:32188\",\"+proj=tmerc +lat_0=0 +lon_0=-73.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +nadgrids=ca_nrc_NA83SCRS.tif +units=m +no_defs +type=crs\");` noting the `+nadgrids=ca_nrc_NA83SCRS.tif` parameter.\n\n## Developing\nTo set up build tools make sure you have node and grunt-cli installed and then run `npm install`.\n\nTo do the complete build and browser tests run\n\n```bash\nnode_modules/.bin/grunt\n```\n\nTo run node and browser tests run\n\n```bash\nnpm test\n```\n\nTo run node tests with coverage run\n\n```bash\nnpm run build\nnpm run test:coverage\n```\n\nTo create a build with only default projections (latlon and Mercator) run\n\n```bash\nnode_modules/.bin/grunt build\n```\n\nTo create a build with only custom projections include a comma separated list of projections codes (the file name in 'lib/projections' without the '.js') after a colon, e.g.\n\n```bash\nnode_modules/.bin/grunt build:tmerc\n#includes transverse Mercator\nnode_modules/.bin/grunt build:lcc\n#includes lambert conformal conic\nnode_modules/.bin/grunt build:omerc,moll\n#includes oblique Mercator and Mollweide\n```\n","funding_links":[],"categories":["JavaScript","Geospatial Library","👨‍💻 JavaScript Libraries"],"sub_categories":["JavaScript","Data Processing"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fproj4js%2Fproj4js","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fproj4js%2Fproj4js","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fproj4js%2Fproj4js/lists"}