diff --git a/.gitignore b/.gitignore index 339db0eb5..d719d2b38 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,4 @@ npm-debug.log /www/mapshaper.js /www/node_modules.js release* +nacis diff --git a/.travis.yml b/.travis.yml index 0e010c3b7..d408f4bf6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,6 @@ language: node_js sudo: false node_js: - - '0.12' + - '4.2.0' + - '6.9.0' - 'node' diff --git a/CHANGELOG.md b/CHANGELOG.md index 348db1c7b..173211fff 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,346 @@ +v0.4.105 +* [gui] Added separate interface modes for inspecting attributes, editing attributes, dragging labels to change offset from anchor, and dragging point symbols to change coordinates. +* [cli] Improved error message when trying to read unsupported file types. + +v0.4.104 +* Added "-uniq invert" option, for retaining non-unique records (useful e.g. for troubleshooting many-to-one joins). +* Improved some error messages. + +v0.4.103 +* Added "weighted" option to the "-filter-slivers" command. When used with the "min-area=" option, the "weighted" flag multiplies the area of each polygon ring by the "Polsby-Popper" compactness metric, so sliver-shaped rings have a lower effective area. +* Added "this.perimeter" to the JS expression context. Perimeter values are in meters for unprojected data or in projected units (usually meters) for projected data. +* Added "this.compactness" to the JS expression context. Compactness is the "Polsby-Popper" score of each polygon feature. +* Added "-points vertices2" option, which is like "-points vertices", but retains every vertex of the original polygon or polyline instead of removing duplicate vertices within each feature. +* Fix for issue #310. + +v0.4.102 +* Close issues #308 and #309. + +v0.4.101 +* Re-publish to npm + +v0.4.100 +* Enable support for variable simplification amounts at the feature level using JS expressions. Adding the "variable" keyword to the -simplify command turns on variable simplification. + +v0.4.99 +* Support reading CSV files larger than 2GB. +* Added -i command option csv-filter=, for filtering CSV records on import using a JS expression. +* Added -i command option csv-fields=, for importing a subset of fields from a CSV file. +* Faster rendering of many unstyled point symbols (which are drawn as little squares). + +v0.4.98 +* Fixed a performance regression. + +v0.4.97 +* Updated mproj version to include bertin1953 projection. + +v0.4.96 +* Fix for issue #304 (inaccurate centroids for some tiny polygons, caused by floating point rounding). + +v0.4.95 +* Fixed some clipping and dissolving errors caused by floating point inaccuracy. + +v0.4.94 +* Fix for problem importing GeoJSON with non-standard properties + +v0.4.93 +* Improve CRS detection when merging datasets + +v0.4.92 +* Added '-o pixels=' and '-frame pixels=' options for scaling SVG output based on the number of pixels in the output image. + +v0.4.91 +* Upgraded to 0.0.18 of mapshaper-proj. + +v0.4.90 +* Upgraded to v0.0.17 of mapshaper-proj, which includes the "Equal Earth" projection (+proj=eqearth). + +v0.4.89 +* Convert undefined and null values to empty strings when outputting a DBF string field. + +v0.4.88 +* Fix: convert non-alphameric characters in DBF field names to underscores. +* Web UI updates to support putting more than one mapshaper instance on a single page. + +v0.4.87 +* Added experimental -run command, for creating commands on-the-fly and running them. +* Added experimental -require command, for importing Node modules for use in -each expressions. +* Added "d" as an alias for "this.properties" in expressions, with a nod to D3. +* -join command prints a warning instead of erroring if no records are joined. + +v0.4.86 +* [gui] Now you can drag layers in the layer menu to change their stacking order. +* Added mapshaper-gui -a option, to display all layers initially. +* The -target command can now target multiple layers. +* Added undocumented aspect-ratio= option to -rectangle and -rectangles commands. + +v0.4.85 +* [style] Added -style stroke-dasharray= option. +* Added -o max-height= option, for limiting the height of SVG output files. +* Added undocumented -rectangles option, for creating a box around every feature in a layer. +* Bug fixes + +v0.4.84 +* [rectangle] offset= option accepts a list of four values (minx,miny,maxx,maxy) in addition to a single value. Value can be a percentage or an interval. +* [rectangle] If no source= or bbox= option is given, -rectangle uses the bounding box of the current target layer(s). +* [points] Added a polyline-to-point conversion that reduces each polyline feature to a single vertex, suitable for point-in-polygon testing. +* Bug fixes + +v0.4.83 +* Now you can turn on multiple reference layers from the layers menu in the web UI. Reference layers are styled on the map if they have style attributes. +* If a feature is pinned via the [i] inspector tool, the delete key will delete it. +* The text-anchor property of single-line SVG labels is automatically updated on drag, based on its horizontal position in relation to its anchor point. Labels towards the left of the anchor are given text-anchor=end, labels to the right are given text-anchor=start and centered labels are given text-anchor=middle. +* The text-anchor property of multi-line SVG labels can be toggled by clicking the label after it has been selected. +* Added -uniq max-count= option to retain multiple features with the same id. + +v0.4.82 +* Added -lines each= option, for applying a JS expression to each output line feature. The expression can access data about the original polygon features, just like the where= option. + +v0.4.81 +* Added -lines where= and -innerlines where= options, for filtering lines using properties of adjacent polygons. Polygons are represented as A and B objects in the expression. B is null for "outer" lines. + +v0.4.80 +* Results of assigments in -calc expressions are available to subsequent -each expressions as variables. +* Updated dependencies. + +v0.4.79 +* Added new -include command for loading JS data and functions from an external file. The file should contain a single JS object. The keys and values of this object are converted to variables in the JS expression used by -each. + +v0.4.78 +* Bug fix + +v0.4.77 +* Added -s/--direct-save option to mapshaper-gui, for saving output files to a path relative to the user's current working directory, instead of into the browser's download folder. +* Added -f/--force-save option to mapshaper-gui, to allow overwriting input files. + +v0.4.76 +* Increased the maximum size of CSV output to 2GB (the maximum Buffer size in Node). +* Print a warning instead of throwing an error if a CSV file contains no data records. + +v0.4.75 +* -join copies source fields by default even if calc= option is present. +* -join prints a warning when inconsistent values are found in copied fields during many-to-one joins. + +v0.4.74 +* -join fields=* now copies all of the fields from the source layer, including the key field. + +v0.4.73 +* The -merge-layers command is now able to merge layers from different datasets (including layers in the GUI and layers loaded via separate -i commands). +* Added -merge-layers "force" option for merging layers with inconsistent data fields. + +v0.4.72 +* -dissolve and -dissolve2 now accept a comma-separated list of field names to dissolve on. + +v0.4.71 +* Added -o field-order=ascending option, for sorting the column names (A-Z) of DBF and CSV files. + +v0.4.70 +* Order of data fields is preserved in DBF output (previously fields were sorted in case-sensitive ascending order). + +v0.4.69 +* Added support for using .shx file when present. (Very occasionally, records in the .shp file are packed in an unusual way, and the .shx index file is needed for reading the .shp file). + +v0.4.68 +* Added ability to dismiss the intersection display on the GUI. +* Updated web interface colors. + +v0.4.67 +* Renamed -svg-style command to -style (-svg-style still works as an alias). +* Minor web interface improvements + +v0.4.66 +* SVG labels are displayed in the web interface. +* Update label position relative to its anchor point by clicking and dragging the label. + +v0.4.65 +* Add -o height option, for setting the pixel height of SVG and TopoJSON output. + +v0.4.64 +* Bug fixes + +v0.4.63 +* Added mapshaper-xl script, for running mapshaper with about 8GB of heap memory instead of the default amount. +* Output type 1 Shapefiles if features are all single points (more compact than type 8/multipoint). + +v0.4.62 +* Added -o singles option for saving each output layer to a separate file (TopoJSON only). +* Allow -proj command to set the projection of an empty dataset. + +v0.4.61 +* Improvements to command line help. +* Add support for specifying most distance parameters using a variety of units. For example: -affine shift=1km,2km +* Add support for specifying areal parameters with units. For example: -filter-islands min-area=5sqkm. Recognizes sqmi/mi2, sqkm/km2, sqm/m2, sqft/ft2. + +v0.4.60 +* Added -o id-prefix= option for namespacing svg layer and symbol ids. +* Fix: SVG layer ids are based on layer names instead of output file name. + +v0.4.59 +* Bug fixes and performance improvements. +* Added undocumented -i geometry-type= option, to allow importing GeoJSON features containing GeometryCollections with mixed types (which would otherwise cause an error). + +v0.4.58 +* Fix for issue #236 - error reading some GeoJSON files. +* Added undocumented -filter-geom command with bbox= option, for removing non-intersecting geometry. + +v0.4.57 +* Bug fix for issue #228 "keep_shapes option doesn't always keep shapes". + +v0.4.56 +* -clean now removes empty geometries by default. +* Added -clean allow-empty option to retain empty geometries. +* Added -clean snap-interval= option to override the default snapping threshold. +* Updated mapshaper-proj to v0.0.15 (improved .prj file support). + +v0.4.55 +* Fix for issue #221 (-simplify resolution= option error). + +v0.4.54 +* Improvements to -clean command + +v0.4.53 +* Update -dissolve2 command to flatten polygons (remove overlaps) and optionally fill gaps. +* Added -clean command to flatten polygons and fill gaps. +* Added min-gap-area= option to -clean and -dissolve2 comands to specify the threshold for filling enclosed gaps between adjacent polygons. +* Show contents of zip files in web UI file import popup. + +v0.4.52 +* Redesigned initial view of the web UI. +* Temporary fix for issue #219 -- stop trying to fix polygon geometry after applying coordinate precision. + +v0.4.51 +* Fix for issue #216 (GeoJSON export fails in browser). + +v0.4.50 +* Added support for reading CSV files larger than 250MB. +* Added support for reading and writing CSV files using other encodings than UTF-8 or ascii. +* Added -drop command for dropping loaded data layers and for deleting geometry and/or attribute data fields from targeted layers. +* The [-info] command now shows an asterisk next to currently targetted layers. +* Bug fixes + +v0.4.49 +* Added -polygons gap-tolerance= option, for closing "undershoots" (tiny gaps between two polylines). + +v0.4.48 +* Added -shape command, for creating polygons and polylines from lists of coordinates. +* Added -rectangle command, for creating rectangular polygons. +* Added experimental -polygons command, for convering a polyline layer containing rings to a polygon layer. +* Made -dissolve2 more robust (less likely to drop rings when input contains overlapping shapes). +* In JS expressions, this.x and this.y can now be used to set x,y coordinates of point features (previously they were read-only). +* -svg-style layer-text= recognizes
, \n and '\n' (newline char) as line delimiters. +* -o margin= option now accepts a comma-separated list of margin widths, as an alternative to a single value. List order is xmin,ymin,xmax,ymax (same as bbox= option). + +v0.4.47 +* Added -svg-style where= option, for applying svg attributes to a subset of features + +v0.4.46 +* Added -o geometry-type= option, which overrides the default GeoJSON output type with one of: Feature, FeatureCollection, GeometryCollection. + +v0.4.45 +* Added -o svg-scale= option, for scaling SVG output using geographical units per pixel. + +v0.4.44 +* -dissolve2 now removes polygon rings that are improperly nested inside other rings. + +v0.4.43 +* Restore prohibition against overwriting input files unless the "-o force" option is present. + +v0.4.42 +* Added support for exporting TopoJSON in pixel coordinates using the -o width= and -o margin= options. + +v0.4.41 +* Added -o rfc7946 option, for generating RFC 7946-compliant GeoJSON: default 6-decimal precision, CCW outer-ring winding order, antimeridian-spanning bbox, warns if CRS is not WGS84. + +v0.4.40 +* Added sprintf() and round(num, digits) utility functions to -each command context. +* Fixed bug that prevented using applyCommands() with -clip or -erase commands. + +v0.4.39 +* [web] Added support for EPSG codes using the -proj command in the browser console (using Proj.4 syntax, like: -proj +init=epsg:2784). Supported init files: epsg, esri, nad83, nad27. + +v0.4.38 +* Added -svg-style letter-spacing= option. +* Started attaching SVG symbol classes to top-level symbol element (this only affects multipoint symbols). + +v0.4.37 +* Added support for multiline labels. Lines are separated by newline characters (`'\n'`) in the label text. +* Added -svg-style line-height= option to control the line height of multiline labels. + +v0.4.36 +* Setting both r= and label-text= options of -svg-style creates labels with anchor points. +* Added font-weight= and font-style= options to -svg-style command. + +v0.4.35 +* Added SVG label output, with new options to -svg-style command. +* Added string-fields= option as an more convenient alternative to field-types= in the -i and -join commands. + +v0.4.34 +* Fixed an incompatibility with Node versions < 3.0. + +v0.4.33 +* [web] Added support for importing and exporting large GeoJSON files (>1GB) to the web interface. + +v0.4.32 +* [web] The inspector tool now shows multiple hits when hovering over/clicking on overlapping polygons and points with identical coordinates. +* Added -target type=polygon|polyline|point option, for targeting layers of a given type. + +v0.4.31 +* Added support for exporting large (>1GB) GeoJSON files. + +v0.4.30 +* Added support for importing large (>1GB) GeoJSON files using the command line script. +* Changed `-line` command to generate two fields: "RANK", containing an integer and "TYPE", containing a human-friendly name. + +v0.4.29 +* Fixed error exporting Shapefiles with unparsable .prj files (content of original file is copied to output file). +* Updated mapshaper-proj to v0.0.11. + +v0.4.28 +* Fixed error when clipping polyline layers containing empty geometries. +* [web] Support backslash continuation lines in web console. + +v0.4.27 +* Added `-points interpolated interval=` options, for interpolating points along polylines at a fixed interval. +* Updated parsing of list options to accept quoted items, like this: `fields="County FIPS",State` . +* Renamed `-proj source=` option to `-proj match=`. +* Now, `-proj from=` option accepts a .prj file name or layer id as an alternative to a projection string. +* Now, `-proj from=` sets the target CRS if no destination projection is given. + +v0.4.26 +* [web] Updated console interface to display alongside the map. + +v0.4.25 +* Added `-proj target=` option, with support for `target=*`. +* Added `-target name=` option for renaming the target layer. +* Updated mapshaper-proj to v0.0.10. + +v0.4.24 +* Fixed: error dissolving polyline features containing rings. + +v0.4.23 +* Added polyline support to -dissolve command. + +v0.4.22 +* Added `-proj source=` option to match projection from a .prj file or another layer. +* Added support for simple point-to-point spatial joins. +* Added `-points vertices` option to convert polygon and polyline features to multipoint features. +* [web] Save console history between sessions using browser localStorage. +* [web] Always display mouse coordinates. +* [web] Display coordinates of mouse bbox after first click. + +v0.4.21 +* Updated mapshaper-proj to v0.0.9, with better WKT parsing and more projections. +* Added (undocumented) -shape command. +* Bug fixes + +v0.4.20 +* Added support for generating .prj files. +* Bug fixes + +v0.4.19 +* Improved display of styled layers. +* Bug fixes + v0.4.18 * Stacking order of layers in SVG output follows order of `target=` list. * [-colorizer] `colors=` can take a space- or a comma-delimited list. diff --git a/README.md b/README.md index d18dc486b..10af1504c 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ ### Introduction -Mapshaper is software for editing Shapefile, GeoJSON, [TopoJSON](https://github.com/mbostock/topojson/wiki) and several other data formats, written in JavaScript. +Mapshaper is software for editing Shapefile, GeoJSON, [TopoJSON](https://github.com/mbostock/topojson/wiki), CSV and several other data formats, written in JavaScript. The `mapshaper` command line program supports essential map making tasks like simplifying shapes, editing attribute data, clipping, erasing, dissolving, filtering and more. @@ -22,14 +22,33 @@ The project wiki has an [introduction](https://github.com/mbloch/mapshaper/wiki/ For a detailed reference, see the [Command Reference](https://github.com/mbloch/mapshaper/wiki/Command-Reference). -### Interactive tool -The web UI works in recent versions of Chrome and Firefox as well as IE 10+. Exporting is not supported in Safari. If you encounter out-of-memory errors using Chrome, try Firefox, which can handle Shapefiles larger than 1GB. + +### Interactive web interface + +The web UI works in recent desktop versions of Chrome, Firefox, Safari and Internet Explorer. Safari before v10.1 and IE before v10 are not supported. The mapshaper distribution includes the script `mapshaper-gui`, which runs mapshaper's web interface locally. You can also visit [mapshaper.org](http://www.mapshaper.org) to use mapshaper online. All processing is done in the browser, so your data stays private, even when using the public website. +### Large file support + +**Web interface** + +Firefox is able to load Shapefiles and GeoJSON files larger than 1GB. Chrome has improved in recent versions, but is still prone to out-of-memory errors when importing files larger than several hundred megabytes. + +**Command line interface** + +When working with very large files, mapshaper may become unresponsive or crash with the message "JavaScript heap out of memory." + +One option is to run `mapshaper-xl` (added in v0.4.63), which allocates more memory than the standard `mapshaper` program. + +Another solution is to run Node directly with the `--max-old-space-size` option. The following example (Mac or Linux) allocates 8GB of memory: +```bash +$ node --max-old-space-size=8192 `which mapshaper` +``` + ### Installation Mapshaper requires [Node.js](http://nodejs.org). @@ -62,8 +81,10 @@ This software is licensed under [MPL 2.0](http://www.mozilla.org/MPL/2.0/). According to Mozilla's [FAQ](http://www.mozilla.org/MPL/2.0/FAQ.html), "The MPL's ‘file-level’ copyleft is designed to encourage contributors to share modifications they make to your code, while still allowing them to combine your code with code under other licenses (open or proprietary) with minimal restrictions." + + ### Acknowledgements -Gregor Aisch, Mike Bostock, Shan Carter and Zhou Yi, for suggesting improvements and general helpfulness. +My colleagues at The New York Times, for countless suggestions, bug reports and general helpfulness. -Mark Harrower, for collaborating on the original MapShaper program at the University of Wisconsin–Madison. +Mark Harrower, for collaborating on the original "MapShaper" program at the University of Wisconsin–Madison. diff --git a/bin/mapshaper b/bin/mapshaper index 694453963..d1b6b16f1 100755 --- a/bin/mapshaper +++ b/bin/mapshaper @@ -1,6 +1,6 @@ #!/usr/bin/env node -var mapshaper = require("../"); +var mapshaper = require("../mapshaper.js"); mapshaper.enableLogging(); mapshaper.runCommands(process.argv.slice(2), done); diff --git a/bin/mapshaper-gui b/bin/mapshaper-gui index 4f5b6c0a0..d5de92db0 100755 --- a/bin/mapshaper-gui +++ b/bin/mapshaper-gui @@ -4,7 +4,8 @@ var http = require("http"), path = require("path"), url = require("url"), fs = require("fs"), - open = require("open"), + Cookies = require("cookies"), + opn = require("opn"), optimist = require("optimist"), defaultPort = 5555, webRoot = path.join(__dirname, "../www"), @@ -19,6 +20,21 @@ var http = require("http"), default: defaultPort, describe: "http port of server on localhost" }) + .options("s", { + alias: "direct-save", + describe: "allow saving files directly (outside Download folder)", + 'boolean': true + }) + .options("f", { + alias: "force-save", + describe: "allow overwriting input files with output files", + 'boolean': true + }) + .options("a", { + alias: "display-all", + describe: "turn on visibility of all layers", + 'boolean': true + }) .check(function(argv) { if (argv.h) { optimist.showHelp(); @@ -27,7 +43,8 @@ var http = require("http"), }).argv, port = parseInt(opts.port, 10) || defaultPort, probeCount = 0, - dataFiles = expandShapefiles(opts._); + dataFiles = expandShapefiles(opts._), + sessionId = null; validateFiles(dataFiles); @@ -48,8 +65,12 @@ process.on('uncaughtException', function(err) { startServer(port); +function getRandomSessionId() { + var str = Math.random().toString(16) + Math.random().toString(16); + return str.replace(/0\./g, '').substr(0, 20); +} + function startServer(port) { - var dataPath = '/data/'; var timeout; http.createServer(function(request, response) { @@ -61,30 +82,59 @@ function startServer(port) { process.exit(0); }, 200); } else if (uri == "/manifest.js") { + if (!sessionId && opts.s) { + // create a session id for authenticating requests to save files + // (see saveContent()) + sessionId = getRandomSessionId(); + new Cookies(request, response).set('session_id', sessionId); + } // serve JS file containing manifest of files for mapshaper to load - serveContent(getManifestJS(dataFiles), response, getMimeType(uri)); - } else if (uri.indexOf(dataPath) === 0) { + serveContent(getManifestJS(dataFiles, opts), response, getMimeType(uri)); + } else if (uri.indexOf('/data/') === 0) { // serve a file from a path relative to this script // assumed to be a data file from the cmd line (!) - serveFile(uri.replace(dataPath, ''), response); + serveFile(getDataFilePath(uri), response); + } else if (uri.indexOf('/save') === 0) { + saveContent(request, response); } else { // serve a file from the web root if (uri == '/') { uri = '/index.html'; } - serveFile(path.join(webRoot, uri), response); + serveFile(getAssetFilePath(uri), response); } }).listen(port, function() { - open("http://localhost:" + port); + opn("http://localhost:" + port); }); } +function getAssetFilePath(uri) { + // allowing loading of assets from paths relative to the cwd (in addition to + // the www/ directory of the mapshaper intall); this is useful + // for displaying svg icons in the web ui; svg output then embeds the icons + // in the output file. + var webPath = path.join(webRoot, uri), + relPath = path.join(process.cwd(), uri); + return fs.existsSync(webPath) ? webPath : relPath; +} + +function getDataFilePath(uri) { + // tilde is added by the web ui; allows accessing a single level of parent + // directory when loading data files (an attempt to add a bit of flexibility + // without giving access to the entire filesystem) + return decodeURI(uri).replace('/~/', '/../').replace('/data/', ''); +} + +function serveError(text, code, response) { + response.writeHead(code, {"Content-Type": "text/plain"}); + response.write(text); + response.end(); +} + function serveFile(filename, response) { - fs.readFile(filename, "binary", function(err, content) { + fs.readFile(filename, function(err, content) { if (err) { - response.writeHead(404, {"Content-Type": "text/plain"}); - response.write("404 Not Found\n"); - response.end(); + serveError("404 Not Found\n", 404, response); } else { serveContent(content, response, getMimeType(filename)); } @@ -93,20 +143,76 @@ function serveFile(filename, response) { function serveContent(content, response, mimeType) { if (mimeType) { - response.setHeader("Content-Type", mimeType); + response.setHeader('Content-Type', mimeType); } + response.setHeader('Cache-Control', 'no-cache'); response.writeHead(200); response.write(content, "binary"); response.end(); } -function getManifestJS(files) { - if (files.length > 0) { - return "mapshaper.manifest = " + JSON.stringify(files) + ";\n"; +function readPostData(req, cb) { + var buffers = []; + if (req.method != 'POST') return cb('expected a post request'); + // TODO: consider quitting if a size limit is reached + req.on('data', function(data) {buffers.push(data);}); + req.on('end', function () { + cb(null, Buffer.concat(buffers)); + }); +} + +function saveContent(req, res) { + var requestId = new Cookies(req, res).get('session_id'), + ip = req.connection.remoteAddress, + urlData = url.parse(req.url), + query = require('querystring').parse(urlData.query), + file = query.file; + // Only requests containing a cookie with the original session id are allowed to save. + // This should limit direct saving to the user who is running mapshaper-gui, + // preventing another user who has the URL of this Node service from saving. + if (!sessionId || requestId != sessionId) return fail('invalid session id'); + if (ip != '::ffff:127.0.0.1' && ip != '::1' && ip != '127.0.0.1') return fail('saving is only allowed from localhost'); + if (err = validateOutputFile(file)) return fail(err); + readPostData(req, function(err, buf) { + if (err) return fail(err); + if (!Buffer.isBuffer(buf)) return fail('malformed file content'); + try { + fs.writeFileSync(file, buf); + } catch(e) { + return fail(e); + } + serveContent('File saved', res, 'text/plain'); + }); + + function fail(err) { + console.error('Unable to save ' + file + ":", err); + serveError(err, 400, res); + } +} + +function validateOutputFile(file) { + var relPath = path.relative('.', file); + // TODO: remove path restrictions? + if (relPath.indexOf('..') > -1) { + return 'parent directories are blocked'; + } + if (!opts.f) { + for (var i=0; i -1; -var buildAll = process.argv.indexOf('all') > -1; var requiredModules = [ 'mproj', 'buffer', 'iconv-lite', 'fs', - 'rbush', + 'flatbush', 'rw', 'path', 'd3-dsv' @@ -16,20 +15,18 @@ var requiredModules = [ require("catty")({follow: follow}) - .addLibrary("lib") .addLibrary("src") .cat("src/gui/mapshaper-gui.js", './www/mapshaper-gui.js') - .prepend("var VERSION = '" + version + "';") + .prepend("VERSION = '" + version + "';") .cat("src/mapshaper.js", onCat); -if (buildAll) { - require('browserify')() - .require(requiredModules) - .bundle(function(err, buf) { - if (err) throw err; - write('./www/node_modules.js', buf); - }); -} + +require('browserify')() + .require(requiredModules) + .bundle(function(err, buf) { + if (err) throw err; + write('./www/modules.js', buf); + }); function onCat(err, js) { diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 000000000..78d5fd2fd --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2053 @@ +{ + "name": "mapshaper", + "version": "0.4.101", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/concat-stream": { + "version": "1.6.0", + "resolved": "http://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.0.tgz", + "integrity": "sha1-OU2+C7X+5Gs42JZzXoto7yOQ0A0=", + "requires": { + "@types/node": "*" + } + }, + "@types/form-data": { + "version": "0.0.33", + "resolved": "http://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha1-yayFsqX9GENbjIXZ7LUObWyJP/g=", + "requires": { + "@types/node": "*" + } + }, + "@types/node": { + "version": "9.6.39", + "resolved": "https://registry.npmjs.org/@types/node/-/node-9.6.39.tgz", + "integrity": "sha512-c3OkjgNpSMdHan56WhklP0FMOk5ocilKz2Mpa0NOGzu8jw5YERjCf9FG0epYB1+TxScv/oI4uJ204u2mUg7Hcw==" + }, + "@types/qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-mNhVdZHdtKHMMxbqzNK3RzkBcN1cux3AvuCYGTvjEIQT2uheH3eCAyYsbMbh2Bq8nXkeOWs1kyDiF7geWRFQ4Q==" + }, + "JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } + }, + "acorn": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.0.4.tgz", + "integrity": "sha512-VY4i5EKSKkofY2I+6QLTbTTN/UvEQPCo6eiwzzSaSWfpaDhOmStMCMod6wmuPciNq+XS0faCglFu2lHZpdHUtg==", + "dev": true + }, + "acorn-dynamic-import": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz", + "integrity": "sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw==", + "dev": true + }, + "acorn-node": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.6.2.tgz", + "integrity": "sha512-rIhNEZuNI8ibQcL7ANm/mGyPukIaZsRNX9psFNQURyJW0nu6k8wjSDld20z6v2mDBWqX13pIEnk9gGZJHIlEXg==", + "dev": true, + "requires": { + "acorn": "^6.0.2", + "acorn-dynamic-import": "^4.0.0", + "acorn-walk": "^6.1.0", + "xtend": "^4.0.1" + } + }, + "acorn-walk": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.1.1.tgz", + "integrity": "sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw==", + "dev": true + }, + "ansi-styles": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz", + "integrity": "sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg=", + "dev": true + }, + "array-filter": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", + "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=", + "dev": true + }, + "array-map": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", + "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=", + "dev": true + }, + "array-reduce": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", + "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=", + "dev": true + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "assert": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", + "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", + "dev": true, + "requires": { + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "http://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "base64-js": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", + "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", + "dev": true + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "dev": true + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browser-pack": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz", + "integrity": "sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==", + "dev": true, + "requires": { + "JSONStream": "^1.0.3", + "combine-source-map": "~0.8.0", + "defined": "^1.0.0", + "safe-buffer": "^5.1.1", + "through2": "^2.0.0", + "umd": "^3.0.0" + } + }, + "browser-resolve": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", + "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", + "dev": true, + "requires": { + "resolve": "1.1.7" + }, + "dependencies": { + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + } + } + }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "browserify": { + "version": "16.2.3", + "resolved": "https://registry.npmjs.org/browserify/-/browserify-16.2.3.tgz", + "integrity": "sha512-zQt/Gd1+W+IY+h/xX2NYMW4orQWhqSwyV+xsblycTtpOuB27h1fZhhNQuipJ4t79ohw4P4mMem0jp/ZkISQtjQ==", + "dev": true, + "requires": { + "JSONStream": "^1.0.3", + "assert": "^1.4.0", + "browser-pack": "^6.0.1", + "browser-resolve": "^1.11.0", + "browserify-zlib": "~0.2.0", + "buffer": "^5.0.2", + "cached-path-relative": "^1.0.0", + "concat-stream": "^1.6.0", + "console-browserify": "^1.1.0", + "constants-browserify": "~1.0.0", + "crypto-browserify": "^3.0.0", + "defined": "^1.0.0", + "deps-sort": "^2.0.0", + "domain-browser": "^1.2.0", + "duplexer2": "~0.1.2", + "events": "^2.0.0", + "glob": "^7.1.0", + "has": "^1.0.0", + "htmlescape": "^1.1.0", + "https-browserify": "^1.0.0", + "inherits": "~2.0.1", + "insert-module-globals": "^7.0.0", + "labeled-stream-splicer": "^2.0.0", + "mkdirp": "^0.5.0", + "module-deps": "^6.0.0", + "os-browserify": "~0.3.0", + "parents": "^1.0.1", + "path-browserify": "~0.0.0", + "process": "~0.11.0", + "punycode": "^1.3.2", + "querystring-es3": "~0.2.0", + "read-only-stream": "^2.0.0", + "readable-stream": "^2.0.2", + "resolve": "^1.1.4", + "shasum": "^1.0.0", + "shell-quote": "^1.6.1", + "stream-browserify": "^2.0.0", + "stream-http": "^2.0.0", + "string_decoder": "^1.1.1", + "subarg": "^1.0.0", + "syntax-error": "^1.1.1", + "through2": "^2.0.0", + "timers-browserify": "^1.0.1", + "tty-browserify": "0.0.1", + "url": "~0.11.0", + "util": "~0.10.1", + "vm-browserify": "^1.0.0", + "xtend": "^4.0.0" + }, + "dependencies": { + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "dev": true, + "requires": { + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "requires": { + "pako": "~1.0.5" + } + }, + "buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz", + "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "cached-path-relative": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.2.tgz", + "integrity": "sha512-5r2GqsoEb4qMTTN9J+WzXfjov+hjxT+j3u5K+kIVNIwAd99DLCJE9pBIMP1qVeybV6JiijL385Oz0DcYxfbOIg==", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "catty": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/catty/-/catty-0.0.6.tgz", + "integrity": "sha1-McoJX7l3SMyK8Z5hMPruvbBVdQM=", + "dev": true, + "requires": { + "nomnom": "~1.8", + "underscore": "~1.7" + }, + "dependencies": { + "underscore": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz", + "integrity": "sha1-a7rwh3UA02vjTsqlhODbn+8DUgk=", + "dev": true + } + } + }, + "chalk": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", + "integrity": "sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8=", + "dev": true, + "requires": { + "ansi-styles": "~1.0.0", + "has-color": "~0.1.0", + "strip-ansi": "~0.1.0" + } + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha1-h2Dk7MJy9MNjUy+SbYdKriwTl94=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "combine-source-map": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz", + "integrity": "sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos=", + "dev": true, + "requires": { + "convert-source-map": "~1.1.0", + "inline-source-map": "~0.6.0", + "lodash.memoize": "~3.0.3", + "source-map": "~0.5.3" + } + }, + "combined-stream": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", + "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "dev": true, + "requires": { + "date-now": "^0.1.4" + } + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "convert-source-map": { + "version": "1.1.3", + "resolved": "http://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", + "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=", + "dev": true + }, + "cookies": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.7.3.tgz", + "integrity": "sha512-+gixgxYSgQLTaTIilDHAdlNPZDENDQernEMiIcZpYYP14zgHsCt4Ce1FEjFtcp6GefhozebB6orvhAAWx/IS0A==", + "requires": { + "depd": "~1.1.2", + "keygrip": "~1.0.3" + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "create-ecdh": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "d3-dsv": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-1.0.10.tgz", + "integrity": "sha512-vqklfpxmtO2ZER3fq/B33R/BIz3A1PV0FaZRuFM8w6jLo7sUX1BZDh73fPlr0s327rzq4H6EN1q9U+eCBCSN8g==", + "requires": { + "commander": "2", + "iconv-lite": "0.4", + "rw": "1" + } + }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-eql": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", + "integrity": "sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=", + "dev": true, + "requires": { + "type-detect": "0.1.1" + } + }, + "defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", + "dev": true + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "deps-sort": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.0.tgz", + "integrity": "sha1-CRckkC6EZYJg65EHSMzNGvbiH7U=", + "dev": true, + "requires": { + "JSONStream": "^1.0.3", + "shasum": "^1.0.0", + "subarg": "^1.0.0", + "through2": "^2.0.0" + } + }, + "des.js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", + "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "detective": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/detective/-/detective-5.1.0.tgz", + "integrity": "sha512-TFHMqfOvxlgrfVzTEkNBSh9SvSNX/HfF4OFI2QFGCyPm02EsyILqnUeb5P6q7JZ3SFNTBL5t2sePRgrN4epUWQ==", + "dev": true, + "requires": { + "acorn-node": "^1.3.0", + "defined": "^1.0.0", + "minimist": "^1.1.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true + }, + "duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", + "dev": true, + "requires": { + "readable-stream": "^2.0.2" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + } + } + }, + "elliptic": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz", + "integrity": "sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==", + "dev": true, + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "events": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/events/-/events-2.1.0.tgz", + "integrity": "sha512-3Zmiobend8P9DjmKAty0Era4jV8oJ0yGYe2nJJAxgymF9+N8F2m0hhZiMoWtcfepExzNKZumFU3ksdQbInGWCg==", + "dev": true + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "flatbush": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/flatbush/-/flatbush-3.1.0.tgz", + "integrity": "sha512-gK1GFGxxmHISdkZJKYacwrNy0sDK3dppRznffE0wRkNn8lBn0KW82z+3MiiJ9cOqRMtV+xwF+N6Zwxk06IbE8A==", + "requires": { + "flatqueue": "^1.1.0" + } + }, + "flatqueue": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/flatqueue/-/flatqueue-1.1.0.tgz", + "integrity": "sha512-N95K6UfbI1wg6iOg3ItYrL3d3kNN6Fe0+dsp6sbTBg9/3dqR5KiTaMdfxG2dz2ITKAWCSYCvjf69xpA6760Zfw==" + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "geographiclib": { + "version": "1.48.0", + "resolved": "https://registry.npmjs.org/geographiclib/-/geographiclib-1.48.0.tgz", + "integrity": "sha1-j/KuGFrTgPZ122okOTX63RR974I=" + }, + "get-assigned-identifiers": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz", + "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==", + "dev": true + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw=" + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-color": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz", + "integrity": "sha1-ZxRKUmDDT8PMpnfQQdr1L+e3iy8=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "hash.js": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.5.tgz", + "integrity": "sha512-eWI5HG9Np+eHV1KQhisXWwM+4EPPYe5dFX1UZZH7k/E3JzDEazVH+VGlZi6R94ZqImq+A3D1mCEtrFIfg/E7sA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "htmlescape": { + "version": "1.1.1", + "resolved": "http://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", + "integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=", + "dev": true + }, + "http-basic": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-6.0.0.tgz", + "integrity": "sha512-7ScbVjuiReYe8S+OZOpNjoKGXrbhJHIrQQe7eq1TpLTJkxH8MPKvnTUzq/TNLjww1hdFQy8yUIC42wuLhCjYcQ==", + "requires": { + "@types/concat-stream": "^1.6.0", + "@types/node": "^7.0.31", + "caseless": "~0.12.0", + "concat-stream": "^1.4.6", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + }, + "dependencies": { + "@types/node": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-7.10.2.tgz", + "integrity": "sha512-RO4ig5taKmcrU4Rex8ojG1gpwFkjddzug9iPQSDvbewHN9vDpcFewevkaOK+KT+w1LeZnxbgOyfXwV4pxsQ4GQ==" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + } + } + }, + "http-response-object": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.1.tgz", + "integrity": "sha512-6L0Fkd6TozA8kFSfh9Widst0wfza3U1Ex2RjJ6zNDK0vR1U1auUR6jY4Nn2Xl7CCy0ikFmxW1XcspVpb9RvwTg==", + "requires": { + "@types/node": "^9.3.0" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ieee754": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", + "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "inline-source-map": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", + "integrity": "sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=", + "dev": true, + "requires": { + "source-map": "~0.5.3" + } + }, + "insert-module-globals": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.2.0.tgz", + "integrity": "sha512-VE6NlW+WGn2/AeOMd496AHFYmE7eLKkUY6Ty31k4og5vmA3Fjuwe9v6ifH6Xx/Hz27QvdoMoviw1/pqWRB09Sw==", + "dev": true, + "requires": { + "JSONStream": "^1.0.3", + "acorn-node": "^1.5.2", + "combine-source-map": "^0.8.0", + "concat-stream": "^1.6.1", + "is-buffer": "^1.1.0", + "path-is-absolute": "^1.0.1", + "process": "~0.11.0", + "through2": "^2.0.0", + "undeclared-identifiers": "^1.1.2", + "xtend": "^4.0.0" + }, + "dependencies": { + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + } + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "json-stable-stringify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz", + "integrity": "sha1-YRwj6BTbN1Un34URk9tZ3Sryf0U=", + "dev": true, + "requires": { + "jsonify": "~0.0.0" + } + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true + }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "dev": true + }, + "keygrip": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.0.3.tgz", + "integrity": "sha512-/PpesirAIfaklxUzp4Yb7xBper9MwP6hNRA6BGGUFCgbJ+BM5CKBtsoxinNXkLHAr+GXS1/lSlF2rP7cv5Fl+g==" + }, + "labeled-stream-splicer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.1.tgz", + "integrity": "sha512-MC94mHZRvJ3LfykJlTUipBqenZz1pacOZEMhhQ8dMGcDHs0SBE5GbsavUXV7YtP3icBW17W0Zy1I0lfASmo9Pg==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "isarray": "^2.0.4", + "stream-splicer": "^2.0.0" + }, + "dependencies": { + "isarray": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.4.tgz", + "integrity": "sha512-GMxXOiUirWg1xTKRipM0Ek07rX+ubx4nNVElTJdNLYmNO/2YrDkgJGw9CljXn+r4EWiDQg/8lsRdHyg2PJuUaA==", + "dev": true + } + } + }, + "lodash.memoize": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", + "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=", + "dev": true + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + } + }, + "mime-db": { + "version": "1.37.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", + "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==" + }, + "mime-types": { + "version": "2.1.21", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", + "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", + "requires": { + "mime-db": "~1.37.0" + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + }, + "dependencies": { + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + } + } + }, + "minimist": { + "version": "0.0.10", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=" + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + } + } + }, + "mocha": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", + "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==", + "dev": true, + "requires": { + "browser-stdout": "1.3.1", + "commander": "2.15.1", + "debug": "3.1.0", + "diff": "3.5.0", + "escape-string-regexp": "1.0.5", + "glob": "7.1.2", + "growl": "1.10.5", + "he": "1.1.1", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "supports-color": "5.4.0" + }, + "dependencies": { + "commander": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", + "dev": true + } + } + }, + "module-deps": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-6.2.0.tgz", + "integrity": "sha512-hKPmO06so6bL/ZvqVNVqdTVO8UAYsi3tQWlCa+z9KuWhoN4KDQtb5hcqQQv58qYiDE21wIvnttZEPiDgEbpwbA==", + "dev": true, + "requires": { + "JSONStream": "^1.0.3", + "browser-resolve": "^1.7.0", + "cached-path-relative": "^1.0.0", + "concat-stream": "~1.6.0", + "defined": "^1.0.0", + "detective": "^5.0.2", + "duplexer2": "^0.1.2", + "inherits": "^2.0.1", + "parents": "^1.0.0", + "readable-stream": "^2.0.2", + "resolve": "^1.4.0", + "stream-combiner2": "^1.1.1", + "subarg": "^1.0.0", + "through2": "^2.0.0", + "xtend": "^4.0.0" + }, + "dependencies": { + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + } + } + }, + "mproj": { + "version": "0.0.19", + "resolved": "https://registry.npmjs.org/mproj/-/mproj-0.0.19.tgz", + "integrity": "sha512-ioHe449HyI4NUn/tApMtfoYVtp2TNUYrjoyLjVDxNTQDhzKG/2MJXFWLZXpcEZU44jO3g2+rU+DLaj5aFVCOeA==", + "requires": { + "geographiclib": "1.48.0", + "rw": "~1.3.2" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "nomnom": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.8.1.tgz", + "integrity": "sha1-IVH3Ikcrp55Qp2/BJbuMjy5Nwqc=", + "dev": true, + "requires": { + "chalk": "~0.4.0", + "underscore": "~1.6.0" + }, + "dependencies": { + "underscore": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz", + "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=", + "dev": true + } + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "opn": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.4.0.tgz", + "integrity": "sha512-YF9MNdVy/0qvJvDtunAOzFw9iasOQHpVthTCvGzxt61Il64AYSGdK+rYwld7NAfk9qJ7dt+hymBNSc9LNYS+Sw==", + "requires": { + "is-wsl": "^1.1.0" + } + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "pako": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", + "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==", + "dev": true + }, + "parents": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz", + "integrity": "sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E=", + "dev": true, + "requires": { + "path-platform": "~0.11.15" + } + }, + "parse-asn1": { + "version": "5.1.1", + "resolved": "http://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", + "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", + "dev": true, + "requires": { + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3" + } + }, + "parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha1-juqz5U+laSD+Fro493+iGqzC104=" + }, + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-platform": { + "version": "0.11.15", + "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz", + "integrity": "sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I=", + "dev": true + }, + "pbkdf2": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", + "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "dev": true, + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + }, + "promise": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.0.2.tgz", + "integrity": "sha512-EIyzM39FpVOMbqgzEHhxdrEhtOSDOtjMZQ0M6iVfCE+kWNgCkAyOdnuCWqfmflylftfadU6FkiMgHZA2kUzwRw==", + "requires": { + "asap": "~2.0.6" + } + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "randombytes": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", + "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "read-only-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz", + "integrity": "sha1-JyT9aoET1zdkrCiNQ4YnDB2/F/A=", + "dev": true, + "requires": { + "readable-stream": "^2.0.2" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + } + } + }, + "resolve": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", + "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", + "dev": true, + "requires": { + "path-parse": "^1.0.5" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q=" + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sha.js": { + "version": "2.4.11", + "resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shasum": { + "version": "1.0.2", + "resolved": "http://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz", + "integrity": "sha1-5wEjENj0F/TetXEhUOVni4euVl8=", + "dev": true, + "requires": { + "json-stable-stringify": "~0.0.0", + "sha.js": "~2.4.4" + } + }, + "shell-quote": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", + "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", + "dev": true, + "requires": { + "array-filter": "~0.0.0", + "array-map": "~0.0.0", + "array-reduce": "~0.0.0", + "jsonify": "~0.0.0" + } + }, + "simple-concat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", + "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "stream-browserify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", + "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + } + } + }, + "stream-combiner2": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", + "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=", + "dev": true, + "requires": { + "duplexer2": "~0.1.0", + "readable-stream": "^2.0.2" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + } + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dev": true, + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + }, + "dependencies": { + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "stream-splicer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.0.tgz", + "integrity": "sha1-G2O+Q4oTPktnHMGTUZdgAXWRDYM=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.2" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + } + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", + "integrity": "sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE=", + "dev": true + }, + "subarg": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", + "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=", + "dev": true, + "requires": { + "minimist": "^1.1.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "sync-request": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-5.0.0.tgz", + "integrity": "sha512-NKhEA4WacR3mRBIFz1niXrIUTrUVFtP2spzrLMINangebvJ/EFyVv+LMJKvVl6UIrJM4Fburnnj91lRnqb4WkA==", + "requires": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.0", + "then-request": "^5.0.0" + }, + "dependencies": { + "@types/node": { + "version": "8.10.38", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.38.tgz", + "integrity": "sha512-EibsnbJerd0hBFaDjJStFrVbVBAtOy4dgL8zZFw0uOvPqzBAX59Ci8cgjg3+RgJIWhsB5A4c+pi+D4P9tQQh/A==" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "then-request": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-5.0.0.tgz", + "integrity": "sha512-A3uIVLD33SAvB10PfsxLuQBMV8GVC/6xKBMPOvkJchi6251e5AMJ+Yy+RVKsVsnj0iYNhN2E5SkNSi58H19wsw==", + "requires": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^6.0.0", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + } + } + } + }, + "sync-rpc": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.4.tgz", + "integrity": "sha512-Iug+t1ICVFenUcTnDu8WXFnT+k8IVoLKGh8VA3eXUtl2Rt9SjKX3YEv33OenABqpTPL9QEaHv1+CNn2LK8vMow==", + "requires": { + "get-port": "^3.1.0" + } + }, + "syntax-error": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz", + "integrity": "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==", + "dev": true, + "requires": { + "acorn-node": "^1.2.0" + } + }, + "through": { + "version": "2.3.8", + "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "timers-browserify": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", + "integrity": "sha1-ycWLV1voQHN1y14kYtrO50NZ9B0=", + "dev": true, + "requires": { + "process": "~0.11.0" + } + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "tty-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", + "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", + "dev": true + }, + "type-detect": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz", + "integrity": "sha1-C6XsKohWQORw6k6FBZcZANrFiCI=", + "dev": true + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "umd": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz", + "integrity": "sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow==", + "dev": true + }, + "undeclared-identifiers": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/undeclared-identifiers/-/undeclared-identifiers-1.1.2.tgz", + "integrity": "sha512-13EaeocO4edF/3JKime9rD7oB6QI8llAGhgn5fKOPyfkJbRb6NFv9pYV6dFEmpa4uRjKeBqLZP8GpuzqHlKDMQ==", + "dev": true, + "requires": { + "acorn-node": "^1.3.0", + "get-assigned-identifiers": "^1.2.0", + "simple-concat": "^1.0.0", + "xtend": "^4.0.1" + } + }, + "underscore": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.0.tgz", + "integrity": "sha512-4IV1DSSxC1QK48j9ONFK1MoIAKKkbE8i7u55w2R6IqBqbT7A/iG7aZBCR2Bi8piF0Uz+i/MG1aeqLwl/5vqF+A==", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "dev": true, + "requires": { + "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "vm-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz", + "integrity": "sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==", + "dev": true + }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + } + } +} diff --git a/package.json b/package.json index c918ef8fa..992a8c72e 100644 --- a/package.json +++ b/package.json @@ -1,11 +1,19 @@ { "name": "mapshaper", - "version": "0.4.18", + "version": "0.4.105", "description": "A tool for editing vector datasets for mapping and GIS.", - "keywords": ["shapefile","topojson","geojson","cartography","simplification","topology","gis"], + "keywords": [ + "shapefile", + "topojson", + "geojson", + "cartography", + "simplification", + "topology", + "gis" + ], "author": "Matthew Bloch ", - "contributors":[], - "license":"MPL-2.0", + "contributors": [], + "license": "MPL-2.0", "repository": { "type": "git", "url": "https://github.com/mbloch/mapshaper" @@ -14,30 +22,34 @@ "node": ">=0.12.0" }, "scripts": { - "test": "mocha --check-leaks -R dot", - "pretest": "./build all", + "test": "node node_modules/mocha/bin/mocha --check-leaks -R dot", + "pretest": "./build", "prepublish": "npm test", "postpublish": "./release" }, "main": "./mapshaper.js", "dependencies": { + "cookies": "^0.7.1", + "d3-dsv": "~1.0.8", + "flatbush": "^3.1.0", + "iconv-lite": "0.4.24", + "mproj": "0.0.19", + "opn": "^5.3.0", "optimist": "~0.6.0", - "open": "~0.0.3", - "iconv-lite": "~0.4.13", - "rbush": "~1.4.2", - "rw": "~1.3.2", - "d3-dsv": "~1.0.3", - "mproj": "0.0.7" + "rw": "~1.3.3", + "sync-request": "5.0.0" }, "devDependencies": { - "shell-quote": "~1.4.1", - "mocha": ">=3.1.2", - "deep-eql": ">=0.1.3", + "browserify": "^16.2.3", "catty": "0.0.6", - "browserify": "~14.3.0" + "deep-eql": ">=0.1.3", + "mocha": "^5.2.0", + "shell-quote": "^1.6.1", + "underscore": "^1.9.0" }, "bin": { "mapshaper": "./bin/mapshaper", - "mapshaper-gui": "./bin/mapshaper-gui" + "mapshaper-gui": "./bin/mapshaper-gui", + "mapshaper-xl": "./bin/mapshaper-xl" } } diff --git a/src/cli/mapshaper-chunker.js b/src/cli/mapshaper-chunker.js index c34abec31..d006d8432 100644 --- a/src/cli/mapshaper-chunker.js +++ b/src/cli/mapshaper-chunker.js @@ -1,7 +1,11 @@ /* @requires mapshaper-common */ internal.splitShellTokens = function(str) { - var BAREWORD = '([^\\s\'"])+'; + return internal.splitTokens(str, '\\s'); +}; + +internal.splitTokens = function(str, delimChars) { + var BAREWORD = '([^' + delimChars + '\'"])+'; // TODO: make safer var SINGLE_QUOTE = '"((\\\\"|[^"])*?)"'; var DOUBLE_QUOTE = '\'((\\\\\'|[^\'])*?)\''; var rxp = new RegExp('(' + BAREWORD + '|' + SINGLE_QUOTE + '|' + DOUBLE_QUOTE + ')*', 'g'); diff --git a/src/cli/mapshaper-cli-utils.js b/src/cli/mapshaper-cli-utils.js index dc533bcc2..0f6b61635 100644 --- a/src/cli/mapshaper-cli-utils.js +++ b/src/cli/mapshaper-cli-utils.js @@ -26,11 +26,14 @@ cli.readFile = function(fname, encoding, cache) { if (cache && (fname in cache)) { content = cache[fname]; delete cache[fname]; + } else if (fname == '/dev/stdin') { + content = require('rw').readFileSync(fname); } else { - content = require(fname == '/dev/stdin' ? 'rw' : 'fs').readFileSync(fname); + internal.getStateVar('input_files').push(fname); + content = require('fs').readFileSync(fname); } if (encoding && Buffer.isBuffer(content)) { - content = internal.decodeString(content, encoding); + content = internal.trimBOM(internal.decodeString(content, encoding)); } return content; }; @@ -39,7 +42,7 @@ cli.readFile = function(fname, encoding, cache) { cli.writeFile = function(path, content, cb) { var fs = require('rw'); if (cb) { - fs.writeFile(path, content, cb); + fs.writeFile(path, content, preserveContext(cb)); } else { fs.writeFileSync(path, content); } @@ -48,7 +51,7 @@ cli.writeFile = function(path, content, cb) { // Returns Node Buffer cli.convertArrayBuffer = function(buf) { var src = new Uint8Array(buf), - dest = new Buffer(src.length); + dest = utils.createBuffer(src.length); for (var i = 0, n=src.length; i < n; i++) { dest[i] = src[i]; } diff --git a/src/cli/mapshaper-commands.js b/src/cli/mapshaper-commands.js index 77e5631e0..41d25fe82 100644 --- a/src/cli/mapshaper-commands.js +++ b/src/cli/mapshaper-commands.js @@ -2,61 +2,74 @@ // Parse command line args into commands and run them // @argv String or array of command line args, or array of parsed commands -api.runCommands = function(argv, done) { - var commands; - try { - commands = internal.parseCommands(argv); - } catch(e) { - return done(e); - } - internal.runParsedCommands(commands, null, function(err, catalog) { - done(err); - }); +// @input (optional) Object containing file contents indexed by filename +// Two signatures: +// function(argv, input, callback) +// function(argv, callback) +api.runCommands = function() { + internal.unifiedRun(arguments, 'run'); }; -// Similar to runCommands(), but receives input files from an object and -// returns output files to a callback, instead of using file I/O. -// -// @commands String or array of command line args, or array of parsed commands -// @input Object containing file contents indexed by filename -// @done Callback: function(, ), where output is an object +// Similar to runCommands(), but returns output files to the callback, instead of using file I/O. +// Callback: function(, ), where output is an object // containing output from -o command(s) indexed by filename -// -api.applyCommands = function(commands, input, done) { - var output = [], - type = internal.guessInputContentType(input); +api.applyCommands = function() { + internal.unifiedRun(arguments, 'apply'); +}; + +internal.unifiedRun = function(args, mode) { + var outputArr = mode == 'apply' ? [] : null; + var inputObj, inputType, done, commands; + if (utils.isFunction(args[1])) { + done = args[1]; + } else if (utils.isFunction(args[2])) { + done = args[2]; + inputObj = args[1]; + inputType = internal.guessInputContentType(inputObj); + } else { + error('Expected an optional input object and a callback'); + } try { - commands = internal.parseCommands(commands); + commands = internal.parseCommands(args[0]); } catch(e) { return done(e); } - if (type == 'text' || type == 'json') { + + if (inputType == 'text' || inputType == 'json') { // old api: input is the content of a CSV or JSON file - // return done(new APIError('applyCommands() has changed, see v0.4 docs')); - message("Warning: applyCommands() was called with deprecated input format"); - return internal.applyCommandsOld(commands, input, done); + // return done(new UserError('applyCommands() has changed, see v0.4 docs')); + message("Warning: deprecated input format"); + return internal.applyCommandsOld(commands, inputObj, done); } - // add options to -i and -o commands to bypass file i/o - commands = commands.map(function(cmd) { - // copy options so passed-in commands are unchanged - if (cmd.name == 'i' && input) { - cmd.options.input = input; - } else if (cmd.name == 'o') { - cmd.options.output = output; + // add options to -i -o -join -clip -erase commands to bypass file i/o + // TODO: find a less kludgy solution, e.g. storing input data using setStateVar() + commands.forEach(function(cmd) { + if (internal.commandTakesFileInput(cmd.name) && inputObj) { + cmd.options.input = inputObj; + } + if (cmd.name == 'o' && outputArr) { + cmd.options.output = outputArr; } - return cmd; }); internal.runParsedCommands(commands, null, function(err) { - var data = output.reduce(function(memo, o) { + var outputObj; + if (err || !outputArr) { + return done(err); + } + outputObj = outputArr.reduce(function(memo, o) { memo[o.filename] = o.content; return memo; }, {}); - done(err, data); + done(null, outputObj); }); }; +internal.commandTakesFileInput = function(name) { + return (name == 'i' || name == 'join' || name == 'erase' || name == 'clip' || name == 'include'); +}; + // TODO: rewrite applyCommands() tests and remove this function // @commands array of parsed commands // @content a JSON or CSV dataset @@ -90,11 +103,11 @@ internal.applyCommandsOld = function(commands, content, done) { // TODO: rewrite tests and remove this function internal.testCommands = function(argv, done) { internal.runParsedCommands(internal.parseCommands(argv), null, function(err, catalog) { - var target = catalog && catalog.getDefaultTarget(); + var targets = catalog ? catalog.getDefaultTargets() : []; var output; - if (!err && target) { + if (!err && targets.length > 0) { // returns dataset for compatibility with some older tests - output = target.dataset; + output = targets[0].dataset; } done(err, output); }); @@ -103,10 +116,11 @@ internal.testCommands = function(argv, done) { // Execute a sequence of commands // @commands Array of parsed commands // @catalog: Optional Catalog object containing previously imported data -// @done: function(, ) +// @cb: function(, ) // -internal.runParsedCommands = function(commands, catalog, done) { +internal.runParsedCommands = function(commands, catalog, cb) { if (!catalog) { + cb = createAsyncContext(cb); // use new context when creating new catalog catalog = new Catalog(); } else if (catalog instanceof Catalog === false) { error("Changed in v0.4: runParsedCommands() takes a Catalog object"); @@ -121,17 +135,24 @@ internal.runParsedCommands = function(commands, catalog, done) { } if (commands.length === 0) { - return done(new APIError("No commands to run")); + return done(new UserError("No commands to run")); } commands = internal.runAndRemoveInfoCommands(commands); if (commands.length === 0) { return done(null); } commands = internal.divideImportCommand(commands); + utils.reduceAsync(commands, catalog, nextCommand, done); + + function nextCommand(catalog, cmd, next) { + internal.setStateVar('current_command', cmd.name); // for log msgs + api.runCommand(cmd, catalog, next); + } - utils.reduceAsync(commands, catalog, function(catalog, cmd, nextCmd) { - api.runCommand(cmd, catalog, nextCmd); - }, done); + function done(err, catalog) { + cb(err, catalog); + internal.setStateVar('current_command', null); + } }; // If an initial import command indicates that several input files should be @@ -208,14 +229,12 @@ internal.runAndRemoveInfoCommands = function(commands) { internal.printEncodings(); } else if (cmd.name == 'projections') { internal.printProjections(); - } else if (cmd.name == 'help') { - internal.getOptionParser().printHelp(cmd.options.commands); } else if (cmd.name == 'verbose') { - internal.VERBOSE = true; + internal.setStateVar('VERBOSE', true); } else if (cmd.name == 'quiet') { - internal.QUIET = true; - } else if (cmd.name == 'tracing') { - internal.TRACING = true; + internal.setStateVar('QUIET', true); + } else if (cmd.name == 'debug') { + internal.setStateVar('DEBUG', true); } else { return true; } diff --git a/src/cli/mapshaper-merge-files.js b/src/cli/mapshaper-merge-files.js index 94ba1225b..2ef06d3dd 100644 --- a/src/cli/mapshaper-merge-files.js +++ b/src/cli/mapshaper-merge-files.js @@ -5,7 +5,7 @@ internal.importFiles = function(files, opts) { var unbuiltTopology = false; var datasets = files.map(function(fname) { // import without topology or snapping - var importOpts = utils.defaults({no_topology: true, auto_snap: false, snap_interval: null, files: [fname]}, opts); + var importOpts = utils.defaults({no_topology: true, snap: false, snap_interval: null, files: [fname]}, opts); var dataset = api.importFile(fname, importOpts); // check if dataset contains non-topological paths // TODO: may also need to rebuild topology if multiple topojson files are merged @@ -15,16 +15,11 @@ internal.importFiles = function(files, opts) { return dataset; }); var combined = internal.mergeDatasets(datasets); - // Build topology, if needed // TODO: consider updating topology of TopoJSON files instead of concatenating arcs // (but problem of mismatched coordinates due to quantization in input files.) if (unbuiltTopology && !opts.no_topology) { - // TODO: remove duplication with mapshaper-path-import.js; consider applying - // snapping option inside buildTopology() - if (opts.auto_snap || opts.snap_interval) { - internal.snapCoords(combined.arcs, opts.snap_interval); - } + internal.cleanPathsAfterImport(combined, opts); api.buildTopology(combined); } return combined; diff --git a/src/cli/mapshaper-option-parser.js b/src/cli/mapshaper-option-parser.js index 31bcd43b9..a59f63f9c 100644 --- a/src/cli/mapshaper-option-parser.js +++ b/src/cli/mapshaper-option-parser.js @@ -1,4 +1,4 @@ -/* @requires mapshaper-common */ +/* @requires mapshaper-common, mapshaper-chunker */ function CommandParser() { var commandRxp = /^--?([a-z][\w-]*)$/i, @@ -81,6 +81,10 @@ function CommandParser() { if (cmd._.length > 1 && !cmdDef.multi_arg) { error("Command expects a single value. Received:", cmd._.join(' ')); } + if (cmdDef.default && cmd._.length == 1) { + // TODO: support multiple-token values, like -i filenames + readDefaultOptionValue(cmd, cmdDef); + } if (cmdDef.validate) { cmdDef.validate(cmd); } @@ -91,52 +95,44 @@ function CommandParser() { } return commands; - function tokenIsCommandName(s) { - return !!utils.find(getCommands(), function(cmd) { - return s === cmd.name || s === cmd.alias; - }); - } - function tokenLooksLikeCommand(s) { return commandRxp.test(s); } - // Try to parse an assignment @token for command @cmdDef - function parseAssignment(cmd, token, cmdDef) { - var match = assignmentRxp.exec(token), - name = match[1], - val = utils.trimQuotes(match[2]), - optDef = findOptionDefn(name, cmdDef); - - if (!optDef) { - // Assignment to an unrecognized identifier could be an expression - // (e.g. -each 'id=$.id') -- save for later parsing - cmd._.push(token); - } else if (optDef.type == 'flag' || optDef.assign_to) { - stop("-" + cmdDef.name + " " + name + " option doesn't take a value"); - } else { - readOption(cmd, [name, val], cmdDef); - } - } - // Try to read an option for command @cmdDef from @argv function readOption(cmd, argv, cmdDef) { var token = argv.shift(), - optDef = findOptionDefn(token, cmdDef), - optName; + optName, optDef, parts; if (assignmentRxp.test(token)) { - parseAssignment(cmd, token, cmdDef); - return; + // token looks like name=value style option + parts = splitAssignment(token); + optDef = findOptionDefn(parts[0], cmdDef); + if (!optDef) { + // left-hand identifier is not a recognized option... + // assignment to an unrecognized identifier could be an expression + // (e.g. -each 'id=$.id') -- handle this case below + } else if (optDef.type == 'flag' || optDef.assign_to) { + stop("-" + cmdDef.name + " " + parts[0] + " option doesn't take a value"); + } else { + argv.unshift(parts[1]); + } + } else { + // looks like a simple spaced-delimited argument + optDef = findOptionDefn(token, cmdDef); } if (!optDef) { - // not a defined option; add it to _ array for later processing + // token is not a defined option; add it to _ array for later processing cmd._.push(token); return; } - optName = optDef.alias_to || optDef.name; + if (optDef.alias_to) { + optDef = findOptionDefn(optDef.alias_to, cmdDef); + } + + optName = optDef.name; optName = optName.replace(/-/g, '_'); if (optDef.assign_to) { @@ -148,39 +144,54 @@ function CommandParser() { } } - + function splitAssignment(token) { + var match = assignmentRxp.exec(token), + name = match[1], + val = utils.trimQuotes(match[2]); + return [name, val]; + } // Read an option value for @optDef from @argv function readOptionValue(argv, optDef) { - var type = optDef.type, - val, err, token; if (argv.length === 0 || tokenLooksLikeCommand(argv[0])) { - err = 'Missing value'; + stop("Missing value for " + optDef.name + " option"); + } + return parseOptionValue(argv.shift(), optDef); // remove token from argv + } + + function readDefaultOptionValue(cmd, cmdDef) { + var optDef = findOptionDefn(cmdDef.default, cmdDef); + cmd.options[cmdDef.default] = readOptionValue(cmd._, optDef); + } + + function parseOptionValue(token, optDef) { + var type = optDef.type; + var val, err; + if (type == 'number') { + val = Number(token); + } else if (type == 'integer') { + val = Math.round(Number(token)); + } else if (type == 'colors') { + val = internal.parseColorList(token); + } else if (type == 'strings') { + val = internal.parseStringList(token); + } else if (type == 'bbox' || type == 'numbers') { + val = token.split(',').map(parseFloat); + } else if (type == 'percent') { + // val = utils.parsePercent(token); + val = token; // string value is parsed by command function + } else if (type == 'distance' || type == 'area') { + val = token; // string value is parsed by command function } else { - token = argv.shift(); // remove token from argv - if (type == 'number') { - val = Number(token); - } else if (type == 'integer') { - val = Math.round(Number(token)); - } else if (type == 'strings') { - val = token.split(','); - } else if (type == 'colors') { - val = token.trim().split(/[, ]+/); // accept space and/or comma delimiter - } else if (type == 'bbox' || type == 'numbers') { - val = token.split(',').map(parseFloat); - } else if (type == 'percent') { - val = utils.parsePercent(token); - } else { - val = token; // assumes string - } + val = token; // assume string type + } - if (val !== val) { - err = "Invalid numeric value"; - } + if (val !== val) { + err = "Invalid numeric value"; } if (err) { - stop(err + " for option " + optDef.name + "="); + stop(err + " for " + optDef.name + " option"); } return val; } @@ -196,136 +207,132 @@ function CommandParser() { return null; } - function findCommandDefn(name, arr) { - return utils.find(arr, function(cmd) { - return cmd.name === name || cmd.alias === name; - }); - } - - function findOptionDefn(name, cmd) { - return utils.find(cmd.options, function(o) { - return o.name === name || o.alias === name; - }); - } }; - this.getHelpMessage = function(commandNames) { - var helpStr = '', - cmdPre = ' ', - optPre = ' ', - exPre = ' ', - gutter = ' ', - colWidth = 0, - detailView = false, - helpCommands, allCommands; - - allCommands = getCommands().filter(function(cmd) { - // hide commands without a description, except section headers - return !!cmd.describe || cmd.title; - }); - - if (commandNames) { - detailView = true; - helpCommands = commandNames.reduce(function(memo, name) { - var cmd = utils.find(allCommands, function(cmd) {return cmd.name == name;}); - if (cmd) memo.push(cmd); - return memo; - }, []); + this.getHelpMessage = function(cmdName) { + var helpCommands, singleCommand, lines; - allCommands.filter(function(cmd) { - return utils.contains(commandNames, cmd.name); - }); - if (helpCommands.length === 0) { - detailView = false; + if (cmdName) { + singleCommand = findCommandDefn(cmdName, getCommands()); + if (!singleCommand) { + stop(cmdName, "is not a known command"); } + lines = getSingleCommandLines(singleCommand); + } else { + helpCommands = getCommands().filter(function(cmd) {return cmd.name && cmd.describe || cmd.title;}); + lines = getMultiCommandLines(helpCommands); } - if (!detailView) { - if (_usage) { - helpStr += "\n" + _usage + "\n\n"; - } - helpCommands = allCommands; + return formatLines(lines); + + function formatLines(lines) { + var colWidth = calcColWidth(lines); + var gutter = ' '; + var helpStr = lines.map(function(line) { + if (Array.isArray(line)) { + line = ' ' + utils.rpad(line[0], colWidth, ' ') + gutter + line[1]; + } + return line; + }).join('\n'); + return helpStr; } - // Format help strings, calc width of left column. - colWidth = helpCommands.reduce(function(w, obj) { - var help = cmdPre + (obj.name ? "-" + obj.name : ""); - if (obj.alias) help += ", -" + obj.alias; - obj.help = help; - if (detailView) { - w = obj.options.reduce(function(w, opt) { - if (opt.describe) { - w = Math.max(formatOption(opt), w); - } - return w; - }, w); - } - return Math.max(w, help.length); - }, 0); + function getSingleCommandLines(cmd) { + var lines = []; + // command name + lines.push('Command', getCommandLine(cmd)); - // Layout help display - helpCommands.forEach(function(cmd) { - if (!detailView && cmd.title) { - helpStr += cmd.title; - } - if (detailView) { - helpStr += '\nCommand\n'; - } - helpStr += formatHelpLine(cmd.help, cmd.describe); - if (detailView && cmd.options.length > 0) { - helpStr += '\nOptions\n'; + // options + if (cmd.options.length > 0) { + lines.push('', 'Options'); cmd.options.forEach(function(opt) { - if (opt.help && opt.describe) { - helpStr += formatHelpLine(opt.help, opt.describe); - } + lines = lines.concat(getOptionLines(opt, cmd)); }); } - if (detailView && cmd.examples) { - helpStr += '\nExample' + (cmd.examples.length > 1 ? 's' : ''); // + '\n'; - cmd.examples.forEach(function(ex) { - ex.split('\n').forEach(function(line) { - helpStr += '\n' + exPre + line; + + // examples + if (cmd.examples) { + lines.push('', 'Example' + (cmd.examples.length > 1 ? 's' : '')); + cmd.examples.forEach(function(ex, i) { + if (i > 0) lines.push(''); + ex.split('\n').forEach(function(line, i) { + lines.push(' ' + line); }); - helpStr += '\n'; }); } - }); + return lines; + } - // additional notes for non-detail view - if (!detailView) { + function getOptionLines(opt, cmd) { + var lines = []; + var description = opt.describe; + var label; + if (!description) { + // empty + } else if (opt.label) { + lines.push([opt.label, description]); + } else if (opt.name == cmd.default) { + label = '<' + opt.name + '>'; + lines.push([label, description]); + lines.push([opt.name + '=', 'equivalent to ' + label]); + } else { + label = opt.name; + if (opt.alias) label += ', ' + opt.alias; + if (opt.type != 'flag' && !opt.assign_to) label += '='; + lines.push([label, description]); + } + return lines; + } + + function getCommandLine(cmd) { + var name = cmd.name ? "-" + cmd.name : ''; + if (cmd.alias) name += ', -' + cmd.alias; + return [name, cmd.describe || '(undocumented command)']; + } + + function getMultiCommandLines(commands) { + var lines = []; + // usage + if (_usage) lines.push(_usage); + + // list of commands + commands.forEach(function(cmd) { + if (cmd.title) { + lines.push('', cmd.title); + } else { + lines.push(getCommandLine(cmd)); + } + }); + + // examples if (_examples.length > 0) { - helpStr += "\nExamples\n"; + lines.push('', 'Examples'); _examples.forEach(function(str) { - helpStr += "\n" + str + "\n"; + lines.push('', str); }); } + + // note if (_note) { - helpStr += '\n' + _note; + lines.push('', _note); } + return lines; } - return helpStr; - function formatHelpLine(help, desc) { - return utils.rpad(help, colWidth, ' ') + gutter + (desc || '') + '\n'; - } - - function formatOption(o) { - o.help = optPre; - if (o.label) { - o.help += o.label; - } else { - o.help += o.name; - if (o.alias) o.help += ", " + o.alias; - if (o.type != 'flag' && !o.assign_to) o.help += "="; - } - return o.help.length; + function calcColWidth(lines) { + var w = 0; + lines.forEach(function(line) { + if (Array.isArray(line)) { + w = Math.max(w, line[0].length); + } + }); + return w; } - }; - this.printHelp = function(commands) { - message(this.getHelpMessage(commands)); + this.printHelp = function(command) { + message(this.getHelpMessage(command)); }; function getCommands() { @@ -333,6 +340,23 @@ function CommandParser() { return cmd.done(); }); } + + function tokenIsCommandName(s) { + var cmd = findCommandDefn(s, getCommands()); + return !!cmd; + } + + function findCommandDefn(name, arr) { + return utils.find(arr, function(cmd) { + return cmd.name === name || cmd.alias === name || cmd.old_alias === name; + }); + } + + function findOptionDefn(name, cmdDef) { + return utils.find(cmdDef.options, function(o) { + return o.name === name || o.alias === name; + }); + } } function CommandOptions(name) { @@ -364,6 +388,13 @@ function CommandOptions(name) { return this; }; + // define an alias command name that doesn't appear in command line help + // (to support old versions of renamed commands) + this.oldAlias = function(name) { + _command.old_alias = name; + return this; + }; + this.title = function(str) { _command.title = str; return this; @@ -378,6 +409,8 @@ function CommandOptions(name) { opts = opts || {}; // accept just a name -- some options don't need properties if (!utils.isString(name) || !name) error("Missing option name"); if (!utils.isObject(opts)) error("Invalid option definition:", opts); + // default option -- assign unnamed argument to this option + if (opts.DEFAULT) _command.default = name; opts.name = name; _command.options.push(opts); return this; @@ -388,6 +421,31 @@ function CommandOptions(name) { }; } +// Split comma-delimited list, trim quotes from entire list and +// individual members +internal.parseStringList = function(token) { + var delim = ','; + var list = internal.splitTokens(token, delim); + if (list.length == 1) { + list = internal.splitTokens(list[0], delim); + } + return list; +}; + +// Accept spaces and/or commas as delimiters +internal.parseColorList = function(token) { + var delim = ', '; + var token2 = token.replace(/, *(?=[^(]*\))/g, '~~~'); // kludge: protect rgba() functions from being split apart + var list = internal.splitTokens(token2, delim); + if (list.length == 1) { + list = internal.splitTokens(list[0], delim); + } + list = list.map(function(str) { + return str.replace(/~~~/g, ','); + }); + return list; +}; + internal.cleanArgv = function(argv) { argv = argv.map(function(s) {return s.trim();}); // trim whitespace argv = argv.filter(function(s) {return s !== '';}); // remove empty tokens diff --git a/src/cli/mapshaper-option-validation.js b/src/cli/mapshaper-option-validation.js index 561cf5f6c..ea3cdc38a 100644 --- a/src/cli/mapshaper-option-validation.js +++ b/src/cli/mapshaper-option-validation.js @@ -1,21 +1,19 @@ -/* @requires mapshaper-common, mapshaper-file-types, mapshaper-option-parser */ +/* @requires mapshaper-common, mapshaper-file-types, mapshaper-option-parser, mapshaper-units */ -function validateHelpOpts(cmd) { - var commands = validateCommaSepNames(cmd._[0]); - if (commands) { - cmd.options.commands = commands; - } -} - function validateInputOpts(cmd) { var o = cmd.options, _ = cmd._; - if (_[0] == '-' || _[0] == '/dev/stdin') { - o.stdin = true; - } else if (_.length > 0) { - o.files = cli.expandInputFiles(_); + if (_.length > 0 && !o.files) { + o.files = _; + } + if (o.files) { + o.files = cli.expandInputFiles(o.files); + if (o.files[0] == '-' || o.files[0] == '/dev/stdin') { + delete o.files; + o.stdin = true; + } } if ("precision" in o && o.precision > 0 === false) { @@ -39,15 +37,15 @@ function validateSimplifyOpts(cmd) { } } - var intervalStr = o.interval; - if (intervalStr) { - o.interval = Number(intervalStr); - if (o.interval >= 0 === false) { - error(utils.format("Out-of-range interval value: %s", intervalStr)); - } - } + // var intervalStr = o.interval; + // if (intervalStr) { + // o.interval = Number(intervalStr); + // if (o.interval >= 0 === false) { + // error(utils.format("Out-of-range interval value: %s", intervalStr)); + // } + // } - if (isNaN(o.interval) && !utils.isNumber(o.percentage) && !o.resolution) { + if (!o.interval && !o.percentage && !o.resolution) { error("Command requires an interval, percentage or resolution parameter"); } } @@ -66,38 +64,23 @@ function validateProjOpts(cmd) { }); if (proj4.length > 0) { - cmd.options.projection = proj4.join(' '); + cmd.options.crs = proj4.join(' '); } else if (_.length > 0) { - cmd.options.projection = _.shift(); + cmd.options.crs = _.shift(); } if (_.length > 0) { error("Received one or more unexpected parameters: " + _.join(', ')); } - if (!cmd.options.projection) { - error("Missing projection data"); - } -} -function validateJoinOpts(cmd) { - var o = cmd.options; - o.source = o.source || cmd._[0]; - if (!o.source) { - error("Command requires the name of a layer or file to join"); + if (!(cmd.options.crs || cmd.options.match || cmd.options.from)) { + stop("Missing projection data"); } } -function validateSplitOpts(cmd) { - if (cmd._.length == 1) { - cmd.options.field = cmd._[0]; - } -} function validateClipOpts(cmd) { var opts = cmd.options; - if (cmd._[0]) { - opts.source = cmd._[0]; - } // rename old option if (opts.cleanup) { delete opts.cleanup; @@ -108,22 +91,6 @@ function validateClipOpts(cmd) { } } -function validateDissolveOpts(cmd) { - var _= cmd._, - o = cmd.options; - if (_.length == 1) { - o.field = _[0]; - } -} - -function validateMergeLayersOpts(cmd) { - if (cmd._.length > 0) error("Unexpected option:", cmd._); -} - -function validateRenameLayersOpts(cmd) { - cmd.options.names = validateCommaSepNames(cmd._[0]) || null; -} - function validateGridOpts(cmd) { var o = cmd.options; if (cmd._.length == 1) { @@ -133,35 +100,10 @@ function validateGridOpts(cmd) { } } -function validateLinesOpts(cmd) { - try { - var fields = validateCommaSepNames(cmd.options.fields || cmd._[0]); - if (fields) cmd.options.fields = fields; - } catch (e) { - error("Command takes a comma-separated list of fields"); - } -} - -function validateSubdivideOpts(cmd) { - if (cmd._.length !== 1) { +function validateExpressionOpt(cmd) { + if (!cmd.options.expression) { error("Command requires a JavaScript expression"); } - cmd.options.expression = cmd._[0]; -} - -function validateFilterFieldsOpts(cmd) { - try { - var fields = validateCommaSepNames(cmd._[0]); - cmd.options.fields = fields || []; - } catch(e) { - error("Command requires a comma-sep. list of fields"); - } -} - -function validateExpressionOpts(cmd) { - if (cmd._.length == 1) { - cmd.options.expression = cmd._[0]; - } } function validateOutputOpts(cmd) { @@ -218,6 +160,10 @@ function validateOutputOpts(cmd) { o.encoding = internal.validateEncoding(o.encoding); } + if (o.field_order && o.field_order != 'ascending') { + error('Unsupported field order:', o.field_order); + } + // topojson-specific if ("quantization" in o && o.quantization > 0 === false) { error("quantization= option should be a nonnegative integer"); @@ -227,17 +173,3 @@ function validateOutputOpts(cmd) { error("topojson-precision= option should be a positive number"); } } - -// Convert a comma-separated string into an array of trimmed strings -// Return null if list is empty -function validateCommaSepNames(str, min) { - if (!min && !str) return null; // treat - if (!utils.isString(str)) { - error("Expected a comma-separated list; found:", str); - } - var parts = str.split(',').map(utils.trim).filter(function(s) {return !!s;}); - if (min && min > parts.length < min) { - error(utils.format("Expected a list of at least %d member%s; found: %s", min, utils.pluralSuffix(min), str)); - } - return parts.length > 0 ? parts : null; -} diff --git a/src/cli/mapshaper-options.js b/src/cli/mapshaper-options.js index e212fc6ed..d37528bf0 100644 --- a/src/cli/mapshaper-options.js +++ b/src/cli/mapshaper-options.js @@ -25,14 +25,13 @@ internal.getOptionParser = function() { encodingOpt = { describe: "text encoding (applies to .dbf and delimited text files)" }, - autoSnapOpt = { - alias: "snap", - describe: "snap nearly identical points to fix minor topology errors", - type: "flag" - }, snapIntervalOpt = { - describe: "specify snapping distance in source units", - type: "number" + describe: "snapping distance in source units (default is tiny)", + type: "distance" + }, + minGapAreaOpt = { + describe: "smaller gaps than this are filled (default is small)", + type: "area" }, sumFieldsOpt = { describe: "fields to sum when dissolving (comma-sep. list)", @@ -42,13 +41,38 @@ internal.getOptionParser = function() { describe: "fields to copy when dissolving (comma-sep. list)", type: "strings" }, - dissolveFieldOpt = { - label: "", - describe: "(optional) name of a data field to dissolve on" + dissolveFieldsOpt = { + DEFAULT: true, + type: "strings", + describe: "(optional) field or fields to dissolve on (comma-sep. list)" + }, + fieldTypesOpt = { + describe: "type hints for csv source files, e.g. FIPS:str,STATE_FIPS:str", + type: "strings" + }, + stringFieldsOpt = { + describe: "csv field(s) to import as strings, e.g. FIPS,ZIPCODE", + type: "strings" }, bboxOpt = { type: "bbox", describe: "comma-sep. bounding box: xmin,ymin,xmax,ymax" + }, + whereOpt = { + describe: "use a JS expression to select a subset of features" + }, + whereOpt2 = { + describe: "use a JS expression to filter lines (using A and B)" + }, + eachOpt2 = { + describe: "apply a JS expression to each line (using A and B)" + }, + aspectRatioOpt = { + describe: "aspect ratio as a number or range (e.g. 2 0.8,1.6 ,2)" + }, + offsetOpt = { + describe: "padding as distance or pct of h/w (single value or list)", + type: "distance" }; var parser = new CommandParser(); @@ -56,7 +80,7 @@ internal.getOptionParser = function() { /* parser.example("Fix minor topology errors, simplify to 10%, convert to GeoJSON\n" + - "$ mapshaper states.shp auto-snap -simplify 10% -o format=geojson"); + "$ mapshaper states.shp snap -simplify 10% -o format=geojson"); parser.example("Aggregate census tracts to counties\n" + "$ mapshaper tracts.shp -each \"CTY_FIPS=FIPS.substr(0, 5)\" -dissolve CTY_FIPS"); @@ -73,17 +97,18 @@ internal.getOptionParser = function() { .validate(validateInputOpts) .flag("multi_arg") .option("files", { - label: "", - describe: "files to import (separated by spaces), or - to use stdin" - }) - .option("merge-files", { - describe: "merge features from compatible files into the same layer", - type: "flag" + DEFAULT: true, + type: "strings", + describe: "one or more files to import, or - to use stdin" }) .option("combine-files", { describe: "import files to separate layers with shared topology", type: "flag" }) + .option("merge-files", { + // describe: "merge features from compatible files into the same layer", + type: "flag" + }) .option("no-topology", { describe: "treat each shape as topologically independent", type: "flag" @@ -92,7 +117,11 @@ internal.getOptionParser = function() { describe: "coordinate precision in source units, e.g. 0.001", type: "number" }) - .option("auto-snap", autoSnapOpt) + .option("snap", { + type: 'flag', + describe: "snap nearly identical points to fix minor topology errors" + }) + .option("auto-snap", {alias_to: 'snap'}) .option("snap-interval", snapIntervalOpt) .option("encoding", encodingOpt) /* @@ -103,40 +132,53 @@ internal.getOptionParser = function() { .option("id-field", { describe: "import Topo/GeoJSON id property to this field" }) - .option("field-types", { - describe: "type hints for csv files, e.g. FIPS:str,STATE_FIPS:str", - type: "strings" - }) + .option("string-fields", stringFieldsOpt) + .option("field-types", fieldTypesOpt) .option("name", { describe: "Rename the imported layer(s)" + }) + .option("geometry-type", { + // undocumented; GeoJSON import rejects all but one kind of geometry + // describe: "[GeoJSON] Import one kind of geometry (point|polygon|polyline)" + }) + .option("json-path", { + // describe: path to an array of data values + }) + .option("csv-filter", { + describe: "[CSV] JS expression for filtering records" + }) + .option("csv-fields", { + type: 'strings', + describe: "[CSV] comma-sep. list of fields to import" }); parser.command('o') .describe("output edited content") .validate(validateOutputOpts) .option('_', { - label: "", - describe: "(optional) name of output file or directory, or - for stdout" + label: "", + describe: "(optional) name of output file or directory, - for stdout" }) .option("format", { describe: "options: shapefile,geojson,topojson,json,dbf,csv,tsv,svg" }) .option("target", targetOpt) .option("force", { - // obsolete option, triggers warning + describe: "allow overwriting input files", type: "flag" }) .option("dry-run", { // describe: "do not output any files" type: "flag" }) - .option("encoding", { - describe: "text encoding of output dbf file" - }) .option("ldid", { // describe: "language driver id of dbf file", type: "number" }) + .option("precision", { + describe: "coordinate precision in source units, e.g. 0.001", + type: "number" + }) .option("bbox-index", { describe: "export a .json file with bbox of each layer", type: 'flag' @@ -149,9 +191,11 @@ internal.getOptionParser = function() { describe: "remove data attributes from output", type: "flag" }) - .option("precision", { - describe: "coordinate precision in source units, e.g. 0.001", - type: "number" + .option("encoding", { + describe: "(Shapefile/CSV) text encoding (default is utf8)" + }) + .option("field-order", { + describe: "(Shapefile/CSV) field-order=ascending sorts columns A-Z" }) .option("id-field", { describe: "(Topo/GeoJSON/SVG) field to use for id property", @@ -164,13 +208,12 @@ internal.getOptionParser = function() { .option("extension", { describe: "(Topo/GeoJSON) set file extension (default is \".json\")" }) - .option("prettify", { type: "flag", describe: "(Topo/GeoJSON) format output for readability" }) .option("singles", { - // describe: "(TopoJSON) save each layer as a single file", + describe: "(TopoJSON) save each target layer as a separate file", type: "flag" }) .option("quantization", { @@ -178,7 +221,11 @@ internal.getOptionParser = function() { type: "integer" }) .option("no-quantization", { - describe: "(TopoJSON) export arc coordinates without quantization", + describe: "(TopoJSON) export coordinates without quantization", + type: "flag" + }) + .option("no-point-quantization", { + // describe: "(TopoJSON) export point coordinates without quantization", type: "flag" }) .option('presimplify', { @@ -189,40 +236,79 @@ internal.getOptionParser = function() { // describe: "pct of avg segment length for rounding (0.02 is default)", type: "number" }) + .option("rfc7946", { + describe: "(GeoJSON) follow RFC 7946 (CCW outer ring order, etc.)", + type: "flag" + }) .option("combine-layers", { describe: "(GeoJSON) output layers as a single file", type: "flag" }) + .option("geojson-type", { + describe: "(GeoJSON) FeatureCollection, GeometryCollection or Feature" + }) .option("width", { - describe: "(SVG) width of the SVG viewport (default is 800)", + describe: "(SVG/TopoJSON) pixel width of output (SVG default is 800)", + type: "number" + }) + .option("height", { + describe: "(SVG/TopoJSON) pixel height of output (optional)", + type: "number" + }) + .option("max-height", { + describe: "(SVG/TopoJSON) max pixel height of output (optional)", type: "number" }) .option("margin", { - describe: "(SVG) margin between data and viewport bounds (default is 1)", + describe: "(SVG/TopoJSON) space betw. data and viewport (default is 1)" + }) + .option("pixels", { + describe: "(SVG/TopoJSON) output area in pixels (alternative to width=)", + type: "number" + }) + .option("svg-scale", { + describe: "(SVG) source units per pixel (alternative to width= option)", type: "number" }) .option("point-symbol", { describe: "(SVG) circle or square (default is circle)" }) - .option("svg-scale", { - // describe: "(SVG) data units (e.g. meters) per pixel" - type: "number" + .option("id-prefix", { + describe: "(SVG) prefix for namespacing layer and feature ids" }) .option("delimiter", { describe: "(CSV) field delimiter" }) .option("final", { type: "flag" // for testing + }) + .option("metadata", { + // describe: "(TopoJSON) add a metadata object", + type: "flag" }); - parser.section("\nEditing commands"); + parser.section("Editing commands"); + + parser.command("clean") + .describe("repairs overlaps and small gaps in polygon layers") + .option("min-gap-area", minGapAreaOpt) + .option("snap-interval", snapIntervalOpt) + .option("no-snap", noSnapOpt) + .option("allow-empty", { + describe: 'allow null geometries (removed by default)', + type: 'flag' + }) + .option("no-arc-dissolve", { + type: 'flag' // no description + }) + .option("target", targetOpt); parser.command("clip") .describe("use a polygon layer to clip another layer") .example("$ mapshaper states.shp -clip land_area.shp -o clipped.shp") .validate(validateClipOpts) .option("source", { - label: "", + DEFAULT: true, describe: "file or layer containing clip polygons" }) .option('remove-slivers', { @@ -237,14 +323,14 @@ internal.getOptionParser = function() { .option("target", targetOpt); parser.command("dissolve") - .validate(validateDissolveOpts) - .describe("merge polygon or point features") + .describe("merge features within a layer") .example("Dissolve all polygons in a feature layer into a single polygon\n" + "$ mapshaper states.shp -dissolve -o country.shp") .example("Generate state-level polygons by dissolving a layer of counties\n" + "(STATE_FIPS, POPULATION and STATE_NAME are attribute field names)\n" + "$ mapshaper counties.shp -dissolve STATE_FIPS copy-fields=STATE_NAME sum-fields=POPULATION -o states.shp") - .option("field", dissolveFieldOpt) + .option("field", {}) // old arg handled by dissolve function + .option("fields", dissolveFieldsOpt) .option("calc", { describe: "use a JS expression to aggregate data values" }) @@ -262,31 +348,43 @@ internal.getOptionParser = function() { .option("target", targetOpt); parser.command("dissolve2") - .validate(validateDissolveOpts) - .describe("merge adjacent and overlapping polygons") - .option("field", dissolveFieldOpt) + .describe("merge adjacent polygons (repairs overlaps and gaps)") + .option("field", {}) // old arg handled by dissolve function + .option("fields", dissolveFieldsOpt) .option("calc", { describe: "use a JS expression to aggregate data values" }) .option("sum-fields", sumFieldsOpt) .option("copy-fields", copyFieldsOpt) + .option("min-gap-area", minGapAreaOpt) .option("name", nameOpt) .option("no-replace", noReplaceOpt) .option("no-snap", noSnapOpt) .option("target", targetOpt); + parser.command("drop") + .describe("delete layer(s) or elements within the target layer(s)") + .flag('no_arg') // prevent trying to pass a list of layer names as default option + .option("geometry", { + describe: "delete all geometry from the target layer(s)", + type: "flag" + }) + .option("fields", { + type: "strings", + describe: "delete a list of attribute data fields, e.g. 'id,name' '*'" + }) + .option("target", targetOpt); + + parser.command("each") .describe("create/update/delete data fields using a JS expression") .example("Add two calculated data fields to a layer of U.S. counties\n" + "$ mapshaper counties.shp -each 'STATE_FIPS=CNTY_FIPS.substr(0, 2), AREA=$.area'") - .validate(validateExpressionOpts) .option("expression", { - label: "", + DEFAULT: true, describe: "JS expression to apply to each target feature" }) - .option("where", { - describe: "use a JS expression to select a subset of features" - }) + .option("where", whereOpt) .option("target", targetOpt); parser.command("erase") @@ -294,7 +392,7 @@ internal.getOptionParser = function() { .example("$ mapshaper land_areas.shp -erase water_bodies.shp -o erased.shp") .validate(validateClipOpts) .option("source", { - label: "", + DEFAULT: true, describe: "file or layer containing erase polygons" }) .option('remove-slivers', { @@ -315,9 +413,8 @@ internal.getOptionParser = function() { parser.command("filter") .describe("delete features using a JS expression") - .validate(validateExpressionOpts) .option("expression", { - label: "", + DEFAULT: true, describe: "delete features that evaluate to false" }) .option("remove-empty", { @@ -327,25 +424,32 @@ internal.getOptionParser = function() { .option("keep-shapes", { type: "flag" }) + .option("cleanup", {type: 'flag'}) // TODO: document .option("name", nameOpt) .option("no-replace", noReplaceOpt) .option("target", targetOpt); parser.command("filter-fields") .describe('retain a subset of data fields') - .validate(validateFilterFieldsOpts) .option("fields", { - label: "", + DEFAULT: true, + type: "strings", describe: "fields to retain (comma-sep.), e.g. 'fips,name'" }) .option("target", targetOpt); + parser.command("filter-geom") + .describe("") + .option("bbox", { + type: "bbox", + describe: "remove non-intersecting geometry (xmin,ymin,xmax,ymax)" + }) + .option("target", targetOpt); + parser.command("filter-islands") .describe("remove small detached polygon rings (islands)") - .validate(validateExpressionOpts) - .option("min-area", { - type: "number", + type: "area", describe: "remove small-area islands (sq meters or projected units)" }) .option("min-vertices", { @@ -360,12 +464,14 @@ internal.getOptionParser = function() { parser.command("filter-slivers") .describe("remove small polygon rings") - .validate(validateExpressionOpts) - .option("min-area", { - type: "number", + type: "area", describe: "remove small-area rings (sq meters or projected units)" }) + .option("weighted", { + type: "flag", + describe: "multiply min-area by Polsby-Popper compactness (0-1)" + }) /* .option("remove-empty", { type: "flag", @@ -380,42 +486,50 @@ internal.getOptionParser = function() { parser.command("innerlines") .describe("convert polygons to polylines along shared edges") .flag('no_arg') + .option("where", whereOpt2) + // .option("each", eachOpt2) .option("name", nameOpt) .option("no-replace", noReplaceOpt) .option("target", targetOpt); + parser.command("intersect") + // .describe("convert polygons to polylines along shared edges") + .option("no-replace", noReplaceOpt) + .option("target", targetOpt); + parser.command("join") .describe("join data records from a file or layer to a layer") - .example("Join a csv table to a Shapefile\n" + - "(The :str suffix prevents FIPS field from being converted from strings to numbers)\n" + - "$ mapshaper states.shp -join data.csv keys=STATE_FIPS,FIPS -field-types=FIPS:str -o joined.shp") - .validate(validateJoinOpts) + .example("Join a csv table to a Shapefile (don't auto-convert FIPS column to numbers)\n" + + "$ mapshaper states.shp -join data.csv keys=STATE_FIPS,FIPS string-fields=FIPS -o joined.shp") + .validate(function(cmd) { + if (!cmd.options.source) { + error("Command requires the name of a layer or file to join"); + } + }) .option("source", { - label: "", + DEFAULT: true, describe: "file or layer containing data records" }) .option("keys", { - describe: "join by matching target,source key fields; e.g. keys=FIPS,GEOID", + describe: "join by matching target,source key fields; e.g. keys=FIPS,ID", type: "strings" }) - .option("fields", { - describe: "fields to join, e.g. fields=FIPS,POP (default is all fields)", - type: "strings" + .option("calc", { + describe: "use a JS expression to assign values in many-to-one joins" + }) + .option("where", { + describe: "use a JS expression to filter source records" }) - .option("field-types", { - describe: "type hints for csv source files, e.g. FIPS:str,STATE_FIPS:str", + .option("fields", { + describe: "fields to copy (comma-sep.) (default is all but key field)", type: "strings" }) + .option("string-fields", stringFieldsOpt) + .option("field-types", fieldTypesOpt) .option("sum-fields", { - describe: "fields to sum when multiple source records match the same target", + describe: "fields to sum in a many-to-one join (or use calc= for this)", type: "strings" }) - .option("calc", { - describe: "use a JS expression to calculate values for many-to-one joins" - }) - .option("where", { - describe: "use a JS expression to filter source records" - }) .option("force", { describe: "replace values from same-named fields", type: "flag" @@ -433,22 +547,31 @@ internal.getOptionParser = function() { parser.command("lines") .describe("convert polygons to polylines, classified by edge type") - .validate(validateLinesOpts) .option("fields", { - label: "", + DEFAULT: true, describe: "optional comma-sep. list of fields to create a hierarchy", type: "strings" }) + .option("where", whereOpt2) + .option("each", eachOpt2) .option("name", nameOpt) .option("no-replace", noReplaceOpt) .option("target", targetOpt); parser.command("merge-layers") .describe("merge multiple layers into as few layers as possible") - .validate(validateMergeLayersOpts) + .flag('no_arg') + .option("force", { + type: "flag", + describe: "merge layers with inconsistent data fields" + }) .option("name", nameOpt) .option("target", targetOpt); + parser.command("mosaic") + .option("debug", {type: "flag"}) + .option("target", targetOpt); + parser.command("point-grid") .describe("create a rectangular grid of points") .validate(validateGridOpts) @@ -458,7 +581,7 @@ internal.getOptionParser = function() { }) .option('interval', { describe: 'distance between adjacent points, in source units', - type: 'number' + type: 'distance' }) .option("cols", { type: "integer" @@ -473,7 +596,7 @@ internal.getOptionParser = function() { .option("name", nameOpt); parser.command("points") - .describe("create a point layer from polygons or attribute data") + .describe("create a point layer from a different layer type") .flag("no_arg") .option("x", { describe: "field containing x coordinate" @@ -489,48 +612,110 @@ internal.getOptionParser = function() { describe: "create a centroid point for each polygon's largest ring", type: "flag" }) + .option("vertices", { + describe: "capture unique vertices of polygons and polylines", + type: "flag" + }) + .option("vertices2", { + describe: "like vertices, but without removal of duplicate coordinates", + type: "flag" + }) + .option("endpoints", { + describe: "capture unique endpoints of polygons and polylines", + type: "flag" + }) + // WORK IN PROGRESS todo: create a point layer containing segment intersections + .option("intersections", { + // describe: "capture line segment intersections of polygons and polylines", + type: "flag" + }) + .option("interpolated", { + describe: "interpolate points along polylines; requires interval=", + type: "flag" + }) + .option("interval", { + describe: "distance between interpolated points (meters or projected units)", + type: "distance" + }) .option("name", nameOpt) .option("no-replace", noReplaceOpt) .option("target", targetOpt); + parser.command("polygon-grid") + // .describe("create a rectangular grid of cells") + .validate(validateGridOpts) + .option("-", { + label: "", + describe: "size of the grid, e.g. -point-grid 100,100" + }) + .option('interval', { + describe: 'distance between adjacent points, in source units', + type: 'number' + }) + .option("cols", { + type: "integer" + }) + .option("rows", { + type: "integer" + }) + .option('bbox', { + type: "bbox", + describe: "xmin,ymin,xmax,ymax (default is bbox of data)" + }) + .option("name", nameOpt); + parser.command("proj") - .describe("project a dataset using a proj4 string or alias") + .describe("project your data (using Proj.4)") .flag("multi_arg") + .option("crs", { + DEFAULT: true, + describe: "set destination CRS using a Proj.4 definition or alias" + }) + .option("projection", { + alias_to: 'crs' + }) + .option("match", { + describe: "set destination CRS using a .prj file or layer id" + }) + .option("source", { + // describe: "(deprecated) alias for match", + alias_to: "match" + }) + .option("from", { + describe: "set source CRS (if unset) using a string, .prj or layer id" + }) .option("densify", { type: "flag", describe: "add points along straight segments to approximate curves" }) - .option("from", { - describe: "define the source projection" - }) + .option("target", targetOpt) .validate(validateProjOpts); parser.command("rename-fields") .describe('rename data fields') - .validate(validateFilterFieldsOpts) .option("fields", { - label: "", + DEFAULT: true, + type: "strings", describe: "fields to rename (comma-sep.), e.g. 'fips=STATE_FIPS,st=state'" }) .option("target", targetOpt); parser.command("rename-layers") .describe("assign new names to layers") - .validate(validateRenameLayersOpts) .option("names", { - label: "", + DEFAULT: true, type: "strings", describe: "new layer name(s) (comma-sep. list)" }) .option("target", targetOpt); - parser.command('simplify') + parser.command("simplify") .validate(validateSimplifyOpts) .example("Retain 10% of removable vertices\n$ mapshaper input.shp -simplify 10%") .describe("simplify the geometry of polygon and polyline features") .option('percentage', { + DEFAULT: true, alias: 'p', - label: "", type: 'percent', describe: "percentage of removable points to retain, e.g. 10%" }) @@ -560,7 +745,7 @@ internal.getOptionParser = function() { .option("interval", { // alias: "i", describe: "output resolution as a distance (e.g. 100)", - type: "number" + type: "distance" }) /* .option("value", { @@ -569,13 +754,16 @@ internal.getOptionParser = function() { type: "number" }) */ + .option("variable", { + describe: "expect an expression with interval=, percentage= or resolution=", + type: "flag" + }) .option("planar", { describe: "simplify decimal degree coords in 2D space (default is 3D)", type: "flag" }) .option("cartesian", { - describe: "(deprecated) alias for planar", - type: "flag", + // describe: "(deprecated) alias for planar", alias_to: "planar" }) .option("keep-shapes", { @@ -593,13 +781,14 @@ internal.getOptionParser = function() { .option("stats", { describe: "display simplification statistics", type: "flag" - }); + }) + .option("target", targetOpt); + parser.command("slice") // .describe("slice a layer using polygons in another layer") - .validate(validateClipOpts) .option("source", { - label: "", + DEFAULT: true, describe: "file or layer containing clip polygons" }) /* @@ -617,9 +806,8 @@ internal.getOptionParser = function() { parser.command("sort") .describe("sort features using a JS expression") - .validate(validateExpressionOpts) .option("expression", { - label: "", + DEFAULT: true, describe: "JS expression to generate a sort key for each feature" }) .option("ascending", { @@ -634,9 +822,8 @@ internal.getOptionParser = function() { parser.command("split") .describe("split features into separate layers using a data field") - .validate(validateSplitOpts) .option("field", { - label: '', + DEFAULT: true, describe: "name of an attribute field (omit to split all features)" }) .option("no-replace", noReplaceOpt) @@ -661,13 +848,15 @@ internal.getOptionParser = function() { // .option("no-replace", noReplaceOpt) .option("target", targetOpt); - parser.command("svg-style") - .describe("set SVG style using JS expressions or literal values") + parser.command("style") + .oldAlias("svg-style") + .describe("set SVG style properties using JS or literal values") + .option("where", whereOpt) .option("class", { - describe: 'name of CSS class or classes (space sep.)' + describe: 'name of CSS class or classes (space-separated)' }) .option("fill", { - describe: 'fill color, examples: #eee pink rgba(0, 0, 0, 0.2)' + describe: 'fill color; examples: #eee pink rgba(0, 0, 0, 0.2)' }) .option("stroke", { describe: 'stroke color' @@ -675,33 +864,77 @@ internal.getOptionParser = function() { .option("stroke-width", { describe: 'stroke width' }) + .option("stroke-dasharray", { + describe: 'stroke dashes. Examples: "4" "2 4"' + }) .option("opacity", { - describe: 'opacity, example: 0.5' + describe: 'opacity; example: 0.5' }) .option("r", { - describe: 'radius of circle symbols', + describe: 'symbol radius (set this to export points as circles)', }) - .option("target", targetOpt); + .option("label-text", { + describe: 'label text (set this to export points as labels)' + }) + .option("point-text", { + describe: 'point symbol text (a text symbol replaces path or circle)' + }) + .option("text-anchor", { + describe: 'label alignment; one of: start, end, middle (default)' + }) + .option("dx", { + describe: 'x offset of labels (default is 0)' + }) + .option("dy", { + describe: 'y offset of labels (default is 0/baseline-aligned)' + }) + .option("font-size", { + describe: 'size of label text (default is 12)' + }) + .option("font-family", { + describe: 'CSS font family of labels (default is sans-serif)' + }) + .option("font-weight", { + describe: 'CSS font weight property of labels (e.g. bold, 700)' + }) + .option("font-style", { + describe: 'CSS font style property of labels (e.g. italic)' + }) + .option("letter-spacing", { + describe: 'CSS letter-spacing property of labels' + }) + .option("line-height", { + describe: 'line spacing of multi-line labels (default is 1.1em)' + }) + .option("target", targetOpt); parser.command("target") - .describe("set active layer") - .validate(function(cmd) { - if (!cmd.options.target && cmd._.length) { - cmd.options.target = cmd._.shift(); - } - }) + .describe("set active layer (or layers)") .option("target", { - label: "", + DEFAULT: true, describe: "name or index of layer to target" + }) + .option('type', { + describe: "type of layer to target (polygon|polyline|point)" + }) + .option("name", { + describe: 'rename the target layer' }); parser.command("uniq") .describe("delete features with the same id as a previous feature") - .validate(validateExpressionOpts) .option("expression", { - label: "", + DEFAULT: true, describe: "JS expression to obtain the id of a feature" }) + .option("max-count", { + type: "number", + describe: "max features with the same id (default is 1)" + }) + .option("invert", { + type: "flag", + describe: "retain only features that would have been deleted" + }) .option("verbose", { describe: "print each removed feature", type: "flag" @@ -710,13 +943,13 @@ internal.getOptionParser = function() { // Experimental commands - parser.section("\nExperimental commands (may give unexpected results)"); + parser.section("Experimental commands (may give unexpected results)"); parser.command("affine") .describe("transform coordinates by shifting, scaling and rotating") .flag("no_args") .option("shift", { - type: 'numbers', + type: 'strings', describe: "x,y offsets in source units (e.g. 5000,-5000)" }) .option("scale", { @@ -731,17 +964,9 @@ internal.getOptionParser = function() { type: 'numbers', describe: "center of rotation/scaling (default is center of selected shapes)" }) - .option("where", { - describe: "use a JS expression to select a subset of features" - }) - .option("target", targetOpt); - - - // Work-in-progress (no .describe(), so hidden from -h) - parser.command("clean") + .option("where", whereOpt) .option("target", targetOpt); - parser.command("cluster") .describe("group polygons into compact clusters") .option("id-field", { @@ -770,7 +995,7 @@ internal.getOptionParser = function() { .option("target", targetOpt); parser.command("colorizer") - .describe("Define a function to convert data values to color classes") + .describe("define a function to convert data values to color classes") .flag("no_arg") .option("colors", { describe: "comma-separated list of CSS colors", @@ -796,7 +1021,10 @@ internal.getOptionParser = function() { .option("precision", { describe: "rounding precision to apply before classification (e.g. 0.1)", type: "number" - }); + }) + .example('Define a sequential color scheme and use it to create a new field\n' + + '$ mapshaper data.json -colorizer name=getColor nodata=#eee breaks=20,40 \\\n' + + ' colors=#e0f3db,#a8ddb5,#43a2ca -each "fill = getColor(RATING)" -o output.json'); parser.command("data-fill") // .describe("interpolate missing values by copying from neighbor polygons") @@ -808,19 +1036,143 @@ internal.getOptionParser = function() { type: "flag" }); + parser.command("frame") + // .describe("create a map frame at a given size") + .option("bbox", { + describe: "frame coordinates (xmin,ymin,xmax,ymax)", + type: "bbox" + }) + .option("offset", offsetOpt) + .option("width", { + describe: "pixel width of output (default is 800)" + }) + .option("height", { + describe: "pixel height of output (may be a range)" + }) + .option("pixels", { + describe: "area of output in pixels (alternative to width and height)", + type: "number" + }) + .option("source", { + describe: "name of layer to enclose" + }) + .option("name", nameOpt); + + parser.command("include") + .describe("import JS data and functions for use in JS expressions") + .option("file", { + DEFAULT: true, + describe: 'file containing a JS object with key:value pairs to import' + }); + + parser.command("fuzzy-join") + .describe("join points to polygons, with data fill and fuzzy match") + .option("source", { + DEFAULT: true, + describe: "file or layer containing data records" + }) + .option("field", { + describe: "field to join" + }) + .option("dedup-points", { + describe: "uniqify points with the same location and field value", + type: "flag" + }) + .option("target", targetOpt); + + parser.command("polygons") + .describe("convert polylines to polygons") + .option("gap-tolerance", { + describe: "specify gap tolerance in source units", + type: "distance" + }) + .option("target", targetOpt); + + parser.command("rectangle") + .describe("create a rectangle from a bbox or target layer extent") + .option("bbox", { + describe: "rectangle coordinates (xmin,ymin,xmax,ymax)", + type: "bbox" + }) + .option("offset", offsetOpt) + .option("aspect-ratio", aspectRatioOpt) + .option("source", { + describe: "name of layer to enclose" + }) + .option("name", nameOpt) + .option("no-replace", noReplaceOpt) + .option("target", targetOpt); + + parser.command("rectangles") + .describe("create a rectangle around each feature in the target layer") + .option("offset", offsetOpt) + .option("aspect-ratio", aspectRatioOpt) + .option("name", nameOpt) + .option("no-replace", noReplaceOpt) + .option("target", targetOpt); + + parser.command("require") + .describe("require a Node module for use in -each expressions") + .option("module", { + DEFAULT: true, + describe: "name of Node module or path to module file" + }) + .option("alias", { + describe: "Set the module name to an alias" + }) + .option("init", { + describe: "JS expression to run after the module loads" + }); + + parser.command("run") + .describe("create commands on-the-fly and run them") + .option("include", { + // TODO: remove this option + }) + .option("commands", { + DEFAULT: true, + describe: "command string or JS expresson to generate command(s)" + }) + .option("target", targetOpt); + + parser.command("scalebar") + // .describe() + .option("top", {}) + .option("right", {}) + .option("bottom", {}) + .option("left", {}) + .option("font-size", {}) + // .option("font-family", {}) + .option("label-position", {}) // top or bottom + .option("label-text", {}); + + parser.command("shape") + .describe("create a polyline or polygon from coordinates") + .option("coordinates", { + describe: "list of vertices as x,y,x,y...", + type: "numbers" + }) + .option("offsets", { + describe: "list of vertices as offsets from coordinates list", + type: "numbers" + }) + .option("closed", { + describe: "close an open path to create a polygon", + type: "flag" + }) + .option("name", nameOpt); parser.command("subdivide") .describe("recursively split a layer using a JS expression") - .validate(validateSubdivideOpts) + .validate(validateExpressionOpt) .option("expression", { - label: "", + DEFAULT: true, describe: "boolean JS expression" }) - // .option("no-replace", noReplaceOpt) .option("target", targetOpt); - parser.section("\nInformational commands"); + parser.section("Informational commands"); parser.command("calc") .describe("calculate statistics about the features in a layer") @@ -828,19 +1180,12 @@ internal.getOptionParser = function() { "$ mapshaper polygons.shp -calc 'sum($.area)'") .example("Count census blocks in NY with zero population\n" + "$ mapshaper ny-census-blocks.shp -calc 'count()' where='POPULATION == 0'") - .validate(function(cmd) { - if (cmd._.length === 0) { - error("Missing a JS expression"); - } - validateExpressionOpts(cmd); - }) + .validate(validateExpressionOpt) .option("expression", { - label: "", + DEFAULT: true, describe: "functions: sum() average() median() max() min() count()" }) - .option("where", { - describe: "use a JS expression to select a subset of features" - }) + .option("where", whereOpt) .option("target", targetOpt); parser.command('encodings') @@ -848,11 +1193,9 @@ internal.getOptionParser = function() { parser.command('help') .alias('h') - .validate(validateHelpOpts) .describe("print help; takes optional command name") - .option("commands", { - label: "", - type: "strings", + .option("command", { + DEFAULT: true, describe: "view detailed information about a command" }); @@ -862,15 +1205,11 @@ internal.getOptionParser = function() { parser.command('inspect') .describe("print information about a feature") .option("expression", { - label: "", + DEFAULT: true, describe: "boolean JS expression for selecting a feature" }) .option("target", targetOpt) - .validate(function(cmd) { - if (cmd._.length > 0) { - cmd.options.expression = cmd._[0]; - } - }); + .validate(validateExpressionOpt); parser.command('projections') .describe("print list of supported projections"); @@ -885,7 +1224,7 @@ internal.getOptionParser = function() { .alias('v') .describe("print mapshaper version"); - parser.command('tracing'); + parser.command('debug'); /* parser.command("divide") diff --git a/src/cli/mapshaper-parse-commands.js b/src/cli/mapshaper-parse-commands.js index 1ab698436..4567cd043 100644 --- a/src/cli/mapshaper-parse-commands.js +++ b/src/cli/mapshaper-parse-commands.js @@ -17,19 +17,19 @@ internal.parseCommands = function(tokens) { // Parse a command line string for the browser console internal.parseConsoleCommands = function(raw) { + var blocked = ['i', 'include', 'require']; var str = raw.replace(/^mapshaper\b/, '').trim(); var parsed; if (/^[a-z]/.test(str)) { // add hyphen prefix to bare command str = '-' + str; } - if (utils.contains(internal.splitShellTokens(str), '-i')) { - stop("The input command cannot be run in the browser"); - } parsed = internal.parseCommands(str); - // block implicit initial -i command - if (parsed.length > 0 && parsed[0].name == 'i') { - stop(utils.format("Unable to run [%s]", raw)); - } + parsed.forEach(function(cmd) { + var i = blocked.indexOf(cmd.name); + if (i > -1) { + stop("The -" + blocked[i] + " command cannot be run in the browser"); + } + }); return parsed; }; diff --git a/src/cli/mapshaper-run-command.js b/src/cli/mapshaper-run-command.js index 4aac48807..34878da8c 100644 --- a/src/cli/mapshaper-run-command.js +++ b/src/cli/mapshaper-run-command.js @@ -7,18 +7,23 @@ mapshaper-colorizer mapshaper-data-fill mapshaper-dissolve mapshaper-dissolve2 +mapshaper-drop mapshaper-export mapshaper-each mapshaper-calc mapshaper-file-import mapshaper-file-export mapshaper-filter +mapshaper-filter-geom mapshaper-filter-rename-fields mapshaper-filter-islands mapshaper-filter-slivers +mapshaper-frame +mapshaper-fuzzy-join mapshaper-graticule +mapshaper-include mapshaper-info -mapshaper-innerlines2 +mapshaper-innerlines mapshaper-inspect mapshaper-join mapshaper-keep-shapes @@ -27,8 +32,15 @@ mapshaper-merge-layers mapshaper-points mapshaper-point-grid mapshaper-proj +mapshaper-polygons +mapshaper-rectangle mapshaper-rename-layers +mapshaper-require +mapshaper-run +mapshaper-scalebar +mapshaper-shape mapshaper-simplify +mapshaper-variable-simplify mapshaper-split mapshaper-split-on-grid mapshaper-subdivide @@ -46,9 +58,7 @@ mapshaper-uniq api.runCommand = function(cmd, catalog, cb) { var name = cmd.name, opts = cmd.options, - sources, source, - sourceDataset, outputLayers, outputFiles, targets, @@ -73,8 +83,19 @@ api.runCommand = function(cmd, catalog, cb) { // TODO: check that combine_layers is only used w/ GeoJSON output targets = catalog.findCommandTargets(opts.target || opts.combine_layers && '*'); + } else if (name == 'proj' || name == 'drop' || name == 'target') { + // these commands accept multiple target datasets + targets = catalog.findCommandTargets(opts.target); + } else { targets = catalog.findCommandTargets(opts.target); + + // special case to allow merge-layers to merge layers from multiple datasets + // TODO: support multi-dataset targets for other commands + if (targets.length > 1 && name == 'merge-layers') { + targets = internal.mergeCommandTargets(targets, catalog); + } + if (targets.length == 1) { targetDataset = targets[0].dataset; arcs = targetDataset.arcs; @@ -83,38 +104,24 @@ api.runCommand = function(cmd, catalog, cb) { catalog.setDefaultTarget(targetLayers, targetDataset); } else if (targets.length > 1) { - fail("Targetting multiple datasets is not supported"); + stop("This command does not support targetting layers from different datasets"); } } if (targets.length === 0) { if (opts.target) { - fail(utils.format('Missing target: %s\nAvailable layers: %s', + stop(utils.format('Missing target: %s\nAvailable layers: %s', opts.target, internal.getFormattedLayerList(catalog))); } - if (!(name == 'graticule' || name == 'i' || name == 'point-grid')) { - throw new APIError("Missing a -i command"); + if (!(name == 'help' || name == 'graticule' || name == 'i' || + name == 'point-grid' || name == 'shape' || name == 'rectangle' || + name == 'polygon-grid' || name == 'include')) { + throw new UserError("No data is available"); } } if (opts.source) { - sources = catalog.findCommandTargets(opts.source); - if (sources.length > 1 || sources.length == 1 && sources[0].layers.length > 1) { - fail(utils.format('Source option [%s] matched multiple layers', opts.source)); - } else if (sources.length == 1) { - source = {dataset: sources[0].dataset, layer: sources[0].layers[0]}; - } else { - // don't build topology, because: - // join -- don't need topology - // clip/erase -- topology is built later, when datasets are combined - sourceDataset = api.importFile(opts.source, utils.defaults({no_topology: true}, opts)); - if (!sourceDataset) { - fail(utils.format('Unable to find source [%s]', opts.source)); - } else if (sourceDataset.layers.length > 1) { - fail('Multiple-layer sources are not supported'); - } - source = {dataset: sourceDataset, layer: sourceDataset.layers[0]}; - } + source = internal.findCommandSource(opts.source, catalog, opts); } if (name == 'affine') { @@ -130,7 +137,6 @@ api.runCommand = function(cmd, catalog, cb) { internal.applyCommand(api.calc, targetLayers, arcs, opts); } else if (name == 'clean') { - // internal.applyCommand(api.flattenLayer, targetLayers, dataset, opts); api.cleanLayers(targetLayers, targetDataset, opts); } else if (name == 'clip') { @@ -144,7 +150,10 @@ api.runCommand = function(cmd, catalog, cb) { } else if (name == 'dissolve2') { outputLayers = api.dissolve2(targetLayers, targetDataset, opts); - //outputLayers = internal.applyCommand(api.dissolve2, targetLayers, dataset, opts); + + } else if (name == 'drop') { + api.drop2(catalog, targets, opts); + // api.drop(catalog, targetLayers, targetDataset, opts); } else if (name == 'each') { internal.applyCommand(api.evaluateEachFeature, targetLayers, arcs, opts.expression, opts); @@ -161,15 +170,27 @@ api.runCommand = function(cmd, catalog, cb) { } else if (name == 'filter-fields') { internal.applyCommand(api.filterFields, targetLayers, opts.fields); + } else if (name == 'filter-geom') { + internal.applyCommand(api.filterGeom, targetLayers, arcs, opts); + } else if (name == 'filter-islands') { - internal.applyCommand(api.filterIslands, targetLayers, arcs, opts); + internal.applyCommand(api.filterIslands, targetLayers, targetDataset, opts); } else if (name == 'filter-slivers') { - internal.applyCommand(api.filterSlivers, targetLayers, arcs, opts); + internal.applyCommand(api.filterSlivers, targetLayers, targetDataset, opts); + + } else if (name == 'frame') { + api.frame(catalog, source, opts); + + } else if (name == 'fuzzy-join') { + internal.applyCommand(api.fuzzyJoin, targetLayers, arcs, source, opts); } else if (name == 'graticule') { catalog.addDataset(api.graticule(targetDataset, opts)); + } else if (name == 'help') { + internal.getOptionParser().printHelp(opts.command); + } else if (name == 'i') { if (opts.replace) catalog = new Catalog(); targetDataset = api.importFiles(cmd.options); @@ -178,8 +199,11 @@ api.runCommand = function(cmd, catalog, cb) { outputLayers = targetDataset.layers; // kludge to allow layer naming below } + } else if (name == 'include') { + internal.include(opts); + } else if (name == 'info') { - catalog.forEachLayer(internal.printLayerInfo); + internal.printInfo(catalog.getLayers(), targetLayers); } else if (name == 'inspect') { internal.applyCommand(api.inspect, targetLayers, arcs, opts); @@ -194,11 +218,13 @@ api.runCommand = function(cmd, catalog, cb) { outputLayers = internal.applyCommand(api.lines, targetLayers, arcs, opts); } else if (name == 'merge-layers') { - // careful, returned layers are modified input layers - if (!opts.target) { - targetLayers = targetDataset.layers; // kludge - } - outputLayers = api.mergeLayers(targetLayers); + // returned layers are modified input layers + // (assumes that targetLayers are replaced by outputLayers below) + outputLayers = api.mergeLayers(targetLayers, opts); + + } else if (name == 'mosaic') { + opts.no_replace = true; // add mosaic as a new layer + outputLayers = internal.mosaic(targetDataset, opts); } else if (name == 'o') { outputFiles = internal.exportTargetLayers(targets, opts); @@ -213,11 +239,49 @@ api.runCommand = function(cmd, catalog, cb) { if (!targetDataset) { catalog.addDataset({layers: outputLayers}); } + + } else if (name == 'polygon-grid') { + catalog.addDataset(api.polygonGrid(targetDataset, opts)); + } else if (name == 'points') { - outputLayers = internal.applyCommand(api.createPointLayer, targetLayers, arcs, opts); + outputLayers = internal.applyCommand(api.createPointLayer, targetLayers, targetDataset, opts); + + } else if (name == 'polygons') { + outputLayers = api.polygons(targetLayers, targetDataset, opts); } else if (name == 'proj') { - api.proj(targetDataset, opts); + internal.initProjLibrary(opts, function() { + var err = null; + try { + targets.forEach(function(targ) { + var destArg = opts.match || opts.crs || opts.projection; + var srcInfo, destInfo; + if (opts.from) { + srcInfo = internal.getCrsInfo(opts.from, catalog); + if (!srcInfo.crs) stop("Unknown projection source:", opts.from); + internal.setDatasetCRS(targ.dataset, srcInfo); + } + if (destArg) { + destInfo = internal.getCrsInfo(destArg, catalog); + api.proj(targ.dataset, destInfo, opts); + } + }); + } catch(e) { + err = e; + } + done(err); + }); + return; // async command + + } else if (name == 'rectangle') { + if (source || opts.bbox || targets.length === 0) { + catalog.addDataset(api.rectangle(source, opts)); + } else { + outputLayers = api.rectangle2(targets[0], opts); + } + + } else if (name == 'rectangles') { + outputLayers = internal.applyCommand(api.rectangles, targetLayers, targetDataset, opts); } else if (name == 'rename-fields') { internal.applyCommand(api.renameFields, targetLayers, opts.fields); @@ -225,8 +289,25 @@ api.runCommand = function(cmd, catalog, cb) { } else if (name == 'rename-layers') { api.renameLayers(targetLayers, opts.names); + } else if (name == 'require') { + api.require(targets, opts); + + } else if (name == 'run') { + api.run(targets, catalog, opts, done); + return; + + } else if (name == 'scalebar') { + api.scalebar(catalog, opts); + + } else if (name == 'shape') { + catalog.addDataset(api.shape(opts)); + } else if (name == 'simplify') { - api.simplify(targetDataset, opts); + if (opts.variable) { + api.variableSimplify(targetLayers, targetDataset, opts); + } else { + api.simplify(targetDataset, opts); + } } else if (name == 'slice') { outputLayers = api.sliceLayers(targetLayers, source, targetDataset, opts); @@ -243,18 +324,18 @@ api.runCommand = function(cmd, catalog, cb) { } else if (name == 'stitch') { api.stitch(targetDataset); + } else if (name == 'style') { + internal.applyCommand(api.svgStyle, targetLayers, targetDataset, opts); + } else if (name == 'subdivide') { outputLayers = internal.applyCommand(api.subdivideLayer, targetLayers, arcs, opts.expression); - } else if (name == 'svg-style') { - internal.applyCommand(api.svgStyle, targetLayers, targetDataset, opts); + } else if (name == 'target') { + internal.target(catalog, opts); } else if (name == 'uniq') { internal.applyCommand(api.uniq, targetLayers, arcs, opts); - } else if (name == 'target') { - api.target(catalog, opts.target); - } else { error("Unhandled command: [" + name + "]"); } @@ -267,6 +348,11 @@ api.runCommand = function(cmd, catalog, cb) { }); } + // delete arcs if no longer needed (e.g. after -points command) + if (targetDataset) { + internal.cleanupArcs(targetDataset); + } + // integrate output layers into the target dataset if (outputLayers && targetDataset && outputLayers != targetDataset.layers) { if (opts.no_replace) { @@ -274,6 +360,11 @@ api.runCommand = function(cmd, catalog, cb) { } else { // TODO: consider replacing old layers as they are generated, for gc internal.replaceLayers(targetDataset, targetLayers, outputLayers); + // some operations leave unreferenced arcs that should be cleaned up + if ((name == 'clip' || name == 'erase' || name == 'rectangle' || + name == 'rectangles' || name == 'filter' && opts.cleanup) && !opts.no_cleanup) { + internal.dissolveArcs(targetDataset); + } } // use command output as new default target catalog.setDefaultTarget(outputLayers, targetDataset); @@ -284,12 +375,8 @@ api.runCommand = function(cmd, catalog, cb) { done(null); - function fail(msg) { - stop("[" + name + "]", msg); - } - function done(err) { - T.stop('-' + name); + T.stop('-'); cb(err, err ? null : catalog); } }; @@ -307,3 +394,27 @@ internal.applyCommand = function(func, targetLayers) { return memo; }, []); }; + +internal.findCommandSource = function(sourceName, catalog, opts) { + var sources = catalog.findCommandTargets(sourceName); + var sourceDataset, source; + if (sources.length > 1 || sources.length == 1 && sources[0].layers.length > 1) { + stop(utils.format('Source [%s] matched multiple layers', sourceName)); + } else if (sources.length == 1) { + source = {dataset: sources[0].dataset, layer: sources[0].layers[0]}; + } else { + // assuming opts.source is a filename + // don't need to build topology, because: + // join -- don't need topology + // clip/erase -- topology is built later, when datasets are combined + sourceDataset = api.importFile(sourceName, utils.defaults({no_topology: true}, opts)); + if (!sourceDataset) { + stop(utils.format('Unable to find source [%s]', sourceName)); + } else if (sourceDataset.layers.length > 1) { + stop('Multiple-layer sources are not supported'); + } + // mark as disposable to indicate that data can be mutated + source = {dataset: sourceDataset, layer: sourceDataset.layers[0], disposable: true}; + } + return source; +}; diff --git a/src/clipping/mapshaper-bbox-clipping.js b/src/clipping/mapshaper-bbox-clipping.js new file mode 100644 index 000000000..6f03e08d4 --- /dev/null +++ b/src/clipping/mapshaper-bbox-clipping.js @@ -0,0 +1,240 @@ +/* @require mapshaper-shape-iter, mapshaper-segment-geom */ + +// Return an array containing points from a path iterator, clipped to a bounding box +// (Output is currently only suitable for drawing to the screen, because of artifacts along edges) +// TODO: support clipping a single-part shape to multiple parts +// TODO: prevent artifacts along edges +internal.clipIterByBounds = function(iter, bounds) { + var points = []; + var bbox = getClippingBBox(bounds); + var xy, xyp, first, isRing; + while (iter.hasNext()) { + xy = [iter.x, iter.y]; + addClippedPoint(points, xyp, xy, bbox); + xyp = xy; + if (!first) first = xy; + } + // detect closed rings + isRing = pointsAreEqual(first, xy); + if (isRing && points.length > 0 && !pointsAreEqual(points[0], points[points.length - 1])) { + // some rings need to be closed + points.push(points[0].concat()); + } + if (isRing && points.length < 4 || points.length < 2) { + // catch defective rings and polylines + points = []; + } + return points; +}; + +function pointsAreEqual(a, b) { + return a && b && a[0] === b[0] && a[1] === b[1]; +} + +// 2 3 4 +// 1 8 5 +// 0 7 6 +function getPointSector(x, y, bbox) { + var bl = bbox[0]; + var tr = bbox[2]; + var i; + if (x > tr[0]) { + i = y > tr[1] && 4 || y >= bl[1] && 5 || 6; // right col + } else if (x >= bl[0]) { + i = y > tr[1] && 3 || y >= bl[1] && 8 || 7; // middle col + } else { + i = y > tr[1] && 2 || y >= bl[1] && 1 || 0; // left col + } + return i; +} + +function isCornerSector(q) { + return q == 0 || q == 2 || q == 4 || q == 6; +} + +function isEdgeSector(q) { + return q == 1 || q == 3 || q == 5 || q == 7; +} + +// Number of CCW turns to normalize +function getSectorRotation(q) { + return q > 1 && q < 8 ? Math.floor(q / 2) : 0; +} + +// i: rotation number +// b: bbox object +function rotateClippingBox(i, bbox) { + var a = bbox[0], + b = bbox[1], + c = bbox[2], + d = bbox[3]; + if (i === 0) { + bbox = [a, b, c, d]; + } else if (i == 1) { + bbox = [b, c, d, a]; + } else if (i == 2) { + bbox = [c, d, a, b]; + } else if (i == 3) { + bbox = [d, a, b, c]; + } else error('Invalid rotation number'); + return bbox; +} + +// Convert a Bounds object to an array of 4 points designed to be rotated +function getClippingBBox(bounds) { + return [[bounds.xmin, bounds.ymin], + [bounds.xmin, bounds.ymax], + [bounds.xmax, bounds.ymax], + [bounds.xmax, bounds.ymin]]; +} + +// i: ccw turns (0-3) +function rotateSector(i, q) { + return q < 8 && q >= 0 ? (q + 8 - i * 2) % 8 : q; +} + +function getCornerBySector(q, bbox) { + if (isCornerSector(q)) { + return bbox[q / 2].concat(); + } + error('Invalid corner sector:', q); +} + +function addCornerPoint(points, q, bbox) { + points.push(getCornerBySector(q, bbox)); +} + +function projectPointToEdge(p, s1, s2) { + return s1[0] == s2[0] ? [s1[0], p[1]] : [p[0], s1[1]]; +} + +function addClippedPoint(points, p1, p2, bbox) { + var q1 = p1 ? getPointSector(p1[0], p1[1], bbox) : -1; + var q2 = getPointSector(p2[0], p2[1], bbox); + var rot; + // even polylines need to be connected along bbox edges to prevent artifact + // segments cutting through the bbox + // TODO: convert disconnected parts to individual polylines or rings + var closed = true; + + if (q1 == 8 && q2 == 8) { + // segment is fully within box + points.push(p2); + + } else if (q1 == q2) { + // segment is fully within one outer sector (ignore it) + + } else if (q1 == -1) { + // p2 is first point in the path + if (q2 == 8) { + points.push(p2); + } else if (closed && isCornerSector(q2)) { + addCornerPoint(points, q2, bbox); + } + + } else if (q1 == 8) { + // segment leaves box + addSegmentBoundsIntersection(points, p1, p2, bbox); + if (closed && isCornerSector(q2)) { + addCornerPoint(points, q2, bbox); + } + + } else if (q2 == 8) { + // segment enters box + addSegmentBoundsIntersection(points, p1, p2, bbox); + points.push(p2); + + } else { + // segment travels from one outer sector to another outer sector + // normalise segment by rotating bbox so that p1 is + // in the 0 or 1 sector relative to the bbox coordinates, if p1 is in an + // outer segment + rot = getSectorRotation(q1); + bbox = rotateClippingBox(rot, bbox); + q1 = rotateSector(rot, q1); + q2 = rotateSector(rot, q2); + if (q1 == 0) { + // first point is in a corner sector + if (q2 === 0 || q2 === 1 || q2 === 7) { + // move to adjacent side -- no point + + } else if (q2 == 2 || q2 == 6) { + // move to adjacent corner + if (closed) addCornerPoint(points, q2, bbox); + + } else if (q2 == 3) { + // far left edge (intersection or left corner) + if (!addSegmentBoundsIntersection(points, p1, p2, bbox) && closed) addCornerPoint(points, 2, bbox); + + } else if (q2 == 4) { + // opposite corner + if (!addSegmentBoundsIntersection(points, p1, p2, bbox)) { + // determine if bbox is to the left or right of segment + if (geom.orient2D(p1[0], p1[1], p2[0], p2[1], bbox[0][0], bbox[0][1]) > 1) { + // bbox is on the left (seg -> nearest corner is CCW) + addCornerPoint(points, 6, bbox); + } else { + // bbox is on the right + addCornerPoint(points, 2, bbox); + } + } + if (closed) addCornerPoint(points, q2, bbox); + + } else if (q2 == 5) { + // far right edge (intersection or right corner) + if (!addSegmentBoundsIntersection(points, p1, p2, bbox) && closed) addCornerPoint(points, 6, bbox); + } + + } else if (q1 == 1) { + // first point is in a side sector + if (q2 == 2 || q2 === 0) { + // near left corner, near right corner + addCornerPoint(points, q2, bbox); + + } else if (q2 == 3) { + // to left side + if (!addSegmentBoundsIntersection(points, p1, p2, bbox) && closed) addCornerPoint(points, 2, bbox); + + } else if (q2 == 4) { + // to far left corner + if (!addSegmentBoundsIntersection(points, p1, p2, bbox) && closed) addCornerPoint(points, 2, bbox); + if (closed) addCornerPoint(points, 4, bbox); + + } else if (q2 == 5) { + // to opposite side + addSegmentBoundsIntersection(points, p1, p2, bbox); + + } else if (q2 == 6) { + // to far right corner + if (!addSegmentBoundsIntersection(points, p1, p2, bbox) && closed) addCornerPoint(points, 0, bbox); + if (closed) addCornerPoint(points, 6, bbox); + + } else if (q2 == 7) { + // to right side + if (!addSegmentBoundsIntersection(points, p1, p2, bbox) && closed) addCornerPoint(points, 0, bbox); + } + + } else { + error("Sector error"); + } + } +} + +function addSegmentSegmentIntersection(points, a, b, c, d) { + var p = geom.segmentIntersection(a[0], a[1], b[0], b[1], c[0], c[1], + d[0], d[1]); + if (p) points.push(p); +} + +function addSegmentBoundsIntersection(points, a, b, bounds) { + var hits = []; + addSegmentSegmentIntersection(hits, a, b, bounds[0], bounds[1]); // first edge + addSegmentSegmentIntersection(hits, a, b, bounds[0], bounds[3]); // last edge + addSegmentSegmentIntersection(hits, a, b, bounds[1], bounds[2]); + addSegmentSegmentIntersection(hits, a, b, bounds[2], bounds[3]); + if (hits.length > 0 ) { + points.push.apply(points, hits); + return true; + } + return false; +} diff --git a/src/clipping/mapshaper-polygon-clipping.js b/src/clipping/mapshaper-polygon-clipping.js index 477992c56..04b78b037 100644 --- a/src/clipping/mapshaper-polygon-clipping.js +++ b/src/clipping/mapshaper-polygon-clipping.js @@ -1,9 +1,11 @@ /* @requires mapshaper-pathfinder -mapshaper-dissolve2 +mapshaper-polygon-dissolve2 mapshaper-path-index */ +// TODO: remove dependency on old polygon dissolve function + // assumes layers and arcs have been prepared for clipping internal.clipPolygons = function(targetShapes, clipShapes, nodes, type) { var arcs = nodes.arcs; @@ -15,7 +17,6 @@ internal.clipPolygons = function(targetShapes, clipShapes, nodes, type) { var dividePath = internal.getPathFinder(nodes, useRoute, routeIsActive); var dissolvePolygon = internal.getPolygonDissolver(nodes); - // clean each target polygon by dissolving its rings targetShapes = targetShapes.map(dissolvePolygon); @@ -62,7 +63,7 @@ internal.clipPolygons = function(targetShapes, clipShapes, nodes, type) { // need to create polygons that connect positive-space rings and holes internal.openArcRoutes(shape, arcs, routeFlags, true, false, false); - internal.forEachPath(shape, function(ids) { + internal.forEachShapePart(shape, function(ids) { var path; for (var i=0, n=ids.length; i 0 ? clipped : null; + var clipped = null; + if (shp) clipped = shp.reduce(clipPath, []); + return clipped && clipped.length > 0 ? clipped : null; } function clipPath(memo, path) { diff --git a/src/commands/mapshaper-affine.js b/src/commands/mapshaper-affine.js index 1a64e7cf8..b1e650595 100644 --- a/src/commands/mapshaper-affine.js +++ b/src/commands/mapshaper-affine.js @@ -10,6 +10,9 @@ api.affine = function(targetLayers, dataset, opts) { // TODO: explore alternative: if some arcs are shared between transformed and // non-transformed shapes, first remove topology, then tranform, then rebuild topology // + var rotateArg = opts.rotate || 0; + var scaleArg = opts.scale || 1; + var shiftArg = opts.shift ? internal.convertIntervalPair(opts.shift, internal.getDatasetCRS(dataset)) : [0, 0]; var arcs = dataset.arcs; var targetShapes = []; var otherShapes = []; @@ -36,10 +39,10 @@ api.affine = function(targetLayers, dataset, opts) { otherShapes = otherShapes.concat(misses); } }); - opts = internal.getAffineOpts({arcs: dataset.arcs, layers: [{ + var anchorArg = internal.getAffineAnchor({arcs: dataset.arcs, layers: [{ geometry_type: 'point', shapes: targetPoints}, {geometry_type: 'polyline', shapes: targetShapes}]}, opts); - transform = internal.getAffineTransform(opts.rotate, opts.scale, opts.shift, opts.anchor); + transform = internal.getAffineTransform(rotateArg, scaleArg, shiftArg, anchorArg); if (targetShapes.length > 0) { targetFlags = new Uint8Array(arcs.size()); otherFlags = new Uint8Array(arcs.size()); @@ -62,21 +65,16 @@ api.affine = function(targetLayers, dataset, opts) { }); }; -internal.getAffineOpts = function(dataset, opts) { - var o = { - shift: opts.shift || [0, 0], - rotate: opts.rotate || 0, - scale: opts.scale || 1 - }; - var bounds; +internal.getAffineAnchor = function(dataset, opts) { + var anchor, bounds; if (opts.anchor) { - o.anchor = opts.anchor; + anchor = opts.anchor; } else { // get bounds of selected shapes to calculate center of rotation/scale bounds = internal.getDatasetBounds(dataset); - o.anchor = [bounds.centerX(), bounds.centerY()]; + anchor = [bounds.centerX(), bounds.centerY()]; } - return o; + return anchor; }; // TODO: handle problems with unprojected datasets diff --git a/src/commands/mapshaper-calc.js b/src/commands/mapshaper-calc.js index 6c0a8d2d9..f7dad618b 100644 --- a/src/commands/mapshaper-calc.js +++ b/src/commands/mapshaper-calc.js @@ -13,8 +13,8 @@ mapshaper-calc-utils // opts.where Optional filter expression (see -filter command) // api.calc = function(lyr, arcs, opts) { - var msg = '[calc] ' + opts.expression, - result; + var msg = opts.expression, + result, compiled, defs; if (opts.where) { // TODO: implement no_replace option for filter() instead of this lyr = { @@ -24,7 +24,11 @@ api.calc = function(lyr, arcs, opts) { api.filterFeatures(lyr, arcs, {expression: opts.where}); msg += ' where ' + opts.where; } - result = internal.evalCalcExpression(lyr, arcs, opts.expression); + // Save any assigned variables to the defs object, so they will be available + // for later -each expressions to use. + defs = internal.getStateVar('defs'); + compiled = internal.compileCalcExpression(lyr, arcs, opts.expression); + result = compiled(null, defs); message(msg + ": " + result); return result; }; diff --git a/src/commands/mapshaper-clean.js b/src/commands/mapshaper-clean.js index 8b1d29942..09f9e3df6 100644 --- a/src/commands/mapshaper-clean.js +++ b/src/commands/mapshaper-clean.js @@ -1,36 +1,19 @@ -/* @requires mapshaper-dissolve2, mapshaper-polygon-mosaic */ +/* @requires mapshaper-polygon-dissolve3, mapshaper-arc-dissolve, mapshaper-filter */ -// (This doesn't currently do much) -// TODO: remove small overlaps -// TODO: patch small gaps api.cleanLayers = function(layers, dataset, opts) { - var nodes = internal.addIntersectionCuts(dataset); - var flatten = internal.getPolygonFlattener(nodes); - + var nodes; + opts = opts || {}; + // layers.forEach(internal.requirePolygonLayer); + nodes = internal.addIntersectionCuts(dataset, opts); layers.forEach(function(lyr) { - internal.requirePolygonLayer(lyr, "[clean] Expected a polygon type layer"); - lyr.shapes = lyr.shapes.map(flatten); + if (lyr.geometry_type == 'polygon') { + lyr.shapes = internal.dissolvePolygons2(lyr.shapes, dataset, opts); + } + if (!opts.allow_empty) { + api.filterFeatures(lyr, dataset.arcs, {remove_empty: true}); + } }); -}; - - -internal.getPolygonFlattener = function(nodes) { - var flags = new Uint8Array(nodes.arcs.size()); - var divide = internal.getHoleDivider(nodes); - var flatten = internal.getRingIntersector(nodes, 'flatten', flags); - - return function(shp) { - if (!shp) return null; - var cw = [], - ccw = []; - - divide(shp, cw, ccw); - cw = flatten(cw); - ccw.forEach(internal.reversePath); - ccw = flatten(ccw); - ccw.forEach(internal.reversePath); - - var shp2 = internal.appendHolestoRings(cw, ccw); - return shp2 && shp2.length > 0 ? shp2 : null; - }; + if (!opts.no_arc_dissolve && dataset.arcs) { + internal.dissolveArcs(dataset); // remove leftover endpoints within contiguous lines + } }; diff --git a/src/commands/mapshaper-clip-erase.js b/src/commands/mapshaper-clip-erase.js index d26dfe18d..70a07389e 100644 --- a/src/commands/mapshaper-clip-erase.js +++ b/src/commands/mapshaper-clip-erase.js @@ -4,6 +4,7 @@ mapshaper-path-division mapshaper-polygon-clipping mapshaper-polyline-clipping mapshaper-point-clipping +mapshaper-bbox-clipping mapshaper-arc-dissolve mapshaper-filter-slivers mapshaper-split @@ -35,25 +36,61 @@ api.sliceLayer = function(targetLyr, src, dataset, opts) { // @clipSrc: layer in @dataset or filename // @type: 'clip' or 'erase' -internal.clipLayers = function(targetLayers, clipSrc, dataset, type, opts) { - var clipLyr, clipDataset; +internal.clipLayers = function(targetLayers, clipSrc, targetDataset, type, opts) { + var usingPathClip = utils.some(targetLayers, internal.layerHasPaths); + var clipDataset, mergedDataset, clipLyr, nodes, tmp; opts = opts || {no_cleanup: true}; // TODO: update testing functions if (clipSrc && clipSrc.geometry_type) { - // convert from old api -- still used in many tests - clipSrc = {dataset: dataset, layer: clipSrc}; + // TODO: update tests to remove this case (clipSrc is a layer) + clipSrc = {dataset: targetDataset, layer: clipSrc, disposable: true}; } if (opts.bbox) { clipDataset = internal.convertClipBounds(opts.bbox); clipLyr = clipDataset.layers[0]; } else if (clipSrc) { - clipDataset = clipSrc.dataset; clipLyr = clipSrc.layer; + clipDataset = utils.defaults({layers: [clipLyr]}, clipSrc.dataset); + } else { + stop("Missing clipping data"); + } + if (targetDataset.arcs != clipDataset.arcs) { + // using external dataset -- need to merge arcs + if (clipSrc && !clipSrc.disposable) { + // copy layer shapes because arc ids will be reindexed during merging + clipLyr = clipDataset.layers[0] = internal.copyLayerShapes(clipDataset.layers[0]); + } + // merge external dataset with target dataset, + // so arcs are shared between target layers and clipping lyr + // Assumes that layers in clipDataset can be modified (if necessary, a copy should be passed in) + mergedDataset = internal.mergeDatasets([targetDataset, clipDataset]); + api.buildTopology(mergedDataset); // identify any shared arcs between clipping layer and target dataset + } else { + mergedDataset = targetDataset; } - if (!clipDataset || !clipLyr) { - stop("[" + type + "] Missing clipping data"); + if (usingPathClip) { + // add vertices at all line intersections + // (generally slower than actual clipping) + nodes = internal.addIntersectionCuts(mergedDataset, opts); + targetDataset.arcs = mergedDataset.arcs; + } else { + nodes = new NodeCollection(mergedDataset.arcs); } - internal.requirePolygonLayer(clipLyr, "[" + type + "] Requires a polygon clipping layer"); - return internal.clipLayersByLayer(targetLayers, dataset, clipLyr, clipDataset, type, opts); + return internal.clipLayersByLayer(targetLayers, clipLyr, nodes, type, opts); +}; + +internal.clipLayersByLayer = function(targetLayers, clipLyr, nodes, type, opts) { + internal.requirePolygonLayer(clipLyr, "Requires a polygon clipping layer"); + return targetLayers.reduce(function(memo, targetLyr) { + if (opts.no_replace) { + memo.push(targetLyr); + } + if (type == 'slice') { + memo = memo.concat(internal.sliceLayerByLayer(targetLyr, clipLyr, nodes, opts)); + } else { + memo.push(internal.clipLayerByLayer(targetLyr, clipLyr, nodes, type, opts)); + } + return memo; + }, []); }; internal.getSliceLayerName = function(clipLyr, field, i) { @@ -80,7 +117,7 @@ internal.clipLayerByLayer = function(targetLyr, clipLyr, nodes, type, opts) { return targetLyr; // ignore empty layer } if (targetLyr === clipLyr) { - stop('[' + type + '] Can\'t clip a layer with itself'); + stop('Can\'t clip a layer with itself'); } if (targetLyr.geometry_type == 'point') { @@ -90,7 +127,7 @@ internal.clipLayerByLayer = function(targetLyr, clipLyr, nodes, type, opts) { } else if (targetLyr.geometry_type == 'polyline') { clippedShapes = internal.clipPolylines(targetLyr.shapes, clipLyr.shapes, nodes, type); } else { - stop('[' + type + '] Invalid target layer:', targetLyr.name); + stop('Invalid target layer:', targetLyr.name); } outputLyr = { @@ -117,80 +154,26 @@ internal.clipLayerByLayer = function(targetLyr, clipLyr, nodes, type, opts) { // TODO: redo messages, now that many layers may be clipped nullCount = shapeCount - outputLyr.shapes.length; if (nullCount && sliverCount) { - message(internal.getClipMessage(type, nullCount, sliverCount)); + message(internal.getClipMessage(nullCount, sliverCount)); } return outputLyr; }; -internal.clipLayersByLayer = function(targetLayers, targetDataset, clipLyr, clipDataset, type, opts) { - var usingPathClip = utils.some(targetLayers, internal.layerHasPaths); - var usingExternalDataset = targetDataset != clipDataset; - var nodes, outputLayers, mergedDataset, tmp; - - if (usingExternalDataset) { - // merge external dataset with target dataset, - // so arcs are shared between target layers and clipping lyr - mergedDataset = internal.mergeDatasets([targetDataset, clipDataset]); - api.buildTopology(mergedDataset); // identify any shared arcs between clipping layer and target dataset - - targetDataset.arcs = mergedDataset.arcs; // replace arcs in original dataset with merged arcs - } else { - mergedDataset = targetDataset; - } - - if (usingPathClip) { - // add vertices at all line intersections - // (generally slower than actual clipping) - nodes = internal.addIntersectionCuts(mergedDataset, opts); - } else { - nodes = new NodeCollection(targetDataset.arcs); - } - - outputLayers = targetLayers.reduce(function(memo, targetLyr) { - if (opts.no_replace) { - memo.push(targetLyr); - } - if (type == 'slice') { - memo = memo.concat(internal.sliceLayerByLayer(targetLyr, clipLyr, nodes, opts)); - } else { - memo.push(internal.clipLayerByLayer(targetLyr, clipLyr, nodes, type, opts)); - } - return memo; - }, []); - - if (usingPathClip && !opts.no_cleanup) { - // Delete unused arcs, merge remaining arcs, remap arcs of retained shapes. - // This is to remove arcs belonging to the clipping paths from the target - // dataset, and to heal the cuts that were made where clipping paths - // crossed target paths - tmp = { - arcs: targetDataset.arcs, - layers: targetDataset.layers - }; - internal.replaceLayers(tmp, tmp.layers, outputLayers); - internal.dissolveArcs(tmp); - targetDataset.arcs = tmp.arcs; - } - - return outputLayers; -}; - -internal.getClipMessage = function(type, nullCount, sliverCount) { +internal.getClipMessage = function(nullCount, sliverCount) { var nullMsg = nullCount ? utils.format('%,d null feature%s', nullCount, utils.pluralSuffix(nullCount)) : ''; var sliverMsg = sliverCount ? utils.format('%,d sliver%s', sliverCount, utils.pluralSuffix(sliverCount)) : ''; if (nullMsg || sliverMsg) { - return utils.format('[%s] Removed %s%s%s', type, nullMsg, (nullMsg && sliverMsg ? ' and ' : ''), sliverMsg); + return utils.format('Removed %s%s%s', nullMsg, (nullMsg && sliverMsg ? ' and ' : ''), sliverMsg); } return ''; }; - internal.convertClipBounds = function(bb) { var x0 = bb[0], y0 = bb[1], x1 = bb[2], y1 = bb[3], arc = [[x0, y0], [x0, y1], [x1, y1], [x1, y0], [x0, y0]]; if (!(y1 > y0 && x1 > x0)) { - stop("[clip/erase] Invalid bbox (should be [xmin, ymin, xmax, ymax]):", bb); + stop("Invalid bbox (should be [xmin, ymin, xmax, ymax]):", bb); } return { arcs: new ArcCollection([arc]), diff --git a/src/commands/mapshaper-cluster.js b/src/commands/mapshaper-cluster.js index 41fce8c2c..0717f0496 100644 --- a/src/commands/mapshaper-cluster.js +++ b/src/commands/mapshaper-cluster.js @@ -13,7 +13,7 @@ mapshaper-polygon-centroid // interactive maps, not useful for analysis. // api.cluster = function(lyr, arcs, opts) { - internal.requirePolygonLayer(lyr, "[cluster] Command requires a polygon layer"); + internal.requirePolygonLayer(lyr); var groups = internal.calcPolygonClusters(lyr, arcs, opts); var idField = opts.id_field || "cluster"; internal.insertFieldValues(lyr, idField, groups); @@ -23,7 +23,8 @@ api.cluster = function(lyr, arcs, opts) { internal.calcPolygonClusters = function(lyr, arcs, opts) { var calcScore = internal.getPolygonClusterCalculator(opts); var size = lyr.shapes.length; - var count = Math.round(size * (opts.pct || 1)); + var pct = opts.pct ? utils.parsePercent(opts.pct) : 1; + var count = Math.round(size * pct); var groupField = opts.group_by || null; // working set of polygon records @@ -43,7 +44,7 @@ internal.calcPolygonClusters = function(lyr, arcs, opts) { var mergeIndex = {}; // keep track of merges, to prevent duplicates var next; - if (groupField && !lyr.data) stop("[cluster] Missing attribute data table"); + if (groupField && !lyr.data) stop("Missing attribute data table"); // Populate mergeItems array internal.findNeighbors(lyr.shapes, arcs).forEach(function(ab, i) { diff --git a/src/commands/mapshaper-colorizer.js b/src/commands/mapshaper-colorizer.js index f4162e385..0d3d99d43 100644 --- a/src/commands/mapshaper-colorizer.js +++ b/src/commands/mapshaper-colorizer.js @@ -1,11 +1,17 @@ -/* @requires mapshaper-common, mapshaper-rounding */ +/* @requires mapshaper-rounding */ api.colorizer = function(opts) { if (!opts.name) { stop("Missing required name= parameter"); } + if (internal.isReservedName(opts.name)) { + stop('"' + opts.name + '" is a reserved name'); + } + internal.getStateVar('defs')[opts.name] = internal.getColorizerFunction(opts); +}; - internal.defs[opts.name] = internal.getColorizerFunction(opts); +internal.isReservedName = function(name) { + return /^(stroke|stroke-width|stroke-dasharray|fill|opacity|r|class)$/.test(name); }; internal.getColorizerFunction = function(opts) { diff --git a/src/commands/mapshaper-data-fill.js b/src/commands/mapshaper-data-fill.js index 83cb17241..1c228788a 100644 --- a/src/commands/mapshaper-data-fill.js +++ b/src/commands/mapshaper-data-fill.js @@ -4,8 +4,8 @@ api.dataFill = function(lyr, arcs, opts) { var field = opts.field; var count; - if (!field) stop("[data-fill] Missing required field= parameter"); - if (lyr.geometry_type != 'polygon') stop("[data-fill] Target layer must be polygon type"); + if (!field) stop("Missing required field= parameter"); + if (lyr.geometry_type != 'polygon') stop("Target layer must be polygon type"); // first, fill some holes? count = internal.fillMissingValues(lyr, field, internal.getSingleAssignment(lyr, field, arcs)); diff --git a/src/commands/mapshaper-dissolve.js b/src/commands/mapshaper-dissolve.js index cee72b1c0..2e84ce75c 100644 --- a/src/commands/mapshaper-dissolve.js +++ b/src/commands/mapshaper-dissolve.js @@ -3,41 +3,47 @@ mapshaper-data-table mapshaper-data-aggregation mapshaper-point-dissolve mapshaper-polygon-dissolve +mapshaper-polyline-dissolve */ // Generate a dissolved layer -// @opts.field (optional) name of data field (dissolves all if falsy) +// @opts.fields (optional) names of data fields (dissolves all if falsy) // @opts.sum-fields (Array) (optional) // @opts.copy-fields (Array) (optional) // -api.dissolve = function(lyr, arcs, o) { - var opts = o || {}, - getGroupId = internal.getCategoryClassifier(opts.field, lyr.data), - dissolveShapes = null, - dissolveData = null, - lyr2; - +api.dissolve = function(lyr, arcs, opts) { + var dissolveShapes, getGroupId; + opts = utils.extend({}, opts); + if (opts.field) opts.fields = [opts.field]; // support old "field" parameter + getGroupId = internal.getCategoryClassifier(opts.fields, lyr.data); if (lyr.geometry_type == 'polygon') { dissolveShapes = dissolvePolygonGeometry(lyr.shapes, getGroupId); + } else if (lyr.geometry_type == 'polyline') { + dissolveShapes = internal.dissolvePolylineGeometry(lyr, getGroupId, arcs, opts); } else if (lyr.geometry_type == 'point') { dissolveShapes = dissolvePointLayerGeometry(lyr, getGroupId, opts); - } else if (lyr.geometry_type) { - stop("[dissolve] Only point and polygon geometries can be dissolved"); } + return internal.composeDissolveLayer(lyr, dissolveShapes, getGroupId, opts); +}; +// @lyr: original undissolved layer +// @shapes: dissolved shapes +internal.composeDissolveLayer = function(lyr, shapes, getGroupId, opts) { + var records = null; + var lyr2; if (lyr.data) { - dissolveData = internal.aggregateDataRecords(lyr.data.getRecords(), getGroupId, opts); + records = internal.aggregateDataRecords(lyr.data.getRecords(), getGroupId, opts); // replace missing shapes with nulls - for (var i=0, n=dissolveData.length; i 0 ? dissolved : null; - }; -}; - -// TODO: to prevent invalid holes, -// could erase the holes from the space-enclosing rings. -internal.appendHolestoRings = function(cw, ccw) { - for (var i=0, n=ccw.length; i 1 ? utils.trimQuotes(parts[1]) : dest; + if (!src || !dest) stop("Invalid field description:", str); memo[src] = dest; return memo; }, {}); diff --git a/src/commands/mapshaper-filter-slivers.js b/src/commands/mapshaper-filter-slivers.js index c55cb350a..ca1bd4ae3 100644 --- a/src/commands/mapshaper-filter-slivers.js +++ b/src/commands/mapshaper-filter-slivers.js @@ -5,16 +5,16 @@ // TODO: consider merging slivers into adjacent polygons to prevent gaps from forming // TODO: consider separate gap removal function as an alternative to merging slivers // -api.filterSlivers = function(lyr, arcs, opts) { +api.filterSlivers = function(lyr, dataset, opts) { if (lyr.geometry_type != 'polygon') { return 0; } - return internal.filterSlivers(lyr, arcs, opts); + return internal.filterSlivers(lyr, dataset, opts); }; -internal.filterSlivers = function(lyr, arcs, opts) { - var ringTest = opts && opts.min_area ? internal.getMinAreaTest(opts.min_area, arcs) : - internal.getSliverTest(arcs); +internal.filterSlivers = function(lyr, dataset, opts) { + var ringTest = opts && opts.min_area ? internal.getMinAreaTest(opts.min_area, dataset, opts) : + internal.getSliverTest(dataset.arcs); var removed = 0; var pathFilter = function(path, i, paths) { if (ringTest(path)) { @@ -23,8 +23,9 @@ internal.filterSlivers = function(lyr, arcs, opts) { } }; + internal.editShapes(lyr.shapes, pathFilter); - message(utils.format("[filter-slivers] Removed %'d sliver%s", removed, utils.pluralSuffix(removed))); + message(utils.format("Removed %'d sliver%s", removed, utils.pluralSuffix(removed))); return removed; }; @@ -55,14 +56,6 @@ internal.filterClipSlivers = function(lyr, clipLyr, arcs) { return removed; }; -internal.getSliverTest = function(arcs) { - var maxSliverArea = internal.calcMaxSliverArea(arcs); - return function(path) { - // TODO: more sophisticated metric, perhaps considering shape - return Math.abs(geom.getPlanarPathArea(path, arcs)) <= maxSliverArea; - }; -}; - // Calculate an area threshold based on the average segment length, // but disregarding very long segments (i.e. bounding boxes) diff --git a/src/commands/mapshaper-filter.js b/src/commands/mapshaper-filter.js index d8e7a66fd..2e241f15c 100644 --- a/src/commands/mapshaper-filter.js +++ b/src/commands/mapshaper-filter.js @@ -18,7 +18,7 @@ api.filterFeatures = function(lyr, arcs, opts) { } if (!filter) { - stop("[filter] Missing a filter expression"); + stop("Missing a filter expression"); } utils.repeat(n, function(shapeId) { @@ -27,7 +27,7 @@ api.filterFeatures = function(lyr, arcs, opts) { if (shapes) filteredShapes.push(shapes[shapeId] || null); if (records) filteredRecords.push(records[shapeId] || null); } else if (result !== false) { - stop("[filter] Expression must return true or false"); + stop("Expression must return true or false"); } }); @@ -39,7 +39,7 @@ api.filterFeatures = function(lyr, arcs, opts) { } if (opts.verbose !== false) { - message(utils.format('[filter] Retained %,d of %,d features', internal.getFeatureCount(filteredLyr), n)); + message(utils.format('Retained %,d of %,d features', internal.getFeatureCount(filteredLyr), n)); } return filteredLyr; diff --git a/src/commands/mapshaper-frame.js b/src/commands/mapshaper-frame.js new file mode 100644 index 000000000..26d897c46 --- /dev/null +++ b/src/commands/mapshaper-frame.js @@ -0,0 +1,139 @@ +/* @require mapshaper-rectangle, mapshaper-projections, mapshaper-furniture */ + +api.frame = function(catalog, source, opts) { + var size, bounds, tmp, dataset; + if (+opts.width > 0 === false && +opts.pixels > 0 === false) { + stop("Missing a width or area"); + } + if (opts.width && opts.height) { + opts = utils.extend({}, opts); + // Height is a string containing either a number or a + // comma-sep. pair of numbers (range); here we convert height to + // an aspect-ratio parameter for the rectangle() function + opts.aspect_ratio = internal.getAspectRatioArg(opts.width, opts.height); + // TODO: currently returns max,min aspect ratio, should return in min,max order + // (rectangle() function should handle max,min argument correctly now anyway) + } + tmp = api.rectangle(source, opts); + bounds = internal.getDatasetBounds(tmp); + if (internal.probablyDecimalDegreeBounds(bounds)) { + stop('Frames require projected, not geographical coordinates'); + } else if (!internal.getDatasetCRS(tmp)) { + message('Warning: missing projection data. Assuming coordinates are meters and k (scale factor) is 1'); + } + size = internal.getFrameSize(bounds, opts); + if (size[0] > 0 === false) { + stop('Missing a valid frame width'); + } + if (size[1] > 0 === false) { + stop('Missing a valid frame height'); + } + dataset = {info: {}, layers:[{ + name: opts.name || 'frame', + data: new DataTable([{ + width: size[0], + height: size[1], + bbox: bounds.toArray(), + type: 'frame' + }]) + }]}; + catalog.addDataset(dataset); +}; + +// Convert width and height args to aspect ratio arg for the rectangle() function +internal.getAspectRatioArg = function(widthArg, heightArg) { + // heightArg is a string containing either a number or a + // comma-sep. pair of numbers (range); + return heightArg.split(',').map(function(opt) { + var height = Number(opt), + width = Number(widthArg); + if (!opt) return ''; + return width / height; + }).reverse().join(','); +}; + +internal.getFrameSize = function(bounds, opts) { + var aspectRatio = bounds.width() / bounds.height(); + var height, width; + if (opts.pixels) { + width = Math.sqrt(+opts.pixels * aspectRatio); + } else { + width = +opts.width; + } + height = width / aspectRatio; + return [Math.round(width), Math.round(height)]; +}; + +internal.getDatasetDisplayBounds = function(dataset) { + var frameLyr = findFrameLayerInDataset(dataset); + if (frameLyr) { + // TODO: check for coordinate issues (non-intersection with other layers, etc) + return internal.getFrameLayerBounds(frameLyr); + } + return internal.getDatasetBounds(dataset); +}; + +// @lyr dataset layer +internal.isFrameLayer = function(lyr) { + return internal.getFurnitureLayerType(lyr) == 'frame'; +}; + +internal.findFrameLayerInDataset = function(dataset) { + return utils.find(dataset.layers, function(lyr) { + return internal.isFrameLayer(lyr); + }); +}; + +internal.findFrameDataset = function(catalog) { + var target = utils.find(catalog.getLayers(), function(o) { + return internal.isFrameLayer(o.layer); + }); + return target ? target.dataset : null; +}; + +internal.findFrameLayer = function(catalog) { + var target = utils.find(catalog.getLayers(), function(o) { + return internal.isFrameLayer(o.layer); + }); + return target && target.layer || null; +}; + +internal.getFrameLayerBounds = function(lyr) { + return new Bounds(internal.getFurnitureLayerData(lyr).bbox); +}; + + +// @data frame data, including crs property if available +// Returns a single value: the ratio or +internal.getMapFrameMetersPerPixel = function(data) { + var bounds = new Bounds(data.bbox); + var k, toMeters, metersPerPixel; + if (data.crs) { + // TODO: handle CRS without inverse projections + // scale factor is the ratio of coordinate distance to true distance at a point + k = internal.getScaleFactorAtXY(bounds.centerX(), bounds.centerY(), data.crs); + toMeters = data.crs.to_meter; + } else { + // Assuming coordinates are meters and k is 1 (not safe) + // A warning should be displayed when relevant furniture element is created + k = 1; + toMeters = 1; + } + metersPerPixel = bounds.width() / k * toMeters / data.width; + return metersPerPixel; +}; + +SVG.furnitureRenderers.frame = function(d) { + var lineWidth = 1, + // inset stroke by half of line width + off = lineWidth / 2, + obj = SVG.importPolygon([[[off, off], [off, d.height - off], + [d.width - off, d.height - off], + [d.width - off, off], [off, off]]]); + utils.extend(obj.properties, { + fill: 'none', + stroke: d.stroke || 'black', + 'stroke-width': d['stroke-width'] || lineWidth + }); + return [obj]; +}; diff --git a/src/commands/mapshaper-fuzzy-join.js b/src/commands/mapshaper-fuzzy-join.js new file mode 100644 index 000000000..724981aee --- /dev/null +++ b/src/commands/mapshaper-fuzzy-join.js @@ -0,0 +1,183 @@ + + +api.fuzzyJoin = function(polygonLyr, arcs, src, opts) { + var pointLyr = src ? src.layer : null; + if (!pointLyr || !internal.layerHasPoints(pointLyr)) { + stop('Missing a point layer to join from'); + } + if (!pointLyr.data || !pointLyr.data.fieldExists(opts.field)) { + stop('Missing', opts.field ? '[' + opts.field + '] field' : 'a field parameter'); + } + internal.requirePolygonLayer(polygonLyr); + if (opts.dedup_points) { + api.uniq(pointLyr, null, {expression: 'this.x + "~" + this.y + "~" + d["' + opts.field + '"]'}); + } + internal.fuzzyJoin(polygonLyr, arcs, pointLyr, opts); +}; + + +internal.fuzzyJoin = function(polygonLyr, arcs, pointLyr, opts) { + var field = opts.field; + var getPointIds = internal.getPolygonToPointsFunction(polygonLyr, arcs, pointLyr, opts); + var getFieldValues = internal.getFieldValuesFunction(pointLyr, field); + var getNeighbors = internal.getNeighborLookupFunction(polygonLyr, arcs); + var unassignedData = []; + var assignedValues = []; + var confidenceValues = []; + var neighborValues = []; + var lowDataIds = []; + var noDataIds = []; + + // first pass: assign high-confidence values, retain low-confidence data + polygonLyr.shapes.forEach(function(shp, i) { + var pointIds = getPointIds(i) || []; // returns null if non found + var values = getFieldValues(pointIds); + var data = internal.getModeData(values, true); + var mode = internal.getHighConfidenceDataValue(data); + var isHighConfidence = mode !== null; + var isLowConfidence = !isHighConfidence && data.count > 1; // using count, not margin + var isNoConfidence = !isHighConfidence && ~isLowConfidence; + neighborValues.push(null); // initialize to null + assignedValues.push(mode); // null or a field value + unassignedData.push(isHighConfidence ? null : data); + confidenceValues.push(isHighConfidence && 'high' || isLowConfidence && 'low' || 'none'); + if (isLowConfidence) { + lowDataIds.push(i); + } else if (isNoConfidence) { + noDataIds.push(i); + } + }); + + // second pass: add strength to low-confidence counts that are bordered by high-confidence shapes + lowDataIds.forEach(function(shpId) { + var nabes = getNeighbors(shpId); + // console.log(shpId, '->', nabes) + // neighborValues[shpId] = nabes; + nabes.forEach(function(nabeId) { + borrowStrength(shpId, nabeId); + }); + // update mode data + var countData = unassignedData[shpId]; + var modeData = internal.getCountDataSummary(countData); + if (modeData.margin > 0) { + assignedValues[shpId] = modeData.modes[0]; + } else { + // demote this shape to nodata group + noDataIds.push(shpId); + } + unassignedData[shpId] = null; // done with this data + }); + + internal.insertFieldValues(polygonLyr, field, assignedValues); + internal.insertFieldValues(polygonLyr, 'confidence', confidenceValues); + // internal.insertFieldValues(polygonLyr, 'neighbors', neighborValues); + if (noDataIds.length > 0) { + api.dataFill(polygonLyr, arcs, {field: field}); + } + + // shpA: id of a low-confidence shape + // shpB: id of a neighbor shape + function borrowStrength(shpA, shpB) { + var val = assignedValues[shpB]; + var data = unassignedData[shpA]; + var counts = data.counts; + var values = data.values; + var weight = 2; + var i; + if (val === null) return; + i = values.indexOf(val); + if (i == -1) { + values.push(val); + counts.push(weight); + } else { + counts[i] += weight; + } + } +}; + +internal.getNeighborLookupFunction = function(lyr, arcs) { + var classify = internal.getArcClassifier(lyr.shapes, arcs)(filter); + var index = {}; // maps shp ids to arrays of neighbor ids + + function filter(a, b) { + return a > -1 ? [a, b] : null; // edges are b == -1 + } + + function onArc(arcId) { + var ab = classify(arcId); + if (ab) { + // len = geom.calcPathLen([arcId], arcs, !arcs.isPlanar()); + addArc(ab[0], ab[1]); + addArc(ab[1], ab[0]); + } + } + + function addArc(shpA, shpB) { + var arr; + if (shpA == -1 || shpB == -1 || shpA == shpB) return; + if (shpA in index === false) { + index[shpA] = []; + } + arr = index[shpA]; + if (arr.indexOf(shpB) == -1) { + arr.push(shpB); + } + } + internal.forEachArcId(lyr.shapes, onArc); + return function(shpId) { + return index[shpId] || []; + }; +}; + +internal.getFieldValuesFunction = function(lyr, field) { + // receive array of feature ids, return mode data + var records = lyr.data.getRecords(); + return function getFieldValues(ids) { + var values = [], rec; + for (var i=0; i 2) { + return o.modes[0]; + } + return null; +}; + +internal.getNeighborsFunction = function(lyr, arcs, opts) { + var index = internal.buildAssignmentIndex(lyr, field, arcs); + var minBorderPct = opts && opts.min_border_pct || 0; + + return function(shpId) { + var nabes = index[shpId]; + var emptyLen = 0; + var fieldLen = 0; + var fieldVal = null; + var nabe, val, len; + + for (var i=0; i 0 ? fieldVal : null; + }; +}; + diff --git a/src/commands/mapshaper-graticule.js b/src/commands/mapshaper-graticule.js index cea41a2b9..3b9a11211 100644 --- a/src/commands/mapshaper-graticule.js +++ b/src/commands/mapshaper-graticule.js @@ -9,9 +9,9 @@ api.graticule = function(dataset, opts) { var dest, src; if (dataset) { // project graticule to match dataset - dest = internal.getDatasetProjection(dataset); - src = internal.getProjection('wgs84'); - if (!dest) stop("[graticule] Coordinate system is unknown, unable to create a graticule"); + dest = internal.getDatasetCRS(dataset); + src = internal.getCRS('wgs84'); + if (!dest) stop("Coordinate system is unknown, unable to create a graticule"); internal.projectDataset(graticule, src, dest, {}); // TODO: densify? } return graticule; diff --git a/src/commands/mapshaper-include.js b/src/commands/mapshaper-include.js new file mode 100644 index 000000000..6a4aa1f79 --- /dev/null +++ b/src/commands/mapshaper-include.js @@ -0,0 +1,33 @@ +/* @requires mapshaper-cli-utils, mapshaper-expressions */ + +internal.include = function(opts) { + var content, obj, context; + // TODO: handle web context + if (!opts.file) { + stop("Missing name of a JS file to load"); + } + // opts.input is an optional file cache (used by applyCommands()) + cli.checkFileExists(opts.file, opts.input); + content = cli.readFile(opts.file, 'utf8', opts.input); + if (typeof content == 'string') { + if (!/^\s*\{[\s\S]*\}\s*$/.test(content)) { + stop("Expected a JavaScript object containing key:value pairs"); + } + try { + // Try to isolate the imported JS code from the program scope and global environment + // TODO: consider whether this is desirable... it may be pointless anyway + // as long as we're passing through the 'require()' function + context = internal.getBaseContext(); + context.require = require; + obj = Function('ctx', 'with(ctx) {return (' + content + ');}').call({}, context); + // obj = eval('(' + content + ')'); + } catch(e) { + stop(e.name, 'in JS source:', e.message); + } + } else if (typeof content == 'object') { + // content could be an object if an object is passed to applyCommands() + obj = content; + } + + utils.extend(internal.getStateVar('defs'), obj); +}; diff --git a/src/commands/mapshaper-info.js b/src/commands/mapshaper-info.js index 9999be915..8b70457e5 100644 --- a/src/commands/mapshaper-info.js +++ b/src/commands/mapshaper-info.js @@ -5,11 +5,34 @@ mapshaper-nodes mapshaper-projections */ -internal.printLayerInfo = function(lyr, dataset, i) { - var str = 'Layer ' + (i + 1) + '\n' + internal.getLayerInfo(lyr, dataset) + '\n'; +internal.printInfo = function(layers, targetLayers) { + var str = ''; + layers.forEach(function(o, i) { + var isTarget = Array.isArray(targetLayers) && targetLayers.indexOf(o.layer) > -1; + var targStr = isTarget ? ' *' : ''; + str += '\n'; + str += 'Layer ' + (i + 1) + targStr + '\n' + internal.getLayerInfo(o.layer, o.dataset); + str += '\n'; + }); message(str); }; +internal.getLayerData = function(lyr, dataset) { + var n = internal.getFeatureCount(lyr); + var o = { + geometry_type: lyr.geometry_type, + feature_count: n, + null_shape_count: 0, + null_data_count: lyr.data ? internal.countNullRecords(lyr.data.getRecords()) : n + }; + if (lyr.shapes) { + o.null_shape_count = internal.countNullShapes(lyr.shapes); + o.bbox =internal.getLayerBounds(lyr, dataset.arcs).toArray(); + o.proj4 = internal.getProjInfo(dataset); + } + return o; +}; + // TODO: consider polygons with zero area or other invalid geometries internal.countNullShapes = function(shapes) { var count = 0; @@ -19,28 +42,45 @@ internal.countNullShapes = function(shapes) { return count; }; +internal.countNullRecords = function(records) { + var count = 0; + for (var i=0; i 0) rings++; + if (area < 0) holes++; + }); + return {rings: rings, holes: holes}; +}; + internal.getLayerInfo = function(lyr, dataset) { + var data = internal.getLayerData(lyr, dataset); var str = "Layer name: " + (lyr.name || "[unnamed]") + "\n"; - str += utils.format("Records: %,d\n", internal.getFeatureCount(lyr)); - str += internal.getGeometryInfo(lyr, dataset); + str += utils.format("Records: %,d\n",data.feature_count); + str += internal.getGeometryInfo(data); str += internal.getTableInfo(lyr); return str; }; -internal.getGeometryInfo = function(lyr, dataset) { - var shapeCount = lyr.shapes ? lyr.shapes.length : 0, - nullCount = shapeCount > 0 ? internal.countNullShapes(lyr.shapes) : 0, - lines; - if (!lyr.geometry_type) { +internal.getGeometryInfo = function(data) { + var lines; + if (!data.geometry_type) { lines = ["Geometry: [none]"]; } else { - lines = ["Geometry", "Type: " + lyr.geometry_type]; - if (nullCount > 0) { - lines.push(utils.format("Null shapes: %'d", nullCount)); + lines = ["Geometry", "Type: " + data.geometry_type]; + if (data.null_shape_count > 0) { + lines.push(utils.format("Null shapes: %'d", data.null_shape_count)); } - if (shapeCount > nullCount) { - lines.push("Bounds: " + internal.getLayerBounds(lyr, dataset.arcs).toArray().join(' ')); - lines.push("Proj.4: " + internal.getProjInfo(dataset)); + if (data.feature_count > data.null_shape_count) { + lines.push("Bounds: " + data.bbox.join(' ')); + lines.push("Proj.4: " + data.proj4); } } return lines.join('\n ') + '\n'; @@ -56,12 +96,12 @@ internal.getTableInfo = function(lyr, i) { internal.getAttributeInfo = function(data, i) { var featureId = i || 0; var featureLabel = i >= 0 ? 'Value' : 'First value'; - var fields = data.getFields().sort(); + var fields = internal.applyFieldOrder(data.getFields(), 'ascending'); var col1Chars = fields.reduce(function(memo, name) { return Math.max(memo, name.length); }, 5) + 2; var vals = fields.map(function(fname) { - return data.getRecordAt(featureId)[fname]; + return data.getReadOnlyRecordAt(featureId)[fname]; }); var maxIntegralChars = vals.reduce(function(max, val) { if (utils.isNumber(val)) { diff --git a/src/commands/mapshaper-innerlines.js b/src/commands/mapshaper-innerlines.js index e32cf70fe..36692fbd6 100644 --- a/src/commands/mapshaper-innerlines.js +++ b/src/commands/mapshaper-innerlines.js @@ -1,98 +1,148 @@ -/* @requires mapshaper-shape-utils */ +/* @requires mapshaper-shape-utils, mapshaper-arc-classifier */ -api.convertPolygonsToInnerLines = function(lyr, arcs, opts) { - if (lyr.geometry_type != 'polygon') { - stop("[innerlines] Command requires a polygon layer"); - } - var arcs2 = internal.convertShapesToArcs(lyr.shapes, arcs.size(), 'inner'), - lyr2 = internal.convertArcsToLineLayer(arcs2, null); - if (lyr2.shapes.length === 0) { - message("[innerlines] No shared boundaries were found"); +api.innerlines = function(lyr, arcs, opts) { + opts = opts || {}; + internal.requirePolygonLayer(lyr); + var filter = opts.where ? internal.compileFeaturePairFilterExpression(opts.where, lyr, arcs) : null; + var classifier = internal.getArcClassifier(lyr.shapes, arcs, filter); + var lines = internal.extractInnerLines(lyr.shapes, classifier); + var outputLyr = internal.createLineLayer(lines, null); + + if (lines.length === 0) { + message("No shared boundaries were found"); } - lyr2.name = opts && opts.no_replace ? null : lyr.name; - return lyr2; + outputLyr.name = opts.no_replace ? null : lyr.name; + return outputLyr; }; -api.convertPolygonsToTypedLines = function(lyr, arcs, fields, opts) { - if (lyr.geometry_type != 'polygon') { - stop("[lines] Command requires a polygon layer"); - } - var arcCount = arcs.size(), - outerArcs = internal.convertShapesToArcs(lyr.shapes, arcCount, 'outer'), - typeCode = 0, - allArcs = [], - allData = [], - innerArcs, lyr2; - - function addArcs(typeArcs) { - var typeData = utils.repeat(typeArcs.length, function(i) { - return {TYPE: typeCode}; - }) || []; - allArcs = utils.merge(typeArcs, allArcs); - allData = utils.merge(typeData, allData); - typeCode++; +api.lines = function(lyr, arcs, opts) { + opts = opts || {}; + var filter = opts.where ? internal.compileFeaturePairFilterExpression(opts.where, lyr, arcs) : null, + decorateRecord = opts.each ? internal.getLineRecordDecorator(opts.each, lyr, arcs) : null, + classifier = internal.getArcClassifier(lyr.shapes, arcs, filter), + fields = utils.isArray(opts.fields) ? opts.fields : [], + rankId = 0, + shapes = [], + records = [], + outputLyr; + + internal.requirePolygonLayer(lyr, "Command requires a polygon layer"); + if (fields.length > 0 && !lyr.data) { + stop("Missing a data table"); } - addArcs(outerArcs); + addLines(internal.extractOuterLines(lyr.shapes, classifier), 'outer'); - if (utils.isArray(fields)) { - if (!lyr.data) { - stop("[lines] Missing a data table:"); - } - fields.forEach(function(field) { - if (!lyr.data.fieldExists(field)) { - stop("[lines] Unknown data field:", field); + fields.forEach(function(field) { + var data = lyr.data.getRecords(); + var key = function(a, b) { + var arec = data[a]; + var brec = data[b]; + var aval, bval; + if (!arec || !brec || arec[field] === brec[field]) { + return null; } - var dissolved = api.dissolve(lyr, arcs, {field: field, silent: true}), - dissolvedArcs = internal.convertShapesToArcs(dissolved.shapes, arcCount, 'inner'); - dissolvedArcs = utils.difference(dissolvedArcs, allArcs); - addArcs(dissolvedArcs); + return a + '-' + b; + }; + if (!lyr.data.fieldExists(field)) { + stop("Unknown data field:", field); + } + addLines(internal.extractLines(lyr.shapes, classifier(key)), field); + }); + + addLines(internal.extractInnerLines(lyr.shapes, classifier), 'inner'); + outputLyr = internal.createLineLayer(shapes, records); + outputLyr.name = opts.no_replace ? null : lyr.name; + return outputLyr; + + function addLines(lines, typeName) { + var attr = lines.map(function(shp, i) { + var rec = {RANK: rankId, TYPE: typeName}; + if (decorateRecord) decorateRecord(rec, shp); + return rec; }); + shapes = utils.merge(lines, shapes); + records = utils.merge(attr, records); + rankId++; } - - innerArcs = internal.convertShapesToArcs(lyr.shapes, arcCount, 'inner'); - innerArcs = utils.difference(innerArcs, allArcs); - addArcs(innerArcs); - lyr2 = internal.convertArcsToLineLayer(allArcs, allData); - lyr2.name = opts && opts.no_replace ? null : lyr.name; - return lyr2; }; +// kludgy way to implement each= option of -lines command +internal.getLineRecordDecorator = function(exp, lyr, arcs) { + // repurpose arc classifier function to convert arc ids to shape ids of original polygons + var procArcId = internal.getArcClassifier(lyr.shapes, arcs)(procShapeIds); + var compiled = internal.compileFeaturePairExpression(exp, lyr, arcs); + var tmp; -internal.convertArcsToLineLayer = function(arcs, data) { - var shapes = internal.convertArcsToShapes(arcs), - lyr = { - geometry_type: 'polyline', - shapes: shapes - }; - if (data) { - lyr.data = new DataTable(data); + function procShapeIds(shpA, shpB) { + compiled(shpA, shpB, tmp); } - return lyr; + + return function(rec, shp) { + tmp = rec; + procArcId(shp[0][0]); + return rec; + }; }; -internal.convertArcsToShapes = function(arcs) { - return arcs.map(function(id) { - return [[id]]; - }); +internal.createLineLayer = function(lines, records) { + return { + geometry_type: 'polyline', + shapes: lines, + data: records ? new DataTable(records) : null + }; +}; + +internal.extractOuterLines = function(shapes, classifier) { + var key = function(a, b) {return b == -1 ? String(a) : null;}; + return internal.extractLines(shapes, classifier(key)); +}; + +internal.extractInnerLines = function(shapes, classifier) { + var key = function(a, b) {return b > -1 ? a + '-' + b : null;}; + return internal.extractLines(shapes, classifier(key)); }; -internal.convertShapesToArcs = function(shapes, arcCount, type) { - type = type || 'all'; - var counts = new Uint8Array(arcCount), - arcs = [], - count; +internal.extractLines = function(shapes, classify) { + var lines = [], + index = {}, + prev = null, + prevKey = null, + part; - internal.countArcsInShapes(shapes, counts); + internal.traversePaths(shapes, onArc, onPart); - for (var i=0, n=counts.length; i 0) { - if (type == 'all' || type == 'outer' && count == 1 || - type == 'inner' && count > 1) { - arcs.push(i); + function onArc(o) { + var arcId = o.arcId, + key = classify(arcId), + isContinuation, line; + if (!!key) { + line = key in index ? index[key] : null; + isContinuation = key == prevKey && o.shapeId == prev.shapeId && o.partId == prev.partId; + if (!line) { + line = [[arcId]]; // new shape + index[key] = line; + lines.push(line); + } else if (isContinuation) { + line[line.length-1].push(arcId); // extending prev part + } else { + line.push([arcId]); // new part + } + + // if extracted line is split across endpoint of original polygon ring, then merge + if (o.i == part.arcs.length - 1 && // this is last arc in ring + line.length > 1 && // extracted line has more than one part + line[0][0] == part.arcs[0]) { // first arc of first extracted part is first arc in ring + line[0] = line.pop().concat(line[0]); } } + prev = o; + prevKey = key; } - return arcs; + + function onPart(o) { + part = o; + } + + return lines; }; diff --git a/src/commands/mapshaper-innerlines2.js b/src/commands/mapshaper-innerlines2.js deleted file mode 100644 index acdef4c85..000000000 --- a/src/commands/mapshaper-innerlines2.js +++ /dev/null @@ -1,124 +0,0 @@ -/* @requires mapshaper-shape-utils, mapshaper-arc-classifier */ - -api.innerlines = function(lyr, arcs, opts) { - internal.requirePolygonLayer(lyr, "[innerlines] Command requires a polygon layer"); - var classifier = internal.getArcClassifier(lyr.shapes, arcs); - var lines = internal.extractInnerLines(lyr.shapes, classifier); - var outputLyr = internal.createLineLayer(lines, null); - - if (lines.length === 0) { - message("[innerlines] No shared boundaries were found"); - } - outputLyr.name = opts && opts.no_replace ? null : lyr.name; - return outputLyr; -}; - -api.lines = function(lyr, arcs, opts) { - opts = opts || {}; - var classifier = internal.getArcClassifier(lyr.shapes, arcs), - fields = utils.isArray(opts.fields) ? opts.fields : [], - typeId = 0, - shapes = [], - records = [], - outputLyr; - - internal.requirePolygonLayer(lyr, "[lines] Command requires a polygon layer"); - if (fields.length > 0 && !lyr.data) { - stop("[lines] Missing a data table"); - } - - addLines(internal.extractOuterLines(lyr.shapes, classifier)); - - fields.forEach(function(field) { - var data = lyr.data.getRecords(); - var key = function(a, b) { - var arec = data[a]; - var brec = data[b]; - var aval, bval; - if (!arec || !brec || arec[field] === brec[field]) { - return null; - } - return a + '-' + b; - }; - if (!lyr.data.fieldExists(field)) { - stop("[lines] Unknown data field:", field); - } - addLines(internal.extractLines(lyr.shapes, classifier(key))); - }); - - addLines(internal.extractInnerLines(lyr.shapes, classifier)); - outputLyr = internal.createLineLayer(shapes, records); - outputLyr.name = opts.no_replace ? null : lyr.name; - return outputLyr; - - function addLines(lines) { - var attr = lines.map(function(shp, i) { - return {TYPE: typeId}; - }); - shapes = utils.merge(lines, shapes); - records = utils.merge(attr, records); - typeId++; - } -}; - -internal.createLineLayer = function(lines, records) { - return { - geometry_type: 'polyline', - shapes: lines, - data: records ? new DataTable(records) : null - }; -}; - -internal.extractOuterLines = function(shapes, classifier) { - var key = function(a, b) {return b == -1 ? String(a) : null;}; - return internal.extractLines(shapes, classifier(key)); -}; - -internal.extractInnerLines = function(shapes, classifier) { - var key = function(a, b) {return b > -1 ? a + '-' + b : null;}; - return internal.extractLines(shapes, classifier(key)); -}; - -internal.extractLines = function(shapes, classify) { - var lines = [], - index = {}, - prev = null, - prevKey = null, - part; - - internal.traversePaths(shapes, onArc, onPart); - - function onArc(o) { - var arcId = o.arcId, - key = classify(arcId), - isContinuation, line; - if (!!key) { - line = key in index ? index[key] : null; - isContinuation = key == prevKey && o.shapeId == prev.shapeId && o.partId == prev.partId; - if (!line) { - line = [[arcId]]; // new shape - index[key] = line; - lines.push(line); - } else if (isContinuation) { - line[line.length-1].push(arcId); // extending prev part - } else { - line.push([arcId]); // new part - } - - // if extracted line is split across endpoint of original polygon ring, then merge - if (o.i == part.arcs.length - 1 && // this is last arc in ring - line.length > 1 && // extracted line has more than one part - line[0][0] == part.arcs[0]) { // first arc of first extracted part is first arc in ring - line[0] = line.pop().concat(line[0]); - } - } - prev = o; - prevKey = key; - } - - function onPart(o) { - part = o; - } - - return lines; -}; diff --git a/src/commands/mapshaper-inspect.js b/src/commands/mapshaper-inspect.js index 2139aa9f1..48d6b520c 100644 --- a/src/commands/mapshaper-inspect.js +++ b/src/commands/mapshaper-inspect.js @@ -6,7 +6,7 @@ api.inspect = function(lyr, arcs, opts) { if (ids.length == 1) { msg = internal.getFeatureInfo(ids[0], lyr, arcs); } else { - msg = utils.format("[inspect] Expression matched %d feature%s. Select one feature for details", ids.length, utils.pluralSuffix(ids.length)); + msg = utils.format("Expression matched %d feature%s. Select one feature for details", ids.length, utils.pluralSuffix(ids.length)); } message(msg); }; @@ -64,7 +64,7 @@ internal.selectFeatures = function(lyr, arcs, opts) { ids = [], filter; if (!opts.expression) { - stop("[inspect] Missing a JS expression for selecting a feature"); + stop("Missing a JS expression for selecting a feature"); } filter = internal.compileValueExpression(opts.expression, lyr, arcs); utils.repeat(n, function(id) { @@ -72,7 +72,7 @@ internal.selectFeatures = function(lyr, arcs, opts) { if (result === true) { ids.push(id); } else if (result !== false) { - stop("[inspect] Expression must return true or false"); + stop("Expression must return true or false"); } }); return ids; diff --git a/src/commands/mapshaper-join.js b/src/commands/mapshaper-join.js index d4b983537..077d14fe3 100644 --- a/src/commands/mapshaper-join.js +++ b/src/commands/mapshaper-join.js @@ -11,12 +11,12 @@ mapshaper-join-calc api.join = function(targetLyr, dataset, src, opts) { var srcType, targetType, retn; if (!src || !src.layer.data || !src.dataset) { - stop("[join] Missing a joinable data source"); + stop("Missing a joinable data source"); } if (opts.keys) { // join using data in attribute fields if (opts.keys.length != 2) { - stop("[join] Expected two key fields: a target field and a source field"); + stop("Expected two key fields: a target field and a source field"); } retn = api.joinAttributesToFeatures(targetLyr, src.layer.data, opts); } else { @@ -27,8 +27,10 @@ api.join = function(targetLyr, dataset, src, opts) { retn = api.joinPointsToPolygons(targetLyr, dataset.arcs, src.layer, opts); } else if (srcType == 'polygon' && targetType == 'point') { retn = api.joinPolygonsToPoints(targetLyr, src.layer, src.dataset.arcs, opts); + } else if (srcType == 'point' && targetType == 'point') { + retn = api.joinPointsToPoints(targetLyr, src.layer, opts); } else { - stop(utils.format("[join] Unable to join %s geometry to %s geometry", + stop(utils.format("Unable to join %s geometry to %s geometry", srcType || 'null', targetType || 'null')); } } @@ -41,24 +43,21 @@ api.join = function(targetLyr, dataset, src, opts) { } }; -internal.removeTypeHints = function(arr) { - var arr2 = internal.parseFieldHeaders(arr, {}); - if (arr.join(',') != arr2.join(',')) { - stop("[join] Type hints are no longer supported. Use field-types= option instead"); - } - return arr; +internal.validateFieldNames = function(arr) { + arr.forEach(function(name) { + if (/:(str|num)/.test(name)) { + stop("Unsupported use of type hints. Use string-fields= or field-types= options instead"); + } + }); }; api.joinAttributesToFeatures = function(lyr, srcTable, opts) { - var keys = internal.removeTypeHints(opts.keys), + var keys = opts.keys, destKey = keys[0], srcKey = keys[1], destTable = lyr.data, - // exclude source key field from join unless explicitly listed - joinFields = opts.fields || utils.difference(srcTable.getFields(), [srcKey]), joinFunction = internal.getJoinByKey(destTable, destKey, srcTable, srcKey); - - opts = utils.defaults({fields: joinFields}, opts); + internal.validateFieldNames(keys); return internal.joinTables(destTable, srcTable, joinFunction, opts); }; @@ -77,8 +76,10 @@ internal.joinTables = function(dest, src, join, opts) { joinCounts = new Uint32Array(srcRecords.length), matchCount = 0, collisionCount = 0, + collisionFields = [], + skipCount = 0, retn = {}, - srcRec, srcId, destRec, joinIds, joins, count, filter, calc; + srcRec, srcId, destRec, joins, count, filter, calc, i, j, n, m; if (opts.where) { filter = internal.getJoinFilter(src, opts.where); @@ -89,23 +90,27 @@ internal.joinTables = function(dest, src, join, opts) { } // join source records to target records - for (var i=0, n=destRecords.length; i 0) { - if (count === 0) { + if (count === 0) { + if (copyFields.length > 0) { // only copying the first match internal.joinByCopy(destRec, srcRec, copyFields); - } else { - collisionCount++; } + } else if (count == 1) { + if (copyFields.length > 0) { + internal.findCollisionFields(destRec, srcRec, copyFields, collisionFields); + } + collisionCount++; // count target records with multiple joins } if (sumFields.length > 0) { internal.joinBySum(destRec, srcRec, sumFields); @@ -127,12 +132,9 @@ internal.joinTables = function(dest, src, join, opts) { internal.updateUnmatchedRecord(destRec, copyFields, sumFields); } } - if (matchCount === 0) { - stop("[join] No records could be joined"); - } internal.printJoinMessage(matchCount, destRecords.length, - internal.countJoins(joinCounts), srcRecords.length, collisionCount); + internal.countJoins(joinCounts), srcRecords.length, skipCount, collisionCount, collisionFields); if (opts.unjoined) { retn.unjoined = { @@ -189,6 +191,16 @@ internal.joinByCopy = function(dest, src, fields) { } }; +internal.findCollisionFields = function(dest, src, fields, collisionFields) { + var f; + for (var i=0, n=fields.length; i 0 === false) { + message("No records could be joined"); + return; + } + message(utils.format("Joined data from %'d source record%s to %'d target record%s", + joins, utils.pluralSuffix(joins), matches, utils.pluralSuffix(matches))); if (matches < n) { - message(utils.format('[join] %d/%d target records received no data', n-matches, n)); + message(utils.format('%d/%d target records received no data', n-matches, n)); } if (joins < m) { - message(utils.format("[join] %d/%d source records could not be joined", m-joins, m)); + message(utils.format("%d/%d source records could not be joined", m-joins, m)); + } + if (skipped > 0) { + message(utils.format("%d/%d source records were skipped", skipped, m)); } if (collisions > 0) { - message(utils.format("[join] %'d collision%s occured; data was copied from the first matching source record", - collisions, utils.pluralSuffix(collisions))); + message(utils.format('%d/%d target records were matched by multiple source records', collisions, n)); + if (collisionFields.length > 0) { + message(utils.format('Found inconsistent values in field%s [%s] during many-to-one join', utils.pluralSuffix(collisionFields.length), collisionFields.join(', '))); + } } }; @@ -219,12 +240,17 @@ internal.getFieldsToJoin = function(destFields, srcFields, opts) { if (opts.fields.indexOf('*') > -1) { joinFields = srcFields; } else { - joinFields = internal.removeTypeHints(opts.fields); + joinFields = opts.fields; + internal.validateFieldNames(joinFields); } } else { - // If a list of fields to join is not given, try to join all the - // source fields, unless calc= option is present - joinFields = opts.calc ? [] : srcFields; + // If a list of fields to join is not given, try to join all of the + // source fields + joinFields = srcFields; + // exclude source key field from key-based join (if fields are not given explicitly) + if (opts.keys) { + joinFields = utils.difference(joinFields, [opts.keys[1]]); + } } if (!opts.force) { // only overwrite existing fields if the "force" option is set. @@ -233,34 +259,54 @@ internal.getFieldsToJoin = function(destFields, srcFields, opts) { return joinFields; }; +internal.validateJoinFieldType = function(field, type) { + if (!type || type == 'object') { + stop('[' + field + '] field has an unsupported data type. Expected string or number.'); + } +}; + // Return a function for translating a target id to an array of source ids based on values // of two key fields. internal.getJoinByKey = function(dest, destKey, src, srcKey) { var destRecords = dest.getRecords(); var index = internal.createTableIndex(src.getRecords(), srcKey); + var srcType, destType; if (src.fieldExists(srcKey) === false) { - stop("[join] External table is missing a field named:", srcKey); + stop("External table is missing a field named:", srcKey); } if (!dest || !dest.fieldExists(destKey)) { - stop("[join] Target layer is missing key field:", destKey); + stop("Target layer is missing key field:", destKey); + } + srcType = internal.getColumnType(srcKey, src.getRecords()); + destType = internal.getColumnType(destKey, destRecords); + internal.validateJoinFieldType(srcKey, srcType); + internal.validateJoinFieldType(destKey, destType); + if (srcType != destType) { + stop("Join keys have mismatched data types:", destType, "and", srcType); } return function(i) { var destRec = destRecords[i], - val = destRec ? destRec[destKey] : null; - return destRec && val in index ? index[val] : null; + val = destRec ? destRec[destKey] : null, + retn = null; + if (destRec && val in index) { + retn = index[val]; + if (!Array.isArray(retn)) retn = [retn]; + } + return retn; }; }; - internal.createTableIndex = function(records, f) { var index = {}, rec, key; for (var i=0, n=records.length; i 1) { + stop("Incompatible geometry types:", + geoTypes.map(function(type) {return type || '[none]';}).join(', ')); + } + return geoTypes[0] || null; }; -internal.checkFieldTypes = function(key, layers) { - // ignores empty-type fields +internal.mergeShapesFromLayers = function(layers) { return layers.reduce(function(memo, lyr) { - var type = lyr.data ? internal.getColumnType(key, lyr.data) : null; - if (type && memo.indexOf(type) == -1) { - memo.push(type); - } - return memo; + return memo.concat(lyr.shapes); }, []); }; -internal.findMissingFields = function(layers) { - var matrix = layers.map(function(lyr) {return lyr.data ? lyr.data.getFields() : [];}); - var allFields = matrix.reduce(function(memo, fields) { - return utils.uniq(memo.concat(fields)); - }, []); - return matrix.reduce(function(memo, fields) { - var diff = utils.difference(allFields, fields); - return utils.uniq(memo.concat(diff)); +internal.mergeDataFromLayers = function(layers, force) { + var allFields = utils.uniq(layers.reduce(function(memo, lyr) { + return memo.concat(lyr.data ? lyr.data.getFields() : []); + }, [])); + if (allFields.length === 0) return null; // no data in any fields + var missingFields = internal.checkMergeLayersInconsistentFields(allFields, layers, force); + var mergedRecords = layers.reduce(function(memo, lyr) { + var records = lyr.data ? lyr.data.getRecords() : new DataTable(internal.getFeatureCount(lyr)).getRecords(); + return memo.concat(records); }, []); + if (missingFields.length > 0) { + internal.fixInconsistentFields(mergedRecords); + } + return new DataTable(mergedRecords); }; -internal.checkLayersCanMerge = function(layers) { - var geoTypes = utils.uniq(utils.pluck(layers, 'geometry_type')), - fields = layers[0].data ? layers[0].data.getFields() : [], - missingFields = internal.findMissingFields(layers); - if (utils.uniq(geoTypes).length > 1) { - stop("[merge-layers] Incompatible geometry types:", - geoTypes.map(function(type) {return type || '[none]';}).join(', ')); - } +internal.checkMergeLayersInconsistentFields = function(allFields, layers, force) { + var msg; + // handle fields that are missing from one or more layers + // (warn if force-merging, else error) + var missingFields = utils.uniq(layers.reduce(function(memo, lyr) { + return memo.concat(utils.difference(allFields, lyr.data ? lyr.data.getFields() : [])); + }, [])); if (missingFields.length > 0) { - stop("[merge-layers] Field" + utils.pluralSuffix(missingFields.length), "missing from one or more layers:", - missingFields.join(', ')); + msg = '[' + missingFields.join(', ') + ']'; + msg = (missingFields.length == 1 ? 'Field ' + msg + ' is missing' : 'Fields ' + msg + ' are missing') + ' from one or more layers'; + if (force) { + message('Warning: ' + msg); + } else { + stop(msg); + } } + // check for fields with incompatible data types (e.g. number, string) + internal.checkMergeLayersFieldTypes(allFields, layers); + return missingFields; +}; + +internal.checkMergeLayersFieldTypes = function(fields, layers) { fields.forEach(function(key) { var types = internal.checkFieldTypes(key, layers); if (types.length > 1) { - stop("[merge-layers] Inconsistent data types in \"" + key + "\" field:", types.join(', ')); + stop("Inconsistent data types in \"" + key + "\" field:", types.join(', ')); } }); }; + +internal.checkFieldTypes = function(key, layers) { + // ignores empty-type fields + return layers.reduce(function(memo, lyr) { + var type = lyr.data ? internal.getColumnType(key, lyr.data.getRecords()) : null; + if (type && memo.indexOf(type) == -1) { + memo.push(type); + } + return memo; + }, []); +}; + +internal.mergeLayerNames = function(layers) { + return layers.reduce(function(memo, lyr) { + if (memo === null) { + memo = lyr.name || null; + } else if (memo && lyr.name) { + memo = utils.mergeNames(memo, lyr.name); + } + return memo; + }, null) || ''; +}; diff --git a/src/commands/mapshaper-point-grid.js b/src/commands/mapshaper-point-grid.js index fdbfee83c..f2305624c 100644 --- a/src/commands/mapshaper-point-grid.js +++ b/src/commands/mapshaper-point-grid.js @@ -1,21 +1,83 @@ -/* @requires mapshaper-dataset-utils */ +/* @requires mapshaper-dataset-utils, geojson-import */ api.pointGrid = function(dataset, opts) { - var bbox, gridLyr; + var gridOpts = internal.getPointGridParams(dataset, opts); + return internal.createPointGridLayer(internal.createPointGrid(gridOpts), opts); +}; + +api.polygonGrid = function(dataset, opts) { + var gridOpts = internal.getPointGridParams(dataset, opts); + return internal.createPolygonGridDataset(internal.createPointGrid(gridOpts), opts); +}; + +internal.getPointGridParams = function(dataset, opts) { + var params = {}; + var crs = dataset ? internal.getDatasetCRS(dataset) : null; + if (opts.interval) { + params.interval = internal.convertIntervalParam(opts.interval, crs); + } else if (opts.rows > 0 && opts.cols > 0) { + params.rows = opts.rows; + params.cols = opts.cols; + } else { + // error, handled later + } if (opts.bbox) { - bbox = opts.bbox; + params.bbox = opts.bbox; } else if (dataset) { - bbox = internal.getDatasetBounds(dataset).toArray(); + params.bbox = internal.getDatasetBounds(dataset).toArray(); } else { - bbox = [-180, -90, 180, 90]; + params.bbox = [-180, -90, 180, 90]; } - return internal.createPointGrid(bbox, opts); + return params; }; -internal.createPointGrid = function(bbox, opts) { - var w = bbox[2] - bbox[0], +internal.createPointGridLayer = function(rows, opts) { + var points = [], lyr; + rows.forEach(function(row, rowId) { + for (var i=0; i 0) { @@ -35,20 +97,18 @@ internal.createPointGrid = function(bbox, opts) { } if (dx > 0 === false || dy > 0 === false) { - stop('[point-grid] Invalid grid parameters'); + stop('Invalid grid parameters'); } y = y0; while (y <= bbox[3]) { x = x0; + rowsArr.push(rowArr = []); while (x <= bbox[2]) { - points.push([[x, y]]); + rowArr.push([x, y]); x += dx; } y += dy; } - return { - geometry_type: 'point', - shapes: points - }; + return rowsArr; }; diff --git a/src/commands/mapshaper-points.js b/src/commands/mapshaper-points.js index 5591496c6..a5527c30a 100644 --- a/src/commands/mapshaper-points.js +++ b/src/commands/mapshaper-points.js @@ -2,13 +2,36 @@ mapshaper-data-table mapshaper-dataset-utils mapshaper-polygon-centroid +mapshaper-anchor-points +mapshaper-inner-points +mapshaper-polyline-to-point +mapshaper-geom */ -api.createPointLayer = function(srcLyr, arcs, opts) { +api.createPointLayer = function(srcLyr, dataset, opts) { var destLyr = internal.getOutputLayer(srcLyr, opts); - destLyr.shapes = opts.x || opts.y ? - internal.pointsFromDataTable(srcLyr.data, opts) : - internal.pointsFromPolygons(srcLyr, arcs, opts); + var arcs = dataset.arcs; + if (opts.intersections) { + internal.testIntersections(arcs); + destLyr = srcLyr; + } else if (opts.interpolated) { + // TODO: consider making attributed points, including distance from origin + destLyr.shapes = internal.interpolatedPointsFromVertices(srcLyr, dataset, opts); + } else if (opts.vertices) { + destLyr.shapes = internal.pointsFromVertices(srcLyr, arcs, opts); + } else if (opts.vertices2) { + destLyr.shapes = internal.pointsFromVertices2(srcLyr, arcs, opts); + } else if (opts.endpoints) { + destLyr.shapes = internal.pointsFromEndpoints(srcLyr, arcs, opts); + } else if (opts.x || opts.y) { + destLyr.shapes = internal.pointsFromDataTable(srcLyr.data, opts); + } else if (srcLyr.geometry_type == 'polygon') { + destLyr.shapes = internal.pointsFromPolygons(srcLyr, arcs, opts); + } else if (srcLyr.geometry_type == 'polyline') { + destLyr.shapes = internal.pointsFromPolylines(srcLyr, arcs, opts); + } else { + stop("Expected a polygon or polyline layer"); + } destLyr.geometry_type = 'point'; var nulls = destLyr.shapes.reduce(function(sum, shp) { @@ -17,7 +40,7 @@ api.createPointLayer = function(srcLyr, arcs, opts) { }, 0); if (nulls > 0) { - message(utils.format('[points] %,d of %,d points are null', nulls, destLyr.shapes.length)); + message(utils.format('%,d of %,d points are null', nulls, destLyr.shapes.length)); } if (srcLyr.data) { destLyr.data = opts.no_replace ? srcLyr.data.clone() : srcLyr.data; @@ -25,11 +48,166 @@ api.createPointLayer = function(srcLyr, arcs, opts) { return destLyr; }; -internal.pointsFromPolygons = function(lyr, arcs, opts) { - if (lyr.geometry_type != "polygon") { - stop("[points] Expected a polygon layer"); +// TODO: finish testing stripe count functions and remove +internal.testIntersections = function(arcs) { + var pointCount = arcs.getFilteredPointCount(), + arcCount = arcs.size(), + segCount = pointCount - arcCount, + stripes = internal.calcSegmentIntersectionStripeCount2(arcs), + stripes2 = Math.ceil(stripes / 10), + stripes3 = stripes * 10, + stripes4 = internal.calcSegmentIntersectionStripeCount(arcs); + + console.log("points:", pointCount, "arcs:", arcCount, "segs:", segCount); + [stripes2, stripes, stripes3, stripes4].forEach(function(n) { + console.time(n + ' stripes'); + internal.findSegmentIntersections(arcs, {stripes: n}); + console.timeEnd(n + ' stripes'); + }); +}; + +internal.interpolatePoint2D = function(ax, ay, bx, by, k) { + var j = 1 - k; + return [ax * j + bx * k, ay * j + by * k]; +}; + +internal.interpolatePointsAlongArc = function(ids, arcs, interval) { + var iter = arcs.getShapeIter(ids); + var distance = arcs.isPlanar() ? distance2D : greatCircleDistance; + var coords = []; + var elapsedDist = 0; + var prevX, prevY; + var segLen, k, p; + if (iter.hasNext()) { + coords.push([iter.x, iter.y]); + prevX = iter.x; + prevY = iter.y; + } + while (iter.hasNext()) { + segLen = distance(prevX, prevY, iter.x, iter.y); + while (elapsedDist + segLen >= interval) { + k = (interval - elapsedDist) / segLen; + // TODO: consider using great-arc distance for lat-long points + p = internal.interpolatePoint2D(prevX, prevY, iter.x, iter.y, k); + elapsedDist = 0; + coords.push(p); + prevX = p[0]; + prevY = p[1]; + segLen = distance(prevX, prevY, iter.x, iter.y); + } + elapsedDist += segLen; + prevX = iter.x; + prevY = iter.y; + } + if (elapsedDist > 0) { + coords.push([prevX, prevY]); + } + return coords; +}; + +internal.interpolatedPointsFromVertices = function(lyr, dataset, opts) { + var interval = internal.convertIntervalParam(opts.interval, internal.getDatasetCRS(dataset)); + var coords; + if (interval > 0 === false) stop("Invalid interpolation interval:", opts.interval); + if (lyr.geometry_type != 'polyline') stop("Expected a polyline layer"); + return lyr.shapes.map(function(shp, shpId) { + coords = []; + if (shp) shp.forEach(nextPart); + return coords.length > 0 ? coords : null; + }); + function nextPart(ids) { + var points = internal.interpolatePointsAlongArc(ids, dataset.arcs, interval); + coords = coords.concat(points); + } +}; + +// Unique vertices within each feature +internal.pointsFromVertices = function(lyr, arcs, opts) { + var coords, index; + if (lyr.geometry_type != "polygon" && lyr.geometry_type != 'polyline') { + stop("Expected a polygon or polyline layer"); + } + return lyr.shapes.map(function(shp, shpId) { + coords = []; + index = {}; // TODO: use more efficient index + (shp || []).forEach(nextPart); + return coords.length > 0 ? coords : null; + }); + + function addPoint(p) { + var key = p.x + '~' + p.y; + if (key in index === false) { + index[key] = true; + coords.push([p.x, p.y]); + } + } + + function nextPart(ids) { + var iter = arcs.getShapeIter(ids); + while (iter.hasNext()) { + addPoint(iter); + } } - var func = opts.inner ? geom.findInteriorPoint : geom.getShapeCentroid; +}; + +// Simple conversion of path vertices to points (duplicate locations not removed) +// TODO: Provide some way to rebuild paths from points (e.g. multipart features) +internal.pointsFromVertices2 = function(lyr, arcs, opts) { + var coords; + if (lyr.geometry_type != "polygon" && lyr.geometry_type != 'polyline') { + stop("Expected a polygon or polyline layer"); + } + return lyr.shapes.map(function(shp, shpId) { + coords = []; + (shp || []).forEach(nextPart); + return coords.length > 0 ? coords : null; + }); + + function nextPart(ids) { + var iter = arcs.getShapeIter(ids); + while (iter.hasNext()) { + coords.push([iter.x, iter.y]); + } + } +}; + +internal.pointsFromEndpoints = function(lyr, arcs) { + var coords, index; + if (lyr.geometry_type != "polygon" && lyr.geometry_type != 'polyline') { + stop("Expected a polygon or polyline layer"); + } + return lyr.shapes.map(function(shp, shpId) { + coords = []; + index = {}; // TODO: use more efficient index + (shp || []).forEach(nextPart); + return coords.length > 0 ? coords : null; + }); + + function addPoint(p) { + var key = p.x + '~' + p.y; + if (key in index === false) { + index[key] = true; + coords.push([p.x, p.y]); + } + } + + function nextPart(ids) { + for (var i=0; i 0) { + dataset = sources[0].dataset; + info.crs = internal.getDatasetCRS(dataset); + info.prj = dataset.info.prj; // may be undefined + // defn = internal.crsToProj4(P); + } else { + // assume name is a projection defn + info.crs = internal.getCRS(name); + } } + return info; }; - internal.projectDataset = function(dataset, src, dest, opts) { var proj = internal.getProjTransform(src, dest); dataset.layers.forEach(function(lyr) { @@ -78,22 +108,6 @@ internal.projectDataset = function(dataset, src, dest, opts) { } }; -internal.getProjTransform = function(src, dest) { - var mproj = require('mproj'); - var clampSrc = src.is_latlong; - return function(x, y) { - var xy; - if (clampSrc) { - // snap lng to bounds - if (x < -180) x = -180; - else if (x > 180) x = 180; - } - xy = [x, y]; - mproj.pj_transform_point(src, dest, xy); - return xy; - }; -}; - internal.projectPointLayer = function(lyr, proj) { internal.forEachPoint(lyr.shapes, function(p) { var p2 = proj(p[0], p[1]); diff --git a/src/commands/mapshaper-rectangle.js b/src/commands/mapshaper-rectangle.js new file mode 100644 index 000000000..64e86d8b3 --- /dev/null +++ b/src/commands/mapshaper-rectangle.js @@ -0,0 +1,132 @@ +/* @require mapshaper-geojson, mapshaper-dataset-utils */ + +// Create rectangles around each feature in a layer +api.rectangles = function(targetLyr, targetDataset, opts) { + if (!internal.layerHasGeometry(targetLyr)) { + stop("Layer is missing geometric shapes"); + } + var crs = internal.getDatasetCRS(targetDataset); + var records = targetLyr.data ? targetLyr.data.getRecords() : null; + var geometries = targetLyr.shapes.map(function(shp) { + var bounds = targetLyr.geometryType == 'point' ? + internal.getPointFeatureBounds(shp) : targetDataset.arcs.getMultiShapeBounds(shp); + bounds = internal.applyRectangleOptions(bounds, crs, opts); + if (!bounds) return null; + return internal.convertBboxToGeoJSON(bounds.toArray(), opts); + }); + var geojson = { + type: 'FeatureCollection', + features: geometries.map(function(geom, i) { + var rec = records && records[i] || null; + if (rec && opts.no_replace) { + rec = utils.extend({}, rec); // make a copy + } + return { + type: 'Feature', + properties: rec, + geometry: geom + }; + }) + }; + var dataset = internal.importGeoJSON(geojson, {}); + var merged = internal.mergeDatasets([targetDataset, dataset]); + var outputLyr = dataset.layers[0]; + targetDataset.arcs = merged.arcs; + if (!opts.no_replace) { + outputLyr.name = targetLyr.name || outputLyr.name; + } + return [outputLyr]; +}; + +// Create rectangles around one or more target layers +// +api.rectangle2 = function(target, opts) { + var outputLayers = []; + var datasets = target.layers.map(function(lyr) { + var dataset = api.rectangle({layer: lyr, dataset: target.dataset}, opts); + outputLayers.push(dataset.layers[0]); + if (!opts.no_replace) { + dataset.layers[0].name = lyr.name || dataset.layers[0].name; + } + return dataset; + }); + var merged = internal.mergeDatasets([target.dataset].concat(datasets)); + target.dataset.arcs = merged.arcs; + return outputLayers; +}; + +api.rectangle = function(source, opts) { + var offsets, bounds, crs, coords, sourceInfo; + if (source) { + bounds = internal.getLayerBounds(source.layer, source.dataset.arcs); + sourceInfo = source.dataset.info; + crs = internal.getDatasetCRS(source.dataset); + } else if (opts.bbox) { + bounds = new Bounds(opts.bbox); + crs = internal.getCRS('wgs84'); + } + bounds = bounds && internal.applyRectangleOptions(bounds, crs, opts); + if (!bounds || !bounds.hasBounds()) { + stop('Missing rectangle extent'); + } + var geojson = internal.convertBboxToGeoJSON(bounds.toArray(), opts); + var dataset = internal.importGeoJSON(geojson, {}); + dataset.layers[0].name = opts.name || 'rectangle'; + if (sourceInfo) { + internal.setDatasetCRS(dataset, sourceInfo); + } + return dataset; +}; + +internal.applyRectangleOptions = function(bounds, crs, opts) { + var isGeoBox = internal.probablyDecimalDegreeBounds(bounds); + if (opts.offset) { + bounds = internal.applyBoundsOffset(opts.offset, bounds, crs); + } + if (bounds.area() > 0 === false) return null; + if (opts.aspect_ratio) { + bounds = internal.applyAspectRatio(opts.aspect_ratio, bounds); + } + if (isGeoBox) { + bounds = internal.clampToWorldBounds(bounds); + } + return bounds; +}; + +// opt: aspect ratio as a single number or a range (e.g. "1,2"); +internal.applyAspectRatio = function(opt, bounds) { + var range = String(opt).split(',').map(parseFloat), + aspectRatio = bounds.width() / bounds.height(), + min, max; // min is height limit, max is width limit + if (range.length == 1) { + range.push(range[0]); + } else if (range[0] > range[1]) { + range.reverse(); + } + min = range[0]; + max = range[1]; + if (!min && !max) return bounds; + if (!min) min = -Infinity; + if (!max) max = Infinity; + if (aspectRatio < min) { + bounds.fillOut(min); + } else if (aspectRatio > max) { + bounds.fillOut(max); + } + return bounds; +}; + +internal.applyBoundsOffset = function(offsetOpt, bounds, crs) { + var offsets = internal.convertFourSides(offsetOpt, crs, bounds); + bounds.padBounds(offsets[0], offsets[1], offsets[2], offsets[3]); + return bounds; +}; + +internal.convertBboxToGeoJSON = function(bbox, opts) { + var coords = [[bbox[0], bbox[1]], [bbox[0], bbox[3]], [bbox[2], bbox[3]], + [bbox[2], bbox[1]], [bbox[0], bbox[1]]]; + return { + type: 'Polygon', + coordinates: [coords] + }; +}; diff --git a/src/commands/mapshaper-rename-layers.js b/src/commands/mapshaper-rename-layers.js index 0763996ac..83b8b9631 100644 --- a/src/commands/mapshaper-rename-layers.js +++ b/src/commands/mapshaper-rename-layers.js @@ -2,16 +2,15 @@ api.renameLayers = function(layers, names) { var nameCount = names && names.length || 0; + var name = 'layer'; + var suffix = ''; layers.forEach(function(lyr, i) { - var name; - if (nameCount === 0) { - name = "layer" + (i + 1); - } else { - name = i < nameCount - 1 ? names[i] : names[nameCount - 1]; - if (nameCount < layers.length && i >= nameCount - 2) { - name += i - nameCount + 2; - } + if (i < nameCount) { + name = names[i]; } - lyr.name = name; + if (nameCount < layers.length && (i >= nameCount - 1)) { + suffix = (suffix || 0) + 1; + } + lyr.name = name + suffix; }); }; diff --git a/src/commands/mapshaper-require.js b/src/commands/mapshaper-require.js new file mode 100644 index 000000000..cf49ceeb1 --- /dev/null +++ b/src/commands/mapshaper-require.js @@ -0,0 +1,32 @@ +/* @requires mapshaper-run, mapshaper-expressions */ + +api.require = function(targets, opts) { + var defs = internal.getStateVar('defs'); + var moduleFile, moduleName, mod; + if (!opts.module) { + stop("Missing module name or path to module"); + } + if (cli.isFile(opts.module)) { + moduleFile = opts.module; + } else if (cli.isFile(opts.module + '.js')) { + moduleFile = opts.module + '.js'; + } else { + moduleName = opts.module; + } + if (moduleFile) { + moduleFile = require('path').join(process.cwd(), moduleFile); + } + try { + mod = require(moduleFile || moduleName); + } catch(e) { + stop(e); + } + if (moduleName || opts.alias) { + defs[opts.alias || moduleName] = mod; + } else { + utils.extend(defs, mod); + } + if (opts.init) { + internal.runGlobalExpression(opts.init, targets); + } +}; diff --git a/src/commands/mapshaper-run.js b/src/commands/mapshaper-run.js new file mode 100644 index 000000000..5fd650cd3 --- /dev/null +++ b/src/commands/mapshaper-run.js @@ -0,0 +1,45 @@ + +/* @requires mapshaper-include, mapshaper-info */ + +api.run = function(targets, catalog, opts, cb) { + var commandStr, commands; + if (opts.include) { + internal.include({file: opts.include}); + } + if (!opts.commands) { + stop("Missing commands parameter"); + } + commandStr = internal.runGlobalExpression(opts.commands, targets); + if (commandStr) { + commands = internal.parseCommands(commandStr); + internal.runParsedCommands(commands, catalog, cb); + } else { + cb(null); + } +}; + +internal.runGlobalExpression = function(expression, targets) { + var ctx = internal.getBaseContext(); + var output, targetData; + // TODO: throw an informative error if target is used when there are multiple targets + if (targets.length == 1) { + targetData = internal.getRunCommandData(targets[0]); + Object.defineProperty(ctx, 'target', {value: targetData}); + } + utils.extend(ctx, internal.getStateVar('defs')); + try { + output = Function('ctx', 'with(ctx) {return (' + expression + ');}').call({}, ctx); + } catch(e) { + stop(e.name, 'in JS source:', e.message); + } + return output; +}; + + +internal.getRunCommandData = function(target) { + var lyr = target.layers[0]; + var data = internal.getLayerData(lyr, target.dataset); + data.layer = lyr; + data.dataset = target.dataset; + return data; +}; diff --git a/src/commands/mapshaper-shape.js b/src/commands/mapshaper-shape.js new file mode 100644 index 000000000..0d2c2ca50 --- /dev/null +++ b/src/commands/mapshaper-shape.js @@ -0,0 +1,37 @@ +/* @require mapshaper-geojson, mapshaper-dataset-utils */ + +api.shape = function(opts) { + var coords = opts.coordinates; + var offsets = opts.offsets || []; + var coordinates = []; + var geojson, dataset, type, i, x, y; + + if (!coords || coords.length >= 2 === false) { + stop('Missing list of coordinates'); + } + for (i=0; i= 3) { + type = 'Polygon'; + coordinates.push(coordinates[0]); + } else { + type = 'LineString'; + } + geojson = { + type: type, + coordinates: type == 'Polygon' ? [coordinates] : coordinates + }; + dataset = internal.importGeoJSON(geojson, {}); + dataset.layers[0].name = opts.name || 'shape'; + return dataset; +}; diff --git a/src/commands/mapshaper-spatial-join.js b/src/commands/mapshaper-spatial-join.js index 53021bfa5..0819670b1 100644 --- a/src/commands/mapshaper-spatial-join.js +++ b/src/commands/mapshaper-spatial-join.js @@ -1,49 +1,84 @@ -/* @requires mapshaper-path-index */ +/* @requires mapshaper-path-index, mapshaper-point-index */ api.joinPointsToPolygons = function(targetLyr, arcs, pointLyr, opts) { - // TODO: copy points that can't be joined to a new layer + // TODO: option to copy points that can't be joined to a new layer var joinFunction = internal.getPolygonToPointsFunction(targetLyr, arcs, pointLyr, opts); internal.prepJoinLayers(targetLyr, pointLyr); return internal.joinTables(targetLyr.data, pointLyr.data, joinFunction, opts); }; api.joinPolygonsToPoints = function(targetLyr, polygonLyr, arcs, opts) { - var joinFunction = internal.getPointToPolygonFunction(targetLyr, polygonLyr, arcs, opts); + var joinFunction = internal.getPointToPolygonsFunction(targetLyr, polygonLyr, arcs, opts); internal.prepJoinLayers(targetLyr, polygonLyr); return internal.joinTables(targetLyr.data, polygonLyr.data, joinFunction, opts); }; +api.joinPointsToPoints = function(targetLyr, srcLyr, opts) { + var joinFunction = internal.getPointToPointFunction(targetLyr, srcLyr, opts); + internal.prepJoinLayers(targetLyr, srcLyr); + return internal.joinTables(targetLyr.data, srcLyr.data, joinFunction, opts); +}; + internal.prepJoinLayers = function(targetLyr, srcLyr) { if (!targetLyr.data) { // create an empty data table if target layer is missing attributes targetLyr.data = new DataTable(targetLyr.shapes.length); } if (!srcLyr.data) { - stop("[join] Can't join a layer that is missing attribute data"); + stop("Can't join a layer that is missing attribute data"); } }; +internal.getPointToPointFunction = function(targetLyr, srcLyr, opts) { + var shapes = targetLyr.shapes; + var index = new PointIndex(srcLyr.shapes, {}); + return function(targId) { + var srcId = index.findNearestPointFeature(shapes[targId]); + // TODO: accept multiple hits + return srcId > -1 ? [srcId] : null; + }; +}; + internal.getPolygonToPointsFunction = function(polygonLyr, arcs, pointLyr, opts) { - var joinFunction = internal.getPointToPolygonFunction(pointLyr, polygonLyr, arcs, opts); + // Build a reverse lookup table for mapping polygon ids to point ids. + var joinFunction = internal.getPointToPolygonsFunction(pointLyr, polygonLyr, arcs, opts); var index = []; - var hit, polygonId; - for (var i=0, n=pointLyr.shapes.length; i 0 ? polygonIds : null; + }; +}; + + +// TODO: remove (replaced by getPointToPolygonsFunction()) internal.getPointToPolygonFunction = function(pointLyr, polygonLyr, arcs, opts) { var index = new PathIndex(polygonLyr.shapes, arcs), points = pointLyr.shapes; diff --git a/src/commands/mapshaper-split-on-grid.js b/src/commands/mapshaper-split-on-grid.js index 9d4c3b74a..0d184a6ad 100644 --- a/src/commands/mapshaper-split-on-grid.js +++ b/src/commands/mapshaper-split-on-grid.js @@ -12,7 +12,7 @@ api.splitLayerOnGrid = function(lyr, arcs, opts) { properties, layers; if (!type) { - stop("[split-on-grid] Layer has no geometry"); + stop("Layer has no geometry"); } if (!lyr.data) { @@ -43,7 +43,7 @@ api.splitLayerOnGrid = function(lyr, arcs, opts) { h = bounds.height(); if (rows > 0 === false || cols > 0 === false) { - stop('[split-on-grid] Invalid grid parameters'); + stop('Invalid grid parameters'); } if (w > 0 === false || h > 0 === false) { diff --git a/src/commands/mapshaper-split.js b/src/commands/mapshaper-split.js index 6803361a2..46757a9b3 100644 --- a/src/commands/mapshaper-split.js +++ b/src/commands/mapshaper-split.js @@ -9,7 +9,7 @@ api.splitLayer = function(src, splitField, opts) { prefix; if (splitField && (!properties || !lyr0.data.fieldExists(splitField))) { - stop("[split] Missing attribute field:", splitField); + stop("Missing attribute field:", splitField); } // if not splitting on a field and layer is unnamed, name split-apart layers @@ -22,11 +22,12 @@ api.splitLayer = function(src, splitField, opts) { if (key in index === false) { index[key] = splitLayers.length; - lyr = utils.defaults({ + lyr = { + geometry_type: lyr0.geometry_type, name: internal.getSplitLayerName(prefix, key), data: properties ? new DataTable() : null, shapes: shapes ? [] : null - }, lyr0); + }; splitLayers.push(lyr); } else { lyr = splitLayers[index[key]]; diff --git a/src/commands/mapshaper-stitch.js b/src/commands/mapshaper-stitch.js index 68064a826..53a56de8b 100644 --- a/src/commands/mapshaper-stitch.js +++ b/src/commands/mapshaper-stitch.js @@ -12,7 +12,7 @@ api.stitch = function(dataset) { var arcs = dataset.arcs, edgeArcs, dissolver, nodes; if (!arcs || arcs.isPlanar()) { - error("[stitch] Requires lat-lng dataset"); + stop("Requires lat-lng dataset"); } if (!internal.snapEdgeArcs(arcs)) { return; diff --git a/src/commands/mapshaper-subdivide.js b/src/commands/mapshaper-subdivide.js index 2fcb70669..bd7640b7a 100644 --- a/src/commands/mapshaper-subdivide.js +++ b/src/commands/mapshaper-subdivide.js @@ -15,7 +15,7 @@ internal.subdivide = function(lyr, arcs, exp) { tmp, bounds, lyr1, lyr2; if (!utils.isBoolean(divide)) { - stop("[subdivide] Expression must evaluate to true or false"); + stop("Expression must evaluate to true or false"); } if (divide) { bounds = internal.getLayerBounds(lyr, arcs); diff --git a/src/commands/mapshaper-svg-style.js b/src/commands/mapshaper-svg-style.js index c0eec6905..68810a4a5 100644 --- a/src/commands/mapshaper-svg-style.js +++ b/src/commands/mapshaper-svg-style.js @@ -1,89 +1,85 @@ -/* @requires mapshaper-dataset-utils */ +/* @requires mapshaper-dataset-utils svg-common */ api.svgStyle = function(lyr, dataset, opts) { - var keys = Object.keys(opts), - svgFields = internal.getStyleFields(keys, internal.svgStyles, internal.invalidSvgTypes[lyr.geometry_type]); - - svgFields.forEach(function(f) { - var val = opts[f]; - var literal = null; - var records, func; - var type = internal.svgStyleTypes[f]; - if (!lyr.data) { - internal.initDataTable(lyr); - } - if (type == 'number' && internal.isSvgNumber(val)) { - literal = Number(val); - } else if (type == 'color' && internal.isSvgColor(val, lyr.data.getFields())) { - literal = val; - } else if (type == 'classname' && internal.isSvgClassName(val, lyr.data.getFields())) { - literal = val; + var filter; + if (!lyr.data) { + internal.initDataTable(lyr); + } + if (opts.where) { + filter = internal.compileValueExpression(opts.where, lyr, dataset.arcs); + } + Object.keys(opts).forEach(function(optName) { + var svgName = optName.replace('_', '-'); // undo cli parser name conversion + var strVal, literalVal, func; + if (!internal.isSupportedSvgProperty(svgName)) return; + strVal = opts[optName].trim(); + literalVal = internal.parseSvgValue(svgName, strVal, lyr.data.getFields()); + if (literalVal === null) { + // if value was not parsed as a literal, assume it is a JS expression + func = internal.compileValueExpression(strVal, lyr, dataset.arcs, {context: internal.getStateVar('defs')}); } - if (literal === null) { - func = internal.compileValueExpression(val, lyr, dataset.arcs, {context: internal.defs}); - } - records = lyr.data.getRecords(); - records.forEach(function(rec, i) { - rec[f] = func ? func(i) : literal; + lyr.data.getRecords().forEach(function(rec, i) { + if (filter && !filter(i)) { + // make sure field exists if record is excluded by filter + if (svgName in rec === false) rec[svgName] = undefined; + } else { + rec[svgName] = func ? func(i) : literalVal; + } }); }); }; -internal.isSvgClassName = function(str, fields) { - str = str.trim(); - return (!fields || fields.indexOf(str) == -1) && /^( ?[_a-z][-_a-z0-9]*\b)+$/i.test(str); -}; - -internal.isSvgNumber = function(o) { - return utils.isFiniteNumber(o) || utils.isString(o) && /^-?[.0-9]+$/.test(o); +internal.isSupportedSvgProperty = function(name) { + return SVG.supportedProperties.indexOf(name) > -1 || name == 'label-text' || name == 'point-text'; }; -internal.isSvgColor = function(str, fields) { - str = str.trim(); - return (!fields || fields.indexOf(str) == -1) && /^[a-z]+$/i.test(str) || - /^#[0-9a-f]+$/i.test(str) || /^rgba?\([0-9,. ]+\)$/.test(str); +// returns parsed value or null if @strVal is not recognized as a valid literal value +internal.parseSvgValue = function(name, strVal, fields) { + var type = SVG.propertyTypes[name]; + var val; + if (fields.indexOf(strVal) > -1) { + val = null; // field names are valid expressions + } else if (type == 'number') { + // TODO: handle values with units, like "13px" + val = internal.isSvgNumber(strVal) ? Number(strVal) : null; + } else if (type == 'color') { + val = internal.isSvgColor(strVal) ? strVal : null; + } else if (type == 'classname') { + val = internal.isSvgClassName(strVal) ? strVal : null; + } else if (type == 'measure') { // SVG/CSS length (e.g. 12px, 1em, 4) + val = internal.isSvgMeasure(strVal) ? internal.parseSvgMeasure(strVal) : null; + } else if (type == 'dasharray') { + val = internal.isDashArray(strVal) ? strVal : null; + } else { + // unknown type -- assume string is an expression if JS syntax chars are found + // (but not chars like and ',', which may be in a font-family, e.g.) + val = /[\?\:\[\(\+]/.test(strVal) ? null : strVal; // + } + return val; }; -internal.getStyleFields = function(fields, index, blacklist) { - return fields.reduce(function(memo, f) { - if (f in index) { - if (!blacklist || blacklist.indexOf(f) == -1) { - memo.push(f); - } - } - return memo; - }, []); +internal.isDashArray = function(str) { + return /^[0-9]+( [0-9]+)*$/.test(str); }; -internal.getSvgStyleFields = function(lyr) { - var fields = lyr.data ? lyr.data.getFields() : []; - return internal.getStyleFields(fields, internal.svgStyles, internal.invalidSvgTypes[lyr.geometry_type]); +internal.isSvgClassName = function(str) { + return /^( ?[_a-z][-_a-z0-9]*\b)+$/i.test(str); }; -internal.layerHasSvgDisplayStyle = function(lyr) { - var fields = internal.getSvgStyleFields(lyr); - return utils.difference(fields, ['opacity', 'class']).length > 0; +internal.isSvgNumber = function(o) { + return utils.isFiniteNumber(o) || utils.isString(o) && /^-?[.0-9]+$/.test(o); }; -internal.invalidSvgTypes = { - polygon: ['r'], - polyline: ['r', 'fill'] +internal.isSvgMeasure = function(o) { + return utils.isFiniteNumber(o) || utils.isString(o) && /^-?[.0-9]+[a-z]*$/.test(o); }; -internal.svgStyles = { - 'class': 'class', - opacity: 'opacity', - r: 'radius', - fill: 'fillColor', - stroke: 'strokeColor', - stroke_width: 'strokeWidth' +// Can be a number or a string +internal.parseSvgMeasure = function(str) { + return utils.isString(str) && /[a-z]/.test(str) ? str : Number(str); }; -internal.svgStyleTypes = { - class: 'classname', - opacity: 'number', - r: 'number', - fill: 'color', - stroke: 'color', - stroke_width: 'number' +internal.isSvgColor = function(str) { + return /^[a-z]+$/i.test(str) || + /^#[0-9a-f]+$/i.test(str) || /^rgba?\([0-9,. ]+\)$/.test(str); }; diff --git a/src/commands/mapshaper-target.js b/src/commands/mapshaper-target.js index fc23f1462..a3a2142f9 100644 --- a/src/commands/mapshaper-target.js +++ b/src/commands/mapshaper-target.js @@ -1,11 +1,18 @@ /* @require mapshaper-common */ -api.target = function(catalog, pattern) { - var targets = catalog.findCommandTargets(pattern); +internal.target = function(catalog, opts) { + var type = (opts.type || '').toLowerCase().replace('linestring', 'polyline'); + var pattern = opts.target || '*'; + var targets = catalog.findCommandTargets(pattern, type); + if (type && 'polygon,polyline,point'.split(',').indexOf(type) == -1) { + stop("Invalid layer type:", opts.type); + } if (targets.length === 0) { - stop("[target] Target not found (" + pattern + ")"); - } else if (targets.length > 1 || targets[0].layers.length > 1) { - stop("[target] Matched more than one layer"); + stop("No layers were matched (pattern: " + pattern + (type ? ' type: ' + type : '') + ")"); + } + if (opts.name) { + // TODO: improve this + targets[0].layers[0].name = opts.name; } - catalog.setDefaultTarget(targets[0].layers, targets[0].dataset); + catalog.setDefaultTargets(targets); }; diff --git a/src/commands/mapshaper-uniq.js b/src/commands/mapshaper-uniq.js index d8c8bf3a1..86518587d 100644 --- a/src/commands/mapshaper-uniq.js +++ b/src/commands/mapshaper-uniq.js @@ -6,28 +6,33 @@ mapshaper-dataset-utils api.uniq = function(lyr, arcs, opts) { var n = internal.getFeatureCount(lyr), compiled = internal.compileValueExpression(opts.expression, lyr, arcs), - index = {}, - flags = [], + maxCount = opts.max_count || 1, + counts = {}, + keepFlags = [], verbose = !!opts.verbose, + invert = !!opts.invert, records = lyr.data ? lyr.data.getRecords() : null, - f = function(d, i) {return !flags[i];}; + filter = function(d, i) {return keepFlags[i];}; utils.repeat(n, function(i) { var val = compiled(i); - flags[i] = val in index; - if (verbose && index[val]) { - message(utils.format('[uniq] Removing feature %i key: [%s]', i, val)); + var count = val in counts ? counts[val] + 1 : 1; + var keep = count <= maxCount; + if (invert) keep = !keep; + keepFlags[i] = keep; + counts[val] = count; + if (verbose && !keep) { + message(utils.format('Removing feature %i key: [%s]', i, val)); } - index[val] = true; }); if (lyr.shapes) { - lyr.shapes = lyr.shapes.filter(f); + lyr.shapes = lyr.shapes.filter(filter); } if (records) { - lyr.data = new DataTable(records.filter(f)); + lyr.data = new DataTable(records.filter(filter)); } if (opts.verbose !== false) { - message(utils.format('[uniq] Retained %,d of %,d features', internal.getFeatureCount(lyr), n)); + message(utils.format('Retained %,d of %,d features', internal.getFeatureCount(lyr), n)); } }; diff --git a/src/data/mapshaper-data-aggregation.js b/src/data/mapshaper-data-aggregation.js index 1f165f754..fa4784e31 100644 --- a/src/data/mapshaper-data-aggregation.js +++ b/src/data/mapshaper-data-aggregation.js @@ -1,47 +1,59 @@ /* @requires mapshaper-common, mapshaper-join-calc */ -// Return a function to convert original feature ids into ids of combined features -// Use categorical classification (a different id for each unique value) -internal.getCategoryClassifier = function(field, data) { - if (!field) return function(i) {return 0;}; - if (!data || !data.fieldExists(field)) { - stop("[dissolve] Data table is missing field:", field); - } +// Return a function to convert indexes of original features into indexes of grouped features +// Uses categorical classification (a different id for each unique combination of values) +internal.getCategoryClassifier = function(fields, data) { + if (!fields || fields.length === 0) return function() {return 0;}; + fields.forEach(function(f) { + if (!data || !data.fieldExists(f)) { + stop("Data table is missing field:", f); + } + }); var index = {}, count = 0, - records = data.getRecords(); + records = data.getRecords(), + getKey = internal.getMultiFieldKeyFunction(fields); return function(i) { - var val = String(records[i][field]); - if (val in index === false) { - index[val] = count++; + var key = getKey(records[i]); + if (key in index === false) { + index[key] = count++; } - return index[val]; + return index[key]; }; }; -// Return a properties array for a set of aggregated features +internal.getMultiFieldKeyFunction = function(fields) { + return fields.reduce(function(partial, field) { + // TODO: consider using JSON.stringify for fields that contain objects + var strval = function(rec) {return String(rec[field]);}; + return partial ? function(rec) {return partial(rec) + '~~' + strval(rec);} : strval; + }, null); +}; + + +// Return an array of data records for a set of aggregated features // -// @properties input records +// @records input records // @getGroupId() converts input record id to id of aggregated record // -internal.aggregateDataRecords = function(properties, getGroupId, opts) { - var groups = internal.groupIds(getGroupId, properties.length), +internal.aggregateDataRecords = function(records, getGroupId, opts) { + var groups = internal.groupIds(getGroupId, records.length), sumFields = opts.sum_fields || [], copyFields = opts.copy_fields || [], calc; - if (opts.field) { - copyFields.push(opts.field); + if (opts.fields) { + copyFields = copyFields.concat(opts.fields); } if (opts.calc) { - calc = internal.getJoinCalc(new DataTable(properties), opts.calc); + calc = internal.getJoinCalc(new DataTable(records), opts.calc); } function sum(field, group) { var tot = 0, rec; for (var i=0; i 0) { - message(utils.format("[csv] Auto-detected number field%s: %s", - detectedNumFields.length == 1 ? '' : 's', detectedNumFields.join(', '))); - } -}; - -internal.adjustFieldValues = function(key, records, type) { - var values; - if (!type) { - values = internal.tryNumericField(key, records); - } - if (values) { - type = 'number'; - internal.insertFieldValues2(key, records, values); - } else if (type == 'number') { - internal.convertDataField(key, records, utils.parseNumber); - } else { - type = 'string'; - internal.convertDataField(key, records, utils.parseString); - } - return type; -}; - -internal.tryNumericField = function(key, records) { - var arr = [], - count = 0, - raw, num; - for (var i=0, n=records.length; i 0 ? arr : null; -}; - -internal.convertDataField = function(name, records, f) { - for (var i=0, n=records.length; i 0) k *= 10; + return Math.round(val * k) / k; + }, + sprintf: utils.format +}; diff --git a/src/data/mapshaper-expressions.js b/src/data/mapshaper-expressions.js index 6e16c97bb..d2bd9e8fc 100644 --- a/src/data/mapshaper-expressions.js +++ b/src/data/mapshaper-expressions.js @@ -1,4 +1,4 @@ -/* @requires mapshaper-feature-proxy */ +/* @requires mapshaper-feature-proxy, mapshaper-expression-utils */ // Compiled expression returns a value internal.compileValueExpression = function(exp, lyr, arcs, opts) { @@ -7,6 +7,72 @@ internal.compileValueExpression = function(exp, lyr, arcs, opts) { return internal.compileFeatureExpression(exp, lyr, arcs, opts); }; + +internal.compileFeaturePairFilterExpression = function(exp, lyr, arcs) { + var func = internal.compileFeaturePairExpression(exp, lyr, arcs); + return function(idA, idB) { + var val = func(idA, idB); + if (val !== true && val !== false) { + stop("where expression must return true or false"); + } + return val; + }; +}; + +internal.compileFeaturePairExpression = function(exp, lyr, arcs) { + var ctx = internal.getExpressionContext(lyr); + var A = getProxyFactory(lyr, arcs); + var B = getProxyFactory(lyr, arcs); + var vars = internal.getAssignedVars(exp); + var functionBody = "with(env){with(record){return " + exp + "}}"; + var func; + + try { + func = new Function("record,env", functionBody); + } catch(e) { + console.error(e); + stop(e.name, "in expression [" + exp + "]"); + } + + // protect global object from assigned values + internal.nullifyUnsetProperties(vars, ctx); + + function getProxyFactory(lyr, arcs) { + var records = lyr.data ? lyr.data.getRecords() : []; + var getFeatureById = internal.initFeatureProxy(lyr, arcs); + function Proxy(id) {} + + return function(id) { + var proxy; + if (id == -1) return null; + Proxy.prototype = records[id] || {}; + proxy = new Proxy(); + proxy.$ = getFeatureById(id); + return proxy; + }; + } + + // idA - id of a record + // idB - id of a record, or -1 + // rec - optional data record + return function(idA, idB, rec) { + var val; + ctx.A = A(idA); + ctx.B = B(idB); + if (rec) { + // initialize new fields to null so assignments work + internal.nullifyUnsetProperties(vars, rec); + } + try { + val = func.call(ctx, rec || {}, ctx); + } catch(e) { + stop(e.name, "in expression [" + exp + "]:", e.message); + } + return val; + }; +}; + + internal.compileFeatureExpression = function(rawExp, lyr, arcs, opts_) { var opts = utils.extend({}, opts_), exp = rawExp || '', @@ -71,9 +137,7 @@ internal.getAssignmentObjects = function(exp) { return utils.uniq(names); }; -internal.getExpressionFunction = function(exp, lyr, arcs, opts) { - var getFeatureById = internal.initFeatureProxy(lyr, arcs); - var ctx = internal.getExpressionContext(lyr, opts.context); +internal.compileExpressionToFunction = function(exp, opts) { var functionBody = "with(env){with(record){ " + (opts.returns ? 'return ' : '') + exp + "}}"; var func; @@ -82,10 +146,20 @@ internal.getExpressionFunction = function(exp, lyr, arcs, opts) { } catch(e) { stop(e.name, "in expression [" + exp + "]"); } + return func; +}; + +internal.getExpressionFunction = function(exp, lyr, arcs, opts) { + var getFeatureById = internal.initFeatureProxy(lyr, arcs); + var ctx = internal.getExpressionContext(lyr, opts.context); + var func = internal.compileExpressionToFunction(exp, opts); return function(rec, i) { var val; + // Assigning feature object to '$' -- this should maybe be removed, it is + // also exposed as "this". ctx.$ = getFeatureById(i); ctx._ = ctx; // provide access to functions when masked by variable names + ctx.d = rec || null; // expose data properties a la d3 (also exposed as this.properties) try { val = func.call(ctx.$, rec, ctx); } catch(e) { @@ -105,12 +179,18 @@ internal.nullifyUnsetProperties = function(vars, obj) { internal.getExpressionContext = function(lyr, mixins) { var env = internal.getBaseContext(); + utils.extend(env, internal.expressionUtils); // mix in utils if (lyr.data) { // default to null values when a data field is missing internal.nullifyUnsetProperties(lyr.data.getFields(), env); } if (mixins) { - utils.extend(env, mixins); + Object.keys(mixins).forEach(function(key) { + // Catch name collisions between data fields and user-defined functions + if (key in env) message('Warning: "' + key + '" has multiple definitions'); + env[key] = mixins[key]; + }); + // utils.extend(env, mixins); } // make context properties non-writable, so they can't be replaced by an expression return Object.keys(env).reduce(function(memo, key) { @@ -124,7 +204,7 @@ internal.getBaseContext = function() { // Mask global properties (is this effective/worth doing?) (function() { for (var key in this) { - obj[key] = null; + obj[key] = void 0; } }()); obj.console = console; diff --git a/src/data/mapshaper-feature-proxy.js b/src/data/mapshaper-feature-proxy.js index 9c6a3689c..fd6222b32 100644 --- a/src/data/mapshaper-feature-proxy.js +++ b/src/data/mapshaper-feature-proxy.js @@ -1,6 +1,7 @@ /* @requires mapshaper-shape-geom mapshaper-polygon-centroid +mapshaper-anchor-points mapshaper-arcs mapshaper-dataset-utils */ @@ -19,8 +20,11 @@ internal.initFeatureProxy = function(lyr, arcs) { ctx = {}, _bounds, _centroid, _innerXY, _xy, _ids, _id; - // all contexts have $.id - addGetters(ctx, {id: function() { return _id; }}); + // all contexts have this.id and this.layer_name + addGetters(ctx, { + id: function() { return _id; }, + layer_name: function() { return lyr.name || ''; } + }); if (_records) { Object.defineProperty(ctx, 'properties', @@ -64,10 +68,17 @@ internal.initFeatureProxy = function(lyr, arcs) { area: function() { return _isPlanar ? ctx.planarArea : geom.getSphericalShapeArea(_ids, arcs); }, + perimeter: function() { + return geom.getShapePerimeter(_ids, arcs); + }, + compactness: function() { + return geom.calcPolsbyPopperCompactness(ctx.area, ctx.perimeter); + }, planarArea: function() { return geom.getPlanarShapeArea(_ids, arcs); }, originalArea: function() { + // Get area var i = arcs.getRetainedInterval(), area; arcs.setRetainedInterval(0); @@ -106,16 +117,13 @@ internal.initFeatureProxy = function(lyr, arcs) { }, get: function() { return lyr.shapes[_id] || null; }}); - - addGetters(ctx, { - x: function() { - xy(); - return _xy ? _xy[0] : null; - }, - y: function() { - xy(); - return _xy ? _xy[1] : null; - } + Object.defineProperty(ctx, 'x', { + get: function() { xy(); return _xy ? _xy[0] : null;}, + set: function(val) { xy(); if (_xy) _xy[0] = Number(val);} + }); + Object.defineProperty(ctx, 'y', { + get: function() { xy(); return _xy ? _xy[1] : null;}, + set: function(val) { xy(); if (_xy) _xy[1] = Number(val);} }); } @@ -124,7 +132,6 @@ internal.initFeatureProxy = function(lyr, arcs) { if (!_xy) { _xy = shape && shape[0] || null; } - return _xy; } function centroid() { @@ -133,7 +140,7 @@ internal.initFeatureProxy = function(lyr, arcs) { } function innerXY() { - _innerXY = _innerXY || geom.findInteriorPoint(_ids, arcs); + _innerXY = _innerXY || internal.findAnchorPoint(_ids, arcs); return _innerXY; } diff --git a/src/data/mapshaper-join-filter.js b/src/data/mapshaper-join-filter.js index 0780a1ec9..df88e83fc 100644 --- a/src/data/mapshaper-join-filter.js +++ b/src/data/mapshaper-join-filter.js @@ -16,7 +16,7 @@ internal.getJoinFilter = function(data, exp) { if (retn === true) { filtered.push(ids[i]); } else if (retn !== false) { - stop('[join] "where" expression must return true or false'); + stop('"where" expression must return true or false'); } } return filtered; diff --git a/src/dataset/mapshaper-catalog.js b/src/dataset/mapshaper-catalog.js index 26221e777..a4752a264 100644 --- a/src/dataset/mapshaper-catalog.js +++ b/src/dataset/mapshaper-catalog.js @@ -5,7 +5,7 @@ // layer in the GUI or the current target in the CLI function Catalog() { var datasets = [], - target; + defaultTargets = [];// saved default command targets [{layers:[], dataset}, ...] this.forEachLayer = function(cb) { var i = 0; @@ -18,52 +18,49 @@ function Catalog() { // remove a layer from a dataset this.deleteLayer = function(lyr, dataset) { - var targ = this.getDefaultTarget(), - other; + // if deleting first target layer (selected in gui) -- switch to some other layer + if (this.getActiveLayer().layer == lyr) { + defaultTargets = []; + } // remove layer from its dataset dataset.layers.splice(dataset.layers.indexOf(lyr), 1); - if (dataset.layers.length === 0) { this.removeDataset(dataset); } - if (this.isEmpty()) { - target = null; - } else if (targ.layers[0] == lyr) { - // deleting first target layer (selected in gui) -- switch to some other layer - other = this.findAnotherLayer(lyr); - this.setDefaultTarget([other.layer], other.dataset); - } else if (targ.layers.indexOf(lyr) > -1) { - // deleted layer is targeted -- update target - targ.layers.splice(targ.layers.indexOf(lyr), 1); - this.setDefaultTarget(targ.layers, targ.dataset); - } else { - // deleted layer is not a targeted layer, target not updated - } + // remove layer from defaultTargets + defaultTargets = defaultTargets.filter(function(targ) { + var i = targ.layers.indexOf(lyr); + if (i == -1) return true; + targ.layers.splice(i, 1); + return targ.layers.length > 0; + }); }; - this.findLayer = function(target) { + // @arg: a layer object or a test function + this.findLayer = function(arg) { + var test = typeof arg == 'function' ? arg : null; var found = null; this.forEachLayer(function(lyr, dataset) { - if (lyr == target) { + if (test ? test(lyr, dataset) : lyr == arg) { found = layerObject(lyr, dataset); } }); return found; }; - this.findCommandTargets = function(pattern) { + this.findCommandTargets = function(pattern, type) { if (pattern) { - return internal.findCommandTargets(pattern, this); + return internal.findCommandTargets(this, pattern, type); } - return target ? [target] : []; + return this.getDefaultTargets() || []; }; this.removeDataset = function(dataset) { - if (target && target.dataset == dataset) { - target = null; - } + defaultTargets = defaultTargets.filter(function(targ) { + return targ.dataset != dataset; + }); datasets = datasets.filter(function(d) { return d != dataset; }); @@ -98,34 +95,35 @@ function Catalog() { return idx > -1 ? layers[(idx - 1 + layers.length) % layers.length] : null; }; - this.findAnotherLayer = function(target) { - var layers = this.getLayers(), - found = null; - if (layers.length > 0) { - found = layers[0].layer == target ? layers[1] : layers[0]; - } - return found; - }; - this.isEmpty = function() { return datasets.length === 0; }; - this.getDefaultTarget = function() {return target || null;}; + this.getDefaultTargets = function() { + if (defaultTargets.length === 0 && !this.isEmpty()) { + // defaultTargets = [{dataset: datasets[0], layers: datasets[0].layers.slice(0, 1)}]; + defaultTargets = [{dataset: datasets[0], layers: datasets[0].layers.slice(0, 1)}]; + } + return defaultTargets; + }; this.setDefaultTarget = function(layers, dataset) { if (datasets.indexOf(dataset) == -1) { datasets.push(dataset); } - target = { + defaultTargets = [{ layers: layers, dataset: dataset - }; + }]; + }; + + this.setDefaultTargets = function(arr) { + defaultTargets = arr; }; // should be in mapshaper-gui-model.js, moved here for testing this.getActiveLayer = function() { - var targ = this.getDefaultTarget(); + var targ = (this.getDefaultTargets() || [])[0]; return targ ? {layer: targ.layers[0], dataset: targ.dataset} : null; }; diff --git a/src/dataset/mapshaper-dataset-utils.js b/src/dataset/mapshaper-dataset-utils.js index 84006f7fd..b510fd1a4 100644 --- a/src/dataset/mapshaper-dataset-utils.js +++ b/src/dataset/mapshaper-dataset-utils.js @@ -83,27 +83,52 @@ internal.copyLayer = function(lyr) { internal.copyLayerShapes = function(lyr) { var copy = utils.extend({}, lyr); - if (lyr.shapes) { - copy.shapes = internal.cloneShapes(lyr.shapes); - } - return copy; + if (lyr.shapes) { + copy.shapes = internal.cloneShapes(lyr.shapes); + } + return copy; }; -internal.getDatasetBounds = function(data) { +internal.getDatasetBounds = function(dataset) { var bounds = new Bounds(); - data.layers.forEach(function(lyr) { - var lyrbb = internal.getLayerBounds(lyr, data.arcs); + dataset.layers.forEach(function(lyr) { + var lyrbb = internal.getLayerBounds(lyr, dataset.arcs); if (lyrbb) bounds.mergeBounds(lyrbb); }); return bounds; }; +internal.datasetHasGeometry = function(dataset) { + return utils.some(dataset.layers, function(lyr) { + return internal.layerHasGeometry(lyr); + }); +}; + internal.datasetHasPaths = function(dataset) { return utils.some(dataset.layers, function(lyr) { return internal.layerHasPaths(lyr); }); }; +// Remove ArcCollection of a dataset if not referenced by any layer +// TODO: consider doing arc dissolve, or just removing unreferenced arcs +// (currently cleanupArcs() is run after every command, so be mindful of performance) +internal.cleanupArcs = function(dataset) { + if (dataset.arcs && !utils.some(dataset.layers, internal.layerHasPaths)) { + dataset.arcs = null; + return true; + } +}; + +// Remove unused arcs from a dataset +// Warning: using dissolveArcs() means that adjacent arcs are combined when possible +internal.pruneArcs = function(dataset) { + internal.cleanupArcs(dataset); + if (dataset.arcs) { + internal.dissolveArcs(dataset); + } +}; + internal.countMultiPartFeatures = function(shapes) { var count = 0; for (var i=0, n=shapes.length; i 0) datasetsWithArcs++; + }); + + merged = internal.mergeDatasets(targetDatasets); + + // Rebuild topology, if multiple datasets contain arcs + if (datasetsWithArcs > 1) { + api.buildTopology(merged); + } + + // remove old datasets after merging, so catalog is not affected if merge throws an error + targetDatasets.forEach(catalog.removeDataset); + catalog.addDataset(merged); // sets default target to all layers in merged dataset + catalog.setDefaultTarget(targetLayers, merged); // reset default target + return [{ + layers: targetLayers, + dataset: merged + }]; +}; + +// Combine multiple datasets into one using concatenation +// (any shared topology is ignored) internal.mergeDatasets = function(arr) { var arcSources = [], arcCount = 0, mergedLayers = [], - mergedInfo = internal.mergeDatasetInfo(arr), + mergedInfo = {}, mergedArcs; - arr.forEach(function(data) { - var n = data.arcs ? data.arcs.size() : 0; + // Error if incompatible CRS + internal.requireDatasetsHaveCompatibleCRS(arr); + + arr.forEach(function(dataset) { + var n = dataset.arcs ? dataset.arcs.size() : 0; if (n > 0) { - arcSources.push(data.arcs); + arcSources.push(dataset.arcs); } - data.layers.forEach(function(lyr) { + + internal.mergeDatasetInfo(mergedInfo, dataset); + dataset.layers.forEach(function(lyr) { if (lyr.geometry_type == 'polygon' || lyr.geometry_type == 'polyline') { internal.forEachArcId(lyr.shapes, function(id) { return id < 0 ? id - arcCount : id + arcCount; @@ -46,34 +82,24 @@ internal.mergeDatasets = function(arr) { }; }; -internal.mergeDatasetInfo = function(arr) { - // Get crs, prevent incompatible CRSs - var crs = arr.reduce(function(memo, d) { - var P = internal.getDatasetProjection(d); - if (!memo) { - memo = P; - } else if (memo && P) { - if (memo.is_latlong != P.is_latlong) { +internal.requireDatasetsHaveCompatibleCRS = function(arr) { + arr.reduce(function(memo, dataset) { + var P = internal.getDatasetCRS(dataset); + if (memo && P) { + if (internal.isLatLngCRS(memo) != internal.isLatLngCRS(P)) { stop("Unable to combine projected and unprojected datasets"); - } else if (memo.is_latlong) { - // datasets are both unprojected - // TODO: check for incompatibility - } else { - // datasets are both projected - // TODO: check for incompatibility } } - return memo; + return P || memo; }, null); - var info = arr.reduce(function(memo, d) { - var info = d.info || {}; - memo.input_files = memo.input_files.concat(info.input_files || []); - memo.input_formats = memo.input_formats.concat(info.input_formats || []); - // merge other info properties (e.g. input_geojson_crs, input_delimiter, input_prj) - // TODO: check for incompatibilities - return utils.defaults(memo, info); - }, {crs: crs, input_formats: [], input_files: []}); - return info; +}; + +internal.mergeDatasetInfo = function(merged, dataset) { + var info = dataset.info || {}; + merged.input_files = utils.uniq((merged.input_files || []).concat(info.input_files || [])); + merged.input_formats = utils.uniq((merged.input_formats || []).concat(info.input_formats || [])); + // merge other info properties (e.g. input_geojson_crs, input_delimiter, prj, crs) + utils.defaults(merged, info); }; internal.mergeArcs = function(arr) { diff --git a/src/dataset/mapshaper-metadata.js b/src/dataset/mapshaper-metadata.js new file mode 100644 index 000000000..412ef0490 --- /dev/null +++ b/src/dataset/mapshaper-metadata.js @@ -0,0 +1,18 @@ +/* @require mapshaper-projections */ + +internal.importMetadata = function(dataset, obj) { + if (obj.proj4) { + dataset.info.crs = internal.getCRS(obj.proj4); + } +}; + +internal.exportMetadata = function(dataset) { + var crs = internal.getDatasetCRS(dataset); + var proj4 = null; + if (crs) { + proj4 = internal.crsToProj4(crs); + } + return { + proj4: proj4 + }; +}; diff --git a/src/dataset/mapshaper-target-utils.js b/src/dataset/mapshaper-target-utils.js index 5e74e2d81..e3ac37cad 100644 --- a/src/dataset/mapshaper-target-utils.js +++ b/src/dataset/mapshaper-target-utils.js @@ -1,12 +1,13 @@ /* @requires mapshaper-common */ -internal.findCommandTargets = function(pattern, catalog) { +internal.findCommandTargets = function(catalog, pattern, type) { var targets = []; var layers = utils.pluck(catalog.getLayers(), 'layer'); - internal.findMatchingLayers(layers, pattern); + var matches = internal.findMatchingLayers(layers, pattern); + if (type) matches = matches.filter(function(lyr) {return lyr.geometry_type == type;}); catalog.getDatasets().forEach(function(dataset) { var layers = dataset.layers.filter(function(lyr) { - return lyr.match_id > -1; + return matches.indexOf(lyr) > -1; }); if (layers.length > 0) { targets.push({ @@ -22,18 +23,23 @@ internal.findCommandTargets = function(pattern, catalog) { // An identifier is a literal name, a pattern containing "*" wildcard or // a 1-based index (1..n) internal.findMatchingLayers = function(layers, pattern) { - var matchId = 0; + var matches = []; + var index = {}; pattern.split(',').forEach(function(subpattern, i) { var test = internal.getLayerMatch(subpattern); - // (kludge) assign a match id to each layer; used to set layer order of SVG output layers.forEach(function(lyr, layerId) { - if (i === 0) lyr.match_id = -1; - if (lyr.match_id == -1 && test(lyr, layerId + 1)) { // layers are 1-indexed - lyr.match_id = matchId++; + // if (matches.indexOf(lyr) > -1) return; // performance bottleneck with 1000s of layers + if (layerId in index) return; + if (test(lyr, layerId + 1)) { // layers are 1-indexed + lyr.target_id = matches.length; + matches.push(lyr); + index[layerId] = true; + } else { + lyr.target_id = -1; } }); }); - return layers; // for compatibility w/ tests; todo: remove + return matches; }; internal.getLayerMatch = function(pattern) { diff --git a/src/dissolve/mapshaper-point-dissolve.js b/src/dissolve/mapshaper-point-dissolve.js index 78ecc50de..a5e3fb40c 100644 --- a/src/dissolve/mapshaper-point-dissolve.js +++ b/src/dissolve/mapshaper-point-dissolve.js @@ -7,7 +7,7 @@ function dissolvePointLayerGeometry(lyr, getGroupId, opts) { // TODO: support multipoints if (internal.countMultiPartFeatures(lyr.shapes) !== 0) { - stop("[dissolve] Dissolving multi-part points is not supported"); + stop("Dissolving multi-part points is not supported"); } lyr.shapes.forEach(function(shp, i) { diff --git a/src/dissolve/mapshaper-polygon-dissolve.js b/src/dissolve/mapshaper-polygon-dissolve.js index 74e212204..91930e130 100644 --- a/src/dissolve/mapshaper-polygon-dissolve.js +++ b/src/dissolve/mapshaper-polygon-dissolve.js @@ -159,7 +159,7 @@ function dissolveSecondPass(segments, shapes, getGroupId) { match = findDissolveArc(next); if (match) { if (depth > 100) { - error ('[dissolve] deep recursion -- unhandled topology problem'); + error ('deep recursion -- unhandled topology problem'); } // if (match.part.arcs.length == 1) { if (shapes[match.shapeId][match.partId].length == 1) { diff --git a/src/dissolve/mapshaper-polygon-dissolve2.js b/src/dissolve/mapshaper-polygon-dissolve2.js new file mode 100644 index 000000000..9e5c639ca --- /dev/null +++ b/src/dissolve/mapshaper-polygon-dissolve2.js @@ -0,0 +1,62 @@ +/* @requires +mapshaper-pathfinder +mapshaper-polygon-holes +mapshaper-dissolve +mapshaper-data-aggregation +mapshaper-ring-nesting +*/ + +// TODO: remove this obsolete dissolve code (still used by clip) + +internal.concatShapes = function(shapes) { + return shapes.reduce(function(memo, shape) { + internal.extendShape(memo, shape); + return memo; + }, []); +}; + +internal.extendShape = function(dest, src) { + if (src) { + for (var i=0, n=src.length; i 1) { + dissolved = internal.fixNestingErrors(dissolved, nodes.arcs); + } + + return dissolved.length > 0 ? dissolved : null; + }; +}; diff --git a/src/dissolve/mapshaper-polygon-dissolve3.js b/src/dissolve/mapshaper-polygon-dissolve3.js new file mode 100644 index 000000000..99d8d4c83 --- /dev/null +++ b/src/dissolve/mapshaper-polygon-dissolve3.js @@ -0,0 +1,190 @@ +/* @requires +mapshaper-pathfinder +mapshaper-polygon-holes +mapshaper-dissolve +mapshaper-data-aggregation +mapshaper-ring-nesting +*/ + +// Assumes that arcs do not intersect except at endpoints +internal.dissolvePolygonLayer2 = function(lyr, dataset, opts) { + opts = utils.extend({}, opts); + if (opts.field) opts.fields = [opts.field]; // support old "field" parameter + var getGroupId = internal.getCategoryClassifier(opts.fields, lyr.data); + var groups = lyr.shapes.reduce(function(groups, shape, i) { + var i2 = getGroupId(i); + if (i2 in groups === false) { + groups[i2] = []; + } + internal.extendShape(groups[i2], shape); + return groups; + }, []); + var shapes2 = internal.dissolvePolygons2(groups, dataset, opts); + return internal.composeDissolveLayer(lyr, shapes2, getGroupId, opts); +}; + +internal.getGapFillTest = function(dataset, opts) { + var test; + if (opts.min_gap_area === 0) { + test = function() {return false;}; // don't fill any gaps + } else if (opts.min_gap_area) { + test = internal.getMinAreaTest(opts.min_gap_area, dataset); + } else { + test = internal.getSliverTest(dataset.arcs); // default is same as -filter-slivers default + } + return test; +}; + +internal.dissolvePolygons2 = function(shapes, dataset, opts) { + var arcs = dataset.arcs; + var arcFilter = internal.getArcPresenceTest(shapes, arcs); + var nodes = new NodeCollection(arcs, arcFilter); + var divide = internal.getHoleDivider(nodes); + var dissolve = internal.getRingIntersector(nodes, 'dissolve'); + var gapTest = internal.getGapFillTest(dataset, opts); + T.start(); + var mosaic = internal.buildPolygonMosaic(nodes).mosaic; + T.stop("Build mosaic"); + // Indexes for looking up shape/feature id by arc id + var fwdArcIndex = new Int32Array(arcs.size()); + var revArcIndex = new Int32Array(arcs.size()); + var shapeWeights = []; + var unassignedTiles = []; + var tileGroups = shapes.map(function() {return [];}); + T.start(); + shapes.forEach(indexPolygon); + mosaic.forEach(assignMosaicRing); + unassignedTiles = unassignedTiles.filter(assignRemainingTile); + var shapes2 = tileGroups.map(dissolveTileGroup); + T.stop('Dissolve tiles'); + return shapes2; + + function dissolveTileGroup(group) { + var rings = [], + holes = [], + dissolved, tile; + for (var i=0, n=group.length; i 1) { + holes = holes.concat(tile.slice(1)); + } + } + dissolved = dissolve(rings.concat(holes)); + if (dissolved.length > 1) { + // Commenting-out nesting order repair -- new method should prevent nesting errors + // dissolved = internal.fixNestingErrors(dissolved, arcs); + } + return dissolved.length > 0 ? dissolved : null; + } + + function assignRemainingTile(tileId) { + var tile = mosaic[tileId]; + var ring = tile[0]; + var shapeId = -1; + for (var i=0, n=ring.length; i -1 && gapTest(ring)) { + tileGroups[shapeId].push(tileId); + } + return shapeId < 0; + } + + // @tile An indivisible mosaic tile + function findFullEnclosureCandidates(tile) { + var shapeIds = []; + var reversedRing = internal.reversePath(ring.concat()); + reversedRing.forEach(function(arcId) { + var shpId = getShapeId(arcId); + if (shpId > -1 && shapeIds.indexOf(shpId) == -1) { + shapeIds.push(shpId); + } + }); + } + + + // STUB + // Search for a shape that entirely encloses a tile ring but doesn't intersect it + // @tileRing a (cw) mosaic ring + // Returns: id of enclosing shape or -1 if none found + function findEnclosingShape(tileRing) { + return -1; + } + + function assignMosaicRing(tile, tileId) { + var shapeId = -1; + var ring = tile[0]; // cw ring + for (var i=0, n=ring.length; i -1 && shapeWeights[a] < shapeWeights[b]) { + shpId = b; + } + return shpId; + } + + function indexPolygon(shape, shapeId) { + // TODO: support other metrics than area + // consider per-ring metrics + var weight = geom.getShapeArea(shape, arcs); + var cw = [], ccw = [], i, n; + shapeWeights[shapeId] = weight; + divide(shape, cw, ccw); + if (ccw.length > 0) { + shape = cw.concat(ccw); + internal.fixNestingErrors2(shape, arcs); + } else { + shape = cw; + } + for (i=0, n=shape.length; i 0;}; + var useArc = function(id) {flags[absArcId(id)] = 0;}; + var nodes = new NodeCollection(arcs); + return function(ids) { + ids.forEach(function(id) {flags[absArcId(id)] = 1;}); + var ends = internal.findPolylineEnds(ids, nodes, testArc); + var straightParts = internal.collectPolylineArcs(ends, nodes, testArc, useArc); + var ringParts = internal.collectPolylineArcs(ids, nodes, testArc, useArc); + var allParts = straightParts.concat(ringParts); + ids.forEach(function(id) {flags[absArcId(id)] = 0;}); // may not be necessary + return allParts; + }; +}; + +// TODO: use polygon pathfinder shared code +internal.collectPolylineArcs = function(ids, nodes, testArc, useArc) { + var parts = []; + ids.forEach(function(startId) { + var part = []; + var nextId = startId; + var nextIds; + while (testArc(nextId)) { + part.push(nextId); + nextIds = nodes.getConnectedArcs(nextId, testArc); + useArc(nextId); // use (unset) arc after connections have been found + if (nextIds.length > 0) { + nextId = ~nextIds[0]; // switch arc direction to lead away from node + } else { + break; + } + } + if (part.length > 0) parts.push(part); + }); + return parts; +}; + +// Return array of dead-end arcs for a dissolved group. +internal.findPolylineEnds = function(ids, nodes, filter) { + var ends = []; + ids.forEach(function(arcId) { + if (nodes.getConnectedArcs(arcId, filter).length === 0) { + ends.push(~arcId); // arc points away from terminus + } + if (nodes.getConnectedArcs(~arcId, filter).length === 0) { + ends.push(arcId); + } + }); + return ends; +}; diff --git a/src/furniture/mapshaper-basic-furniture.js b/src/furniture/mapshaper-basic-furniture.js new file mode 100644 index 000000000..e69de29bb diff --git a/src/furniture/mapshaper-furniture.js b/src/furniture/mapshaper-furniture.js new file mode 100644 index 000000000..7dd9acf81 --- /dev/null +++ b/src/furniture/mapshaper-furniture.js @@ -0,0 +1,32 @@ +/* @require mapshaper-common mapshaper-dataset-utils svg-common */ + + +// @lyr a layer in a dataset +internal.layerHasFurniture = function(lyr) { + var type = internal.getFurnitureLayerType(lyr); + return !!type && (type in SVG.furnitureRenderers); +}; + +// @mapLayer a map layer object +internal.isFurnitureLayer = function(mapLayer) { + return !!mapLayer.furniture; +}; + + +// @lyr dataset layer +internal.getFurnitureLayerType = function(lyr) { + var rec = lyr.data && lyr.data.getReadOnlyRecordAt(0); + return rec && rec.type || null; +}; + +internal.getFurnitureLayerData = function(lyr) { + return lyr.data && lyr.data.getReadOnlyRecordAt(0); +}; + +SVG.importFurniture = function(d, frame) { + var renderer = SVG.furnitureRenderers[d.type]; + if (!renderer) { + stop('Missing renderer for', d.type, 'element'); + } + return renderer(d, frame) || []; +}; diff --git a/src/geojson/geojson-common.js b/src/geojson/geojson-common.js index 6489f06c6..b4ee0fcbb 100644 --- a/src/geojson/geojson-common.js +++ b/src/geojson/geojson-common.js @@ -17,3 +17,10 @@ GeoJSON.typeLookup = { GeoJSON.translateGeoJSONType = function(type) { return GeoJSON.typeLookup[type] || null; }; + +GeoJSON.pathIsRing = function(coords) { + var first = coords[0], + last = coords[coords.length - 1]; + // TODO: consider detecting collapsed rings + return coords.length >= 4 && first[0] == last[0] && first[1] == last[1]; +}; diff --git a/src/geojson/geojson-export.js b/src/geojson/geojson-export.js index d0b4b0e68..be3815fd2 100644 --- a/src/geojson/geojson-export.js +++ b/src/geojson/geojson-export.js @@ -9,7 +9,20 @@ mapshaper-merge-layers internal.exportGeoJSON = function(dataset, opts) { opts = opts || {}; var extension = opts.extension || "json"; - var layerGroups; + var layerGroups, warn; + + // Apply coordinate precision, if relevant + if (opts.precision || opts.rfc7946) { + dataset = internal.copyDatasetForExport(dataset); + // using 6 decimals as default RFC 7946 precision + internal.setCoordinatePrecision(dataset, opts.precision || 0.000001); + } + + if (opts.rfc7946) { + warn = internal.getRFC7946Warnings(dataset); + if (warn) message(warn); + } + if (opts.file) { // Override default output extension if output filename is given extension = utils.getFileExtension(opts.file); @@ -24,8 +37,9 @@ internal.exportGeoJSON = function(dataset, opts) { return layerGroups.map(function(layers) { // Use common part of layer names if multiple layers are being merged var name = internal.mergeLayerNames(layers) || 'output'; + var d = utils.defaults({layers: layers}, dataset); return { - content: internal.exportLayersAsGeoJSON(layers, dataset, opts, true), + content: internal.exportDatasetAsGeoJSON(d, opts, 'buffer'), filename: name + '.' + extension }; }); @@ -33,57 +47,103 @@ internal.exportGeoJSON = function(dataset, opts) { // Return an array of Features or Geometries as objects or strings // -internal.exportLayerAsGeoJSON = function(lyr, dataset, opts, asFeatures, asString) { +internal.exportLayerAsGeoJSON = function(lyr, dataset, opts, asFeatures, ofmt) { var properties = internal.exportProperties(lyr.data, opts), - shapes = lyr.shapes, - ids = internal.exportIds(lyr.data, opts), - items, stringify; - - if (asString) { - stringify = opts.prettify ? - internal.getFormattedStringify(['bbox', 'coordinates']) : - JSON.stringify; - } + shapes = lyr.shapes, + ids = internal.exportIds(lyr.data, opts), + items, stringify; - if (properties && shapes && properties.length !== shapes.length) { - error("[-o] Mismatch between number of properties and number of shapes"); - } + if (ofmt) { + stringify = opts.prettify ? + internal.getFormattedStringify(['bbox', 'coordinates']) : + JSON.stringify; + } - return (shapes || properties || []).reduce(function(memo, o, i) { - var shape = shapes ? shapes[i] : null, - exporter = GeoJSON.exporters[lyr.geometry_type], - obj = shape ? exporter(shape, dataset.arcs) : null; - if (asFeatures) { - obj = { - type: 'Feature', - geometry: obj, - properties: properties ? properties[i] : null - }; - if (ids) { - obj.id = ids[i]; - } - } else if (!obj) { - return memo; // don't add null objects to GeometryCollection + if (properties && shapes && properties.length !== shapes.length) { + error("Mismatch between number of properties and number of shapes"); + } + + return (shapes || properties || []).reduce(function(memo, o, i) { + var shape = shapes ? shapes[i] : null, + exporter = GeoJSON.exporters[lyr.geometry_type], + obj = shape ? exporter(shape, dataset.arcs, opts) : null; + if (asFeatures) { + obj = { + type: 'Feature', + geometry: obj, + properties: properties ? properties[i] : null + }; + if (ids) { + obj.id = ids[i]; } - if (asString) { - // stringify features as soon as they are generated, to reduce the - // number of JS objects in memory (so larger files can be exported) - obj = stringify(obj); + } else if (!obj) { + return memo; // don't add null objects to GeometryCollection + } + if (ofmt) { + // stringify features as soon as they are generated, to reduce the + // number of JS objects in memory (so larger files can be exported) + obj = stringify(obj); + if (ofmt == 'buffer') { + obj = internal.encodeString(obj, 'utf8'); + // obj = internal.stringToBuffer(obj); + // obj = new Buffer(obj, 'utf8'); } - memo.push(obj); - return memo; - }, []); + } + memo.push(obj); + return memo; + }, []); +}; + + +internal.getRFC7946Warnings = function(dataset) { + var P = internal.getDatasetCRS(dataset); + var str; + if (!P || !internal.isLatLngCRS(P)) { + str = 'RFC 7946 warning: non-WGS84 coordinates.'; + if (P) str += ' Use "-proj wgs84" to convert.'; + } + return str; }; -// TODO: remove -internal.exportGeoJSONCollection = function(lyr, dataset, opts) { - return internal.exportLayersAsGeoJSON([lyr], dataset, opts || {}); +internal.getDatasetBbox = function(dataset, rfc7946) { + var P = internal.getDatasetCRS(dataset), + wrapped = rfc7946 && P && internal.isLatLngCRS(P), + westBounds = new Bounds(), + eastBounds = new Bounds(), + mergedBounds, gutter, margins, bbox; + + dataset.layers.forEach(function(lyr) { + if (internal.layerHasPaths(lyr)) { + internal.traversePaths(lyr.shapes, null, function(o) { + var bounds = dataset.arcs.getSimpleShapeBounds(o.arcs); + (bounds.centerX() < 0 ? westBounds : eastBounds).mergeBounds(bounds); + }); + } else if (internal.layerHasPoints(lyr)) { + internal.forEachPoint(lyr.shapes, function(p) { + (p[0] < 0 ? westBounds : eastBounds).mergePoint(p[0], p[1]); + }); + } + }); + mergedBounds = (new Bounds()).mergeBounds(eastBounds).mergeBounds(westBounds); + if (mergedBounds.hasBounds()) { + bbox = mergedBounds.toArray(); + } + if (wrapped && eastBounds.hasBounds() && westBounds.hasBounds()) { + gutter = eastBounds.xmin - westBounds.xmax; + margins = 360 + westBounds.xmin - eastBounds.xmax; + if (gutter > 0 && gutter > margins) { + bbox[0] = eastBounds.xmin; + bbox[2] = westBounds.xmax; + } + } + return bbox || null; }; -internal.exportLayersAsGeoJSON = function(layers, dataset, opts, asString) { +internal.exportDatasetAsGeoJSON = function(dataset, opts, ofmt) { var geojson = {}; + var layers = dataset.layers; var useFeatures = internal.useFeatureCollection(layers, opts); - var parts, collection, bounds, collname; + var parts, collection, bbox, collname; if (useFeatures) { geojson.type = 'FeatureCollection'; @@ -93,29 +153,52 @@ internal.exportLayersAsGeoJSON = function(layers, dataset, opts, asString) { collname = 'geometries'; } - internal.exportCRS(dataset, geojson); + if (!opts.rfc7946) { + // partial support for crs property (eliminated in RFC 7946) + internal.exportCRS(dataset, geojson); + } + if (opts.bbox) { - bounds = internal.getDatasetBounds(dataset); - if (bounds.hasBounds()) { - geojson.bbox = bounds.toArray(); + bbox = internal.getDatasetBbox(dataset, opts.rfc7946); + if (bbox) { + geojson.bbox = bbox; } } collection = layers.reduce(function(memo, lyr, i) { - var items = internal.exportLayerAsGeoJSON(lyr, dataset, opts, useFeatures, asString); + var items = internal.exportLayerAsGeoJSON(lyr, dataset, opts, useFeatures, ofmt); return memo.length > 0 ? memo.concat(items) : items; }, []); - if (asString) { - // collection is an array of individual GeoJSON Feature strings, - // need to create complete GeoJSON output by concatenation. - geojson[collname] = ["$"]; - parts = JSON.stringify(geojson).split('"$"'); - geojson = parts[0] + '\n' + collection.join(',\n') + '\n' + parts[1]; + if (opts.geojson_type == 'Feature' && collection.length == 1) { + return collection[0]; + } else if (ofmt) { + return GeoJSON.formatGeoJSON(geojson, collection, collname, ofmt); } else { geojson[collname] = collection; + return geojson; + } +}; + +GeoJSON.formatGeoJSON = function(container, collection, collType, ofmt) { + // collection is an array of individual GeoJSON Feature|geometry strings or buffers + var head = JSON.stringify(container).replace(/\}$/, ', "' + collType + '": [\n'); + var tail = '\n]}'; + if (ofmt == 'buffer') { + return GeoJSON.joinOutputBuffers(head, tail, collection); } - return geojson; + return head + collection.join(',\n') + tail; +}; + +GeoJSON.joinOutputBuffers = function(head, tail, collection) { + var comma = utils.createBuffer(',\n', 'utf8'); + var parts = collection.reduce(function(memo, buf, i) { + if (i > 0) memo.push(comma); + memo.push(buf); + return memo; + }, [utils.createBuffer(head, 'utf8')]); + parts.push(utils.createBuffer(tail, 'utf8')); + return Buffer.concat(parts); }; // export GeoJSON or TopoJSON point geometry @@ -134,6 +217,7 @@ GeoJSON.exportPointGeom = function(points, arcs) { } return geom; }; + GeoJSON.exportLineGeom = function(ids, arcs) { var obj = internal.exportPathData(ids, arcs, "polyline"); if (obj.pointCount === 0) return null; @@ -149,12 +233,14 @@ GeoJSON.exportLineGeom = function(ids, arcs) { }; }; -GeoJSON.exportPolygonGeom = function(ids, arcs) { +GeoJSON.exportPolygonGeom = function(ids, arcs, opts) { var obj = internal.exportPathData(ids, arcs, "polygon"); if (obj.pointCount === 0) return null; - var groups = internal.groupPolygonRings(obj.pathData); + var groups = internal.groupPolygonRings(obj.pathData, opts.invert_y); + var reverse = opts.rfc7946 && !opts.invert_y; var coords = groups.map(function(paths) { return paths.map(function(path) { + if (reverse) path.points.reverse(); return path.points; }); }); @@ -181,7 +267,7 @@ internal.exportCRS = function(dataset, jsonObj) { if (!info.crs && 'input_geojson_crs' in info) { // use input geojson crs if available and coords have not changed jsonObj.crs = info.input_geojson_crs; - } else if (info.crs && !info.crs.is_latlong) { + } else if (info.crs && !internal.isLatLngCRS(info.crs)) { // Setting output crs to null if coords have been projected // "If the value of CRS is null, no CRS can be assumed" // source: http://geojson.org/geojson-spec.html#coordinate-reference-system-objects @@ -192,6 +278,15 @@ internal.exportCRS = function(dataset, jsonObj) { }; internal.useFeatureCollection = function(layers, opts) { + var type = opts.geojson_type || ''; + if (type == 'Feature' || type == 'FeatureCollection') { + return true; + } else if (type == 'GeometryCollection') { + return false; + } else if (type) { + stop("Unsupported GeoJSON type:", opts.geojson_type); + } + // default is true iff layers contain attributes return utils.some(layers, function(lyr) { var fields = lyr.data ? lyr.data.getFields() : []; var haveData = internal.useFeatureProperties(fields, opts); diff --git a/src/geojson/geojson-import.js b/src/geojson/geojson-import.js index eff6dd9fd..9b7ee85e6 100644 --- a/src/geojson/geojson-import.js +++ b/src/geojson/geojson-import.js @@ -1,14 +1,41 @@ /* @requires geojson-common +geojson-reader +mapshaper-file-reader mapshaper-path-import mapshaper-data-table */ -internal.importGeoJSON = function(src, opts) { - var srcObj = utils.isString(src) ? JSON.parse(src) : src, - supportedGeometries = Object.keys(GeoJSON.pathImporters), - idField = opts.id_field || GeoJSON.ID_FIELD, +function GeoJSONParser(opts) { + var idField = opts.id_field || GeoJSON.ID_FIELD, importer = new PathImporter(opts), + dataset; + + this.parseObject = function(o) { + var geom, rec; + if (o.type == 'Feature') { + geom = o.geometry; + rec = o.properties || {}; + if ('id' in o) { + rec[idField] = o.id; + } + } else if (o.type) { + geom = o; + } + // TODO: improve so geometry_type option skips features instead of creating null geometries + importer.startShape(rec); + if (geom) GeoJSON.importGeometry(geom, importer, opts); + }; + + this.done = function() { + return importer.done(); + }; +} + +internal.importGeoJSON = function(src, opts) { + var supportedGeometries = Object.keys(GeoJSON.pathImporters), + srcObj = utils.isString(src) ? JSON.parse(src) : src, + importer = new GeoJSONParser(opts), srcCollection, dataset; // Convert single feature or geometry into a collection with one member @@ -25,35 +52,23 @@ internal.importGeoJSON = function(src, opts) { } else { srcCollection = srcObj; } - - (srcCollection.features || srcCollection.geometries || []).forEach(function(o) { - var geom, rec; - if (o.type == 'Feature') { - geom = o.geometry; - rec = o.properties || {}; - if ('id' in o) { - rec[idField] = o.id; - } - } else if (o.type) { - geom = o; - } - importer.startShape(rec); - if (geom) GeoJSON.importGeometry(geom, importer); - }); - + (srcCollection.features || srcCollection.geometries || []).forEach(importer.parseObject); dataset = importer.done(); - - internal.importCRS(dataset, srcObj); + internal.importCRS(dataset, srcObj); // TODO: remove this return dataset; }; -GeoJSON.importGeometry = function(geom, importer) { +GeoJSON.importGeometry = function(geom, importer, opts) { var type = geom.type; if (type in GeoJSON.pathImporters) { + if (opts.geometry_type && opts.geometry_type != GeoJSON.translateGeoJSONType(type)) { + // kludge to filter out all but one type of geometry + return; + } GeoJSON.pathImporters[type](geom.coordinates, importer); } else if (type == 'GeometryCollection') { geom.geometries.forEach(function(geom) { - GeoJSON.importGeometry(geom, importer); + GeoJSON.importGeometry(geom, importer, opts); }); } else { verbose("GeoJSON.importGeometry() Unsupported geometry type:", geom.type); diff --git a/src/geojson/geojson-points.js b/src/geojson/geojson-points.js deleted file mode 100644 index cc7b6c8d7..000000000 --- a/src/geojson/geojson-points.js +++ /dev/null @@ -1,31 +0,0 @@ -/* @requires geojson-common */ - -// Converts geometry in-place -GeoJSON.convertPointFeatureToSquare = function(feature, radiusField, fixedRadius) { - var geom = feature.geometry; - var side = (radiusField in feature.properties ? feature.properties[radiusField] : fixedRadius) * 2; - if (side > 0 === false) { - feature.geometry = null; - } else if (geom.type == 'Point') { - feature.geometry = { - type: 'Polygon', - coordinates: GeoJSON.convertPointCoordsToSquareCoords(geom.coordinates, side) - }; - } else if (geom.type == 'MultiPoint') { - feature.geometry = { - type: 'MultiPolygon', - coordinates: geom.coordinates.map(function(p) { - return GeoJSON.convertPointCoordsToSquareCoords(p, side); - }) - }; - } -}; - -GeoJSON.convertPointCoordsToSquareCoords = function(p, side) { - var offs = side / 2, - l = p[0] - offs, - r = p[0] + offs, - t = p[1] + offs, - b = p[1] - offs; - return [[[l, t], [r, t], [r, b], [l, b], [l, t]]]; -}; diff --git a/src/geojson/geojson-reader.js b/src/geojson/geojson-reader.js new file mode 100644 index 000000000..b895e7319 --- /dev/null +++ b/src/geojson/geojson-reader.js @@ -0,0 +1,86 @@ +/* @requires mapshaper-encodings, mapshaper-file-reader */ + +internal.GeoJSONReader = GeoJSONReader; + +// Read GeoJSON Features or geometry objects from a file +// @reader: a FileReader +function GeoJSONReader(reader) { + + // Read objects synchronously, with callback + this.readObjects = function(onObject) { + // Search first x bytes of file for features|geometries key + // 300 bytes not enough... GeoJSON files can have additional non-standard properties, e.g. 'metadata' + // var bytesToSearch = 300; + var bytesToSearch = 5000; + var start = reader.findString('"features"', bytesToSearch) || + reader.findString('"geometries"', bytesToSearch); + // Assume single Feature or geometry if collection not found + var offset = start ? start.offset : 0; + readObjects(offset, onObject); + }; + + this.readObject = readObject; + + function readObjects(start, cb) { + var obj = readObject(start); + while (obj) { + cb(JSON.parse(obj.text)); // Use JSON.parse to parse object + obj = readObject(obj.offset); + } + } + + // Search for a JSON object starting at position @offs + // Returns {text: "", offset: } or null + // is the file position directly after the object's closing brace + // Skips characters in front of first left curly brace + function readObject(offs) { + var LBRACE = 123, + RBRACE = 125, + RBRACK = 93, + BSLASH = 92, + DQUOTE = 34, + level = 0, + inString = false, + escapeNext = false, + buf = reader.readSync(offs), + retn = null, + startPos, i, n, c; + for (i=0, n=buf.length; i 0) { + // alternative to using a fixed width (e.g. when generating multiple files + // at a consistent geographic scale) + widthPx = width / opts.svg_scale + marginX; + heightPx = 0; + } else if (+opts.pixels) { + size = internal.getFrameSize(bounds, opts); + widthPx = size[0]; + heightPx = size[1]; + } else { + heightPx = opts.height || 0; + widthPx = opts.width || (heightPx > 0 ? 0 : 800); // 800 is default width + } + + if (heightPx > 0) { + // vertical meters per pixel to fit height param + ky = (height || width || 1) / (heightPx - marginY); + } + if (widthPx > 0) { + // horizontal meters per pixel to fit width param + kx = (width || height || 1) / (widthPx - marginX); + } + + if (!widthPx) { // heightPx and ky are defined, set width to match + kx = ky; + widthPx = width > 0 ? marginX + width / kx : heightPx; // export square graphic if content has 0 width (reconsider this?) + } else if (!heightPx) { // widthPx and kx are set, set height to match + ky = kx; + heightPx = height > 0 ? marginY + height / ky : widthPx; + // limit height if max_height is defined + if (opts.max_height > 0 && heightPx > opts.max_height) { + ky = kx * heightPx / opts.max_height; + heightPx = opts.max_height; + } + } + + if (kx > ky) { // content is wide -- need to pad vertically + ky = kx; + padY = ky * (heightPx - marginY) - height; + } else if (ky > kx) { // content is tall -- need to pad horizontally + kx = ky; + padX = kx * (widthPx - marginX) - width; + } + + bounds.padBounds( + margins[0] * kx + padX * wx, + margins[1] * ky + padY * wy, + margins[2] * kx + padX * (1 - wx), + margins[3] * ky + padY * (1 - wy)); + + if (!(widthPx > 0 && heightPx > 0)) { + error("Missing valid height and width parameters"); + } + if (!(kx === ky && kx > 0)) { + error("Missing valid margin parameters"); + } + + return new Bounds(0, 0, widthPx, heightPx); +}; diff --git a/src/geom/mapshaper-point-geom.js b/src/geom/mapshaper-point-geom.js deleted file mode 100644 index ca828eb3f..000000000 --- a/src/geom/mapshaper-point-geom.js +++ /dev/null @@ -1,13 +0,0 @@ -/* @requires mapshaper-geom */ - -// @zz Optional -// -internal.getPointCentroid = function(xx, yy) { - - -}; - -internal.getPointCentroidSph = function(xx, yy) { - - -}; diff --git a/src/geom/mapshaper-projections.js b/src/geom/mapshaper-projections.js index d297fe8f2..170222fee 100644 --- a/src/geom/mapshaper-projections.js +++ b/src/geom/mapshaper-projections.js @@ -5,29 +5,71 @@ internal.projectionIndex = { robinson: '+proj=robin +datum=WGS84', webmercator: '+proj=merc +a=6378137 +b=6378137', wgs84: '+proj=longlat +datum=WGS84', - albersusa: AlbersNYT + albersusa: getAlbersUSA(), + albersusa2: getAlbersUSA({PR: true}) // version with Puerto Rico +}; + +// This stub is replaced when loaded in GUI, which may need to load some files +internal.initProjLibrary = function(opts, done) {done();}; + +// Find Proj.4 definition file names in strings like "+init=epsg:3000" +// (Used by GUI, defined here for testing) +internal.findProjLibs = function(str) { + var matches = str.match(/\b(esri|epsg|nad83|nad27)(?=:[0-9]+\b)/ig) || []; + return utils.uniq(matches.map(function(str) {return str.toLowerCase();})); +}; + +// src, dest: proj4 objects +internal.getProjTransform = function(src, dest) { + var mproj = require('mproj'); + var clampSrc = internal.isLatLngCRS(src); + return function(x, y) { + var xy; + if (clampSrc) { + // snap lng to bounds + if (x < -180) x = -180; + else if (x > 180) x = 180; + } + xy = [x, y]; + mproj.pj_transform_point(src, dest, xy); + return xy; + }; +}; + +internal.toLngLat = function(xy, P) { + var proj; + if (isLatLngCRS(P)) { + return xy.concat(); + } + proj = internal.getProjInfo(P, internal.getCRS('wgs84')); + return proj(xy); }; internal.getProjInfo = function(dataset) { var P, info; try { - P = internal.getDatasetProjection(dataset); + P = internal.getDatasetCRS(dataset); if (P) { info = internal.crsToProj4(P); } - if (!info) { - info = "unknown"; - } - } catch(e) { - info = e.message; - } - return info; + } catch(e) {} + return info || "[unknown]"; }; internal.crsToProj4 = function(P) { return require('mproj').internal.get_proj_defn(P); }; +internal.crsToPrj = function(P) { + var wkt; + try { + wkt = require('mproj').internal.wkt_from_proj4(P); + } catch(e) { + + } + return wkt; +}; + internal.crsAreEqual = function(a, b) { var str = internal.crsToProj4(a); return !!str && str == internal.crsToProj4(b); @@ -48,7 +90,7 @@ internal.getProjDefn = function(str) { return defn; }; -internal.getProjection = function(str) { +internal.getCRS = function(str) { var defn = internal.getProjDefn(str); var P; if (typeof defn == 'function') { @@ -63,49 +105,74 @@ internal.getProjection = function(str) { return P || null; }; -internal.getDatasetProjection = function(dataset) { +// @info: info property of source dataset (instead of crs object, so wkt string +// can be preserved if present) +internal.setDatasetCRS = function(dataset, info) { + dataset.info = dataset.info || {}; + // Assumes that proj4 object is never mutated. + // TODO: assign a copy of crs (if present) + dataset.info.crs = info.crs; + dataset.info.prj = info.prj; +}; + +internal.getDatasetCRS = function(dataset) { var info = dataset.info || {}, P = info.crs; - if (!P && info.input_prj) { - P = internal.parsePrj(info.input_prj); + if (!P && info.prj) { + P = internal.parsePrj(info.prj); } if (!P && internal.probablyDecimalDegreeBounds(internal.getDatasetBounds(dataset))) { // use wgs84 for probable latlong datasets with unknown datums - P = internal.getProjection('wgs84'); + P = internal.getCRS('wgs84'); } return P; }; +// Assumes conformal projections; consider returning average of vertical and +// horizontal scale factors. +// x, y: a point location in projected coordinates +// Returns k, the ratio of coordinate distance to distance on the ground +internal.getScaleFactorAtXY = function(x, y, crs) { + var proj = require('mproj'); + var dist = 1; + var lp = proj.pj_inv_deg({x: x, y: y}, crs); + var lp2 = proj.pj_inv_deg({x: x + dist, y: y}, crs); + var k = dist / greatCircleDistance(lp.lam, lp.phi, lp2.lam, lp2.phi); + return k; +}; + +internal.isProjectedCRS = function(P) { + return P && P.is_latlong || false; +}; + +internal.isLatLngCRS = function(P) { + return P && P.is_latlong || false; +}; + internal.printProjections = function() { var index = require('mproj').internal.pj_list; - message('Proj4 projections'); + var msg = 'Proj4 projections\n'; Object.keys(index).sort().forEach(function(id) { - message(' ' + utils.rpad(id, 7, ' ') + ' ' + index[id].name); + msg += ' ' + utils.rpad(id, 7, ' ') + ' ' + index[id].name + '\n'; }); - message('\nAliases'); + msg += '\nAliases'; Object.keys(internal.projectionIndex).sort().forEach(function(n) { - message(' ' + n); + msg += '\n ' + n; }); + message(msg); }; -// Convert contents of a .prj file to a projection object -internal.parsePrj = function(str) { +internal.translatePrj = function(str) { var proj4; try { proj4 = require('mproj').internal.wkt_to_proj4(str); } catch(e) { stop('Unusable .prj file (' + e.message + ')'); } - return internal.getProjection(proj4); + return proj4; }; - -function AlbersNYT() { - var mproj = require('mproj'); - var lcc = mproj.pj_init('+proj=lcc +lon_0=-96 +lat_0=39 +lat_1=33 +lat_2=45'); - var aea = mproj.pj_init('+proj=aea +lon_0=-96 +lat_0=37.5 +lat_1=29.5 +lat_2=45.5'); - var mixed = new MixedProjection(aea) - .addFrame(lcc, {lam: -152, phi: 63}, {lam: -115, phi: 27}, 6e6, 3e6, 0.31, 29.2) // AK - .addFrame(lcc, {lam: -157, phi: 20.9}, {lam: -106.6, phi: 28.2}, 3e6, 5e6, 0.9, 40); // HI - return mixed; -} +// Convert contents of a .prj file to a projection object +internal.parsePrj = function(str) { + return internal.getCRS(internal.translatePrj(str)); +}; diff --git a/src/geom/mapshaper-rounding.js b/src/geom/mapshaper-rounding.js index b0d82c6d5..4e8951cd0 100644 --- a/src/geom/mapshaper-rounding.js +++ b/src/geom/mapshaper-rounding.js @@ -1,4 +1,4 @@ -/* @require mapshaper-arcs, mapshaper-dissolve2 */ +/* @require mapshaper-dataset-utils, mapshaper-point-utils */ internal.roundPoints = function(lyr, round) { internal.forEachPoint(lyr.shapes, function(p) { @@ -9,10 +9,12 @@ internal.roundPoints = function(lyr, round) { internal.setCoordinatePrecision = function(dataset, precision) { var round = utils.getRoundingFunction(precision); - var dissolvePolygon, nodes; + // var dissolvePolygon, nodes; internal.transformPoints(dataset, function(x, y) { return [round(x), round(y)]; }); + // v0.4.52 removing polygon dissolve - see issue #219 + /* if (dataset.arcs) { nodes = internal.addIntersectionCuts(dataset); dissolvePolygon = internal.getPolygonDissolver(nodes); @@ -24,6 +26,7 @@ internal.setCoordinatePrecision = function(dataset, precision) { lyr.shapes = lyr.shapes.map(dissolvePolygon); } }); + */ return dataset; }; diff --git a/src/geom/mapshaper-segment-geom.js b/src/geom/mapshaper-segment-geom.js index 347f3af5e..0b7490c63 100644 --- a/src/geom/mapshaper-segment-geom.js +++ b/src/geom/mapshaper-segment-geom.js @@ -2,11 +2,11 @@ geom.segmentIntersection = segmentIntersection; geom.segmentHit = segmentHit; -geom.lineIntersection = lineIntersection; geom.orient2D = orient2D; geom.outsideRange = outsideRange; +geom.findClosestPointOnSeg = findClosestPointOnSeg; -// Find the interection between two 2D segments +// Find the intersection between two 2D segments // Returns 0, 1 or two x, y locations as null, [x, y], or [x1, y1, x2, y2] // Special cases: // If the segments touch at an endpoint of both segments, it is not treated as an intersection @@ -15,34 +15,60 @@ geom.outsideRange = outsideRange; // is counted as an intersection (there will be one or two) // function segmentIntersection(ax, ay, bx, by, cx, cy, dx, dy) { - var hit = segmentHit(ax, ay, bx, by, cx, cy, dx, dy), - p = null; - if (hit) { - p = crossIntersection(ax, ay, bx, by, cx, cy, dx, dy); - if (!p) { // collinear if p is null - p = collinearIntersection(ax, ay, bx, by, cx, cy, dx, dy); - } else if (endpointHit(ax, ay, bx, by, cx, cy, dx, dy)) { - p = null; // filter out segments that only intersect at an endpoint - } - } - return p; + var hit = segmentHit(ax, ay, bx, by, cx, cy, dx, dy); + return hit ? findSegmentIntersection(ax, ay, bx, by, cx, cy, dx, dy) : null; } -function lineIntersection(ax, ay, bx, by, cx, cy, dx, dy) { +// Assumes segments intersect +function findSegmentIntersection(ax, ay, bx, by, cx, cy, dx, dy) { var den = determinant2D(bx - ax, by - ay, dx - cx, dy - cy); - var eps = 1e-18; var m, p; - if (den === 0) return null; + // Case: segments are collinear + if (den === 0) { + return collinearIntersection(ax, ay, bx, by, cx, cy, dx, dy); + } + // TODO: remove when/if no longer needed + if (endpointHit(ax, ay, bx, by, cx, cy, dx, dy)) { + return null; + } + // Case: segments are very nearly collinear + // TODO: rethink this + if (Math.abs(den) < 1e-18) { + // tiny denominator = low precision; snapping to a vertex + return findEndpointInRange(ax, ay, bx, by, cx, cy, dx, dy); + } m = orient2D(cx, cy, dx, dy, ax, ay) / den; - if (den <= eps && den >= -eps) { - // tiny denominator = low precision; using one of the endpoints as intersection - p = findEndpointInRange(ax, ay, bx, by, cx, cy, dx, dy); - if (!p) { - trace('[lineIntersection()]'); - geom.debugSegmentIntersection([], ax, ay, bx, by, cx, cy, dx, dy); - } + p = [ax + m * (bx - ax), ay + m * (by - ay)]; + // Snap p to a vertex if very close to one + // This avoids tiny segments caused by T-intersection overshoots and prevents + // pathfinder errors related to f-p rounding. + // TODO: look into applying similar snapping to tiny undershoots, which might + // also cause pathfinder errors. + snapIntersectionPoint(p, ax, ay, bx, by, cx, cy, dx, dy); + // Snap to bbox edge if p is outside + // (May no longer be needed, now that we're using snapIntersectionPoint() above) + // TODO: handle out-of-bounds point as an error + clampIntersectionPoint(p, ax, ay, bx, by, cx, cy, dx, dy); + return p; +} + +// Used by mapshaper-gaps.js +// TODO: make more robust, make sure result is compatible with segmentIntersection() +// (rounding errors currently must be handled downstream) +function findClosestPointOnSeg(px, py, ax, ay, bx, by) { + var dx = bx - ax, + dy = by - ay, + dotp = (px - ax) * dx + (py - ay) * dy, + abSq = dx * dx + dy * dy, + k = abSq === 0 ? -1 : dotp / abSq, + eps = 0.1, // 1e-6, // snap to endpoint + p; + if (k <= eps) { + p = [ax, ay]; + } else if (k >= 1 - eps) { + p = [bx, by]; } else { - p = [ax + m * (bx - ax), ay + m * (by - ay)]; + p = [ax + k * dx, ay + k * dy]; } return p; } @@ -57,31 +83,30 @@ function findEndpointInRange(ax, ay, bx, by, cx, cy, dx, dy) { p = [cx, cy]; } else if (!outsideRange(dx, ax, bx) && !outsideRange(dy, ay, by)) { p = [dx, dy]; + } else { + debug('[findEndpointInRange()] error'); } return p; } -// Get intersection point if segments are non-collinear, else return null -// Assumes that segments have been intersect -function crossIntersection(ax, ay, bx, by, cx, cy, dx, dy) { - var p = lineIntersection(ax, ay, bx, by, cx, cy, dx, dy); - var nearest; - if (p) { - // Re-order operands so intersection point is closest to a (better precision) - // Source: Jonathan Shewchuk http://www.cs.berkeley.edu/~jrs/meshpapers/robnotes.pdf - nearest = nearestPoint(p[0], p[1], ax, ay, bx, by, cx, cy, dx, dy); - if (nearest == 1) { - p = lineIntersection(bx, by, ax, ay, cx, cy, dx, dy); - } else if (nearest == 2) { - p = lineIntersection(cx, cy, dx, dy, ax, ay, bx, by); - } else if (nearest == 3) { - p = lineIntersection(dx, dy, cx, cy, ax, ay, bx, by); - } - } - if (p) { - clampIntersectionPoint(p, ax, ay, bx, by, cx, cy, dx, dy); +function snapIfCloser(p, minDist, x, y, x2, y2) { + var dist = distance2D(x, y, x2, y2); + if (dist < minDist) { + minDist = dist; + p[0] = x2; + p[1] = y2; } - return p; + return minDist; +} + +function snapIntersectionPoint(p, ax, ay, bx, by, cx, cy, dx, dy) { + var x = p[0], + y = p[1], + snapDist = 1e-12; + snapDist = snapIfCloser(p, snapDist, x, y, ax, ay); + snapDist = snapIfCloser(p, snapDist, x, y, bx, by); + snapDist = snapIfCloser(p, snapDist, x, y, cx, cy); + snapDist = snapIfCloser(p, snapDist, x, y, dx, dy); } function clampIntersectionPoint(p, ax, ay, bx, by, cx, cy, dx, dy) { @@ -93,25 +118,14 @@ function clampIntersectionPoint(p, ax, ay, bx, by, cx, cy, dx, dy) { var x = p[0], y = p[1]; // assumes that segment ranges intersect - x = geom.clampToCloseRange(x, ax, bx); - x = geom.clampToCloseRange(x, cx, dx); - y = geom.clampToCloseRange(y, ay, by); - y = geom.clampToCloseRange(y, cy, dy); + x = clampToCloseRange(x, ax, bx); + x = clampToCloseRange(x, cx, dx); + y = clampToCloseRange(y, ay, by); + y = clampToCloseRange(y, cy, dy); p[0] = x; p[1] = y; } -geom.debugSegmentIntersection = function(p, ax, ay, bx, by, cx, cy, dx, dy) { - trace('[debugSegmentIntersection()]'); - trace(' s1\n dx:', Math.abs(ax - bx), '\n dy:', Math.abs(ay - by)); - trace(' s2\n dx:', Math.abs(cx - dx), '\n dy:', Math.abs(cy - dy)); - trace(' s1 xx:', ax, bx); - trace(' s2 xx:', cx, dx); - trace(' s1 yy:', ay, by); - trace(' s2 yy:', cy, dy); - trace(' angle:', geom.signedAngle(ax, ay, bx, by, dx - cx + bx, dy - cy + by)); -}; - // a: coordinate of point // b: endpoint coordinate of segment // c: other endpoint of segment @@ -127,17 +141,17 @@ function outsideRange(a, b, c) { return out; } -geom.clampToCloseRange = function(a, b, c) { +function clampToCloseRange(a, b, c) { var lim; if (geom.outsideRange(a, b, c)) { lim = Math.abs(a - b) < Math.abs(a - c) ? b : c; - if (Math.abs(a - lim) > 1e-16) { - trace("[clampToCloseRange()] large clamping interval", a, b, c); + if (Math.abs(a - lim) > 1e-15) { + debug("[clampToCloseRange()] large clamping interval", a, b, c); } a = lim; } return a; -}; +} // Determinant of matrix // | a b | @@ -194,7 +208,7 @@ function collinearIntersection(ax, ay, bx, by, cx, cy, dx, dy) { } if (coords.length != 2 && coords.length != 4) { coords = null; - trace("Invalid collinear segment intersection", coords); + debug("Invalid collinear segment intersection", coords); } else if (coords.length == 4 && coords[0] == coords[2] && coords[1] == coords[3]) { // segs that meet in the middle don't count coords = null; @@ -206,3 +220,71 @@ function endpointHit(ax, ay, bx, by, cx, cy, dx, dy) { return ax == cx && ay == cy || ax == dx && ay == dy || bx == cx && by == cy || bx == dx && by == dy; } + +// function segmentIntersection(ax, ay, bx, by, cx, cy, dx, dy) { +// var hit = segmentHit(ax, ay, bx, by, cx, cy, dx, dy), +// p = null; +// if (hit) { +// p = crossIntersection(ax, ay, bx, by, cx, cy, dx, dy); +// if (!p) { // collinear if p is null +// p = collinearIntersection(ax, ay, bx, by, cx, cy, dx, dy); +// } else if (endpointHit(ax, ay, bx, by, cx, cy, dx, dy)) { +// p = null; // filter out segments that only intersect at an endpoint +// } +// } +// return p; +// } + +// // Get intersection point if segments are non-collinear, else return null +// // Assumes that segments have been found to intersect (e.g. by segmentHit() function) +// function crossIntersection(ax, ay, bx, by, cx, cy, dx, dy) { +// var p = lineIntersection(ax, ay, bx, by, cx, cy, dx, dy); +// var nearest; +// if (p) { +// // Re-order operands so intersection point is closest to a (better precision) +// // Source: Jonathan Shewchuk http://www.cs.berkeley.edu/~jrs/meshpapers/robnotes.pdf +// nearest = nearestPoint(p[0], p[1], ax, ay, bx, by, cx, cy, dx, dy); +// if (nearest == 1) { +// p = lineIntersection(bx, by, ax, ay, cx, cy, dx, dy); +// } else if (nearest == 2) { +// p = lineIntersection(cx, cy, dx, dy, ax, ay, bx, by); +// } else if (nearest == 3) { +// p = lineIntersection(dx, dy, cx, cy, ax, ay, bx, by); +// } +// } +// if (p) { +// clampIntersectionPoint(p, ax, ay, bx, by, cx, cy, dx, dy); +// } +// return p; +// } + + +// function lineIntersection(ax, ay, bx, by, cx, cy, dx, dy) { +// var den = determinant2D(bx - ax, by - ay, dx - cx, dy - cy); +// var eps = 1e-18; +// var m, p; +// if (den === 0) return null; +// m = orient2D(cx, cy, dx, dy, ax, ay) / den; +// if (den <= eps && den >= -eps) { +// // tiny denominator = low precision; using one of the endpoints as intersection +// p = findEndpointInRange(ax, ay, bx, by, cx, cy, dx, dy); +// } else { +// p = [ax + m * (bx - ax), ay + m * (by - ay)]; +// } +// return p; +// } + +// // Return id of nearest point to x, y, among x0, y0, x1, y1, ... +// function nearestPoint(x, y, x0, y0) { +// var minIdx = -1, +// minDist = Infinity, +// dist; +// for (var i = 0, j = 2, n = arguments.length; j < n; i++, j += 2) { +// dist = distanceSq(x, y, arguments[j], arguments[j+1]); +// if (dist < minDist) { +// minDist = dist; +// minIdx = i; +// } +// } +// return minIdx; +// } diff --git a/src/geom/mapshaper-shape-geom.js b/src/geom/mapshaper-shape-geom.js index 743a17514..c87986fa4 100644 --- a/src/geom/mapshaper-shape-geom.js +++ b/src/geom/mapshaper-shape-geom.js @@ -3,8 +3,17 @@ // Calculations for planar geometry of shapes // TODO: consider 3D versions of some of these +// TODO: adjust for spherical/ellipsoidal +geom.calcPolsbyPopperCompactness = function(area, perimeter) { + if (!perimeter) return 0; + return area * Math.PI * 4 / (perimeter * perimeter); +}; + geom.getShapeArea = function(shp, arcs) { - return (arcs.isPlanar() ? geom.getPlanarShapeArea : geom.getSphericalShapeArea)(shp, arcs); + // return (arcs.isPlanar() ? geom.getPlanarShapeArea : geom.getSphericalShapeArea)(shp, arcs); + return (shp || []).reduce(function(area, ids) { + return area + geom.getPathArea(ids, arcs); + }, 0); }; geom.getPlanarShapeArea = function(shp, arcs) { @@ -83,26 +92,42 @@ geom.testPointInPolygon = function(x, y, shp, arcs) { geom.getPointToPathDistance = function(px, py, ids, arcs) { - var iter = arcs.getShapeIter(ids); - if (!iter.hasNext()) return Infinity; - var ax = iter.x, - ay = iter.y, - paSq = distanceSq(px, py, ax, ay), - pPathSq = paSq, - pbSq, abSq, - bx, by; + return geom.getPointToPathInfo(px, py, ids, arcs).distance; +}; +geom.getPointToPathInfo = function(px, py, ids, arcs) { + var iter = arcs.getShapeIter(ids); + var pPathSq = Infinity; + var ax, ay, bx, by, axmin, aymin, bxmin, bymin, + paSq, pbSq, abSq, pabSq; + if (iter.hasNext()) { + ax = axmin = bxmin = iter.x; + ay = aymin = bymin = iter.y; + paSq = distanceSq(px, py, ax, ay); + } while (iter.hasNext()) { bx = iter.x; by = iter.y; pbSq = distanceSq(px, py, bx, by); abSq = distanceSq(ax, ay, bx, by); - pPathSq = Math.min(pPathSq, apexDistSq(paSq, pbSq, abSq)); + pabSq = apexDistSq(paSq, pbSq, abSq); + if (pabSq < pPathSq) { + + pPathSq = pabSq; + axmin = ax; + aymin = ay; + bxmin = bx; + bymin = by; + } ax = bx; ay = by; paSq = pbSq; } - return Math.sqrt(pPathSq); + if (pPathSq == Infinity) return {distance: Infinity}; + return { + segment: [[axmin, aymin], [bxmin, bymin]], + distance: Math.sqrt(pPathSq) + }; }; geom.getYIntercept = function(x, ax, ay, bx, by) { @@ -136,7 +161,7 @@ geom.testPointInRing = function(x, y, ids, arcs) { */ var isIn = false, isOn = false; - internal.forEachPathSegment(ids, arcs, function(a, b, xx, yy) { + internal.forEachSegmentInPath(ids, arcs, function(a, b, xx, yy) { var result = geom.testRayIntersection(x, y, xx[a], yy[a], xx[b], yy[b]); if (result == 1) { isIn = !isIn; @@ -206,6 +231,10 @@ geom.getRayIntersection = function(x, y, ax, ay, bx, by) { return hit; }; +geom.getPathArea = function(ids, arcs) { + return (arcs.isPlanar() ? geom.getPlanarPathArea : geom.getSphericalPathArea)(ids, arcs); +}; + geom.getSphericalPathArea = function(ids, arcs) { var iter = arcs.getShapeIter(ids), sum = 0, @@ -271,6 +300,34 @@ geom.getPlanarPathArea = function(ids, arcs) { return sum / 2; }; + +geom.getPathPerimeter = function(ids, arcs) { + return (arcs.isPlanar() ? geom.getPlanarPathPerimeter : geom.getSphericalPathPerimeter)(ids, arcs); +}; + +geom.getShapePerimeter = function(shp, arcs) { + return (shp || []).reduce(function(len, ids) { + return len + geom.getPathPerimeter(ids, arcs); + }, 0); +}; + +geom.getSphericalShapePerimeter = function(shp, arcs) { + if (arcs.isPlanar()) { + error("[getSphericalShapePerimeter()] Function requires decimal degree coordinates"); + } + return (shp || []).reduce(function(len, ids) { + return len + geom.getSphericalPathPerimeter(ids, arcs); + }, 0); +}; + +geom.getPlanarPathPerimeter = function(ids, arcs) { + return geom.calcPathLen(ids, arcs, false); +}; + +geom.getSphericalPathPerimeter = function(ids, arcs) { + return geom.calcPathLen(ids, arcs, true); +}; + geom.countVerticesInPath = function(ids, arcs) { var iter = arcs.getShapeIter(ids), count = 0; diff --git a/src/geom/mapshaper-units.js b/src/geom/mapshaper-units.js new file mode 100644 index 000000000..811b957e1 --- /dev/null +++ b/src/geom/mapshaper-units.js @@ -0,0 +1,147 @@ +/* @requires mapshaper-projections */ + +var UNITS_LOOKUP = { + m: 'meters', + meter: 'meters', + meters: 'meters', + mi: 'miles', + mile: 'miles', + miles: 'miles', + km: 'kilometers', + ft: 'feet', + feet: 'feet' +}; + +// From pj_units.js in mapshaper-proj +var TO_METERS = { + meters: 1, + kilometers: 1000, + feet: 0.3048, // International Standard Foot + miles: 1609.344 // International Statute Mile +}; + +// Return coeff. for converting a distance measure to dataset coordinates +// @paramUnits: units code of distance param, or null if units are not specified +// @crs: Proj.4 CRS object, or null (unknown latlong CRS); +// +internal.getIntervalConversionFactor = function(paramUnits, crs) { + var fromParam = 0, + fromCRS = 0, + k; + + if (crs) { + if (crs.is_latlong) { + // calculations on latlong coordinates typically use meters + fromCRS = 1; + } else if (crs.to_meter > 0) { + fromCRS = crs.to_meter; + } else { + error('Invalid CRS'); + } + } + if (paramUnits) { + fromParam = TO_METERS[paramUnits]; + if (!fromParam) error('Unknown units:', paramUnits); + } + + if (fromParam && fromCRS) { + // known param units, known CRS conversion + k = fromParam / fromCRS; + } else if (!fromParam && !fromCRS) { + // unknown param units, unknown (projected) CRS -- no scaling + k = 1; + } else if (fromParam && !fromCRS) { + // known param units, unknown CRS -- error condition, not convertible + stop('Unable to convert', paramUnits, 'to unknown coordinates'); + } else if (!fromParam && fromCRS) { + // unknown param units, known CRS -- assume param in meters (bw compatibility) + k = 1 / fromCRS; + } + return k; +}; + +internal.parseMeasure = function(m) { + var s = utils.isString(m) ? m : ''; + var match = /(sq|)([a-z]+)(2|)$/i.exec(s); // units rxp + var o = {}; + if (utils.isNumber(m)) { + o.value = m; + } else if (s === '') { + o.value = NaN; + } else if (match) { + o.units = UNITS_LOOKUP[match[2].toLowerCase()]; + if (!o.units) { + stop('Unknown units:', match[0]); + } + o.areal = !!(match[1] || match[3]); + o.value = Number(s.substring(0, s.length - match[0].length)); + } else { + o.value = Number(s); + } + if (isNaN(o.value)) { + stop('Invalid parameter:', m); + } + return o; +}; + +internal.convertAreaParam = function(opt, crs) { + var o = internal.parseMeasure(opt); + var k = internal.getIntervalConversionFactor(o.units, crs); + return o.value * k * k; +}; + +internal.convertDistanceParam = function(opt, crs) { + var o = internal.parseMeasure(opt); + var k = internal.getIntervalConversionFactor(o.units, crs); + if (o.areal) { + stop('Expected a distance, received an area:', opt); + } + return o.value * k; +}; + +// Same as convertDistanceParam(), except: +// in the case of latlong datasets, coordinates are unitless (instead of meters), +// and parameters with units trigger an error +internal.convertIntervalParam = function(opt, crs) { + var o = internal.parseMeasure(opt); + var k = internal.getIntervalConversionFactor(o.units, crs); + if (o.units && crs && crs.is_latlong) { + stop('Parameter does not support distance units with latlong datasets'); + } + if (o.areal) { + stop('Expected a distance, received an area:', opt); + } + return o.value * k; +}; + +internal.convertIntervalPair = function(opt, crs) { + var a, b; + if (!Array.isArray(opt) || opt.length != 2) { + stop('Expected two distance parameters, received', opt); + } + a = internal.parseMeasure(opt[0]); + b = internal.parseMeasure(opt[1]); + if (a.units && !b.units || b.units && !a.units) { + stop('Both parameters should have units:', opt); + } + return [internal.convertIntervalParam(opt[0], crs), + internal.convertIntervalParam(opt[1], crs)]; +}; + +// Accepts a single value or a list of four values. List order is l,b,t,r +internal.convertFourSides = function(opt, crs, bounds) { + var arr = opt.split(','); + if (arr.length == 1) { + arr = [arr[0], arr[0], arr[0], arr[0]]; + } else if (arr.length != 4) { + stop("Expected a distance parameter or a list of four params"); + } + return arr.map(function(param, i) { + var tmp; + if (param.indexOf('%') > 0) { + tmp = parseFloat(param) / 100 || 0; + return tmp * (i == 1 || i == 3 ? bounds.height() : bounds.width()); + } + return internal.convertIntervalParam(opt, crs); + }); +}; diff --git a/src/gui/mapshaper-canvas.js b/src/gui/mapshaper-canvas.js index 598428164..304a05e9a 100644 --- a/src/gui/mapshaper-canvas.js +++ b/src/gui/mapshaper-canvas.js @@ -1,20 +1,125 @@ /* @requires mapshaper-gui-lib */ -gui.getPixelRatio = function() { +GUI.getPixelRatio = function() { var deviceRatio = window.devicePixelRatio || window.webkitDevicePixelRatio || 1; return deviceRatio > 1 ? 2 : 1; }; +// TODO: consider moving this upstream +function getArcsForRendering(obj, ext) { + var dataset = obj.source.dataset; + var sourceArcs = dataset.arcs; + if (obj.geographic && dataset.displayArcs) { + return dataset.displayArcs.getArcCollection(ext); + } + return obj.arcs; +} + +function drawOutlineLayerToCanvas(obj, canv, ext) { + var arcs; + var style = obj.style; + var darkStyle = {strokeWidth: style.strokeWidth, strokeColor: style.strokeColors[1]}, + lightStyle = {strokeWidth: style.strokeWidth, strokeColor: style.strokeColors[0]}; + var filter; + if (internal.layerHasPaths(obj.layer)) { + if (!obj.arcCounts) { + obj.arcCounts = new Uint8Array(obj.arcs.size()); + internal.countArcsInShapes(obj.layer.shapes, obj.arcCounts); + } + if (obj.arcCounts) { + arcs = getArcsForRendering(obj, ext); + if (lightStyle.strokeColor) { + filter = getArcFilter(arcs, ext, false, obj.arcCounts); + canv.drawArcs(arcs, lightStyle, filter); + } + if (darkStyle.strokeColor && obj.layer.geometry_type != 'point') { + filter = getArcFilter(arcs, ext, true, obj.arcCounts); + canv.drawArcs(arcs, darkStyle, filter); + } + } + } + if (obj.layer.geometry_type == 'point') { + canv.drawSquareDots(obj.layer.shapes, style); + } +} + +function drawStyledLayerToCanvas(obj, canv, ext) { + // TODO: add filter for out-of-view shapes + var style = obj.style; + var layer = obj.layer; + var arcs, filter; + if (layer.geometry_type == 'point') { + if (style.type == 'styled') { + canv.drawPoints(layer.shapes, style); + } else { + canv.drawSquareDots(layer.shapes, style); + } + } else { + arcs = getArcsForRendering(obj, ext); + filter = getShapeFilter(arcs, ext); + canv.drawPathShapes(layer.shapes, arcs, style, filter); + } +} + + +// Return a function for testing if an arc should be drawn in the current view +function getArcFilter(arcs, ext, usedFlag, arcCounts) { + var minPathLen = 0.5 * ext.getPixelSize(), + geoBounds = ext.getBounds(), + geoBBox = geoBounds.toArray(), + allIn = geoBounds.contains(arcs.getBounds()), + visible; + // don't continue dropping paths if user zooms out farther than full extent + if (ext.scale() < 1) minPathLen *= ext.scale(); + return function(i) { + var visible = true; + if (usedFlag != arcCounts[i] > 0) { // show either used or unused arcs + visible = false; + } else if (arcs.arcIsSmaller(i, minPathLen)) { + visible = false; + } else if (!allIn && !arcs.arcIntersectsBBox(i, geoBBox)) { + visible = false; + } + return visible; + }; + } + +// Return a function for testing if a shape should be drawn in the current view +function getShapeFilter(arcs, ext) { + var viewBounds = ext.getBounds(); + var bounds = new Bounds(); + if (ext.scale() < 1.1) return null; // full or almost-full zoom: no filter + return function(shape) { + bounds.empty(); + arcs.getMultiShapeBounds(shape, bounds); + return viewBounds.intersects(bounds); + }; +} + +function getPixelColorFunction() { + var canv = El('canvas').node(); + canv.width = canv.height = 1; + return function(col) { + var ctx = canv.getContext('2d'); + var pixels; + ctx.fillStyle = col; + ctx.fillRect(0, 0, 1, 1); + pixels = new Uint32Array(ctx.getImageData(0, 0, 1, 1).data.buffer); + return pixels[0]; + }; +} + function DisplayCanvas() { var _self = El('canvas'), _canvas = _self.node(), _ctx = _canvas.getContext('2d'), + _pixelColor = getPixelColorFunction(), _ext; _self.prep = function(extent) { var w = extent.width(), h = extent.height(), - pixRatio = gui.getPixelRatio(); + pixRatio = GUI.getPixelRatio(); _ctx.clearRect(0, 0, _canvas.width, _canvas.height); _canvas.width = w * pixRatio; _canvas.height = h * pixRatio; @@ -38,15 +143,17 @@ function DisplayCanvas() { }; */ + // Optimized to draw paths in same-style batches (faster Canvas drawing) - _self.drawPathShapes = function(shapes, arcs, style) { + _self.drawPathShapes = function(shapes, arcs, style, filter) { var styleIndex = {}; var batchSize = 1500; - var startPath = getPathStart(_ext); - var drawPath = getShapePencil(arcs, _ext); + var startPath = getPathStart(_ext, getScaledLineScale(_ext)); + var draw = getShapePencil(arcs, _ext); var key, item; var styler = style.styler || null; for (var i=0; i= batchSize) { - drawPaths(item.shapes, startPath, drawPath, item.style); + // overlays should not be batched, so transparency of overlapping shapes + // is drawn correctly + if (item.shapes.length >= batchSize || style.overlay) { + drawPaths(item.shapes, startPath, draw, item.style); item.shapes = []; } } Object.keys(styleIndex).forEach(function(key) { var item = styleIndex[key]; - drawPaths(item.shapes, startPath, drawPath, item.style); + drawPaths(item.shapes, startPath, draw, item.style); }); }; - function drawPaths(shapes, startPath, drawPath, style) { - startPath(_ctx, style); + function drawPaths(shapes, begin, draw, style) { + begin(_ctx, style); for (var i=0, n=shapes.length; i= 0 ? style.dotSize : 3) * scaleRatio), styler = style.styler || null, - shp, p; - - _ctx.fillStyle = style.dotColor || "black"; - // TODO: don't try to draw offscreen points - for (var i=0, n=shapes.length; i -size && y > -size && x < xmax && y < ymax) { + drawSquare(x, y, size, _ctx); + } + } + } + }; + + _self.drawSquareDotsFaster = function(shapes, color, size, t) { + var w = _canvas.width, + h = _canvas.height, + rgba = _pixelColor(color), + // imageData = _ctx.createImageData(w, h), + imageData = _ctx.getImageData(0, 0, w, h), + pixels = new Uint32Array(imageData.data.buffer), + shp, x, y, i, j, n, m; + for (i=0, n=shapes.length; i= 0 && y >= 0 && x <= w && y <= h) { + drawSquareFaster(x, y, rgba, size, pixels, w, h); + } } } + _ctx.putImageData(imageData, 0, 0); }; + // color: 32-bit integer value containing rgba channel values + // size: pixels on a side (assume integer) + // x, y: non-integer center coordinates + // pixels: Uint32Array of pixel colors + // w, h: Size of canvas + function drawSquareFaster(x, y, rgba, size, pixels, w, h) { + var xmin = (x - size * 0.5) | 0; + var ymin = (y - size * 0.5) | 0; + var xmax = xmin + size - 1; + var ymax = ymin + size - 1; + var c, r; + for (c = xmin; c <= xmax; c++) { + if (c < 0 || c >= w) continue; + for (r = ymin; r <= ymax && r >= 0 && r < h; r++) { + pixels[r * w + c] = rgba; + } + } + } + // TODO: consider using drawPathShapes(), which draws paths in batches // for faster Canvas rendering. Downside: changes stacking order, which // is bad if circles are graduated. _self.drawPoints = function(shapes, style) { var t = getScaledTransform(_ext), - pixRatio = gui.getPixelRatio(), + scale = GUI.getPixelRatio() * (_ext.getSymbolScale() || 1), startPath = getPathStart(_ext), styler = style.styler || null, shp, p; @@ -118,40 +275,85 @@ function DisplayCanvas() { if (!shp || style.radius > 0 === false) continue; for (var j=0, m=shp ? shp.length : 0; j 0 ? style.strokeColor + '~' + style.strokeWidth + - '~' : '') + (style.fillColor || '') + (style.opacity < 1 ? '~' + style.opacity : ''); + '~' + (style.lineDash ? style.lineDash + '~' : '') : '') + + (style.fillColor || '') + (style.opacity < 1 ? '~' + style.opacity : ''); } return _self; } +function getScaledLineScale(ext) { + return ext.getSymbolScale() || getLineScale(ext); +} + +// Vary line width according to zoom ratio. +// For performance and clarity don't start widening until zoomed quite far in. +function getLineScale(ext) { + var mapScale = ext.scale(), + s = 1; + if (mapScale < 0.5) { + s *= Math.pow(mapScale + 0.5, 0.35); + } else if (mapScale > 100) { + if (!internal.getStateVar('DEBUG')) // thin lines for debugging + s *= Math.pow(mapScale - 99, 0.10); + } + return s; +} + +function getDotScale(ext) { + return Math.pow(getLineScale(ext), 0.7); +} + +function getDotScale2(shapes, ext) { + var pixRatio = GUI.getPixelRatio(); + var scale = ext.scale(); + var side = Math.min(ext.width(), ext.height()); + var bounds = ext.getBounds(); + var topTier = 50000; + var test, n, k, j; + if (scale >= 2) { + test = function(p) { + return bounds.containsPoint(p[0], p[1]); + }; + } + n = internal.countPoints2(shapes, test, topTier + 2); // short-circuit point counting above top threshold + k = n >= topTier && 0.25 || n > 10000 && 0.45 || n > 2500 && 0.65 || n > 200 && 0.85 || 1; + j = side < 200 && 0.5 || side < 400 && 0.75 || 1; + return getDotScale(ext) * k * j * pixRatio; +} + function getScaledTransform(ext) { - return ext.getTransform(gui.getPixelRatio()); + return ext.getTransform(GUI.getPixelRatio()); } function drawCircle(x, y, radius, ctx) { @@ -162,10 +364,11 @@ function drawCircle(x, y, radius, ctx) { } function drawSquare(x, y, size, ctx) { + var offs = size / 2; if (size > 0) { - var offs = size / 2; x = Math.round(x - offs); y = Math.round(y - offs); + size = Math.ceil(size); ctx.fillRect(x, y, size, size); } } @@ -173,7 +376,7 @@ function drawSquare(x, y, size, ctx) { function drawPath(vec, t, ctx, minLen) { var x, y, xp, yp; if (!vec.hasNext()) return; - minLen = minLen >= 0 ? minLen : 0.4; + minLen = utils.isNonNegNumber(minLen) ? minLen : 0.4; x = xp = vec.x * t.mx + t.bx; y = yp = vec.y * t.my + t.by; ctx.moveTo(x, y); @@ -195,33 +398,26 @@ function getShapePencil(arcs, ext) { for (var i=0, n=shp ? shp.length : 0; i 60) { - s *= Math.pow(mapScale - 59, 0.18); - s = Math.min(s, 5); // limit max scale +function protectIterForDrawing(iter, ext) { + var bounds; + if (ext.scale() > 100) { + // clip to rectangle when zoomed far in (canvas stops drawing shapes when + // the coordinates become too large) + bounds = ext.getBounds().clone(); + bounds.scale(1.1); // add a margin, to hide strokes along the edges + iter = new internal.PointIter(internal.clipIterByBounds(iter, bounds)); } - return s; + return iter; } -function getDotScale(ext) { - return Math.pow(getLineScale(ext), 0.6); -} - -function getPathStart(ext) { - var pixRatio = gui.getPixelRatio(), - lineScale = getLineScale(ext); - +function getPathStart(ext, lineScale) { + var pixRatio = GUI.getPixelRatio(); + if (!lineScale) lineScale = 1; return function(ctx, style) { var strokeWidth; ctx.beginPath(); @@ -238,6 +434,10 @@ function getPathStart(ext) { ctx.lineJoin = 'round'; ctx.lineWidth = strokeWidth * lineScale; ctx.strokeStyle = style.strokeColor; + if (style.lineDash){ + ctx.lineCap = 'butt'; + ctx.setLineDash(style.lineDash.split(' ')); + } } if (style.fillColor) { ctx.fillStyle = style.fillColor; @@ -247,7 +447,13 @@ function getPathStart(ext) { function endPath(ctx, style) { if (style.fillColor) ctx.fill(); - if (style.strokeWidth > 0) ctx.stroke(); + if (style.strokeWidth > 0) { + ctx.stroke(); + if (style.lineDash) { + ctx.lineCap = 'round'; + ctx.setLineDash([]); + } + } if (style.opacity >= 0) ctx.globalAlpha = 1; ctx.closePath(); } diff --git a/src/gui/mapshaper-catalog-control.js b/src/gui/mapshaper-catalog-control.js new file mode 100644 index 000000000..079bd8988 --- /dev/null +++ b/src/gui/mapshaper-catalog-control.js @@ -0,0 +1,102 @@ + +function CatalogControl(gui, catalog, onSelect) { + var self = this, + container = gui.container.findChild('.file-catalog'), + cols = catalog.cols, + enabled = true, + items = catalog.items, + n = items.length, + row = 0, + html; + + this.reset = function() { + enabled = true; + container.removeClass('downloading'); + this.progress(-1); + }; + + this.progress = function() {}; // set by click handler + + if (n > 0 === false) { + console.error("Catalog is missing array of items"); + return; + } + + gui.container.addClass('catalog-mode'); + + if (!cols) { + cols = Math.ceil(Math.sqrt(n)); + } + rows = Math.ceil(n / cols); + + html = ''; + if (catalog.title) { + html += utils.format('', cols, catalog.title); + } + while (row < rows) { + html += renderRow(items.slice(row * cols, row * cols + cols)); + row++; + } + html += '

%s

'; + container.node().innerHTML = html; + gui.container.findChildren('.file-catalog td').forEach(function(el, i) { + el.on('click', function() { + selectItem(el, i); + }); + }); + + // Generate onprogress callback to show a progress indicator + function getProgressFunction(el) { + var visible = false, + i = 0; + return function(pct) { + i++; + if (i == 2 && pct < 0.5) { + // only show progress bar if file will take a while to load + visible = true; + } + if (pct == -1) { + // kludge to reset progress bar + el.removeClass('downloading'); + pct = 0; + } + if (visible) { + el.css('background-size', (Math.round(pct * 100) + '% 100%')); + } + }; + } + + function renderRow(items) { + var tds = items.map(function(o, col) { + var i = row * cols + col; + return renderCell(o, i); + }); + return '' + tds.join('') + ''; + } + + function selectItem(el,i) { + var pageUrl = window.location.href.toString().replace(/[?#].*/, '').replace(/\/$/, '') + '/'; + var item = items[i]; + var urls = item.files.map(function(file) { + var url = (item.url || '') + file; + if (/^http/.test(url) === false) { + // assume relative url + url = pageUrl + '/' + url; + } + return url; + }); + if (enabled) { // only respond to first click + self.progress = getProgressFunction(el); + el.addClass('downloading'); + container.addClass('downloading'); + enabled = false; + onSelect(urls); + } + } + + function renderCell(item, i) { + var template = '

%s

%s
'; + return utils.format(template, i, item.title, item.subtitle || ''); + } + +} diff --git a/src/gui/mapshaper-command-history.js b/src/gui/mapshaper-command-history.js deleted file mode 100644 index 3e2fa4cd0..000000000 --- a/src/gui/mapshaper-command-history.js +++ /dev/null @@ -1,12 +0,0 @@ -/* @requires mapshaper-gui-lib */ - -function CommandHistory() { - var commands = ""; - this.addCommandString = function(str) { - commands += ' ' + str; - }; - - this.export = function() { - return commands.trim(); - }; -} diff --git a/src/gui/mapshaper-console.js b/src/gui/mapshaper-console.js index f1431f9ec..de26b6467 100644 --- a/src/gui/mapshaper-console.js +++ b/src/gui/mapshaper-console.js @@ -1,12 +1,14 @@ -/* @requires mapshaper-gui-lib mapshaper-mode-button */ +/* @requires mapshaper-gui-lib */ -function Console(model) { +function Console(gui) { + var model = gui.model; var CURSOR = '$ '; var PROMPT = 'Enter mapshaper commands or type "tips" for examples and console help'; - var el = El('#console').hide(); - var content = El('#console-buffer'); - var log = El('div').id('console-log').appendTo(content); - var line = El('div').id('command-line').appendTo(content).text(CURSOR); + var el = gui.container.findChild('.console').hide(); + var content = el.findChild('.console-buffer'); + var log = El('div').appendTo(content); + var line = El('div').addClass('command-line').appendTo(content); + var cursor = El('span').appendTo(line).text(CURSOR); var input = El('span').appendTo(line) .addClass('input-field') .attr('spellcheck', false) @@ -17,26 +19,43 @@ function Console(model) { var history = []; var historyId = 0; var _isOpen = false; - var _error = internal.error; // save default error functions... - var _stop = internal.stop; + var btn = gui.container.findChild('.console-btn').on('click', toggle); - // capture all messages to this console, whether open or closed - message = internal.message = consoleMessage; + consoleMessage(PROMPT); + gui.keyboard.on('keydown', onKeyDown); + window.addEventListener('beforeunload', turnOff); // save history if console is open on refresh - message(PROMPT); - document.addEventListener('keydown', onKeyDown); - new ModeButton('#console-btn', 'console'); - gui.addMode('console', turnOn, turnOff); - - gui.onClick(content, function(e) { - var targ = El(e.target); - if (gui.getInputElement() || targ.hasClass('console-message')) { - // don't focus if user is typing or user clicks content area - } else { - input.node().focus(); + GUI.onClick(content, function(e) { + if (GUI.getInputElement() || El(e.target).hasClass('command-line')) { + // prevent click-to-focus when typing or clicking on content + e.stopPropagation(); } }); + GUI.onClick(el, function(e) { + input.node().focus(); // focus if user clicks blank part of console + }); + + function toggle() { + if (_isOpen) turnOff(); + else turnOn(); + } + + function getHistory() { + var hist; + try { + hist = JSON.parse(localStorage.getItem('console_history')); + } catch(e) {} + return hist && hist.length > 0 ? hist : []; + } + + function saveHistory(history) { + try { + history = history.filter(Boolean); // TODO: fix condition that leaves a blank line on the history + localStorage.setItem('console_history', JSON.stringify(history.slice(-50))); + } catch(e) {} + } + function toLog(str, cname) { var msg = El('div').text(str).appendTo(log); if (cname) { @@ -47,21 +66,35 @@ function Console(model) { function turnOn() { if (!_isOpen && !model.isEmpty()) { + btn.addClass('active'); _isOpen = true; + // use console for messages while open + // TODO: find a solution for logging problem when switching between multiple + // gui instances with the console open. E.g. console could close + // when an instance loses focus. stop = internal.stop = consoleStop; error = internal.error = consoleError; + message = internal.message = consoleMessage; + gui.container.addClass('console-open'); + gui.dispatchEvent('resize'); el.show(); input.node().focus(); + history = getHistory(); } } function turnOff() { if (_isOpen) { + btn.removeClass('active'); _isOpen = false; - stop = internal.stop = _stop; // restore original error functions - error = internal.error = _error; + if (GUI.isActiveInstance(gui)) { + MessageProxy(gui); // reset stop, message and error functions + } el.hide(); input.node().blur(); + saveHistory(history); + gui.container.removeClass('console-open'); + gui.dispatchEvent('resize'); } } @@ -99,10 +132,15 @@ function Console(model) { return e.metaKey || e.ctrlKey || e.altKey; } - function onKeyDown(e) { - var kc = e.keyCode, - inputEl = gui.getInputElement(), - typing = !!inputEl, + function isTextInput(el) { + return el && el.type != 'radio' && el.type != 'checkbox'; + } + + function onKeyDown(evt) { + var e = evt.originalEvent, + kc = e.keyCode, + inputEl = GUI.getInputElement(), + typing = isTextInput(inputEl), typingInConsole = inputEl && inputEl == input.node(), inputText = readCommandLine(), capture = false; @@ -112,7 +150,11 @@ function Console(model) { if (typing) { inputEl.blur(); } - gui.clearMode(); // esc escapes other modes as well + if (gui.getMode()) { + gui.clearMode(); // esc closes any open panels + } else { + turnOff(); + } capture = true; // l/r arrow keys while not typing in a text field @@ -127,11 +169,14 @@ function Console(model) { } else if (kc == 8 && !typing) { capture = true; // prevent delete from leaving page - // any key while console is open - } else if (_isOpen) { + // any key while console is open and not typing in a non-console field + // TODO: prevent console from blocking for menus + } else if (_isOpen && (typingInConsole || !typing)) { capture = true; + gui.clearMode(); // close any panels that might be open + if (kc == 13) { // enter - submit(); + onEnter(); } else if (kc == 9) { // tab tabComplete(); } else if (kc == 38) { @@ -140,22 +185,33 @@ function Console(model) { forward(); } else if (kc == 32 && (!typing || (inputText === '' && typingInConsole))) { // space bar closes if nothing has been typed - gui.clearMode(); + turnOff(); } else if (!typing && e.target != input.node() && !metaKey(e)) { // typing returns focus, unless a meta key is down (to allow Cmd-C copy) // or user is typing in a different input area somewhere input.node().focus(); capture = false; + } else if (/\n\n$/.test(inputText) && e.key && e.key.length == 1) { + // Convert double newline to single on first typing after \ continuation + // (for compatibility with Firefox; see onEnter() function) + // Assumes that cursor is at end of text (TODO: remove this assumption) + toCommandLine(inputText.substr(0, inputText.length - 1) + e.key); } else { - // normal typing - capture = false; + capture = false; // normal typing } - // space bar while not inputting text - } else if (!typing && kc == 32) { - // space bar opens console, unless typing in an input field or editable el - capture = true; - gui.enterMode('console'); + // various shortcuts (while not typing in an input field or editable el) + } else if (!typing) { + if (kc == 32) { // space bar opens console + capture = true; + turnOn(); + } else if (kc == 73) { // letter i opens inspector + gui.dispatchEvent('interaction_toggle'); + } else if (kc == 72) { // letter h resets map extent + gui.dispatchEvent('map_reset'); + } else if (kc == 13) { + gui.dispatchEvent('enter_key', evt); // signal for default buttons on any open menus + } } if (capture) { @@ -188,11 +244,12 @@ function Console(model) { } function readCommandLine() { - return input.node().textContent.trim(); + // return input.node().textContent.trim(); + return input.node().textContent; } function toCommandLine(str) { - input.node().textContent = str.trim(); + input.node().textContent = str; placeCursor(); } @@ -248,10 +305,27 @@ function Console(model) { }, {}); } - function submit() { - var cmd = readCommandLine(); + function onEnter() { + var str = readCommandLine(); + var wrap = /\\\n?$/.test(str); // \n? is to workaround odd Chrome behavior (newline appears after eol backslash) + if (wrap) { + toCommandLine(str.trim() + '\n\n'); // two newlines needed in all tested browsers + } else { + submit(str); + } + } + + // display char codes in string (for debugging console input) + function strCodes(str) { + return str.split('').map(function(c) {return c.charCodeAt(0);}).join(','); + } + + function submit(str) { + // remove newlines + // TODO: remove other whitespace at beginning + end of lines + var cmd = str.replace(/\\?\n/g, '').trim(); + toLog(CURSOR + str); toCommandLine(''); - toLog(CURSOR + cmd); if (cmd) { if (cmd == 'clear') { clear(); @@ -261,40 +335,53 @@ function Console(model) { message("Available layers:", internal.getFormattedLayerList(model)); } else if (cmd == 'close' || cmd == 'exit' || cmd == 'quit') { - gui.clearMode(); - } else if (cmd) { - runMapshaperCommands(cmd); + turnOff(); + } else if (/^projd/.test(cmd)) { + // set the display CRS (for testing) + setDisplayProjection(gui, cmd); + } else { + line.hide(); // hide cursor while command is being run + runMapshaperCommands(cmd, function() { + line.show(); + input.node().focus(); + }); } - toHistory(cmd); + toHistory(str); } } - function runMapshaperCommands(str) { + + function runMapshaperCommands(str, done) { var commands; try { commands = internal.parseConsoleCommands(str); commands = internal.runAndRemoveInfoCommands(commands); } catch (e) { - return onError(e); + onError(e); + commands = []; } if (commands.length > 0) { - applyParsedCommands(commands); + applyParsedCommands(commands, done); + } else { + done(); } } - function applyParsedCommands(commands) { + function applyParsedCommands(commands, done) { var active = model.getActiveLayer(), - prevArcCount = active.dataset.arcs ? active.dataset.arcs.size() : 0; + prevArcs = active.dataset.arcs, + prevArcCount = prevArcs ? prevArcs.size() : 0; internal.runParsedCommands(commands, model, function(err) { var flags = getCommandFlags(commands), active2 = model.getActiveLayer(), - sameArcs = active.dataset.arcs == active2.dataset.arcs && prevArcCount > 0 && - active2.dataset.arcs.size() == prevArcCount; + postArcs = active2.dataset.arcs, + postArcCount = postArcs ? postArcs.size() : 0, + sameArcs = prevArcs == postArcs && postArcCount == prevArcCount; - // restore default logging options, in case -quiet or -verbose command was run - internal.QUIET = false; - internal.VERBOSE = false; + // restore default logging options, in case they were changed by the command + internal.setStateVar('QUIET', false); + internal.setStateVar('VERBOSE', false); // kludge to signal map that filtered arcs need refreshing // TODO: find a better solution, outside the console @@ -306,42 +393,43 @@ function Console(model) { // commands may have partially succeeded and changes may have occured to // the data. if (err) onError(err); + done(); }); } function onError(err) { if (utils.isString(err)) { - stop(err); - } else if (err.name == 'APIError') { + consoleStop(err); + } else if (err.name == 'UserError') { // stop() has already been called, don't need to log } else if (err.name) { // log stack trace to browser console console.error(err.stack); // log to console window - warning(err.message); + consoleWarning(err.message); } } function consoleStop() { - var msg = gui.formatMessageArgs(arguments); - warning(msg); - throw new APIError(msg); + var msg = GUI.formatMessageArgs(arguments); + consoleWarning(msg); + throw new UserError(msg); } - function warning() { - var msg = gui.formatMessageArgs(arguments); + function consoleWarning() { + var msg = GUI.formatMessageArgs(arguments); toLog(msg, 'console-error'); } function consoleMessage() { - var msg = gui.formatMessageArgs(arguments); - if (internal.LOGGING && !internal.QUIET) { + var msg = GUI.formatMessageArgs(arguments); + if (internal.LOGGING && !internal.getStateVar('QUIET')) { toLog(msg, 'console-message'); } } function consoleError() { - var msg = gui.formatMessageArgs(arguments); + var msg = GUI.formatMessageArgs(arguments); throw new Error(msg); } @@ -353,7 +441,7 @@ function Console(model) { function printExamples() { printExample("See a list of all console commands", "$ help"); printExample("Get help using a single command", "$ help innerlines"); - printExample("Get information about the active data layer", "$ info"); + printExample("Get information about imported datasets", "$ info"); printExample("Delete one state from a national dataset","$ filter 'STATE != \"Alaska\"'"); printExample("Aggregate counties to states by dissolving shared edges" ,"$ dissolve 'STATE'"); printExample("Clear the console", "$ clear"); diff --git a/src/gui/mapshaper-coordinates-display.js b/src/gui/mapshaper-coordinates-display.js new file mode 100644 index 000000000..793c91134 --- /dev/null +++ b/src/gui/mapshaper-coordinates-display.js @@ -0,0 +1,83 @@ +function CoordinatesDisplay(gui, ext, mouse) { + var readout = gui.container.findChild('.coordinate-info').hide(); + var enabled = false; + var bboxPoint; + + gui.model.on('select', function(e) { + enabled = !!e.layer.geometry_type; // no display on tabular layers + readout.hide(); + }); + + readout.on('copy', function(e) { + // remove selection on copy (using timeout or else copy is cancelled) + setTimeout(function() { + getSelection().removeAllRanges(); + }, 50); + // don't display bounding box if user copies coords + bboxPoint = null; + }); + + // clear coords when map pans + ext.on('change', function() { + clearCoords(); + // shapes may change along with map scale + // target = lyr ? lyr.getDisplayLayer() : null; + }); + + mouse.on('leave', clearCoords); + + mouse.on('click', function(e) { + if (!enabled) return; + GUI.selectElement(readout.node()); + // TODO: don't save bbox point when inspector is active + // clear bbox point if already present + bboxPoint = bboxPoint ? null : ext.translatePixelCoords(e.x, e.y); + }); + + mouse.on('hover', onMouseChange); + mouse.on('drag', onMouseChange, null, 10); // high priority so editor doesn't block propagation + + function onMouseChange(e) { + if (!enabled) return; + if (isOverMap(e)) { + displayCoords(ext.translatePixelCoords(e.x, e.y)); + } else { + clearCoords(); + } + } + + function displayCoords(p) { + var decimals = getCoordPrecision(ext.getBounds()); + var coords = bboxPoint ? getBbox(p, bboxPoint) : p; + var str = coords.map(function(n) {return n.toFixed(decimals);}).join(','); + readout.text(str).show(); + } + + function clearCoords() { + bboxPoint = null; + readout.hide(); + } + + function isOverMap(e) { + return e.x >= 0 && e.y >= 0 && e.x < ext.width() && e.y < ext.height(); + } + + function getBbox(a, b) { + return [ + Math.min(a[0], b[0]), + Math.min(a[1], b[1]), + Math.max(a[0], b[0]), + Math.max(a[1], b[1]) + ]; + } + + function getCoordPrecision(bounds) { + var range = Math.min(bounds.width(), bounds.height()) + 1e-8; + var digits = 0; + while (range < 2000) { + range *= 10; + digits++; + } + return digits; + } +} diff --git a/src/gui/mapshaper-dom-cache.js b/src/gui/mapshaper-dom-cache.js new file mode 100644 index 000000000..239be4fba --- /dev/null +++ b/src/gui/mapshaper-dom-cache.js @@ -0,0 +1,22 @@ +function DomCache() { + var cache = {}; + var used = {}; + + this.contains = function(html) { + return html in cache; + }; + + this.use = function(html) { + var el = used[html] = cache[html]; + return el; + }; + + this.cleanup = function() { + cache = used; + used = {}; + }; + + this.add = function(html, el) { + used[html] = el; + }; +} diff --git a/src/gui/mapshaper-dynamic-crs.js b/src/gui/mapshaper-dynamic-crs.js new file mode 100644 index 000000000..a79cd9594 --- /dev/null +++ b/src/gui/mapshaper-dynamic-crs.js @@ -0,0 +1,80 @@ +// Assumes projections are available + +function needReprojectionForDisplay(sourceCRS, displayCRS) { + if (!sourceCRS || !displayCRS) { + return false; + } + if (internal.crsAreEqual(sourceCRS, displayCRS)) { + return false; + } + return true; +} + +function projectArcsForDisplay(arcs, src, dest) { + var copy = arcs.getCopy(); // need to flatten first? + var proj = internal.getProjTransform(src, dest); + internal.projectArcs(copy, proj); // need to densify arcs? + return copy; +} + +function projectPointsForDisplay(lyr, src, dest) { + var copy = utils.extend({}, lyr); + var proj = internal.getProjTransform(src, dest); + copy.shapes = internal.cloneShapes(lyr.shapes); + internal.projectPointLayers(copy, proj); + return copy; +} + +// displayCRS: CRS to use for display, or null (which clears any current display CRS) +function projectDisplayLayer(lyr, displayCRS) { + var sourceCRS = internal.getDatasetCRS(lyr.source.dataset); + var lyr2; + if (!lyr.geographic || !sourceCRS) { + return lyr; + } + if (lyr.dynamic_crs && internal.crsAreEqual(sourceCRS, lyr.dynamic_crs)) { + return lyr; + } + lyr2 = getMapLayer(lyr.source.layer, lyr.source.dataset, {crs: displayCRS}); + // kludge: copy projection-related properties to original layer + lyr.dynamic_crs = lyr2.dynamic_crs; + lyr.layer = lyr2.layer; + if (lyr.style && lyr.style.ids) { + // re-apply layer filter + lyr.layer = filterLayerByIds(lyr.layer, lyr.style.ids); + } + lyr.bounds = lyr2.bounds; + lyr.arcs = lyr2.arcs; + return lyr; +} + +// Update map extent and trigger redraw, after a new display CRS has been applied +function projectMapExtent(ext, src, dest, newBounds) { + var oldBounds = ext.getBounds(); + var oldScale = ext.scale(); + var newCP, proj; + + // if source or destination CRS is unknown, show full extent + // if map is at full extent, show full extent + // TODO: handle case that scale is 1 and map is panned away from center + if (ext.scale() == 1 || !dest) { + ext.setBounds(newBounds); + ext.home(); // sets full extent and triggers redraw + } else { + // if map is zoomed, stay centered on the same geographic location, at the same relative scale + proj = internal.getProjTransform(src, dest); + newCP = proj(oldBounds.centerX(), oldBounds.centerY()); + ext.setBounds(newBounds); + ext.recenter(newCP[0], newCP[1], oldScale); + } +} + +// Called from console; for testing dynamic crs +function setDisplayProjection(gui, cmd) { + var arg = cmd.replace(/^projd[ ]*/, ''); + if (arg) { + gui.map.setDisplayCRS(internal.getCRS(arg)); + } else { + gui.map.setDisplayCRS(null); + } +} diff --git a/src/gui/mapshaper-elements.js b/src/gui/mapshaper-elements.js index 296c10033..652cdb373 100644 --- a/src/gui/mapshaper-elements.js +++ b/src/gui/mapshaper-elements.js @@ -28,7 +28,7 @@ function ClickText2(ref) { } }).on('click', function(e) { if (!selected && getSelection().isCollapsed) { - gui.selectElement(el.node()); + GUI.selectElement(el.node()); } selected = true; e.stopPropagation(); @@ -153,6 +153,11 @@ function SimpleButton(ref) { } return this; }; + + function isVisible() { + var el = _el.node(); + return el.offsetParent !== null; + } } utils.inherit(SimpleButton, EventDispatcher); diff --git a/src/gui/mapshaper-export-control.js b/src/gui/mapshaper-export-control.js index 1de80a23e..dc5bf70a0 100644 --- a/src/gui/mapshaper-export-control.js +++ b/src/gui/mapshaper-export-control.js @@ -1,14 +1,16 @@ -/* @requires mapshaper-gui-lib mapshaper-mode-button mapshaper-gui-options mapshaper-gui-export */ +/* @requires mapshaper-gui-lib mapshaper-gui-save */ // Export buttons and their behavior -var ExportControl = function(model) { +var ExportControl = function(gui) { + var model = gui.model; var unsupportedMsg = "Exporting is not supported in this browser"; - var menu = El('#export-options').on('click', gui.handleDirectEvent(gui.clearMode)); + var menu = gui.container.findChild('.export-options').on('click', GUI.handleDirectEvent(gui.clearMode)); var checkboxes = []; // array of layer checkboxes - new SimpleButton('#export-options .cancel-btn').on('click', gui.clearMode); + var exportBtn = gui.container.findChild('.export-btn'); + new SimpleButton(menu.findChild('.cancel-btn')).on('click', gui.clearMode); - if (!gui.exportIsSupported()) { - El('#export-btn').on('click', function() { + if (!GUI.exportIsSupported()) { + exportBtn.on('click', function() { gui.alert(unsupportedMsg); }); @@ -16,9 +18,9 @@ var ExportControl = function(model) { error(unsupportedMsg); }; } else { - new SimpleButton('#save-btn').on('click', onExportClick); - gui.addMode('export', turnOn, turnOff); - new ModeButton('#export-btn', 'export'); + new SimpleButton(menu.findChild('.save-btn').addClass('default-btn')).on('click', onExportClick); + gui.addMode('export', turnOn, turnOff, exportBtn); + gui.keyboard.onMenuSubmit(menu, onExportClick); } function onExportClick() { @@ -44,7 +46,7 @@ var ExportControl = function(model) { function exportMenuSelection(done) { var opts, files; try { - opts = gui.parseFreeformOptions(El('#export-options .advanced-options').node().value, 'o'); + opts = GUI.parseFreeformOptions(menu.findChild('.advanced-options').node().value, 'o'); if (!opts.format) opts.format = getSelectedFormat(); // ignoring command line "target" option files = internal.exportTargetLayers(getTargetLayers(), opts); @@ -55,17 +57,17 @@ var ExportControl = function(model) { } function initLayerMenu() { - // init layer menu with current editing layer selected - var list = El('#export-layer-list').empty(); - var template = ''; - var checkboxes = []; - model.forEachLayer(function(lyr, dataset) { - var html = utils.format(template, lyr.name || '[unnamed layer]'); - var box = El('div').html(html).appendTo(list).findChild('input').node(); - checkboxes.push(box); + var list = menu.findChild('.export-layer-list').empty(); + var template = ''; + var objects = model.getLayers().map(function(o, i) { + var html = utils.format(template, i + 1, o.layer.name || '[unnamed layer]'); + return {layer: o.layer, html: html}; }); - El('#export-layers').css('display', checkboxes.length < 2 ? 'none' : 'block'); - return checkboxes; + internal.sortLayersForMenuDisplay(objects); + checkboxes = objects.map(function(o) { + return El('div').html(o.html).appendTo(list).findChild('input').node(); + }); + menu.findChild('.export-layers').css('display', checkboxes.length < 2 ? 'none' : 'block'); } function getInputFormats() { @@ -82,18 +84,18 @@ var ExportControl = function(model) { } function initFormatMenu() { - var defaults = ['shapefile', 'geojson', 'topojson', 'dsv', 'svg']; + var defaults = ['shapefile', 'geojson', 'topojson', 'json', 'dsv', 'svg']; var formats = utils.uniq(defaults.concat(getInputFormats())); var items = formats.map(function(fmt) { return utils.format('
', fmt, internal.getFormatName(fmt)); }); - El('#export-formats').html(items.join('\n')); - El('#export-formats input[value="' + getDefaultExportFormat() + '"]').node().checked = true; + menu.findChild('.export-formats').html(items.join('\n')); + menu.findChild('.export-formats input[value="' + getDefaultExportFormat() + '"]').node().checked = true; } function turnOn() { - checkboxes = initLayerMenu(); + initLayerMenu(); initFormatMenu(); menu.show(); } @@ -103,12 +105,12 @@ var ExportControl = function(model) { } function getSelectedFormat() { - return El('#export-formats input:checked').node().value; + return menu.findChild('.export-formats input:checked').node().value; } function getTargetLayers() { var ids = checkboxes.reduce(function(memo, box, i) { - if (box.checked) memo.push(String(i + 1)); // numerical layer id + if (box.checked) memo.push(box.value); return memo; }, []).join(','); return ids ? model.findCommandTargets(ids) : []; diff --git a/src/gui/mapshaper-gui-error.js b/src/gui/mapshaper-gui-error.js index 1beb613dc..24976f996 100644 --- a/src/gui/mapshaper-gui-error.js +++ b/src/gui/mapshaper-gui-error.js @@ -1,38 +1,26 @@ /* @require mapshaper-gui-lib */ -// Replace error function in mapshaper lib -var error = internal.error = function() { - stop.apply(null, utils.toArray(arguments)); -}; - -// replace stop function -var stop = internal.stop = function() { - // Show a popup error message, then throw an error - var msg = gui.formatMessageArgs(arguments); - gui.alert(msg); - throw new Error(msg); -}; - - -function AlertControl() { +function AlertControl(gui) { var el; gui.addMode('alert', function() {}, turnOff); + gui.alert = function(str) { + var infoBox; + if (!el) { + el = El('div').appendTo('body').addClass('error-wrapper'); + infoBox = El('div').appendTo(el).addClass('error-box info-box selectable'); + El('p').addClass('error-message').appendTo(infoBox); + El('div').addClass("btn dialog-btn").appendTo(infoBox).html('close').on('click', gui.clearMode); + } + el.findChild('.error-message').html(str); + gui.enterMode('alert'); + }; + function turnOff() { if (el) { el.remove(); el = null; } } - - gui.alert = function(str) { - var infoBox; - if (el) return; - el = El('div').appendTo('body').addClass('error-wrapper'); - infoBox = El('div').appendTo(el).addClass('error-box info-box selectable'); - El('p').addClass('error-message').appendTo(infoBox).html(str); - El('div').addClass("btn dialog-btn").appendTo(infoBox).html('close').on('click', gui.clearMode); - gui.enterMode('alert'); - }; } diff --git a/src/gui/mapshaper-gui-instance.js b/src/gui/mapshaper-gui-instance.js new file mode 100644 index 000000000..5c3082114 --- /dev/null +++ b/src/gui/mapshaper-gui-instance.js @@ -0,0 +1,84 @@ +/* @requires +mapshaper-gui-modes +mapshaper-gui-proxy +mapshaper-keyboard +mapshaper-gui-model +mapshaper-map +mapshaper-interaction-mode-control +mapshaper-sidebar-buttons +*/ + +GUI.isActiveInstance = function(gui) { + return gui == GUI.__active; +}; + +function GuiInstance(container, opts) { + var gui = new ModeSwitcher(); + opts = utils.extend({ + // defaults + homeControl: true, + zoomControl: true, + inspectorControl: true, + disableNavigation: false, + showMouseCoordinates: true, + focus: true + }, opts); + + gui.options = opts; + gui.container = El(container); + gui.model = new Model(); + gui.keyboard = new KeyboardEvents(gui); + gui.buttons = new SidebarButtons(gui); + gui.map = new MshpMap(gui); + gui.interaction = new InteractionMode(gui); + + gui.showProgressMessage = function(msg) { + if (!gui.progressMessage) { + gui.progressMessage = El('div').addClass('progress-message') + .appendTo('body'); + } + El('
').text(msg).appendTo(gui.progressMessage.empty().show()); + }; + + gui.clearProgressMessage = function() { + if (gui.progressMessage) gui.progressMessage.hide(); + }; + + gui.consoleIsOpen = function() { + return gui.container.hasClass('console-open'); + }; + + // Make this instance interactive and editable + gui.focus = function() { + var curr = GUI.__active; + if (curr == gui) return; + if (curr) { + curr.blur(); + } + GUI.__active = gui; + MessageProxy(gui); + ImportFileProxy(gui); + WriteFilesProxy(gui); + gui.dispatchEvent('active'); + }; + + gui.blur = function() { + if (GUI.isActiveInstance(gui)) { + GUI.__active = null; + gui.dispatchEvent('inactive'); + } + }; + + // switch between multiple gui instances on mouse click + gui.container.node().addEventListener('mouseup', function(e) { + if (GUI.isActiveInstance(gui)) return; + e.stopPropagation(); + gui.focus(); + }, true); // use capture + + if (opts.focus) { + gui.focus(); + } + + return gui; +} diff --git a/src/gui/mapshaper-gui-lib.js b/src/gui/mapshaper-gui-lib.js index 89672a317..132e7c45a 100644 --- a/src/gui/mapshaper-gui-lib.js +++ b/src/gui/mapshaper-gui-lib.js @@ -1,18 +1,25 @@ /* @requires mapshaper-gui-start mbloch-gui-lib -mapshaper-gui-modes */ -var gui = api.gui = new ModeSwitcher(); -api.enableLogging(); - -gui.browserIsSupported = function() { +GUI.browserIsSupported = function() { return typeof ArrayBuffer != 'undefined' && typeof Blob != 'undefined' && typeof File != 'undefined'; }; -gui.getUrlVars = function() { +GUI.exportIsSupported = function() { + return typeof URL != 'undefined' && URL.createObjectURL && + typeof document.createElement("a").download != "undefined" || + !!window.navigator.msSaveBlob; +}; + +// TODO: make this relative to a single GUI instance +GUI.canSaveToServer = function() { + return !!(mapshaper.manifest && mapshaper.manifest.allow_saving) && typeof fetch == 'function'; +}; + +GUI.getUrlVars = function() { var q = window.location.search.substring(1); return q.split('&').reduce(function(memo, chunk) { var pair = chunk.split('='); @@ -23,29 +30,29 @@ gui.getUrlVars = function() { }; // Assumes that URL path ends with a filename -gui.getUrlFilename = function(url) { +GUI.getUrlFilename = function(url) { var path = /\/\/([^#?]+)/.exec(url); var file = path ? path[1].split('/').pop() : ''; return file; }; -gui.formatMessageArgs = function(args) { - // remove cli annotation (if present) - return internal.formatLogArgs(args).replace(/^\[[^\]]+\] ?/, ''); +GUI.formatMessageArgs = function(args) { + // .replace(/^\[[^\]]+\] ?/, ''); // remove cli annotation (if present) + return internal.formatLogArgs(args); }; -gui.handleDirectEvent = function(cb) { +GUI.handleDirectEvent = function(cb) { return function(e) { if (e.target == this) cb(); }; }; -gui.getInputElement = function() { +GUI.getInputElement = function() { var el = document.activeElement; return (el && (el.tagName == 'INPUT' || el.contentEditable == 'true')) ? el : null; }; -gui.selectElement = function(el) { +GUI.selectElement = function(el) { var range = document.createRange(), sel = getSelection(); range.selectNodeContents(el); @@ -53,13 +60,13 @@ gui.selectElement = function(el) { sel.addRange(range); }; -gui.blurActiveElement = function() { - var el = gui.getInputElement(); +GUI.blurActiveElement = function() { + var el = GUI.getInputElement(); if (el) el.blur(); }; // Filter out delayed click events, e.g. so users can highlight and copy text -gui.onClick = function(el, cb) { +GUI.onClick = function(el, cb) { var time; el.on('mousedown', function() { time = +new Date(); @@ -68,3 +75,26 @@ gui.onClick = function(el, cb) { if (+new Date() - time < 300) cb(e); }); }; + +// tests if filename is a type that can be used +GUI.isReadableFileType = function(filename) { + var ext = utils.getFileExtension(filename).toLowerCase(); + return !!internal.guessInputFileType(filename) || internal.couldBeDsvFile(filename) || + internal.isZipFile(filename); +}; + +GUI.parseFreeformOptions = function(raw, cmd) { + var str = raw.trim(), + parsed; + if (!str) { + return {}; + } + if (!/^-/.test(str)) { + str = '-' + cmd + ' ' + str; + } + parsed = internal.parseCommands(str); + if (!parsed.length || parsed[0].name != cmd) { + stop("Unable to parse command line options"); + } + return parsed[0].options; +}; diff --git a/src/gui/mapshaper-gui-model.js b/src/gui/mapshaper-gui-model.js index 361c46778..d828d49d0 100644 --- a/src/gui/mapshaper-gui-model.js +++ b/src/gui/mapshaper-gui-model.js @@ -2,15 +2,38 @@ function Model() { var self = new api.internal.Catalog(); + var deleteLayer = self.deleteLayer; utils.extend(self, EventDispatcher.prototype); + // override Catalog method (so -drop command will work in web console) + self.deleteLayer = function(lyr, dataset) { + var active, flags; + deleteLayer.call(self, lyr, dataset); + if (self.isEmpty()) { + // refresh browser if deleted layer was the last layer + window.location.href = window.location.href.toString(); + } else { + // trigger event to update layer list and, if needed, the map view + flags = {}; + active = self.getActiveLayer(); + if (active.layer != lyr) { + flags.select = true; + } + internal.cleanupArcs(active.dataset); + if (internal.layerHasPaths(lyr)) { + flags.arc_count = true; // looks like a kludge, try to remove + } + self.updated(flags, active.layer, active.dataset); + } + }; + self.updated = function(flags, lyr, dataset) { var targ, active; // if (lyr && dataset && (!active || active.layer != lyr)) { if (lyr && dataset) { self.setDefaultTarget([lyr], dataset); } - targ = self.getDefaultTarget(); + targ = self.getDefaultTargets()[0]; if (lyr && targ.layers[0] != lyr) { flags.select = true; } diff --git a/src/gui/mapshaper-gui-modes.js b/src/gui/mapshaper-gui-modes.js index 2d1d5875f..759223dbd 100644 --- a/src/gui/mapshaper-gui-modes.js +++ b/src/gui/mapshaper-gui-modes.js @@ -1,4 +1,4 @@ -/* @requires mapshaper-gui-lib */ +/* @requires mapshaper-gui-lib, mapshaper-mode-button */ function ModeSwitcher() { var self = this; @@ -9,7 +9,7 @@ function ModeSwitcher() { }; // return a function to trigger this mode - self.addMode = function(name, enter, exit) { + self.addMode = function(name, enter, exit, btn) { self.on('mode', function(e) { if (e.prev == name) { exit(); @@ -18,6 +18,9 @@ function ModeSwitcher() { enter(); } }); + if (btn) { + new ModeButton(self, btn, name); + } }; self.addMode(null, function() {}, function() {}); // null mode diff --git a/src/gui/mapshaper-gui-options.js b/src/gui/mapshaper-gui-options.js deleted file mode 100644 index c1e73c10f..000000000 --- a/src/gui/mapshaper-gui-options.js +++ /dev/null @@ -1,17 +0,0 @@ -/* @requires mapshaper-gui-lib */ - -gui.parseFreeformOptions = function(raw, cmd) { - var str = raw.trim(), - parsed; - if (!str) { - return {}; - } - if (!/^-/.test(str)) { - str = '-' + cmd + ' ' + str; - } - parsed = internal.parseCommands(str); - if (!parsed.length || parsed[0].name != cmd) { - stop("Unable to parse command line options"); - } - return parsed[0].options; -}; diff --git a/src/gui/mapshaper-gui-proxy.js b/src/gui/mapshaper-gui-proxy.js index 130c39ea0..8f4c4a0e8 100644 --- a/src/gui/mapshaper-gui-proxy.js +++ b/src/gui/mapshaper-gui-proxy.js @@ -3,13 +3,61 @@ // These functions could be called when validating i/o options; TODO: avoid this cli.isFile = cli.isDirectory = function(name) {return false;}; - cli.validateOutputDir = function() {}; +function MessageProxy(gui) { + // Replace error function in mapshaper lib + error = internal.error = function() { + stop.apply(null, utils.toArray(arguments)); + }; + + // replace stop function + stop = internal.stop = function() { + // Show a popup error message, then throw an error + var msg = GUI.formatMessageArgs(arguments); + gui.alert(msg); + throw new Error(msg); + }; + + message = internal.message = function() { + internal.logArgs(arguments); // reset default + }; +} + +function WriteFilesProxy(gui) { + // replaces function from mapshaper.js + internal.writeFiles = function(files, opts, done) { + var filename; + if (!utils.isArray(files) || files.length === 0) { + done("Nothing to export"); + } else if (GUI.canSaveToServer() && !opts.save_to_download_folder) { + saveFilesToServer(files, opts, function(err) { + var msg; + if (err) { + msg = "Direct save failed
Reason: " + err + "."; + msg += "
Saving to download folder instead."; + gui.alert(msg); + // fall back to standard method if saving to server fails + internal.writeFiles(files, {save_to_download_folder: true}, done); + } else { + done(); + } + }); + } else if (files.length == 1) { + saveBlobToDownloadFolder(files[0].filename, new Blob([files[0].content]), done); + } else { + filename = utils.getCommonFileBase(utils.pluck(files, 'filename')) || "output"; + saveZipFile(filename + ".zip", files, done); + } + }; +} + // Replaces functions for reading from files with functions that try to match // already-loaded datasets. // -function ImportFileProxy(model) { +function ImportFileProxy(gui) { + var model = gui.model; + // Try to match an imported dataset or layer. // TODO: think about handling import options function find(src) { @@ -36,11 +84,43 @@ function ImportFileProxy(model) { layers: dataset.layers.map(internal.copyLayer) }, dataset); }; +} - /* - api.importDataTable = function(src, opts) { - var dataset = find(src); - return dataset.layers[0].data; - }; - */ +// load Proj.4 CRS definition files dynamically +// +internal.initProjLibrary = function(opts, done) { + var mproj = require('mproj'); + var libs = internal.findProjLibs([opts.from || '', opts.match || '', opts.crs || ''].join(' ')); + // skip loaded libs + libs = libs.filter(function(name) {return !mproj.internal.mproj_search_libcache(name);}); + loadProjLibs(libs, done); +}; + +function loadProjLibs(libs, done) { + var mproj = require('mproj'); + var i = 0; + next(); + + function next() { + var libName = libs[i]; + var content, req; + if (!libName) return done(); + req = new XMLHttpRequest(); + req.addEventListener('load', function(e) { + if (req.status == 200) { + content = req.response; + } + }); + req.addEventListener('loadend', function() { + if (content) { + mproj.internal.mproj_insert_libcache(libName, content); + } + // TODO: consider stopping with an error message if no content was loaded + // (currently, a less specific error will occur when mapshaper tries to use the library) + next(); + }); + req.open('GET', 'assets/' + libName); + req.send(); + i++; + } } diff --git a/src/gui/mapshaper-gui-export.js b/src/gui/mapshaper-gui-save.js similarity index 56% rename from src/gui/mapshaper-gui-export.js rename to src/gui/mapshaper-gui-save.js index 70221dd0d..c1094dae6 100644 --- a/src/gui/mapshaper-gui-export.js +++ b/src/gui/mapshaper-gui-save.js @@ -1,24 +1,5 @@ /* @requires mapshaper-gui-lib */ -gui.exportIsSupported = function() { - return typeof URL != 'undefined' && URL.createObjectURL && - typeof document.createElement("a").download != "undefined" || - !!window.navigator.msSaveBlob; -}; - -// replaces function from mapshaper.js -internal.writeFiles = function(files, opts, done) { - var filename; - if (!utils.isArray(files) || files.length === 0) { - done("Nothing to export"); - } else if (files.length == 1) { - saveBlob(files[0].filename, new Blob([files[0].content]), done); - } else { - filename = utils.getCommonFileBase(utils.pluck(files, 'filename')) || "output"; - saveZipFile(filename + ".zip", files, done); - } -}; - function saveZipFile(zipfileName, files, done) { var toAdd = files; var zipWriter; @@ -31,10 +12,15 @@ function saveZipFile(zipfileName, files, done) { done("This browser doesn't support Zip file creation."); } - function zipError(msg) { + function zipError(err) { var str = "Error creating Zip file"; + var msg = ''; + // error events thrown by Zip library seem to be missing a message + if (err && err.message) { + msg = err.message; + } if (msg) { - str += ": " + (msg.message || msg); + str += ": " + msg; } done(str); } @@ -42,7 +28,7 @@ function saveZipFile(zipfileName, files, done) { function nextFile() { if (toAdd.length === 0) { zipWriter.close(function(blob) { - saveBlob(zipfileName, blob, done); + saveBlobToDownloadFolder(zipfileName, blob, done); }); } else { var obj = toAdd.pop(), @@ -52,7 +38,41 @@ function saveZipFile(zipfileName, files, done) { } } -function saveBlob(filename, blob, done) { +function saveFilesToServer(exports, opts, done) { + var paths = internal.getOutputPaths(utils.pluck(exports, 'filename'), opts); + var data = utils.pluck(exports, 'content'); + var i = -1; + next(); + function next(err) { + i++; + if (err) return done(err); + if (i >= exports.length) { + gui.alert('Saved
' + paths.join('
')); + return done(); + } + saveBlobToServer(paths[i], new Blob([data[i]]), next); + } +} + +function saveBlobToServer(path, blob, done) { + var q = '?file=' + encodeURIComponent(path); + var url = window.location.origin + '/save' + q; + fetch(url, { + method: 'POST', + credentials: 'include', + body: blob + }).then(function(resp) { + if (resp.status == 400) { + return resp.text(); + } + }).then(function(err) { + done(err); + }).catch(function(resp) { + done('connection to server was lost'); + }); +} + +function saveBlobToDownloadFolder(filename, blob, done) { var anchor, blobUrl; if (window.navigator.msSaveBlob) { window.navigator.msSaveBlob(blob, filename); diff --git a/src/gui/mapshaper-gui-shapes.js b/src/gui/mapshaper-gui-shapes.js index 4086d051f..5df569438 100644 --- a/src/gui/mapshaper-gui-shapes.js +++ b/src/gui/mapshaper-gui-shapes.js @@ -1,79 +1,42 @@ /* @requires mapshaper-gui-lib */ -// A wrapper for ArcCollection that filters paths to speed up rendering. -// +// Create low-detail versions of large arc collections for faster rendering +// at zoomed-out scales. function FilteredArcCollection(unfilteredArcs) { - var sortedThresholds, - filteredArcs, - filteredSegLen; + var size = unfilteredArcs.getPointCount(), + filteredArcs, filteredSegLen; - init(); - - function init() { - var size = unfilteredArcs.getPointCount(), - cutoff = 5e5, - nth; - sortedThresholds = filteredArcs = null; + // Only generate low-detail arcs for larger datasets + if (size > 5e5) { if (!!unfilteredArcs.getVertexData().zz) { - // If we have simplification data... - // Sort simplification thresholds for all non-endpoint vertices - // for quick conversion of simplification percentage to threshold value. - // For large datasets, use every nth point, for faster sorting. - nth = Math.ceil(size / cutoff); - sortedThresholds = unfilteredArcs.getRemovableThresholds(nth); - utils.quicksort(sortedThresholds, false); - // For large datasets, create a filtered copy of the data for faster rendering - if (size > cutoff) { - filteredArcs = initFilteredArcs(unfilteredArcs, sortedThresholds); - filteredSegLen = internal.getAvgSegment(filteredArcs); - } + // Use precalculated simplification data for vertex filtering, if available + filteredArcs = initFilteredArcs(unfilteredArcs); + filteredSegLen = internal.getAvgSegment(filteredArcs); } else { - if (size > cutoff) { - // generate filtered arcs when no simplification data is present - filteredSegLen = internal.getAvgSegment(unfilteredArcs) * 4; - filteredArcs = internal.simplifyArcsFast(unfilteredArcs, filteredSegLen); - } + // Use fast simplification as a fallback + filteredSegLen = internal.getAvgSegment(unfilteredArcs) * 4; + filteredArcs = internal.simplifyArcsFast(unfilteredArcs, filteredSegLen); } } - // Use simplification data to create a low-detail copy of arcs, for faster - // rendering when zoomed-out. - function initFilteredArcs(arcs, sortedThresholds) { + function initFilteredArcs(arcs) { var filterPct = 0.08; + var nth = Math.ceil(arcs.getPointCount() / 5e5); var currInterval = arcs.getRetainedInterval(); - var filterZ = sortedThresholds[Math.floor(filterPct * sortedThresholds.length)]; + var filterZ = arcs.getThresholdByPct(filterPct, nth); var filteredArcs = arcs.setRetainedInterval(filterZ).getFilteredCopy(); arcs.setRetainedInterval(currInterval); // reset current simplification return filteredArcs; } this.getArcCollection = function(ext) { - refreshFilteredArcs(); - // Use a filtered version of arcs at small scales - var unitsPerPixel = 1/ext.getTransform().mx, - useFiltering = filteredArcs && unitsPerPixel > filteredSegLen * 1.5; - return useFiltering ? filteredArcs : unfilteredArcs; - }; - - function refreshFilteredArcs() { if (filteredArcs) { - if (filteredArcs.size() != unfilteredArcs.size()) { - init(); - } + // match simplification of unfiltered arcs filteredArcs.setRetainedInterval(unfilteredArcs.getRetainedInterval()); } - } - - this.size = function() {return unfilteredArcs.size();}; - - this.setRetainedPct = function(pct) { - if (sortedThresholds) { - var z = sortedThresholds[Math.floor(pct * sortedThresholds.length)]; - z = internal.clampIntervalByPct(z, pct); - // this.setRetainedInterval(z); - unfilteredArcs.setRetainedInterval(z); - } else { - unfilteredArcs.setRetainedPct(pct); - } + // switch to filtered version of arcs at small scales + var unitsPerPixel = 1/ext.getTransform().mx, + useFiltering = filteredArcs && unitsPerPixel > filteredSegLen * 1.5; + return useFiltering ? filteredArcs : unfilteredArcs; }; } diff --git a/src/gui/mapshaper-gui-start.js b/src/gui/mapshaper-gui-start.js index d8ae78bc0..8f8840c38 100644 --- a/src/gui/mapshaper-gui-start.js +++ b/src/gui/mapshaper-gui-start.js @@ -1,9 +1,14 @@ +var GUI = {}; // shared namespace for all GUI instances var api = mapshaper; // assuming mapshaper is in global scope var utils = api.utils; var cli = api.cli; var geom = api.geom; var internal = api.internal; -var Bounds = api.internal.Bounds; -var APIError = api.internal.APIError; -var message = api.internal.message; +var Bounds = internal.Bounds; +var UserError = internal.UserError; +var message = internal.message; +var stop = internal.stop; // stop and error are replaced in mapshaper-gui-proxy.js +var error = internal.error; +api.gui = true; // let the main library know we're running in the GUI +api.enableLogging(); \ No newline at end of file diff --git a/src/gui/mapshaper-gui-table.js b/src/gui/mapshaper-gui-table.js index ae34bada8..9c6ec4e19 100644 --- a/src/gui/mapshaper-gui-table.js +++ b/src/gui/mapshaper-gui-table.js @@ -1,20 +1,17 @@ /* @requires mapshaper-gui-lib */ -gui.getDisplayLayerForTable = function(table) { +function getDisplayLayerForTable(table) { var n = table.size(), cellWidth = 12, cellHeight = 5, gutter = 6, arcs = [], shapes = [], - lyr = {shapes: shapes}, - data = {layer: lyr}, aspectRatio = 1.1, - usePoints = false, x, y, col, row, blockSize; if (n > 10000) { - usePoints = true; + arcs = null; gutter = 0; cellWidth = 4; cellHeight = 4; @@ -40,25 +37,24 @@ gui.getDisplayLayerForTable = function(table) { col = Math.floor(i / blockSize); x = col * (cellWidth + gutter); y = cellHeight * (blockSize - row); - if (usePoints) { - shapes.push([[x, y]]); - } else { + if (arcs) { arcs.push(getArc(x, y, cellWidth, cellHeight)); shapes.push([[i]]); + } else { + shapes.push([[x, y]]); } } - if (usePoints) { - lyr.geometry_type = 'point'; - } else { - data.arcs = new internal.ArcCollection(arcs); - lyr.geometry_type = 'polygon'; - } - lyr.data = table; - function getArc(x, y, w, h) { return [[x, y], [x + w, y], [x + w, y - h], [x, y - h], [x, y]]; } - return data; -}; + return { + layer: { + geometry_type: arcs ? 'polygon' : 'point', + shapes: shapes, + data: table + }, + arcs: arcs ? new internal.ArcCollection(arcs) : null + }; +} diff --git a/src/gui/mapshaper-gui.js b/src/gui/mapshaper-gui.js index 6eb55046d..9cd37427d 100644 --- a/src/gui/mapshaper-gui.js +++ b/src/gui/mapshaper-gui.js @@ -1,25 +1,21 @@ /* @requires mapshaper-gui-lib +mapshaper-gui-instance mapshaper-gui-error mapshaper-simplify-control mapshaper-import-control mapshaper-export-control mapshaper-repair-control mapshaper-layer-control -mapshaper-gui-proxy -mapshaper-map -mapshaper-maplayer mapshaper-console -mapshaper-gui-model -mapshaper-gui-modes */ Browser.onload(function() { - if (!gui.browserIsSupported()) { + if (!GUI.browserIsSupported()) { El("#mshp-not-supported").show(); return; } - gui.startEditing(); + startEditing(); if (window.location.hostname == 'localhost') { window.addEventListener('beforeunload', function() { // send termination signal for mapshaper-gui @@ -30,45 +26,52 @@ Browser.onload(function() { } }); -gui.getImportOpts = function() { - var vars = gui.getUrlVars(); - var urlFiles = vars.files ? vars.files.split(',') : []; - var manifestFiles = mapshaper.manifest || []; - return { - files: urlFiles.concat(manifestFiles) - }; -}; +function getImportOpts() { + var vars = GUI.getUrlVars(); + var manifest = mapshaper.manifest || {}; + var opts = {}; + if (Array.isArray(manifest)) { + // old-style manifest: an array of filenames + opts.files = manifest; + } else if (manifest.files) { + opts.files = manifest.files.concat(); + } else { + opts.files = []; + } + if (vars.files) { + opts.files = opts.files.concat(vars.files.split(',')); + } + if (manifest.catalog) { + opts.catalog = manifest.catalog; + } + opts.display_all = !!manifest.display_all; + return opts; +} + +var startEditing = function() { + var dataLoaded = false, + importOpts = getImportOpts(), + gui = new GuiInstance('body'); -gui.startEditing = function() { - var model = new Model(), - dataLoaded = false, - map, repair, simplify; - gui.startEditing = function() {}; - map = new MshpMap(model); - repair = new RepairControl(model, map); - simplify = new SimplifyControl(model); - new AlertControl(); - new ImportFileProxy(model); - new ImportControl(model, gui.getImportOpts()); - new ExportControl(model); - new LayerControl(model, map); + new AlertControl(gui); + new RepairControl(gui); + new SimplifyControl(gui); + new ImportControl(gui, importOpts); + new ExportControl(gui); + new LayerControl(gui); + new Console(gui); - model.on('select', function() { + startEditing = function() {}; + + gui.model.on('select', function() { if (!dataLoaded) { dataLoaded = true; El('#mode-buttons').show(); - El('#nav-buttons').show(); - new Console(model); + if (importOpts.display_all) { + gui.model.getLayers().forEach(function(o) { + gui.map.setLayerVisibility(o, true); + }); + } } }); - // TODO: untangle dependencies between SimplifyControl, RepairControl and Map - simplify.on('simplify-start', function() { - repair.hide(); - }); - simplify.on('simplify-end', function() { - repair.update(); - }); - simplify.on('change', function(e) { - map.setSimplifyPct(e.value); - }); }; diff --git a/src/gui/mapshaper-hit-control.js b/src/gui/mapshaper-hit-control.js deleted file mode 100644 index e1ab641fe..000000000 --- a/src/gui/mapshaper-hit-control.js +++ /dev/null @@ -1,187 +0,0 @@ -/* @requires mapshaper-gui-lib */ - -function HitControl(ext, mouse) { - var self = new EventDispatcher(); - var prevHits = []; - var active = false; - var tests = { - polygon: polygonTest, - polyline: polylineTest, - point: pointTest - }; - var coords = El('#coordinate-info').hide(); - var lyr, target, test; - - ext.on('change', function() { - // shapes may change along with map scale - target = lyr ? lyr.getDisplayLayer() : null; - }); - - self.setLayer = function(o) { - lyr = o; - target = o.getDisplayLayer(); - test = tests[target.layer.geometry_type]; - coords.hide(); - }; - - self.start = function() { - active = true; - }; - - self.stop = function() { - if (active) { - hover([]); - coords.text('').hide(); - active = false; - } - }; - - mouse.on('click', function(e) { - if (!active || !target) return; - trigger('click', prevHits); - gui.selectElement(coords.node()); - }); - - // DISABLING: This causes problems when hovering over the info panel - // Deselect hover shape when pointer leaves hover area - //mouse.on('leave', function(e) { - // hover(-1); - //}); - - mouse.on('hover', function(e) { - var p, decimals; - if (!active || !target) return; - p = ext.getTransform().invert().transform(e.x, e.y); - if (target.geographic) { - // update coordinate readout if displaying geographic shapes - decimals = getCoordPrecision(ext.getBounds()); - coords.text(p[0].toFixed(decimals) + ', ' + p[1].toFixed(decimals)).show(); - } - if (test && e.hover) { - hover(test(p[0], p[1])); - } - }); - - // Convert pixel distance to distance in coordinate units. - function getHitBuffer(pix) { - var dist = pix / ext.getTransform().mx, - scale = ext.scale(); - if (scale < 1) dist *= scale; // reduce hit threshold when zoomed out - return dist; - } - - function getCoordPrecision(bounds) { - var min = Math.min(Math.abs(bounds.xmax), Math.abs(bounds.ymax)), - decimals = Math.ceil(Math.log(min) / Math.LN10); - return Math.max(0, 7 - decimals); - } - - function polygonTest(x, y) { - var dist = getHitBuffer(5), - cands = findHitCandidates(x, y, dist), - hits = [], - cand, hitId; - for (var i=0; i 0 && hits.length === 0) { - // secondary detection: proximity, if not inside a polygon - hits = findNearestCandidates(x, y, dist, cands, target.dataset.arcs); - } - return hits; - } - - function polylineTest(x, y) { - var dist = getHitBuffer(15), - cands = findHitCandidates(x, y, dist); - return findNearestCandidates(x, y, dist, cands, target.dataset.arcs); - } - - function findNearestCandidates(x, y, dist, cands, arcs) { - var hits = [], - cand, candDist; - for (var i=0; i 0 ? hits[0] : -1 - }); - } - - function hover(hits) { - if (!sameIds(hits, prevHits)) { - prevHits = hits; - El('#map-layers').classed('hover', hits.length > 0); - trigger('hover', hits); - } - } - - function findHitCandidates(x, y, dist) { - var arcs = target.dataset.arcs, - index = {}, - cands = [], - bbox = []; - target.layer.shapes.forEach(function(shp, shpId) { - var cand; - for (var i = 0, n = shp && shp.length; i < n; i++) { - arcs.getSimpleShapeBounds2(shp[i], bbox); - if (x + dist < bbox[0] || x - dist > bbox[2] || - y + dist < bbox[1] || y - dist > bbox[3]) { - continue; // bbox non-intersection - } - cand = index[shpId]; - if (!cand) { - cand = index[shpId] = {shape: [], id: shpId}; - cands.push(cand); - } - cand.shape.push(shp[i]); - } - }); - return cands; - } - - return self; -} diff --git a/src/gui/mapshaper-hit-control2.js b/src/gui/mapshaper-hit-control2.js new file mode 100644 index 000000000..13fc42b76 --- /dev/null +++ b/src/gui/mapshaper-hit-control2.js @@ -0,0 +1,226 @@ +/* +@requires mapshaper-shape-hit, mapshaper-svg-hit +*/ + +function HitControl2(gui, ext, mouse) { + var self = new EventDispatcher(); + var storedData = noHitData(); // may include additional data from SVG symbol hit (e.g. hit node) + var active = false; + var shapeTest; + var svgTest; + var targetLayer; + // event priority is higher than navigation, so stopping propagation disables + // pan navigation + var priority = 2; + + self.setLayer = function(mapLayer) { + if (!mapLayer || !internal.layerHasGeometry(mapLayer.layer)) { + shapeTest = null; + svgTest = null; + self.stop(); + } else { + shapeTest = getShapeHitTest(mapLayer, ext); + svgTest = getSvgHitTest(mapLayer); + } + targetLayer = mapLayer; + // deselect any selection + // TODO: maintain selection if layer & shapes have not changed + updateHitData(null); + }; + + self.start = function() { + active = true; + }; + + self.stop = function() { + if (active) { + updateHitData(null); // no hit data, no event + active = false; + } + }; + + self.getHitId = function() {return storedData.id;}; + + // Get a reference to the active layer, so listeners to hit events can interact + // with data and shapes + self.getHitTarget = function() { + return targetLayer; + }; + + self.getTargetDataTable = function() { + var targ = self.getHitTarget(); + return targ && targ.layer.data || null; + }; + + self.getSwitchHandler = function(diff) { + return function() { + self.switchSelection(diff); + }; + }; + + self.switchSelection = function(diff) { + var i = storedData.ids.indexOf(storedData.id); + var n = storedData.ids.length; + if (i < 0 || n < 2) return; + if (diff != 1 && diff != -1) { + diff = 1; + } + storedData.id = storedData.ids[(i + diff + n) % n]; + triggerHitEvent('change'); + }; + + // make sure popup is unpinned and turned off when switching editing modes + // (some modes do not support pinning) + gui.on('interaction_mode_change', function(e) { + updateHitData(null); + if (e.mode == 'off') { + self.stop(); + } else { + self.start(); + } + }); + + mouse.on('dblclick', handlePointerEvent, null, priority); + mouse.on('dragstart', handlePointerEvent, null, priority); + mouse.on('drag', handlePointerEvent, null, priority); + mouse.on('dragend', handlePointerEvent, null, priority); + + mouse.on('click', function(e) { + var hitData; + if (!shapeTest || !active) return; + e.stopPropagation(); + + // TODO: move pinning to inspection control? + if (gui.interaction.modeUsesClick(gui.interaction.getMode())) { + hitData = hitTest(e); + // TOGGLE pinned state under some conditions + if (!hitData.pinned && hitData.id > -1) { + hitData.pinned = true; + } else if (hitData.pinned && hitData.id == storedData.id) { + hitData.pinned = false; + } + updateHitData(hitData); + } + + triggerHitEvent('click', e.data); + + }, null, priority); + + // Hits are re-detected on 'hover' (if hit detection is active) + mouse.on('hover', function(e) { + if (storedData.pinned || !shapeTest || !active) return; + if (!isOverMap(e)) { + // mouse is off of map viewport -- clear any current hit + updateHitData(null); + } else if (e.hover) { + // mouse is hovering directly over map area -- update hit detection + updateHitData(hitTest(e)); + } else { + // mouse is over map viewport but not directly over map (e.g. hovering + // over popup) -- don't update hit detection + } + + }, null, priority); + + function noHitData() {return {ids: [], id: -1, pinned: false};} + + function hitTest(e) { + var p = ext.translatePixelCoords(e.x, e.y); + var shapeHitIds = shapeTest(p[0], p[1]); + var svgData = svgTest(e); // null or a data object + var data = noHitData(); + if (svgData) { // mouse is over an SVG symbol + utils.extend(data, svgData); + if (shapeHitIds) { + // if both SVG hit and shape hit, merge hit ids + data.ids = utils.uniq(data.ids.concat(shapeHitIds)); + } + } else if (shapeHitIds) { + data.ids = shapeHitIds; + } + + // update selected id + if (data.id > -1) { + // svg hit takes precedence over any prior hit + } else if (storedData.id > -1 && data.ids.indexOf(storedData.id) > -1) { + data.id = storedData.id; + } else if (data.ids.length > 0) { + data.id = data.ids[0]; + } + + // update pinned property + if (storedData.pinned && data.id > -1) { + data.pinned = true; + } + return data; + } + + // If hit ids have changed, update stored hit ids and fire 'hover' event + // evt: (optional) mouse event + function updateHitData(newData) { + if (!newData) { + newData = noHitData(); + } + if (!testHitChange(storedData, newData)) { + return; + } + storedData = newData; + gui.container.findChild('.map-layers').classed('symbol-hit', newData.ids.length > 0); + if (active) { + triggerHitEvent('change'); + } + } + + // check if an event is used in the current interaction mode + function eventIsEnabled(type) { + var mode = gui.interaction.getMode(); + if (type == 'click' && !gui.interaction.modeUsesClick(mode)) { + return false; + } + if ((type == 'drag' || type == 'dragstart' || type == 'dragend') && !gui.interaction.modeUsesDrag(mode)) { + return false; + } + return true; + } + + function isOverMap(e) { + return e.x >= 0 && e.y >= 0 && e.x < ext.width() && e.y < ext.height(); + } + + function handlePointerEvent(e) { + if (!shapeTest || !active) return; + if (self.getHitId() == -1) return; // ignore pointer events when no features are being hit + // don't block pan and other navigation in modes when they are not being used + if (eventIsEnabled(e.type)) { + e.stopPropagation(); // block navigation + triggerHitEvent(e.type, e.data); + } + } + + // d: event data (may be a pointer event object, an ordinary object or null) + function triggerHitEvent(type, d) { + // Merge stored hit data into the event data + var eventData = utils.extend({}, d || {}, storedData); + self.dispatchEvent(type, eventData); + } + + // Test if two hit data objects are equivalent + function testHitChange(a, b) { + // check change in 'container', e.g. so moving from anchor hit to label hit + // is detected + if (sameIds(a.ids, b.ids) && a.container == b.container && a.pinned == b.pinned && a.id == b.id) { + return false; + } + return true; + } + + function sameIds(a, b) { + if (a.length != b.length) return false; + for (var i=0; i) -function DropControl(cb) { - var el = El('body'); - el.on('dragleave', ondrag); - el.on('dragover', ondrag); - el.on('drop', ondrop); - function ondrag(e) { +function DropControl(el, cb) { + var area = El(el); + area.on('dragleave', ondragleave) + .on('dragover', ondragover) + .on('drop', ondrop); + function ondragleave(e) { + block(e); + out(); + } + function ondragover(e) { // blocking drag events enables drop event - e.preventDefault(); + block(e); + over(); } function ondrop(e) { - e.preventDefault(); + block(e); + out(); cb(e.dataTransfer.files); } + function over() { + area.addClass('dragover'); + } + function out() { + area.removeClass('dragover'); + } + function block(e) { + e.preventDefault(); + e.stopPropagation(); + } } // @el DOM element for select button @@ -54,177 +62,234 @@ function FileChooser(el, cb) { } } -function ImportControl(model, opts) { - new SimpleButton('#import-buttons .submit-btn').on('click', submitFiles); - new SimpleButton('#import-buttons .cancel-btn').on('click', gui.clearMode); +function ImportControl(gui, opts) { + var model = gui.model; var importCount = 0; var queuedFiles = []; var manifestFiles = opts.files || []; - gui.addMode('import', turnOn, turnOff); - new DropControl(receiveFiles); + var _importOpts = {}; + var cachedFiles = {}; + var catalog; + + if (opts.catalog) { + catalog = new CatalogControl(gui, opts.catalog, downloadFiles); + } + + new SimpleButton('#import-buttons .submit-btn').on('click', onSubmit); + new SimpleButton('#import-buttons .cancel-btn').on('click', gui.clearMode); + new DropControl('body', receiveFiles); // default drop area is entire page + new DropControl('#import-drop', receiveFiles); + new DropControl('#import-quick-drop', receiveFilesQuickView); new FileChooser('#file-selection-btn', receiveFiles); new FileChooser('#import-buttons .add-btn', receiveFiles); new FileChooser('#add-file-btn', receiveFiles); + + gui.keyboard.onMenuSubmit(El('#import-options'), onSubmit); + + gui.addMode('import', turnOn, turnOff); gui.enterMode('import'); + gui.on('mode', function(e) { // re-open import opts if leaving alert or console modes and nothing has been imported yet - if (!e.name && importCount === 0) { + if (!e.name && model.isEmpty()) { gui.enterMode('import'); } }); function findMatchingShp(filename) { - var base = utils.getPathBase(filename); + // use case-insensitive matching + var base = utils.getPathBase(filename).toLowerCase(); return model.getDatasets().filter(function(d) { - var fname = d.info.input_files[0] || ''; + var fname = d.info.input_files && d.info.input_files[0] || ""; var ext = utils.getFileExtension(fname).toLowerCase(); - var base2 = utils.getPathBase(fname); + var base2 = utils.getPathBase(fname).toLowerCase(); return base == base2 && ext == 'shp'; }); } function turnOn() { - var el = El('#import-options'); if (manifestFiles.length > 0) { - downloadFiles(manifestFiles); + downloadFiles(manifestFiles, true); manifestFiles = []; - } else { - if (importCount > 0) { - el.removeClass('first-run'); - } - el.show(); + } else if (model.isEmpty()) { + gui.container.addClass('splash-screen'); } } function turnOff() { + var target; + if (catalog) catalog.reset(); // re-enable clickable catalog + if (importCount > 0) { + // display last layer of last imported dataset + target = model.getDefaultTargets()[0]; + model.selectLayer(target.layers[target.layers.length-1], target.dataset); + } gui.clearProgressMessage(); - clearFiles(); + importCount = 0; close(); } function close() { - El('#fork-me').hide(); - El('#import-options').hide(); + clearQueuedFiles(); + cachedFiles = {}; } - - function clearFiles() { + function clearQueuedFiles() { queuedFiles = []; - El('#dropped-file-list .file-list').empty(); - El('#dropped-file-list').hide(); - El('#import-buttons').hide(); + gui.container.removeClass('queued-files'); + gui.container.findChild('.dropped-file-list').empty(); } - function addFiles(files) { + function addFilesToQueue(files) { var index = {}; queuedFiles = queuedFiles.concat(files).reduce(function(memo, f) { // filter out unreadable types and dupes - if (gui.isReadableFileType(f.name) && f.name in index === false) { + if (GUI.isReadableFileType(f.name) && f.name in index === false) { index[f.name] = true; memo.push(f); } return memo; }, []); - // sort alphabetically by filename - queuedFiles.sort(function(a, b) { - // Sorting on LC filename is a kludge, so Shapefiles with mixed-case - // extensions are sorted with .shp component before .dbf - // (When .dbf files are queued first, they are imported as a separate layer. - // This is so data layers are not later converted into shape layers, - // e.g. to allow joining a shape layer to its own dbf data table). - return a.name.toLowerCase() > b.name.toLowerCase() ? 1 : -1; + } + + // When a Shapefile component is at the head of the queue, move the entire + // Shapefile to the front of the queue, sorted in reverse alphabetical order, + // (a kludge), so .shp is read before .dbf and .prj + // (If a .dbf file is imported before a .shp, it becomes a separate dataset) + // TODO: import Shapefile parts without relying on this kludge + function sortQueue(queue) { + var nextFile = queue[0]; + var basename, parts; + if (!isShapefilePart(nextFile.name)) { + return queue; + } + basename = utils.getFileBase(nextFile.name).toLowerCase(); + parts = []; + queue = queue.filter(function(file) { + if (utils.getFileBase(file.name).toLowerCase() == basename) { + parts.push(file); + return false; + } + return true; + }); + parts.sort(function(a, b) { + // Sorting on LC filename so Shapefiles with mixed-case + // extensions are sorted correctly + return a.name.toLowerCase() < b.name.toLowerCase() ? 1 : -1; }); + return parts.concat(queue); } function showQueuedFiles() { - var list = El('#dropped-file-list .file-list').empty(); - El('#dropped-file-list').show(); + var list = gui.container.findChild('.dropped-file-list').empty(); queuedFiles.forEach(function(f) { - El('

').text(f.name).appendTo(El("#dropped-file-list .file-list")); + El('

').text(f.name).appendTo(list); }); } - function receiveFiles(files) { + function receiveFilesQuickView(files) { + receiveFiles(files, true); + } + + function receiveFiles(files, quickView) { var prevSize = queuedFiles.length; - addFiles(utils.toArray(files)); + files = handleZipFiles(utils.toArray(files), quickView); + addFilesToQueue(files); if (queuedFiles.length === 0) return; gui.enterMode('import'); - if (importCount === 0 && prevSize === 0 && containsImmediateFile(queuedFiles)) { - // if the first batch of files will be imported, process right away - submitFiles(); + + if (quickView === true) { + onSubmit(quickView); } else { + gui.container.addClass('queued-files'); + El('#path-import-options').classed('hidden', !filesMayContainPaths(queuedFiles)); showQueuedFiles(); - El('#import-buttons').show(); } } - // Check if an array of File objects contains a file that should be imported right away - function containsImmediateFile(files) { + function filesMayContainPaths(files) { return utils.some(files, function(f) { var type = internal.guessInputFileType(f.name); - return type == 'shp' || type == 'json'; + return type == 'shp' || type == 'json' || internal.isZipFile(f.name); }); } - function submitFiles() { - close(); - readNext(); + function onSubmit(quickView) { + gui.container.removeClass('queued-files'); + gui.container.removeClass('splash-screen'); + _importOpts = quickView === true ? {} : readImportOpts(); + procNextQueuedFile(); } - function readNext() { - if (queuedFiles.length > 0) { - readFile(queuedFiles.pop()); // read in rev. alphabetic order, so .shp comes before .dbf - } else { - gui.clearMode(); + function addDataset(dataset) { + if (!datasetIsEmpty(dataset)) { + model.addDataset(dataset); + importCount++; } + procNextQueuedFile(); } - function getImportOpts() { - var freeform = El('#import-options .advanced-options').node().value, - opts = gui.parseFreeformOptions(freeform, 'i'); - opts.no_repair = !El("#repair-intersections-opt").node().checked; - opts.auto_snap = !!El("#snap-points-opt").node().checked; - return opts; + function datasetIsEmpty(dataset) { + return dataset.layers.every(function(lyr) { + return internal.getFeatureCount(lyr) === 0; + }); } - function loadFile(file, cb) { - var reader = new FileReader(), - isBinary = internal.isBinaryFile(file.name); - // no callback on error -- fix? - reader.onload = function(e) { - cb(null, reader.result); - }; - if (isBinary) { - reader.readAsArrayBuffer(file); + function procNextQueuedFile() { + if (queuedFiles.length === 0) { + gui.clearMode(); } else { - // TODO: improve to handle encodings, etc. - reader.readAsText(file, 'UTF-8'); + queuedFiles = sortQueue(queuedFiles); + readFile(queuedFiles.shift()); } } + // TODO: support .cpg + function isShapefilePart(name) { + return /\.(shp|shx|dbf|prj)$/i.test(name); + } + + function readImportOpts() { + var freeform = El('#import-options .advanced-options').node().value, + opts = GUI.parseFreeformOptions(freeform, 'i'); + opts.no_repair = !El("#repair-intersections-opt").node().checked; + opts.snap = !!El("#snap-points-opt").node().checked; + return opts; + } + // @file a File object function readFile(file) { - if (internal.isZipFile(file.name)) { - readZipFile(file); + var name = file.name, + reader = new FileReader(), + useBinary = internal.isSupportedBinaryInputType(name) || + internal.isZipFile(name) || + internal.guessInputFileType(name) == 'json' || + internal.guessInputFileType(name) == 'text'; + + reader.addEventListener('loadend', function(e) { + if (!reader.result) { + handleImportError("Web browser was unable to load the file.", name); + } else { + importFileContent(name, reader.result); + } + }); + if (useBinary) { + reader.readAsArrayBuffer(file); } else { - loadFile(file, function(err, content) { - if (err) { - readNext(); - } else { - readFileContent(file.name, content); - } - }); + // TODO: consider using "encoding" option, to support CSV files in other encodings than utf8 + reader.readAsText(file, 'UTF-8'); } } - function readFileContent(name, content) { - var type = internal.guessInputType(name, content), - importOpts = getImportOpts(), - matches = findMatchingShp(name), + function importFileContent(fileName, content) { + var fileType = internal.guessInputType(fileName, content), + importOpts = utils.extend({}, _importOpts), + matches = findMatchingShp(fileName), dataset, lyr; - // TODO: refactor - if (type == 'dbf' && matches.length > 0) { + // Add dbf data to a previously imported .shp file with a matching name + // (.shp should have been queued before .dbf) + if (fileType == 'dbf' && matches.length > 0) { // find an imported .shp layer that is missing attribute data // (if multiple matches, try to use the most recently imported one) dataset = matches.reduce(function(memo, d) { @@ -243,62 +308,86 @@ function ImportControl(model, opts) { // kludge: trigger display of table cells if .shp has null geometry model.updated({}, lyr, dataset); } - readNext(); + procNextQueuedFile(); return; } } - if (type == 'prj') { - // assumes that .shp has been imported first + if (fileType == 'shx') { + // save .shx for use when importing .shp + // (queue should be sorted so that .shx is processed before .shp) + cachedFiles[fileName.toLowerCase()] = {filename: fileName, content: content}; + procNextQueuedFile(); + return; + } + + // Add .prj file to previously imported .shp file + if (fileType == 'prj') { matches.forEach(function(d) { - if (!d.info.input_prj) { - d.info.input_prj = content; + if (!d.info.prj) { + d.info.prj = content; } }); - readNext(); + procNextQueuedFile(); return; } - importFileContent(type, name, content, importOpts); + importNewDataset(fileType, fileName, content, importOpts); } - function importFileContent(type, path, content, importOpts) { + function importNewDataset(fileType, fileName, content, importOpts) { var size = content.byteLength || content.length, // ArrayBuffer or string - showMsg = size > 4e7, // don't show message if dataset is small delay = 0; - importOpts.files = [path]; // TODO: try to remove this - if (showMsg) { + + // show importing message if file is large + if (size > 4e7) { gui.showProgressMessage('Importing'); delay = 35; } setTimeout(function() { var dataset; + var input = {}; try { - dataset = internal.importFileContent(content, path, importOpts); - dataset.info.no_repair = importOpts.no_repair; - model.updated({select: true, import: true}, dataset.layers[0], dataset); - importCount++; - readNext(); - } catch(e) { - handleImportError(e, path); + input[fileType] = {filename: fileName, content: content}; + if (fileType == 'shp') { + // shx file should already be cached, if it was added together with the shp + input.shx = cachedFiles[fileName.replace(/shp$/i, 'shx').toLowerCase()] || null; + } + dataset = internal.importContent(input, importOpts); + // save import options for use by repair control, etc. + dataset.info.import_options = importOpts; + addDataset(dataset); + + } catch(e) { + handleImportError(e, fileName); } }, delay); } - function handleImportError(e, path) { + function handleImportError(e, fileName) { var msg = utils.isString(e) ? e : e.message; - if (path) { - msg = "Error importing " + path + ":\n" + msg; + if (fileName) { + msg = "Error importing " + fileName + "
" + msg; } - clearFiles(); + clearQueuedFiles(); gui.alert(msg); console.error(e); } - function readZipFile(file) { - gui.showProgressMessage('Importing'); + function handleZipFiles(files, quickView) { + return files.filter(function(file) { + var isZip = internal.isZipFile(file.name); + if (isZip) { + importZipFile(file, quickView); + } + return !isZip; + }); + } + + function importZipFile(file, quickView) { + // gui.showProgressMessage('Importing'); setTimeout(function() { - gui.readZipFile(file, function(err, files) { + GUI.readZipFile(file, function(err, files) { if (err) { handleImportError(err, file.name); } else { @@ -307,8 +396,7 @@ function ImportControl(model, opts) { files = files.filter(function(f) { return !/\.txt$/i.test(f.name); }); - addFiles(files); - readNext(); + receiveFiles(files, quickView); } }); }, 35); @@ -320,18 +408,20 @@ function ImportControl(model, opts) { var item = {name: name}; if (isUrl) { item.url = name; - item.basename = gui.getUrlFilename(name); + item.basename = GUI.getUrlFilename(name); + } else { item.basename = name; // Assume non-urls are local files loaded via mapshaper-gui item.url = '/data/' + name; + item.url = item.url.replace('/../', '/~/'); // kludge to allow accessing one parent } - return gui.isReadableFileType(item.basename) ? item : null; + return GUI.isReadableFileType(item.basename) ? item : null; }); return items.filter(Boolean); } - function downloadFiles(paths, opts) { + function downloadFiles(paths, quickView) { var items = prepFilesForDownload(paths); utils.reduceAsync(items, [], downloadNextFile, function(err, files) { if (err) { @@ -339,8 +429,7 @@ function ImportControl(model, opts) { } else if (!files.length) { gui.clearMode(); } else { - addFiles(files); - submitFiles(); + receiveFiles(files, quickView); } }); } @@ -354,6 +443,10 @@ function ImportControl(model, opts) { blob = req.response; } }); + req.addEventListener('progress', function(e) { + var pct = e.loaded / e.total; + if (catalog) catalog.progress(pct); + }); req.addEventListener('loadend', function() { var err; if (req.status == 404) { diff --git a/src/gui/mapshaper-inspection-control.js b/src/gui/mapshaper-inspection-control.js deleted file mode 100644 index f086bc29e..000000000 --- a/src/gui/mapshaper-inspection-control.js +++ /dev/null @@ -1,134 +0,0 @@ -/* @requires mapshaper-gui-lib, mapshaper-popup */ - -function InspectionControl(model, hit) { - var _popup = new Popup(); - var _inspecting = false; - var _pinned = false; - var _highId = -1; - var _selectionIds = null; - var btn = gui.addSidebarButton("#info-icon2").on('click', function() { - if (_inspecting) turnOff(); else turnOn(); - }); - var _self = new EventDispatcher(); - var _shapes, _lyr; - - _self.updateLayer = function(o) { - var shapes = o.getDisplayLayer().layer.shapes; - if (_inspecting) { - // kludge: check if shapes have changed - if (_shapes == shapes) { - // kludge: re-display the inspector, in case data changed - inspect(_highId, _pinned); - } else { - _selectionIds = null; - inspect(-1, false); - } - } - hit.setLayer(o); - _shapes = shapes; - _lyr = o; - }; - - // replace cli inspect command - api.inspect = function(lyr, arcs, opts) { - var ids; - if (lyr != model.getActiveLayer().layer) { - error("Only the active layer can be targeted"); - } - ids = internal.selectFeatures(lyr, arcs, opts); - if (ids.length === 0) { - message("No features were selected"); - return; - } - _selectionIds = ids; - turnOn(); - inspect(ids[0], true); - }; - - document.addEventListener('keydown', function(e) { - var kc = e.keyCode, n, id; - if (!_inspecting) return; - - // esc key closes (unless in an editing mode) - if (e.keyCode == 27 && _inspecting && !gui.getMode()) { - turnOff(); - - // arrow keys advance pinned feature unless user is editing text. - } else if ((kc == 37 || kc == 39) && _pinned && !gui.getInputElement()) { - n = internal.getFeatureCount(_lyr.getDisplayLayer().layer); - if (n > 1) { - if (kc == 37) { - id = (_highId + n - 1) % n; - } else { - id = (_highId + 1) % n; - } - inspect(id, true); - e.stopPropagation(); - } - } - }, !!'capture'); // preempt the layer control's arrow key handler - - hit.on('click', function(e) { - var id = e.id; - var pin = false; - if (_pinned && id == _highId) { - // clicking on pinned shape: unpin - } else if (!_pinned && id > -1) { - // clicking on unpinned shape while unpinned: pin - pin = true; - } else if (_pinned && id > -1) { - // clicking on unpinned shape while pinned: pin new shape - pin = true; - } else if (!_pinned && id == -1) { - // clicking off the layer while pinned: unpin and deselect - } - inspect(id, pin, e.ids); - }); - - hit.on('hover', function(e) { - var id = e.id; - if (!_inspecting || _pinned) return; - inspect(id, false, e.ids); - }); - - function showInspector(id, editable) { - var o = _lyr.getDisplayLayer(); - var table = o.layer.data || null; - var rec = table ? table.getRecordAt(id) : {}; - _popup.show(rec, table, editable); - } - - // @id Id of a feature in the active layer, or -1 - function inspect(id, pin, ids) { - if (!_inspecting) return; - if (id > -1) { - showInspector(id, pin); - } else { - _popup.hide(); - } - _highId = id; - _pinned = pin; - _self.dispatchEvent('change', { - selection_ids: _selectionIds || [], - hover_ids: ids || [], - id: id, - pinned: pin - }); - } - - function turnOn() { - btn.addClass('selected'); - _inspecting = true; - hit.start(); - } - - function turnOff() { - btn.removeClass('selected'); - hit.stop(); - _selectionIds = null; - inspect(-1); // clear the map - _inspecting = false; - } - - return _self; -} diff --git a/src/gui/mapshaper-inspection-control2.js b/src/gui/mapshaper-inspection-control2.js new file mode 100644 index 000000000..3b9c28c0e --- /dev/null +++ b/src/gui/mapshaper-inspection-control2.js @@ -0,0 +1,131 @@ +/* @requires mapshaper-gui-lib, mapshaper-popup */ + +function InspectionControl2(gui, hit) { + var model = gui.model; + var _popup = new Popup(gui, hit.getSwitchHandler(1), hit.getSwitchHandler(-1)); + var _self = new EventDispatcher(); + + // state variables + var _pinned = false; + var _highId = -1; + + gui.on('interaction_mode_change', function(e) { + if (e.mode == 'off') { + turnOff(); + } + // TODO: update popup if currently pinned + }); + + // inspector and label editing aren't fully synced - stop inspecting if label editor starts + // REMOVED + // gui.on('label_editor_on', function() { + // }); + + _popup.on('update', function(e) { + var d = e.data; + d.i = _highId; // need to add record id + _self.dispatchEvent('data_change', d); + }); + + // replace cli inspect command + // TODO: support multiple editors on the page + // REMOVING gui output for -inspect command + /* + api.inspect = function(lyr, arcs, opts) { + var ids; + if (!_target) return; // control is disabled (selected layer is hidden, etc) + if (lyr != model.getActiveLayer().layer) { + error("Only the active layer can be targeted"); + } + ids = internal.selectFeatures(lyr, arcs, opts); + if (ids.length === 0) { + message("No features were selected"); + return; + } + _selectionIds = ids; + turnOn(); + inspect(ids[0], true); + }; + */ + + gui.keyboard.on('keydown', function(evt) { + var e = evt.originalEvent; + var kc = e.keyCode, n, id; + if (!inspecting() || !hit.getHitTarget()) return; + + // esc key closes (unless in an editing mode) + if (e.keyCode == 27 && inspecting() && !gui.getMode()) { + turnOff(); + return; + } + + if (_pinned && !GUI.getInputElement()) { + // an element is selected and user is not editing text + + if (kc == 37 || kc == 39) { + // arrow keys advance pinned feature + n = internal.getFeatureCount(hit.getHitTarget().layer); + if (n > 1) { + if (kc == 37) { + id = (_highId + n - 1) % n; + } else { + id = (_highId + 1) % n; + } + inspect(id, true); + e.stopPropagation(); + } + } else if (kc == 8) { + // delete key + // to help protect against inadvertent deletion, don't delete + // when console is open or a popup menu is open + if (!gui.getMode() && !gui.consoleIsOpen()) { + deletePinnedFeature(); + } + } + } + }, !!'capture'); // preempt the layer control's arrow key handler + + hit.on('change', function(e) { + if (!inspecting()) return; + inspect(e.id, e.pinned, e.ids); + }); + + function showInspector(id, ids, pinned) { + var target = hit.getHitTarget(); + var editable = pinned && gui.interaction.getMode() == 'data'; + if (target && target.layer.data) { + _popup.show(id, ids, target.layer.data, pinned, editable); + } + } + + // @id Id of a feature in the active layer, or -1 + function inspect(id, pin, ids) { + _pinned = pin; + if (id > -1 && inspecting()) { + showInspector(id, ids, pin); + } else { + _popup.hide(); + } + } + + // does the attribute inspector appear on rollover + function inspecting() { + return gui.interaction && gui.interaction.getMode() != 'off'; + } + + function turnOff() { + inspect(-1); // clear the map + } + + function deletePinnedFeature() { + var lyr = model.getActiveLayer().layer; + console.log("delete; pinned?", _pinned, "id:", _highId); + if (!_pinned || _highId == -1) return; + lyr.shapes.splice(_highId, 1); + if (lyr.data) lyr.data.getRecords().splice(_highId, 1); + inspect(-1); + model.updated({flags: 'filter'}); + } + + return _self; +} diff --git a/src/gui/mapshaper-interaction-mode-control.js b/src/gui/mapshaper-interaction-mode-control.js new file mode 100644 index 000000000..0c361e6b1 --- /dev/null +++ b/src/gui/mapshaper-interaction-mode-control.js @@ -0,0 +1,192 @@ +/* @require mapshaper-gui-lib */ + +function InteractionMode(gui) { + var buttons, btn1, btn2, menu; + + // all possible menu contents + var menus = { + standard: ['info', 'data'], + labels: ['info', 'data', 'labels', 'location'], + points: ['info', 'data', 'location'] + }; + + // mode name -> menu text lookup + var labels = { + info: 'off', // no data editing, just popup + data: 'data', + labels: 'labels', + location: 'coordinates' + }; + + // state variables + var _editMode = 'info'; // one of labels{} keys + var _active = false; // interaction on/off + var _menuOpen = false; + + // Only render edit mode button/menu if this option is present + if (gui.options.inspectorControl) { + buttons = gui.buttons.addDoubleButton('#info-icon2', '#info-menu-icon'); + btn1 = buttons[0]; // [i] button + btn2 = buttons[1]; // submenu button + menu = El('div').addClass('nav-sub-menu').appendTo(btn2.node().parentNode); + + menu.on('click', function() { + closeMenu(0); // dismiss menu by clicking off an active link + }); + + btn1.on('click', function() { + gui.dispatchEvent('interaction_toggle'); + }); + + btn2.on('click', function() { + _menuOpen = true; + updateMenu(); + }); + + // triggered by a keyboard shortcut + gui.on('interaction_toggle', function() { + setActive(!_active); + }); + + updateVisibility(); + } + + this.getMode = getInteractionMode; + + this.setActive = setActive; + + this.setMode = function(mode) { + // TODO: check that this mode is valid for the current dataset + if (mode in labels) { + setMode(mode); + } + }; + + this.modeUsesDrag = function(name) { + return name == 'location' || name == 'labels'; + }; + + this.modeUsesClick = function(name) { + return name == 'data' || name == 'info'; // click used to pin popup + }; + + gui.model.on('update', function(e) { + // change mode if active layer doesn't support the current mode + updateCurrentMode(); + if (_menuOpen) { + updateMenu(); + } + }, null, -1); // low priority? + + function getAvailableModes() { + var o = gui.model.getActiveLayer(); + if (!o || !o.layer) { + return menus.standard; // TODO: more sensible handling of missing layer + } + if (internal.layerHasLabels(o.layer)) { + return menus.labels; + } + if (internal.layerHasPoints(o.layer)) { + return menus.points; + } + return menus.standard; + } + + function getInteractionMode() { + return _active ? _editMode : 'off'; + } + + function renderMenu(modes) { + menu.empty(); + El('div').addClass('nav-menu-item').text('interactive editing:').appendTo(menu); + modes.forEach(function(mode) { + var link = El('div').addClass('nav-menu-item nav-menu-link').attr('data-name', mode).text(labels[mode]).appendTo(menu); + link.on('click', function(e) { + if (_editMode != mode) { + setMode(mode); + closeMenu(500); + e.stopPropagation(); + } + }); + }); + } + + // if current editing mode is not available, switch to another mode + function updateCurrentMode() { + var modes = getAvailableModes(); + if (modes.indexOf(_editMode) == -1) { + setMode(modes[0]); + } + } + + function updateMenu() { + if (menu) { + renderMenu(getAvailableModes()); + updateModeDisplay(); + updateVisibility(); + } + } + + function openMenu() { + _menuOpen = true; + updateVisibility(); + } + + function closeMenu(delay) { + setTimeout(function() { + _menuOpen = false; + updateVisibility(); + }, delay || 0); + } + + function setMode(mode) { + var changed = mode != _editMode; + if (changed) { + _editMode = mode; + updateMenu(); + onModeChange(); + } + } + + function setActive(active) { + if (active != _active) { + _active = !!active; + _menuOpen = false; // make sure menu does not stay open when button toggles off + updateVisibility(); + onModeChange(); + } + } + + function onModeChange() { + gui.dispatchEvent('interaction_mode_change', {mode: getInteractionMode()}); + } + + function updateVisibility() { + if (!menu) return; + // menu + if (_menuOpen && _active) { + menu.show(); + } else { + menu.hide(); + } + // button + if (_menuOpen || !_active) { + btn2.hide(); + } else { + btn2.show(); + } + btn1.classed('selected', _active); + } + + function updateModeDisplay() { + El.findAll('.nav-menu-item').forEach(function(el) { + el = El(el); + el.classed('selected', el.attr('data-name') == _editMode); + }); + } + + function initLink(label) { + return El('div').addClass('edit-mode-link').text(label); + } + +} diff --git a/src/gui/mapshaper-keyboard.js b/src/gui/mapshaper-keyboard.js new file mode 100644 index 000000000..5fc3439c0 --- /dev/null +++ b/src/gui/mapshaper-keyboard.js @@ -0,0 +1,19 @@ + +function KeyboardEvents(gui) { + var self = this; + document.addEventListener('keydown', function(e) { + if (!GUI.isActiveInstance(gui)) return; + self.dispatchEvent('keydown', {originalEvent: e}); + }); + + this.onMenuSubmit = function(menuEl, cb) { + gui.on('enter_key', function(e) { + if (menuEl.visible()) { + e.originalEvent.stopPropagation(); + cb(); + } + }); + }; +} + +utils.inherit(KeyboardEvents, EventDispatcher); diff --git a/src/gui/mapshaper-layer-control.js b/src/gui/mapshaper-layer-control.js index cfb418c07..e319557ca 100644 --- a/src/gui/mapshaper-layer-control.js +++ b/src/gui/mapshaper-layer-control.js @@ -1,179 +1,341 @@ -/* @require mapshaper-gui-lib */ +/* @require mapshaper-gui-lib mapshaper-dom-cache */ -function LayerControl(model, map) { - var el = El("#layer-control").on('click', gui.handleDirectEvent(gui.clearMode)); - var buttonLabel = El('#layer-control-btn .layer-name'); +function LayerControl(gui) { + var map = gui.map; + var model = gui.model; + var el = gui.container.findChild(".layer-control").on('click', GUI.handleDirectEvent(gui.clearMode)); + var btn = gui.container.findChild('.layer-control-btn'); + var buttonLabel = btn.findChild('.layer-name'); var isOpen = false; - var pinnedLyr = null; + var cache = new DomCache(); + var pinAll = el.findChild('.pin-all'); // button for toggling layer visibility - new ModeButton('#layer-control-btn .header-btn', 'layer_menu'); - gui.addMode('layer_menu', turnOn, turnOff); + // layer repositioning + var dragTargetId = null; + var dragging = false; + var layerOrderSlug; + + gui.addMode('layer_menu', turnOn, turnOff, btn.findChild('.header-btn')); model.on('update', function(e) { - updateBtn(); + updateMenuBtn(); if (isOpen) render(); }); + el.on('mouseup', stopDragging); + el.on('mouseleave', stopDragging); + + // init layer visibility button + pinAll.on('click', function() { + var allOn = testAllLayersPinned(); + model.getLayers().forEach(function(target) { + map.setLayerVisibility(target, !allOn); + }); + El.findAll('.pinnable', el.node()).forEach(function(item) { + El(item).classed('pinned', !allOn); + }); + map.redraw(); + }); + + + function updatePinAllButton() { + pinAll.classed('pinned', testAllLayersPinned()); + } + + function testAllLayersPinned() { + var yes = true; + model.forEachLayer(function(lyr, dataset) { + if (isPinnable(lyr) && !map.isVisibleLayer(lyr)) { + yes = false; + } + }); + return yes; + } + + function findLayerById(id) { + return model.findLayer(function(lyr, dataset) { + return lyr.menu_id == id; + }); + } + + function getLayerOrderSlug() { + return internal.sortLayersForMenuDisplay(model.getLayers()).map(function(o) { + return map.isVisibleLayer(o.layer) ? o.layer.menu_id : ''; + }).join(''); + } + + function clearClass(name) { + var targ = el.findChild('.' + name); + if (targ) targ.removeClass(name); + } + + function stopDragging() { + clearClass('dragging'); + clearClass('drag-target'); + clearClass('insert-above'); + clearClass('insert-below'); + dragTargetId = layerOrderSlug = null; + if (dragging) { + render(); // in case menu changed... + dragging = false; + } + } + + function insertLayer(dragId, dropId, above) { + var dragLyr = findLayerById(dragId); + var dropLyr = findLayerById(dropId); + var slug; + if (dragId == dropId) return; + dragLyr.layer.stack_id = dropLyr.layer.stack_id + (above ? 0.5 : -0.5); + slug = getLayerOrderSlug(); + if (slug != layerOrderSlug) { + layerOrderSlug = slug; + map.redraw(); + } + } + function turnOn() { isOpen = true; - // set max layer menu height + el.findChild('div.info-box-scrolled').css('max-height', El('body').height() - 80); render(); - El('#layer-control div.info-box-scrolled').css('max-height', El('body').height() - 80); el.show(); } function turnOff() { + stopDragging(); isOpen = false; el.hide(); } - function updateBtn() { + function updateMenuBtn() { var name = model.getActiveLayer().layer.name || "[unnamed layer]"; buttonLabel.html(name + "  ▼"); } function render() { - var list = El('#layer-control .layer-list'); - var pinnable = 0; - if (isOpen) { - list.hide().empty(); - model.forEachLayer(function(lyr, dataset) { - if (isPinnable(lyr)) pinnable++; - }); - if (pinnable === 0 && pinnedLyr) { - clearPin(); // a layer has been deleted... + var list = el.findChild('.layer-list'); + var uniqIds = {}; + var pinnableCount = 0; + var layerCount = 0; + list.empty(); + model.forEachLayer(function(lyr, dataset) { + // Assign a unique id to each layer, so html strings + // can be used as unique identifiers for caching rendered HTML, and as + // an id for layer menu event handlers + if (!lyr.menu_id || uniqIds[lyr.menu_id]) { + lyr.menu_id = utils.getUniqueName(); } - model.forEachLayer(function(lyr, dataset) { - list.appendChild(renderLayer(lyr, dataset, pinnable > 1 && isPinnable(lyr))); - }); - list.show(); - } - } + uniqIds[lyr.menu_id] = true; + if (isPinnable(lyr)) pinnableCount++; + layerCount++; + }); - function describeLyr(lyr) { - var n = internal.getFeatureCount(lyr), - str, type; - if (lyr.data && !lyr.shapes) { - type = 'data record'; - } else if (lyr.geometry_type) { - type = lyr.geometry_type + ' feature'; - } - if (type) { - str = utils.format('%,d %s%s', n, type, utils.pluralSuffix(n)); + if (pinnableCount < 2) { + pinAll.hide(); } else { - str = "[empty]"; + pinAll.show(); + updatePinAllButton(); } - return str; - } - function describeSrc(lyr, dataset) { - var inputs = dataset.info.input_files; - var file = inputs && inputs[0] || ''; - if (utils.endsWith(file, '.shp') && !lyr.data && lyr == dataset.layers[0]) { - file += " (missing .dbf)"; - } - return file; + internal.sortLayersForMenuDisplay(model.getLayers()).forEach(function(o) { + var lyr = o.layer; + var opts = { + show_source: layerCount < 5, + pinnable: pinnableCount > 1 && isPinnable(lyr) + }; + var html, element; + html = renderLayer(lyr, o.dataset, opts); + if (cache.contains(html)) { + element = cache.use(html); + } else { + element = El('div').html(html).firstChild(); + initMouseEvents(element, lyr.menu_id, opts.pinnable); + cache.add(html, element); + } + list.appendChild(element); + }); } - function getDisplayName(name) { - return name || '[unnamed]'; - } + cache.cleanup(); + + function renderLayer(lyr, dataset, opts) { + var warnings = getWarnings(lyr, dataset); + var classes = 'layer-item'; + var entry, html; - function setPin(lyr, dataset) { - if (pinnedLyr != lyr) { - clearPin(); - map.setReferenceLayer(lyr, dataset); - pinnedLyr = lyr; - el.addClass('visible-pin'); + if (opts.pinnable) classes += ' pinnable'; + if (map.isActiveLayer(lyr)) classes += ' active'; + if (map.isVisibleLayer(lyr)) classes += ' pinned'; + + html = '

'; + html += rowHTML('name', '' + getDisplayName(lyr.name) + '', 'row1'); + if (opts.show_source) { + html += rowHTML('source file', describeSrc(lyr, dataset) || 'n/a'); + } + html += rowHTML('contents', describeLyr(lyr)); + if (warnings) { + html += rowHTML('problems', warnings, 'layer-problems'); } + html += ''; + if (opts.pinnable) { + html += ''; + html += ''; + } + html += '
'; + return html; } - function clearPin() { - if (pinnedLyr) { - Elements('.layer-item.pinned').forEach(function(el) { - el.removeClass('pinned'); - }); - el.removeClass('visible-pin'); - pinnedLyr = null; - map.setReferenceLayer(null); + function initMouseEvents(entry, id, pinnable) { + entry.on('mouseover', init); + function init() { + entry.removeEventListener('mouseover', init); + initMouseEvents2(entry, id, pinnable); } } - function isPinnable(lyr) { - return !!lyr.geometry_type; + function initLayerDragging(entry, id) { + + // support layer drag-drop + entry.on('mousemove', function(e) { + var rect, insertionClass; + if (!e.buttons && (dragging || dragTargetId)) { // button is up + stopDragging(); + } + if (e.buttons && !dragTargetId) { + dragTargetId = id; + entry.addClass('drag-target'); + } + if (!dragTargetId) { + return; + } + if (dragTargetId != id) { + // signal to redraw menu later; TODO: improve + dragging = true; + } + rect = entry.node().getBoundingClientRect(); + insertionClass = e.pageY - rect.top < rect.height / 2 ? 'insert-above' : 'insert-below'; + if (!entry.hasClass(insertionClass)) { + clearClass('dragging'); + clearClass('insert-above'); + clearClass('insert-below'); + entry.addClass('dragging'); + entry.addClass(insertionClass); + insertLayer(dragTargetId, id, insertionClass == 'insert-above'); + } + }); } - function renderLayer(lyr, dataset, pinnable) { - var editLyr = model.getActiveLayer().layer; - var entry = El('div').addClass('layer-item').classed('active', lyr == editLyr); - var html = rowHTML('name', '' + getDisplayName(lyr.name) + '', 'row1'); - html += rowHTML('source file', describeSrc(lyr, dataset) || 'n/a'); - html += rowHTML('contents', describeLyr(lyr)); - html += ''; - if (pinnable) { - html += ''; - html += ''; - } - entry.html(html); + function initMouseEvents2(entry, id, pinnable) { - // init delete button - entry.findChild('img.close-btn').on('mouseup', function(e) { - e.stopPropagation(); - deleteLayer(lyr, dataset); - }); + initLayerDragging(entry, id); - if (pinnable) { - if (pinnedLyr == lyr) { - entry.addClass('pinned'); + // init delete button + GUI.onClick(entry.findChild('img.close-btn'), function(e) { + var target = findLayerById(id); + e.stopPropagation(); + if (map.isVisibleLayer(target.layer)) { + // TODO: check for double map refresh after model.deleteLayer() below + map.setLayerVisibility(target, false); } + model.deleteLayer(target.layer, target.dataset); + }); + if (pinnable) { // init pin button - entry.findChild('img.pinned').on('mouseup', function(e) { + GUI.onClick(entry.findChild('img.unpinned'), function(e) { + var target = findLayerById(id); e.stopPropagation(); - if (lyr == pinnedLyr) { - clearPin(); + if (map.isVisibleLayer(target.layer)) { + map.setLayerVisibility(target, false); + entry.removeClass('pinned'); } else { - setPin(lyr, dataset); + map.setLayerVisibility(target, true); entry.addClass('pinned'); } + updatePinAllButton(); + map.redraw(); + }); + + // catch click event on pin button + GUI.onClick(entry.findChild('img.unpinned'), function(e) { + e.stopPropagation(); }); } // init name editor new ClickText2(entry.findChild('.layer-name')) .on('change', function(e) { + var target = findLayerById(id); var str = cleanLayerName(this.value()); this.value(getDisplayName(str)); - lyr.name = str; - updateBtn(); + target.layer.name = str; + updateMenuBtn(); }); + // init click-to-select - gui.onClick(entry, function() { - if (!gui.getInputElement()) { // don't select if user is typing + GUI.onClick(entry, function() { + var target = findLayerById(id); + // don't select if user is typing or dragging + if (!GUI.getInputElement() && !dragging) { gui.clearMode(); - if (lyr != editLyr) { - model.updated({select: true}, lyr, dataset); + if (!map.isActiveLayer(target.layer)) { + model.updated({select: true}, target.layer, target.dataset); } } }); - return entry; } - function deleteLayer(lyr, dataset) { - var active; - if (lyr == pinnedLyr) { - clearPin(); + function describeLyr(lyr) { + var n = internal.getFeatureCount(lyr), + str, type; + if (lyr.data && !lyr.shapes) { + type = 'data record'; + } else if (lyr.geometry_type) { + type = lyr.geometry_type + ' feature'; } - model.deleteLayer(lyr, dataset); - if (model.isEmpty()) { - // refresh browser if deleted layer was the last layer - window.location.href = window.location.href.toString(); + if (type) { + str = utils.format('%,d %s%s', n, type, utils.pluralSuffix(n)); } else { - // trigger update event - active = model.getActiveLayer(); - model.selectLayer(active.layer, active.dataset); + str = "[empty]"; + } + return str; + } + + function getWarnings(lyr, dataset) { + var file = getSourceFile(lyr, dataset); + var missing = []; + var msg; + if (utils.endsWith(file, '.shp') && lyr == dataset.layers[0]) { + if (!lyr.data) { + missing.push('.dbf'); + } + if (!dataset.info.prj && !dataset.info.crs) { + missing.push('.prj'); + } + } + if (missing.length) { + msg = 'missing ' + missing.join(' and ') + ' data'; } + return msg; } + function getSourceFile(lyr, dataset) { + var inputs = dataset.info.input_files; + return inputs && inputs[0] || ''; + } + + function describeSrc(lyr, dataset) { + return getSourceFile(lyr, dataset); + } + + function getDisplayName(name) { + return name || '[unnamed]'; + } + + function isPinnable(lyr) { + return internal.layerHasGeometry(lyr) || internal.layerHasFurniture(lyr); + } + + function cleanLayerName(raw) { return raw.replace(/[\n\t/\\]/g, '') .replace(/^[\.\s]+/, '').replace(/[\.\s]+$/, ''); diff --git a/src/gui/mapshaper-layer-sorting.js b/src/gui/mapshaper-layer-sorting.js new file mode 100644 index 000000000..85f1827d0 --- /dev/null +++ b/src/gui/mapshaper-layer-sorting.js @@ -0,0 +1,24 @@ +/* @requires mapshaper-gui-lib */ + + +internal.updateLayerStackOrder = function(layers) { + // 1. assign ascending ids to unassigned layers above the range of other layers + layers.forEach(function(o, i) { + if (!o.layer.stack_id) o.layer.stack_id = 1e6 + i; + }); + // 2. sort in ascending order + layers.sort(function(a, b) { + return a.layer.stack_id - b.layer.stack_id; + }); + // 3. assign consecutve ids + layers.forEach(function(o, i) { + o.layer.stack_id = i + 1; + }); + return layers; +}; + +internal.sortLayersForMenuDisplay = function(layers) { + layers = internal.updateLayerStackOrder(layers); + return layers.reverse(); +}; + diff --git a/src/gui/mapshaper-layer-stack.js b/src/gui/mapshaper-layer-stack.js new file mode 100644 index 000000000..609f60075 --- /dev/null +++ b/src/gui/mapshaper-layer-stack.js @@ -0,0 +1,94 @@ +/* @requires +mapshaper-svg-display +mapshaper-canvas +mapshaper-map-style +*/ + +function LayerStack(gui, container, ext, mouse) { + var el = El(container), + _activeCanv = new DisplayCanvas().appendTo(el), // data layer shapes + _overlayCanv = new DisplayCanvas().appendTo(el), // data layer shapes + _overlay2Canv = new DisplayCanvas().appendTo(el), // line intersection dots + _svg = new SvgDisplayLayer(gui, ext, mouse).appendTo(el), // labels, _ext; + _furniture = new SvgDisplayLayer(gui, ext, null).appendTo(el), // scalebar, etc + _ext = ext; + + // don't let furniture container block events to symbol layers + _furniture.css('pointer-events', 'none'); + + this.drawOverlay2Layer = function(lyr) { + drawSingleCanvasLayer(lyr, _overlay2Canv); + }; + + this.drawOverlayLayer = function(lyr) { + drawSingleCanvasLayer(lyr, _overlayCanv); + }; + + this.drawContentLayers = function(layers, onlyNav) { + _activeCanv.prep(_ext); + if (!onlyNav) { + _svg.clear(); + } + layers.forEach(function(target) { + if (layerUsesCanvas(target.layer)) { + drawCanvasLayer(target, _activeCanv); + } + if (layerUsesSVG(target.layer)) { + drawSvgLayer(target, onlyNav); + } + }); + }; + + this.drawFurnitureLayers = function(layers, onlyNav) { + if (!onlyNav) { + _furniture.clear(); + } + layers.forEach(function(target) { + if (onlyNav) { + _furniture.reposition(target, 'furniture'); + } else { + _furniture.drawLayer(target, 'furniture'); + } + }); + }; + + function layerUsesCanvas(layer) { + // TODO: return false if a label layer does not have dots + return !internal.layerHasSvgSymbols(layer); + } + + function layerUsesSVG(layer) { + return internal.layerHasLabels(layer) || internal.layerHasSvgSymbols(layer); + } + + function drawCanvasLayer(target, canv) { + if (target.style.type == 'outline') { + drawOutlineLayerToCanvas(target, canv, ext); + } else { + drawStyledLayerToCanvas(target, canv, ext); + } + } + + function drawSvgLayer(target, onlyNav) { + var type; + if (internal.layerHasLabels(target.layer)) { + type = 'label'; + } else if (internal.layerHasSvgSymbols(target.layer)) { + type = 'symbol'; + } + if (onlyNav) { + _svg.reposition(target, type); + } else { + _svg.drawLayer(target, type); + } + } + + function drawSingleCanvasLayer(target, canv) { + if (!target) { + canv.hide(); + } else { + canv.prep(_ext); + drawCanvasLayer(target, canv); + } + } +} diff --git a/src/gui/mapshaper-map-extent.js b/src/gui/mapshaper-map-extent.js index ec8acf4bc..80d3b2f8c 100644 --- a/src/gui/mapshaper-map-extent.js +++ b/src/gui/mapshaper-map-extent.js @@ -1,46 +1,40 @@ /* @requires mapshaper-gui-lib */ -function MapExtent(el) { - var _position = new ElementPosition(el), - _scale = 1, - _cx, - _cy, - _contentBounds; - - _position.on('resize', function() { - this.dispatchEvent('change'); - this.dispatchEvent('navigate'); - this.dispatchEvent('resize'); - }, this); - - this.reset = function(force) { - this.recenter(_contentBounds.centerX(), _contentBounds.centerY(), 1, force); +function MapExtent(_position) { + var _scale = 1, + _cx, _cy, // center in geographic units + _contentBounds, + _self = this, + _frame; + + _position.on('resize', function(e) { + if (_contentBounds) { + onChange({resize: true}); + } + }); + + this.reset = function() { + recenter(_contentBounds.centerX(), _contentBounds.centerY(), 1, {reset: true}); }; - this.recenter = function(cx, cy, scale, force) { - if (!scale) scale = _scale; - if (force || !(cx == _cx && cy == _cy && scale == _scale)) { - _cx = cx; - _cy = cy; - _scale = scale; - this.dispatchEvent('change'); - this.dispatchEvent('navigate'); - } + this.home = function() { + recenter(_contentBounds.centerX(), _contentBounds.centerY(), 1); }; this.pan = function(xpix, ypix) { var t = this.getTransform(); - this.recenter(_cx - xpix / t.mx, _cy - ypix / t.my); + recenter(_cx - xpix / t.mx, _cy - ypix / t.my); }; - // Zoom to @scale (a multiple of the map's full scale) + // Zoom to @w (width of the map viewport in coordinates) // @xpct, @ypct: optional focus, [0-1]... - this.rescale = function(scale, xpct, ypct) { + this.zoomToExtent = function(w, xpct, ypct) { if (arguments.length < 3) { xpct = 0.5; ypct = 0.5; } var b = this.getBounds(), + scale = limitScale(b.width() / w * _scale), fx = b.xmin + xpct * b.width(), fy = b.ymax - ypct * b.height(), dx = b.centerX() - fx, @@ -50,19 +44,26 @@ function MapExtent(el) { dy2 = dy * ds, cx = fx + dx2, cy = fy + dy2; - this.recenter(cx, cy, scale); + recenter(cx, cy, scale); + }; + + this.zoomByPct = function(pct, xpct, ypct) { + this.zoomToExtent(this.getBounds().width() / pct, xpct, ypct); }; this.resize = _position.resize; this.width = _position.width; this.height = _position.height; this.position = _position.position; + this.recenter = recenter; // get zoom factor (1 == full extent, 2 == 2x zoom, etc.) this.scale = function() { return _scale; }; + this.maxScale = maxScale; + this.getPixelSize = function() { return 1 / this.getTransform().mx; }; @@ -80,51 +81,122 @@ function MapExtent(el) { this.getBounds = function() { if (!_contentBounds) return new Bounds(); - return centerAlign(calcBounds(_cx, _cy, _scale)); + return calcBounds(_cx, _cy, _scale); }; // Update the extent of 'full' zoom without navigating the current view this.setBounds = function(b) { var prev = _contentBounds; - _contentBounds = b; + if (!b.hasBounds()) return; // kludge + _contentBounds = _frame ? b : padBounds(b, 4); // padding if not in frame mode if (prev) { - _scale = _scale * centerAlign(b).width() / centerAlign(prev).width(); + _scale = _scale * fillOut(_contentBounds).width() / fillOut(prev).width(); } else { _cx = b.centerX(); _cy = b.centerY(); } }; - function getPadding(size) { - return size * 0.020 + 4; + this.translateCoords = function(x, y) { + return this.getTransform().transform(x, y); + }; + + this.setFrame = function(frame) { + _frame = frame || null; + }; + + this.getFrame = function() { + return _frame || null; + }; + + this.getSymbolScale = function() { + if (!_frame) return 0; + var bounds = new Bounds(_frame.bbox); + var bounds2 = bounds.clone().transform(this.getTransform()); + return bounds2.width() / _frame.width; + }; + + this.translatePixelCoords = function(x, y) { + return this.getTransform().invert().transform(x, y); + }; + + function recenter(cx, cy, scale, data) { + scale = scale ? limitScale(scale) : _scale; + if (!(cx == _cx && cy == _cy && scale == _scale)) { + _cx = cx; + _cy = cy; + _scale = scale; + onChange(data); + } + } + + function onChange(data) { + data = data || {}; + _self.dispatchEvent('change', data); + } + + // stop zooming before rounding errors become too obvious + function maxScale() { + var minPixelScale = 1e-16; + var xmax = maxAbs(_contentBounds.xmin, _contentBounds.xmax, _contentBounds.centerX()); + var ymax = maxAbs(_contentBounds.ymin, _contentBounds.ymax, _contentBounds.centerY()); + var xscale = _contentBounds.width() / _position.width() / xmax / minPixelScale; + var yscale = _contentBounds.height() / _position.height() / ymax / minPixelScale; + return Math.min(xscale, yscale); + } + + function maxAbs() { + return Math.max.apply(null, utils.toArray(arguments).map(Math.abs)); + } + + function limitScale(scale) { + return Math.min(scale, maxScale()); } function calcBounds(cx, cy, scale) { - var w = _contentBounds.width() / scale, - h = _contentBounds.height() / scale; + var bounds, w, h; + if (_frame) { + bounds = fillOutFrameBounds(_frame); + } else { + bounds = fillOut(_contentBounds); + } + w = bounds.width() / scale; + h = bounds.height() / scale; return new Bounds(cx - w/2, cy - h/2, cx + w/2, cy + h/2); } - // Receive: Geographic bounds of content to be centered in the map - // Return: Geographic bounds of map window centered on @_contentBounds, - // with padding applied - function centerAlign(_contentBounds) { - var bounds = _contentBounds.clone(), - wpix = _position.width(), - hpix = _position.height(), - xmarg = getPadding(wpix), - ymarg = getPadding(hpix), - xpad, ypad; - wpix -= 2 * xmarg; - hpix -= 2 * ymarg; + // Calculate viewport bounds from frame data + function fillOutFrameBounds(frame) { + var bounds = new Bounds(frame.bbox); + var kx = _position.width() / frame.width; + var ky = _position.height() / frame.height; + bounds.scale(kx, ky); + return bounds; + } + + function padBounds(b, margin) { + var wpix = _position.width() - 2 * margin, + hpix = _position.height() - 2 * margin, + xpad, ypad, b2; if (wpix <= 0 || hpix <= 0) { return new Bounds(0, 0, 0, 0); } - bounds.fillOut(wpix / hpix); - xpad = bounds.width() / wpix * xmarg; - ypad = bounds.height() / hpix * ymarg; - bounds.padBounds(xpad, ypad, xpad, ypad); - return bounds; + b = b.clone(); + b2 = b.clone(); + b2.fillOut(wpix / hpix); + xpad = b2.width() / wpix * margin; + ypad = b2.height() / hpix * margin; + b.padBounds(xpad, ypad, xpad, ypad); + return b; + } + + // Pad bounds vertically or horizontally to match viewport aspect ratio + function fillOut(b) { + var wpix = _position.width(), + hpix = _position.height(); + b = b.clone(); + b.fillOut(wpix / hpix); + return b; } } diff --git a/src/gui/mapshaper-map-nav.js b/src/gui/mapshaper-map-nav.js index bef3b3e9e..0e751bd91 100644 --- a/src/gui/mapshaper-map-nav.js +++ b/src/gui/mapshaper-map-nav.js @@ -3,36 +3,51 @@ mapshaper-gui-lib mapshaper-highlight-box */ -gui.addSidebarButton = function(iconId) { - var btn = El('div').addClass('nav-btn') - .on('dblclick', function(e) {e.stopPropagation();}); // block dblclick zoom - btn.appendChild(iconId); - btn.appendTo('#nav-buttons'); - return btn; -}; - -function MapNav(root, ext, mouse) { +function MapNav(gui, ext, mouse) { var wheel = new MouseWheel(mouse), zoomBox = new HighlightBox('body'), - buttons = El('div').id('nav-buttons').appendTo(root), zoomTween = new Tween(Tween.sineInOut), shiftDrag = false, - zoomScale = 2.5, - dragStartEvt, _fx, _fy; // zoom foci, [0,1] + zoomScale = 1.5, + zoomScaleMultiplier = 1, + inBtn, outBtn, + dragStartEvt, + _fx, _fy; // zoom foci, [0,1] - gui.addSidebarButton("#home-icon").on('click', function() {ext.reset();}); - gui.addSidebarButton("#zoom-in-icon").on('click', zoomIn); - gui.addSidebarButton("#zoom-out-icon").on('click', zoomOut); + this.setZoomFactor = function(k) { + zoomScaleMultiplier = k || 1; + }; + + if (gui.options.homeControl) { + gui.buttons.addButton("#home-icon").on('click', function() { + if (disabled()) return; + gui.dispatchEvent('map_reset'); + }); + } + + if (gui.options.zoomControl) { + inBtn = gui.buttons.addButton("#zoom-in-icon").on('click', zoomIn); + outBtn = gui.buttons.addButton("#zoom-out-icon").on('click', zoomOut); + ext.on('change', function() { + inBtn.classed('disabled', ext.scale() >= ext.maxScale()); + }); + } + + gui.on('map_reset', function() { + ext.home(); + }); zoomTween.on('change', function(e) { - ext.rescale(e.value, _fx, _fy); + ext.zoomToExtent(e.value, _fx, _fy); }); mouse.on('dblclick', function(e) { - zoomByPct(zoomScale, e.x / ext.width(), e.y / ext.height()); + if (disabled()) return; + zoomByPct(1 + zoomScale * zoomScaleMultiplier, e.x / ext.width(), e.y / ext.height()); }); mouse.on('dragstart', function(e) { + if (disabled()) return; shiftDrag = !!e.shiftKey; if (shiftDrag) { dragStartEvt = e; @@ -40,6 +55,7 @@ function MapNav(root, ext, mouse) { }); mouse.on('drag', function(e) { + if (disabled()) return; if (shiftDrag) { zoomBox.show(e.pageX, e.pageY, dragStartEvt.pageX, dragStartEvt.pageY); } else { @@ -49,6 +65,7 @@ function MapNav(root, ext, mouse) { mouse.on('dragend', function(e) { var bounds; + if (disabled()) return; if (shiftDrag) { shiftDrag = false; bounds = new Bounds(e.x, e.y, dragStartEvt.x, dragStartEvt.y); @@ -60,17 +77,24 @@ function MapNav(root, ext, mouse) { }); wheel.on('mousewheel', function(e) { - var k = 1 + (0.11 * e.multiplier), + var k = 1 + (0.11 * e.multiplier * zoomScaleMultiplier), delta = e.direction > 0 ? k : 1 / k; - ext.rescale(ext.scale() * delta, e.x / ext.width(), e.y / ext.height()); + if (disabled()) return; + ext.zoomByPct(delta, e.x / ext.width(), e.y / ext.height()); }); + function disabled() { + return !!gui.options.disableNavigation; + } + function zoomIn() { - zoomByPct(zoomScale, 0.5, 0.5); + if (disabled()) return; + zoomByPct(1 + zoomScale * zoomScaleMultiplier, 0.5, 0.5); } function zoomOut() { - zoomByPct(1/zoomScale, 0.5, 0.5); + if (disabled()) return; + zoomByPct(1/(1 + zoomScale * zoomScaleMultiplier), 0.5, 0.5); } // @box Bounds with pixels from t,l corner of map area. @@ -84,9 +108,9 @@ function MapNav(root, ext, mouse) { // @pct Change in scale (2 = 2x zoom) // @fx, @fy zoom focus, [0, 1] function zoomByPct(pct, fx, fy) { + var w = ext.getBounds().width(); _fx = fx; _fy = fy; - zoomTween.start(ext.scale(), ext.scale() * pct, 400); + zoomTween.start(w, w / pct, 400); } - } diff --git a/src/gui/mapshaper-map-style.js b/src/gui/mapshaper-map-style.js index d4afdee01..78e84c00a 100644 --- a/src/gui/mapshaper-map-style.js +++ b/src/gui/mapshaper-map-style.js @@ -3,26 +3,33 @@ var MapStyle = (function() { var darkStroke = "#334", lightStroke = "#b7d9ea", - pink = "#f74b80", // dark - pink2 = "rgba(239, 0, 86, 0.16)", // "#ffd9e7", // medium + violet = "#cc6acc", + violetFill = "rgba(249, 170, 249, 0.32)", gold = "#efc100", black = "black", selectionFill = "rgba(237, 214, 0, 0.12)", - hoverFill = "rgba(255, 117, 165, 0.18)", - outlineStyle = { + hoverFill = "rgba(255, 180, 255, 0.2)", + activeStyle = { // outline style for the active layer type: 'outline', strokeColors: [lightStroke, darkStroke], strokeWidth: 0.7, - dotColor: "#223" + dotColor: "#223", + dotSize: 4 }, - referenceStyle = { + activeStyleForLabels = { + dotColor: "rgba(250, 0, 250, 0.45)", // violet dot with transparency + dotSize: 4 + }, + referenceStyle = { // outline style for reference layers type: 'outline', strokeColors: [null, '#86c927'], strokeWidth: 0.85, - dotColor: "#73ba20" + dotColor: "#73ba20", + dotSize: 4 }, - highStyle = { - dotColor: "#F24400" + intersectionStyle = { + dotColor: "#F24400", + dotSize: 4 }, hoverStyles = { polygon: { @@ -65,47 +72,50 @@ var MapStyle = (function() { }, pinnedStyles = { polygon: { - fillColor: pink2, - strokeColor: pink, - strokeWidth: 1.6 + fillColor: violetFill, + strokeColor: violet, + strokeWidth: 1.8 }, point: { - dotColor: pink, + dotColor: 'violet', dotSize: 7 }, polyline: { - strokeColor: pink, + strokeColor: violet, strokeWidth: 3 } }; return { - getHighlightStyle: function(lyr) { - var style = utils.extend({}, highStyle); - var n = internal.countPointsInLayer(lyr); - style.dotSize = n < 20 && 4 || n < 500 && 3 || 2; - return style; + getIntersectionStyle: function(lyr) { + return utils.extend({}, intersectionStyle); }, getReferenceStyle: function(lyr) { - var style = utils.extend({}, referenceStyle); - style.dotSize = calcDotSize(internal.countPointsInLayer(lyr)); + var style; + if (internal.layerHasCanvasDisplayStyle(lyr)) { + style = internal.getCanvasDisplayStyle(lyr); + } else if (internal.layerHasLabels(lyr)) { + style = {dotSize: 0}; // no reference dots if labels are visible + } else { + style = utils.extend({}, referenceStyle); + } return style; }, getActiveStyle: function(lyr) { var style; - if (internal.layerHasSvgDisplayStyle(lyr)) { - style = internal.getSvgDisplayStyle(lyr); + if (internal.layerHasCanvasDisplayStyle(lyr)) { + style = internal.getCanvasDisplayStyle(lyr); + } else if (internal.layerHasLabels(lyr)) { + style = utils.extend({}, activeStyleForLabels); } else { - style = utils.extend({}, outlineStyle); - style.dotSize = calcDotSize(internal.countPointsInLayer(lyr)); + style = utils.extend({}, activeStyle); } return style; }, getOverlayStyle: getOverlayStyle }; - function calcDotSize(n) { - return n < 20 && 5 || n < 500 && 4 || n < 50000 && 3 || 2; - } + // Returns a display style for the overlay layer. This style displays any + // hover or selection affects for the active data layer. function getOverlayStyle(lyr, o) { var type = lyr.geometry_type; var topId = o.id; @@ -117,25 +127,28 @@ var MapStyle = (function() { var overlayStyle = { styler: styler }; - // first layer: selected feature(s) - o.selection_ids.forEach(function(i) { - // skip features in a higher layer - if (i == topId || o.hover_ids.indexOf(i) > -1) return; - ids.push(i); - styles.push(selectionStyles[type]); - }); + // first layer: features that were selected via the -inspect command + // DISABLED after hit control refactor + // o.selection_ids.forEach(function(i) { + // // skip features in a higher layer + // if (i == topId || o.hover_ids.indexOf(i) > -1) return; + // ids.push(i); + // styles.push(selectionStyles[type]); + // }); // second layer: hover feature(s) - o.hover_ids.forEach(function(i) { + // o.hover_ids.forEach(function(i) { + o.ids.forEach(function(i) { var style; if (i == topId) return; - style = o.selection_ids.indexOf(i) > -1 ? selectionHoverStyles[type] : hoverStyles[type]; + style = hoverStyles[type]; + // style = o.selection_ids.indexOf(i) > -1 ? selectionHoverStyles[type] : hoverStyles[type]; ids.push(i); styles.push(style); }); - // top layer: highlighted feature + // top layer: feature that was selected by clicking in inspection mode ([i]) if (topId > -1) { var isPinned = o.pinned; - var inSelection = o.selection_ids.indexOf(topId) > -1; + var inSelection = false; // o.selection_ids.indexOf(topId) > -1; var style; if (isPinned) { style = pinnedStyles[type]; @@ -148,63 +161,90 @@ var MapStyle = (function() { styles.push(style); } - if (internal.layerHasSvgDisplayStyle(lyr)) { + if (internal.layerHasCanvasDisplayStyle(lyr)) { if (type == 'point') { - overlayStyle = internal.wrapHoverStyle(internal.getSvgDisplayStyle(lyr), overlayStyle); + overlayStyle = internal.wrapOverlayStyle(internal.getCanvasDisplayStyle(lyr), overlayStyle); } overlayStyle.type = 'styled'; } overlayStyle.ids = ids; + overlayStyle.overlay = true; return ids.length > 0 ? overlayStyle : null; } - }()); // Modify style to use scaled circle instead of dot symbol -internal.wrapHoverStyle = function(style, hoverStyle) { +internal.wrapOverlayStyle = function(style, hoverStyle) { var styler = function(obj, i) { var dotColor; - style.styler(obj, i); + var id = obj.ids ? obj.ids[i] : -1; + obj.strokeWidth = 0; // kludge to support setting minimum stroke width + style.styler(obj, id); if (hoverStyle.styler) { hoverStyle.styler(obj, i); } dotColor = obj.dotColor; if (obj.radius && dotColor) { - obj.radius += 1.5; - obj.fillColor = dotColor; + obj.radius += 0.4; + // delete obj.fillColor; // only show outline + obj.fillColor = dotColor; // comment out to only highlight stroke obj.strokeColor = dotColor; + obj.strokeWidth = Math.max(obj.strokeWidth + 0.8, 1.5); obj.opacity = 1; } }; return {styler: styler}; }; -internal.getSvgDisplayStyle = function(lyr) { - var records = lyr.data.getRecords(), - fields = internal.getSvgStyleFields(lyr), - index = internal.svgStyles; +internal.getCanvasDisplayStyle = function(lyr) { + var styleIndex = { + opacity: 'opacity', + r: 'radius', + fill: 'fillColor', + stroke: 'strokeColor', + 'stroke-width': 'strokeWidth', + 'stroke-dasharray': 'lineDash' + }, + // array of field names of relevant svg display properties + fields = internal.getCanvasStyleFields(lyr).filter(function(f) {return f in styleIndex;}), + records = lyr.data.getRecords(); var styler = function(style, i) { - var f, key, val; + var rec = records[i]; + var fname, val; for (var j=0; j 0 && !style.strokeWidth && !style.fillColor && lyr.geometry_type == 'point') { style.fillColor = 'black'; } }; return {styler: styler, type: 'styled'}; }; + +// check if layer should be displayed with styles +internal.layerHasCanvasDisplayStyle = function(lyr) { + var fields = internal.getCanvasStyleFields(lyr); + if (lyr.geometry_type == 'point') { + return fields.indexOf('r') > -1; // require 'r' field for point symbols + } + return utils.difference(fields, ['opacity', 'class']).length > 0; +}; + + +internal.getCanvasStyleFields = function(lyr) { + var fields = lyr.data ? lyr.data.getFields() : []; + return internal.svg.findPropertiesBySymbolGeom(fields, lyr.geometry_type); +}; diff --git a/src/gui/mapshaper-map-utils.js b/src/gui/mapshaper-map-utils.js new file mode 100644 index 000000000..d61289a56 --- /dev/null +++ b/src/gui/mapshaper-map-utils.js @@ -0,0 +1,19 @@ + +function getDisplayCoordsById(id, layer, ext) { + var coords = getPointCoordsById(id, layer); + return ext.translateCoords(coords[0], coords[1]); +} + +function getPointCoordsById(id, layer) { + var coords = layer && layer.geometry_type == 'point' && layer.shapes[id]; + if (!coords || coords.length != 1) { + return null; + } + return coords[0]; +} + +function translateDeltaDisplayCoords(dx, dy, ext) { + var a = ext.translatePixelCoords(0, 0); + var b = ext.translatePixelCoords(dx, dy); + return [b[0] - a[0], b[1] - a[1]]; +} diff --git a/src/gui/mapshaper-map.js b/src/gui/mapshaper-map.js index def81328c..65250a258 100644 --- a/src/gui/mapshaper-map.js +++ b/src/gui/mapshaper-map.js @@ -1,82 +1,69 @@ /* @requires mapshaper-gui-lib -mapshaper-maplayer +mapshaper-maplayer2 mapshaper-map-nav mapshaper-map-extent -mapshaper-hit-control -mapshaper-inspection-control mapshaper-map-style +mapshaper-svg-display +mapshaper-layer-stack +mapshaper-layer-sorting +mapshaper-gui-proxy +mapshaper-coordinates-display +mapshaper-hit-control2 +mapshaper-inspection-control2 +mapshaper-symbol-dragging2 */ +utils.inherit(MshpMap, EventDispatcher); -// Test if map should be re-framed to show updated layer -gui.mapNeedsReset = function(newBounds, prevBounds, mapBounds) { - if (!prevBounds) return true; - if (prevBounds.xmin === 0 || newBounds.xmin === 0) return true; // kludge to handle tables - var viewportPct = gui.getIntersectionPct(newBounds, mapBounds); - var contentPct = gui.getIntersectionPct(mapBounds, newBounds); - var boundsChanged = !prevBounds.equals(newBounds); - var inView = newBounds.intersects(mapBounds); - var areaChg = newBounds.area() / prevBounds.area(); - if (!boundsChanged) return false; // don't reset if layer extent hasn't changed - if (!inView) return true; // reset if layer is out-of-view - if (viewportPct < 0.3 && contentPct < 0.9) return true; // reset if content is mostly offscreen - if (areaChg > 1e8 || areaChg < 1e-8) return true; // large area chg, e.g. after projection - return false; -}; +function MshpMap(gui) { + var opts = gui.options, + el = gui.container.findChild('.map-layers').node(), + position = new ElementPosition(el), + model = gui.model, + map = this, + _mouse = new MouseArea(el, position), + _ext = new MapExtent(position), + // _hit = new HitControl(gui, _ext, _mouse), + _hit = new HitControl2(gui, _ext, _mouse), + _visibleLayers = [], // cached visible map layers + _fullBounds = null, + _intersectionLyr, _activeLyr, _overlayLyr, + _inspector, _stack, _nav, _editor, + _dynamicCRS; -// TODO: move to utilities file -gui.getBoundsIntersection = function(a, b) { - var c = new Bounds(); - if (a.intersects(b)) { - c.setBounds(Math.max(a.xmin, b.xmin), Math.max(a.ymin, b.ymin), - Math.min(a.xmax, b.xmax), Math.min(a.ymax, b.ymax)); + _nav = new MapNav(gui, _ext, _mouse); + if (gui.options.showMouseCoordinates) { + new CoordinatesDisplay(gui, _ext, _mouse); } - return c; -}; - -// Returns proportion of bb2 occupied by bb1 -gui.getIntersectionPct = function(bb1, bb2) { - return gui.getBoundsIntersection(bb1, bb2).area() / bb2.area() || 0; -}; + _mouse.disable(); // wait for gui.focus() to activate mouse events + model.on('select', function(e) { + _intersectionLyr = null; + _overlayLyr = null; + }); -function MshpMap(model) { - var _root = El('#mshp-main-map'), - _layers = El('#map-layers'), - _ext = new MapExtent(_layers), - _mouse = new MouseArea(_layers.node()), - _nav = new MapNav(_root, _ext, _mouse), - _inspector = new InspectionControl(model, new HitControl(_ext, _mouse)); - - var _referenceCanv = new DisplayCanvas().appendTo(_layers), // comparison layer - _activeCanv = new DisplayCanvas().appendTo(_layers), // data layer shapes - _overlayCanv = new DisplayCanvas().appendTo(_layers), // hover and selection shapes - _annotationCanv = new DisplayCanvas().appendTo(_layers), // used for line intersections - _annotationLyr, _annotationStyle, - _referenceLyr, _referenceStyle, - _activeLyr, _activeStyle, _overlayStyle; - - _ext.on('change', drawLayers); - - _inspector.on('change', function(e) { - var lyr = _activeLyr.getDisplayLayer().layer; - _overlayStyle = MapStyle.getOverlayStyle(lyr, e); - drawLayer(_activeLyr, _overlayCanv, _overlayStyle); + gui.on('active', function() { + _mouse.enable(); }); - model.on('select', function(e) { - _annotationStyle = null; - _overlayStyle = null; + gui.on('inactive', function() { + _mouse.disable(); }); + // Refresh map display in response to data changes, layer selection, etc. model.on('update', function(e) { - var prevBounds = _activeLyr ?_activeLyr.getBounds() : null, - needReset = false; + var prevLyr = _activeLyr || null; + var fullBounds; + var needReset; + + if (!prevLyr) { + initMap(); // init map extent, resize events, etc. on first call + } + if (arcsMayHaveChanged(e.flags)) { - // regenerate filtered arcs when simplification thresholds are calculated - // or arcs are updated - delete e.dataset.filteredArcs; + // regenerate filtered arcs the next time they are needed for rendering + delete e.dataset.displayArcs; // reset simplification after projection (thresholds have changed) // TODO: preserve simplification pct (need to record pct before change) @@ -85,106 +72,406 @@ function MshpMap(model) { } } - _activeLyr = initActiveLayer(e); - needReset = gui.mapNeedsReset(_activeLyr.getBounds(), prevBounds, _ext.getBounds()); - _ext.setBounds(_activeLyr.getBounds()); // update map extent to match bounds of active group - if (needReset) { - // zoom to full view of the active layer and redraw - _ext.reset(true); - } else { - // refresh without navigating + if (e.flags.simplify_method) { // no redraw needed + return false; + } + + if (e.flags.simplify_amount || e.flags.redraw_only) { // only redraw (slider drag) drawLayers(); + return; } - }); - this.setReferenceLayer = function(lyr, dataset) { - if (lyr) { - _referenceLyr = new DisplayLayer(lyr, dataset, _ext); - _referenceStyle = MapStyle.getReferenceStyle(lyr); - } else if (_referenceLyr) { - _referenceStyle = null; - _referenceLyr = null; + _activeLyr = getMapLayer(e.layer, e.dataset, getDisplayOptions()); + _activeLyr.style = MapStyle.getActiveStyle(_activeLyr.layer); + _activeLyr.active = true; + // if (_inspector) _inspector.updateLayer(_activeLyr); + _hit.setLayer(_activeLyr); + updateVisibleMapLayers(); + fullBounds = getFullBounds(); + if (!prevLyr || !_fullBounds || prevLyr.tabular || _activeLyr.tabular || isFrameView()) { + needReset = true; + } else { + needReset = GUI.mapNeedsReset(fullBounds, _fullBounds, _ext.getBounds()); } - drawLayers(); // draw all layers (reference layer can change how active layer is drawn) - }; + + if (isFrameView()) { + _nav.setZoomFactor(0.05); // slow zooming way down to allow fine-tuning frame placement // 0.03 + _ext.setFrame(getFullBounds()); // TODO: remove redundancy with drawLayers() + needReset = true; // snap to frame extent + } else { + _nav.setZoomFactor(1); + } + _ext.setBounds(fullBounds); // update 'home' button extent + _fullBounds = fullBounds; + if (needReset) { + _ext.reset(); + } + drawLayers(); + map.dispatchEvent('updated'); + }); // Currently used to show dots at line intersections - this.setHighlightLayer = function(lyr, dataset) { + this.setIntersectionLayer = function(lyr, dataset) { if (lyr) { - _annotationLyr = new DisplayLayer(lyr, dataset, _ext); - _annotationStyle = MapStyle.getHighlightStyle(lyr); - drawLayer(_annotationLyr, _annotationCanv, _annotationStyle); + _intersectionLyr = getMapLayer(lyr, dataset, getDisplayOptions()); + _intersectionLyr.style = MapStyle.getIntersectionStyle(_intersectionLyr.layer); } else { - _annotationStyle = null; - _annotationLyr = null; + _intersectionLyr = null; } + _stack.drawOverlay2Layer(_intersectionLyr); // also hides }; - // lightweight way to update simplification of display lines - // TODO: consider handling this as a model update - this.setSimplifyPct = function(pct) { - _activeLyr.setRetainedPct(pct); + this.setInteractivity = function(toOn) { + + }; + + this.setLayerVisibility = function(target, isVisible) { + var lyr = target.layer; + lyr.visibility = isVisible ? 'visible' : 'hidden'; + // if (_inspector && isActiveLayer(lyr)) { + // _inspector.updateLayer(isVisible ? _activeLyr : null); + // } + if (isActiveLayer(lyr)) { + _hit.setLayer(isVisible ? _activeLyr : null); + } + }; + + this.getCenterLngLat = function() { + var bounds = _ext.getBounds(); + var crs = this.getDisplayCRS(); + // TODO: handle case where active layer is a frame layer + if (!bounds.hasBounds() || !crs) { + return null; + } + return internal.toLngLat([bounds.centerX(), bounds.centerY()], crs); + }; + + this.getDisplayCRS = function() { + var crs; + if (_activeLyr && _activeLyr.geographic) { + crs = _activeLyr.dynamic_crs || internal.getDatasetCRS(_activeLyr.source.dataset); + } + return crs || null; + }; + + this.getExtent = function() {return _ext;}; + this.isActiveLayer = isActiveLayer; + this.isVisibleLayer = isVisibleLayer; + + // called by layer menu after layer visibility is updated + this.redraw = function() { + updateVisibleMapLayers(); drawLayers(); }; - function referenceLayerVisible() { - if (!_referenceLyr || - // don't show if same as active layer - _activeLyr && _activeLyr.getLayer() == _referenceLyr.getLayer() || - // or if active layer isn't geographic (kludge) - _activeLyr && !_activeLyr.getLayer().shapes) { - return false; + // Set or clear a CRS to use for display, without reprojecting the underlying dataset(s). + // crs: a CRS object or string, or null to clear the current setting + this.setDisplayCRS = function(crs) { + // TODO: update bounds of frame layer, if there is a frame layer + var oldCRS = this.getDisplayCRS(); + var newCRS = utils.isString(crs) ? internal.getCRS(crs) : crs; + // TODO: handle case that old and new CRS are the same + _dynamicCRS = newCRS; + // clear any stored FilteredArcs objects (so they will be recreated with the desired projection) + gui.model.getDatasets().forEach(function(dataset) { + delete dataset.displayArcs; + }); + + // Reproject all visible map layers + if (_activeLyr) _activeLyr = projectDisplayLayer(_activeLyr, newCRS); + if (_intersectionLyr) _intersectionLyr = projectDisplayLayer(_intersectionLyr, newCRS); + if (_overlayLyr) { + _overlayLyr = projectDisplayLayer(_overlayLyr, newCRS); + } + updateVisibleMapLayers(); // any other display layers will be projected as they are regenerated + + // Update map extent (also triggers redraw) + projectMapExtent(_ext, oldCRS, this.getDisplayCRS(), getFullBounds()); + }; + + function initMap() { + _ext.resize(); + _stack = new LayerStack(gui, el, _ext, _mouse); + gui.buttons.show(); + + _ext.on('change', function(e) { + if (e.reset) return; // don't need to redraw map here if extent has been reset + if (isFrameView()) { + updateFrameExtent(); + } + drawLayers(true); + }); + + if (opts.inspectorControl) { + _inspector = new InspectionControl2(gui, _hit); + _inspector.on('data_change', function(e) { + // refresh the display if a style variable has been changed interactively + if (internal.isSupportedSvgProperty(e.field)) { + drawLayers(); + } + }); } - return true; + + _hit.on('change', function(e) { + // draw highlight effect for hover and select + _overlayLyr = getMapLayerOverlay(_activeLyr, e); + _stack.drawOverlayLayer(_overlayLyr); + }); + _editor = new SymbolDragging2(gui, _ext, _hit); + _editor.on('location_change', function(e) { + // TODO: optimize redrawing + drawLayers(); + }); + + gui.on('resize', function() { + position.update(); // kludge to detect new map size after console toggle + }); } - function initActiveLayer(o) { - var lyr = new DisplayLayer(o.layer, o.dataset, _ext); - _inspector.updateLayer(lyr); - _activeStyle = MapStyle.getActiveStyle(lyr.getDisplayLayer().layer); - return lyr; + function getDisplayOptions() { + return { + crs: _dynamicCRS + }; } // Test if an update may have affected the visible shape of arcs // @flags Flags from update event function arcsMayHaveChanged(flags) { - return flags.presimplify || flags.simplify || flags.proj || flags.arc_count || - flags.repair || flags.clip || flags.erase || flags.slice || flags.affine || false; + return flags.simplify_method || flags.simplify || flags.proj || + flags.arc_count || flags.repair || flags.clip || flags.erase || + flags.slice || flags.affine || flags.rectangle || false; } - function referenceStyle() { - return referenceLayerVisible() ? _referenceStyle : null; + // Update map frame after user navigates the map in frame edit mode + function updateFrameExtent() { + var frameLyr = internal.findFrameLayer(model); + var rec = frameLyr.data.getRecordAt(0); + var viewBounds = _ext.getBounds(); + var w = viewBounds.width() * rec.width / _ext.width(); + var h = w * rec.height / rec.width; + var cx = viewBounds.centerX(); + var cy = viewBounds.centerY(); + rec.bbox = [cx - w/2, cy - h/2, cx + w/2, cy + h/2]; + _ext.setFrame(getFrameData()); + _ext.setBounds(new Bounds(rec.bbox)); + _ext.reset(); } - function activeStyle() { - var style = _activeStyle; - if (referenceLayerVisible() && _activeStyle.type != 'styled') { - style = utils.defaults({ - // kludge to hide ghosted layers - strokeColors: [null, _activeStyle.strokeColors[1]] - }, _activeStyle); + function getFullBounds() { + var b = new Bounds(); + var marginPct = 0.025; + var pad = 1e-4; + if (isPreviewView()) { + return internal.getFrameLayerBounds(internal.findFrameLayer(model)); + } + getDrawableContentLayers().forEach(function(lyr) { + b.mergeBounds(lyr.bounds); + if (isTableView()) { + marginPct = getTableMargin(lyr.layer); + } + }); + if (!b.hasBounds()) { + // assign bounds to empty layers, to prevent rendering errors downstream + b.setBounds(0,0,0,0); } - return style; + // Inflate display bounding box by a tiny amount (gives extent to single-point layers and collapsed shapes) + b.padBounds(pad,pad,pad,pad); + // add margin + b.scale(1 + marginPct * 2); + return b; } - function drawLayers() { - // TODO: consider drawing active and reference layers to the same canvas - drawLayer(_referenceLyr, _referenceCanv, referenceStyle()); - drawLayer(_activeLyr, _overlayCanv, _overlayStyle); - drawLayer(_activeLyr, _activeCanv, activeStyle()); - drawLayer(_annotationLyr, _annotationCanv, _annotationStyle); + // Calculate margin when displaying content at full zoom, as pct of screen size + function getTableMargin(lyr) { + var n = internal.getFeatureCount(lyr); + var pct = 0.04; + if (n < 5) { + pct = 0.2; + } else if (n < 100) { + pct = 0.1; + } + return pct; } - function drawLayer(lyr, canv, style) { - if (style) { - canv.prep(_ext); - lyr.draw(canv, style); - } else { - canv.hide(); + function isActiveLayer(lyr) { + return _activeLyr && lyr == _activeLyr.source.layer || false; + } + + function isVisibleLayer(lyr) { + if (isActiveLayer(lyr)) { + return lyr.visibility != 'hidden'; + } + return lyr.visibility == 'visible'; + } + + function isVisibleDataLayer(lyr) { + return isVisibleLayer(lyr) && !internal.isFurnitureLayer(lyr); + } + + function isFrameLayer(lyr) { + return !!(lyr && lyr == internal.findFrameLayer(model)); + } + + function isTableView() { + return !isPreviewView() && !!_activeLyr.tabular; + } + + function isPreviewView() { + var frameLyr = internal.findFrameLayer(model); + return !!frameLyr; // && isVisibleLayer(frameLyr) + } + + // Frame view means frame layer is visible and active (selected) + function isFrameView() { + var frameLyr = internal.findFrameLayer(model); + return isActiveLayer(frameLyr) && isVisibleLayer(frameLyr); + } + + function getFrameData() { + var frameLyr = internal.findFrameLayer(model); + return frameLyr && internal.getFurnitureLayerData(frameLyr) || null; + } + + function updateVisibleMapLayers() { + var layers = []; + model.getLayers().forEach(function(o) { + if (!isVisibleLayer(o.layer)) return; + if (isActiveLayer(o.layer)) { + layers.push(_activeLyr); + } else if (!isTableView()) { + layers.push(getMapLayer(o.layer, o.dataset, getDisplayOptions())); + } + }); + _visibleLayers = layers; + } + + function getVisibleMapLayers() { + return _visibleLayers; + } + + function findActiveLayer(layers) { + return layers.filter(function(o) { + return o == _activeLyr; + }); + } + + function getDrawableContentLayers() { + var layers = getVisibleMapLayers(); + if (isTableView()) return findActiveLayer(layers); + return layers.filter(function(o) { + return !!o.geographic; + }); + } + + function getDrawableFurnitureLayers(layers) { + if (!isPreviewView()) return []; + return getVisibleMapLayers().filter(function(o) { + return internal.isFurnitureLayer(o); + }); + } + + function updateLayerStyles(layers) { + layers.forEach(function(mapLayer, i) { + if (mapLayer.active) { + // style is already assigned + if (mapLayer.style.type != 'styled' && layers.length > 1 && mapLayer.style.strokeColors) { + // kludge to hide ghosted layers when reference layers are present + // TODO: consider never showing ghosted layers (which appear after + // commands like dissolve and filter). + mapLayer.style = utils.defaults({ + strokeColors: [null, mapLayer.style.strokeColors[1]] + }, mapLayer.style); + } + } else { + if (mapLayer.layer == _activeLyr.layer) { + console.error("Error: shared map layer"); + } + mapLayer.style = MapStyle.getReferenceStyle(mapLayer.layer); + } + }); + } + + function sortMapLayers(layers) { + layers.sort(function(a, b) { + // assume that each layer has a stack_id (assigned by updateLayerStackOrder()) + return a.source.layer.stack_id - b.source.layer.stack_id; + }); + } + + // onlyNav (bool): only map extent has changed, symbols are unchanged + function drawLayers(onlyNav) { + var contentLayers = getDrawableContentLayers(); + var furnitureLayers = getDrawableFurnitureLayers(); + if (!(_ext.width() > 0 && _ext.height() > 0)) { + // TODO: track down source of these errors + console.error("[drawLayers()] Collapsed map container, unable to draw."); + return; } + if (!onlyNav) { + // kludge to handle layer visibility toggling + _ext.setFrame(isPreviewView() ? getFrameData() : null); + _ext.setBounds(getFullBounds()); + updateLayerStyles(contentLayers); + // update stack_id property of all layers + internal.updateLayerStackOrder(model.getLayers()); + } + sortMapLayers(contentLayers); + _stack.drawContentLayers(contentLayers, onlyNav); + // draw intersection dots + _stack.drawOverlay2Layer(_intersectionLyr); + // draw hover & selection effects + _stack.drawOverlayLayer(_overlayLyr); + // _stack.drawFurnitureLayers(furnitureLayers, onlyNav); + _stack.drawFurnitureLayers(furnitureLayers); // re-render on nav, because scalebars + } +} +function getMapLayerOverlay(obj, e) { + var style = MapStyle.getOverlayStyle(obj.layer, e); + if (!style) return null; + return utils.defaults({ + layer: filterLayerByIds(obj.layer, style.ids), + style: style + }, obj); +} + +function filterLayerByIds(lyr, ids) { + var shapes; + if (lyr.shapes) { + shapes = ids.map(function(id) { + return lyr.shapes[id]; + }); + return utils.defaults({shapes: shapes}, lyr); } + return lyr; } -utils.inherit(MshpMap, EventDispatcher); +// Test if map should be re-framed to show updated layer +GUI.mapNeedsReset = function(newBounds, prevBounds, mapBounds) { + var viewportPct = GUI.getIntersectionPct(newBounds, mapBounds); + var contentPct = GUI.getIntersectionPct(mapBounds, newBounds); + var boundsChanged = !prevBounds.equals(newBounds); + var inView = newBounds.intersects(mapBounds); + var areaChg = newBounds.area() / prevBounds.area(); + if (!boundsChanged) return false; // don't reset if layer extent hasn't changed + if (!inView) return true; // reset if layer is out-of-view + if (viewportPct < 0.3 && contentPct < 0.9) return true; // reset if content is mostly offscreen + if (areaChg > 1e8 || areaChg < 1e-8) return true; // large area chg, e.g. after projection + return false; +}; + +// TODO: move to utilities file +GUI.getBoundsIntersection = function(a, b) { + var c = new Bounds(); + if (a.intersects(b)) { + c.setBounds(Math.max(a.xmin, b.xmin), Math.max(a.ymin, b.ymin), + Math.min(a.xmax, b.xmax), Math.min(a.ymax, b.ymax)); + } + return c; +}; + +// Returns proportion of bb2 occupied by bb1 +GUI.getIntersectionPct = function(bb1, bb2) { + return GUI.getBoundsIntersection(bb1, bb2).area() / bb2.area() || 0; +}; diff --git a/src/gui/mapshaper-maplayer.js b/src/gui/mapshaper-maplayer.js deleted file mode 100644 index 2bd87b83c..000000000 --- a/src/gui/mapshaper-maplayer.js +++ /dev/null @@ -1,177 +0,0 @@ -/* @requires mapshaper-canvas, mapshaper-gui-shapes, mapshaper-gui-table */ - -function DisplayLayer(lyr, dataset, ext) { - var _displayBounds; - var _arcFlags; - - this.getLayer = function() {return lyr;}; - - this.getBounds = function() { - return _displayBounds; - }; - - this.setRetainedPct = function(pct) { - var arcs = dataset.filteredArcs || dataset.arcs; - if (arcs) { - arcs.setRetainedPct(pct); - } - }; - - // @ext map extent - this.getDisplayLayer = function() { - var arcs = lyr.display.arcs, - layer = lyr.display.layer || lyr; - if (!arcs) { - // use filtered arcs if available & map extent is known - arcs = dataset.filteredArcs ? - dataset.filteredArcs.getArcCollection(ext) : dataset.arcs; - } - return { - layer: layer, - dataset: {arcs: arcs}, - geographic: layer == lyr // false if using table-only shapes - }; - }; - - this.draw = function(canv, style) { - if (style.type == 'outline') { - this.drawStructure(canv, style); - } else { - this.drawShapes(canv, style); - } - }; - - this.drawStructure = function(canv, style) { - var obj = this.getDisplayLayer(ext); - var arcs = obj.dataset.arcs; - var darkStyle = {strokeWidth: style.strokeWidth, strokeColor: style.strokeColors[1]}, - lightStyle = {strokeWidth: style.strokeWidth, strokeColor: style.strokeColors[0]}; - var filter; - - if (arcs && _arcFlags) { - if (lightStyle.strokeColor) { - filter = getArcFilter(arcs, ext, _arcFlags, 0); - canv.drawArcs(arcs, lightStyle, filter); - } - if (darkStyle.strokeColor) { - filter = getArcFilter(arcs, ext, _arcFlags, 1); - canv.drawArcs(arcs, darkStyle, filter); - } - } - if (obj.layer.geometry_type == 'point') { - canv.drawSquareDots(obj.layer.shapes, style); - } - }; - - this.drawShapes = function(canv, style) { - // TODO: add filter for out-of-view shapes - var obj = this.getDisplayLayer(ext); - var lyr = style.ids ? filterLayer(obj.layer, style.ids) : obj.layer; - if (lyr.geometry_type == 'point') { - if (style.type == 'styled') { - canv.drawPoints(lyr.shapes, style); - } else { - canv.drawSquareDots(lyr.shapes, style); - } - } else { - canv.drawPathShapes(lyr.shapes, obj.dataset.arcs, style); - } - }; - - function getArcFilter(arcs, ext, flags, flag) { - var minPathLen = 0.5 * ext.getPixelSize(), - geoBounds = ext.getBounds(), - geoBBox = geoBounds.toArray(), - allIn = geoBounds.contains(arcs.getBounds()), - visible; - // don't continue dropping paths if user zooms out farther than full extent - if (ext.scale() < 1) minPathLen *= ext.scale(); - return function(i) { - var visible = true; - if (flags[i] != flag) { - visible = false; - } else if (arcs.arcIsSmaller(i, minPathLen)) { - visible = false; - } else if (!allIn && !arcs.arcIntersectsBBox(i, geoBBox)) { - visible = false; - } - return visible; - }; - } - - function filterLayer(lyr, ids) { - if (lyr.shapes) { - shapes = ids.map(function(id) { - return lyr.shapes[id]; - }); - return utils.defaults({shapes: shapes}, lyr); - } - return lyr; - } - - function initArcFlags(self) { - var o = self.getDisplayLayer(); - if (o.dataset.arcs && internal.layerHasPaths(o.layer)) { - _arcFlags = new Uint8Array(o.dataset.arcs.size()); - // Arcs belonging to at least one path are flagged 1, others 0 - internal.countArcsInShapes(o.layer.shapes, _arcFlags); - for (var i=0, n=_arcFlags.length; i 0 || !arcBounds.hasBounds()) { - bounds = lyrBounds; - } else { - // if a point layer has no extent (e.g. contains only a single point), - // then merge with arc bounds, to place the point in context. - bounds = arcBounds.mergeBounds(lyrBounds); - } - } - } - - // If a layer has collapsed, inflate it by a default amount - if (bounds.width() === 0) { - bounds.xmin = (bounds.centerX() || 0) - 1; - bounds.xmax = bounds.xmin + 2; - } - if (bounds.height() === 0) { - bounds.ymin = (bounds.centerY() || 0) - 1; - bounds.ymax = bounds.ymin + 2; - } - return bounds; -} diff --git a/src/gui/mapshaper-maplayer2.js b/src/gui/mapshaper-maplayer2.js new file mode 100644 index 000000000..1f3e9ddc9 --- /dev/null +++ b/src/gui/mapshaper-maplayer2.js @@ -0,0 +1,89 @@ +/* @requires mapshaper-canvas, mapshaper-gui-shapes, mapshaper-gui-table, mapshaper-dynamic-crs */ + +// Wrap a layer in an object along with information needed for rendering +function getMapLayer(layer, dataset, opts) { + var obj = { + layer: null, + arcs: null, + // display_arcs: null, + style: null, + source: { + layer: layer, + dataset: dataset + }, + empty: internal.getFeatureCount(layer) === 0 + }; + + var sourceCRS = opts.crs && internal.getDatasetCRS(dataset); // get src iff display CRS is given + var displayCRS = opts.crs || null; + var arcs = dataset.arcs; + + // Assume that dataset.displayArcs is in the display CRS + // (it should have been deleted upstream if reprojected is needed) + if (arcs && !dataset.displayArcs) { + // project arcs, if needed + if (needReprojectionForDisplay(sourceCRS, displayCRS)) { + arcs = projectArcsForDisplay(arcs, sourceCRS, displayCRS); + } + + // init filtered arcs, if needed + dataset.displayArcs = new FilteredArcCollection(arcs); + } + + if (internal.layerHasFurniture(layer)) { + obj.furniture = true; + obj.furniture_type = internal.getFurnitureLayerType(layer); + obj.layer = layer; + // treating furniture layers (other than frame) as tabular for now, + // so there is something to show if they are selected + obj.tabular = obj.furniture_type != 'frame'; + } else if (obj.empty) { + obj.layer = {shapes: []}; // ideally we should avoid empty layers + } else if (!layer.geometry_type) { + obj.tabular = true; + } else { + obj.geographic = true; + obj.layer = layer; + obj.arcs = arcs; // replaced by filtered arcs during render sequence + } + + if (obj.tabular) { + utils.extend(obj, getDisplayLayerForTable(layer.data)); + } + + // dynamic reprojection (arcs were already reprojected above) + if (obj.geographic && needReprojectionForDisplay(sourceCRS, displayCRS)) { + obj.dynamic_crs = displayCRS; + if (internal.layerHasPoints(layer)) { + obj.layer = projectPointsForDisplay(layer, sourceCRS, displayCRS); + } + } + + obj.bounds = getDisplayBounds(obj.layer, obj.arcs); + return obj; +} + + +function getDisplayBounds(lyr, arcs) { + var arcBounds = arcs ? arcs.getBounds() : new Bounds(), + bounds = arcBounds, // default display extent: all arcs in the dataset + lyrBounds; + + if (lyr.geometry_type == 'point') { + lyrBounds = internal.getLayerBounds(lyr); + if (lyrBounds && lyrBounds.hasBounds()) { + if (lyrBounds.area() > 0 || !arcBounds.hasBounds()) { + bounds = lyrBounds; + } else { + // if a point layer has no extent (e.g. contains only a single point), + // then merge with arc bounds, to place the point in context. + bounds = arcBounds.mergeBounds(lyrBounds); + } + } + } + + if (!bounds || !bounds.hasBounds()) { // empty layer + bounds = new Bounds(); + } + return bounds; +} diff --git a/src/gui/mapshaper-mode-button.js b/src/gui/mapshaper-mode-button.js index 98fcce9b2..d81e4b867 100644 --- a/src/gui/mapshaper-mode-button.js +++ b/src/gui/mapshaper-mode-button.js @@ -1,9 +1,9 @@ /* @requires mapshaper-gui-lib */ -function ModeButton(el, name) { +function ModeButton(modes, el, name) { var btn = El(el), active = false; - gui.on('mode', function(e) { + modes.on('mode', function(e) { active = e.name == name; if (active) { btn.addClass('active'); @@ -13,6 +13,6 @@ function ModeButton(el, name) { }); btn.on('click', function() { - gui.enterMode(active ? null : name); + modes.enterMode(active ? null : name); }); } diff --git a/src/gui/mapshaper-popup.js b/src/gui/mapshaper-popup.js index 0c8011869..6a8871549 100644 --- a/src/gui/mapshaper-popup.js +++ b/src/gui/mapshaper-popup.js @@ -1,37 +1,64 @@ /* @requires mapshaper-gui-lib */ - -function Popup() { - var parent = El('#mshp-main-map'); +// @onNext: handler for switching between multiple records +function Popup(gui, onNext, onPrev) { + var self = new EventDispatcher(); + var parent = gui.container.findChild('.mshp-main-map'); var el = El('div').addClass('popup').appendTo(parent).hide(); - // var head = El('div').addClass('popup-head').appendTo(el).text('Feature 1 of 5 next prev'); var content = El('div').addClass('popup-content').appendTo(el); + // multi-hit display and navigation + var tab = El('div').addClass('popup-tab').appendTo(el).hide(); + var nav = El('div').addClass('popup-nav').appendTo(tab); + var prevLink = El('span').addClass('popup-nav-arrow colored-text').appendTo(nav).text('◀'); + var navInfo = El('span').addClass('popup-nav-info').appendTo(nav); + var nextLink = El('span').addClass('popup-nav-arrow colored-text').appendTo(nav).text('▶'); + + nextLink.on('click', onNext); + prevLink.on('click', onPrev); - this.show = function(rec, table, editable) { + self.show = function(id, ids, table, pinned, editable) { + var rec = table ? (editable ? table.getRecordAt(id) : table.getReadOnlyRecordAt(id)) : {}; var maxHeight = parent.node().clientHeight - 36; - this.hide(); // clean up if panel is already open + self.hide(); // clean up if panel is already open render(content, rec, table, editable); + if (ids && ids.length > 1) { + showNav(id, ids, pinned); + } else { + tab.hide(); + } el.show(); if (content.node().clientHeight > maxHeight) { content.css('height:' + maxHeight + 'px'); } }; - this.hide = function() { + self.hide = function() { // make sure any pending edits are made before re-rendering popup // TODO: only blur popup fields - gui.blurActiveElement(); + GUI.blurActiveElement(); content.empty(); content.node().removeAttribute('style'); // remove inline height el.hide(); }; + return self; + + function showNav(id, ids, pinned) { + var num = ids.indexOf(id) + 1; + navInfo.text(' ' + num + ' / ' + ids.length + ' '); + nextLink.css('display', pinned ? 'inline-block' : 'none'); + prevLink.css('display', pinned && ids.length > 2 ? 'inline-block' : 'none'); + tab.show(); + } + function render(el, rec, table, editable) { var tableEl = El('table').addClass('selectable'), rows = 0; utils.forEachProperty(rec, function(v, k) { - var type = internal.getFieldType(v, k, table); + var type; + // missing GeoJSON fields are set to undefined on import; skip these if (v !== undefined) { + type = internal.getFieldType(v, k, table); renderRow(tableEl, rec, k, type, editable); rows++; } @@ -39,7 +66,11 @@ function Popup() { if (rows > 0) { tableEl.appendTo(el); } else { - el.html('
This layer is missing attribute data.
'); + // Some individual features can have undefined values for some or all of + // their data properties (properties are set to undefined when an input JSON file + // has inconsistent fields, or after force-merging layers with inconsistent fields). + el.html(utils.format('
This %s is missing attribute data.
', + table && table.getFields().length > 0 ? 'feature': 'layer')); } } @@ -82,11 +113,12 @@ function Popup() { // invalid value; revert to previous value input.value(strval); } else { - // field content has changed; + // field content has changed strval = strval2; rec[key] = val2; input.value(strval); setFieldClass(el, val2, type); + self.dispatchEvent('update', {field: key, value: val2}); } }); } @@ -143,5 +175,5 @@ internal.getInputParser = function(type) { internal.getFieldType = function(val, key, table) { // if a field has a null value, look at entire column to identify type - return internal.getValueType(val) || internal.getColumnType(key, table); + return internal.getValueType(val) || internal.getColumnType(key, table.getRecords()); }; diff --git a/src/gui/mapshaper-progress-bar.js b/src/gui/mapshaper-progress-bar.js deleted file mode 100644 index fed39a077..000000000 --- a/src/gui/mapshaper-progress-bar.js +++ /dev/null @@ -1,49 +0,0 @@ -/* @requires mapshaper-gui-lib */ - -function ProgressBar(el) { - var size = 80, - posCol = '#285d7e', - negCol = '#bdced6', - outerRadius = size / 2, - innerRadius = outerRadius / 2, - cx = outerRadius, - cy = outerRadius, - bar = El('div').addClass('progress-bar'), - canv = El('canvas').appendTo(bar).node(), - ctx = canv.getContext('2d'), - msg = El('div').appendTo(bar); - - canv.width = size; - canv.height = size; - - this.appendTo = function(el) { - bar.appendTo(el); - }; - - this.update = function(pct, str) { - var twoPI = Math.PI * 2; - ctx.clearRect(0, 0, size, size); - if (pct > 0) { - drawCircle(negCol, outerRadius, twoPI); - drawCircle(posCol, outerRadius, twoPI * pct); - drawCircle(null, innerRadius, twoPI); - } - msg.html(str || ''); - }; - - this.remove = function() { - bar.remove(); - }; - - function drawCircle(color, radius, radians) { - var halfPI = Math.PI / 2; - if (!color) ctx.globalCompositeOperation = 'destination-out'; - ctx.fillStyle = color || '#000'; - ctx.beginPath(); - ctx.moveTo(cx, cy); - ctx.arc(cx, cy, radius, -halfPI, radians - halfPI, false); - ctx.closePath(); - ctx.fill(); - if (!color) ctx.globalCompositeOperation = 'source-over'; - } -} diff --git a/src/gui/mapshaper-progress-message.js b/src/gui/mapshaper-progress-message.js deleted file mode 100644 index e128710a0..000000000 --- a/src/gui/mapshaper-progress-message.js +++ /dev/null @@ -1,13 +0,0 @@ -/* @requires mapshaper-gui-lib */ - -gui.showProgressMessage = function(msg) { - if (!gui.progressMessage) { - gui.progressMessage = El('div').id('progress-message') - .appendTo('body'); - } - El('
').text(msg).appendTo(gui.progressMessage.empty().show()); -}; - -gui.clearProgressMessage = function() { - if (gui.progressMessage) gui.progressMessage.hide(); -}; diff --git a/src/gui/mapshaper-queue-sync.js b/src/gui/mapshaper-queue-sync.js deleted file mode 100644 index 637c1f942..000000000 --- a/src/gui/mapshaper-queue-sync.js +++ /dev/null @@ -1,21 +0,0 @@ -// Run a series of tasks in sequence. Each task can be run after a timeout. -gui.queueSync = function() { - var tasks = [], - timeouts = []; - function runNext() { - if (tasks.length > 0) { - setTimeout(function() { - tasks.shift()(); - runNext(); - }, timeouts.shift()); - } - } - return { - defer: function(task, timeout) { - tasks.push(task); - timeouts.push(timeout | 0); - return this; - }, - run: runNext - }; -}; diff --git a/src/gui/mapshaper-repair-control.js b/src/gui/mapshaper-repair-control.js index 0777511b5..3597598dc 100644 --- a/src/gui/mapshaper-repair-control.js +++ b/src/gui/mapshaper-repair-control.js @@ -1,100 +1,109 @@ /* @requires mapshaper-gui-lib */ -function RepairControl(model, map) { - var el = El("#intersection-display"), - readout = el.findChild("#intersection-count"), - btn = el.findChild("#repair-btn"), - _self = this, - _dataset, _currXX; +function RepairControl(gui) { + var map = gui.map, + model = gui.model, + el = gui.container.findChild(".intersection-display"), + readout = el.findChild(".intersection-count"), + repairBtn = el.findChild(".repair-btn"), + // keeping a reference to current arcs and intersections, so intersections + // don't need to be recalculated when 'repair' button is pressed. + _currArcs, + _currXX; + + gui.on('simplify_drag_start', hide); + gui.on('simplify_drag_end', updateAsync); model.on('update', function(e) { - if (e.flags.simplify || e.flags.proj || e.flags.arc_count || e.flags.affine) { - // these changes require nulling out any cached intersection data and recalculating - if (_dataset) { - _dataset.info.intersections = null; - _dataset = null; - _self.hide(); - } - delayedUpdate(); - } else if (e.flags.select) { - _self.hide(); - if (!e.flags.import) { - // Don't recalculate if a dataset was just imported -- another layer may be - // selected right away. - reset(); - delayedUpdate(); + var flags = e.flags; + var needUpdate = flags.simplify || flags.proj || flags.arc_count || + flags.affine || flags.points || flags['merge-layers'] || flags.select; + if (needUpdate) { + if (flags.select) { + // preserve cached intersections + } else { + // delete any cached intersection data + e.dataset.info.intersections = null; } + updateAsync(); } }); - gui.on('mode', function(e) { - if (e.prev == 'import') { - // update if import just finished and a new dataset is being edited - delayedUpdate(); - } - }); - - btn.on('click', function() { - var fixed = internal.repairIntersections(_dataset.arcs, _currXX); - showIntersections(fixed); - btn.addClass('disabled'); + repairBtn.on('click', function() { + var fixed = internal.repairIntersections(_currArcs, _currXX); + showIntersections(fixed, _currArcs); + repairBtn.addClass('disabled'); model.updated({repair: true}); }); - this.hide = function() { + function hide() { el.hide(); - map.setHighlightLayer(null); - }; + map.setIntersectionLayer(null); + } + + function enabledForDataset(dataset) { + var info = dataset.info || {}; + var opts = info.import_options || {}; + return !opts.no_repair && !info.no_intersections; + } + + // Delay intersection calculation, so map can redraw after previous + // operation (e.g. layer load, simplification change) + function updateAsync() { + reset(); + setTimeout(updateSync, 10); + } - // Detect and display intersections for current level of arc simplification - this.update = function() { - var XX, showBtn, pct; - if (!_dataset) return; - if (_dataset.arcs.getRetainedInterval() > 0) { + function updateSync() { + var e = model.getActiveLayer(); + var dataset = e.dataset; + var arcs = dataset && dataset.arcs; + var XX, showBtn; + if (!arcs || !internal.layerHasPaths(e.layer) || !enabledForDataset(dataset)) return; + if (arcs.getRetainedInterval() > 0) { // TODO: cache these intersections - XX = internal.findSegmentIntersections(_dataset.arcs); + XX = internal.findSegmentIntersections(arcs); showBtn = XX.length > 0; } else { // no simplification - XX = _dataset.info.intersections; + XX = dataset.info.intersections; if (!XX) { // cache intersections at 0 simplification, to avoid recalculating // every time the simplification slider is set to 100% or the layer is selected at 100% - XX = _dataset.info.intersections = internal.findSegmentIntersections(_dataset.arcs); + XX = dataset.info.intersections = internal.findSegmentIntersections(arcs); } showBtn = false; } el.show(); - showIntersections(XX); - btn.classed('disabled', !showBtn); - }; - - function delayedUpdate() { - setTimeout(function() { - var e = model.getActiveLayer(); - if (e.dataset && e.dataset != _dataset && !e.dataset.info.no_repair && - internal.layerHasPaths(e.layer)) { - _dataset = e.dataset; - _self.update(); - } - }, 10); + showIntersections(XX, arcs); + repairBtn.classed('disabled', !showBtn); } function reset() { - _dataset = null; + _currArcs = null; _currXX = null; - _self.hide(); + hide(); + } + + function dismiss() { + var dataset = model.getActiveLayer().dataset; + dataset.info.intersections = null; + dataset.info.no_intersections = true; + reset(); } - function showIntersections(XX) { + function showIntersections(XX, arcs) { var n = XX.length, pointLyr; _currXX = XX; + _currArcs = arcs; if (n > 0) { + // console.log("first intersection:", internal.getIntersectionDebugData(XX[0], arcs)); pointLyr = {geometry_type: 'point', shapes: [internal.getIntersectionPoints(XX)]}; - map.setHighlightLayer(pointLyr, {layers:[pointLyr]}); - readout.text(utils.format("%s line intersection%s", n, utils.pluralSuffix(n))); + map.setIntersectionLayer(pointLyr, {layers:[pointLyr]}); + readout.html(utils.format('%s line intersection%s ', n, utils.pluralSuffix(n))); + readout.findChild('.close-btn').on('click', dismiss); } else { - map.setHighlightLayer(null); - readout.text(''); + map.setIntersectionLayer(null); + readout.html(''); } } } diff --git a/src/gui/mapshaper-shape-hit.js b/src/gui/mapshaper-shape-hit.js new file mode 100644 index 000000000..68869a9f6 --- /dev/null +++ b/src/gui/mapshaper-shape-hit.js @@ -0,0 +1,179 @@ + + +function getShapeHitTest(displayLayer, ext) { + var geoType = displayLayer.layer.geometry_type; + var test; + if (geoType == 'point' && displayLayer.style.type == 'styled') { + test = getGraduatedCircleTest(getRadiusFunction(displayLayer.style)); + } else if (geoType == 'point') { + test = pointTest; + } else if (geoType == 'polyline') { + test = polylineTest; + } else if (geoType == 'polygon') { + test = polygonTest; + } else { + error("Unexpected geometry type:", geoType); + } + return test; + + // Convert pixel distance to distance in coordinate units. + function getHitBuffer(pix) { + return pix / ext.getTransform().mx; + } + + // reduce hit threshold when zoomed out + function getHitBuffer2(pix, minPix) { + var scale = ext.scale(); + if (scale < 1) { + pix *= scale; + } + if (minPix > 0 && pix < minPix) pix = minPix; + return getHitBuffer(pix); + } + + function polygonTest(x, y) { + var maxDist = getHitBuffer2(5, 1), + cands = findHitCandidates(x, y, maxDist), + hits = [], + cand, hitId; + for (var i=0; i 0 && hits.length === 0) { + // secondary detection: proximity, if not inside a polygon + sortByDistance(x, y, cands, displayLayer.arcs); + hits = pickNearestCandidates(cands, 0, maxDist); + } + return hits; + } + + function pickNearestCandidates(sorted, bufDist, maxDist) { + var hits = [], + cand, minDist; + for (var i=0; i bufDist) { + break; + } + hits.push(cand.id); + } + return hits; + } + + function polylineTest(x, y) { + var maxDist = getHitBuffer2(15, 2), + bufDist = getHitBuffer2(0.05), // tiny threshold for hitting almost-identical lines + cands = findHitCandidates(x, y, maxDist); + sortByDistance(x, y, cands, displayLayer.arcs); + return pickNearestCandidates(cands, bufDist, maxDist); + } + + function sortByDistance(x, y, cands, arcs) { + for (var i=0; i limit * limit) return; + rpix = radius(id); + r = getHitBuffer(rpix + 1); // increase effective radius to make small bubbles easier to hit in clusters + d = Math.sqrt(distSq) - r; // pointer distance from edge of circle (negative = inside) + isOver = d < 0; + isNear = d < margin; + if (!isNear || rpix > 0 === false) { + isHit = false; + } else if (hits.length === 0) { + isHit = isNear; + } else if (!directHit && isOver) { + isHit = true; + } else if (directHit && isOver) { + isHit = r == hitRadius ? d <= hitDist : r < hitRadius; // smallest bubble wins if multiple direct hits + } else if (!directHit && !isOver) { + // closest to bubble edge wins + isHit = hitDist == d ? r <= hitRadius : d < hitDist; // closest bubble wins if multiple indirect hits + } + if (isHit) { + if (hits.length > 0 && (r != hitRadius || d != hitDist)) { + hits = []; + } + hitRadius = r; + hitDist = d; + directHit = isOver; + hits.push(id); + } + }); + return hits; + }; + } + + function findHitCandidates(x, y, dist) { + var arcs = displayLayer.arcs, + index = {}, + cands = [], + bbox = []; + displayLayer.layer.shapes.forEach(function(shp, shpId) { + var cand; + for (var i = 0, n = shp && shp.length; i < n; i++) { + arcs.getSimpleShapeBounds2(shp[i], bbox); + if (x + dist < bbox[0] || x - dist > bbox[2] || + y + dist < bbox[1] || y - dist > bbox[3]) { + continue; // bbox non-intersection + } + cand = index[shpId]; + if (!cand) { + cand = index[shpId] = {shape: [], id: shpId, dist: 0}; + cands.push(cand); + } + cand.shape.push(shp[i]); + } + }); + return cands; + } +} diff --git a/src/gui/mapshaper-sidebar-buttons.js b/src/gui/mapshaper-sidebar-buttons.js new file mode 100644 index 000000000..31aa00259 --- /dev/null +++ b/src/gui/mapshaper-sidebar-buttons.js @@ -0,0 +1,52 @@ + +function SidebarButtons(gui) { + var root = gui.container.findChild('.mshp-main-map'); + var buttons = El('div').addClass('nav-buttons').appendTo(root).hide(); + var _hidden = false; + gui.on('active', updateVisibility); + gui.on('inactive', updateVisibility); + + // @iconRef: selector for an (svg) button icon + this.addButton = function(iconRef) { + var btn = initButton(iconRef).addClass('nav-btn'); + btn.appendTo(buttons); + return btn; + }; + + this.addDoubleButton = function(icon1Ref, icon2Ref) { + var btn1 = initButton(icon1Ref).addClass('nav-btn'); + var btn2 = initButton(icon2Ref).addClass('nav-sub-btn'); + var wrapper = El('div').addClass('nav-btn-wrapper'); + btn1.appendTo(wrapper); + btn2.appendTo(wrapper); + wrapper.appendTo(buttons); + return [btn1, btn2]; + }; + + this.show = function() { + _hidden = false; + updateVisibility(); + }; + + this.hide = function() { + _hidden = true; + updateVisibility(); + }; + + function updateVisibility() { + if (GUI.isActiveInstance(gui) && !_hidden) { + buttons.show(); + } else { + buttons.hide(); + } + } + + function initButton(iconRef) { + var icon = El('body').findChild(iconRef).node().cloneNode(true); + var btn = El('div') + .on('dblclick', function(e) {e.stopPropagation();}); // block dblclick zoom + btn.appendChild(icon); + if (icon.hasAttribute('id')) icon.removeAttribute('id'); + return btn; + } +} diff --git a/src/gui/mapshaper-simplify-control.js b/src/gui/mapshaper-simplify-control.js index 995a96b85..e23e4a069 100644 --- a/src/gui/mapshaper-simplify-control.js +++ b/src/gui/mapshaper-simplify-control.js @@ -1,14 +1,39 @@ -/* @requires mapshaper-elements, mapshaper-mode-button, mapshaper-slider */ +/* @requires mapshaper-elements, mapshaper-slider, mapshaper-simplify-pct */ -var SimplifyControl = function(model) { - var control = new EventDispatcher(); +/* +How changes in the simplify control should affect other components + +data calculated, 100% simplification + -> [map] filtered arcs update + +data calculated, <100% simplification + -> [map] filtered arcs update, redraw; [repair] intersection update + +change via text field + -> [map] redraw; [repair] intersection update + +slider drag start + -> [repair] hide display + +slider drag + -> [map] redraw + +slider drag end + -> [repair] intersection update + +*/ + +var SimplifyControl = function(gui) { + var model = gui.model; + var control = {}; var _value = 1; - var el = El('#simplify-control-wrapper'); - var menu = El('#simplify-options'); - var slider, text; + var el = gui.container.findChild('.simplify-control-wrapper'); + var menu = gui.container.findChild('.simplify-options'); + var slider, text, fromPct; - new SimpleButton('#simplify-options .submit-btn').on('click', onSubmit); - new SimpleButton('#simplify-options .cancel-btn').on('click', function() { + // init settings menu + new SimpleButton(menu.findChild('.submit-btn').addClass('default-btn')).on('click', onSubmit); + new SimpleButton(menu.findChild('.cancel-btn')).on('click', function() { if (el.visible()) { // cancel just hides menu if slider is visible menu.hide(); @@ -16,39 +41,42 @@ var SimplifyControl = function(model) { gui.clearMode(); } }); - new SimpleButton('#simplify-settings-btn').on('click', function() { + new SimpleButton(el.findChild('.simplify-settings-btn')).on('click', function() { if (menu.visible()) { menu.hide(); } else { - initMenu(); + showMenu(); } }); + gui.keyboard.onMenuSubmit(menu, onSubmit); - new ModeButton('#simplify-btn', 'simplify'); - gui.addMode('simplify', turnOn, turnOff); + // init simplify button and mode + gui.addMode('simplify', turnOn, turnOff, gui.container.findChild('.simplify-btn')); model.on('select', function() { if (gui.getMode() == 'simplify') gui.clearMode(); }); // exit simplify mode when user clicks off the visible part of the menu - menu.on('click', gui.handleDirectEvent(gui.clearMode)); + menu.on('click', GUI.handleDirectEvent(gui.clearMode)); - slider = new Slider("#simplify-control .slider"); - slider.handle("#simplify-control .handle"); - slider.track("#simplify-control .track"); + // init slider + slider = new Slider(el.findChild(".simplify-control .slider")); + slider.handle(el.findChild(".simplify-control .handle")); + slider.track(el.findChild(".simplify-control .track")); slider.on('change', function(e) { var pct = fromSliderPct(e.pct); text.value(pct); pct = utils.parsePercent(text.text()); // use rounded value (for consistency w/ cli) - onchange(pct); + onChange(pct); }); slider.on('start', function(e) { - control.dispatchEvent('simplify-start'); + gui.dispatchEvent('simplify_drag_start'); // trigger intersection control to hide }).on('end', function(e) { - control.dispatchEvent('simplify-end'); + gui.dispatchEvent('simplify_drag_end'); // trigger intersection control to redraw }); - text = new ClickText("#simplify-control .clicktext"); + // init text box showing simplify pct + text = new ClickText(el.findChild(".simplify-control .clicktext")); text.bounds(0, 1); text.formatter(function(val) { if (isNaN(val)) return '-'; @@ -70,34 +98,55 @@ var SimplifyControl = function(model) { text.on('change', function(e) { var pct = e.value; slider.pct(toSliderPct(pct)); - control.dispatchEvent('simplify-start'); - onchange(pct); - control.dispatchEvent('simplify-end'); + onChange(pct); + gui.dispatchEvent('simplify_drag_end'); // (kludge) trigger intersection control to redraw }); + control.reset = function() { + control.value(1); + el.hide(); + menu.hide(); + gui.container.removeClass('simplify'); + }; + + control.value = function(val) { + if (!isNaN(val)) { + // TODO: validate + _value = val; + slider.pct(toSliderPct(val)); + text.value(val); + } + return _value; + }; + + control.value(_value); + function turnOn() { var target = model.getActiveLayer(); + var arcs = target.dataset.arcs; if (!internal.layerHasPaths(target.layer)) { gui.alert("This layer can not be simplified"); return; } - if (target.dataset.arcs.getVertexData().zz) { + if (arcs.getVertexData().zz) { // TODO: try to avoid calculating pct (slow); showSlider(); // need to show slider before setting; TODO: fix - control.value(target.dataset.arcs.getRetainedPct()); + fromPct = internal.getThresholdFunction(arcs, false); + control.value(arcs.getRetainedPct()); + } else { - initMenu(); + showMenu(); } } - function initMenu() { + function showMenu() { var dataset = model.getActiveLayer().dataset; var showPlanarOpt = !dataset.arcs.isPlanar(); var opts = internal.getStandardSimplifyOpts(dataset, dataset.info && dataset.info.simplify); - El('#planar-opt-wrapper').node().style.display = showPlanarOpt ? 'block' : 'none'; - El('#planar-opt').node().checked = !opts.spherical; - El("#import-retain-opt").node().checked = opts.keep_shapes; - El("#simplify-options input[value=" + opts.method + "]").node().checked = true; + menu.findChild('.planar-opt-wrapper').node().style.display = showPlanarOpt ? 'block' : 'none'; + menu.findChild('.planar-opt').node().checked = !opts.spherical; + menu.findChild('.import-retain-opt').node().checked = opts.keep_shapes; + menu.findChild('input[value=' + opts.method + ']').node().checked = true; menu.show(); } @@ -119,29 +168,29 @@ var SimplifyControl = function(model) { var opts = getSimplifyOptions(); mapshaper.simplify(dataset, opts); model.updated({ - // use presimplify flag if no vertices are removed - // (to trigger map redraw without recalculating intersections) - presimplify: opts.pct == 1, - simplify: opts.pct < 1 + // trigger filtered arc rebuild without redraw if pct is 1 + simplify_method: opts.percentage == 1, + simplify: opts.percentage < 1 }); showSlider(); + fromPct = internal.getThresholdFunction(dataset.arcs, false); gui.clearProgressMessage(); }, delay); } function showSlider() { el.show(); - El('body').addClass('simplify'); // for resizing, hiding layer label, etc. + gui.container.addClass('simplify'); // for resizing, hiding layer label, etc. } function getSimplifyOptions() { - var method = El('#simplify-options input[name=method]:checked').attr('value') || null; + var method = menu.findChild('input[name=method]:checked').attr('value') || null; return { method: method, - pct: _value, + percentage: _value, no_repair: true, - keep_shapes: !!El("#import-retain-opt").node().checked, - planar: !!El('#planar-opt').node().checked + keep_shapes: !!menu.findChild('.import-retain-opt').node().checked, + planar: !!menu.findChild('.planar-opt').node().checked }; } @@ -156,30 +205,18 @@ var SimplifyControl = function(model) { return pct * pct; } - function onchange(val) { - if (_value != val) { - _value = val; - control.dispatchEvent('change', {value:val}); + function onChange(pct) { + if (_value != pct) { + _value = pct; + model.getActiveLayer().dataset.arcs.setRetainedInterval(fromPct(pct)); + model.updated({'simplify_amount': true}); + updateSliderDisplay(); } } - control.reset = function() { - control.value(1); - el.hide(); - menu.hide(); - El('body').removeClass('simplify'); - }; - - control.value = function(val) { - if (!isNaN(val)) { - // TODO: validate - _value = val; - slider.pct(toSliderPct(val)); - text.value(val); - } - return _value; - }; - - control.value(_value); - return control; + function updateSliderDisplay() { + // TODO: display resolution and vertex count + // var dataset = model.getActiveLayer().dataset; + // var interval = dataset.arcs.getRetainedInterval(); + } }; diff --git a/src/gui/mapshaper-slider.js b/src/gui/mapshaper-slider.js index 21695c625..19064c485 100644 --- a/src/gui/mapshaper-slider.js +++ b/src/gui/mapshaper-slider.js @@ -106,4 +106,4 @@ function Slider(ref, opts) { } } -utils.inherit(Slider, EventDispatcher); \ No newline at end of file +utils.inherit(Slider, EventDispatcher); diff --git a/src/gui/mapshaper-svg-display.js b/src/gui/mapshaper-svg-display.js new file mode 100644 index 000000000..33cc4de51 --- /dev/null +++ b/src/gui/mapshaper-svg-display.js @@ -0,0 +1,64 @@ +/* @requires +mapshaper-gui-lib +mapshaper-svg-symbols +mapshaper-svg-furniture +*/ + +function SvgDisplayLayer(gui, ext, mouse) { + var svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg'); + var el = El(svg); + + el.clear = function() { + while (svg.childNodes.length > 0) { + svg.removeChild(svg.childNodes[0]); + } + }; + + el.reposition = function(target, type) { + resize(ext); + reposition(target, type, ext); + }; + + el.drawLayer = function(target, type) { + var g = document.createElementNS('http://www.w3.org/2000/svg', 'g'); + var html = ''; + // generate a unique id so layer can be identified when symbols are repositioned + // use it as a class name to avoid id collisions + var id = utils.getUniqueName(); + var classNames = [id, 'mapshaper-svg-layer', 'mapshaper-' + type + '-layer']; + g.setAttribute('class', classNames.join(' ')); + target.svg_id = id; + resize(ext); + if (type == 'label' || type == 'symbol') { + html = renderSymbols(target.layer, ext, type); + } else if (type == 'furniture') { + html = renderFurniture(target.layer, ext); + } + g.innerHTML = html; + svg.append(g); + + // prevent svg hit detection on inactive layers + if (!target.active) { + g.style.pointerEvents = 'none'; + } + }; + + function reposition(target, type, ext) { + var container = el.findChild('.' + target.svg_id).node(); + var elements; + if (type == 'label' || type == 'symbol') { + elements = type == 'label' ? container.getElementsByTagName('text') : + El.findAll('.mapshaper-svg-symbol', container); + repositionSymbols(elements, target.layer, ext); + } else if (type == 'furniture') { + repositionFurniture(container, target.layer, ext); + } + } + + function resize(ext) { + svg.style.width = ext.width() + 'px'; + svg.style.height = ext.height() + 'px'; + } + + return el; +} diff --git a/src/gui/mapshaper-svg-furniture.js b/src/gui/mapshaper-svg-furniture.js new file mode 100644 index 000000000..deebb6708 --- /dev/null +++ b/src/gui/mapshaper-svg-furniture.js @@ -0,0 +1,23 @@ +function getSvgFurnitureTransform(ext) { + var scale = ext.getSymbolScale(); + var frame = ext.getFrame(); + var p = ext.translateCoords(frame.bbox[0], frame.bbox[3]); + return internal.svg.getTransform(p, scale); +} + +function repositionFurniture(container, layer, ext) { + var g = El.findAll('.mapshaper-svg-furniture', container)[0]; + g.setAttribute('transform', getSvgFurnitureTransform(ext)); +} + +function renderFurniture(lyr, ext) { + var frame = ext.getFrame(); // frame should be set if we're rendering a furniture layer + var obj = internal.getEmptyLayerForSVG(lyr, {}); + if (!frame) { + stop('Missing map frame data'); + } + obj.properties.transform = getSvgFurnitureTransform(ext); + obj.properties.class = 'mapshaper-svg-furniture'; + obj.children = internal.svg.importFurniture(internal.getFurnitureLayerData(lyr), frame); + return internal.svg.stringify(obj); +} diff --git a/src/gui/mapshaper-svg-hit.js b/src/gui/mapshaper-svg-hit.js new file mode 100644 index 000000000..cdd7efba7 --- /dev/null +++ b/src/gui/mapshaper-svg-hit.js @@ -0,0 +1,63 @@ +/* @requires mapshaper-svg-symbol-utils */ + +function getSvgHitTest(displayLayer) { + + return function(pointerEvent) { + // target could be a part of an SVG symbol, or the SVG element, or something else + var target = pointerEvent.originalEvent.target; + var symbolNode = getSymbolNode(target); + var featureId; + if (!symbolNode) { + return null; + } + // TODO: some validation on feature id + featureId = getSymbolNodeId(symbolNode); + return { + id: featureId, + ids: [featureId], + targetSymbol: symbolNode, + targetNode: target, + container: symbolNode.parentNode + }; + }; + + // target: event target (could be any DOM element) + function getSymbolNode(target) { + var node = target; + while (node && nodeHasSymbolTagType(node)) { + if (isSymbolNode(node)) { + return node; + } + node = node.parentElement; + } + return null; + } + + // TODO: switch to attribute detection + function nodeHasSymbolTagType(node) { + var tag = node.tagName; + return tag == 'g' || tag == 'tspan' || tag == 'text' || tag == 'image' || + tag == 'path' || tag == 'circle' || tag == 'rect' || tag == 'line'; + } + + function isSymbolNode(node) { + return node.hasAttribute('data-id') && (node.tagName == 'text' || node.tagName == 'g'); + } + + function isSymbolChildNode(node) { + + } + + function getChildId(childNode) { + + } + + function getSymbolId(symbolNode) { + + } + + function getFeatureId(symbolNode) { + + } + +} diff --git a/src/gui/mapshaper-svg-labels.js b/src/gui/mapshaper-svg-labels.js new file mode 100644 index 000000000..57decd64b --- /dev/null +++ b/src/gui/mapshaper-svg-labels.js @@ -0,0 +1,78 @@ +/* @requires mapshaper-svg-symbols */ + + +function isMultilineLabel(textNode) { + return textNode.childNodes.length > 1; +} + +function toggleTextAlign(textNode, rec) { + var curr = rec['text-anchor'] || 'middle'; + var value = curr == 'middle' && 'start' || curr == 'start' && 'end' || 'middle'; + updateTextAnchor(value, textNode, rec); +} + +// Set an attribute on a node and any child elements +// (mapshaper's svg labels require tspans to have the same x and dx values +// as the enclosing text node) +function setMultilineAttribute(textNode, name, value) { + var n = textNode.childNodes.length; + var i = -1; + var child; + textNode.setAttribute(name, value); + while (++i < n) { + child = textNode.childNodes[i]; + if (child.tagName == 'tspan') { + child.setAttribute(name, value); + } + } +} + +function findSvgRoot(el) { + while (el && el.tagName != 'html' && el.tagName != 'body') { + if (el.tagName == 'svg') return el; + el = el.parentNode; + } + return null; +} + +// p: pixel coordinates of label anchor +function autoUpdateTextAnchor(textNode, rec, p) { + var svg = findSvgRoot(textNode); + var rect = textNode.getBoundingClientRect(); + var labelCenterX = rect.left - svg.getBoundingClientRect().left + rect.width / 2; + var xpct = (labelCenterX - p[0]) / rect.width; // offset of label center from anchor center + var value = xpct < -0.25 && 'end' || xpct > 0.25 && 'start' || 'middle'; + updateTextAnchor(value, textNode, rec); +} + +// @value: optional position to set; if missing, auto-set +function updateTextAnchor(value, textNode, rec) { + var rect = textNode.getBoundingClientRect(); + var width = rect.width; + var curr = rec['text-anchor'] || 'middle'; + var xshift = 0; + + // console.log("anchor() curr:", curr, "xpct:", xpct, "left:", rect.left, "anchorX:", anchorX, "targ:", targ, "dx:", xshift) + if (curr == 'middle' && value == 'end' || curr == 'start' && value == 'middle') { + xshift = width / 2; + } else if (curr == 'middle' && value == 'start' || curr == 'end' && value == 'middle') { + xshift = -width / 2; + } else if (curr == 'start' && value == 'end') { + xshift = width; + } else if (curr == 'end' && value == 'start') { + xshift = -width; + } + if (xshift) { + rec['text-anchor'] = value; + applyDelta(rec, 'dx', xshift); + } +} + + +// handle either numeric strings or numbers in fields +function applyDelta(rec, key, delta) { + var currVal = rec[key]; + var isString = utils.isString(currVal); + var newVal = (+currVal + delta) || 0; + rec[key] = isString ? String(newVal) : newVal; +} \ No newline at end of file diff --git a/src/gui/mapshaper-svg-symbol-utils.js b/src/gui/mapshaper-svg-symbol-utils.js new file mode 100644 index 000000000..82689f27b --- /dev/null +++ b/src/gui/mapshaper-svg-symbol-utils.js @@ -0,0 +1,11 @@ + +function getSymbolNodeId(node) { + return parseInt(node.getAttribute('data-id')); +} + +function getSymbolNodeById(id, parent) { + // TODO: optimize selector + var sel = '[data-id="' + id + '"]'; + return parent.querySelector(sel); +} + diff --git a/src/gui/mapshaper-svg-symbols.js b/src/gui/mapshaper-svg-symbols.js new file mode 100644 index 000000000..62429b209 --- /dev/null +++ b/src/gui/mapshaper-svg-symbols.js @@ -0,0 +1,34 @@ + + +function getSvgSymbolTransform(xy, ext) { + var scale = ext.getSymbolScale(); + var p = ext.translateCoords(xy[0], xy[1]); + return internal.svg.getTransform(p, scale); +} + +function repositionSymbols(elements, layer, ext) { + var el, idx, p; + for (var i=0, n=elements.length; i stop editing + // b: on text + // 1: not editing -> nop + // 2: on selected text -> start dragging + // 3: on other text -> stop dragging, select new text + + hit.on('dragstart', function(e) { + if (labelEditingEnabled()) { + onLabelDragStart(e); + } else if (locationEditingEnabled()) { + onLocationDragStart(e); + } + }); + + hit.on('drag', function(e) { + if (labelEditingEnabled()) { + onLabelDrag(e); + } else if (locationEditingEnabled()) { + onLocationDrag(e); + } + }); + + hit.on('dragend', function(e) { + if (locationEditingEnabled()) { + onLocationDragEnd(e); + stopDragging(); + } else if (labelEditingEnabled()) { + stopDragging(); + } + }); + + hit.on('click', function(e) { + if (labelEditingEnabled()) { + onLabelClick(e); + } + }); + + function onLocationDragStart(e) { + if (e.id >= 0) { + dragging = true; + triggerGlobalEvent('symbol_dragstart', e); + } + } + + function onLocationDrag(e) { + var lyr = hit.getHitTarget().layer; + // get reference to + var p = getPointCoordsById(e.id, hit.getHitTarget().layer); + if (!p) return; + var diff = translateDeltaDisplayCoords(e.dx, e.dy, ext); + p[0] += diff[0]; + p[1] += diff[1]; + self.dispatchEvent('location_change'); // signal map to redraw + triggerGlobalEvent('symbol_drag', e); + } + + function onLocationDragEnd(e) { + triggerGlobalEvent('symbol_dragend', e); + } + + function onLabelClick(e) { + var textNode = getTextTarget3(e); + var rec = getLabelRecordById(e.id); + if (textNode && rec && isMultilineLabel(textNode)) { + toggleTextAlign(textNode, rec); + updateSymbol2(textNode, rec, e.id); + // e.stopPropagation(); // prevent pin/unpin on popup + } + } + + function triggerGlobalEvent(type, e) { + if (e.id >= 0) { + // fire event to signal external editor that symbol coords have changed + gui.dispatchEvent(type, {FID: e.id, layer_name: hit.getHitTarget().layer.name}); + } + } + + function getLabelRecordById(id) { + var table = hit.getTargetDataTable(); + if (id >= 0 === false || !table) return null; + // add dx and dy properties, if not available + if (!table.fieldExists('dx')) { + table.addField('dx', 0); + } + if (!table.fieldExists('dy')) { + table.addField('dy', 0); + } + if (!table.fieldExists('text-anchor')) { + table.addField('text-anchor', ''); + } + return table.getRecordAt(id); + } + + function onLabelDragStart(e) { + var textNode = getTextTarget3(e); + var table = hit.getTargetDataTable(); + if (!textNode || !table) return; + activeId = e.id; + activeRecord = getLabelRecordById(activeId); + dragging = true; + downEvt = e; + } + + function onLabelDrag(e) { + var scale = ext.getSymbolScale() || 1; + var textNode; + if (!dragging) return; + if (e.id != activeId) { + error("Mismatched hit ids:", e.id, activeId); + } + applyDelta(activeRecord, 'dx', e.dx / scale); + applyDelta(activeRecord, 'dy', e.dy / scale); + textNode = getTextTarget3(e); + if (!isMultilineLabel(textNode)) { + // update anchor position of single-line labels based on label position + // relative to anchor point, for better placement when eventual display font is + // different from mapshaper's font. + autoUpdateTextAnchor(textNode, activeRecord, getDisplayCoordsById(activeId, hit.getHitTarget().layer, ext)); + } + // updateSymbol(targetTextNode, activeRecord); + updateSymbol2(textNode, activeRecord, activeId); + } + + function getTextTarget3(e) { + if (e.id > -1 === false || !e.container) return null; + return getSymbolNodeById(e.id, e.container); + } + + function getTextTarget2(e) { + var el = e && e.targetSymbol || null; + if (el && el.tagName == 'tspan') { + el = el.parentNode; + } + return el && el.tagName == 'text' ? el : null; + } + + function getTextTarget(e) { + var el = e.target; + if (el.tagName == 'tspan') { + el = el.parentNode; + } + return el.tagName == 'text' ? el : null; + } + + // svg.addEventListener('mousedown', function(e) { + // var textTarget = getTextTarget(e); + // downEvt = e; + // if (!textTarget) { + // stopEditing(); + // } else if (!editing) { + // // nop + // } else if (textTarget == targetTextNode) { + // startDragging(); + // } else { + // startDragging(); + // editTextNode(textTarget); + // } + // }); + + // up event on svg + // a: currently dragging text + // -> stop dragging + // b: clicked on a text feature + // -> start editing it + + + // svg.addEventListener('mouseup', function(e) { + // var textTarget = getTextTarget(e); + // var isClick = isClickEvent(e, downEvt); + // if (isClick && textTarget && textTarget == targetTextNode && + // activeRecord && isMultilineLabel(targetTextNode)) { + // toggleTextAlign(targetTextNode, activeRecord); + // updateSymbol(); + // } + // if (dragging) { + // stopDragging(); + // } else if (isClick && textTarget) { + // editTextNode(textTarget); + // } + // }); + + // block dbl-click navigation when editing + // mouse.on('dblclick', function(e) { + // if (editing) e.stopPropagation(); + // }, null, eventPriority); + + // mouse.on('dragstart', function(e) { + // onLabelDrag(e); + // }, null, eventPriority); + + // mouse.on('drag', function(e) { + // var scale = ext.getSymbolScale() || 1; + // onLabelDrag(e); + // if (!dragging || !activeRecord) return; + // applyDelta(activeRecord, 'dx', e.dx / scale); + // applyDelta(activeRecord, 'dy', e.dy / scale); + // if (!isMultilineLabel(targetTextNode)) { + // // update anchor position of single-line labels based on label position + // // relative to anchor point, for better placement when eventual display font is + // // different from mapshaper's font. + // updateTextAnchor(targetTextNode, activeRecord); + // } + // // updateSymbol(targetTextNode, activeRecord); + // targetTextNode = updateSymbol2(targetTextNode, activeRecord, activeId); + // }, null, eventPriority); + + // mouse.on('dragend', function(e) { + // onLabelDrag(e); + // stopDragging(); + // }, null, eventPriority); + + + // function onLabelDrag(e) { + // if (dragging) { + // e.stopPropagation(); + // } + // } + } + + function stopDragging() { + dragging = false; + activeId = -1; + activeRecord = null; + // targetTextNode = null; + // svg.removeAttribute('class'); + } + + function isClickEvent(up, down) { + var elapsed = Math.abs(down.timeStamp - up.timeStamp); + var dx = up.screenX - down.screenX; + var dy = up.screenY - down.screenY; + var dist = Math.sqrt(dx * dx + dy * dy); + return dist <= 4 && elapsed < 300; + } + + + // function deselectText(el) { + // el.removeAttribute('class'); + // } + + // function selectText(el) { + // el.setAttribute('class', 'selected'); + // } + + +} diff --git a/src/gui/mapshaper-zip-reader.js b/src/gui/mapshaper-zip-reader.js index 24e44be8d..e275d7b57 100644 --- a/src/gui/mapshaper-zip-reader.js +++ b/src/gui/mapshaper-zip-reader.js @@ -1,15 +1,9 @@ // Assume zip.js is loaded and zip is defined globally -zip.workerScripts = { - // deflater: ['z-worker.js', 'deflate.js'], // use zip.js deflater - // TODO: find out why it was necessary to rename pako_deflate.min.js - deflater: ['z-worker.js', 'pako.deflate.js', 'codecs.js'], - inflater: ['z-worker.js', 'pako.inflate.js', 'codecs.js'] -}; // @file: Zip file // @cb: function(err, ) // -gui.readZipFile = function(file, cb) { +GUI.readZipFile = function(file, cb) { var _files = []; zip.createReader(new zip.BlobReader(file), importZipContent, onError); @@ -41,7 +35,7 @@ gui.readZipFile = function(file, cb) { function readEntry(entry) { var filename = entry.filename, - isValid = !entry.directory && gui.isReadableFileType(filename) && + isValid = !entry.directory && GUI.isReadableFileType(filename) && !/^__MACOSX/.test(filename); // ignore "resource-force" files if (isValid) { entry.getData(new zip.BlobWriter(), function(file) { diff --git a/lib/mbloch-gui-lib.js b/src/gui/mbloch-gui-lib.js similarity index 79% rename from lib/mbloch-gui-lib.js rename to src/gui/mbloch-gui-lib.js index 8a7b9b0ad..f339ef6e6 100644 --- a/lib/mbloch-gui-lib.js +++ b/src/gui/mbloch-gui-lib.js @@ -14,7 +14,7 @@ Handler.prototype.trigger = function(evt) { error("[Handler] event target/type have changed."); } this.callback.call(this.listener, evt); -} +}; function EventData(type, target, data) { this.type = type; @@ -113,25 +113,6 @@ EventDispatcher.prototype.countEventListeners = function(type) { -var Env = (function() { - var inNode = typeof module !== 'undefined' && !!module.exports; - var inBrowser = typeof window !== 'undefined' && !inNode; - var inPhantom = inBrowser && !!(window.phantom && window.phantom.exit); - var ieVersion = inBrowser && /MSIE ([0-9]+)/.exec(navigator.appVersion) && parseInt(RegExp.$1) || NaN; - - return { - iPhone : inBrowser && !!(navigator.userAgent.match(/iPhone/i)), - iPad : inBrowser && !!(navigator.userAgent.match(/iPad/i)), - canvas: inBrowser && !!document.createElement('canvas').getContext, - inNode : inNode, - inPhantom : inPhantom, - inBrowser: inBrowser, - ieVersion: ieVersion, - ie: !isNaN(ieVersion) - }; -})(); - - var Browser = { getPageXY: function(el) { var x = 0, y = 0; @@ -164,15 +145,16 @@ var Browser = { elementIsFixed: function(el) { // get top-level offsetParent that isn't body (cf. Firefox) var body = document.body; + var parent; while (el && el != body) { - var parent = el; + parent = el; el = el.offsetParent; } // Look for position:fixed in the computed style of the top offsetParent. // var styleObj = parent && (parent.currentStyle || window.getComputedStyle && window.getComputedStyle(parent, '')) || {}; var styleObj = parent && Browser.getElementStyle(parent) || {}; - return styleObj['position'] == 'fixed'; + return styleObj.position == 'fixed'; }, pageXToViewportX: function(x) { @@ -285,59 +267,14 @@ utils.htmlEscape = (function() { }()); -var classSelectorRE = /^\.([\w-]+)$/, - idSelectorRE = /^#([\w-]+)$/, - tagSelectorRE = /^[\w-]+$/, - tagOrIdSelectorRE = /^#?[\w-]+$/; - -function Elements(sel) { - if ((this instanceof Elements) == false) { - return new Elements(sel); - } - this.elements = []; - this.select(sel); -} - -Elements.prototype = { - size: function() { - return this.elements.length; - }, - - select: function(sel) { - this.elements = Elements.__select(sel); - return this; - }, - - addClass: function(className) { - this.forEach(function(el) { el.addClass(className); }); - return this; - }, - - removeClass: function(className) { - this.forEach(function(el) { el.removeClass(className); }) - return this; - }, - - forEach: function(callback, ctx) { - for (var i=0, len=this.elements.length; i 0 ? 1 : -1; + else if (e.detail) dir = e.detail > 0 ? -1 : 1; + if (time - ptime > 300) getAverage = LimitedAverage(3); // reset + ptime = time; + avg = getAverage(dir) || dir; // handle average == 0 + return avg > 0 ? 1 : -1; + }; +} + +function LimitedAverage(maxSize) { + var arr = []; + return function(val) { + var sum = 0, + i = -1; + arr.push(val); + if (arr.length > maxSize) arr.shift(); + while (++i < arr.length) { + sum += arr[i]; + } + return sum / arr.length; + }; +} + // @mouse: MouseArea object function MouseWheel(mouse) { var self = this, - prevWheelTime = 0, - currDirection = 0, + active = false, timer = new Timer().addEventListener('tick', onTick), - sustainTime = 60, - fadeTime = 80; + sustainInterval = 150, + fadeDelay = 70, + eventTime = 0, + getAverageRate = LimitedAverage(10), + getWheelDirection = MouseWheelDirection(), + wheelDirection; if (window.onmousewheel !== undefined) { // ie, webkit window.addEventListener('mousewheel', handleWheel); @@ -862,36 +785,48 @@ function MouseWheel(mouse) { window.addEventListener('DOMMouseScroll', handleWheel); } + function updateSustainInterval(eventRate) { + var fadeInterval = 80; + fadeDelay = eventRate + 50; // adding a little extra time helps keep trackpad scrolling smooth in Firefox + sustainInterval = fadeDelay + fadeInterval; + } + function handleWheel(evt) { - var direction; - if (evt.wheelDelta) { - direction = evt.wheelDelta > 0 ? 1 : -1; - } else if (evt.detail) { - direction = evt.detail > 0 ? -1 : 1; + var now = +new Date(); + wheelDirection = getWheelDirection(evt, now); + if (evt.ctrlKey) { + // Prevent pinch-zoom in Chrome (doesn't work in Safari, though) + evt.preventDefault(); + evt.stopImmediatePropagation(); } - if (!mouse.isOver() || !direction) return; + if (!mouse.isOver()) return; evt.preventDefault(); - prevWheelTime = +new Date(); - if (!currDirection) { + if (!active) { + active = true; self.dispatchEvent('mousewheelstart'); + } else { + updateSustainInterval(getAverageRate(now - eventTime)); } - currDirection = direction; - timer.start(sustainTime + fadeTime); + eventTime = now; + timer.start(sustainInterval); } function onTick(evt) { - var elapsed = evt.time - prevWheelTime, - fadeElapsed = elapsed - sustainTime, - scale = evt.tickTime / 25, + var tickInterval = evt.time - eventTime, + multiplier = evt.tickTime / 25, + fadeFactor = 0, obj; + if (tickInterval > fadeDelay) { + fadeFactor = Math.min(1, (tickInterval - fadeDelay) / (sustainInterval - fadeDelay)); + } if (evt.done) { - currDirection = 0; + active = false; } else { - if (fadeElapsed > 0) { - // Decelerate if the timer fires during 'fade time' (for smoother zooming) - scale *= Tween.quadraticOut((fadeTime - fadeElapsed) / fadeTime); + if (fadeFactor > 0) { + // Decelerate towards the end of the sustain interval (for smoother zooming) + multiplier *= Tween.quadraticOut(1 - fadeFactor); } - obj = utils.extend({direction: currDirection, multiplier: scale}, mouse.mouseData()); + obj = utils.extend({direction: wheelDirection, multiplier: multiplier}, mouse.mouseData()); self.dispatchEvent('mousewheel', obj); } } @@ -900,17 +835,17 @@ function MouseWheel(mouse) { utils.inherit(MouseWheel, EventDispatcher); -function MouseArea(element) { - var pos = new ElementPosition(element), - _areaPos = pos.position(), +function MouseArea(element, pos) { + var _pos = pos || new ElementPosition(element), + _areaPos = _pos.position(), _self = this, _dragging = false, _isOver = false, + _disabled = false, _prevEvt, - // _moveEvt, _downEvt; - pos.on('change', function() {_areaPos = pos.position()}); + _pos.on('change', function() {_areaPos = _pos.position();}); // TODO: think about touch events document.addEventListener('mousemove', onMouseMove); document.addEventListener('mousedown', onMouseDown); @@ -921,6 +856,39 @@ function MouseArea(element) { element.addEventListener('mousedown', onAreaDown); element.addEventListener('dblclick', onAreaDblClick); + this.enable = function() { + if (!_disabled) return; + _disabled = false; + element.style.pointerEvents = 'auto'; + }; + + this.stopDragging = function() { + if (_downEvt) { + if (_dragging) stopDragging(_downEvt); + _downEvt = null; + } + }; + + this.disable = function() { + if (_disabled) return; + _disabled = true; + if (_isOver) onAreaOut(); + this.stopDragging(); + element.style.pointerEvents = 'none'; + }; + + this.isOver = function() { + return _isOver; + }; + + this.isDown = function() { + return !!_downEvt; + }; + + this.mouseData = function() { + return utils.extend({}, _prevEvt); + }; + function onAreaDown(e) { e.preventDefault(); // prevent text selection cursor on drag } @@ -932,7 +900,7 @@ function MouseArea(element) { } } - function onAreaOut(e) { + function onAreaOut() { _isOver = false; _self.dispatchEvent('leave'); } @@ -941,8 +909,7 @@ function MouseArea(element) { var evt = procMouseEvent(e), elapsed, dx, dy; if (_dragging) { - _dragging = false; - _self.dispatchEvent('dragend', evt); + stopDragging(evt); } if (_downEvt) { elapsed = evt.time - _downEvt.time; @@ -955,6 +922,11 @@ function MouseArea(element) { } } + function stopDragging(evt) { + _dragging = false; + _self.dispatchEvent('dragend', evt); + } + function onMouseDown(e) { if (e.button != 2 && e.which != 3) { // ignore right-click _downEvt = procMouseEvent(e); @@ -967,7 +939,7 @@ function MouseArea(element) { _dragging = true; _self.dispatchEvent('dragstart', evt); } - + if (evt.dx === 0 && evt.dy === 0) return; // seen in Chrome if (_dragging) { var obj = { dragX: evt.pageX - _downEvt.pageX, @@ -988,8 +960,9 @@ function MouseArea(element) { pageY = e.pageY, prev = _prevEvt; _prevEvt = { + originalEvent: e, shiftKey: e.shiftKey, - time: +new Date, + time: +new Date(), pageX: pageX, pageY: pageY, hover: _isOver, @@ -1000,18 +973,6 @@ function MouseArea(element) { }; return _prevEvt; } - - this.isOver = function() { - return _isOver; - } - - this.isDown = function() { - return !!_downEvt; - } - - this.mouseData = function() { - return utils.extend({}, _prevEvt); - } } utils.inherit(MouseArea, EventDispatcher); diff --git a/src/io/mapshaper-export.js b/src/io/mapshaper-export.js index f6aa193b9..ec2569e7b 100644 --- a/src/io/mapshaper-export.js +++ b/src/io/mapshaper-export.js @@ -39,18 +39,20 @@ internal.exportDatasets = function(datasets, opts) { } // KLUDGE let exporter know that copying is not needed // (because shape data was deep-copied during merge) - opts.final = true; + opts = utils.defaults({final: true}, opts); } } else { datasets = datasets.map(internal.copyDatasetForRenaming); internal.assignUniqueLayerNames2(datasets); } files = datasets.reduce(function(memo, dataset) { - if (opts.target) { - // kludge to export layers in order that target= option matched them - // (useful mainly for SVG output) - // match_id was assigned to each layer by findCommandTargets() - utils.sortOn(dataset.layers, 'match_id', true); + if (internal.runningInBrowser()) { + utils.sortOn(dataset.layers, 'stack_id', true); + } else { + // kludge to export layers in order that target= option or previous + // -target command matched them (useful mainly for SVG output) + // target_id was assigned to each layer by findCommandTargets() + utils.sortOn(dataset.layers, 'target_id', true); } return memo.concat(internal.exportFileContent(dataset, opts)); }, []); @@ -67,9 +69,9 @@ internal.exportFileContent = function(dataset, opts) { files = []; if (!outFmt) { - error("[o] Missing output format"); + error("Missing output format"); } else if (!exporter) { - error("[o] Unknown output format:", outFmt); + error("Unknown output format:", outFmt); } // shallow-copy dataset and layers, so layers can be renamed for export @@ -78,16 +80,19 @@ internal.exportFileContent = function(dataset, opts) { }, dataset); // Adjust layer names, so they can be used as output file names - if (opts.file && outFmt != 'topojson') { + // (except for multi-layer formats TopoJSON and SVG) + if (opts.file && outFmt != 'topojson' && outFmt != 'svg') { dataset.layers.forEach(function(lyr) { lyr.name = utils.getFileBase(opts.file); }); } internal.assignUniqueLayerNames(dataset.layers); - // apply coordinate precision, except for svg precision, which is applied - // during export, after rescaling - if (opts.precision && outFmt != 'svg') { + // apply coordinate precision, except: + // svg precision is applied by the SVG exporter, after rescaling + // GeoJSON precision is applied by the exporter, to handle default precision + // TopoJSON precision is applied to avoid redundant copying + if (opts.precision && outFmt != 'svg' && outFmt != 'geojson' && outFmt != 'topojson') { dataset = internal.copyDatasetForExport(dataset); internal.setCoordinatePrecision(dataset, opts.precision); } @@ -165,14 +170,14 @@ internal.validateLayerData = function(layers) { if (lyr.shapes && utils.some(lyr.shapes, function(o) { return !!o; })) { - error("[export] A layer contains shape records and a null geometry type"); + error("A layer contains shape records and a null geometry type"); } } else { if (!utils.contains(['polygon', 'polyline', 'point'], lyr.geometry_type)) { - error ("[export] A layer has an invalid geometry type:", lyr.geometry_type); + error ("A layer has an invalid geometry type:", lyr.geometry_type); } if (!lyr.shapes) { - error ("[export] A layer is missing shape data"); + error ("A layer is missing shape data"); } } }); @@ -182,8 +187,8 @@ internal.validateFileNames = function(files) { var index = {}; files.forEach(function(file, i) { var filename = file.filename; - if (!filename) error("[o] Missing a filename for file" + i); - if (filename in index) error("[o] Duplicate filename", filename); + if (!filename) error("Missing a filename for file" + i); + if (filename in index) error("Duplicate filename", filename); index[filename] = true; }); }; diff --git a/src/io/mapshaper-file-export.js b/src/io/mapshaper-file-export.js index a5dd8e49e..eef5115b9 100644 --- a/src/io/mapshaper-file-export.js +++ b/src/io/mapshaper-file-export.js @@ -11,6 +11,7 @@ internal.writeFiles = function(exports, opts, cb) { return cli.writeFile('/dev/stdout', exports[0].content, cb); } else { var paths = internal.getOutputPaths(utils.pluck(exports, 'filename'), opts); + var inputFiles = internal.getStateVar('input_files'); exports.forEach(function(obj, i) { var path = paths[i]; if (obj.content instanceof ArrayBuffer) { @@ -20,6 +21,9 @@ internal.writeFiles = function(exports, opts, cb) { if (opts.output) { opts.output.push({filename: path, content: obj.content}); } else { + if (!opts.force && inputFiles.indexOf(path) > -1) { + stop('Need to use the "-o force" option to overwrite input files.'); + } cli.writeFile(path, obj.content); message("Wrote " + path); } @@ -30,9 +34,6 @@ internal.writeFiles = function(exports, opts, cb) { internal.getOutputPaths = function(files, opts) { var odir = opts.directory; - if (opts.force) { - message("[o] The force option is obsolete, files are now overwritten by default"); - } if (odir) { files = files.map(function(file) { return require('path').join(odir, file); diff --git a/src/io/mapshaper-file-import.js b/src/io/mapshaper-file-import.js index 7c6f3201d..78c2be609 100644 --- a/src/io/mapshaper-file-import.js +++ b/src/io/mapshaper-file-import.js @@ -15,6 +15,8 @@ api.importFiles = function(opts) { stop('Missing input file(s)'); } + verbose("Importing: " + files.join(' ')); + if (files.length == 1) { dataset = api.importFile(files[0], opts); } else if (opts.merge_files) { @@ -30,71 +32,81 @@ api.importFiles = function(opts) { }; api.importFile = function(path, opts) { - var isBinary = internal.isBinaryFile(path), - isShp = internal.guessInputFileType(path) == 'shp', + var fileType = internal.guessInputFileType(path), input = {}, + encoding = opts && opts.encoding || null, cache = opts && opts.input || null, cached = cache && (path in cache), - type, content; + content; cli.checkFileExists(path, cache); - if (isShp && !cached) { - content = null; // let ShpReader read the file (supports larger files) - } else if (isBinary) { + if (fileType == 'shp' && !cached) { + // let ShpReader read the file (supports larger files) + content = null; + + } else if (fileType == 'json' && !cached) { + // postpone reading of JSON files, to support incremental parsing + content = null; + + } else if (fileType == 'text' && !cached) { + // content = cli.readFile(path); // read from buffer + content = null; // read from file, to support largest files (see mapshaper-delim-import.js) + + } else if (fileType && internal.isSupportedBinaryInputType(path)) { content = cli.readFile(path, null, cache); - } else { - content = cli.readFile(path, opts && opts.encoding || 'utf-8', cache); - } - type = internal.guessInputFileType(path) || internal.guessInputContentType(content); - if (!type) { - stop("Unable to import", path); - } else if (type == 'json') { - // parsing JSON here so input file can be gc'd before JSON data is imported - // TODO: look into incrementally parsing JSON data - try { - // JSON data may already be parsed if imported via applyCommands() - if (utils.isString(content)) { - content = JSON.parse(content); - } - } catch(e) { - stop("Unable to parse JSON"); + if (utils.isString(content)) { + // Fix for issue #264 (applyCommands() input is file path instead of binary content) + stop('Expected binary content, received a string'); } + + } else if (fileType) { // string type + content = cli.readFile(path, encoding || 'utf-8', cache); + + } else { // type can't be inferred from filename -- try reading as text + content = cli.readFile(path, encoding || 'utf-8', cache); + fileType = internal.guessInputContentType(content); + if (fileType == 'text' && content.indexOf('\ufffd') > -1) { + // invalidate string data that contains the 'replacement character' + fileType = null; + } + } + + if (!fileType) { + stop(internal.getUnsupportedFileMessage(path)); } - input[type] = {filename: path, content: content}; + input[fileType] = {filename: path, content: content}; content = null; // for g.c. - if (type == 'shp' || type == 'dbf') { + if (fileType == 'shp' || fileType == 'dbf') { internal.readShapefileAuxFiles(path, input, cache); } - if (type == 'shp' && !input.dbf) { + if (fileType == 'shp' && !input.dbf) { message(utils.format("[%s] .dbf file is missing - shapes imported without attribute data.", path)); } return internal.importContent(input, opts); }; -/* -api.importDataTable = function(path, opts) { - // TODO: avoid the overhead of importing shape data, if present - var dataset = api.importFile(path, opts); - if (dataset.layers.length > 1) { - // if multiple layers are imported (e.g. from multi-type GeoJSON), throw away - // the geometry and merge them - dataset.layers.forEach(function(lyr) { - lyr.shapes = null; - lyr.geometry_type = null; - }); - dataset.layers = api.mergeLayers(dataset.layers); +internal.getUnsupportedFileMessage = function(path) { + var ext = utils.getFileExtension(path); + var msg = 'Unable to import ' + path; + if (ext.toLowerCase() == 'zip') { + msg += ' (ZIP files must be unpacked before running mapshaper)'; + } else { + msg += ' (unknown file type)'; } - return dataset.layers[0].data; + return msg; }; -*/ internal.readShapefileAuxFiles = function(path, obj, cache) { var dbfPath = utils.replaceFileExtension(path, 'dbf'); + var shxPath = utils.replaceFileExtension(path, 'shx'); var cpgPath = utils.replaceFileExtension(path, 'cpg'); var prjPath = utils.replaceFileExtension(path, 'prj'); if (cli.isFile(prjPath, cache)) { obj.prj = {filename: prjPath, content: cli.readFile(prjPath, 'utf-8', cache)}; } + if (cli.isFile(shxPath, cache)) { + obj.shx = {filename: shxPath, content: cli.readFile(shxPath, null, cache)}; + } if (!obj.dbf && cli.isFile(dbfPath, cache)) { obj.dbf = {filename: dbfPath, content: cli.readFile(dbfPath, null, cache)}; } diff --git a/src/io/mapshaper-file-reader.js b/src/io/mapshaper-file-reader.js new file mode 100644 index 000000000..edd9be9af --- /dev/null +++ b/src/io/mapshaper-file-reader.js @@ -0,0 +1,144 @@ +/* @requires mapshaper-common, mapshaper-encodings */ + +internal.FileReader = FileReader; +internal.BufferReader = BufferReader; + +internal.readFirstChars = function(reader, n) { + return internal.bufferToString(reader.readSync(0, Math.min(n || 1000, reader.size()))); +}; + +// Same interface as FileReader, for reading from a Buffer or ArrayBuffer instead of a file. +function BufferReader(src) { + var bufSize = src.byteLength || src.length, + binArr, buf; + + this.readToBinArray = function(start, length) { + if (bufSize < start + length) error("Out-of-range error"); + if (!binArr) binArr = new BinArray(src); + binArr.position(start); + return binArr; + }; + + this.toString = function(enc) { + return internal.bufferToString(buffer(), enc); + }; + + this.readSync = function(start, length) { + // TODO: consider using a default length like FileReader + return buffer().slice(start, length || bufSize); + }; + + function buffer() { + if (!buf) { + buf = (src instanceof ArrayBuffer) ? utils.createBuffer(src) : src; + } + return buf; + } + + this.findString = FileReader.prototype.findString; + this.expandBuffer = function() {return this;}; + this.size = function() {return bufSize;}; + this.close = function() {}; +} + +function FileReader(path, opts) { + var fs = require('fs'), + fileLen = fs.statSync(path).size, + DEFAULT_CACHE_LEN = opts && opts.cacheSize || 0x800000, // 8MB + DEFAULT_BUFFER_LEN = opts && opts.bufferSize || 0x4000, // 32K + fd, cacheOffs, cache, binArr; + + internal.getStateVar('input_files').push(path); // bit of a kludge + + this.expandBuffer = function() { + DEFAULT_BUFFER_LEN *= 2; + return this; + }; + + // Read to BinArray (for compatibility with ShpReader) + this.readToBinArray = function(start, length) { + if (updateCache(start, length)) { + binArr = new BinArray(cache); + } + binArr.position(start - cacheOffs); + return binArr; + }; + + // Read to Buffer + this.readSync = function(start, length) { + if (length > 0 === false) { + // use default (but variable) size if length is not specified + length = DEFAULT_BUFFER_LEN; + if (start + length > fileLen) { + length = fileLen - start; // truncate at eof + } + if (length === 0) { + return utils.createBuffer(0); // kludge to allow reading up to eof + } + } + updateCache(start, length); + return cache.slice(start - cacheOffs, start - cacheOffs + length); + }; + + this.size = function() { + return fileLen; + }; + + this.toString = function(enc) { + // TODO: use fd + return cli.readFile(path, enc || 'utf8'); + }; + + this.close = function() { + if (fd) { + fs.closeSync(fd); + fd = null; + cache = null; + } + }; + + // Receive offset and length of byte string that must be read + // Return true if cache was updated, or false + function updateCache(fileOffs, bufLen) { + var headroom = fileLen - fileOffs, + bytesRead, bytesToRead; + if (headroom < bufLen || headroom < 0) { + error("Tried to read past end-of-file"); + } + if (cache && fileOffs >= cacheOffs && cacheOffs + cache.length >= fileOffs + bufLen) { + return false; + } + bytesToRead = Math.max(DEFAULT_CACHE_LEN, bufLen); + if (headroom < bytesToRead) { + bytesToRead = headroom; + } + if (!cache || bytesToRead != cache.length) { + cache = utils.createBuffer(bytesToRead); + } + if (!fd) { + fd = fs.openSync(path, 'r'); + } + bytesRead = fs.readSync(fd, cache, 0, bytesToRead, fileOffs); + cacheOffs = fileOffs; + if (bytesRead != bytesToRead) error("Error reading file"); + return true; + } +} + +FileReader.prototype.findString = function (str, maxLen) { + var len = Math.min(this.size(), maxLen || this.size()); + var buf = this.readSync(0, len); + var strLen = str.length; + var n = buf.length - strLen; + var firstByte = str.charCodeAt(0); + var i; + for (i=0; i < n; i++) { + if (buf[i] == firstByte && buf.toString('utf8', i, i + strLen) == str) { + return { + offset: i + strLen, + text: buf.toString('utf8', 0, i) + }; + } + } + return null; +}; diff --git a/src/io/mapshaper-file-types.js b/src/io/mapshaper-file-types.js index f812cb320..98984e6ca 100644 --- a/src/io/mapshaper-file-types.js +++ b/src/io/mapshaper-file-types.js @@ -4,10 +4,12 @@ internal.guessInputFileType = function(file) { var ext = utils.getFileExtension(file || '').toLowerCase(), type = null; - if (ext == 'dbf' || ext == 'shp' || ext == 'prj') { + if (ext == 'dbf' || ext == 'shp' || ext == 'prj' || ext == 'shx') { type = ext; } else if (/json$/.test(ext)) { type = 'json'; + } else if (ext == 'csv' || ext == 'tsv' || ext == 'txt' || ext == 'tab') { + type = 'text'; } return type; }; @@ -83,9 +85,9 @@ internal.getFormatName = function(fmt) { }; // Assumes file at @path is one of Mapshaper's supported file types -internal.isBinaryFile = function(path) { +internal.isSupportedBinaryInputType = function(path) { var ext = utils.getFileExtension(path).toLowerCase(); - return ext == 'shp' || ext == 'dbf' || ext == 'zip'; // GUI accepts zip files + return ext == 'shp' || ext == 'shx' || ext == 'dbf'; // GUI also supports zip files }; // Detect extensions of some unsupported file types, for cmd line validation diff --git a/src/io/mapshaper-import.js b/src/io/mapshaper-import.js index 3a9072ef0..e6e39ed87 100644 --- a/src/io/mapshaper-import.js +++ b/src/io/mapshaper-import.js @@ -4,6 +4,8 @@ mapshaper-geojson mapshaper-topojson mapshaper-shapefile mapshaper-json-table +mapshaper-json-import +mapshaper-delim-import */ // Parse content of one or more input files and return a dataset @@ -16,37 +18,31 @@ internal.importContent = function(obj, opts) { var dataset, content, fileFmt, data; opts = opts || {}; if (obj.json) { - data = obj.json; - content = data.content; - if (utils.isString(content)) { - try { - content = JSON.parse(content); - } catch(e) { - stop("Unable to parse JSON"); - } - } - if (content.type == 'Topology') { - fileFmt = 'topojson'; - dataset = internal.importTopoJSON(content, opts); - } else if (content.type) { - fileFmt = 'geojson'; - dataset = internal.importGeoJSON(content, opts); - } else if (utils.isArray(content)) { - fileFmt = 'json'; - dataset = internal.importJSONTable(content, opts); - } + data = internal.importJSON(obj.json, opts); + fileFmt = data.format; + dataset = data.dataset; + internal.cleanPathsAfterImport(dataset, opts); + } else if (obj.text) { fileFmt = 'dsv'; data = obj.text; - dataset = internal.importDelim(data.content, opts); + dataset = internal.importDelim2(data, opts); + } else if (obj.shp) { fileFmt = 'shapefile'; data = obj.shp; dataset = internal.importShapefile(obj, opts); + internal.cleanPathsAfterImport(dataset, opts); + } else if (obj.dbf) { fileFmt = 'dbf'; data = obj.dbf; dataset = internal.importDbf(obj, opts); + } else if (obj.prj) { + // added for -proj command source + fileFmt = 'prj'; + data = obj.prj; + dataset = {layers: [], info: {prj: data.content}}; } if (!dataset) { @@ -71,7 +67,6 @@ internal.importContent = function(obj, opts) { dataset.info.input_files = [data.filename]; } dataset.info.input_formats = [fileFmt]; - return dataset; }; @@ -83,9 +78,11 @@ internal.importFileContent = function(content, filename, opts) { return internal.importContent(input, opts); }; + internal.importShapefile = function(obj, opts) { - var shpSrc = obj.shp.content || obj.shp.filename, // content may be missing - dataset = internal.importShp(shpSrc, opts), + var shpSrc = obj.shp.content || obj.shp.filename, // read from a file if (binary) content is missing + shxSrc = obj.shx ? obj.shx.content || obj.shx.filename : null, + dataset = internal.importShp(shpSrc, shxSrc, opts), lyr = dataset.layers[0], dbf; if (obj.dbf) { @@ -93,11 +90,11 @@ internal.importShapefile = function(obj, opts) { utils.extend(dataset.info, dbf.info); lyr.data = dbf.layers[0].data; if (lyr.shapes && lyr.data.size() != lyr.shapes.length) { - message("[shp] Mismatched .dbf and .shp record count -- possible data loss."); + message("Mismatched .dbf and .shp record count -- possible data loss."); } } if (obj.prj) { - dataset.info.input_prj = obj.prj.content; + dataset.info.prj = obj.prj.content; } return dataset; }; diff --git a/src/io/mapshaper-json-import.js b/src/io/mapshaper-json-import.js new file mode 100644 index 000000000..6d9c70b1b --- /dev/null +++ b/src/io/mapshaper-json-import.js @@ -0,0 +1,126 @@ +/* @requires mapshaper-common */ + +// Identify JSON type from the initial subset of a JSON string +internal.identifyJSONString = function(str, opts) { + var maxChars = 1000; + var fmt = null; + if (str.length > maxChars) str = str.substr(0, maxChars); + str = str.replace(/\s/g, ''); + if (opts && opts.json_path) { + fmt = 'json'; // TODO: make json_path compatible with other types + } else if (/^\[[{\]]/.test(str)) { + // empty array or array of objects + fmt = 'json'; + } else if (/"arcs":\[|"objects":\{|"transform":\{/.test(str)) { + fmt = 'topojson'; + } else if (/^\{"/.test(str)) { + fmt = 'geojson'; + } + return fmt; +}; + +internal.identifyJSONObject = function(o) { + var fmt = null; + if (!o) { + // + } else if (o.type == 'Topology') { + fmt = 'topojson'; + } else if (o.type) { + fmt = 'geojson'; + } else if (utils.isArray(o)) { + fmt = 'json'; + } + return fmt; +}; + +internal.importGeoJSONFile = function(fileReader, opts) { + var importer = new GeoJSONParser(opts); + new GeoJSONReader(fileReader).readObjects(importer.parseObject); + return importer.done(); +}; + +internal.importJSONFile = function(reader, opts) { + var str = internal.readFirstChars(reader, 1000); + var type = internal.identifyJSONString(str, opts); + var dataset, retn; + if (type == 'geojson') { // consider only for larger files + dataset = internal.importGeoJSONFile(reader, opts); + retn = { + dataset: dataset, + format: 'geojson' + }; + } else { + retn = { + // content: cli.readFile(path, 'utf8')} + content: reader.toString('utf8') + }; + } + reader.close(); + return retn; +}; + +internal.importJSON = function(data, opts) { + var content = data.content, + filename = data.filename, + retn = {filename: filename}, + reader; + + if (!content) { + reader = new FileReader(filename); + } else if (content instanceof ArrayBuffer) { + // Web API imports JSON as ArrayBuffer, to support larger files + if (content.byteLength < 1e7) { + // content = utils.createBuffer(content).toString(); + content = internal.bufferToString(utils.createBuffer(content)); + } else { + reader = new BufferReader(content); + content = null; + } + } + + if (reader) { + data = internal.importJSONFile(reader, opts); + if (data.dataset) { + retn.dataset = data.dataset; + retn.format = data.format; + } else { + content = data.content; + } + } + + if (content) { + if (utils.isString(content)) { + try { + content = JSON.parse(content); // ~3sec for 100MB string + } catch(e) { + stop("Unable to parse JSON"); + } + } + if (opts.json_path) { + content = internal.selectFromObject(content, opts.json_path); + } + retn.format = internal.identifyJSONObject(content, opts); + if (retn.format == 'topojson') { + retn.dataset = internal.importTopoJSON(content, opts); + } else if (retn.format == 'geojson') { + retn.dataset = internal.importGeoJSON(content, opts); + } else if (retn.format == 'json') { + retn.dataset = internal.importJSONTable(content, opts); + } else { + stop("Unknown JSON format"); + } + } + + return retn; +}; + +// path: path from top-level to the target object, as a list of property +// names separated by '.' +internal.selectFromObject = function(o, path) { + var parts = path.split('.'); + var value = o && o[parts[0]]; + if (parts > 1) { + return internal.selectFromObject(value, parts.slice(1).join('')); + } + return value; +}; diff --git a/src/mapshaper-common.js b/src/mapshaper-common.js index ae2bb92da..a1bffeb5b 100644 --- a/src/mapshaper-common.js +++ b/src/mapshaper-common.js @@ -1,20 +1,74 @@ -/* @requires mapshaper-utils */ +/* @requires mapshaper-utils, mapshaper-buffer */ var api = {}; +var VERSION; // set by build script var internal = { VERSION: VERSION, // export version LOGGING: false, - QUIET: false, - TRACING: false, - VERBOSE: false, - T: T, - defs: {} + context: createContext() +}; + +// Support for timing using T.start() and T.stop("message") +var T = { + stack: [], + start: function() { + T.stack.push(+new Date()); + }, + stop: function(note) { + var elapsed = (+new Date() - T.stack.pop()); + var msg = elapsed + 'ms'; + if (note) { + msg = note + " " + msg; + } + verbose(msg); + return elapsed; + } }; new Float64Array(1); // workaround for https://github.com/nodejs/node/issues/6006 -// in case running in browser and loading browserified modules separately -var Buffer = require('buffer').Buffer; +internal.runningInBrowser = function() {return !!api.gui;}; + +internal.getStateVar = function(key) { + return internal.context[key]; +}; + +internal.setStateVar = function(key, val) { + internal.context[key] = val; +}; + +function createContext() { + return { + DEBUG: false, + QUIET: false, + VERBOSE: false, + defs: {}, + input_files: [] + }; +} + +// Install a new set of context variables, clear them when an async callback is called. +// @cb callback function to wrap +// returns wrapped callback function +function createAsyncContext(cb) { + internal.context = createContext(); + return function() { + cb.apply(null, utils.toArray(arguments)); + // clear context after cb(), so output/errors can be handled in current context + internal.context = createContext(); + }; +} + +// Save the current context, restore it when an async callback is called +// @cb callback function to wrap +// returns wrapped callback function +function preserveContext(cb) { + var ctx = internal.context; + return function() { + internal.context = ctx; + cb.apply(null, utils.toArray(arguments)); + }; +} function error() { internal.error.apply(null, utils.toArray(arguments)); @@ -25,24 +79,34 @@ function stop() { internal.stop.apply(null, utils.toArray(arguments)); } -function APIError(msg) { +function UserError(msg) { var err = new Error(msg); - err.name = 'APIError'; + err.name = 'UserError'; return err; } +function messageArgs(args) { + var arr = utils.toArray(args); + var cmd = internal.getStateVar('current_command'); + if (cmd && cmd != 'help') { + arr.unshift('[' + cmd + ']'); + } + return arr; +} + function message() { - internal.message.apply(null, utils.toArray(arguments)); + internal.message.apply(null, messageArgs(arguments)); } function verbose() { - if (internal.VERBOSE) { - internal.logArgs(arguments); + if (internal.getStateVar('VERBOSE')) { + // internal.logArgs(arguments); + internal.message.apply(null, messageArgs(arguments)); } } -function trace() { - if (internal.TRACING) { +function debug() { + if (internal.getStateVar('DEBUG')) { internal.logArgs(arguments); } } @@ -59,27 +123,28 @@ api.enableLogging = function() { api.printError = function(err) { var msg; if (utils.isString(err)) { - err = new APIError(err); + err = new UserError(err); } - if (internal.LOGGING && err.name == 'APIError') { + if (internal.LOGGING && err.name == 'UserError') { msg = err.message; if (!/Error/.test(msg)) { msg = "Error: " + msg; } - console.error(msg); - message("Run mapshaper -h to view help"); + console.error(messageArgs([msg]).join(' ')); + internal.message("Run mapshaper -h to view help"); } else { + // not a user error or logging is disabled -- throw it throw err; } }; internal.error = function() { - var msg = Utils.toArray(arguments).join(' '); + var msg = utils.toArray(arguments).join(' '); throw new Error(msg); }; internal.stop = function() { - throw new APIError(internal.formatLogArgs(arguments)); + throw new UserError(internal.formatLogArgs(arguments)); }; internal.message = function() { @@ -109,7 +174,7 @@ internal.formatStringsAsGrid = function(arr) { }; internal.logArgs = function(args) { - if (internal.LOGGING && !internal.QUIET && utils.isArrayLike(args)) { + if (internal.LOGGING && !internal.getStateVar('QUIET') && utils.isArrayLike(args)) { (console.error || console.log).call(console, internal.formatLogArgs(args)); } }; @@ -125,6 +190,12 @@ internal.probablyDecimalDegreeBounds = function(b) { return containsBounds(world, bbox); }; +internal.clampToWorldBounds = function(b) { + var bbox = (b instanceof Bounds) ? b.toArray() : b; + return new Bounds().setBounds(Math.max(bbox[0], -180), Math.max(bbox[1], -90), + Math.min(bbox[2], 180), Math.min(bbox[3], 90)); +}; + internal.layerHasGeometry = function(lyr) { return internal.layerHasPaths(lyr) || internal.layerHasPoints(lyr); }; @@ -144,23 +215,44 @@ internal.layerHasNonNullShapes = function(lyr) { }); }; -internal.requireDataFields = function(table, fields, cmd) { - var prefix = cmd ? '[' + cmd + '] ' : ''; +internal.requireDataFields = function(table, fields) { if (!table) { - stop(prefix + "Missing attribute data"); + stop("Missing attribute data"); } var dataFields = table.getFields(), missingFields = utils.difference(fields, dataFields); if (missingFields.length > 0) { - stop(prefix + "Table is missing one or more fields:\n", + stop("Table is missing one or more fields:\n", missingFields, "\nExisting fields:", '\n' + internal.formatStringsAsGrid(dataFields)); } }; +internal.layerTypeMessage = function(lyr, defaultMsg, customMsg) { + var msg; + if (customMsg && utils.isString(customMsg)) { + msg = customMsg; + } else { + msg = defaultMsg + ', '; + if (!lyr || !lyr.geometry_type) { + msg += 'received a layer with no geometry'; + } else { + msg += 'received a ' + lyr.geometry_type + ' layer'; + } + } + return msg; +}; + +internal.requirePolylineLayer = function(lyr, msg) { + if (!lyr || lyr.geometry_type !== 'polyline') + stop(internal.layerTypeMessage(lyr, "Expected a polyline layer", msg)); +}; + internal.requirePolygonLayer = function(lyr, msg) { - if (!lyr || lyr.geometry_type !== 'polygon') stop(msg || "Expected a polygon layer"); + if (!lyr || lyr.geometry_type !== 'polygon') + stop(internal.layerTypeMessage(lyr, "Expected a polygon layer", msg)); }; internal.requirePathLayer = function(lyr, msg) { - if (!lyr || !internal.layerHasPaths(lyr)) stop(msg || "Expected a polygon or polyline layer"); + if (!lyr || !internal.layerHasPaths(lyr)) + stop(internal.layerTypeMessage(lyr, "Expected a polygon or polyline layer", msg)); }; diff --git a/src/mapshaper.js b/src/mapshaper.js index 2c0f00943..b42ff7fe6 100644 --- a/src/mapshaper.js +++ b/src/mapshaper.js @@ -1,12 +1,13 @@ /* @requires mapshaper-commands +mapshaper-cli-utils */ api.cli = cli; api.internal = internal; api.utils = utils; api.geom = geom; -this.mapshaper = api; +mapshaper = api; // Expose internal objects for testing utils.extend(api.internal, { @@ -22,6 +23,7 @@ utils.extend(api.internal, { DbfReader: DbfReader, ShapefileTable: ShapefileTable, ArcCollection: ArcCollection, + PointIter: PointIter, ArcIter: ArcIter, ShapeIter: ShapeIter, Bounds: Bounds, @@ -32,7 +34,7 @@ utils.extend(api.internal, { topojson: TopoJSON, geojson: GeoJSON, svg: SVG, - APIError: APIError + UserError: UserError }); if (typeof define === "function" && define.amd) { diff --git a/src/paths/mapshaper-arc-dissolve.js b/src/paths/mapshaper-arc-dissolve.js index ff6e2dbbd..6d286a5a3 100644 --- a/src/paths/mapshaper-arc-dissolve.js +++ b/src/paths/mapshaper-arc-dissolve.js @@ -1,12 +1,13 @@ /* @requires mapshaper-nodes mapshaper-path-endpoints +mapshaper-path-utils mapshaper-dataset-utils */ // Dissolve arcs that can be merged without affecting topology of layers // remove arcs that are not referenced by any layer; remap arc ids -// in layers. (In-place). +// in layers. (dataset.arcs is replaced). internal.dissolveArcs = function(dataset) { var arcs = dataset.arcs, layers = dataset.layers.filter(internal.layerHasPaths); @@ -26,7 +27,7 @@ internal.dissolveArcs = function(dataset) { // modify copies of the original shapes; original shapes should be unmodified // (need to test this) lyr.shapes = lyr.shapes.map(function(shape) { - return internal.editPaths(shape && shape.concat(), translatePath); + return internal.editShapeParts(shape && shape.concat(), translatePath); }); }); dataset.arcs = internal.dissolveArcCollection(arcs, newArcs, totalPoints); @@ -119,7 +120,7 @@ internal.dissolveArcCollection = function(arcs, newArcs, newLen) { // Test whether two arcs can be merged together internal.getArcDissolveTest = function(layers, arcs) { - var nodes = internal.getFilteredNodeCollection(layers, arcs), + var nodes = new NodeCollection(arcs, internal.getArcPresenceTest2(layers, arcs)), // don't allow dissolving through endpoints of polyline paths lineLayers = layers.filter(function(lyr) {return lyr.geometry_type == 'polyline';}), testLineEndpoint = internal.getPathEndpointTest(lineLayers, arcs), @@ -140,19 +141,3 @@ internal.getArcDissolveTest = function(layers, arcs) { lastId = arcId; } }; - -internal.getFilteredNodeCollection = function(layers, arcs) { - var counts = internal.countArcReferences(layers, arcs), - test = function(arcId) { - return counts[absArcId(arcId)] > 0; - }; - return new NodeCollection(arcs, test); -}; - -internal.countArcReferences = function(layers, arcs) { - var counts = new Uint32Array(arcs.size()); - layers.forEach(function(lyr) { - internal.countArcsInShapes(lyr.shapes, counts); - }); - return counts; -}; diff --git a/src/paths/mapshaper-arc-flags.js b/src/paths/mapshaper-arc-flags.js new file mode 100644 index 000000000..035c1659a --- /dev/null +++ b/src/paths/mapshaper-arc-flags.js @@ -0,0 +1,25 @@ + +function ArcFlags(size) { + var fwd = new Int8Array(size), + rev = new Int8Array(size); + + this.get = function(arcId) { + return arcId < 0 ? rev[~arcId] : fwd[arcId]; + }; + + this.set = function(arcId, val) { + if (arcId < 0) { + rev[~arcId] = val; + } else { + fwd[arcId] = val; + } + }; + + this.setUsed = function(arcId) { + this.set(arcId, 1); + }; + + this.isUsed = function(arcId) { + return this.get(arcId) !== 0; + }; +} diff --git a/src/paths/mapshaper-arcs.js b/src/paths/mapshaper-arcs.js index 272b40f96..2a0df05b6 100644 --- a/src/paths/mapshaper-arcs.js +++ b/src/paths/mapshaper-arcs.js @@ -130,7 +130,10 @@ function ArcCollection() { this.getCopy = function() { var copy = new ArcCollection(new Int32Array(_nn), new Float64Array(_xx), new Float64Array(_yy)); - if (_zz) copy.setThresholds(new Float64Array(_zz)); + if (_zz) { + copy.setThresholds(new Float64Array(_zz)); + copy.setRetainedInterval(_zlimit); + } return copy; }; @@ -211,12 +214,13 @@ function ArcCollection() { step = fw ? 1 : -1, v1 = fw ? _ii[absId] : _ii[absId] + n - 1, v2 = v1, + xx = _xx, yy = _yy, zz = _zz, count = 0; for (var j = 1; j < n; j++) { v2 += step; - if (zlim === 0 || _zz[v2] >= zlim) { - cb(v1, v2, _xx, _yy); + if (zlim === 0 || zz[v2] >= zlim) { + cb(v1, v2, xx, yy); v1 = v2; count++; } @@ -283,26 +287,29 @@ function ArcCollection() { // Return null if no arcs were re-indexed (and no arcs were removed) // this.filter = function(cb) { - var map = new Int32Array(this.size()), + var test = function(i) { + return cb(this.getArcIter(i), i); + }.bind(this); + return this.deleteArcs(test); + }; + + this.deleteArcs = function(test) { + var n = this.size(), + map = new Int32Array(n), goodArcs = 0, goodPoints = 0; - for (var i=0, n=this.size(); i 0) { - arr = this.getRemovableThresholds(); + arr = this.getRemovableThresholds(nth); rank = utils.findRankByValue(arr, val); pct = arr.length > 0 ? 1 - (rank - 1) / arr.length : 1; } else { @@ -529,23 +538,9 @@ function ArcCollection() { return pct; }; - this.getThresholdByPct = function(pct) { - var tmp = this.getRemovableThresholds(), - rank, z; - if (tmp.length === 0) { // No removable points - rank = 0; - } else { - rank = Math.floor((1 - pct) * (tmp.length + 2)); - } - - if (rank <= 0) { - z = 0; - } else if (rank > tmp.length) { - z = Infinity; - } else { - z = utils.findValueByRank(tmp, rank); - } - return z; + // nth (optional): sample every nth threshold (use estimate for speed) + this.getThresholdByPct = function(pct, nth) { + return internal.getThresholdByPct(pct, this, nth); }; this.arcIntersectsBBox = function(i, b1) { @@ -579,6 +574,8 @@ function ArcCollection() { return _xx && _xx.length || 0; }; + this.getFilteredPointCount = getFilteredPointCount; + this.getBounds = function() { return _allBounds.clone(); }; @@ -609,6 +606,7 @@ function ArcCollection() { return bbox; }; + // TODO: move this and similar methods out of ArcCollection this.getMultiShapeBounds = function(shapeIds, bounds) { bounds = bounds || new Bounds(); if (shapeIds) { // handle null shapes diff --git a/src/paths/mapshaper-path-division.js b/src/paths/mapshaper-path-division.js index 806ea175d..b2b34204d 100644 --- a/src/paths/mapshaper-path-division.js +++ b/src/paths/mapshaper-path-division.js @@ -3,6 +3,7 @@ mapshaper-segment-intersection, mapshaper-dataset-utils, mapshaper-path-index mapshaper-polygon-repair +mapshaper-units */ // Functions for dividing polygons and polygons at points where arc-segments intersect @@ -16,34 +17,136 @@ mapshaper-polygon-repair // Divide a collection of arcs at points where segments intersect // and re-index the paths of all the layers that reference the arc collection. // (in-place) -internal.addIntersectionCuts = function(dataset, opts) { +internal.addIntersectionCuts = function(dataset, _opts) { + var opts = _opts || {}; var arcs = dataset.arcs; - var snapDist = internal.getHighPrecisionSnapInterval(arcs); - var snapCount = opts && opts.no_snap ? 0 : internal.snapCoordsByInterval(arcs, snapDist); - var dupeCount = arcs.dedupCoords(); + var snapDist, snapCount, dupeCount, nodes; + if (opts.snap_interval) { + snapDist = internal.convertIntervalParam(opts.snap_interval, internal.getDatasetCRS(dataset)); + } else { + snapDist = internal.getHighPrecisionSnapInterval(arcs); + } + debug('addIntersectionCuts() snap dist:', snapDist); + + // bake-in any simplification (bug fix; before, -simplify followed by dissolve2 + // used to reset simplification) + arcs.flatten(); + snapCount = opts.no_snap ? 0 : internal.snapCoordsByInterval(arcs, snapDist); + dupeCount = arcs.dedupCoords(); if (snapCount > 0 || dupeCount > 0) { // Detect topology again if coordinates have changed api.buildTopology(dataset); } // cut arcs at points where segments intersect - var map = internal.divideArcs(arcs); - - // update arc ids in arc-based layers and clean up arc geometry - // to remove degenerate arcs and duplicate points - var nodes = new NodeCollection(arcs); + internal.cutPathsAtIntersections(dataset); + // Clean shapes by removing collapsed arc references, etc. + // TODO: consider alternative -- avoid creating degenerate arcs + // in insertCutPoints() dataset.layers.forEach(function(lyr) { if (internal.layerHasPaths(lyr)) { - internal.updateArcIds(lyr.shapes, map, nodes); - // Clean shapes by removing collapsed arc references, etc. - // TODO: consider alternative -- avoid creating degenerate arcs - // in insertCutPoints() internal.cleanShapes(lyr.shapes, arcs, lyr.geometry_type); } }); + // Further clean-up -- remove duplicate and missing arcs + nodes = internal.cleanArcReferences(dataset); + return nodes; }; +// Remap any references to duplicate arcs in paths to use the same arcs +// Remove any unused arcs from the dataset's ArcCollection. +// Return a NodeCollection +internal.cleanArcReferences = function(dataset) { + var nodes = new NodeCollection(dataset.arcs); + var map = internal.findDuplicateArcs(nodes); + var dropCount; + if (map) { + internal.replaceIndexedArcIds(dataset, map); + } + dropCount = internal.deleteUnusedArcs(dataset); + if (dropCount > 0) { + // rebuild nodes if arcs have changed + nodes = new NodeCollection(dataset.arcs); + } + return nodes; +}; + + +// @map an Object mapping old to new ids +internal.replaceIndexedArcIds = function(dataset, map) { + var remapPath = function(ids) { + var arcId, absId, id2; + for (var i=0; i 0 ? map : null; +}; + +internal.deleteUnusedArcs = function(dataset) { + var test = internal.getArcPresenceTest2(dataset.layers, dataset.arcs); + var count1 = dataset.arcs.size(); + var map = dataset.arcs.deleteArcs(test); // condenses arcs + var count2 = dataset.arcs.size(); + var deleteCount = count1 - count2; + if (deleteCount > 0) { + internal.replaceIndexedArcIds(dataset, map); + } + return deleteCount; +}; + +// Return a function for updating a path (array of arc ids) +// @map array generated by insertCutPoints() +// @arcCount number of arcs in divided collection (kludge) +internal.getDividedArcUpdater = function(map, arcCount) { + return function(ids) { + var ids2 = []; + for (var j=0; j= map.length - 1 ? arcCount : map[absId + 1]) - 1, + id2; + do { + if (rev) { + id2 = ~max; + max--; + } else { + id2 = min; + min++; + } + ids.push(id2); + } while (max - min >= 0); + } +}; + // Divides a collection of arcs at points where arc paths cross each other // Returns array for remapping arc ids internal.divideArcs = function(arcs) { @@ -51,10 +154,25 @@ internal.divideArcs = function(arcs) { // TODO: avoid the following if no points need to be added var map = internal.insertCutPoints(points, arcs); // segment-point intersections currently create duplicate points + // TODO: consider dedup in a later cleanup pass? arcs.dedupCoords(); return map; }; +internal.cutPathsAtIntersections = function(dataset) { + var map = internal.divideArcs(dataset.arcs); + internal.remapDividedArcs(dataset, map); +}; + +internal.remapDividedArcs = function(dataset, map) { + var remapPath = internal.getDividedArcUpdater(map, dataset.arcs.size()); + dataset.layers.forEach(function(lyr) { + if (internal.layerHasPaths(lyr)) { + internal.editShapes(lyr.shapes, remapPath); + } + }); +}; + // Inserts array of cutting points into an ArcCollection // Returns array for remapping arc ids internal.insertCutPoints = function(unfilteredPoints, arcs) { @@ -73,7 +191,9 @@ internal.insertCutPoints = function(unfilteredPoints, arcs) { yy1 = new Float64Array(destPointTotal), n0, n1, arcLen, p; + points.reverse(); // reverse sorted order to use pop() + p = points.pop(); for (var srcArcId=0, destArcId=0; srcArcId < srcArcTotal; srcArcId++) { @@ -135,9 +255,15 @@ internal.getCutPoint = function(x, y, i, j, xx, yy) { } if (geom.outsideRange(x, ix, jx) || geom.outsideRange(y, iy, jy)) { // out-of-range issues should have been handled upstream - trace("[getCutPoint()] Coordinate range error"); + debug("[getCutPoint()] Coordinate range error"); return null; } + // if (x == ix && y == iy || x == jx && y == jy) { + // if point xy is at a vertex, don't insert a (duplicate) point + // TODO: investigate why this can cause pathfinding errors + // e.g. when clipping cd115_districts + // return null; + // } return {x: x, y: y, i: i}; }; @@ -186,46 +312,3 @@ internal.findClippingPoints = function(arcs) { data = arcs.getVertexData(); return internal.convertIntersectionsToCutPoints(intersections, data.xx, data.yy); }; - -// Updates arc ids in @shapes array using @map object -// ... also, removes references to duplicate arcs -internal.updateArcIds = function(shapes, map, nodes) { - var arcCount = nodes.arcs.size(), - shape2; - for (var i=0; i= map.length - 1 ? arcCount : map[absId + 1]) - 1, - id2; - do { - if (rev) { - id2 = ~max; - max--; - } else { - id2 = min; - min++; - } - // If there are duplicate arcs, switch to the same one - if (nodes) { - id2 = nodes.findMatchingArc(id2); - } - ids.push(id2); - } while (max - min >= 0); - } -}; diff --git a/src/paths/mapshaper-path-endpoints.js b/src/paths/mapshaper-path-endpoints.js index 5891c39a0..0c2ad5ff9 100644 --- a/src/paths/mapshaper-path-endpoints.js +++ b/src/paths/mapshaper-path-endpoints.js @@ -10,7 +10,7 @@ internal.getPathEndpointTest = function(layers, arcs) { }); function addShape(shape) { - internal.forEachPath(shape, addPath); + internal.forEachShapePart(shape, addPath); } function addPath(path) { diff --git a/src/paths/mapshaper-path-filters.js b/src/paths/mapshaper-path-filters.js new file mode 100644 index 000000000..542eabf2e --- /dev/null +++ b/src/paths/mapshaper-path-filters.js @@ -0,0 +1,45 @@ +/* @requires mapshaper-shape-geom */ + +internal.getVertexCountTest = function(minVertices, arcs) { + return function(path) { + // first and last vertex in ring count as one + return geom.countVerticesInPath(path, arcs) <= minVertices; + }; +}; + +internal.getSliverTest = function(arcs) { + var maxSliverArea = internal.calcMaxSliverArea(arcs); + return function(path) { + // TODO: more sophisticated metric, perhaps considering shape + var area = geom.getPlanarPathArea(path, arcs); + return Math.abs(area) <= maxSliverArea; + }; +}; + +internal.getMinAreaTest = function(areaParam, dataset, opts) { + var arcs = dataset.arcs; + var minArea = internal.convertAreaParam(areaParam, internal.getDatasetCRS(dataset)); + if (opts && opts.weighted) { + return internal.getWeightedMinAreaFilter(minArea, dataset.arcs); + } + return internal.getMinAreaFilter(minArea, dataset.arcs); +}; + +internal.getMinAreaFilter = function(minArea, arcs) { + var pathArea = arcs.isPlanar() ? geom.getPlanarPathArea : geom.getSphericalPathArea; + return function(path) { + var area = pathArea(path, arcs); + return Math.abs(area) < minArea; + }; +}; + +internal.getWeightedMinAreaFilter = function(minArea, arcs) { + var pathArea = arcs.isPlanar() ? geom.getPlanarPathArea : geom.getSphericalPathArea; + var pathPerimeter = arcs.isPlanar() ? geom.getPlanarPathPerimeter : geom.getSphericalPathPerimeter; + return function(path) { + var area = pathArea(path, arcs); + var perim = pathPerimeter(path, arcs); + var compactness = geom.calcPolsbyPopperCompactness(area, perim); + return Math.abs(area * compactness) < minArea; + }; +}; diff --git a/src/paths/mapshaper-path-import.js b/src/paths/mapshaper-path-import.js index adcc5d365..4ec6611d2 100644 --- a/src/paths/mapshaper-path-import.js +++ b/src/paths/mapshaper-path-import.js @@ -4,8 +4,30 @@ mapshaper-shape-geom, mapshaper-snapping, mapshaper-shape-utils, mapshaper-polygon-repair +mapshaper-units */ +// Apply snapping, remove duplicate coords and clean up defective paths in a dataset +// Assumes that any CRS info has been added to the dataset +// @opts: import options +internal.cleanPathsAfterImport = function(dataset, opts) { + var arcs = dataset.arcs; + var snapDist; + if (opts.snap || opts.auto_snap || opts.snap_interval) { // auto_snap is older name + if (opts.snap_interval) { + snapDist = internal.convertIntervalParam(opts.snap_interval, internal.getDatasetCRS(dataset)); + } + if (arcs) { + internal.snapCoords(arcs, snapDist); + } + } + dataset.layers.forEach(function(lyr) { + if (internal.layerHasPaths(lyr)) { + internal.cleanShapes(lyr.shapes, arcs, lyr.geometry_type); + } + }); +}; + // Accumulates points in buffers until #endPath() is called // @drain callback: function(xarr, yarr, size) {} // @@ -108,6 +130,7 @@ function PathImporter(opts) { var arcs; var layers; var lyr = {name: ''}; + var snapDist; if (dupeCount > 0) { verbose(utils.format("Removed %,d duplicate point%s", dupeCount, utils.pluralSuffix(dupeCount))); @@ -122,9 +145,9 @@ function PathImporter(opts) { } arcs = new ArcCollection(nn, xx, yy); - if (opts.auto_snap || opts.snap_interval) { - internal.snapCoords(arcs, opts.snap_interval); - } + //if (opts.snap || opts.auto_snap || opts.snap_interval) { // auto_snap is older name + // internal.snapCoords(arcs, opts.snap_interval); + //} } if (collectionType == 'mixed') { @@ -142,9 +165,9 @@ function PathImporter(opts) { } layers.forEach(function(lyr) { - if (internal.layerHasPaths(lyr)) { - internal.cleanShapes(lyr.shapes, arcs, lyr.geometry_type); - } + //if (internal.layerHasPaths(lyr)) { + //internal.cleanShapes(lyr.shapes, arcs, lyr.geometry_type); + //} if (lyr.data) { internal.fixInconsistentFields(lyr.data.getRecords()); } diff --git a/src/paths/mapshaper-path-index.js b/src/paths/mapshaper-path-index.js index 8c41659d3..34c961f6d 100644 --- a/src/paths/mapshaper-path-index.js +++ b/src/paths/mapshaper-path-index.js @@ -3,58 +3,87 @@ mapshaper-shape-utils mapshaper-dataset-utils mapshaper-shape-geom mapshaper-polygon-index +mapshaper-bounds-search */ function PathIndex(shapes, arcs) { - var _index; - // var totalArea = arcs.getBounds().area(); + var boundsQuery = internal.getBoundsSearchFunction(getRingData(shapes, arcs)); var totalArea = internal.getPathBounds(shapes, arcs).area(); - init(shapes); - - function init(shapes) { - var boxes = []; + function getRingData(shapes, arcs) { + var arr = []; shapes.forEach(function(shp, shpId) { var n = shp ? shp.length : 0; for (var i=0; i totalArea * 0.02) { - bbox.index = new PolygonIndex([ids], arcs); + // Returns shape ids of all polygons that intersect point p + // (p is inside a ring or on the boundary) + this.findEnclosingShapes = function(p) { + var ids = []; + var groups = groupItemsByShapeId(findPointHitCandidates(p)); + groups.forEach(function(group) { + if (testPointInRings(p, group)) { + ids.push(group[0].id); } - } - } + }); + return ids; + }; + // Returns shape id of a polygon that intersects p or -1 + // (If multiple intersections, returns on of the polygons) this.findEnclosingShape = function(p) { var shpId = -1; - var shapes = findPointHitShapes(p); - shapes.forEach(function(paths) { - if (testPointInRings(p, paths)) { - shpId = paths[0].id; + var groups = groupItemsByShapeId(findPointHitCandidates(p)); + groups.forEach(function(group) { + if (testPointInRings(p, group)) { + shpId = group[0].id; } }); return shpId; }; + this.findPointEnclosureCandidates = function(p, buffer) { + var items = findPointHitCandidates(p, buffer); + return utils.pluck(items, 'id'); + }; + this.pointIsEnclosed = function(p) { - return testPointInRings(p, findPointHitRings(p)); + return testPointInRings(p, findPointHitCandidates(p)); + }; + + // Finds the polygon containing the smallest ring that entirely contains @ring + // Assumes ring boundaries do not cross. + // Unhandled edge case: + // two rings share at least one segment but are not congruent. + // @ring: array of arc ids + // Returns id of enclosing polygon or -1 if none found + this.findSmallestEnclosingPolygon = function(ring) { + var bounds = arcs.getSimpleShapeBounds(ring); + var p = getTestPoint(ring); + var smallest; + findPointHitCandidates(p).forEach(function(cand) { + if (cand.bounds.contains(bounds) && // skip partially intersecting bboxes (can't be enclosures) + !cand.bounds.sameBounds(bounds) && // skip self, congruent and reversed-congruent rings + !(smallest && smallest.bounds.area() < cand.bounds.area()) && + testPointInRing(p, cand)) { + smallest = cand; + } + }); + + return smallest ? smallest.id : -1; }; this.arcIsEnclosed = function(arcId) { - return this.pointIsEnclosed(getTestPoint(arcId)); + return this.pointIsEnclosed(getTestPoint([arcId])); }; // Test if a polygon ring is contained within an indexed ring @@ -64,28 +93,24 @@ function PathIndex(shapes, arcs) { // been detected previously). // this.pathIsEnclosed = function(pathIds) { - var arcId = pathIds[0]; - var p = getTestPoint(arcId); - return this.pointIsEnclosed(p); + return this.pointIsEnclosed(getTestPoint(pathIds)); }; // return array of paths that are contained within a path, or null if none // @pathIds Array of arc ids comprising a closed path this.findEnclosedPaths = function(pathIds) { - var pathBounds = arcs.getSimpleShapeBounds(pathIds), - cands = _index.search(pathBounds.toArray()), + var b = arcs.getSimpleShapeBounds(pathIds), + cands = boundsQuery(b.xmin, b.ymin, b.xmax, b.ymax), paths = [], index; if (cands.length > 6) { index = new PolygonIndex([pathIds], arcs); } - - cands.forEach(function(cand) { - var p = getTestPoint(cand.ids[0]); - var isEnclosed = index ? - index.pointInPolygon(p[0], p[1]) : pathContainsPoint(pathIds, pathBounds, p); + var p = getTestPoint(cand.ids); + var isEnclosed = b.containsPoint(p[0], p[1]) && (index ? + index.pointInPolygon(p[0], p[1]) : geom.testPointInRing(p[0], p[1], pathIds, arcs)); if (isEnclosed) { paths.push(cand.ids); } @@ -104,13 +129,24 @@ function PathIndex(shapes, arcs) { return paths.length > 0 ? paths : null; }; + function testPointInRing(p, cand) { + if (!cand.bounds.containsPoint(p[0], p[1])) return false; + if (!cand.index && cand.bounds.area() > totalArea * 0.01) { + // index larger polygons (because they are slower to test via pointInRing() + // and they are more likely to be involved in repeated hit tests). + cand.index = new PolygonIndex([cand.ids], arcs); + } + return cand.index ? + cand.index.pointInPolygon(p[0], p[1]) : + geom.testPointInRing(p[0], p[1], cand.ids, arcs); + } + + // function testPointInRings(p, cands) { var isOn = false, isIn = false; cands.forEach(function(cand) { - var inRing = cand.index ? - cand.index.pointInPolygon(p[0], p[1]) : - pathContainsPoint(cand.ids, cand.bounds, p); + var inRing = testPointInRing(p, cand); if (inRing == -1) { isOn = true; } else if (inRing == 1) { @@ -120,43 +156,42 @@ function PathIndex(shapes, arcs) { return isOn || isIn; } - function findPointHitShapes(p) { - var rings = findPointHitRings(p), - shapes = [], - shape, bbox; - if (rings.length > 0) { - rings.sort(function(a, b) {return a.id - b.id;}); - for (var i=0; i 0) { + items.sort(function(a, b) {return a.id - b.id;}); + for (var i=0; i 0 ? buffer : 0; + var x = p[0], y = p[1]; + return boundsQuery(p[0] - b, p[1] - b, p[0] + b, p[1] + b); } - function getTestPoint(arcId) { - // test point halfway along first segment because ring might still be - // enclosed if a segment endpoint touches an indexed ring. - var p0 = arcs.getVertex(arcId, 0), + // Find a point on a ring to use for point-in-polygon testing + function getTestPoint(ring) { + // Use the point halfway along first segment rather than an endpoint + // (because ring might still be enclosed if a segment endpoint touches an indexed ring.) + // The returned point should work for point-in-polygon testing if two rings do not + // share any common segments (which should be true for topological datasets) + // TODO: consider alternative of finding an internal point of @ring (slower but + // potentially more reliable). + var arcId = ring[0], + p0 = arcs.getVertex(arcId, 0), p1 = arcs.getVertex(arcId, 1); return [(p0.x + p1.x) / 2, (p0.y + p1.y) / 2]; } - function pathContainsPoint(pathIds, pathBounds, p) { - if (pathBounds.containsPoint(p[0], p[1]) === false) return 0; - // A contains B iff some point on B is inside A - return geom.testPointInRing(p[0], p[1], pathIds, arcs); - } - function xorArrays(a, b) { var xor = []; a.forEach(function(el) { diff --git a/src/paths/mapshaper-pathfinder.js b/src/paths/mapshaper-pathfinder.js index 9a1ff9ccf..d11776d71 100644 --- a/src/paths/mapshaper-pathfinder.js +++ b/src/paths/mapshaper-pathfinder.js @@ -56,7 +56,7 @@ internal.openArcRoutes = function(arcIds, arcs, flags, fwd, rev, dissolve, orBit // error condition: lollipop arcs can cause problems; ignore these if (arcs.arcIsLollipop(id)) { - trace('lollipop'); + debug('lollipop'); newFlag = 0; // unset (i.e. make invisible) } else { if (openFwd) { @@ -143,7 +143,7 @@ internal.getPathFinder = function(nodes, useRoute, routeIsUsable) { if (candId == ~nextId) { // TODO: handle or prevent this error condition - message("Pathfinder warning: dead-end path"); + debug("Pathfinder warning: dead-end path"); return null; } } while (candId != startId); @@ -169,7 +169,7 @@ internal.getRingIntersector = function(nodes, type, flags) { if (rings.length > 0) { output = []; internal.openArcRoutes(rings, arcs, flags, openFwd, openRev, dissolve); - internal.forEachPath(rings, function(ids) { + internal.forEachShapePart(rings, function(ids) { var path; for (var i=0, n=ids.length; i 0 ? opts.buckets : segCount / 100; + // default is this many segs per bucket (average) + // var buckets = opts && opts.buckets > 0 ? opts.buckets : segCount / 200; + // using more segs/bucket for more complex shapes, based on trial and error + var buckets = Math.pow(segCount, 0.75) / 10; return Math.ceil(buckets); } @@ -72,12 +74,12 @@ function PolygonIndex(shape, arcs, opts) { a, b, i, j, xmin, xmax; // get array of segments as [s0p0, s0p1, s1p0, s1p1, ...], sorted by xmin coordinate - internal.forEachPathSegment(shape, arcs, function() { + internal.forEachSegmentInShape(shape, arcs, function() { segCount++; }); segments = new Uint32Array(segCount * 2); i = 0; - internal.forEachPathSegment(shape, arcs, function(a, b, xx, yy) { + internal.forEachSegmentInShape(shape, arcs, function(a, b, xx, yy) { segments[i++] = a; segments[i++] = b; }); diff --git a/src/paths/mapshaper-polygon-repair.js b/src/paths/mapshaper-polygon-repair.js index 39675fde6..971d3b8d4 100644 --- a/src/paths/mapshaper-polygon-repair.js +++ b/src/paths/mapshaper-polygon-repair.js @@ -1,6 +1,6 @@ /* @require mapshaper-polygon-holes */ -// clean polygon or polyline shapes, in-place +// Clean polygon or polyline shapes (in-place) // internal.cleanShapes = function(shapes, arcs, type) { for (var i=0, n=shapes.length; i maxLen) { + maxLen = len; + maxPart = path; + } + }); + return maxPart; +}; diff --git a/src/paths/mapshaper-ring-nesting.js b/src/paths/mapshaper-ring-nesting.js new file mode 100644 index 000000000..4d1242656 --- /dev/null +++ b/src/paths/mapshaper-ring-nesting.js @@ -0,0 +1,50 @@ +/* @requires mapshaper-shape-utils, mapshaper-path-index */ + +// Delete rings that are nested directly inside an enclosing ring with the same winding direction +// Does not remove unenclosed CCW rings (currently this causes problems when +// rounding coordinates for SVG and TopoJSON output) +// Assumes ring boundaries do not overlap (should be true after e.g. dissolving) +// +internal.fixNestingErrors = function(rings, arcs) { + if (rings.length <= 1) return rings; + var ringData = internal.getPathMetadata(rings, arcs, 'polygon'); + // convert rings to shapes for PathIndex + var shapes = rings.map(function(ids) {return [ids];}); + var index = new PathIndex(shapes, arcs); + return rings.filter(ringIsValid); + + function ringIsValid(ids, i) { + var containerId = index.findSmallestEnclosingPolygon(ids); + var ringIsCW, containerIsCW; + var valid = true; + if (containerId > -1) { + ringIsCW = ringData[i].area > 0; + containerIsCW = ringData[containerId].area > 0; + if (containerIsCW == ringIsCW) { + // reject rings with same chirality as their containing ring + valid = false; + } + } + return valid; + } +}; + +// Convert CCW rings that are not contained into CW rings +internal.fixNestingErrors2 = function(rings, arcs) { + var ringData = internal.getPathMetadata(rings, arcs, 'polygon'); + // convert rings to shapes for PathIndex + var shapes = rings.map(function(ids) {return [ids];}); + var index = new PathIndex(shapes, arcs); + rings.forEach(fixRing); + // TODO: consider other kinds of nesting errors + function fixRing(ids, i) { + var ringIsCW = ringData[i].area > 0; + var containerId; + if (!ringIsCW) { + containerId = index.findSmallestEnclosingPolygon(ids); + if (containerId == -1) { + internal.reversePath(ids); + } + } + } +}; diff --git a/src/paths/mapshaper-segment-intersection-info.js b/src/paths/mapshaper-segment-intersection-info.js new file mode 100644 index 000000000..40cbc0def --- /dev/null +++ b/src/paths/mapshaper-segment-intersection-info.js @@ -0,0 +1,28 @@ +// TODO: improve + +// internal.getIntersectionDebugData = function(o, arcs) { +// var data = arcs.getVertexData(); +// var a = o.a; +// var b = o.b; +// o = utils.extend({}, o); +// o.ax1 = data.xx[a[0]]; +// o.ay1 = data.yy[a[0]]; +// o.ax2 = data.xx[a[1]]; +// o.ay2 = data.yy[a[1]]; +// o.bx1 = data.xx[b[0]]; +// o.by1 = data.yy[b[0]]; +// o.bx2 = data.xx[b[1]]; +// o.by2 = data.yy[b[1]]; +// return o; +// }; + +// internal.debugSegmentIntersection = function(p, ax, ay, bx, by, cx, cy, dx, dy) { +// debug('[debugSegmentIntersection()]'); +// debug(' s1\n dx:', Math.abs(ax - bx), '\n dy:', Math.abs(ay - by)); +// debug(' s2\n dx:', Math.abs(cx - dx), '\n dy:', Math.abs(cy - dy)); +// debug(' s1 xx:', ax, bx); +// debug(' s2 xx:', cx, dx); +// debug(' s1 yy:', ay, by); +// debug(' s2 yy:', cy, dy); +// debug(' angle:', geom.signedAngle(ax, ay, bx, by, dx - cx + bx, dy - cy + by)); +// }; \ No newline at end of file diff --git a/src/paths/mapshaper-segment-intersection.js b/src/paths/mapshaper-segment-intersection.js index b07ca4637..00b2b055d 100644 --- a/src/paths/mapshaper-segment-intersection.js +++ b/src/paths/mapshaper-segment-intersection.js @@ -28,16 +28,17 @@ internal.findSegmentIntersections = (function() { return new Uint32Array(buf, 0, count); } - return function(arcs) { - var bounds = arcs.getBounds(), + return function(arcs, arg2) { + var opts = arg2 || {}, + bounds = arcs.getBounds(), // TODO: handle spherical bounds spherical = !arcs.isPlanar() && containsBounds(internal.getWorldBounds(), bounds.toArray()), ymin = bounds.ymin, yrange = bounds.ymax - ymin, - stripeCount = internal.calcSegmentIntersectionStripeCount(arcs), + stripeCount = opts.stripes || internal.calcSegmentIntersectionStripeCount(arcs), stripeSizes = new Uint32Array(stripeCount), - stripeId = stripeCount > 1 ? multiStripeId : singleStripeId, + stripeId = stripeCount > 1 && yrange > 0 ? multiStripeId : singleStripeId, i, j; function multiStripeId(y) { @@ -45,7 +46,6 @@ internal.findSegmentIntersections = (function() { } function singleStripeId(y) {return 0;} - // Count segments in each stripe arcs.forEachSegment(function(id1, id2, xx, yy) { var s1 = stripeId(yy[id1]), @@ -94,6 +94,7 @@ internal.findSegmentIntersections = (function() { intersections.push(arr[j]); } } + return internal.dedupIntersections(intersections); }; })(); @@ -122,9 +123,25 @@ internal.getIntersectionKey = function(o) { return o.a.join(',') + ';' + o.b.join(','); }; +// Fast method +// TODO: measure performance using a range of input data +internal.calcSegmentIntersectionStripeCount2 = function(arcs) { + var segs = arcs.getFilteredPointCount() - arcs.size(); + var stripes = Math.pow(segs, 0.4) * 2; + return Math.ceil(stripes) || 1; +}; + +// Alternate fast method internal.calcSegmentIntersectionStripeCount = function(arcs) { + var segs = arcs.getFilteredPointCount() - arcs.size(); + var stripes = Math.ceil(Math.pow(segs * 10, 0.6) / 40); + return stripes > 0 ? stripes : 1; +}; + +// Old method calculates average segment length -- slow +internal.calcSegmentIntersectionStripeCount_old = function(arcs) { var yrange = arcs.getBounds().height(), - segLen = internal.getAvgSegment2(arcs)[1], + segLen = internal.getAvgSegment2(arcs)[1], // slow count = 1; if (segLen > 0 && yrange > 0) { count = Math.ceil(yrange / segLen / 20); @@ -190,7 +207,7 @@ internal.intersectSegments = function(ids, xx, yy) { } // test two candidate segments for intersection - hit = segmentIntersection(s1p1x, s1p1y, s1p2x, s1p2y, + hit = geom.segmentIntersection(s1p1x, s1p1y, s1p2x, s1p2y, s2p1x, s2p1y, s2p2x, s2p2y); if (hit) { seg1 = [s1p1, s1p2]; diff --git a/src/paths/mapshaper-shape-iter.js b/src/paths/mapshaper-shape-iter.js index 59b26831b..3de1a452f 100644 --- a/src/paths/mapshaper-shape-iter.js +++ b/src/paths/mapshaper-shape-iter.js @@ -1,13 +1,38 @@ -// Constructor takes arrays of coords: xx, yy, zz (optional) +// Coordinate iterators +// +// Interface: +// properties: x, y +// method: hasNext() // -// Iterate over the points of an arc -// properties: x, y -// method: hasNext() -// usage: +// Usage: // while (iter.hasNext()) { // iter.x, iter.y; // do something w/ x & y // } + + +// Iterate over an array of [x, y] points +// +function PointIter(points) { + var n = points.length, + i = 0, + iter = { + x: 0, + y: 0, + hasNext: hasNext + }; + function hasNext() { + if (i >= n) return false; + iter.x = points[i][0]; + iter.y = points[i][1]; + i++; + return true; + } + return iter; +} + + +// Constructor takes arrays of coords: xx, yy, zz (optional) // function ArcIter(xx, yy) { this._i = 0; @@ -86,7 +111,6 @@ function FilteredArcIter(xx, yy, zz) { } // Iterate along a path made up of one or more arcs. -// Similar interface to ArcIter() // function ShapeIter(arcs) { this._arcs = arcs; diff --git a/src/paths/mapshaper-snapping.js b/src/paths/mapshaper-snapping.js index 42e59df26..eec4a99c9 100644 --- a/src/paths/mapshaper-snapping.js +++ b/src/paths/mapshaper-snapping.js @@ -21,7 +21,6 @@ internal.snapCoords = function(arcs, threshold) { snapDist = threshold; message(utils.format("Applying snapping threshold of %s -- %.6f times avg. segment length", threshold, threshold / avgDist)); } - var snapCount = internal.snapCoordsByInterval(arcs, snapDist); if (snapCount > 0) arcs.dedupCoords(); message(utils.format("Snapped %s point%s", snapCount, utils.pluralSuffix(snapCount))); diff --git a/src/geom/mapshaper-polygon-centroid.js b/src/points/mapshaper-anchor-points.js similarity index 80% rename from src/geom/mapshaper-polygon-centroid.js rename to src/points/mapshaper-anchor-points.js index 2fe58e7e1..025e71035 100644 --- a/src/geom/mapshaper-polygon-centroid.js +++ b/src/points/mapshaper-anchor-points.js @@ -1,38 +1,5 @@ -/* @requires mapshaper-shape-geom, mapshaper-simplify-fast */ +/* @requires mapshaper-shape-geom mapshaper-simplify-fast */ -// Get the centroid of the largest ring of a polygon -// TODO: Include holes in the calculation -// TODO: Add option to find centroid of all rings, not just the largest -geom.getShapeCentroid = function(shp, arcs) { - var maxPath = geom.getMaxPath(shp, arcs); - return maxPath ? geom.getPathCentroid(maxPath, arcs) : null; -}; - -geom.getPathCentroid = function(ids, arcs) { - var iter = arcs.getShapeIter(ids), - sum = 0, - sumX = 0, - sumY = 0, - ax, ay, tmp, area; - if (!iter.hasNext()) return null; - ax = iter.x; - ay = iter.y; - while (iter.hasNext()) { - tmp = ax * iter.y - ay * iter.x; - sum += tmp; - sumX += tmp * (iter.x + ax); - sumY += tmp * (iter.y + ay); - ax = iter.x; - ay = iter.y; - } - area = sum / 2; - if (area === 0) { - return geom.getAvgPathXY(ids, arcs); - } else return { - x: sumX / (6 * area), - y: sumY / (6 * area) - }; -}; // Find a point inside a polygon and located away from the polygon edge // Method: @@ -47,23 +14,28 @@ geom.getPathCentroid = function(ids, arcs) { // // (distance is weighted to slightly favor points near centroid) // -geom.findInteriorPoint = function(shp, arcs) { +internal.findAnchorPoint = function(shp, arcs) { var maxPath = shp && geom.getMaxPath(shp, arcs), pathBounds = maxPath && arcs.getSimpleShapeBounds(maxPath), thresh, simple; if (!pathBounds || !pathBounds.hasBounds() || pathBounds.area() === 0) { return null; } + // Optimization: quickly simplify using a relatively small distance threshold. + // (testing multiple candidate points can be very slow for large and detailed + // polgons; simplification alleviates this) + // Caveat: In rare cases this could cause poor point placement, e.g. if + // simplification causes small holes to be removed. thresh = Math.sqrt(pathBounds.area()) * 0.01; simple = internal.simplifyPolygonFast(shp, arcs, thresh); if (!simple.shape) { return null; // collapsed shape } - return geom.findInteriorPoint2(simple.shape, simple.arcs); + return internal.findAnchorPoint2(simple.shape, simple.arcs); }; // Assumes: shp is a polygon with at least one space-enclosing ring -geom.findInteriorPoint2 = function(shp, arcs) { +internal.findAnchorPoint2 = function(shp, arcs) { var maxPath = geom.getMaxPath(shp, arcs); var pathBounds = arcs.getSimpleShapeBounds(maxPath); var centroid = geom.getPathCentroid(maxPath, arcs); @@ -88,13 +60,13 @@ geom.findInteriorPoint2 = function(shp, arcs) { hstep = hrange / htics; // Find a best-fit point - p = internal.probeForBestInteriorPoint(shp, arcs, lbound, rbound, htics, weight); + p = internal.probeForBestAnchorPoint(shp, arcs, lbound, rbound, htics, weight); if (!p) { verbose("[points inner] failed, falling back to centroid"); p = centroid; } else { // Look for even better fit close to best-fit point - p2 = internal.probeForBestInteriorPoint(shp, arcs, p.x - hstep / 2, + p2 = internal.probeForBestAnchorPoint(shp, arcs, p.x - hstep / 2, p.x + hstep / 2, 2, weight); if (p2.distance > p.distance) { p = p2; @@ -113,7 +85,7 @@ internal.getPointWeightingFunction = function(centroid, pathBounds) { }; }; -internal.findInteriorPointCandidates = function(shp, arcs, xx) { +internal.findAnchorPointCandidates = function(shp, arcs, xx) { var ymin = arcs.getBounds().ymin - 1; return xx.reduce(function(memo, x) { var cands = internal.findHitCandidates(x, ymin, shp, arcs); @@ -121,11 +93,11 @@ internal.findInteriorPointCandidates = function(shp, arcs, xx) { }, []); }; -internal.probeForBestInteriorPoint = function(shp, arcs, lbound, rbound, htics, weight) { +internal.probeForBestAnchorPoint = function(shp, arcs, lbound, rbound, htics, weight) { var tics = internal.getInnerTics(lbound, rbound, htics); var interval = (rbound - lbound) / htics; // Get candidate points, distributed along x-axis - var candidates = internal.findInteriorPointCandidates(shp, arcs, tics); + var candidates = internal.findAnchorPointCandidates(shp, arcs, tics); var bestP, adjustedP, candP; // Sort candidates so points at the center of longer segments are tried first @@ -224,7 +196,7 @@ internal.findRayShapeIntersections = function(x, y, shp, arcs) { // Return array of y-intersections between vertical ray and a polygon ring internal.findRayRingIntersections = function(x, y, path, arcs) { var yints = []; - internal.forEachPathSegment(path, arcs, function(a, b, xx, yy) { + internal.forEachSegmentInPath(path, arcs, function(a, b, xx, yy) { var result = geom.getRayIntersection(x, y, xx[a], yy[a], xx[b], yy[b]); if (result > -Infinity) { yints.push(result); diff --git a/src/points/mapshaper-grids.js b/src/points/mapshaper-grids.js new file mode 100644 index 000000000..f862bff64 --- /dev/null +++ b/src/points/mapshaper-grids.js @@ -0,0 +1,30 @@ +/* @requires mapshaper-common */ + + +// Returns a grid of [x,y] points so that point(c,r) == arr[r][c] +// @f Function for creating a [x,y] point at a given (col, row) position +// +internal.generateGrid = function(cols, rows, f) { + var grid = [], gridRow, r, c; + for (r=0; r 0 === false) return; // skip holes + groups.push(utils.pluck(data.slice(i), 'ids')); + }); + return groups; +}; + + +// assume: shp[0] is outer ring +internal.findInnerPoint = function(shp, arcs) { +}; diff --git a/src/points/mapshaper-point-index.js b/src/points/mapshaper-point-index.js new file mode 100644 index 000000000..9eef3a4d3 --- /dev/null +++ b/src/points/mapshaper-point-index.js @@ -0,0 +1,25 @@ +/* @requires mapshaper-point-utils, mapshaper-geom */ + +// TODO: use an actual index instead of linear search +function PointIndex(shapes, opts) { + var buf = utils.isNonNegNumber(opts.buffer) ? opts.buffer : 1e-3; + var minDistSq, minId, target; + this.findNearestPointFeature = function(shape) { + minDistSq = Infinity; + minId = -1; + target = shape || []; + internal.forEachPoint(shapes, testPoint); + return minId; + }; + + function testPoint(p, id) { + var distSq; + for (var i=0; i 0 || c != 32) { // ignore leading spaces (e.g. DBF numbers) buf[count++] = c; } @@ -64,44 +68,38 @@ Dbf.readStringBytes = function(bin, size, buf) { return count; }; -Dbf.getAsciiStringReader = function() { - var buf = new Uint8Array(256); // new Buffer(256); - return function readAsciiString(bin, size) { - var str = '', - n = Dbf.readStringBytes(bin, size, buf); - for (var i=0; i 127) { + return internal.bufferToString(buf, encoding, 0, n); + } + str += String.fromCharCode(c); } return str; }; }; -Dbf.getStringReader = function(encoding) { - if (!encoding || encoding === 'ascii') { - return Dbf.getAsciiStringReader(); - // return Dbf.readAsciiString; - } else { - return Dbf.getEncodedStringReader(encoding); - } -}; - Dbf.bufferContainsHighBit = function(buf, n) { for (var i=0; i= 128) return true; @@ -110,7 +108,7 @@ Dbf.bufferContainsHighBit = function(buf, n) { }; Dbf.getNumberReader = function() { - var read = Dbf.getAsciiStringReader(); + var read = Dbf.getStringReader('ascii'); return function readNumber(bin, size) { var str = read(bin, size); var val; @@ -212,7 +210,7 @@ function DbfReader(src, encodingArg) { error("Record length mismatch; header:", header.recordSize, "detected:", colOffs); } if (bin.peek() != 0x0D) { - message('[dbf] Found a non-standard header terminator (' + bin.peek() + '). DBF file may be corrupted.'); + message('Found a non-standard DBF header terminator (' + bin.peek() + '). DBF file may be corrupted.'); } // Uniqify header names @@ -287,7 +285,7 @@ function DbfReader(src, encodingArg) { field = fields[c]; fieldOffs = offs + field.columnOffset; if (fieldOffs + field.size > eofOffs) { - stop('[dbf] Invalid DBF file: encountered end-of-file while reading data'); + stop('Invalid DBF file: encountered end-of-file while reading data'); } bin.position(fieldOffs); values[c] = readers[c](bin, field.size); @@ -311,7 +309,7 @@ function DbfReader(src, encodingArg) { } else if (type == 'C') { r = Dbf.getStringReader(getEncoding()); } else { - message("[dbf] Field \"" + field.name + "\" has an unsupported type (" + field.type + ") -- converting to null values"); + message("Field \"" + field.name + "\" has an unsupported type (" + field.type + ") -- converting to null values"); r = function() {return null;}; } return r; @@ -346,14 +344,11 @@ function DbfReader(src, encodingArg) { // Show a sample of decoded text if non-ascii-range text has been found if (encoding && samples.length > 0) { - msg = "Detected DBF text encoding: " + encoding; - if (encoding in Dbf.encodingNames) { - msg += " (" + Dbf.encodingNames[encoding] + ")"; - } - message(msg); msg = internal.decodeSamples(encoding, samples); msg = internal.formatStringsAsGrid(msg.split('\n')); - message("Sample text containing non-ascii characters:" + (msg.length > 60 ? '\n' : '') + msg); + msg = "\nSample text containing non-ascii characters:" + (msg.length > 60 ? '\n' : '') + msg; + msg = "Detected DBF text encoding: " + encoding + (encoding in Dbf.encodingNames ? " (" + Dbf.encodingNames[encoding] + ")" : "") + msg; + message(msg); } return encoding; } @@ -365,7 +360,7 @@ function DbfReader(src, encodingArg) { var stringFields = header.fields.filter(function(f) { return f.type == 'C'; }); - var buf = new Buffer(256); + var buf = utils.createBuffer(256); var index = {}; var f, chars, sample, hash; for (var r=0, rows=header.recordCount; r 0 && Dbf.bufferContainsHighBit(buf, chars)) { - sample = new Buffer(buf.slice(0, chars)); // + sample = utils.createBuffer(buf.slice(0, chars)); // hash = sample.toString('hex'); if (hash in index === false) { // avoid duplicate samples index[hash] = true; diff --git a/src/shapefile/dbf-writer.js b/src/shapefile/dbf-writer.js index 4b5282d6c..97f2bf781 100644 --- a/src/shapefile/dbf-writer.js +++ b/src/shapefile/dbf-writer.js @@ -1,14 +1,46 @@ -/* @requires dbf-reader */ +/* @requires dbf-reader, mapshaper-encodings */ Dbf.MAX_STRING_LEN = 254; -Dbf.exportRecords = function(arr, encoding) { - encoding = encoding || 'ascii'; - var fields = Dbf.getFieldNames(arr); - var uniqFields = internal.getUniqFieldNames(fields, 10); - var rows = arr.length; - var fieldData = fields.map(function(name) { - return Dbf.getFieldInfo(arr, name, encoding); +function BufferPool() { + var n = 5000, + pool, i; + newPool(); + + function newPool() { + pool = new Uint8Array(n); + i = 0; + } + + return { + reserve: function(bytes) { + if (i + bytes > n) newPool(); + i += bytes; + return pool.subarray(i - bytes, i); + }, + putBack: function(bytes) { + i -= bytes; + } + }; +} + +Dbf.bufferPool = new BufferPool(); + +Dbf.exportRecords = function(records, encoding, fieldOrder) { + var rows = records.length; + var fields = internal.findFieldNames(records, fieldOrder); + var dbfFields = Dbf.convertFieldNames(fields); + var fieldData = fields.map(function(name, i) { + var info = Dbf.getFieldInfo(records, name, encoding || 'utf8'); + var name2 = dbfFields[i]; + info.name = name2; + if (name != name2) { + message('Changed field name from "' + name + '" to "' + name2 + '"'); + } + if (info.warning) { + message('[' + name + '] ' + info.warning); + } + return info; }); var headerBytes = Dbf.getHeaderSize(fieldData.length), @@ -31,10 +63,10 @@ Dbf.exportRecords = function(arr, encoding) { bin.writeUint8(0); // language flag; TODO: improve this bin.skipBytes(2); + // field subrecords - fieldData.reduce(function(recordOffset, obj, i) { - var fieldName = uniqFields[i]; - bin.writeCString(fieldName, 11); + fieldData.reduce(function(recordOffset, obj) { + bin.writeCString(obj.name, 11); bin.writeUint8(obj.type.charCodeAt(0)); bin.writeUint32(recordOffset); bin.writeUint8(obj.size); @@ -48,7 +80,7 @@ Dbf.exportRecords = function(arr, encoding) { error("Dbf#exportRecords() header size mismatch; expected:", headerBytes, "written:", bin.position()); } - arr.forEach(function(rec, i) { + records.forEach(function(rec, i) { var start = bin.position(); bin.writeUint8(0x20); // delete flag; 0x20 valid 0x2a deleted for (var j=0, n=fieldData.length; j Dbf.MAX_STRING_LEN) { + if (encoding == 'ascii') { + buf = buf.subarray(0, Dbf.MAX_STRING_LEN); + } else { + buf = Dbf.truncateEncodedString(buf, encoding, Dbf.MAX_STRING_LEN); + } + truncated++; + } + size = Math.max(size, buf.length); return buf; }); info.size = size; info.write = function(i, bin) { - var buf = values[i], - bytes = Math.min(size, buf.byteLength), - idx = bin.position(); - bin.writeBuffer(buf, bytes, 0); - bin.position(idx + size); + var buf = buffers[i], + n = Math.min(size, buf.length), + dest = bin._bytes, + pos = bin.position(), + j; + for (j=0; j 0) { + info.warning = 'Truncated ' + truncated + ' string' + (truncated == 1 ? '' : 's') + ' to fit the 254-byte limit'; + } +}; + +Dbf.convertFieldNames = function(names) { + return internal.getUniqFieldNames(names.map(Dbf.cleanFieldName), 10); +}; + +// Replace non-alphanumeric characters with _ and merge adjacent _ +// See: https://desktop.arcgis.com/en/arcmap/latest/manage-data/tables/fundamentals-of-adding-and-deleting-fields.htm#GUID-8E190093-8F8F-4132-AF4F-B0C9220F76B3 +// TODO: decide whether or not to avoid initial numerals +Dbf.cleanFieldName = function(name) { + return name.replace(/[^A-Za-z0-9]+/g, '_'); }; Dbf.getFieldInfo = function(arr, name, encoding) { var type = this.discoverFieldType(arr, name), info = { - name: name, type: type, decimals: 0 }; @@ -187,6 +232,9 @@ Dbf.getFieldInfo = function(arr, name, encoding) { // again as nulls. info.size = 0; info.type = 'N'; + if (type) { + info.warning = 'Unable to export ' + type + '-type data, writing null values'; + } info.write = function() {}; } return info; @@ -200,6 +248,7 @@ Dbf.discoverFieldType = function(arr, name) { if (utils.isNumber(val)) return "N"; if (utils.isBoolean(val)) return "L"; if (val instanceof Date) return "D"; + if (val) return (typeof val); } return null; }; @@ -253,38 +302,37 @@ Dbf.getNumericFieldInfo = function(arr, name) { }; }; -// Return function to convert a JS str to an ArrayBuffer containing encoded str. -Dbf.getStringWriter = function(encoding) { - if (encoding === 'ascii') { - return Dbf.getStringWriterAscii(); - } else { - return Dbf.getStringWriterEncoded(encoding); - } -}; - -// TODO: handle non-ascii chars. Option: switch to -// utf8 encoding if non-ascii chars are found. -Dbf.getStringWriterAscii = function() { - return function(val) { - var str = String(val), - n = Math.min(str.length, Dbf.MAX_STRING_LEN), - dest = new ArrayBuffer(n), - view = new Uint8ClampedArray(dest); - for (var i=0; i 127) { + if (strict) { + view = null; + i = 0; // return all bytes to pool + break; + } + c = '?'.charCodeAt(0); } - return dest; - }; + view[i] = c; + } + Dbf.bufferPool.putBack(n-i); + return view ? view.subarray(0, i) : null; }; Dbf.getStringWriterEncoded = function(encoding) { - var iconv = require('iconv-lite'); return function(val) { - var buf = iconv.encode(val, encoding); - if (buf.length >= Dbf.MAX_STRING_LEN) { - buf = Dbf.truncateEncodedString(buf, encoding, Dbf.MAX_STRING_LEN); + // optimization -- large majority of strings in real-world datasets are + // ascii. Try (faster) ascii encoding first, fall back to text encoder. + var buf = Dbf.encodeValueAsAscii(val, true); + if (buf === null) { + buf = internal.encodeString(String(val), encoding); } - return BinArray.toArrayBuffer(buf); + return buf; }; }; diff --git a/src/shapefile/shp-common.js b/src/shapefile/shp-common.js index 53962e02a..231bfc29f 100644 --- a/src/shapefile/shp-common.js +++ b/src/shapefile/shp-common.js @@ -18,11 +18,3 @@ internal.translateShapefileType = function(shpType) { internal.isSupportedShapefileType = function(t) { return utils.contains([0,1,3,5,8,11,13,15,18,21,23,25,28], t); }; - -internal.getShapefileType = function(type) { - return { - polygon: ShpType.POLYGON, - polyline: ShpType.POLYLINE, - point: ShpType.MULTIPOINT // TODO: use POINT when possible - }[type] || ShpType.NULL; -}; diff --git a/src/shapefile/shp-export.js b/src/shapefile/shp-export.js index ed12e3a29..1b3845bbf 100644 --- a/src/shapefile/shp-export.js +++ b/src/shapefile/shp-export.js @@ -1,6 +1,8 @@ /* @requires shp-common mapshaper-path-export +mapshaper-projections +mapshaper-shape-utils */ // Convert a dataset to Shapefile files @@ -15,40 +17,66 @@ internal.exportShapefile = function(dataset, opts) { }; internal.exportPrjFile = function(lyr, dataset) { - var crs, inputPrj, outputPrj; - if (dataset.info) { - inputPrj = dataset.info.input_prj; - crs = dataset.info.crs; + var info = dataset.info || {}; + var prj = info.prj; + if (!prj) { + try { + prj = internal.crsToPrj(internal.getDatasetCRS(dataset)); + } catch(e) {} } - if (crs && inputPrj && internal.crsAreEqual(crs, internal.parsePrj(inputPrj))) { - outputPrj = inputPrj; - } else if (!crs && inputPrj) { // dataset has not been reprojected - outputPrj = inputPrj; + if (!prj) { + message("Unable to generate .prj file for", lyr.name + '.shp'); } - // TODO: generate .prj if projection is known - - return outputPrj ? { - content: outputPrj, + return prj ? { + content: prj, filename: lyr.name + '.prj' } : null; }; +internal.getShapefileExportType = function(lyr) { + var type = lyr.geometry_type; + var shpType; + if (type == 'point') { + shpType = internal.findMaxPartCount(lyr.shapes || []) <= 1 ? ShpType.POINT : ShpType.MULTIPOINT; + } else if (type == 'polygon') { + shpType = ShpType.POLYGON; + } else if (type == 'polyline') { + shpType = ShpType.POLYLINE; + } else { + shpType = ShpType.NULL; + } + return shpType; +}; + internal.exportShpAndShxFiles = function(layer, dataset, opts) { - var geomType = layer.geometry_type; - var shpType = internal.getShapefileType(geomType); - var fileBytes = 100; - var bounds = new Bounds(); var shapes = layer.shapes || utils.initializeArray(new Array(internal.getFeatureCount(layer)), null); + var bounds = new Bounds(); + var shpType = internal.getShapefileExportType(layer); + var fileBytes = 100; + var shxBytes = 100 + shapes.length * 8; + var shxBin = new BinArray(shxBytes).bigEndian().position(100); // jump to record section + var shpBin; + + // TODO: consider writing records to an expanding buffer instead of generating + // individual buffers for each record (for large point datasets, + // creating millions of buffers impacts performance significantly) var shapeBuffers = shapes.map(function(shape, i) { - var pathData = internal.exportPathData(shape, dataset.arcs, geomType); + var pathData = internal.exportPathData(shape, dataset.arcs, layer.geometry_type); var rec = internal.exportShpRecord(pathData, i+1, shpType); - fileBytes += rec.buffer.byteLength; + var recBytes = rec.buffer.byteLength; + + // add shx record + shxBin.writeInt32(fileBytes / 2); // record offset in 16-bit words + // alternative to below: shxBin.writeBuffer(rec.buffer, 4, 4) + shxBin.writeInt32(recBytes / 2 - 4); // record content length in 16-bit words + + fileBytes += recBytes; if (rec.bounds) bounds.mergeBounds(rec.bounds); return rec.buffer; }); // write .shp header section - var shpBin = new BinArray(fileBytes, false) + shpBin = new BinArray(fileBytes, false) .writeInt32(9994) .skipBytes(5 * 4) .writeInt32(fileBytes / 2) @@ -65,27 +93,19 @@ internal.exportShpAndShxFiles = function(layer, dataset, opts) { // no bounds -- assume no shapes or all null shapes -- using 0s as bbox shpBin.skipBytes(4 * 8); } - shpBin.skipBytes(4 * 8); // skip Z & M type bounding boxes; - // write .shx header - var shxBytes = 100 + shapeBuffers.length * 8; - var shxBin = new BinArray(shxBytes, false) - .writeBuffer(shpBin.buffer(), 100) // copy .shp header to .shx - .position(24) - .bigEndian() - .writeInt32(shxBytes/2) - .position(100); - - // write record sections of .shp and .shx - shapeBuffers.forEach(function(buf, i) { - var shpOff = shpBin.position() / 2, - shpSize = (buf.byteLength - 8) / 2; // alternative: shxBin.writeBuffer(buf, 4, 4); - shxBin.writeInt32(shpOff); - shxBin.writeInt32(shpSize); + // write records section of .shp + shapeBuffers.forEach(function(buf) { shpBin.writeBuffer(buf); }); + // write .shx header + shxBin.position(0) + .writeBuffer(shpBin.buffer(), 100) // copy .shp header to .shx + .position(24) // substitute shx file size for shp file size + .writeInt32(shxBytes / 2); + return [{ content: shpBin.buffer(), filename: layer.name + ".shp" @@ -100,16 +120,34 @@ internal.exportShpAndShxFiles = function(layer, dataset, opts) { // TODO: remove collapsed rings, convert to null shape if necessary // internal.exportShpRecord = function(data, id, shpType) { - var bounds = null, + var multiPartType = ShpType.isMultiPartType(shpType), + singlePointType = !multiPartType && !ShpType.isMultiPointType(shpType), + isNull = data.pointCount > 0 === false, + bounds = isNull ? null : data.bounds, bin = null; - if (data.pointCount > 0) { - var multiPart = ShpType.isMultiPartType(shpType), - partIndexIdx = 52, - pointsIdx = multiPart ? partIndexIdx + 4 * data.pathCount : 48, + + if (isNull) { + bin = new BinArray(12, false) + .writeInt32(id) + .writeInt32(2) + .littleEndian() + .writeInt32(0); + + } else if (singlePointType) { + bin = new BinArray(28, false) + .writeInt32(id) + .writeInt32(10) + .littleEndian() + .writeInt32(shpType) + .writeFloat64(data.pathData[0].points[0][0]) + .writeFloat64(data.pathData[0].points[0][1]); + + } else { + var partIndexIdx = 52, + pointsIdx = multiPartType ? partIndexIdx + 4 * data.pathCount : 48, recordBytes = pointsIdx + 16 * data.pointCount, pointCount = 0; - bounds = data.bounds; bin = new BinArray(recordBytes, false) .writeInt32(id) .writeInt32((recordBytes - 8) / 2) @@ -120,40 +158,26 @@ internal.exportShpRecord = function(data, id, shpType) { .writeFloat64(bounds.xmax) .writeFloat64(bounds.ymax); - if (multiPart) { + if (multiPartType) { bin.writeInt32(data.pathCount); - } else { - if (data.pathData.length > 1) { - error("[exportShpRecord()] Tried to export multiple paths as type:", shpType); - } } bin.writeInt32(data.pointCount); - data.pathData.forEach(function(path, i) { - if (multiPart) { + if (multiPartType) { bin.position(partIndexIdx + i * 4).writeInt32(pointCount); } bin.position(pointsIdx + pointCount * 16); - - var points = path.points; - for (var j=0, len=points.length; j 0) { - // Encountered in ne_10m_railroads.shp from natural earth v2.0.0 - message("[shp] Skipped " + skippedBytes + " bytes in .shp file -- possible data loss."); + // Encountered in files from natural earth v2.0.0: + // ne_10m_admin_0_boundary_lines_land.shp + // ne_110m_admin_0_scale_rank.shp + verbose("Skipped over " + skippedBytes + " non-data bytes in the .shp file."); } - file.close(); + shpFile.close(); reset(); } return shape; }; + function readNextShape() { + var expectedId = recordCount + 1; // Shapefile ids are 1-based + var shape, offset; + if (done()) return null; + if (shxBin) { + shxBin.position(100 + recordCount * 8); + offset = shxBin.readUint32() * 2; + if (offset > shpOffset) { + skippedBytes += offset - shpOffset; + } + } else { + offset = shpOffset; + } + shape = readShapeAtOffset(offset); + if (!shape) { + // Some in-the-wild .shp files contain junk bytes between records. This + // is a problem if the .shx index file is not present. + // Here, we try to scan past the junk to find the next record. + shape = huntForNextShape(offset, expectedId); + } + if (shape) { + if (shape.id < expectedId) { + message("Found a Shapefile record with the same id as a previous record (" + shape.id + ") -- skipping."); + return readNextShape(); + } else if (shape.id > expectedId) { + stop("Shapefile contains an out-of-sequence record. Possible data corruption -- bailing."); + } + recordCount++; + } + return shape || null; + } + + function done() { + if (shxFile && shxFile.size() <= 100 + recordCount * 8) return true; + if (shpOffset + 12 > shpSize) return true; + return false; + } + function reset() { - recordOffs = 100; + shpOffset = 100; skippedBytes = 0; - i = 1; // Shapefile id of first record + recordCount = 0; } function parseHeader(bin) { @@ -101,29 +133,29 @@ function ShpReader(src) { error("Unsupported .shp type:", header.type); } - if (header.byteLength != file.size()) { + if (header.byteLength != shpFile.size()) { error("File size of .shp doesn't match size in header"); } return header; } - function readShapeAtOffset(recordOffs, i) { + function readShapeAtOffset(offset) { var shape = null, - recordSize, recordType, recordId, goodId, goodSize, goodType, bin; + recordSize, recordType, recordId, goodSize, goodType, bin; - if (recordOffs + 12 <= fileSize) { - bin = file.readBytes(12, recordOffs); + if (offset + 12 <= shpSize) { + bin = shpFile.readToBinArray(offset, 12); recordId = bin.bigEndian().readUint32(); // record size is bytes in content section + 8 header bytes recordSize = bin.readUint32() * 2 + 8; recordType = bin.littleEndian().readUint32(); - goodId = recordId == i; // not checking id ... - goodSize = recordOffs + recordSize <= fileSize && recordSize >= 12; + goodSize = offset + recordSize <= shpSize && recordSize >= 12; goodType = recordType === 0 || recordType == header.type; if (goodSize && goodType) { - bin = file.readBytes(recordSize, recordOffs); + bin = shpFile.readToBinArray(offset, recordSize); shape = new RecordClass(bin, recordSize); + shpOffset = offset + shape.byteLength; // advance read position } } return shape; @@ -132,21 +164,23 @@ function ShpReader(src) { // TODO: add tests // Try to scan past unreadable content to find next record function huntForNextShape(start, id) { - var offset = start, + var offset = start + 4, shape = null, - bin, recordId, recordType; - while (offset + 12 <= fileSize) { - bin = file.readBytes(12, offset); + bin, recordId, recordType, count; + while (offset + 12 <= shpSize) { + bin = shpFile.readToBinArray(offset, 12); recordId = bin.bigEndian().readUint32(); recordType = bin.littleEndian().skipBytes(4).readUint32(); if (recordId == id && (recordType == header.type || recordType === 0)) { // we have a likely position, but may still be unparsable - shape = readShapeAtOffset(offset, id); + shape = readShapeAtOffset(offset); break; } offset += 4; // try next integer position } - skippedBytes += shape ? offset - start : fileSize - start; + count = shape ? offset - start : shpSize - start; + // debug('Skipped', count, 'bytes', shape ? 'before record ' + id : 'at the end of the file'); + skippedBytes += count; return shape; } } @@ -170,63 +204,3 @@ ShpReader.prototype.getCounts = function() { }); return counts; }; - -// Same interface as FileBytes, for reading from a buffer instead of a file. -function BufferBytes(buf) { - var bin = new BinArray(buf), - bufSize = bin.size(); - this.readBytes = function(len, offset) { - if (bufSize < offset + len) error("Out-of-range error"); - bin.position(offset); - return bin; - }; - - this.size = function() { - return bufSize; - }; - - this.close = function() {}; -} - -// Read a binary file in chunks, to support files > 1GB in Node -function FileBytes(path) { - var DEFAULT_BUF_SIZE = 0xffffff, // 16 MB - fs = require('fs'), - fileSize = cli.fileSize(path), - cacheOffs = 0, - cache, fd; - - this.readBytes = function(len, start) { - if (fileSize < start + len) error("Out-of-range error"); - if (!cache || start < cacheOffs || start + len > cacheOffs + cache.size()) { - updateCache(len, start); - } - cache.position(start - cacheOffs); - return cache; - }; - - this.size = function() { - return fileSize; - }; - - this.close = function() { - if (fd) { - fs.closeSync(fd); - fd = null; - cache = null; - cacheOffs = 0; - } - }; - - function updateCache(len, start) { - var headroom = fileSize - start, - bufSize = Math.min(headroom, Math.max(DEFAULT_BUF_SIZE, len)), - buf = new Buffer(bufSize), - bytesRead; - if (!fd) fd = fs.openSync(path, 'r'); - bytesRead = fs.readSync(fd, buf, 0, bufSize, start); - if (bytesRead < bufSize) error("Error reading file"); - cacheOffs = start; - cache = new BinArray(buf); - } -} diff --git a/src/shapefile/shp-record.js b/src/shapefile/shp-record.js index d65c65c0c..207cdc241 100644 --- a/src/shapefile/shp-record.js +++ b/src/shapefile/shp-record.js @@ -165,6 +165,21 @@ function ShpRecordClass(type) { if (xy.length != j) error('Counting error'); }, + // TODO: consider switching to this simpler functino + stream2: function(sink) { + var sizes = this.readPartSizes(), + bin = this._data().skipBytes(this._xypos()), + i = 0, n; + while (i < sizes.length) { + n = sizes[i]; + while (n-- > 0) { + sink.addPoint(bin.readFloat64(), bin.readFloat64()); + } + sink.endPath(); + i++; + } + }, + read: function() { var parts = [], sizes = this.readPartSizes(), diff --git a/src/simplify/mapshaper-keep-shapes.js b/src/simplify/mapshaper-keep-shapes.js index b3a36da2d..55a7cf618 100644 --- a/src/simplify/mapshaper-keep-shapes.js +++ b/src/simplify/mapshaper-keep-shapes.js @@ -35,28 +35,18 @@ internal.protectShape = function(arcData, shape) { if (!maxRing || maxRing.length === 0) { // invald shape verbose("[protectShape()] Invalid shape:", shape); - } else if (maxRing.length == 1) { - internal.protectIslandRing(arcData, maxRing); } else { - internal.protectMultiRing(arcData, maxRing); + internal.protectPolygonRing(arcData, maxRing); } }; -// Add two vertices to the ring to form a triangle. -// Assuming that this will inflate the ring. -// Consider using the function for multi-arc rings, which -// calculates ring area... -internal.protectIslandRing = function(arcData, ring) { - var added = internal.lockMaxThreshold(arcData, ring); - if (added == 1) { - added += internal.lockMaxThreshold(arcData, ring); - } - if (added < 2) verbose("[protectIslandRing()] Failed on ring:", ring); -}; - -internal.protectMultiRing = function(arcData, ring) { +// Re-inflate a polygon ring that has collapsed due to simplification by +// adding points in reverse order of removal until polygon is inflated. +internal.protectPolygonRing = function(arcData, ring) { var zlim = arcData.getRetainedInterval(), - minArea = 0, // 0.00000001, // Need to handle rounding error? + // use epsilon as min area instead of 0, in case f.p. rounding produces + // a positive area for a collapsed polygon. + minArea = 1e-10, area, added; arcData.setRetainedInterval(Infinity); area = geom.getPlanarPathArea(ring, arcData); diff --git a/src/simplify/mapshaper-post-simplify-repair.js b/src/simplify/mapshaper-post-simplify-repair.js index 6162391f1..327468494 100644 --- a/src/simplify/mapshaper-post-simplify-repair.js +++ b/src/simplify/mapshaper-post-simplify-repair.js @@ -15,7 +15,7 @@ internal.postSimplifyRepair = function(arcs) { countFixed = countPre > countPost ? countPre - countPost : 0, msg; if (countPre > 0) { - msg = utils.format("[simplify] Repaired %'i intersection%s", countFixed, + msg = utils.format("Repaired %'i intersection%s", countFixed, utils.pluralSuffix(countFixed)); if (countPost > 0) { msg += utils.format("; %'i intersection%s could not be repaired", countPost, diff --git a/src/simplify/mapshaper-simplify-pct.js b/src/simplify/mapshaper-simplify-pct.js new file mode 100644 index 000000000..95ad73687 --- /dev/null +++ b/src/simplify/mapshaper-simplify-pct.js @@ -0,0 +1,43 @@ + +// Returns a function for converting simplification ratio [0-1] to an interval value. +// If the dataset is large, the value is an approximation (for speed while using slider) +internal.getThresholdFunction = function(arcs) { + var size = arcs.getPointCount(), + nth = Math.ceil(size / 5e5), + sortedThresholds = arcs.getRemovableThresholds(nth); + // Sort simplification thresholds for all non-endpoint vertices + // for quick conversion of simplification percentage to threshold value. + // For large datasets, use every nth point, for faster sorting. + // utils.quicksort(sortedThresholds, false); // descending + utils.quicksort(sortedThresholds, true); // ascending + + return function(pct) { + var n = sortedThresholds.length; + var rank = internal.retainedPctToRank(pct, sortedThresholds.length); + if (rank < 1) return 0; + if (rank > n) return Infinity; + return sortedThresholds[rank-1]; + }; +}; + +// Return integer rank of n (1-indexed) or 0 if pct <= 0 or n+1 if pct >= 1 +internal.retainedPctToRank = function(pct, n) { + var rank; + if (n === 0 || pct >= 1) { + rank = 0; + } else if (pct <= 0) { + rank = n + 1; + } else { + rank = Math.floor((1 - pct) * (n + 2)); + } + return rank; +}; + +// nth (optional): sample every nth threshold (use estimate for speed) +internal.getThresholdByPct = function(pct, arcs, nth) { + var tmp = arcs.getRemovableThresholds(nth), + rank = internal.retainedPctToRank(pct, tmp.length); + if (rank < 1) return 0; + if (rank > tmp.length) return Infinity; + return utils.findValueByRank(tmp, rank); +}; diff --git a/src/simplify/mapshaper-simplify.js b/src/simplify/mapshaper-simplify.js index df2aeeb29..6c7acf31a 100644 --- a/src/simplify/mapshaper-simplify.js +++ b/src/simplify/mapshaper-simplify.js @@ -9,22 +9,27 @@ mapshaper-simplify-info api.simplify = function(dataset, opts) { var arcs = dataset.arcs; - if (!arcs) stop("[simplify] Missing path data"); + if (!arcs) stop("Missing path data"); // standardize options opts = internal.getStandardSimplifyOpts(dataset, opts); - // stash simplifcation options (used by gui settings dialog) - dataset.info = utils.defaults({simplify: opts}, dataset.info); - internal.simplifyPaths(arcs, opts); - if (opts.percentage) { + // calculate and apply simplification interval + if (opts.percentage || opts.percentage === 0) { arcs.setRetainedPct(utils.parsePercent(opts.percentage)); - } else if (utils.isNumber(opts.interval)) { - arcs.setRetainedInterval(opts.interval); + } else if (opts.interval || opts.interval === 0) { + arcs.setRetainedInterval(internal.convertSimplifyInterval(opts.interval, dataset, opts)); } else if (opts.resolution) { - arcs.setRetainedInterval(internal.calcSimplifyInterval(arcs, opts)); + arcs.setRetainedInterval(internal.convertSimplifyResolution(opts.resolution, arcs, opts)); + } else { + stop("Missing a simplification amount"); } + internal.finalizeSimplification(dataset, opts); +}; + +internal.finalizeSimplification = function(dataset, opts) { + var arcs = dataset.arcs; if (opts.keep_shapes) { api.keepEveryPolygon(arcs, dataset.layers); } @@ -36,6 +41,9 @@ api.simplify = function(dataset, opts) { if (opts.stats) { internal.printSimplifyInfo(arcs, opts); } + + // stash simplification options (used by gui settings dialog) + dataset.info = utils.defaults({simplify: opts}, dataset.info); }; internal.getStandardSimplifyOpts = function(dataset, opts) { @@ -103,7 +111,7 @@ internal.getSimplifyFunction = function(opts) { } else if (opts.method == 'weighted_visvalingam') { f = Visvalingam.getWeightedSimplifier(opts, opts.spherical); } else { - stop('[simplify] Unsupported simplify method:', method); + stop('Unsupported simplify method:', method); } return f; }; @@ -171,7 +179,7 @@ internal.parseSimplifyResolution = function(raw) { h = raw; } else if (utils.isString(raw)) { - parts = raw.split('x'); + parts = raw.split(/[x ,]/); w = Number(parts[0]) || 0; h = parts.length == 2 ? Number(parts[1]) || 0 : w; } @@ -197,21 +205,29 @@ internal.calcSphericalInterval = function(xres, yres, bounds) { return internal.calcPlanarInterval(xres, yres, width, height); }; -internal.calcSimplifyInterval = function(arcs, opts) { - var res, interval, bounds; - if (opts.interval) { - interval = opts.interval; - } else if (opts.resolution) { - res = internal.parseSimplifyResolution(opts.resolution); - bounds = arcs.getBounds(); - if (internal.useSphericalSimplify(arcs, opts)) { - interval = internal.calcSphericalInterval(res[0], res[1], bounds); - } else { - interval = internal.calcPlanarInterval(res[0], res[1], bounds.width(), bounds.height()); - } - // scale interval to double the resolution (single-pixel resolution creates - // visible artefacts) - interval *= 0.5; +internal.convertSimplifyInterval = function(param, dataset, opts) { + var crs = internal.getDatasetCRS(dataset); + var interval; + if (internal.useSphericalSimplify(dataset.arcs, opts)) { + interval = internal.convertDistanceParam(param, crs); + } else { + interval = internal.convertIntervalParam(param, crs); + } + return interval; +}; + +// convert resolution to an interval +internal.convertSimplifyResolution = function(param, arcs, opts) { + var res = internal.parseSimplifyResolution(param); + var bounds = arcs.getBounds(); + var interval; + if (internal.useSphericalSimplify(arcs, opts)) { + interval = internal.calcSphericalInterval(res[0], res[1], bounds); + } else { + interval = internal.calcPlanarInterval(res[0], res[1], bounds.width(), bounds.height()); } + // scale interval to double the resolution (single-pixel resolution creates + // visible artifacts) + interval *= 0.5; return interval; }; diff --git a/src/simplify/mapshaper-variable-simplify.js b/src/simplify/mapshaper-variable-simplify.js new file mode 100644 index 000000000..e3453a660 --- /dev/null +++ b/src/simplify/mapshaper-variable-simplify.js @@ -0,0 +1,108 @@ +/* @requires mapshaper-simplify-pct */ + +api.variableSimplify = function(layers, dataset, opts) { + var lyr = layers[0]; + var arcs = dataset.arcs; + var getShapeThreshold; + var arcThresholds; + if (layers.length != 1) { + stop('Variable simplification requires a single target layer'); + } + if (!internal.layerHasPaths(lyr)) { + stop('Target layer is missing path data'); + } + + opts = internal.getStandardSimplifyOpts(dataset, opts); + internal.simplifyPaths(arcs, opts); + + if (opts.interval) { + getShapeThreshold = internal.getVariableIntervalFunction(opts.interval, lyr, dataset, opts); + } else if (opts.percentage) { + getShapeThreshold = internal.getVariablePercentageFunction(opts.percentage, lyr, dataset, opts); + } else if (opts.resolution) { + getShapeThreshold = internal.getVariableResolutionFunction(opts.resolution, lyr, dataset, opts); + } else { + stop("Missing a simplification expression"); + } + + arcThresholds = internal.calculateVariableThresholds(lyr, arcs, getShapeThreshold); + internal.applyArcThresholds(arcs, arcThresholds); + arcs.setRetainedInterval(1e20); // set to a huge value + internal.finalizeSimplification(dataset, opts); + arcs.flatten(); // bake in simplification (different from standard -simplify) +}; + +internal.getVariableIntervalFunction = function(exp, lyr, dataset, opts) { + var compiled = internal.compileSimplifyExpression(exp, lyr, dataset.arcs); + return function(shpId) { + var val = compiled(shpId); + return internal.convertSimplifyInterval(val, dataset, opts); + }; +}; + +internal.getVariableResolutionFunction = function(exp, lyr, dataset, opts) { + var compiled = internal.compileSimplifyExpression(exp, lyr, dataset.arcs); + return function(shpId) { + var val = compiled(shpId); + return internal.convertSimplifyResolution(val, dataset.arcs, opts); + }; +}; + +internal.getVariablePercentageFunction = function(exp, lyr, dataset, opts) { + var compiled = internal.compileSimplifyExpression(exp, lyr, dataset.arcs); + var pctToInterval = internal.getThresholdFunction(dataset.arcs); + return function(shpId) { + var val = compiled(shpId); + var pct = utils.parsePercent(val); + return pctToInterval(pct); + }; +}; + +// TODO: memoize? +internal.compileSimplifyExpression = function(exp, lyr, arcs) { + return internal.compileValueExpression(exp, lyr, arcs); +}; + +// Filter arcs based on an array of thresholds +internal.applyArcThresholds = function(arcs, thresholds) { + var zz = arcs.getVertexData().zz; + arcs.forEach2(function(start, n, xx, yy, zz, arcId) { + var arcZ = thresholds[arcId]; + var z; + for (var i=1; i= arcZ || arcZ === Infinity) { // Infinity test is a bug + if (z >= arcZ) { + // protect vertices with thresholds that are >= than the computed threshold + // for this arc + zz[start + i] = Infinity; + } + } + }); +}; + +internal.calculateVariableThresholds = function(lyr, arcs, getShapeThreshold) { + var thresholds = new Float64Array(arcs.size()); // init to 0s + var UNUSED = -1; + var currThresh; + utils.initializeArray(thresholds, UNUSED); + lyr.shapes.forEach(function(shp, shpId) { + currThresh = getShapeThreshold(shpId); + internal.forEachArcId(shp || [], procArc); + }); + // set unset arcs to 0 so they are not simplified + for (var i=0, n=thresholds.length; i currThresh || savedThresh == UNUSED) { + thresholds[i] = currThresh; + } + } +}; diff --git a/src/svg/geojson-to-svg.js b/src/svg/geojson-to-svg.js index 2160bf2c5..3b1d8d95d 100644 --- a/src/svg/geojson-to-svg.js +++ b/src/svg/geojson-to-svg.js @@ -1,16 +1,18 @@ -/* @requires geojson-common, mapshaper-svg-style */ +/* @requires geojson-common, svg-common, mapshaper-svg-style, svg-stringify */ -var SVG = {}; - -SVG.importGeoJSONFeatures = function(features) { +SVG.importGeoJSONFeatures = function(features, opts) { + opts = opts || {}; return features.map(function(obj, i) { var geom = obj.type == 'Feature' ? obj.geometry : obj; // could be null var geomType = geom && geom.type; - var svgObj; - if (!geomType) { + var svgObj = null; + if (geomType && geom.coordinates) { + svgObj = SVG.geojsonImporters[geomType](geom.coordinates, obj.properties, opts); + } + if (!svgObj) { return {tag: 'g'}; // empty element } - svgObj = SVG.geojsonImporters[geomType](geom.coordinates); + // TODO: fix error caused by null svgObj (caused by e.g. MultiPolygon with [] coordinates) if (obj.properties) { SVG.applyStyleAttributes(svgObj, geomType, obj.properties); } @@ -18,90 +20,47 @@ SVG.importGeoJSONFeatures = function(features) { if (!svgObj.properties) { svgObj.properties = {}; } - svgObj.properties.id = obj.id; + svgObj.properties.id = (opts.id_prefix || '') + obj.id; } return svgObj; }); }; -SVG.stringify = function(obj) { - var svg = '<' + obj.tag; - if (obj.properties) { - svg += SVG.stringifyProperties(obj.properties); - } - if (obj.children) { - svg += '>\n'; - svg += obj.children.map(SVG.stringify).join('\n'); - svg += '\n'; - } else { - svg += '/>'; - } - return svg; -}; - -SVG.stringEscape = (function() { - // See http://commons.oreilly.com/wiki/index.php/SVG_Essentials/The_XML_You_Need_for_SVG - var rxp = /[&<>"']/g, - map = { - '&': '&', - '<': '<', - '>': '>', - '"': '"', - "'": ''' - }; - return function(s) { - return String(s).replace(rxp, function(s) { - return map[s]; - }); - }; -}()); - -SVG.stringifyProperties = function(o) { - return Object.keys(o).reduce(function(memo, key, i) { - var val = o[key], - strval = utils.isString(val) ? val : JSON.stringify(val); - return memo + ' ' + key + '="' + SVG.stringEscape(strval) + '"'; - }, ''); -}; - - SVG.applyStyleAttributes = function(svgObj, geomType, rec) { - var properties = svgObj.properties; - var invalidStyles = internal.invalidSvgTypes[GeoJSON.translateGeoJSONType(geomType)]; - var fields = internal.getStyleFields(Object.keys(rec), internal.svgStyles, invalidStyles); - var k; + var symbolType = GeoJSON.translateGeoJSONType(geomType); + if (symbolType == 'point' && ('label-text' in rec)) { + symbolType = 'label'; + } + var fields = SVG.findPropertiesBySymbolGeom(Object.keys(rec), symbolType); for (var i=0, n=fields.length; i 0 ? {tag: 'g', children: children} : null; }; SVG.importMultiPath = function(coords, importer) { @@ -117,7 +76,7 @@ SVG.importMultiPath = function(coords, importer) { }; SVG.mapVertex = function(p) { - return p[0] + ' ' + -p[1]; + return p[0] + ' ' + p[1]; }; SVG.importLineString = function(coords) { @@ -128,14 +87,65 @@ SVG.importLineString = function(coords) { }; }; -SVG.importPoint = function(p) { - return { - tag: 'circle', - properties: { - cx: p[0], - cy: -p[1] - } +// Kludge for applying fill and other styles to a element +// (for rendering labels in the GUI with the dot in Canvas, not SVG) +SVG.importStyledLabel = function(rec, p) { + var o = SVG.importLabel(rec, p); + SVG.applyStyleAttributes(o, 'Point', rec); + return o; +}; + +SVG.importLabel = function(rec, p) { + var line = rec['label-text'] || ''; + var morelines, obj; + // Accepting \n (two chars) as an alternative to the newline character + // (sometimes, '\n' is not converted to newline, e.g. in a Makefile) + // Also accepting
+ var newline = /\n|\\n|
/i; + var dx = rec.dx || 0; + var dy = rec.dy || 0; + var properties = { + // using x, y instead of dx, dy for shift, because Illustrator doesn't apply + // dx value when importing text with text-anchor=end + y: dy, + x: dx }; + if (p) { + properties.transform = SVG.getTransform(p); + } + if (newline.test(line)) { + morelines = line.split(newline); + line = morelines.shift(); + } + obj = { + tag: 'text', + value: line, + properties: properties + }; + if (morelines) { + // multiline label + obj.children = []; + morelines.forEach(function(line) { + var tspan = { + tag: 'tspan', + value: line, + properties: { + x: dx, + dy: rec['line-height'] || '1.1em' + } + }; + obj.children.push(tspan); + }); + } + return obj; +}; + +SVG.importPoint = function(coords, rec, layerOpts) { + rec = rec || {}; + if ('svg-symbol' in rec) { + return SVG.importSymbol(rec['svg-symbol'], coords); + } + return SVG.importStandardPoint(coords, rec, layerOpts || {}); }; SVG.importPolygon = function(coords) { @@ -148,12 +158,62 @@ SVG.importPolygon = function(coords) { return o; }; +SVG.importStandardPoint = function(coords, rec, layerOpts) { + var isLabel = 'label-text' in rec; + var symbolType = layerOpts.point_symbol || ''; + var children = []; + var halfSize = rec.r || 0; // radius or half of symbol size + var p; + // if not a label, create a symbol even without a size + // (circle radius can be set via CSS) + if (halfSize > 0 || !isLabel) { + if (symbolType == 'text') { + p = { + tag: 'text', + properties: { + x: coords[0], + y: coords[1], + dx: 0, + dy: rec['font-size'] ? rec['font-size'] / 4 : 7, + 'font-size': rec['font-size'] ? rec['font-size'] - 2 : 10, + 'text-anchor': 'middle' + }, + value: rec['point-text'] ? rec['point-text'] : '●' + } + } else if (symbolType == 'square') { + p = { + tag: 'rect', + properties: { + x: coords[0] - halfSize, + y: coords[1] - halfSize, + width: halfSize * 2, + height: halfSize * 2 + }}; + } else { // default is circle + p = { + tag: 'circle', + properties: { + cx: coords[0], + cy: coords[1] + }}; + if (halfSize > 0) { + p.properties.r = halfSize; + } + } + children.push(p); + } + if (isLabel) { + children.push(SVG.importLabel(rec, coords)); + } + return children.length > 1 ? {tag: 'g', children: children} : children[0]; +}; + SVG.geojsonImporters = { Point: SVG.importPoint, Polygon: SVG.importPolygon, LineString: SVG.importLineString, - MultiPoint: function(coords) { - return SVG.importMultiGeometry(coords, SVG.importPoint); + MultiPoint: function(coords, rec, opts) { + return SVG.importMultiPoint(coords, rec, opts); }, MultiLineString: function(coords) { return SVG.importMultiPath(coords, SVG.importLineString); diff --git a/src/svg/mapshaper-basic-symbols.js b/src/svg/mapshaper-basic-symbols.js new file mode 100644 index 000000000..c13cf1274 --- /dev/null +++ b/src/svg/mapshaper-basic-symbols.js @@ -0,0 +1,84 @@ +/* @require svg-common */ + +SVG.symbolRenderers.circle = function(d, x, y) { + var o = SVG.importPoint([x, y], d, {}); + SVG.applyStyleAttributes(o, 'Point', d); + return [o]; +}; + +SVG.symbolRenderers.label = function(d, x, y) { + var o = SVG.importStyledLabel(d, [x, y]); + return [o]; +}; + +SVG.symbolRenderers.image = function(d, x, y) { + var w = d.width || 20, + h = d.height || 20; + var o = { + tag: 'image', + properties: { + width: w, + height: h, + x: x - w / 2, + y: y - h / 2, + href: d.href || '' + } + }; + return [o]; +}; + +SVG.symbolRenderers.square = function(d, x, y) { + var o = SVG.importPoint([x, y], d, {point_symbol: 'square'}); + SVG.applyStyleAttributes(o, 'Point', d); + return [o]; +}; + +SVG.symbolRenderers.line = function(d, x, y) { + var coords, o; + coords = [[x, y], [x + (d.dx || 0), y + (d.dy || 0)]]; + o = SVG.importLineString(coords); + SVG.applyStyleAttributes(o, 'LineString', d); + return [o]; +}; + +SVG.symbolRenderers.group = function(d, x, y) { + return (d.parts || []).reduce(function(memo, o) { + var sym = SVG.renderSymbol(o, x, y); + if (d.chained) { + x += (o.dx || 0); + y += (o.dy || 0); + } + return memo.concat(sym); + }, []); +}; + +SVG.getEmptySymbol = function() { + return {tag: 'g', properties: {}, children: []}; +}; + +SVG.renderSymbol = function(d, x, y) { + var renderer = SVG.symbolRenderers[d.type]; + if (!renderer) { + stop(d.type ? 'Unknown symbol type: ' + d.type : 'Symbol is missing a type property'); + } + return renderer(d, x || 0, y || 0); +}; + +// d: svg-symbol object from feature data object +SVG.importSymbol = function(d, xy) { + var renderer; + if (!d) { + return SVG.getEmptySymbol(); + } + if (utils.isString(d)) { + d = JSON.parse(d); + } + return { + tag: 'g', + properties: { + 'class': 'mapshaper-svg-symbol', + transform: xy ? SVG.getTransform(xy) : null + }, + children: SVG.renderSymbol(d) + }; +}; diff --git a/src/svg/mapshaper-scalebar.js b/src/svg/mapshaper-scalebar.js new file mode 100644 index 000000000..70a786c81 --- /dev/null +++ b/src/svg/mapshaper-scalebar.js @@ -0,0 +1,142 @@ +/* @require svg-common mapshaper-frame */ + +api.scalebar = function(catalog, opts) { + var frame = internal.findFrameDataset(catalog); + var obj, lyr; + if (!frame) { + stop('Missing a map frame'); + } + obj = utils.defaults({type: 'scalebar'}, opts); + lyr = { + name: opts.name || 'scalebar', + data: new DataTable([obj]) + }; + frame.layers.push(lyr); +}; + +// TODO: generalize to other kinds of furniture as they are developed +internal.getScalebarPosition = function(d) { + var opts = { // defaults + valign: 'top', + halign: 'left', + voffs: 10, + hoffs: 10 + }; + if (+d.left > 0) { + opts.hoffs = +d.left; + } + if (+d.top > 0) { + opts.voffs = +d.top; + } + if (+d.right > 0) { + opts.hoffs = +d.right; + opts.halign = 'right'; + } + if (+d.bottom > 0) { + opts.voffs = +d.bottom; + opts.valign = 'bottom'; + } + return opts; +}; + +SVG.furnitureRenderers.scalebar = function(d, frame) { + var pos = internal.getScalebarPosition(d); + var metersPerPx = internal.getMapFrameMetersPerPixel(frame); + var label = d.label_text || internal.getAutoScalebarLabel(frame.width, metersPerPx); + var scalebarKm = internal.parseScalebarLabelToKm(label); + var barHeight = 3; + var labelOffs = 4; + var fontSize = +d.font_size || 13; + var width = Math.round(scalebarKm / metersPerPx * 1000); + var height = Math.round(barHeight + labelOffs + fontSize * 0.8); + var labelPos = d.label_position == 'top' ? 'top' : 'bottom'; + var anchorX = pos.halign == 'left' ? 0 : width; + var anchorY = barHeight + labelOffs; + var dx = pos.halign == 'right' ? frame.width - width - pos.hoffs : pos.hoffs; + var dy = pos.valign == 'bottom' ? frame.height - height - pos.voffs : pos.voffs; + + if (labelPos == 'top') { + anchorY = -labelOffs; + dy += Math.round(labelOffs + fontSize * 0.8); + } + + if (width > 0 === false) { + stop("Null scalebar length"); + } + var barObj = { + tag: 'rect', + properties: { + fill: 'black', + x: 0, + y: 0, + width: width, + height: barHeight + } + }; + var labelOpts = { + 'label-text': label, + 'font-size': fontSize, + 'text-anchor': pos.halign == 'left' ? 'start': 'end', + 'dominant-baseline': labelPos == 'top' ? 'auto' : 'hanging' + //// 'dominant-baseline': labelPos == 'top' ? 'text-after-edge' : 'text-before-edge' + // 'text-after-edge' is buggy in Safari and unsupported by Illustrator, + // so I'm using 'hanging' and 'auto', which seem to be well supported. + // downside: requires a kludgy multiplier to calculate scalebar height (see above) + }; + var labelObj = SVG.symbolRenderers.label(labelOpts, anchorX, anchorY)[0]; + var g = { + tag: 'g', + children: [barObj, labelObj], + properties: { + transform: 'translate(' + dx + ' ' + dy + ')' + } + }; + return [g]; +}; + +internal.getAutoScalebarLabel = function(mapWidth, metersPerPx) { + var minWidth = 100; // TODO: vary min size based on map width + var minKm = metersPerPx * minWidth / 1000; + var options = ('1/8 1/5 1/4 1/2 1 1.5 2 3 4 5 8 10 12 15 20 25 30 40 50 75 ' + + '100 150 200 250 300 350 400 500 750 1,000 1,200 1,500 2,000 ' + + '2,500 3,000 4,000 5,000').split(' '); + return options.reduce(function(memo, str) { + if (memo) return memo; + var label = internal.formatDistanceLabelAsMiles(str); + if (internal.parseScalebarLabelToKm(label) > minKm) { + return label; + } + }, null) || ''; +}; + +internal.formatDistanceLabelAsMiles = function(str) { + var num = internal.parseScalebarNumber(str); + return str + (num > 1 ? ' MILES' : ' MILE'); +}; + +// See test/mapshaper-scalebar.js for examples of supported formats +internal.parseScalebarLabelToKm = function(str) { + var units = internal.parseScalebarUnits(str); + var value = internal.parseScalebarNumber(str); + if (!units || !value) return NaN; + return units == 'mile' ? value * 1.60934 : value; +}; + +internal.parseScalebarUnits = function(str) { + var isMiles = /miles?$/.test(str.toLowerCase()); + var isKm = /(km|kilometers?|kilometres?)$/.test(str.toLowerCase()); + return isMiles && 'mile' || isKm && 'km' || ''; +}; + +internal.parseScalebarNumber = function(str) { + var fractionRxp = /^([0-9]+) ?\/ ?([0-9]+)/; + var match, value; + str = str.replace(/[\s]/g, '').replace(/,/g, ''); + if (fractionRxp.test(str)) { + match = fractionRxp.exec(str); + value = +match[1] / +match[2]; + } else { + value = parseFloat(str); + } + return value > 0 && value < Infinity ? value : NaN; +}; diff --git a/src/svg/mapshaper-svg.js b/src/svg/mapshaper-svg.js index 834e677b6..ea752e339 100644 --- a/src/svg/mapshaper-svg.js +++ b/src/svg/mapshaper-svg.js @@ -1,17 +1,21 @@ /* @requires mapshaper-common +mapshaper-basic-symbols geojson-export -geojson-points geojson-to-svg mapshaper-svg-style +svg-common +mapshaper-pixel-transform */ // // internal.exportSVG = function(dataset, opts) { - var template = '\n\n%s\n'; - var b, svg; + var namespace = 'xmlns="http://www.w3.org/2000/svg"'; + var symbols = []; + var size, svg; // TODO: consider moving this logic to mapshaper-export.js if (opts.final) { @@ -19,12 +23,19 @@ internal.exportSVG = function(dataset, opts) { } else { dataset = internal.copyDataset(dataset); // Modify a copy of the dataset } - - b = internal.transformCoordsForSVG(dataset, opts); + // invert_y setting for screen coordinates and geojson polygon generation + utils.extend(opts, {invert_y: true}); + size = internal.transformCoordsForSVG(dataset, opts); svg = dataset.layers.map(function(lyr) { - return internal.exportLayerAsSVG(lyr, dataset, opts); + var obj = internal.exportLayerForSVG(lyr, dataset, opts); + SVG.embedImages(obj, symbols); + return SVG.stringify(obj); }).join('\n'); - svg = utils.format(template, b.width(), b.height(), 0, 0, b.width(), b.height(), svg); + if (symbols.length > 0) { + namespace += ' xmlns:xlink="http://www.w3.org/1999/xlink"'; + svg = '\n' + utils.pluck(symbols, 'svg').join('') + '\n' + svg; + } + svg = utils.format(template, namespace, size[0], size[1], 0, 0, size[0], size[1], svg); return [{ content: svg, filename: opts.file || utils.getOutputFileBase(dataset) + '.svg' @@ -32,69 +43,72 @@ internal.exportSVG = function(dataset, opts) { }; internal.transformCoordsForSVG = function(dataset, opts) { - var width = opts.width > 0 ? opts.width : 800; - var margin = opts.margin >= 0 ? opts.margin : 1; - var bounds = internal.getDatasetBounds(dataset); + var size = internal.transformDatasetToPixels(dataset, opts); var precision = opts.precision || 0.0001; - var height, bounds2, fwd; - - if (opts.svg_scale > 0) { - // alternative to using a fixed width (e.g. when generating multiple files - // at a consistent geographic scale) - width = bounds.width() / opts.svg_scale; - margin = 0; - } - internal.padViewportBoundsForSVG(bounds, width, margin); - height = Math.ceil(width * bounds.height() / bounds.width()); - bounds2 = new Bounds(0, -height, width, 0); - fwd = bounds.getTransform(bounds2); - internal.transformPoints(dataset, function(x, y) { - return fwd.transform(x, y); - }); - internal.setCoordinatePrecision(dataset, precision); - return bounds2; + return size; }; -// pad bounds to accomodate stroke width and circle radius -internal.padViewportBoundsForSVG = function(bounds, width, marginPx) { - var bw = bounds.width() || bounds.height() || 1; // handle 0 width bbox - var marg; - if (marginPx >= 0 === false) { - marginPx = 1; +internal.exportLayerForSVG = function(lyr, dataset, opts) { + var layerObj = internal.getEmptyLayerForSVG(lyr, opts); + if (internal.layerHasFurniture(lyr)) { + layerObj.children = internal.exportFurnitureForSVG(lyr, dataset, opts); + } else { + layerObj.children = internal.exportSymbolsForSVG(lyr, dataset, opts); } - marg = bw / (width - marginPx * 2) * marginPx; - bounds.padBounds(marg, marg, marg, marg); + return layerObj; }; -internal.exportGeoJSONForSVG = function(lyr, dataset, opts) { - var geojson = internal.exportGeoJSONCollection(lyr, dataset, opts); - if (opts.point_symbol == 'square' && geojson.features) { - geojson.features.forEach(function(feat) { - GeoJSON.convertPointFeatureToSquare(feat, 'r', 2); - }); - } - return geojson; +internal.exportFurnitureForSVG = function(lyr, dataset, opts) { + var frameLyr = internal.findFrameLayerInDataset(dataset); + var frameData; + if (!frameLyr) return []; + frameData = internal.getFurnitureLayerData(frameLyr); + frameData.crs = internal.getDatasetCRS(dataset); // required by e.g. scalebar + return SVG.importFurniture(internal.getFurnitureLayerData(lyr), frameData); }; -internal.exportLayerAsSVG = function(lyr, dataset, opts) { +internal.exportSymbolsForSVG = function(lyr, dataset, opts) { // TODO: convert geojson features one at a time - var geojson = internal.exportGeoJSONForSVG(lyr, dataset, opts); + var d = utils.defaults({layers: [lyr]}, dataset); + var geojson = internal.exportDatasetAsGeoJSON(d, opts); var features = geojson.features || geojson.geometries || (geojson.type ? [geojson] : []); - var symbols = SVG.importGeoJSONFeatures(features); + return SVG.importGeoJSONFeatures(features, opts); +}; + +internal.getEmptyLayerForSVG = function(lyr, opts) { var layerObj = { tag: 'g', - children: symbols, - properties: {id: lyr.name} + properties: {id: (opts.id_prefix || '') + lyr.name}, + children: [] }; // add default display properties to line layers - // (these are overridden by feature-level styles set via -svg-style) + // (these are overridden by feature-level styles set via -style) if (lyr.geometry_type == 'polyline') { layerObj.properties.fill = 'none'; layerObj.properties.stroke = 'black'; layerObj.properties['stroke-width'] = 1; } - return SVG.stringify(layerObj); + // add default text properties to layers with labels + if (internal.layerHasLabels(lyr) || internal.layerHasSvgSymbols(lyr) || internal.layerHasFurniture(lyr)) { + layerObj.properties['font-family'] = 'sans-serif'; + layerObj.properties['font-size'] = '12'; + layerObj.properties['text-anchor'] = 'middle'; + } + + return layerObj; +}; + +internal.layerHasSvgSymbols = function(lyr) { + return lyr.geometry_type == 'point' && lyr.data && lyr.data.fieldExists('svg-symbol'); +}; + +internal.layerHasLabels = function(lyr) { + var hasLabels = lyr.geometry_type == 'point' && lyr.data && lyr.data.fieldExists('label-text'); + //if (hasLabels && internal.findMaxPartCount(lyr.shapes) > 1) { + // console.error('Multi-point labels are not fully supported'); + //} + return hasLabels; }; diff --git a/src/svg/svg-common.js b/src/svg/svg-common.js new file mode 100644 index 000000000..0beab7b5b --- /dev/null +++ b/src/svg/svg-common.js @@ -0,0 +1,45 @@ + +var SVG = {}; + +SVG.propertyTypes = { + class: 'classname', + opacity: 'number', + r: 'number', + dx: 'measure', + dy: 'measure', + fill: 'color', + stroke: 'color', + 'line-height': 'measure', + 'letter-spacing': 'measure', + 'stroke-width': 'number', + 'stroke-dasharray': 'dasharray' +}; + +SVG.symbolRenderers = {}; +SVG.furnitureRenderers = {}; + +SVG.supportedProperties = 'class,opacity,stroke,stroke-width,stroke-dasharray,fill,r,dx,dy,font-family,font-size,text-anchor,font-weight,font-style,line-height,letter-spacing'.split(','); +SVG.commonProperties = 'class,opacity,stroke,stroke-width,stroke-dasharray'.split(','); + +SVG.propertiesBySymbolType = { + polygon: utils.arrayToIndex(SVG.commonProperties.concat('fill')), + polyline: utils.arrayToIndex(SVG.commonProperties), + point: utils.arrayToIndex(SVG.commonProperties.concat('fill', 'r')), + label: utils.arrayToIndex(SVG.commonProperties.concat( + 'fill,r,font-family,font-size,text-anchor,font-weight,font-style,letter-spacing,dominant-baseline'.split(','))) +}; + +SVG.findPropertiesBySymbolGeom = function(fields, type) { + var index = SVG.propertiesBySymbolType[type] || {}; + return fields.filter(function(name) { + return name in index; + }); +}; + +SVG.getTransform = function(xy, scale) { + var str = 'translate(' + xy[0] + ' ' + xy[1] + ')'; + if (scale && scale != 1) { + str += ' scale(' + scale + ')'; + } + return str; +}; diff --git a/src/svg/svg-stringify.js b/src/svg/svg-stringify.js new file mode 100644 index 000000000..8c700715e --- /dev/null +++ b/src/svg/svg-stringify.js @@ -0,0 +1,137 @@ +/* @require svg-common mapshaper-sha1 */ + +SVG.embedImages = function(obj, symbols) { + // Same-origin policy is an obstacle to embedding images in web UI + if (internal.runningInBrowser()) return; + procNode(obj); + + function procNode(obj) { + if (obj.tag == 'image') { + if (/\.svg/.test(obj.properties.href || '')) { + embedSvgImage(obj); + } + } else if (obj.children) { + obj.children.forEach(procNode); + } + } + + function embedSvgImage(obj) { + var id = addImage(obj.properties.href); + obj.tag = 'use'; + obj.properties.href = '#' + id; + } + + function addImage(href) { + var item = utils.find(symbols, function(item) {return item.href == href;}); + if (!item) { + item = { + href: href, + id: SVG.urlToId(href) // generating id from href, to try to support multiple inline svgs on page + }; + // item.svg = convertSvgToSymbol(getSvgFile(href), item.id) + '\n'; + item.svg = convertSvg(getSvgFile(href), item.id) + '\n'; + symbols.push(item); + } + return item.id; + } + + function getSvgFile(href) { + var res, content, fs; + if (href.indexOf('http') === 0) { + res = require('sync-request')('GET', href, {timeout: 1000}); + content = res.getBody().toString(); + } else if (require('fs').existsSync(href)) { // assume href is a relative path + content = require('fs').readFileSync(href, 'utf8'); + } else { + stop("Invalid SVG location:", href); + } + return content; + } + + /* + function convertSvgToSymbol(svg, id) { + svg = svg.replace(/[^]* to ... this may be futile, may + // have to go back to embedding entire SVG document instead of using symbols) + svg = svg.replace(//, ''); + svg = svg.replace(/]*>/, ''); + // convert to + svg = svg.replace(/^]*>/, function(a) { + var viewBox = a.match(/viewBox=".*?"/)[0]; + return ''; + }); + svg = svg.replace('svg>', 'symbol>'); + return svg; + } + */ + + function convertSvg(svg, id) { + // Remove stuff before tag + svg = svg.replace(/[^]*]*>/, function(a) { + // set id property of + a = a.replace(/ id="[^"]*"/, ''); + a = a.replace(/'; + } else { + svg += '/>'; + } + return svg; +}; + +SVG.stringEscape = (function() { + // See http://commons.oreilly.com/wiki/index.php/SVG_Essentials/The_XML_You_Need_for_SVG + var rxp = /[&<>"']/g, + map = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''' + }; + return function(s) { + return String(s).replace(rxp, function(s) { + return map[s]; + }); + }; +}()); + +SVG.stringifyProperties = function(o) { + return Object.keys(o).reduce(function(memo, key) { + var val = o[key], + strval; + if (!val && val !== 0) return memo; // omit undefined / empty / null values + strval = utils.isString(val) ? val : JSON.stringify(val); + if (key == 'href') { + key = 'xlink:href'; + } + return memo + ' ' + key + '="' + SVG.stringEscape(strval) + '"'; + }, ''); +}; diff --git a/src/data/mapshaper-delim-export.js b/src/text/mapshaper-delim-export.js similarity index 53% rename from src/data/mapshaper-delim-export.js rename to src/text/mapshaper-delim-export.js index 843181614..a28946d9d 100644 --- a/src/data/mapshaper-delim-export.js +++ b/src/text/mapshaper-delim-export.js @@ -8,7 +8,7 @@ internal.exportDelim = function(dataset, opts) { if (lyr.data){ arr.push({ // TODO: consider supporting encoding= option - content: internal.exportDelimTable(lyr, delim), + content: internal.exportLayerAsDSV(lyr, delim, opts), filename: (lyr.name || 'output') + '.' + ext }); } @@ -16,32 +16,52 @@ internal.exportDelim = function(dataset, opts) { }, []); }; -/* default d3 formatting doesn't serialize objects -internal.exportDelimTable = function(lyr, delim) { - var dsv = require("d3-dsv").dsvFormat(delim); - return dsv.format(lyr.data.getRecords()); +internal.exportLayerAsDSV = function(lyr, delim, optsArg) { + var opts = optsArg || {}; + var encoding = opts.encoding || 'utf8'; + var formatRows = require("d3-dsv").dsvFormat(delim).formatRows; + var records = lyr.data.getRecords(); + var fields = internal.findFieldNames(records, opts.field_order); + // exporting utf8 and ascii text as string by default (for now) + var exportAsString = internal.encodingIsUtf8(encoding) && !opts.to_buffer && + (records.length < 10000 || opts.to_string); + if (exportAsString) { + return internal.exportRecordsAsString(fields, records, formatRows); + } else { + return internal.exportRecordsAsBuffer(fields, records, formatRows, encoding); + } }; -*/ -internal.exportDelimTable = function(lyr, delim) { - var dsv = require("d3-dsv").dsvFormat(delim); - var fields = lyr.data.getFields(); - var formatRow = internal.getDelimRowFormatter(fields, lyr.data); - var records = lyr.data.getRecords(); - var str = dsv.formatRows([fields]); // headers - // don't copy all data elements - // str += dsv.formatRows(records.map(formatRow)); - for (var i=0, n=records.length; i 0) { + internal.updateFieldsInRecords(fields, records, replacements); + } + if (detectedNumFields.length > 0) { + message(utils.format("Auto-detected number field%s: %s", + detectedNumFields.length == 1 ? '' : 's', detectedNumFields.join(', '))); + } +}; + +// Copy original data properties and replacements to a new set of records +// (Better performance in v8 than making in-place replacements) +internal.updateFieldsInRecords = function(fields, records, replacements) { + records.forEach(function(rec, recId) { + var rec2 = {}, n, i, f; + for (i=0, n=fields.length; i 0 && str != 'NA' && str != 'NaN') { // ignore NA values ("NA" seen in R output) + return null; // unparseable value -- fail + } + } else { + count++; + } + arr.push(num); + } + return count > 0 ? arr : null; +}; + +internal.convertDataField = function(name, records, f) { + var values = []; + for (var i=0, n=records.length; i 0 ? lines : 1, + i, n, c, prev; + + for (i=0, n=buf.length; i 0.97 && asciiScore > 0.7; }; -// Accept string if it doesn't contain the "replacement character" +// Reject string if it contains the "replacement character" after decoding to UTF-8 internal.looksLikeUtf8 = function(samples) { + // Remove the byte sequence for the utf-8-encoded replacement char before decoding, + // in case the file is in utf-8, but contains some previously corrupted text. + // samples = samples.map(internal.replaceUtf8ReplacementChar); var str = internal.decodeSamples('utf8', samples); return str.indexOf('\ufffd') == -1; }; +internal.replaceUtf8ReplacementChar = function(buf) { + var isCopy = false; + for (var i=0, n=buf.length; i= 0) { + buf = buf.slice(start, end); + } + return internal.decodeString(buf, enc); +}; + +internal.getNativeEncoder = function(enc) { + var encoder = null; + enc = internal.standardizeEncodingName(enc); + if (enc != 'utf8') { + // TODO: support more encodings if TextEncoder is available + return null; + } + if (typeof TextEncoder != 'undefined') { + encoder = new TextEncoder(enc); + } + return function(str) { + // Convert Uint8Array from encoder to Buffer (fix for issue #216) + return encoder ? Buffer.from(encoder.encode(str).buffer) : utils.createBuffer(str, enc); + }; +}; + +internal.encodeString = (function() { + var iconv = require('iconv-lite'); + var toUtf8 = internal.getNativeEncoder('utf8'); + return function(str, enc) { + // TODO: faster ascii encoding? + var buf; + if (internal.encodingIsUtf8(enc)) { + buf = toUtf8(str); + } else { + buf = iconv.encode(str, enc); + } + return buf; + }; +}()); + +internal.getNativeDecoder = function(enc) { + var decoder = null; + enc = internal.standardizeEncodingName(enc); + if (enc != 'utf8') { + // TODO: support more encodings if TextDecoder is available + return null; + } + if (typeof TextDecoder != 'undefined') { + decoder = new TextDecoder(enc); + } + return function(buf) { + return decoder ? decoder.decode(buf) : buf.toString(enc); + }; +}; + +internal.decodeString = (function() { + var iconv = require('iconv-lite'); + var fromUtf8 = internal.getNativeDecoder('utf8'); + // @buf a Node Buffer + return function(buf, enc) { + var str; + if (internal.encodingIsUtf8(enc)) { + str = fromUtf8(buf); + } else { + str = iconv.decode(buf, enc); + } + return str; + }; +}()); + +internal.encodingIsSupported = function(raw) { + var enc = internal.standardizeEncodingName(raw); + return utils.contains(internal.getEncodings(), enc); +}; + +internal.trimBOM = function(str) { + // remove BOM if present + if (str.charCodeAt(0) == 0xfeff) { + str = str.substr(1); + } + return str; +}; + +internal.printEncodings = function() { + var encodings = internal.getEncodings().filter(function(name) { + // filter out some aliases and non-applicable encodings + return !/^(_|cs|internal|ibm|isoir|singlebyte|table|[0-9]|l[0-9]|windows)/.test(name); + }); + encodings.sort(); + message("Supported encodings:\n" + internal.formatStringsAsGrid(encodings)); +}; diff --git a/src/topojson/topojson-common.js b/src/topojson/topojson-common.js index b6154346d..288ab5889 100644 --- a/src/topojson/topojson-common.js +++ b/src/topojson/topojson-common.js @@ -9,7 +9,7 @@ var TopoJSON = {}; // @cb callback: function(ids) // callback returns undefined or an array of replacement ids // -TopoJSON.forEachPath = function forEachPath(obj, cb) { +TopoJSON.forEachShapePart = function forEachShapePart(obj, cb) { var iterators = { GeometryCollection: function(o) {o.geometries.forEach(eachGeom);}, LineString: function(o) { @@ -39,7 +39,7 @@ TopoJSON.forEachPath = function forEachPath(obj, cb) { }; TopoJSON.forEachArc = function forEachArc(obj, cb) { - TopoJSON.forEachPath(obj, function(ids) { + TopoJSON.forEachShapePart(obj, function(ids) { var retn; for (var i=0; i 0, stringify = JSON.stringify; + if (needCopy) { + dataset = internal.copyDatasetForExport(dataset); + } + if (opts.prettify) { stringify = internal.getFormattedStringify('coordinates,arcs,bbox,translate,scale'.split(',')); } + if (opts.width > 0 || opts.height > 0) { + opts = utils.defaults({invert_y: true}, opts); + internal.transformDatasetToPixels(dataset, opts); + } + + if (opts.precision) { + internal.setCoordinatePrecision(dataset, opts.precision); + } + if (opts.singles) { return internal.splitDataset(dataset).map(function(dataset) { - if (needCopy) dataset = internal.copyDatasetForExport(dataset); return { content: stringify(TopoJSON.exportTopology(dataset, opts)), filename: (dataset.layers[0].name || 'output') + extension }; }); } else { - if (needCopy) { - // TODO: redundant if precision was applied in mapshaper-export.js - dataset = internal.copyDatasetForExport(dataset); - } return [{ filename: opts.file || utils.getOutputFileBase(dataset) + extension, content: stringify(TopoJSON.exportTopology(dataset, opts)) @@ -74,6 +84,9 @@ TopoJSON.exportTopology = function(dataset, opts) { // retain crs data if relevant internal.exportCRS(dataset, topology); + if (opts.metadata) { + topology.metadata = internal.exportMetadata(dataset); + } return topology; }; @@ -82,10 +95,20 @@ TopoJSON.transformDataset = function(dataset, bounds, opts) { fw = bounds.getTransform(bounds2), inv = fw.invert(); - internal.transformPoints(dataset, function(x, y) { + function transform(x, y) { var p = fw.transform(x, y); return [Math.round(p[0]), Math.round(p[1])]; - }); + } + + if (dataset.arcs) { + dataset.arcs.transformPoints(transform); + } + // support non-standard format with quantized arcs and non-quantized points + if (!opts.no_point_quantization) { + dataset.layers.filter(internal.layerHasPoints).forEach(function(lyr) { + internal.transformPointsInLayer(lyr, transform); + }); + } // TODO: think about handling geometrical errors introduced by quantization, // e.g. segment intersections and collapsed polygon rings. @@ -174,16 +197,19 @@ TopoJSON.exportProperties = function(geometries, table, opts) { }); }; -// Export a mapshaper layer as a GeometryCollection +// Export a mapshaper layer as a TopoJSON GeometryCollection TopoJSON.exportLayer = function(lyr, arcs, opts) { var n = internal.getFeatureCount(lyr), - geometries = []; - // initialize to null geometries + geometries = [], + exporter = TopoJSON.exporters[lyr.geometry_type] || null, + shp; for (var i=0; i 0) { - geometries[i] = exporter(shape, coords); - } - }); - } -}; - -TopoJSON.exportPolygonGeom = function(shape, coords) { +TopoJSON.exportPolygonGeom = function(shape, coords, opts) { var geom = {}; shape = internal.filterEmptyArcs(shape, coords); if (!shape || shape.length === 0) { geom.type = null; } else if (shape.length > 1) { - geom.arcs = internal.explodePolygon(shape, coords); + geom.arcs = internal.explodePolygon(shape, coords, opts.invert_y); if (geom.arcs.length == 1) { geom.arcs = geom.arcs[0]; geom.type = "Polygon"; diff --git a/src/topojson/topojson-import.js b/src/topojson/topojson-import.js index 4b1d65b36..4a1ffa33d 100644 --- a/src/topojson/topojson-import.js +++ b/src/topojson/topojson-import.js @@ -1,4 +1,10 @@ -/* @requires topojson-common, mapshaper-point-utils, mapshaper-shape-geom, mapshaper-rounding */ +/* @requires +topojson-common +mapshaper-point-utils +mapshaper-shape-geom +mapshaper-rounding +mapshaper-metadata +*/ // Convert a TopoJSON topology into mapshaper's internal format // Side-effect: data in topology is modified @@ -52,6 +58,9 @@ internal.importTopoJSON = function(topology, opts) { info: {} }; internal.importCRS(dataset, topology); + if (topology.metadata) { + internal.importMetadata(dataset, topology.metadata); + } return dataset; }; @@ -193,8 +202,9 @@ TopoJSON.GeometryImporter = function(arcs, opts) { // TODO: check that rings are closed TopoJSON.importPolygonArcs = function(rings, arcs) { var ring = rings[0], - area = geom.getPlanarPathArea(ring, arcs), - imported = null; + imported = null, area; + if (!arcs) stop("Invalid TopoJSON file: missing arc data."); + area = geom.getPlanarPathArea(ring, arcs); if (!area) { return null; } diff --git a/src/topology/mapshaper-arc-classifier.js b/src/topology/mapshaper-arc-classifier.js index a87cdcce9..6f479c573 100644 --- a/src/topology/mapshaper-arc-classifier.js +++ b/src/topology/mapshaper-arc-classifier.js @@ -1,6 +1,7 @@ /* @requires mapshaper-shape-utils */ -internal.getArcClassifier = function(shapes, arcs) { +// @filter optional filter function; signature: function(idA, idB or -1):bool +internal.getArcClassifier = function(shapes, arcs, filter) { var n = arcs.size(), a = new Int32Array(n), b = new Int32Array(n); @@ -24,14 +25,16 @@ internal.getArcClassifier = function(shapes, arcs) { function classify(arcId, getKey) { var i = absArcId(arcId); - var key = null; - if (a[i] > -1) { - key = getKey(a[i], b[i]); - if (key) { - a[i] = -1; - b[i] = -1; - } - } + var shpA = a[i]; + var shpB = b[i]; + var key; + if (shpA == -1) return null; + key = getKey(shpA, shpB); + if (!key) return null; + a[i] = -1; + b[i] = -1; + // use optional filter to exclude some arcs + if (filter && !filter(shpA, shpB)) return null; return key; } diff --git a/src/topology/mapshaper-arc-index.js b/src/topology/mapshaper-arc-index.js index 8f0d97b63..595c731d8 100644 --- a/src/topology/mapshaper-arc-index.js +++ b/src/topology/mapshaper-arc-index.js @@ -28,7 +28,7 @@ function ArcIndex(pointCount) { // opposite direction. (This program uses the convention of CW for space-enclosing rings, CCW for holes, // so coincident boundaries should contain the same points in reverse sequence). // - this.findMatchingArc = function(xx, yy, start, end, getNext, getPrev) { + this.findDuplicateArc = function(xx, yy, start, end, getNext, getPrev) { // First, look for a reverse match var arcId = findArcNeighbor(xx, yy, start, end, getNext); if (arcId === null) { diff --git a/src/topology/mapshaper-gaps.js b/src/topology/mapshaper-gaps.js new file mode 100644 index 000000000..d3d75f420 --- /dev/null +++ b/src/topology/mapshaper-gaps.js @@ -0,0 +1,116 @@ + +/* @requires +mapshaper-nodes +mapshaper-shape-geom +mapshaper-segment-geom +mapshaper-units +*/ + +internal.closeGaps = function(lyr, dataset, opts) { + var maxGapLen = opts.gap_tolerance ? internal.convertIntervalParam(opts.gap_tolerance, internal.getDatasetCRS(dataset)) : 0; + var arcs = dataset.arcs; + var arcFilter = internal.getArcPresenceTest(lyr.shapes, arcs); + var nodes = new NodeCollection(dataset.arcs, arcFilter); + var dangles = internal.findPotentialUndershoots(nodes, maxGapLen); + if (dangles.length === 0) return nodes; + var arcShapes = internal.arcsToShapes(arcs, arcFilter); + var index = new PathIndex(arcShapes, arcs); + var extensions = dangles.reduce(function(memo, dangle) { + var candidates = index.findPointEnclosureCandidates(dangle.point, maxGapLen); + var nearestHit = internal.findUndershootTarget(dangle, candidates, arcs, maxGapLen); + if (nearestHit) { + memo.push(internal.getArcExtension(nearestHit, dangle.arc, arcs)); + } + return memo; + }, []); + + // TODO: consider alternative: append small patch arcs to paths instead of shifting endpoints + dataset.arcs = internal.insertArcExtensions(arcs, extensions); + return internal.addIntersectionCuts(dataset, {}); +}; + +// Return information about an arc that @endpoint can connect with to close a gap +// @candidates: array of ids of possible target arcs +internal.findUndershootTarget = function(endpoint, candidates, arcs, maxGapLen) { + var absId = absArcId(endpoint.arc); + var target = null; + candidates.forEach(function(candId) { + var hit; + if (candId == absId) return; // ignore self-intersections + hit = geom.getPointToPathInfo(endpoint.point[0], endpoint.point[1], [candId], arcs); + if (hit && hit.distance <= maxGapLen && (!target || hit.distance < target.distance)) { + target = hit; + } + }); + return target; +}; + + +// Create a polyline shape for each arc in an ArcCollection +internal.arcsToShapes = function(arcs, filter) { + var shapes = []; + for (var i=0, n=arcs.size(); i maxLen; + }); +}; + +internal.insertArcExtensions = function(arcs, extensions) { + var data = arcs.getVertexData(); + extensions.forEach(function(obj) { + var i = arcs.indexOfVertex(obj.arc, -1); + data.xx[i] = obj.point[0]; + data.yy[i] = obj.point[1]; + }); + + // re-index arc bounds + arcs.updateVertexData(data.nn, data.xx, data.yy, data.zz); + return arcs; +}; + +internal.chooseCloserPoint = function(p, a, b) { + return distance2D(p[0], p[1], a[0], a[1]) < distance2D(p[0], p[1], b[0], b[1]) ? a : b; +}; + +internal.pointIsEndpoint = function(p, a, b) { + return p[0] == a[0] && p[1] == a[1] || p[0] == b[0] && p[1] == b[1]; +}; + +// move point a bit farther away from +internal.addTinyOvershoot = function(a, b) { + var dist = distance2D(a[0], a[1], b[0], b[1]); + var k = (dist + 1e-6) / dist; + return [a[0] + k * (b[0] - a[0]), a[1] + k * (b[1] - a[1])]; +}; + +internal.getArcExtension = function(hit, arcId, arcs) { + var v0 = arcs.getVertex(arcId, -1), + endPtOld = [v0.x, v0.y], + v1 = arcs.getVertex(arcId, -2), + p1 = [v1.x, v1.y], + s1 = hit.segment[0], + s2 = hit.segment[1], + endPtNew = geom.findClosestPointOnSeg(endPtOld[0], endPtOld[1], s1[0], s1[1], s2[0], s2[1]); + if (!internal.pointIsEndpoint(endPtNew, s1, s2)) { + // add small overshoot if new endpoint is not a vertex, to make sure intersection + // is correctly detected later + endPtNew = internal.addTinyOvershoot(p1, endPtNew); + // handle floating point rounding errors by snapping to a segment endpoint + if (!geom.segmentIntersection(p1[0], p1[1], endPtNew[0], endPtNew[1], s1[0], s1[1], s2[0], s2[1])) { + endPtNew = internal.chooseCloserPoint(p1, s1, s2); + } + // TODO: test edge cases; moving the endpoint of a dangling arc could create + // invalid geometry, e.g. duplicate points + } + return { + arc: arcId, + point: endPtNew + }; +}; diff --git a/src/topology/mapshaper-nodes.js b/src/topology/mapshaper-nodes.js index afd2061ba..d331f97f4 100644 --- a/src/topology/mapshaper-nodes.js +++ b/src/topology/mapshaper-nodes.js @@ -11,22 +11,26 @@ function NodeCollection(arcs, filter) { nn = arcData.nn, xx = arcData.xx, yy = arcData.yy, - chains; + nodeData; // Accessor function for arcs - // TODO: could check that arc collection hasn't been modified, using accessor function Object.defineProperty(this, 'arcs', {value: arcs}); - this.toArray = function() { - var nodes = internal.findNodeTopology(arcs, filter), - flags = new Uint8Array(nodes.xx.length), + var toArray = this.toArray = function() { + var chains = getNodeChains(), + flags = new Uint8Array(chains.length), arr = []; - utils.forEach(nodes.chains, function(next, i) { - if (flags[i] == 1) return; - arr.push([nodes.xx[i], nodes.yy[i]]); - while (flags[next] != 1) { - flags[next] = 1; - next = nodes.chains[next]; + utils.forEach(chains, function(nextIdx, thisIdx) { + var node, x, y, p; + if (flags[thisIdx] == 1) return; + p = getEndpoint(thisIdx); + if (!p) return; // endpoints of an excluded arc + node = {coordinates: p, arcs: []}; + arr.push(node); + while (flags[thisIdx] != 1) { + node.arcs.push(chainToArcId(thisIdx)); + flags[thisIdx] = 1; + thisIdx = chains[thisIdx]; } }); return arr; @@ -36,35 +40,44 @@ function NodeCollection(arcs, filter) { return this.toArray().length; }; - this.debugNode = function(arcId) { - var ids = [arcId]; - this.forEachConnectedArc(arcId, function(id) { - ids.push(id); - }); + this.findDanglingEndpoints = function() { + var chains = getNodeChains(), + arr = [], p; + for (var i=0, n=chains.length; i 0) { - var p1 = arcs.getVertex(id, -1); - str += utils.format("[%f, %f]", p1.x, p1.y); - if (len > 1) { - var p2 = arcs.getVertex(id, -2); - str += utils.format(", [%f, %f]", p2.x, p2.y); - if (len > 2) { - var p3 = arcs.getVertex(id, 0); - str += utils.format(", [%f, %f]", p3.x, p3.y); - } - str += " len: " + distance2D(p1.x, p1.y, p2.x, p2.y); - } - } else { - str = "[]"; + this.detachAcyclicArcs = function() { + var chains = getNodeChains(), + count = 0, + fwd, rev; + for (var i=0, n=chains.length; i 0) { + // removing one acyclic arc could expose another -- need another pass + count += this.detachAcyclicArcs(); + } + return count; + }; + + this.detachArc = function(arcId) { + unlinkDirectedArc(arcId); + unlinkDirectedArc(~arcId); }; this.forEachConnectedArc = function(arcId, cb) { @@ -76,11 +89,18 @@ function NodeCollection(arcs, filter) { } }; - this.getConnectedArcs = function(arcId) { + // @filter (optional) only includes arc ids that return positive + // Filter function receives the forward (positive) id of each connected arc + this.getConnectedArcs = function(arcId, filter) { var ids = []; var nextId = nextConnectedArc(arcId); + if (filter && !filter(absArcId(arcId))) { + return ids; + } while (nextId != arcId) { - ids.push(nextId); + if (!filter || filter(absArcId(nextId))) { + ids.push(nextId); + } nextId = nextConnectedArc(nextId); } return ids; @@ -88,7 +108,7 @@ function NodeCollection(arcs, filter) { // Returns the id of the first identical arc or @arcId if none found // TODO: find a better function name - this.findMatchingArc = function(arcId) { + this.findDuplicateArc = function(arcId) { var nextId = nextConnectedArc(arcId), match = arcId; while (nextId != arcId) { @@ -97,20 +117,45 @@ function NodeCollection(arcs, filter) { } nextId = nextConnectedArc(nextId); } - if (match != arcId) { - // console.log("found identical arc:", arcId, "->", match); - } return match; }; + // returns null if link has been removed from node collection + function getEndpoint(chainId) { + return linkIsDetached(chainId) ? null : [nodeData.xx[chainId], nodeData.yy[chainId]]; + } + + function linkIsDetached(chainId) { + return isNaN(nodeData.xx[chainId]); + } + + function unlinkDirectedArc(arcId) { + var chainId = arcToChainId(arcId), + chains = getNodeChains(), + nextId = chains[chainId], + prevId = prevChainId(chainId); + nodeData.xx[chainId] = NaN; + nodeData.yy[chainId] = NaN; + chains[chainId] = chainId; + chains[prevId] = nextId; + } + + function chainToArcId(chainId) { + var absId = chainId >> 1; + return chainId & 1 == 1 ? absId : ~absId; + } + + function arcToChainId(arcId) { + var fw = arcId >= 0; + return fw ? arcId * 2 + 1 : (~arcId) * 2; // if fw, use end, if rev, use start + } + function getNodeChains() { - var nodeData; - if (!chains) { + if (!nodeData) { nodeData = internal.findNodeTopology(arcs, filter); - chains = nodeData.chains; - if (nn.length * 2 != chains.length) error("[NodeCollection] count error"); + if (nn.length * 2 != nodeData.chains.length) error("[NodeCollection] count error"); } - return chains; + return nodeData.chains; } function testArcMatch(a, b) { @@ -140,21 +185,26 @@ function NodeCollection(arcs, filter) { // return arcId of next arc in the chain, pointed towards the shared vertex function nextConnectedArc(arcId) { - var fw = arcId >= 0, - absId = fw ? arcId : ~arcId, - nodeId = fw ? absId * 2 + 1: absId * 2, // if fw, use end, if rev, use start - chains = getNodeChains(), - chainedId = chains[nodeId], - nextAbsId = chainedId >> 1, - nextArcId = chainedId & 1 == 1 ? nextAbsId : ~nextAbsId; - - if (chainedId < 0 || chainedId >= chains.length) error("out-of-range chain id"); - if (absId >= nn.length) error("out-of-range arc id"); - if (chains.length <= nodeId) error("out-of-bounds node id"); - return nextArcId; + var chainId = arcToChainId(arcId), + chains = getNodeChains(), + nextChainId = chains[chainId]; + if (!(nextChainId >= 0 && nextChainId < chains.length)) error("out-of-range chain id"); + return chainToArcId(nextChainId); } - // expose for testing + function prevChainId(chainId) { + var chains = getNodeChains(), + prevId = chainId, + nextId = chains[chainId]; + while (nextId != chainId) { + prevId = nextId; + nextId = chains[nextId]; + if (nextId == prevId) error("Node indexing error"); + } + return prevId; + } + + // expose functions for testing this.internal = { testArcMatch: testArcMatch, testVertexMatch: testVertexMatch @@ -168,18 +218,23 @@ internal.findNodeTopology = function(arcs, filter) { ids2 = new Int32Array(n); arcs.forEach2(function(i, n, xx, yy, zz, arcId) { - if (filter && !filter(arcId)) { - return; - } var start = i, end = i + n - 1, start2 = arcId * 2, - end2 = start2 + 1; - xx2[start2] = xx[start]; - yy2[start2] = yy[start]; + end2 = start2 + 1, + ax = xx[start], + ay = yy[start], + bx = xx[end], + by = yy[end]; + if (filter && !filter(arcId)) { + ax = ay = bx = by = NaN; + } + + xx2[start2] = ax; + yy2[start2] = ay; ids2[start2] = arcId; - xx2[end2] = xx[end]; - yy2[end2] = yy[end]; + xx2[end2] = bx; + yy2[end2] = by; ids2[end2] = arcId; }); diff --git a/src/topology/mapshaper-polygon-mosaic.js b/src/topology/mapshaper-polygon-mosaic.js index 7328c7281..59c6d3d28 100644 --- a/src/topology/mapshaper-polygon-mosaic.js +++ b/src/topology/mapshaper-polygon-mosaic.js @@ -4,27 +4,147 @@ mapshaper-pathfinder-utils mapshaper-pathfinder */ +// Create a mosaic layer from a dataset (useful for debugging commands like -clean +// that create a mosaic as an intermediate data structure) +// Create additional layers if the "debug" flag is present +// +internal.mosaic = function(dataset, opts) { + var layers2 = []; + var nodes, output; + if (!dataset.arcs) stop("Dataset is missing path data"); + nodes = internal.addIntersectionCuts(dataset, opts); + output = internal.buildPolygonMosaic(nodes); + layers2.push({ + name: 'mosaic', + shapes: output.mosaic, + geometry_type: 'polygon' + }); + if (opts.debug) { + layers2.push({ + geometry_type: 'polygon', + name: 'mosaic-enclosure', + shapes: output.enclosures + }); + + if (output.lostArcs.length > 0) { + layers2 = layers2.concat(getLostArcLayers(output.lostArcs, nodes.arcs)); + } + } + return layers2; + + function getLostArcLayers(lostArcs, arcs) { + var arcLyr = {geometry_type: 'polyline', name: 'lost-arcs', shapes: []}; + var pointLyr = {geometry_type: 'point', name: 'lost-arc-endpoints', shapes: []}; + var arcData = []; + var pointData = []; + lostArcs.forEach(function(arcId) { + var first = arcs.getVertex(arcId, 0); + var last = arcs.getVertex(arcId, -1); + arcData.push({ARCID: arcId}); + arcLyr.shapes.push([[arcId]]); + pointData.push({ARCID: arcId}, {ARCID: arcId}); + pointLyr.shapes.push([[first.x, first.y]], [[last.x, last.y]]); + }); + arcLyr.data = new DataTable(arcData); + pointLyr.data = new DataTable(pointData); + return [arcLyr, pointLyr]; + } +}; + +// Process arc-node topology to generate a layer of indivisible mosaic "tiles" {mosaic} +// ... also return a layer of outer-boundary polygons {enclosures} +// ... also return an array of arcs that were dropped from the mosaic {lostArcs} +// +// Assumes that the arc-node topology of @nodes NodeCollection meets several +// conditions (expected to be true if addIntersectionCuts() has just been run) +// 1. Arcs only touch at endpoints. +// 2. The angle between any two segments that meet at a node is never zero. +// (this should follow from 1... but may occur due to FP errors) +// TODO: a better job of handling FP errors +// internal.buildPolygonMosaic = function(nodes) { - // Assumes that insertClippingPoints() has been run - var arcs = nodes.arcs; + T.start(); + // Detach any acyclic paths (spikes) from arc graph (these would interfere with + // the ring finding operation). This modifies @nodes -- a side effect. + nodes.detachAcyclicArcs(); + var data = internal.findMosaicRings(nodes); + + // Process CW rings: these are indivisible space-enclosing boundaries of mosaic tiles + var mosaic = data.cw.map(function(ring) {return [ring];}); + T.stop('Find mosaic rings'); + T.start(); + + // Process CCW rings: these are either holes or enclosure + // TODO: optimize -- testing CCW path of every island is costly + var enclosures = []; + var index = new PathIndex(mosaic, nodes.arcs); // index CW rings to help identify holes + data.ccw.forEach(function(ring) { + var id = index.findSmallestEnclosingPolygon(ring); + if (id > -1) { + // Enclosed CCW rings are holes in the enclosing mosaic tile + mosaic[id].push(ring); + } else { + // Non-enclosed CCW rings are outer boundaries -- add to enclosures layer + internal.reversePath(ring); + enclosures.push([ring]); + } + }); + T.stop(utils.format("Detect holes (holes: %d, enclosures: %d)", data.ccw.length - enclosures.length, enclosures.length)); + + return {mosaic: mosaic, enclosures: enclosures, lostArcs: data.lostArcs}; +}; + +internal.findMosaicRings = function(nodes) { + var arcs = nodes.arcs, + cw = [], + ccw = [], + empty = [], + lostArcs = []; + var flags = new Uint8Array(arcs.size()); var findPath = internal.getPathFinder(nodes, useRoute); - var rings = [], ring; + for (var i=0, n=flags.length; i 0) { + cw.push(ring); + } else if (area < 0) { + ccw.push(ring); + } else { + empty.push(ring); + } } - return rings; function useRoute(arcId) { + return routeIsOpen(arcId, true); + } + + function routeIsOpen(arcId, closeRoute) { var absId = absArcId(arcId); var bit = absId == arcId ? 1 : 2; - if ((flags[absId] & bit) === 0) { - flags[absId] |= bit; - return true; - } - return false; + var isOpen = (flags[absId] & bit) === 0; + if (closeRoute && isOpen) flags[absId] |= bit; + return isOpen; } }; diff --git a/src/topology/mapshaper-topology-chains-v2.js b/src/topology/mapshaper-topology-chains-v2.js index d10ac9efc..e12d31d78 100644 --- a/src/topology/mapshaper-topology-chains-v2.js +++ b/src/topology/mapshaper-topology-chains-v2.js @@ -7,13 +7,19 @@ function initHashChains(xx, yy) { hash = getXYHash(m), hashTable = new Int32Array(m), chainIds = new Int32Array(n), // Array to be filled with chain data - key, j; + key, j, i, x, y; - for (var i=0; i= 0 ? j : i; // first item in a chain points to self } return chainIds; } diff --git a/src/topology/mapshaper-topology.js b/src/topology/mapshaper-topology.js index bc44177d7..5254ee33c 100644 --- a/src/topology/mapshaper-topology.js +++ b/src/topology/mapshaper-topology.js @@ -186,7 +186,7 @@ internal.buildPathTopology = function(nn, xx, yy) { } function addSplitEdge(start1, end1, start2, end2) { - var arcId = index.findMatchingArc(xx, yy, start1, end2, nextPoint, prevPoint); + var arcId = index.findDuplicateArc(xx, yy, start1, end2, nextPoint, prevPoint); if (arcId === null) { arcId = index.addArc(mergeArcParts(xx, start1, end1, start2, end2), mergeArcParts(yy, start1, end1, start2, end2)); @@ -196,7 +196,7 @@ internal.buildPathTopology = function(nn, xx, yy) { function addEdge(start, end) { // search for a matching edge that has already been generated - var arcId = index.findMatchingArc(xx, yy, start, end, nextPoint, prevPoint); + var arcId = index.findDuplicateArc(xx, yy, start, end, nextPoint, prevPoint); if (arcId === null) { arcId = index.addArc(slice.call(xx, start, end + 1), slice.call(yy, start, end + 1)); @@ -221,7 +221,7 @@ internal.buildPathTopology = function(nn, xx, yy) { } for (var i=startId; i maxCount) maxCount = count; } - // get mode values (may be multiple) and margin - margin = maxCount; - for (i=0; i max) max = values[i]; + } + return max; +}; + +internal.getCountDataSummary = function(o) { + var counts = o.counts; + var values = o.values; + var maxCount = internal.getMaxValue(counts); + var nextCount = 0; + var modes = []; + var i, count; + for (i=0; i nextCount) { nextCount = count; } } return { modes: modes, - margin: modes.length > 1 ? 0 : maxCount - nextCount + margin: modes.length > 1 ? 0 : maxCount - nextCount, + count: maxCount }; }; + +internal.getModeData = function(values, verbose) { + var counts = internal.getValueCountData(values); + var modes = internal.getCountDataSummary(counts); + if (verbose) { + modes.counts = counts.counts; + modes.values = counts.values; + } + return modes; +}; diff --git a/src/utils/mapshaper-data-utils.js b/src/utils/mapshaper-data-utils.js index 828cc69e8..7440fb593 100644 --- a/src/utils/mapshaper-data-utils.js +++ b/src/utils/mapshaper-data-utils.js @@ -1,5 +1,19 @@ /* @requires mapshaper-common */ +// Not a general-purpose deep copy function +internal.copyRecord = function(o) { + var o2 = {}, key, val; + if (!o) return null; + for (key in o) { + if (o.hasOwnProperty(key)) { + val = o[key]; + o2[key] = val && val.constructor === Object ? internal.copyRecord(val) : val; + } + } + return o2; +}; + + // Insert a column of values into a (new or existing) data field internal.insertFieldValues = function(lyr, fieldName, values) { var size = internal.getFeatureCount(lyr) || values.length, @@ -66,13 +80,16 @@ internal.patchMissingFields = function(records, fields) { } }; -internal.getColumnType = function(key, table) { +internal.fieldListContainsAll = function(list, fields) { + return list.indexOf('*') > -1 || utils.difference(fields, list).length === 0; +}; + +internal.getColumnType = function(key, records) { var type = null, - records = table.getRecords(), rec; - for (var i=0, n=table.size(); i 0) { + var p1 = arcs.getVertex(id, -1); + str += utils.format("[%f, %f]", p1.x, p1.y); + if (len > 1) { + var p2 = arcs.getVertex(id, -2); + str += utils.format(", [%f, %f]", p2.x, p2.y); + if (len > 2) { + var p3 = arcs.getVertex(id, 0); + str += utils.format(", [%f, %f]", p3.x, p3.y); + } + str += " len: " + distance2D(p1.x, p1.y, p2.x, p2.y); + } + } else { + str = "[]"; + } + message(str); + } +}; diff --git a/src/utils/mapshaper-path-utils.js b/src/utils/mapshaper-path-utils.js new file mode 100644 index 000000000..b5835a028 --- /dev/null +++ b/src/utils/mapshaper-path-utils.js @@ -0,0 +1,352 @@ +/* @requires mapshaper-arcs */ + +// Utility functions for working with ArcCollection and arrays of arc ids. + +// Return average segment length (with simplification) +internal.getAvgSegment = function(arcs) { + var sum = 0; + var count = arcs.forEachSegment(function(i, j, xx, yy) { + var dx = xx[i] - xx[j], + dy = yy[i] - yy[j]; + sum += Math.sqrt(dx * dx + dy * dy); + }); + return sum / count || 0; +}; + +// Return average magnitudes of dx, dy (with simplification) +internal.getAvgSegment2 = function(arcs) { + var dx = 0, dy = 0; + var count = arcs.forEachSegment(function(i, j, xx, yy) { + dx += Math.abs(xx[i] - xx[j]); + dy += Math.abs(yy[i] - yy[j]); + }); + return [dx / count || 0, dy / count || 0]; +}; + +/* +this.getAvgSegmentSph2 = function() { + var sumx = 0, sumy = 0; + var count = this.forEachSegment(function(i, j, xx, yy) { + var lat1 = yy[i], + lat2 = yy[j]; + sumy += geom.degreesToMeters(Math.abs(lat1 - lat2)); + sumx += geom.degreesToMeters(Math.abs(xx[i] - xx[j]) * + Math.cos((lat1 + lat2) * 0.5 * geom.D2R); + }); + return [sumx / count || 0, sumy / count || 0]; +}; +*/ + +internal.getDirectedArcPresenceTest = function(shapes, n) { + var flags = new Uint8Array(n); + internal.forEachArcId(shapes, function(id) { + var absId = absArcId(id); + if (absId < n === false) error('index error'); + flags[absId] |= id < 0 ? 2 : 1; + }); + return function(arcId) { + var absId = absArcId(arcId); + return arcId < 0 ? (flags[absId] & 2) == 2 : (flags[absId] & 1) == 1; + }; +}; + +internal.getArcPresenceTest = function(shapes, arcs) { + var counts = new Uint8Array(arcs.size()); + internal.countArcsInShapes(shapes, counts); + return function(id) { + if (id < 0) id = ~id; + return counts[id] > 0; + }; +}; + +internal.getArcPresenceTest2 = function(layers, arcs) { + var counts = internal.countArcsInLayers(layers, arcs); + return function(arcId) { + return counts[absArcId(arcId)] > 0; + }; +}; + +// @counts A typed array for accumulating count of each abs arc id +// (assume it won't overflow) +internal.countArcsInShapes = function(shapes, counts) { + internal.traversePaths(shapes, null, function(obj) { + var arcs = obj.arcs, + id; + for (var i=0; i= 1) z = 0; + return z; +}; + +internal.findNextRemovableVertices = function(zz, zlim, start, end) { + var i = internal.findNextRemovableVertex(zz, zlim, start, end), + arr, k; + if (i > -1) { + k = zz[i]; + arr = [i]; + while (++i < end) { + if (zz[i] == k) { + arr.push(i); + } + } + } + return arr || null; +}; + +// Return id of the vertex between @start and @end with the highest +// threshold that is less than @zlim, or -1 if none +// +internal.findNextRemovableVertex = function(zz, zlim, start, end) { + var tmp, jz = 0, j = -1, z; + if (start > end) { + tmp = start; + start = end; + end = tmp; + } + for (var i=start+1; i jz) { + j = i; + jz = z; + } + } + return j; +}; + +// Visit each arc id in a path, shape or array of shapes +// Use non-undefined return values of callback @cb as replacements. +internal.forEachArcId = function(arr, cb) { + var item; + for (var i=0; i 0) shape2.push(path); + }); + return shape2.length > 0 ? shape2 : null; +}; + +// Bundle holes with their containing rings for Topo/GeoJSON polygon export. +// Assumes outer rings are CW and inner (hole) rings are CCW, unless +// the reverseWinding flag is set. +// @paths array of objects with path metadata -- see internal.exportPathData() +// +// TODO: Improve reliability. Currently uses winding order, area and bbox to +// identify holes and their enclosures -- could be confused by some strange +// geometry. +// +internal.groupPolygonRings = function(paths, reverseWinding) { + var holes = [], + groups = [], + sign = reverseWinding ? -1 : 1, + boundsQuery; + + (paths || []).forEach(function(path) { + if (path.area * sign > 0) { + groups.push([path]); + } else if (path.area * sign < 0) { + holes.push(path); + } else { + // Zero-area ring, skipping + } + }); + + if (holes.length === 0) { + return groups; + } + + // Using a spatial index to improve performance when the current feature + // contains many holes and space-filling rings. + // (Thanks to @simonepri for providing an example implementation in PR #248) + boundsQuery = internal.getBoundsSearchFunction(groups.map(function(group, i) { + return { + bounds: group[0].bounds, + idx: i + }; + })); + + // Group each hole with its containing ring + holes.forEach(function(hole) { + var containerId = -1, + containerArea = 0, + holeArea = hole.area * -sign, + b = hole.bounds, + // Find rings that might contain this hole + candidates = boundsQuery(b.xmin, b.ymin, b.xmax, b.ymax), + ring, ringId, ringArea, isContained; + // Group this hole with the smallest-area ring that contains it. + // (Assumes that if a ring's bbox contains a hole, then the ring also + // contains the hole). + for (var i=0, n=candidates.length; i holeArea; + if (isContained && (containerArea === 0 || ringArea < containerArea)) { + containerArea = ringArea; + containerId = ringId; + } + } + if (containerId == -1) { + debug("[groupPolygonRings()] polygon hole is missing a containing ring, dropping."); + } else { + groups[containerId].push(hole); + } + }); + + return groups; +}; + +internal.getPathMetadata = function(shape, arcs, type) { + var data = [], + ids; + for (var i=0, n=shape && shape.length; i 0) { @@ -82,8 +90,8 @@ internal.chooseRighthandPath = function(fromX, fromY, nodeX, nodeY, ax, ay, bx, } else { // Equal angles: use fallback test that is less sensitive to rounding error code = internal.chooseRighthandVector(ax - nodeX, ay - nodeY, bx - nodeX, by - nodeY); - trace("[chooseRighthandVector()] code:", code, 'angle:', angleA); - trace(fromX, fromY, nodeX, nodeY, ax, ay, bx, by); + debug('[chooseRighthandPath()] equal angles:', angleA, 'fallback test:', code); + // debug(fromX, fromY, nodeX, nodeY, ax, ay, bx, by); } return code; }; diff --git a/src/utils/mapshaper-point-utils.js b/src/utils/mapshaper-point-utils.js index 9911085bf..091c27d6d 100644 --- a/src/utils/mapshaper-point-utils.js +++ b/src/utils/mapshaper-point-utils.js @@ -8,6 +8,21 @@ internal.countPointsInLayer = function(lyr) { return count; }; +internal.countPoints2 = function(shapes, test, max) { + var count = 0; + var i, n, j, m, shp; + max = max || Infinity; + for (i=0, n=shapes.length; i> 2] |= (s.charCodeAt(i)||128) << (8 * (3 - i++ % 4)); + } + word_array[temp2 = ((str_len + 8) >> 2) | 15] = str_len << 3; + + for (; blockstart <= temp2; blockstart += 16) { + A = H; i = 0; + + for (; i < 80; + A = [[ + (G = ((s = A[0]) << 5 | s >>> 27) + A[4] + (W[i] = (i<16) ? ~~word_array[blockstart + i] : G << 1 | G >>> 31) + 1518500249) + ((B = A[1]) & (C = A[2]) | ~B & (D = A[3])), + F = G + (B ^ C ^ D) + 341275144, + G + (B & C | B & D | C & D) + 882459459, + F + 1535694389 + ][0|((i++) / 20)] | 0, s, B << 30 | B >>> 2, C, D] + ) { + G = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16]; + } + + for(i = 5; i; ) H[--i] = H[i] + A[i] | 0; + } + + for(str1 = ''; i < 40; )str1 += (H[i >> 3] >> (7 - i++ % 8) * 4 & 15).toString(16); + return str1; +}; diff --git a/src/utils/mapshaper-shape-utils.js b/src/utils/mapshaper-shape-utils.js index 831bc35c2..259bccbbc 100644 --- a/src/utils/mapshaper-shape-utils.js +++ b/src/utils/mapshaper-shape-utils.js @@ -1,78 +1,6 @@ -/* @requires mapshaper-arcs mapshaper-point-utils */ +/* @requires mapshaper-path-utils mapshaper-point-utils */ -// Utility functions for working with ArcCollection and arrays of arc ids. - - -// Return average segment length (with simplification) -internal.getAvgSegment = function(arcs) { - var sum = 0; - var count = arcs.forEachSegment(function(i, j, xx, yy) { - var dx = xx[i] - xx[j], - dy = yy[i] - yy[j]; - sum += Math.sqrt(dx * dx + dy * dy); - }); - return sum / count || 0; -}; - -// Return average magnitudes of dx, dy (with simplification) -internal.getAvgSegment2 = function(arcs) { - var dx = 0, dy = 0; - var count = arcs.forEachSegment(function(i, j, xx, yy) { - dx += Math.abs(xx[i] - xx[j]); - dy += Math.abs(yy[i] - yy[j]); - }); - return [dx / count || 0, dy / count || 0]; -}; - - -// Return average magnitudes of dx, dy (with simplification) -/* -this.getAvgSegmentSph2 = function() { - var sumx = 0, sumy = 0; - var count = this.forEachSegment(function(i, j, xx, yy) { - var lat1 = yy[i], - lat2 = yy[j]; - sumy += geom.degreesToMeters(Math.abs(lat1 - lat2)); - sumx += geom.degreesToMeters(Math.abs(xx[i] - xx[j]) * - Math.cos((lat1 + lat2) * 0.5 * geom.D2R); - }); - return [sumx / count || 0, sumy / count || 0]; -}; -*/ - - -// @counts A typed array for accumulating count of each abs arc id -// (assume it won't overflow) -internal.countArcsInShapes = function(shapes, counts) { - internal.traversePaths(shapes, null, function(obj) { - var arcs = obj.arcs, - id; - for (var i=0; i= 1) z = 0; - return z; -}; - -internal.findNextRemovableVertices = function(zz, zlim, start, end) { - var i = internal.findNextRemovableVertex(zz, zlim, start, end), - arr, k; - if (i > -1) { - k = zz[i]; - arr = [i]; - while (++i < end) { - if (zz[i] == k) { - arr.push(i); - } - } - } - return arr || null; +internal.forEachShapePart = function(paths, cb) { + internal.editShapeParts(paths, cb); }; -// Return id of the vertex between @start and @end with the highest -// threshold that is less than @zlim, or -1 if none // -internal.findNextRemovableVertex = function(zz, zlim, start, end) { - var tmp, jz = 0, j = -1, z; - if (start > end) { - tmp = start; - start = end; - end = tmp; - } - for (var i=start+1; i jz) { - j = i; - jz = z; - } - } - return j; -}; - -// Visit each arc id in a path, shape or array of shapes -// Use non-undefined return values of callback @cb as replacements. -internal.forEachArcId = function(arr, cb) { - var item; - for (var i=0; i 0) { - return paths.filter(function(ids) {return !!ids;}); + return parts.filter(function(part) {return !!part;}); } else { - return paths; + return parts; } }; -internal.forEachPathSegment = function(shape, arcs, cb) { - internal.forEachArcId(shape, function(arcId) { - arcs.forEachArcSegment(arcId, cb); - }); -}; - -internal.traversePaths = function traversePaths(shapes, cbArc, cbPart, cbShape) { - var segId = 0; - shapes.forEach(function(parts, shapeId) { - if (!parts || parts.length === 0) return; // null shape - var arcIds, arcId; - if (cbShape) { - cbShape(shapeId); - } - for (var i=0, m=parts.length; i 0) shape2.push(path); - }); - return shape2.length > 0 ? shape2 : null; -}; - -// Bundle holes with their containing rings for Topo/GeoJSON polygon export. -// Assumes outer rings are CW and inner (hole) rings are CCW. -// @paths array of objects with path metadata -- see internal.exportPathData() -// -// TODO: Improve reliability. Currently uses winding order, area and bbox to -// identify holes and their enclosures -- could be confused by strange -// geometry. -// -internal.groupPolygonRings = function(paths) { - var pos = [], - neg = []; - if (paths) { - paths.forEach(function(path) { - if (path.area > 0) { - pos.push(path); - } else if (path.area < 0) { - neg.push(path); - } else { - // verbose("Zero-area ring, skipping"); - } - }); - } - - var output = pos.map(function(part) { - return [part]; - }); - - neg.forEach(function(hole) { - var containerId = -1, - containerArea = 0; - for (var i=0, n=pos.length; i -hole.area; - if (contained && (containerArea === 0 || part.area < containerArea)) { - containerArea = part.area; - containerId = i; - } - } - if (containerId == -1) { - verbose("[groupPolygonRings()] polygon hole is missing a containing ring, dropping."); - } else { - output[containerId].push(hole); +// Get max number of parts in a single shape from an array of shapes. +// Caveat: polygon holes are counted as separate parts. +internal.findMaxPartCount = function(shapes) { + var maxCount = 0, shp; + for (var i=0, n=shapes.length; i maxCount) { + maxCount = shp.length; } - }); - return output; -}; - -internal.getPathMetadata = function(shape, arcs, type) { - var data = [], - ids; - for (var i=0, n=shape && shape.length; i 0 && val.constructor == Number; +}; + utils.parsePercent = function(o) { var str = String(o); var isPct = str.indexOf('%') > 0; @@ -76,3 +80,4 @@ utils.parsePercent = function(o) { } return pct; }; + diff --git a/lib/mbloch-utils.js b/src/utils/mbloch-utils.js similarity index 83% rename from lib/mbloch-utils.js rename to src/utils/mbloch-utils.js index babfe802e..150a5fbde 100644 --- a/lib/mbloch-utils.js +++ b/src/utils/mbloch-utils.js @@ -1,15 +1,16 @@ var error = function() { - var msg = Utils.toArray(arguments).join(' '); + var msg = utils.toArray(arguments).join(' '); throw new Error(msg); }; var utils = { - getUniqueName: function(prefix) { - var n = Utils.__uniqcount || 0; - Utils.__uniqcount = n + 1; - return (prefix || "__id_") + n; - }, + getUniqueName: (function() { + var c = 0; + return function(prefix) { + return (prefix || "__id_") + (++c); + }; + }()), isFunction: function(obj) { return typeof obj == 'function'; @@ -23,10 +24,6 @@ var utils = { return val < min ? min : (val > max ? max : val); }, - interpolate: function(val1, val2, pct) { - return val1 * (1-pct) + val2 * pct; - }, - isArray: function(obj) { return Array.isArray(obj); }, @@ -38,7 +35,7 @@ var utils = { }, isInteger: function(obj) { - return Utils.isNumber(obj) && ((obj | 0) === obj); + return utils.isNumber(obj) && ((obj | 0) === obj); }, isString: function(obj) { @@ -53,7 +50,7 @@ var utils = { // Convert an array-like object to an Array, or make a copy if @obj is an Array toArray: function(obj) { var arr; - if (!Utils.isArrayLike(obj)) error("Utils.toArray() requires an array-like object"); + if (!utils.isArrayLike(obj)) error("utils.toArray() requires an array-like object"); try { arr = Array.prototype.slice.call(obj, 0); // breaks in ie8 } catch(e) { @@ -70,8 +67,8 @@ var utils = { // TODO: try to detect objects with length property but no indexed data elements isArrayLike: function(obj) { if (!obj) return false; - if (Utils.isArray(obj)) return true; - if (Utils.isString(obj)) return false; + if (utils.isArray(obj)) return true; + if (utils.isString(obj)) return false; if (obj.length === 0) return true; if (obj.length > 0) return true; return false; @@ -118,7 +115,7 @@ var utils = { // Pseudoclassical inheritance // // Inherit from a Parent function: - // Utils.inherit(Child, Parent); + // utils.inherit(Child, Parent); // Call parent's constructor (inside child constructor): // this.__super__([args...]); inherit: function(targ, src) { @@ -137,86 +134,18 @@ var utils = { f.prototype = src.prototype || src; // added || src to allow inheriting from objects as well as functions // Extend targ prototype instead of wiping it out -- // in case inherit() is called after targ.prototype = {stuff}; statement - targ.prototype = Utils.extend(new f(), targ.prototype); // + targ.prototype = utils.extend(new f(), targ.prototype); // targ.prototype.constructor = targ; targ.prototype.__super__ = f; - }, - - // Inherit from a parent, call the parent's constructor, optionally extend - // prototype with optional additional arguments - subclass: function(parent) { - var child = function() { - this.__super__.apply(this, Utils.toArray(arguments)); - }; - Utils.inherit(child, parent); - for (var i=1; i= 0 ? num.toFixed(decimals) : String(num); }; -Utils.formatNumber = function(num, decimals, nullStr, showPos) { +utils.formatNumber = function(num, decimals, nullStr, showPos) { var fmt; if (isNaN(num)) { fmt = nullStr || '-'; } else { - fmt = Utils.numToStr(num, decimals); - fmt = Utils.addThousandsSep(fmt); + fmt = utils.numToStr(num, decimals); + fmt = utils.addThousandsSep(fmt); if (showPos && parseFloat(fmt) > 0) { fmt = "+" + fmt; } @@ -518,7 +449,7 @@ Transform.prototype.transform = function(x, y, xy) { }; Transform.prototype.toString = function() { - return Utils.toString(Utils.extend({}, this)); + return JSON.stringify(utils.extend({}, this)); }; @@ -571,7 +502,7 @@ Bounds.prototype.empty = function() { Bounds.prototype.setBounds = function(a, b, c, d) { if (arguments.length == 1) { // assume first arg is a Bounds or array - if (Utils.isArrayLike(a)) { + if (utils.isArrayLike(a)) { b = a[1]; c = a[2]; d = a[3]; @@ -763,7 +694,10 @@ Bounds.prototype.mergeCircle = function(x, y, r) { Bounds.prototype.mergeBounds = function(bb) { var a, b, c, d; if (bb instanceof Bounds) { - a = bb.xmin, b = bb.ymin, c = bb.xmax, d = bb.ymax; + a = bb.xmin; + b = bb.ymin; + c = bb.xmax; + d = bb.ymax; } else if (arguments.length == 4) { a = arguments[0]; b = arguments[1]; @@ -771,7 +705,10 @@ Bounds.prototype.mergeBounds = function(bb) { d = arguments[3]; } else if (bb.length == 4) { // assume array: [xmin, ymin, xmax, ymax] - a = bb[0], b = bb[1], c = bb[2], d = bb[3]; + a = bb[0]; + b = bb[1]; + c = bb[2]; + d = bb[3]; } else { error("Bounds#mergeBounds() invalid argument:", bb); } @@ -789,12 +726,12 @@ Bounds.prototype.mergeBounds = function(bb) { // Sort an array of objects based on one or more properties. -// Usage: Utils.sortOn(array, key1, asc?[, key2, asc? ...]) +// Usage: utils.sortOn(array, key1, asc?[, key2, asc? ...]) // -Utils.sortOn = function(arr) { +utils.sortOn = function(arr) { var comparators = []; for (var i=1; i operators (strings, numbers) // null, undefined and NaN are sorted to the end of the array // -Utils.genericSort = function(arr, asc) { - var compare = Utils.getGenericComparator(asc); +utils.genericSort = function(arr, asc) { + var compare = utils.getGenericComparator(asc); Array.prototype.sort.call(arr, compare); return arr; }; -Utils.sortOnKey = function(arr, getter, asc) { - var compare = Utils.getGenericComparator(asc !== false) // asc is default +utils.sortOnKey = function(arr, getter, asc) { + var compare = utils.getGenericComparator(asc !== false); // asc is default arr.sort(function(a, b) { return compare(getter(a), getter(b)); }); }; // Stashes keys in a temp array (better if calculating key is expensive). -Utils.sortOnKey2 = function(arr, getKey, asc) { - Utils.sortArrayByKeys(arr, arr.map(getKey), asc); +utils.sortOnKey2 = function(arr, getKey, asc) { + utils.sortArrayByKeys(arr, arr.map(getKey), asc); }; -Utils.sortArrayByKeys = function(arr, keys, asc) { - var ids = Utils.getSortedIds(keys, asc); - Utils.reorderArray(arr, ids); +utils.sortArrayByKeys = function(arr, keys, asc) { + var ids = utils.getSortedIds(keys, asc); + utils.reorderArray(arr, ids); }; -Utils.getSortedIds = function(arr, asc) { - var ids = Utils.range(arr.length); - Utils.sortArrayIndex(ids, arr, asc); +utils.getSortedIds = function(arr, asc) { + var ids = utils.range(arr.length); + utils.sortArrayIndex(ids, arr, asc); return ids; }; -Utils.sortArrayIndex = function(ids, arr, asc) { - var compare = Utils.getGenericComparator(asc); +utils.sortArrayIndex = function(ids, arr, asc) { + var compare = utils.getGenericComparator(asc); ids.sort(function(i, j) { // added i, j comparison to guarantee that sort is stable var cmp = compare(arr[i], arr[j]); - return cmp > 0 || cmp === 0 && i < j ? 1 : -1; + return cmp > 0 || cmp === 0 && i > j ? 1 : -1; }); }; -Utils.reorderArray = function(arr, idxs) { +utils.reorderArray = function(arr, idxs) { var len = idxs.length; var arr2 = []; for (var i=0; i= len) error("Out-of-bounds array idx"); arr2[i] = arr[idx]; } - Utils.replaceArray(arr, arr2); + utils.replaceArray(arr, arr2); }; -Utils.getKeyComparator = function(key, asc) { - var compare = Utils.getGenericComparator(asc); +utils.getKeyComparator = function(key, asc) { + var compare = utils.getGenericComparator(asc); return function(a, b) { return compare(a[key], b[key]); }; }; -Utils.getGenericComparator = function(asc) { +utils.getGenericComparator = function(asc) { asc = asc !== false; return function(a, b) { var retn = 0; @@ -892,14 +829,14 @@ Utils.getGenericComparator = function(asc) { // Generic in-place sort (null, NaN, undefined not handled) -Utils.quicksort = function(arr, asc) { - Utils.quicksortPartition(arr, 0, arr.length-1); +utils.quicksort = function(arr, asc) { + utils.quicksortPartition(arr, 0, arr.length-1); if (asc === false) Array.prototype.reverse.call(arr); // Works with typed arrays return arr; }; -// Moved out of Utils.quicksort() (saw >100% speedup in Chrome with deep recursion) -Utils.quicksortPartition = function (a, lo, hi) { +// Moved out of utils.quicksort() (saw >100% speedup in Chrome with deep recursion) +utils.quicksortPartition = function (a, lo, hi) { var i = lo, j = hi, pivot, tmp; @@ -916,34 +853,34 @@ Utils.quicksortPartition = function (a, lo, hi) { j--; } } - if (lo < j) Utils.quicksortPartition(a, lo, j); + if (lo < j) utils.quicksortPartition(a, lo, j); lo = i; j = hi; } }; -Utils.findRankByValue = function(arr, value) { +utils.findRankByValue = function(arr, value) { if (isNaN(value)) return arr.length; var rank = 1; for (var i=0, n=arr.length; i arr[i]) rank++; } return rank; -} +}; -Utils.findValueByPct = function(arr, pct) { +utils.findValueByPct = function(arr, pct) { var rank = Math.ceil((1-pct) * (arr.length)); - return Utils.findValueByRank(arr, rank); + return utils.findValueByRank(arr, rank); }; // See http://ndevilla.free.fr/median/median/src/wirth.c // Elements of @arr are reordered // -Utils.findValueByRank = function(arr, rank) { +utils.findValueByRank = function(arr, rank) { if (!arr.length || rank < 1 || rank > arr.length) error("[findValueByRank()] invalid input"); - rank = Utils.clamp(rank | 0, 1, arr.length); + rank = utils.clamp(rank | 0, 1, arr.length); var k = rank - 1, // conv. rank to array index n = arr.length, l = 0, @@ -973,18 +910,18 @@ Utils.findValueByRank = function(arr, rank) { // // -Utils.findMedian = function(arr) { +utils.findMedian = function(arr) { var n = arr.length, rank = Math.floor(n / 2) + 1, - median = Utils.findValueByRank(arr, rank); + median = utils.findValueByRank(arr, rank); if ((n & 1) == 0) { - median = (median + Utils.findValueByRank(arr, rank - 1)) / 2; + median = (median + utils.findValueByRank(arr, rank - 1)) / 2; } return median; }; -Utils.mean = function(arr) { +utils.mean = function(arr) { var count = 0, avg = NaN, val; @@ -1002,7 +939,7 @@ Utils.mean = function(arr) { // Has convenience methods for copying from buffers, etc. // function BinArray(buf, le) { - if (Utils.isNumber(buf)) { + if (utils.isNumber(buf)) { buf = new ArrayBuffer(buf); } else if (typeof Buffer == 'function' && buf instanceof Buffer) { // Since node 0.10, DataView constructor doesn't accept Buffers, @@ -1023,7 +960,7 @@ BinArray.bufferToUintArray = function(buf, wordLen) { if (wordLen == 4) return new Uint32Array(buf); if (wordLen == 2) return new Uint16Array(buf); if (wordLen == 1) return new Uint8Array(buf); - error("BinArray.bufferToUintArray() invalid word length:", wordLen) + error("BinArray.bufferToUintArray() invalid word length:", wordLen); }; BinArray.uintSize = function(i) { @@ -1070,7 +1007,7 @@ BinArray.bufferSize = function(buf) { return (buf instanceof ArrayBuffer ? buf.byteLength : buf.length | 0); }; -Utils.buffersAreIdentical = function(a, b) { +utils.buffersAreIdentical = function(a, b) { var alen = BinArray.bufferSize(a); var blen = BinArray.bufferSize(b); if (alen != blen) { @@ -1250,7 +1187,7 @@ BinArray.prototype = { for (var i=0; i 127) { - trace("#writeCString() Unicode value beyond ascii range") + // Unicode value beyond ascii range cval = '?'.charCodeAt(0); } this.writeUint8(cval); @@ -1309,11 +1246,11 @@ Examples: %'f 1000 '1,000' */ -// Usage: Utils.format(formatString, [values]) -// Tip: When reusing the same format many times, use Utils.formatter() for 5x - 10x better performance +// Usage: utils.format(formatString, [values]) +// Tip: When reusing the same format many times, use utils.formatter() for 5x - 10x better performance // -Utils.format = function(fmt) { - var fn = Utils.formatter(fmt); +utils.format = function(fmt) { + var fn = utils.formatter(fmt); var str = fn.apply(null, Array.prototype.slice.call(arguments, 1)); return str; }; @@ -1334,7 +1271,7 @@ function formatValue(val, matches) { isZero = false, isNeg = false; - var str; + var str, padChar, padStr; if (isString) { str = String(val); } @@ -1344,14 +1281,14 @@ function formatValue(val, matches) { str = str.toUpperCase(); } else if (isNumber) { - str = Utils.numToStr(val, isInt ? 0 : decimals); + str = utils.numToStr(val, isInt ? 0 : decimals); if (str[0] == '-') { isNeg = true; str = str.substr(1); } isZero = parseFloat(str) == 0; if (flags.indexOf("'") != -1 || flags.indexOf(',') != -1) { - str = Utils.addThousandsSep(str); + str = utils.addThousandsSep(str); } if (!isZero) { // BUG: sign is added when num rounds to 0 if (isNeg) { @@ -1367,8 +1304,8 @@ function formatValue(val, matches) { var minWidth = parseInt(padding, 10); if (strLen < minWidth) { padDigits = minWidth - strLen; - var padChar = flags.indexOf('0') == -1 ? ' ' : '0'; - var padStr = Utils.repeatString(padChar, padDigits); + padChar = flags.indexOf('0') == -1 ? ' ' : '0'; + padStr = utils.repeatString(padChar, padDigits); } } @@ -1383,16 +1320,16 @@ function formatValue(val, matches) { } // Get a function for interpolating formatted values into a string. -Utils.formatter = function(fmt) { +utils.formatter = function(fmt) { var codeRxp = /%([\',+0]*)([1-9]?)((?:\.[1-9])?)([sdifxX%])/g; var literals = [], formatCodes = [], startIdx = 0, prefix = "", - literal, - matches; + matches = codeRxp.exec(fmt), + literal; - while (matches=codeRxp.exec(fmt)) { + while (matches) { literal = fmt.substring(startIdx, codeRxp.lastIndex - matches[0].length); if (matches[0] == '%%') { prefix += literal + '%'; @@ -1402,6 +1339,7 @@ Utils.formatter = function(fmt) { formatCodes.push(matches); } startIdx = codeRxp.lastIndex; + matches = codeRxp.exec(fmt); } literals.push(prefix + fmt.substr(startIdx)); diff --git a/test/affine-test.js b/test/affine-test.js index d04b9ba33..b75ef153d 100644 --- a/test/affine-test.js +++ b/test/affine-test.js @@ -57,7 +57,7 @@ describe('mapshaper-affine.js', function () { type: 'MultiPoint', coordinates: [[2, 2], [4, 4]] }; - api.applyCommands('-i point.json -scale=2 -affine scale=2 -o', + api.applyCommands('-i point.json -affine scale=2 -o', {'point.json': geojson}, function(err, output) { var geojson = JSON.parse(output['point.json']); assert.deepEqual(geojson.geometries[0].coordinates, [[1, 1], [5, 5]]); diff --git a/test/centroid-test.js b/test/anchor-points-test.js similarity index 90% rename from test/centroid-test.js rename to test/anchor-points-test.js index 4e4c5c19c..dc790c96d 100644 --- a/test/centroid-test.js +++ b/test/anchor-points-test.js @@ -17,7 +17,7 @@ function testInnerPoints(file, cmd, done) { } -describe('mapshaper-polygon-centroid.js', function () { +describe('mapshaper-anchor-points.js', function () { describe('inner points test', function () { var a = "-each 'cx=$.innerX, cy=$.innerY' -points x=cx y=cy +"; @@ -42,14 +42,14 @@ describe('mapshaper-polygon-centroid.js', function () { it('"-points inner" converts collapsed polygon to null geometry', function () { var shp = [[[0]]]; var arcs = new api.internal.ArcCollection([[[0, 0], [0, 0], [0, 0], [0, 0]]]); - var p = api.geom.findInteriorPoint(shp, arcs); + var p = api.internal.findAnchorPoint(shp, arcs); assert.equal(p, null); }) it('"-points inner" finds center of a rectangle', function () { var shape = [[0]]; var arcs = new api.internal.ArcCollection([[[0, 0], [0, 1], [2, 1], [2, 0], [0, 0]]]); - var p = api.geom.findInteriorPoint(shape, arcs); + var p = api.internal.findAnchorPoint(shape, arcs); assert.equal(p.x, 1); assert.equal(p.y, 0.5); }) diff --git a/test/arcs-test.js b/test/arcs-test.js index f52ff454e..0627ee5ab 100644 --- a/test/arcs-test.js +++ b/test/arcs-test.js @@ -3,8 +3,7 @@ var api = require('..'), assert = require('assert'), ArcCollection = api.internal.ArcCollection, ArcIter = api.internal.ArcIter, - Utils = api.utils, - trace = Utils.trace; + utils = api.utils; // b --- d // / \ / @@ -38,8 +37,6 @@ var arcs5 = []; describe('mapshaper-arcs.js', function () { describe('ArcCollection', function () { - - describe('dedupCoords()', function () { it('NaNs are removed', function() { var xy = [[[NaN, NaN], [NaN, NaN], [NaN, NaN]], [[NaN, NaN], [NaN, NaN]]]; @@ -48,6 +45,7 @@ describe('mapshaper-arcs.js', function () { assert.deepEqual(arcs.toArray(), [[], []]); assert.equal(arcs.getPointCount(), 0); }); + it('collapsed arcs get zeroed out', function () { var xy = [[[1, 1], [1, 1], [1, 1]], [[2, 1], [2, 2]]]; var arcs = new ArcCollection(xy); @@ -68,6 +66,17 @@ describe('mapshaper-arcs.js', function () { }) }) + it("getCopy() preserves simplification data", function() { + var xy = [[[1, 1], [1, 1], [2, 2], [2, 2], [3, 3], [3, 3], [4, 4], [4, 4]]]; + var zz = [Infinity, 4, 5, 6, 4, 3, 2, Infinity]; + var arcs = new ArcCollection(xy); + arcs.setThresholds(zz); + arcs.setRetainedInterval(4); + var copy = arcs.getCopy(); + assert.equal(copy.getRetainedInterval(), 4); + assert.deepEqual([].slice.call(copy.getVertexData().zz), [Infinity, 4, 5, 6, 4, 3, 2, Infinity]); + }) + it("accepts arcs with length == 0", function() { var arcs = new api.internal.ArcCollection( new Uint32Array([0, 3]), @@ -139,20 +148,20 @@ describe('mapshaper-arcs.js', function () { var thresholds = [[Infinity, Infinity, Infinity], [Infinity, Infinity], [Infinity, Infinity, Infinity]]; var arcs = new ArcCollection(arcs1).setThresholds(thresholds); var removable = arcs.getRemovableThresholds(); - assert.deepEqual([], Utils.toArray(removable)); + assert.deepEqual([], utils.toArray(removable)); var removable2 = arcs.getRemovableThresholds(2); - assert.deepEqual([], Utils.toArray(removable2)); + assert.deepEqual([], utils.toArray(removable2)); }); it('#getRemovableThresholds(), three removable points', function() { var thresholds = [[Infinity, 5, 4, Infinity], [Infinity, Infinity, 7, Infinity]]; var arcs = new ArcCollection(arcs2).setThresholds(thresholds); var removable = arcs.getRemovableThresholds(); - assert.deepEqual([5, 4, 7], Utils.toArray(removable)); + assert.deepEqual([5, 4, 7], utils.toArray(removable)); var removable2 = arcs.getRemovableThresholds(2); - assert.deepEqual([7], Utils.toArray(removable2)); + assert.deepEqual([7], utils.toArray(removable2)); }); it('#getThresholdByPct(), nothing to remove', function() { diff --git a/test/bbox-clipping-test.js b/test/bbox-clipping-test.js new file mode 100644 index 000000000..8dd0e28ea --- /dev/null +++ b/test/bbox-clipping-test.js @@ -0,0 +1,128 @@ +var assert = require('assert'), + api = require('../'); + +function test(expected, input, bbox, isRing) { + var bounds = new api.internal.Bounds(bbox); + var iter = new api.internal.PointIter(input); + var output = api.internal.clipIterByBounds(iter, bounds, isRing); + // console.log("output:", output) + assert.deepEqual(output, expected); +} + +describe('mapshaper-bbox-clipping.js', function () { + describe('clipIterByBounds() tests', function () { + + it('test 2e', function () { + // segment goes to opposite corner, on the right + var bbox = [1, 1, 2, 2]; + var input = [[0, -10], [10, 3]]; + var expected = [[1, 1], [2, 1], [2, 2]]; + test(expected, input, bbox, false); + }) + + it('test 2f', function () { + // segment goes to opposite corner, on the left + var bbox = [1, 1, 2, 2]; + var input = [[-10, 0], [3, 10]]; + var expected = [[1, 1], [1, 2], [2, 2]]; + test(expected, input, bbox, false); + }) + + it('test 2g', function () { + // segment goes to opposite corner, on the right (2) + var bbox = [1, 1, 2, 2]; + var input = [[10, 0], [0, 10]]; + var expected = [[2, 1], [2, 2], [1, 2]]; + test(expected, input, bbox, false); + }) + + it('test 2h', function () { + // segment goes to opposite corner, on the left (2) + var bbox = [1, 1, 2, 2]; + var input = [[3, -10], [0, 3]]; + var expected = [[2, 1], [1, 1], [1, 2]]; + test(expected, input, bbox, false); + }) + + it('test 5a', function () { + var bbox = [1, 1, 2, 2]; + var input = [[3, 3], [3, 0], [1.5, 0], [0.5, 0], [0, 0], [0, 0.5], [0, 3], [3, 3]]; + var expected = [[2, 2], [2, 1], [1, 1], [1, 2], [2, 2]]; + test(expected, input, bbox, true); + }) + + it('test 5b', function () { + var bbox = [1, 1, 2, 2]; + var input = [[3, 3], [3, 0], [1.5, 0], [0.5, 0], [0, 0], [0, 0.5], [0, 3], [3, 3]].reverse(); + var expected = [[2, 2], [2, 1], [1, 1], [1, 2], [2, 2]].reverse(); + test(expected, input, bbox, true); + }) + + it('test 4b', function () { + var bbox = [1, 1, 5, 5]; + var input = [[0, 3], [3, 0], [6, 3], [3, 6], [0, 3]]; + var expected = [[1, 2], [1, 4], [2, 5], [4, 5], [5, 4], [5, 2], [4, 1], [2, 1], [1, 2]].reverse(); + test(expected, input, bbox, true); + }) + + + it('test 4a', function () { + var bbox = [1, 1, 5, 5]; + var input = [[0, 3], [3, 6], [6, 3], [3, 0], [0, 3]]; + var expected = [[1, 4], [2, 5], [4, 5], [5, 4], [5, 2], [4, 1], [2, 1], [1, 2], [1, 4]]; + test(expected, input, bbox, true); + }) + + + it('test 3b', function () { + var bbox = [0, 0, 3, 3]; + var input = [[1, 5], [-5, -1]]; + var expected = [[0, 3], [0, 0]]; + test(expected, input, bbox, false); + }) + + it('test 3a', function () { + var bbox = [0, 0, 3, 3]; + var input = [[1, 5], [-2, 2]]; + var expected = []; + test(expected, input, bbox, false); + }) + + it('test 1', function () { + var bbox = [0, 0, 3, 3]; + var input = [[1, 1], [2, 2]]; + var expected = [[1, 1], [2, 2]]; + test(expected, input, bbox, false); + }) + + it('test 2a', function () { + var bbox = [0, 0, 3, 3]; + var input = [[-1, 1], [4, 1]]; + var expected = [[0, 1], [3, 1]]; + test(expected, input, bbox, false); + }) + + it('test 2b', function () { + var bbox = [0, 0, 3, 3]; + var input = [[1, 4], [1, -1]]; + var expected = [[1, 3], [1, 0]]; + test(expected, input, bbox, false); + }) + + it('test 2c', function () { + var bbox = [0, 0, 3, 3]; + var input = [[1, -1], [1, 4]]; + var expected = [[1, 0], [1, 3]]; + test(expected, input, bbox, false); + }) + + it('test 2d', function () { + var bbox = [0, 0, 3, 3]; + var input = [[4, 1], [-1, 1]]; + var expected = [[3, 1], [0, 1]]; + test(expected, input, bbox, false); + }) + + }) + +}); diff --git a/test/calc-test.js b/test/calc-test.js index 5902e0b97..c4ee3c9f9 100644 --- a/test/calc-test.js +++ b/test/calc-test.js @@ -4,6 +4,20 @@ var assert = require('assert'), DataTable = api.internal.DataTable; describe('mapshaper-calc.js', function () { + + describe('-calc command', function() { + it('results are available to -each expressions', function(done) { + var data = [{a: 1}, {a: 3}]; + var cmd = '-i data.json -calc "SUM = sum(a)" -each "pct = a / SUM * 100" -o'; + var expect = [{a: 1, pct: 25}, {a: 3, pct: 75}]; + api.applyCommands(cmd, {'data.json': data}, function(err, out) { + assert.deepEqual(JSON.parse(out['data.json']), expect); + done(); + }); + }) + }); + + describe('evalCalcExpression()', function () { var data1 = [{foo: -1}, {foo: 3}, {foo: 4}], lyr1 = { diff --git a/test/calc-utils-test.js b/test/calc-utils-test.js index 346e9ed7e..86f1c2f4c 100644 --- a/test/calc-utils-test.js +++ b/test/calc-utils-test.js @@ -6,17 +6,27 @@ describe('mapshaper-calc-utils.js', function() { describe('getModeData()', function() { it('multiple modes', function() { var values = [1, 3, 4, 4, 3, 0 ,0]; - assert.deepEqual(api.internal.getModeData(values), {modes: [3, 4, 0], margin: 0}); + assert.deepEqual(api.internal.getModeData(values), {modes: [3, 4, 0], margin: 0, count: 2}); + }) + + it('multiple modes with verbose data', function() { + var values = [1, 3, 4, 4, 3, 0 ,0]; + assert.deepEqual(api.internal.getModeData(values, true), {modes: [3, 4, 0], margin: 0, count: 2, values: [1, 3, 4, 0], counts: [1, 2, 2, 2]}); }) it('single value', function() { var values = [1]; - assert.deepEqual(api.internal.getModeData(values), {modes: [1], margin: 1}); + assert.deepEqual(api.internal.getModeData(values), {modes: [1], margin: 1, count: 1}); + }) + + it('single value with verbose data', function() { + var values = [1]; + assert.deepEqual(api.internal.getModeData(values, true), {modes: [1], margin: 1, count: 1, values: [1], counts: [1]}); }) it('strings', function() { var values = ['a', 'b', 'c', 'b', 'd']; - assert.deepEqual(api.internal.getModeData(values), {modes: ['b'], margin: 1}); + assert.deepEqual(api.internal.getModeData(values), {modes: ['b'], margin: 1, count: 2}); }) }) diff --git a/test/chunker-test.js b/test/chunker-test.js index 0bfee0d59..821a90fc6 100644 --- a/test/chunker-test.js +++ b/test/chunker-test.js @@ -8,6 +8,15 @@ function test(src, dest) { } describe('mapshaper-chunker.js', function () { + + describe('splitTokens()', function () { + it('splits list containing quoted strings', function () { + var str = 'foo, "foo bar",baz '; + assert.deepEqual(api.internal.splitTokens(str, ', '), ['foo', 'foo bar', 'baz']); + }) + }) + + describe('splitShellTokens()', function () { it('mapshaper', function () { test('mapshaper', ['mapshaper']); diff --git a/test/clean-test.js b/test/clean-test.js index 19ce5c593..42b8dc5b2 100644 --- a/test/clean-test.js +++ b/test/clean-test.js @@ -1,35 +1,167 @@ var assert = require('assert'), api = require("../"), - ArcCollection = api.internal.ArcCollection, - flattenShapes = api.internal.flattenShapes; + ArcCollection = api.internal.ArcCollection; + +function clean(shapes, arcs) { + var dataset = { + arcs: arcs, + layers: [{ + geometry_type: 'polygon', + shapes: shapes + }] + }; + api.cleanLayers(dataset.layers, dataset, {no_arc_dissolve: true}); + return dataset.layers[0].shapes; +} describe('mapshaper-clean.js', function () { - describe('overlap tests', function () { + describe('-clean command', function () { + + it('Removes empty geometries by default', function(done) { + // a ----- b + // | | + // | | + // | | + // d ----- c + + var input = { + type: 'FeatureCollection', + features: [{ + type: "Feature", + properties: {id: 0}, + geometry: null + }, { + type: "Feature", + properties: {id: 1}, + geometry: { + type: 'Polygon', + coordinates: [[[0, 1], [1, 1], [1, 0], [0, 0], [0, 1]]] + } + }, { + type: "Feature", + properties: {id: 2}, + geometry: null + }]}; + + var expected = { + type: 'FeatureCollection', + features: [{ + type: "Feature", + properties: {id: 1}, + geometry: { + type: 'Polygon', + coordinates: [[[0, 1], [1, 1], [1, 0], [0, 0], [0, 1]]] + } + }]}; + api.applyCommands('-i poly.json -clean -o', {'poly.json': input}, function(err, output) { + var poly2 = JSON.parse(output['poly.json']); + assert.deepEqual(poly2, expected); + done(); + }); + }) + + it('Retains empty geometries if "allow-empty" flag is present', function(done) { + // a ----- b + // | | + // | | + // | | + // d ----- c + + var input = { + type: 'FeatureCollection', + features: [{ + type: "Feature", + properties: {id: 0}, + geometry: null + }, { + type: "Feature", + properties: {id: 1}, + geometry: { + type: 'Polygon', + coordinates: [[[0, 1], [1, 1], [1, 0], [0, 0], [0, 1]]] + } + }, { + type: "Feature", + properties: {id: 2}, + geometry: null + }]}; + + api.applyCommands('-i poly.json -clean allow-empty -o', {'poly.json': input}, function(err, output) { + var poly2 = JSON.parse(output['poly.json']); + assert.deepEqual(poly2, input); + done(); + }); + }); + it('Removes overlapping section in GeoJSON input', function(done) { - api.applyCommands('-i test/test_data/issues/clean/overlapping_polygons.json -clean', null, function(err, data) { - // console.log(err, data); + api.applyCommands('-i test/test_data/issues/clean/overlapping_polygons.json -clean -o out.json', null, function(err, data) { + var geojson = JSON.parse(data['out.json']); + var a = geojson.geometries[0].coordinates; + var b = geojson.geometries[1].coordinates; + assert.deepEqual(a, [ [ [ 0, 0 ], [ 0, 2 ], [ 2, 2 ], [ 1, 1 ], [ 2, 0 ], [ 0, 0 ] ] ]) + assert.deepEqual(b, [ [ [ 2, 0 ], [ 1, 1 ], [ 2, 2 ], [ 3, 3 ], [ 5, 1 ], [ 3, -1 ], [ 2, 0 ] ] ]) done(); }) }) - }) + it('Removes spurious endpoints (arc dissolve)', function(done) { + // a ----- b + // | | + // | c + // | | + // f - e - d + + var poly = { + type: 'Polygon', + coordinates: [[[0, 1], [1, 1], [1, 0.5], [1, 0], [0.5, 0], [0.5, 0], [0, 0], [0, 1]]] + } + var expected = poly = { + type: 'Polygon', + coordinates: [[[0, 1], [1, 1], [1, 0], [0, 0], [0, 1]]] + } + api.applyCommands('-i poly.json -clean -o', {'poly.json': poly}, function(err, output) { + var poly2 = JSON.parse(output['poly.json']).geometries[0]; + assert.deepEqual;(poly2, expected); + done(); - describe('flattening tests', function() { + }); - function flattenShapes(shapes, arcs) { - var dataset = { - arcs: arcs, - layers: [{ - geometry_type: 'polygon', - shapes: shapes - }] + }) + + it('handles bowtie shapes', function(done) { + // Fig 16 in figures.txt + var a = { + type: "Polygon", + coordinates: [[[0, 2], [2, 2], [3, 2], [2, 3], [2, 2], [2, 0], [0, 0], [0, 2]]] + } + var b = { + type: "Polygon", + coordinates: [[[4, 2], [2, 2], [2, 4], [4, 2]]] + } + var input = { + type: 'GeometryCollection', + geometries: [a, b] }; - api.cleanLayers(dataset.layers, dataset, {}); - return dataset.layers[0].shapes; - } + var expected = [{ + type: 'MultiPolygon', + coordinates: [[[[3, 2], [2, 2], [2, 3], [3, 2]]], [[[2, 2], [2, 0], [0, 0], [0, 2], [2, 2]]]] + }, { + type: 'Polygon', + coordinates: [[[3, 2], [2, 3], [2, 4], [4, 2], [3, 2]]] + }]; + api.applyCommands('-i input.json -clean -o output.json', {'input.json': input}, function(err, out) { + var geojson = JSON.parse(out['output.json']); + assert.deepEqual(geojson.geometries, expected); + done(); + }) + }) + + }) + + describe('cleanLayers()', function() { describe('Fig. 1', function() { // @@ -46,8 +178,8 @@ describe('mapshaper-clean.js', function () { var arcs = new api.internal.ArcCollection(coords); var shapes = [[[1, 0]], [[2, -2]]]; - var target = [[[1, 0]], [[2, -2]]]; - assert.deepEqual(flattenShapes(shapes, arcs), target); + var target = [[[0, 1]], [[-2, 2]]]; // new mosaic-based clean function can re-arrange arc order + assert.deepEqual(clean(shapes, arcs), target); }) }) @@ -68,32 +200,30 @@ describe('mapshaper-clean.js', function () { [[2, 3], [2, 3]], [[4, 3], [4, 3]], // 6 [[1, 1]]]; - var arcs = new api.internal.ArcCollection(coords); it ('ignores collapsed arcs', function() { + var arcs = new api.internal.ArcCollection(coords); var shapes = [[[1, 0]], [[2, 5, 3, -2]]]; - var target = [[[1, 0]], [[2, 3, ~1]]]; - // console.log(arcs.toArray()) - assert.deepEqual(flattenShapes(shapes, arcs), target); - // console.log(arcs.toArray()) + var target = [[[0, 1]], [[~1, 2, 3]]]; + assert.deepEqual(clean(shapes, arcs), target); }) it ('ignores collapsed arcs 2', function() { + var arcs = new api.internal.ArcCollection(coords); var shapes = [[[4, 1, 0]], [[~4, 2, 3, -2]]]; - var target = [[[1, 0]], [[2, 3, ~1]]]; + var target = [[[0, 1]], [[~1, 2, 3]]]; arcs = new api.internal.ArcCollection(coords); - assert.deepEqual(flattenShapes(shapes, arcs), target); + assert.deepEqual(clean(shapes, arcs), target); }) - return; it ('ignores collapsed arcs 3', function() { + var arcs = new api.internal.ArcCollection(coords); var shapes = [[[4, 4, 1, 0, 4]], [[~4, 2, 3, -2, 4]]]; - var target = [[[1, 0]], [[2, 3, ~1]]]; - assert.deepEqual(flattenShapes(shapes, arcs), target); + var target = [[[0, 1]], [[~1, 2, 3]]]; + assert.deepEqual(clean(shapes, arcs), target); }) }) - return; describe('Fig. 2', function () { // @@ -119,8 +249,9 @@ describe('mapshaper-clean.js', function () { it('paths are preserved', function () { var shapes = [[[1, 2, -2, -1]]]; - var target = [[[1, 2, -2, -1]]]; - assert.deepEqual(flattenShapes(shapes, arcs), target); + // var target = [[[1, 2, -2, -1]]]; + var target = [[[-1], [2]]]; // new clean function dissolves the shape + assert.deepEqual(clean(shapes, arcs), target); }) }) @@ -144,7 +275,7 @@ describe('mapshaper-clean.js', function () { it('paths are preserved', function () { var shapes = [[[0, ~1, 2]], [[1]]]; var target = [[[0, ~1, 2]], [[1]]]; - assert.deepEqual(flattenShapes(shapes, arcs), target); + assert.deepEqual(clean(shapes, arcs), target); }) }) @@ -171,7 +302,7 @@ describe('mapshaper-clean.js', function () { it('paths are preserved', function () { var shapes = [[[0, ~3, ~1, 4]], [[2, 3]], [[1, ~2]]]; var target = [[[0, ~3, ~1, 4]], [[2, 3]], [[1, ~2]]]; - assert.deepEqual(flattenShapes(shapes, arcs), target); + assert.deepEqual(clean(shapes, arcs), target); }) }) @@ -199,11 +330,10 @@ describe('mapshaper-clean.js', function () { it('hourglass shape is preserved', function () { var shapes = [[[0, 1, 2, 3, ~1]]]; var target = [[[0], [2, 3]]]; - assert.deepEqual(flattenShapes(shapes, arcs), target); + assert.deepEqual(clean(shapes, arcs), target); }) }) - describe('Fig. 6', function () { // // a - b - d @@ -218,24 +348,26 @@ describe('mapshaper-clean.js', function () { var coords = [[[1, 3], [2, 3]], [[2, 3], [2, 2]], [[2, 3], [3, 3], [3, 1], [1, 1], [1, 3]]]; - var arcs = new ArcCollection(coords); it ('should skip spike - test 1', function() { var shapes = [[[0, 1, ~1, 2]]]; - var target = [[[0, 2]]]; - assert.deepEqual(flattenShapes(shapes, arcs), target); + var target = [[[0, 1]]]; + var arcs = new ArcCollection(coords); + assert.deepEqual(clean(shapes, arcs), target); }) it ('should skip spike - test 2', function() { var shapes = [[[1, ~1, 2, 0]]]; - var target = [[[2, 0]]]; - assert.deepEqual(flattenShapes(shapes, arcs), target); + var target = [[[0, 1]]]; + var arcs = new ArcCollection(coords); + assert.deepEqual(clean(shapes, arcs), target); }) it ('should skip spike - test 3', function() { var shapes = [[[~1, 2, 0, 1]]]; - var target = [[[2, 0]]]; - assert.deepEqual(flattenShapes(shapes, arcs), target); + var target = [[[0, 1]]]; + var arcs = new ArcCollection(coords); + assert.deepEqual(clean(shapes, arcs), target); }) }) @@ -258,14 +390,12 @@ describe('mapshaper-clean.js', function () { [[3, 3], [3, 1], [1, 1], [1, 3]]]; var arcs = new ArcCollection(coords); - it ('should split overlapping rings', function() { + it ('should remove overlapping portion of smaller ring', function() { var shapes = [[[0, 1]], [[2, 3]]]; var target = [[[0, ~2], [1, 2]], [[3, ~1]]]; - assert.deepEqual(flattenShapes(shapes, arcs), target); + var target = [[[0, ~2]], [[2, 3]]] + assert.deepEqual(clean(shapes, arcs), target); }) }) - }) - - }) diff --git a/test/cli-utils-test.js b/test/cli-utils-test.js index d7b71cd2e..4260ec556 100644 --- a/test/cli-utils-test.js +++ b/test/cli-utils-test.js @@ -18,7 +18,7 @@ describe('mapshaper-cli-lib.js', function () { assert.throws(function() { cli.expandInputFiles(['missing/dir/*.shp']); }, function(e) { - return e.name == 'APIError'; + return e.name == 'UserError'; }); }); @@ -26,7 +26,7 @@ describe('mapshaper-cli-lib.js', function () { assert.throws(function() { cli.expandInputFiles(['test/*.shp']); }, function(e) { - return e.name == 'APIError'; + return e.name == 'UserError'; }); }); diff --git a/test/clip-erase-test.js b/test/clip-erase-test.js index 6861d9e00..798b182b5 100644 --- a/test/clip-erase-test.js +++ b/test/clip-erase-test.js @@ -6,10 +6,10 @@ describe('mapshaper-clip-erase.js', function () { describe('getClipMessage()', function () { it('test', function () { - assert.equal(api.internal.getClipMessage('clip', 0, 1), '[clip] Removed 1 sliver'); - assert.equal(api.internal.getClipMessage('clip', 1, 0), '[clip] Removed 1 null feature'); - assert.equal(api.internal.getClipMessage('erase', 2, 20), '[erase] Removed 2 null features and 20 slivers'); - assert.equal(api.internal.getClipMessage('clip', 0, 0), ''); + assert.equal(api.internal.getClipMessage(0, 1), 'Removed 1 sliver'); + assert.equal(api.internal.getClipMessage(1, 0), 'Removed 1 null feature'); + assert.equal(api.internal.getClipMessage(2, 20), 'Removed 2 null features and 20 slivers'); + assert.equal(api.internal.getClipMessage(0, 0), ''); }) }) @@ -50,13 +50,15 @@ describe('mapshaper-clip-erase.js', function () { coordinates: [[1, 1], [2, 1]] }] } - api.applyCommands('-clip bbox=1,0,2,2', input, function(err, data) { - assert.deepEqual(JSON.parse(data), output); + api.applyCommands('-i input.json -clip bbox=1,0,2,2 -o output.json', + {'input.json': input}, function(err, out) { + var json = JSON.parse(out['output.json']); + assert.deepEqual(json, output); done(); }); }) - it('Throws APIError on invalid bbox', function(done) { + it('Throws UserError on invalid bbox', function(done) { var input = { type: 'GeometryCollection', geometries: [{ @@ -65,7 +67,7 @@ describe('mapshaper-clip-erase.js', function () { }] } api.applyCommands('-clip bbox=1,0,1,2', input, function(err, data) { - assert.equal(err.name, 'APIError'); + assert.equal(err.name, 'UserError'); done(); }); }) @@ -82,7 +84,6 @@ describe('mapshaper-clip-erase.js', function () { }); }); - describe('Issue #68', function () { it('Cell along inside edge of clip shape is retained', function (done) { var cmd = '-i test/test_data/issues/68/cell1.shp -clip test/test_data/issues/68/clipper.shp'; @@ -906,8 +907,10 @@ describe('mapshaper-clip-erase.js', function () { }; var erasedLyr = api.eraseLayer(lyr1, lyr2, dataset); - var target = [[[3, ~1]]]; + var target = [[[2, ~0]]]; + // var target = [[[3, ~1]]]; assert.deepEqual(erasedLyr.shapes, target); + assert.deepEqual(dataset.arcs.toArray(), coords.slice(1)); // arc 0 is removed (unused) }) }) diff --git a/test/clip-issues-test.js b/test/clip-issues-test.js index b15aeb70e..bffd0ee49 100644 --- a/test/clip-issues-test.js +++ b/test/clip-issues-test.js @@ -6,6 +6,73 @@ describe('mapshaper-clip-erase.js', function () { describe('Misc. clipping issues', function () { + describe('inner2.json test', function () { + it('polygon should not disappear after clipping', function (done) { + // previously, inner2.json disappeared after clipping + var cmd = '-i test/test_data/issues/clip_errors/inner2.json -clip test/test_data/issues/clip_errors/outer.json -o'; + api.applyCommands(cmd, {}, function(err, output) { + var json = JSON.parse(output['inner2.json']); + assert.equal(json.features[0].geometry.coordinates.length, 1); // + done(); + }) + }) + }) + + describe('Issue: arcs of non-clipped layers in the clipped dataset should not be deleted', function() { + it('test1', function(done) { + var boxes = { + type: 'Topology', + arcs: [ + [[0, 0], [0, 1], [1, 1], [1, 0], [0, 0]], + [[2, 0], [2, 1], [3, 1], [3, 0], [2, 0]]], + objects: { + a: { + type: 'Polygon', + arcs: [[0]], + properties: {name: 'a'} + }, + b: { + type: 'Polygon', + arcs: [[1]], + properties: {name: 'b'} + } + } + }; + + api.applyCommands('-i data -clip target=a bbox=-1,-1,1.5,1.5 -o format=geojson target=*', {data: boxes}, function(err, output) { + var a = JSON.parse(output['a.json']); + var b = JSON.parse(output['b.json']); + assert.deepEqual(a.features[0].geometry.coordinates, [[[0, 0], [0, 1], [1, 1], [1, 0], [0, 0]]]) + assert.deepEqual(b.features[0].geometry.coordinates, [[[2, 0], [2, 1], [3, 1], [3, 0], [2, 0]]]) + done(); + + }); + }); + }) + + describe('Issue: arcs of clipping layer should not be modified', function() { + it('test1', function(done) { + var clipper = { + type: 'Polygon', + coordinates: [[[0, 0], [0, 1], [1, 1], [1, 0], [0, 0]]] + }; + var clipped = { + type: 'Polygon', + coordinates: [[[0, 0], [0, 1], [2, 1], [2, 0], [0, 0]]] + } + + api.applyCommands('-i clipper.json -i clipped.json -clip clipper -o target=*', {'clipper.json': clipper, 'clipped.json': clipped}, function(err, output) { + var clipped2 = JSON.parse(output['clipped.json']); + var clipper2 = JSON.parse(output['clipper.json']); + assert.deepEqual(clipper2.geometries[0].coordinates, [[[0, 0], [0, 1], [1, 1], [1, 0], [0, 0]]]) + assert.deepEqual(clipped2.geometries[0].coordinates, [[[0, 0], [0, 1], [1, 1], [1, 0], [0, 0]]]) + done(); + + }); + }); + }) + + describe('Issue: bbox clipping can fail along almost-parallel segments', function () { it('test 1', function(done) { @@ -15,9 +82,9 @@ describe('mapshaper-clip-erase.js', function () { type: "Polygon", coordinates: [[[-5,0.4],[-4,0.4],[-4,8.673617379884035e-19],[-5,0],[-5,0.4]]] }; - api.applyCommands('-clip bbox=-10,0,0,10', polygon, function(err, output) { + api.applyCommands('-i poly.json -clip bbox=-10,0,0,10 -o', {'poly.json': polygon}, function(err, output) { if (err) throw err - var geojson = JSON.parse(output); + var geojson = JSON.parse(output['poly.json']); var coords = geojson.geometries[0].coordinates[0]; assert.deepEqual(coords, [[-5,0.4],[-4,0.4],[-4,8.673617379884035e-19],[-5,0],[-5,0.4]]) done(); @@ -30,26 +97,27 @@ describe('mapshaper-clip-erase.js', function () { type: "Polygon", coordinates: [[[-0.9,0.4],[-0.4,0.4],[-0.4,0],[-0.9,-1.734723475976807e-18],[-0.9,0.4]]] }; - api.applyCommands('-clip bbox=-1,0,0,1', polygon, function(err, output) { - var geojson = JSON.parse(output); + api.applyCommands('-i poly.json -clip bbox=-1,0,0,1 -o', {'poly.json': polygon}, function(err, output) { + var geojson = JSON.parse(output['poly.json']); var coords = geojson.geometries[0].coordinates[0]; assert.deepEqual(coords, [[-0.9,0.4],[-0.4,0.4],[-0.4,0],[-0.9,0], [-0.9, 0.4]]) done(); }); }) - it('test 3', function() { + it('test 3', function(done) { // Coords of two simplified counties that had been disappearing after // bbox clipping var geojson = {"type":"FeatureCollection","features":[ {"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[-0.07743991381154576,-7.903170760234177],[0.13322915296487942,-8.237697197954503],[-0.27135433200713655,-8.532257229768865],[-0.5600689007971446,-8.250514088134027],[-0.07743991381154576,-7.903170760234177]]]},"properties":{"GEOID":"48481"}}, {"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[-0.07743991381154576,-7.903170760234177],[0.1510172129721194,-7.718678964010099],[0.5017038816766441,-7.922859553851434],[0.13322915296487942,-8.237697197954503],[-0.07743991381154576,-7.903170760234177]]]},"properties":{"GEOID":"48157"}} ]}; - api.applyCommands('-clip bbox=0,-90,90,90', geojson, function(err, output) { + api.applyCommands('-i poly.json -clip bbox=0,-90,90,90 -o', {'poly.json': geojson}, function(err, output) { + if (err) throw err - var geojson = JSON.parse(output); - assert(!!geojson.geometries[0]); - assert(!!geojson.geometries[1]); + var geojson = JSON.parse(output['poly.json']); + assert(!!geojson.features[0].geometry.coordinates); + assert(!!geojson.features[1].geometry.coordinates); done(); }); }) diff --git a/test/colorizer-test.js b/test/colorizer-test.js index 7cc4fc40a..1c78d0427 100644 --- a/test/colorizer-test.js +++ b/test/colorizer-test.js @@ -26,6 +26,28 @@ describe('mapshaper-colorizer.js', function () { done(); }); }); + + it('svg style properties are reserved words', function() { + assert.doesNotThrow(function() { + api.colorizer({name: 'rgb', colors: ['black'], categories: ['foo']}); + }); + assert.throws(function() { + api.colorizer({name: 'stroke', colors: ['black'], categories: ['foo']}); + }); + assert.throws(function() { + api.colorizer({name: 'r', colors: ['black'], categories: ['foo']}); + }); + assert.throws(function() { + api.colorizer({name: 'stroke-width', colors: ['black'], categories: ['foo']}); + }); + assert.throws(function() { + api.colorizer({name: 'fill', colors: ['black'], categories: ['foo']}); + }); + assert.throws(function() { + api.colorizer({name: 'opacity', colors: ['black'], categories: ['foo']}); + }); + + }); }) describe('getSequentialColorFunction()', function () { @@ -86,7 +108,6 @@ describe('mapshaper-colorizer.js', function () { assert.throws(testInvalidOpts({colors: ['red', 'blue'], breaks: [1, 0]})) }) - }) }) diff --git a/test/commands-test.js b/test/commands-test.js index 1a641b064..3c9476a3a 100644 --- a/test/commands-test.js +++ b/test/commands-test.js @@ -3,6 +3,8 @@ var api = require('../'), fs = require('fs'), format = api.utils.format; +var states_shp = "test/test_data/two_states.shp"; + function runFile(cmd, done) { var args = require('shell-quote').parse(cmd); @@ -25,51 +27,73 @@ function runCmd(cmd, input, done) { }); } -describe('User-reported bug: wildcard expansion in Windows', function () { - it('files are processed, no error thrown', function (done) { - // this duplicates the error (Windows shell doesn't expand wildcards, - // but bash does) - var cmd = '-i test/test_data/issues/166/*.dbf -o format=csv'; - api.applyCommands(cmd, {}, function(err, output) { - assert(!err); - assert('a_utm.csv' in output); - assert('b_utm.csv' in output); - done(); - }); - }) -}) +describe('mapshaper-commands.js', function () { -describe('stdin/stdout tests', function() { - // Travis fails on these tests -- removing for now. - return; - it ("pass-through GeoJSON", function(done) { - var cmd = "- -o - -verbose"; // -verbose to check that messages aren't sent to stdout - var geojson = {"type":"GeometryCollection","geometries":[{"type":"Point","coordinates":[0,0]}]}; - runCmd(cmd, JSON.stringify(geojson), function(err, stdout, stderr) { - assert.deepEqual(JSON.parse(stdout), geojson); - done(); + describe('Issue #264 applyCommands()', function() { + it ('should throw error if input is a file path, not file content', function(done) { + mapshaper.applyCommands('-i input.shp -o out.json', {'input.shp': 'test/test_data/two_states.shp'}, function(err, output) { + assert(!!err); + done(); + }); }); }) - it ("pass-through TopoJSON", function(done) { - var cmd = "/dev/stdin -info -o /dev/stdout -verbose"; // -info and -verbose to check that messages aren't sent to stdout - var json = {type: "Topology", - arcs: [], - objects: { point: { - "type":"GeometryCollection", - "geometries":[{"type":"Point","coordinates":[0,0]}]}} - }; - - runCmd(cmd, JSON.stringify(json), function(err, stdout, stderr) { - assert.deepEqual(JSON.parse(stdout), json); - done(); - }); + describe('User-reported bug: wildcard expansion in Windows', function () { + it('files are processed, no error thrown', function (done) { + // this duplicates the error (Windows shell doesn't expand wildcards, + // but bash does) + var cmd = '-i test/test_data/issues/166/*.dbf -o format=csv'; + api.applyCommands(cmd, {}, function(err, output) { + assert(!err); + assert('a_utm.csv' in output); + assert('b_utm.csv' in output); + done(); + }); + }) }) -}) -describe('mapshaper-commands.js', function () { + describe('stdin/stdout tests', function() { + // Travis fails on these tests -- removing for now. + return; + it ("pass-through GeoJSON", function(done) { + var cmd = "- -o - -verbose"; // -verbose to check that messages aren't sent to stdout + var geojson = {"type":"GeometryCollection","geometries":[{"type":"Point","coordinates":[0,0]}]}; + runCmd(cmd, JSON.stringify(geojson), function(err, stdout, stderr) { + assert.deepEqual(JSON.parse(stdout), geojson); + done(); + }); + }) - var states_shp = "test/test_data/two_states.shp"; + it ("pass-through TopoJSON", function(done) { + var cmd = "/dev/stdin -info -o /dev/stdout -verbose"; // -info and -verbose to check that messages aren't sent to stdout + var json = {type: "Topology", + arcs: [], + objects: { point: { + "type":"GeometryCollection", + "geometries":[{"type":"Point","coordinates":[0,0]}]}} + }; + + runCmd(cmd, JSON.stringify(json), function(err, stdout, stderr) { + assert.deepEqual(JSON.parse(stdout), json); + done(); + }); + }) + }) + + describe('context tests', function () { + it('context vars are reset after commands run', function (done) { + var cmd = '-i test/test_data/three_points.geojson -verbose'; + api.runCommands(cmd, function(err) { + setTimeout(function() { + assert.strictEqual(api.internal.getStateVar('VERBOSE'), false); + assert.deepEqual(api.internal.getStateVar('input_files'), []); + done(); + },1); + assert.strictEqual(api.internal.getStateVar('VERBOSE'), true); + assert.deepEqual(api.internal.getStateVar('input_files'), ['test/test_data/three_points.geojson']); + }); + }) + }) describe('layer naming tests', function() { @@ -118,12 +142,55 @@ describe('mapshaper-commands.js', function () { }); }); - describe('applyCommands() (v0.4 API)', function () { + it('works with -clip command', function(done) { + + var poly = { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-114.345703125, 39.4369879], + [-116.4534998, 37.18979823791], + [-118.4534998, 38.17698709], + [-115.345703125, 43.576878], + [-106.611328125, 43.4529188935547], + [-105.092834092, 46.20938402], + [-106.66859, 39.4389646], + [-103.6117867, 36.436756], + [-114.34579879, 39.4361929] + ] ] + } + }; + + var clip_poly = { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-114.345703125, 39.4361929993141], + [-114.345703125, 43.4529188935547], + [-106.611328125, 43.4529188935547], + [-106.611328125, 39.4361929993141], + [-114.345703125, 39.4361929993141] + ] ] + } + }; + + api.applyCommands('-i poly.json -clip clip_poly.json -o', + {'poly.json': poly, 'clip_poly.json': clip_poly}, function(err, output) { + assert(!!output && !err); + done(); + }) + }); + + it('missing file', function(done) { api.applyCommands('-i data.csv', {}, function(err, output) { - assert(err.name, 'APIError'); + assert(err.name, 'UserError'); done(); }) }); @@ -139,7 +206,7 @@ describe('mapshaper-commands.js', function () { }) - it ('multiple files', function(done) { + it ('output from sequentially processed files is combined', function(done) { var input = { 'data.csv': 'id\n0\n1', 'data2.csv': 'id\n2\n3' @@ -151,6 +218,18 @@ describe('mapshaper-commands.js', function () { }) }) + it('when two files are processed in sequence and second file triggers error, no output is generated', function(done) { + var input = { + 'data.csv': 'id\n0\n1', + 'data2.json': '{' + }; + api.applyCommands('-i data.csv data2.json -o', input, function(err, output) { + assert.equal(err.name, 'UserError'); + assert.equal(output, null); + done(); + }) + }); + it ('merge multiple files', function(done) { var input = { 'data.csv': 'id\n0\n1', @@ -268,26 +347,6 @@ describe('mapshaper-commands.js', function () { }) - }) - - describe('applyCommands() (10000 rows are exported as Buffer by default', function() { + var rows = [], + i=0; + while(i++ < 10001) { + rows.push({i: i, foo: 'bar'}); + } + var layer = {data: new internal.DataTable(rows)}; + var buf = internal.exportLayerAsDSV(layer, ','); + var str = buf.toString(); + var lines = str.split('\n'); + assert(Buffer.isBuffer(buf)); + assert.equal(lines.length, 10002); + assert.equal(lines[0], 'i,foo'); + assert.equal(lines[lines.length - 1], '10001,bar'); + // and as string if to_string option is passed + assert.equal(internal.exportLayerAsDSV(layer, ',', {to_string: true}), str); + }) + it('objects are exported as JSON', function() { var data = new api.internal.DataTable([{foo: {}, bar: {a: 2}}]); - var csv = api.internal.exportDelimTable({data: data}, ','); + var csv = api.internal.exportLayerAsDSV({data: data}, ','); var target = 'foo,bar\n{},"{""a"":2}"'; assert.equal(csv, target); }); it('arrays are exported as JSON', function() { var data = new api.internal.DataTable([{foo: [], bar: ["a", "b"]}]); - var csv = api.internal.exportDelimTable({data: data}, ','); + var csv = api.internal.exportLayerAsDSV({data: data}, ','); var target = 'foo,bar\n[],"[""a"",""b""]"'; assert.equal(csv, target); }); }); + describe('field_order= option', function () { + it('field-order=ascending sorts in case-insensitive A-Z order', function () { + var str = 'Z,A,b,D,c\nfoo,foo,foo,foo,bar'; + var dataset = api.internal.importDelim(str, {}); + var output = api.internal.exportLayerAsDSV(dataset.layers[0], ',', {field_order: 'ascending'}); + assert.equal(output, 'A,b,c,D,Z\nfoo,foo,bar,foo,foo'); + }) + }) + describe('import/export roundtrip', function() { function roundtrip(str) { var dataset = api.internal.importDelim(str, {}); diff --git a/test/delim-import-test.js b/test/delim-import-test.js index bfcc149e6..07fd48970 100644 --- a/test/delim-import-test.js +++ b/test/delim-import-test.js @@ -1,4 +1,5 @@ var api = require('../'), + internal = api.internal, deepStrictEqual = require('deep-eql'), utils = api.utils, assert = require('assert'); @@ -13,6 +14,59 @@ function fixPath(p) { describe('mapshaper-delim-import.js', function() { + describe('csv decoding with -i', function () { + + it('handle empty files', function(done) { + api.applyCommands('-i empty.csv -o', {'empty.csv': ''}, function(err, out) { + assert(!err); + assert.strictEqual(out['empty.csv'], ''); + done(); + }); + }); + + it('handle files with no data rows', function(done) { + api.applyCommands('-i empty.csv -o', {'empty.csv': 'ID,STATE,VALUE'}, function(err, out) { + assert(!err); + // field names are lost + assert.strictEqual(out['empty.csv'], ''); + done(); + }); + }); + + it('missing fields are filled out with nulls', function(done) { + api.applyCommands('-i test.csv -o', {'test.csv': 'ID,STATE,VALUE\n1\n2,WA,300'}, function(err, out) { + assert(!err); + assert.strictEqual(out['test.csv'], 'ID,STATE,VALUE\n1,,\n2,WA,300'); + done(); + }); + }); + + it('extra fields are dropped', function(done) { + api.applyCommands('-i test.csv -o', {'test.csv': 'ID,STATE\n1,OR,3000\n2,WA'}, function(err, out) { + assert(!err); + assert.strictEqual(out['test.csv'], 'ID,STATE\n1,OR\n2,WA'); + done(); + }); + }); + + it('latin-1', function (done) { + var buf = internal.encodeString('chars,chars2\r\n»¼ü©Å÷,è绿', 'latin1'); + api.applyCommands('-i chars.csv encoding=latin1 -o out.tsv', {'chars.csv': buf}, function(err, output) { + assert.equal(output['out.tsv'], 'chars\tchars2\n»¼ü©Å÷\tè?'); + done(); + }) + }) + + it('big5', function (done) { + var buf = internal.encodeString('a|b\r\n長生殿|彈詞', 'big5'); + api.applyCommands('-i chars.csv encoding=big5 -o delimiter=; out.csv', {'chars.csv': buf}, function(err, output) { + assert.equal(output['out.csv'], 'a;b\n長生殿;彈詞'); + done(); + }) + }) + }) + + function importRecords(str, opts) { var dataset = api.internal.importDelim(str, opts); return dataset.layers[0].data.getRecords(); @@ -40,6 +94,13 @@ describe('mapshaper-delim-import.js', function() { assert(deepStrictEqual(records, target)); }) + it('detect numeric field when field contains "NA" (from R export) or "NaN"', function() { + var str = 'a,b,c,d\n NA,4,NA,NaN\n3,"NA",NA,9'; + var records = importRecords(str); + var target = [{a:null, b:4, c:"NA", d: null}, {a:3, b:null, c:"NA", d: 9}]; + assert(deepStrictEqual(records, target)); + }) + it('detect string field when first value looks like a number', function() { var str = 'a,b\n2,0\n4a,8x'; var records = importRecords(str); @@ -76,10 +137,8 @@ describe('mapshaper-delim-import.js', function() { it('ignore whitespace column names', function() { stringifyEqual(importRecords(' , ,foo, \na,b,c,d\n'), [{foo: 'c'}]); }) - }) - describe('infer export delimiter from filename, if possible', function () { it('.tsv implies tab-delimited text', function (done) { var cmd = '-i test/test_data/text/two_states.csv -o output.tsv'; @@ -253,72 +312,129 @@ describe('mapshaper-delim-import.js', function() { }) }) - describe('parseFieldHeaders', function () { + describe('getFieldTypeHints()', function () { it('identify number and string types', function () { - var index = {}; - var fields = "fips:string,count:number,other".split(','); - fields = api.internal.parseFieldHeaders(fields, index); - assert.deepEqual(fields, ['fips', 'count', 'other']); + var opts = {field_types: "fips:string,count:number,other".split(',')}; + var index = api.internal.getFieldTypeHints(opts); assert.deepEqual(index, {fips: 'string', count: 'number'}) }) it('accept alternate type names', function () { - var fields = "fips:s,count:n,other:STR".split(','); - var index = {}; - fields = api.internal.parseFieldHeaders(fields, index); - assert.deepEqual(fields, ['fips', 'count', 'other']); + var opts = {field_types: "fips:s,count:n,other:STR".split(',')}; + var index = api.internal.getFieldTypeHints(opts); assert.deepEqual(index, {fips: 'string', count: 'number', other: 'string'}) }) it('accept + prefix for numeric types', function () { - var index = {}; - var fields = "+count,+other".split(','); - fields = api.internal.parseFieldHeaders(fields, index); - assert.deepEqual(fields, ['count', 'other']); + var opts = {field_types: "+count,+other".split(',')}; + var index = api.internal.getFieldTypeHints(opts); assert.deepEqual(index, {count: 'number', other: 'number'}) }) it('accept inconsistent type hints', function () { - var fields = "fips,count,fips:str".split(','); - var index = {}; - fields = api.internal.parseFieldHeaders(fields, index); - assert.deepEqual(fields, ['fips', 'count', 'fips']); + var opts = {field_types: "fips,count,fips:str".split(',')}; + var index = api.internal.getFieldTypeHints(opts); assert.deepEqual(index, {fips: 'string'}) }) it('accept inconsistent type hints 2', function () { - var fields = "fips:str,count,fips".split(','); - var index = {}; - fields = api.internal.parseFieldHeaders(fields, index); - assert.deepEqual(fields, ['fips', 'count', 'fips']); + var opts = {field_types: "fips:str,count,fips".split(',')}; + var index = api.internal.getFieldTypeHints(opts); assert.deepEqual(index, {fips: 'string'}) }) }) describe('adjustRecordTypes()', function () { it('convert numbers by default', function () { - var records = [{foo:"0", bar:"4,000,300", baz: "0xcc", goo: '300 E'}], - fields = ['foo', 'bar', 'baz', 'goo'] - api.internal.adjustRecordTypes(records, fields); + var records = [{foo:"0", bar:"4,000,300", baz: "0xcc", goo: '300 E'}]; + api.internal.adjustRecordTypes(records); stringifyEqual(records, [{foo:0, bar:4000300, baz: 0xcc, goo: '300 E'}]) }) it('protect string-format numbers with type hints', function() { var records = [{foo:"001", bar:"001"}], - fields = ['foo:string', 'bar']; - api.internal.adjustRecordTypes(records, fields); + opts = {field_types: ['foo:string', 'bar']}; + api.internal.adjustRecordTypes(records, opts); + stringifyEqual(records, [{foo:"001", bar:1}]) + }) + + it('protect string-format numbers with type hints 2', function() { + var records = [{foo:"001", bar:"001"}], + opts = {string_fields: ['foo']}; + api.internal.adjustRecordTypes(records, opts); stringifyEqual(records, [{foo:"001", bar:1}]) }) it('bugfix 1: handle numeric data (e.g. from dbf)', function() { var records = [{a: 0, b: 23.2, c: -12}], - fields = ['a', 'b:number', 'c']; - api.internal.adjustRecordTypes(records, fields); + opts = {field_types: ['a', 'b:number', 'c']}; + api.internal.adjustRecordTypes(records, opts); stringifyEqual(records, [{a: 0, b: 23.2, c: -12}]) }) }) + + describe('importDelim2()', function () { + it('import from a file', function () { + var input = { + filename: 'test/test_data/text/states.csv' + }; + var output = api.internal.importDelim2(input); + var records = output.layers[0].data.getRecords(); + assert.equal(records.length, 52) + assert.deepEqual(records[0], { + STATE_NAME: 'Alabama', + STATE_FIPS: 1, + SUB_REGION: 'East South Central', + STATE_ABBR: 'AL', + POP2010: 4779736, + POP10_SQMI: 92.5 + }) + }) + + it('import file with filter', function () { + var input = { + filename: 'test/test_data/text/states.csv' + }; + var opts = { + csv_filter: 'STATE_NAME == "Colorado"' + }; + var output = api.internal.importDelim2(input, opts); + var records = output.layers[0].data.getRecords(); + assert.equal(records.length, 1) + assert.deepEqual(records[0], { + STATE_NAME: 'Colorado', + STATE_FIPS: 8, + SUB_REGION: 'Mountain', + STATE_ABBR: 'CO', + POP2010: 5029196, + POP10_SQMI: 48.30 + }) + }) + + it('import string with filter', function () { + var str = require('fs').readFileSync('test/test_data/text/states.csv', 'utf8'); + var input = { + content: str + }; + var opts = { + csv_filter: 'STATE_NAME == "Colorado"', + csv_fields: 'STATE_NAME,SUB_REGION,POP2010,POP10_SQMI'.split(',') + }; + var output = api.internal.importDelim2(input, opts); + var records = output.layers[0].data.getRecords(); + assert.equal(records.length, 1) + assert.deepEqual(records[0], { + STATE_NAME: 'Colorado', + SUB_REGION: 'Mountain', + POP2010: 5029196, + POP10_SQMI: 48.30 + }) + }) + + }) + describe('importDelim()', function () { it('should detect tab delimiter', function () { var str = 'a\tb\n1\t"boo ya"' @@ -326,37 +442,35 @@ describe('mapshaper-delim-import.js', function() { stringifyEqual(dataset.layers[0].data.getRecords(), [{a: 1, b: 'boo ya'}]); assert.equal(dataset.info.input_delimiter, '\t') }) - }) - describe('importDelimTable()', function () { - it('test 1', function () { + it('comma delim', function () { var str = 'a,b\n"1","2"'; - var data = api.internal.importDelimTable(str, ','); - stringifyEqual(data.getRecords(), [{a: 1, b: 2}]); + var data = api.internal.importDelim(str); + stringifyEqual(data.layers[0].data.getRecords(), [{a: 1, b: 2}]); }) it('parse csv with quoted field including comma', function () { var str = 'a,b\n1,"foo, bar"' - var data = api.internal.importDelimTable(str, ','); - stringifyEqual(data.getRecords(), [{a: 1, b: 'foo, bar'}]); + var data = api.internal.importDelim(str); + stringifyEqual(data.layers[0].data.getRecords(), [{a: 1, b: 'foo, bar'}]); }) it('import tab-delim, quoted string', function () { var str = 'a\tb\n1\t"boo ya"' - var data = api.internal.importDelimTable(str, '\t'); - stringifyEqual(data.getRecords(), [{a: 1, b: 'boo ya'}]); + var data = api.internal.importDelim(str); + stringifyEqual(data.layers[0].data.getRecords(), [{a: 1, b: 'boo ya'}]); }) it('import pipe-delim, trailing newline', function () { var str = 'a|b\n1|"boo"\n' - var data = api.internal.importDelimTable(str, '|'); - stringifyEqual(data.getRecords(), [{a: 1, b: 'boo'}]); + var data = api.internal.importDelim(str); + stringifyEqual(data.layers[0].data.getRecords(), [{a: 1, b: 'boo'}]); }) it('import single column of values w/ mixed return types', function () { var str = 'a\n1\r\n0\r30' - var data = api.internal.importDelimTable(str, ','); - stringifyEqual(data.getRecords(), [{a: 1}, {a: 0}, {a: 30}]); + var data = api.internal.importDelim(str); + stringifyEqual(data.layers[0].data.getRecords(), [{a: 1}, {a: 0}, {a: 30}]); }) }) diff --git a/test/delim-reader-test.js b/test/delim-reader-test.js new file mode 100644 index 000000000..1d34f67ce --- /dev/null +++ b/test/delim-reader-test.js @@ -0,0 +1,52 @@ +var assert = require('assert'), + api = require('..'), + StringReader = require('./helpers.js').Reader; + +describe('mapshaper-delim-reader.js', function () { + + describe('readDelimRecords()', function () { + var readDelimRecords = api.internal.readDelimRecords; + it('read several lines', function () { + var str = 'foo,bar\r\na,b\r\nc,d\r\n'; + var records = readDelimRecords(new StringReader(str), ','); + assert.deepEqual(records, [{foo:'a', bar:'b'}, {foo: 'c', bar: 'd'}]); + }) + }) + + describe('readDelimLines()', function () { + var readDelimLines = api.internal.readDelimLines; + + it('empty string', function () { + var reader = new StringReader(''); + assert.strictEqual(readDelimLines(reader, 0, ','), null); + }) + it('empty line', function () { + var reader = new StringReader('\n'); + assert.deepEqual(readDelimLines(reader, 0, ','), {offset:1, text: '\n'}); + }) + it('two lines separated by \\n one at a time', function () { + var reader = new StringReader('foo,bar\na,b'); + assert.deepEqual(readDelimLines(reader, 0, ',', '', 1), {offset: 8, text: 'foo,bar\n'}); + assert.deepEqual(readDelimLines(reader, 8, ','), {offset: 11, text: 'a,b'}); + }) + it('two lines separated by \\r\\n one at a time', function () { + var reader = new StringReader('foo,bar\r\na,b'); + assert.deepEqual(readDelimLines(reader, 0, ',', 'utf8'), {offset: 9, text: 'foo,bar\r\n'}); + assert.deepEqual(readDelimLines(reader, 9, ',', 'utf8', 1), {offset: 12, text: 'a,b'}); + }) + it('two lines, together', function () { + var reader = new StringReader('foo,bar\na,b'); + assert.deepEqual(readDelimLines(reader, 0, ',', 'utf-8', 2), {offset: 11, text: 'foo,bar\na,b'}); + }) + it('quoted string, containing delim and eol', function () { + var reader = new StringReader('foo,bar\n"a,","\nb"'); + assert.deepEqual(readDelimLines(reader, 8, ',', 'latin1'), {offset: 17, text: '"a,","\nb"'}); + }) + it('quoted field, containing escaped quote', function () { + var reader = new StringReader('"foo ""\n",bar'); + assert.deepEqual(readDelimLines(reader, 0, ','), {offset: 13, text: '"foo ""\n",bar'}); + }) + }) + + +}); \ No newline at end of file diff --git a/test/dissolve-test.js b/test/dissolve-test.js index 216f1a7ba..2eee4d178 100644 --- a/test/dissolve-test.js +++ b/test/dissolve-test.js @@ -8,7 +8,108 @@ describe('mapshaper-dissolve.js', function () { describe('-dissolve command', function () { - it('test 1', function(done) { + it('dissolve CSV on three fields', function(done) { + var str = 'id1,id2,id3\na,1,x\na,1,x\na,2,x\nb,1,x\nb,2,x\nb,2,x\nc,2,x\na,1,y\na,1,y'; + api.applyCommands('-i in.csv -dissolve id1,id2,id3 -o out.csv', {'in.csv': str}, function(err, out) { + var csv = out['out.csv']; + assert.equal(csv, 'id1,id2,id3\na,1,x\na,2,x\nb,1,x\nb,2,x\nc,2,x\na,1,y'); + done(); + }) + }); + + it('polyline test 1 (multiple segments)', function(done) { + var a = { + type: 'FeatureCollection', + features: [{ + type: 'Feature', + properties: {name: 'bar'}, + geometry: { + type: 'LineString', + coordinates: [[1, 1], [0, 0]] + } + }, { + type: 'Feature', + properties: {name: 'foo'}, + geometry: { + type: 'MultiLineString', + coordinates: [[[1, 1], [2, 2], [3, 3]], [[4, 4], [3, 3]]] + } + }] + }; + var expect = { + type: 'GeometryCollection', + geometries: [{ + type: 'LineString', + coordinates: [[0, 0], [1, 1], [2, 2], [3, 3], [4, 4]] + }] + }; + api.applyCommands('-i a.json -dissolve -o', {'a.json': a}, function(err, output) { + var geojson = JSON.parse(output['a.json']); + assert.deepEqual(geojson, expect) + done(); + }) + }); + + it('polyline test 2 (simple ring)', function(done) { + var a = { + type: 'FeatureCollection', + features: [{ + type: 'Feature', + properties: {name: 'bar'}, + geometry: { + type: 'LineString', + coordinates: [[1, 1], [1, 0], [0, 1], [1, 1]] + } + }] + }; + var expect = { + type: 'GeometryCollection', + geometries: [{ + type: 'LineString', + coordinates: [[1, 1], [1, 0], [0, 1], [1, 1]] + }] + }; + api.applyCommands('-i a.json -dissolve -o', {'a.json': a}, function(err, output) { + var geojson = JSON.parse(output['a.json']); + assert.deepEqual(geojson, expect) + done(); + }) + }); + + it('polyline test 3 (split ring)', function(done) { + var a = { + type: 'FeatureCollection', + features: [{ + type: 'Feature', + properties: {name: 'foo'}, + geometry: { + type: 'LineString', + coordinates: [[1, 1], [1, 0], [0, 0]] + } + }, { + type: 'Feature', + properties: {name: 'bar'}, + geometry: { + type: 'LineString', + coordinates: [[0, 0], [0, 1], [1, 1]] + } + }] + }; + var expect = { + type: 'GeometryCollection', + geometries: [{ + type: 'LineString', + coordinates: [[1, 1], [1, 0], [0, 0], [0, 1], [1, 1]] + }] + }; + api.applyCommands('-i a.json -dissolve -o', {'a.json': a}, function(err, output) { + var geojson = JSON.parse(output['a.json']); + assert.deepEqual(geojson, expect) + done(); + }) + }); + + it('polygon test 1', function(done) { var cmd = "-i test/test_data/six_counties.shp -dissolve + copy-fields NAME,STATE_FIPS sum-fields POP2000,MULT_RACE"; api.internal.testCommands(cmd, function(err, data) { assert.equal(data.layers.length, 2); diff --git a/test/dissolve2-test.js b/test/dissolve2-test.js index a1a76c6a9..cd320ef22 100644 --- a/test/dissolve2-test.js +++ b/test/dissolve2-test.js @@ -3,9 +3,107 @@ var assert = require('assert'), ArcCollection = api.internal.ArcCollection, NodeCollection = api.internal.NodeCollection, dissolve2 = api.dissolve2, - dissolvePolygons = api.internal.dissolvePolygonLayer; + dissolvePolygons = function(lyr, arcs, opts) { + // wrapper for bw compatibility with tests + return api.internal.dissolvePolygonLayer2(lyr, {arcs: arcs}, opts); + }; describe('mapshaper-dissolve2.js dissolve tests', function () { + + it('Fix: dissolving preserves simplification', function(done) { + var input = { + type: 'Polygon', + coordinates: [[[0,0], [0,1], [0.1, 1.1], [0, 1.2], [0, 2], [2,2], [2, 0], [0, 0]]] + }; + api.applyCommands('-i in.json -simplify planar interval=0.5 -dissolve2 -o out.json', {'in.json': input}, function(err, output) { + var json = JSON.parse(output['out.json']); + assert.deepEqual(json.geometries[0].coordinates, [[[0,0], [0, 2], [2,2], [2, 0], [0, 0]]]) + done(); + }) + }) + + describe('Issue #206', function() { + + it('Fully contained polygon is dissolved', function(done) { + var innerRing = { + "type": "Polygon", + "coordinates": [[[1, 1], [1, 2], [2, 2], [2, 1], [1, 1]]] + }; + + var outerRing = { + "type": "Polygon", + "coordinates": [[[0, 0], [0, 3], [3, 3], [3, 0], [0, 0]]] + }; + + var target = { + "type": "Polygon", + "coordinates": [[[0, 0], [0, 3], [3, 3], [3, 0], [0, 0]]] + }; + + api.applyCommands('-i inner.json outer.json combine-files -merge-layers -dissolve2 -o out.json', + {'inner.json': innerRing, 'outer.json': outerRing}, function(err, output) { + var json = JSON.parse(output['out.json']); + assert.deepEqual(json.geometries[0], target) + done(); + }) + }) + + console.log('TODO: fix dissolve2-test.js'); + // it('Hole-in-hole is dissolved', function(done) { + // var input = { + // type: 'GeometryCollection', + // geometries: [ + // { + // type: 'Polygon', + // coordinates: [[[0, 0], [0, 3], [3, 3], [3, 0], [0, 0]], [[1, 1], [2, 1], [2, 2], [1, 2], [1, 1]]] + // }, { + // type: 'Polygon', + // coordinates: [[[-1,-1], [-1, 4], [4, 4], [4, -1], [-1, -1]], [[1.1, 1.1], [1.9, 1.1], [1.9, 1.9], [1.1, 1.9], [1.1, 1.1]]] + // } + // ] + // }; + + // var target = { + // type: 'Polygon', + // coordinates: [[[-1,-1], [-1, 4], [4, 4], [4, -1], [-1, -1]], [[1, 1], [2, 1], [2, 2], [1, 2], [1, 1]]] + // }; + + // api.applyCommands('-i input.json -dissolve2 -o out.json', + // {'input.json': input}, function(err, output) { + // var json = JSON.parse(output['out.json']); + // assert.deepEqual(json.geometries[0], target); + // done(); + // }) + + // }) + + + it('Smallest enclosing ring is found in atypical case', function(done) { + // Large polygon with an L-shaped hole and a small polygon; small polygon is outside hole, but its bbox is inside hole bbox + // outcome: small polygon should be removed + var poly = { + type: 'MultiPolygon', + coordinates: [ + [[[0, 0], [0, 6], [6, 6], [6, 0], [0, 0]], [[1, 1], [2, 1], [2, 4], [5, 4], [5, 5], [1, 5], [1, 1]]], + [[[3, 2], [3, 3], [4, 3], [4, 2], [3, 2]]]] + }; + + var target = { + type: 'Polygon', + coordinates: [[[0, 0], [0, 6], [6, 6], [6, 0], [0, 0]], [[1, 1], [2, 1], [2, 4], [5, 4], [5, 5], [1, 5], [1, 1]]] + }; + + api.applyCommands('-i input.json -dissolve2 -o out.json', {'input.json': poly}, function(err, output) { + output = JSON.parse(output['out.json']).geometries[0]; + assert.deepEqual(output, target); + done(); + }) + + }) + + }) + + describe('Fig. 1', function () { // // b --- d @@ -29,8 +127,8 @@ describe('mapshaper-dissolve2.js dissolve tests', function () { }; var target = [[[0, 2]]]; - var dissolved = dissolve2(lyr, dataset) - assert.deepEqual(dissolved.shapes, target); + var dissolved = dissolve2([lyr], dataset) + assert.deepEqual(dissolved[0].shapes, target); }) }) @@ -63,8 +161,8 @@ describe('mapshaper-dissolve2.js dissolve tests', function () { }; var target = [[[0, 2, 3]]]; - var dissolved = dissolve2(lyr, dataset); - assert.deepEqual(dissolved.shapes, target); + var dissolved = dissolve2(dataset.layers, dataset); + assert.deepEqual(dissolved[0].shapes, target); }); it ('ignores collapsed arcs 2', function() { @@ -79,8 +177,8 @@ describe('mapshaper-dissolve2.js dissolve tests', function () { }; var target = [[[0, 2, 3]]]; - var dissolved = dissolve2(lyr, dataset); - assert.deepEqual(dissolved.shapes, target); + var dissolved = dissolve2(dataset.layers, dataset); + assert.deepEqual(dissolved[0].shapes, target); }) it ('ignores collapsed arcs 3', function() { @@ -95,11 +193,12 @@ describe('mapshaper-dissolve2.js dissolve tests', function () { }; var target = [[[0, 2, 3]]]; - var dissolved = dissolve2(lyr, dataset); - assert.deepEqual(dissolved.shapes, target); + var dissolved = dissolve2(dataset.layers, dataset); + assert.deepEqual(dissolved[0].shapes, target); }) }) + describe('Fig. 3', function () { // // d -- e -- a @@ -126,8 +225,8 @@ describe('mapshaper-dissolve2.js dissolve tests', function () { }; var target = [[[0, 2]]]; - var dissolved = dissolve2(lyr, dataset); - assert.deepEqual(dissolved.shapes, target); + var dissolved = dissolve2(dataset.layers, dataset); + assert.deepEqual(dissolved[0].shapes, target); }) }) @@ -150,12 +249,12 @@ describe('mapshaper-dissolve2.js dissolve tests', function () { var coords = [[[3, 4], [4, 3], [3, 2], [2, 3], [3, 4]], [[3, 4], [3, 5]], [[3, 5], [5, 3], [3, 1], [1, 3], [3, 5]]]; - var nodes = new NodeCollection(coords); it('dissolve a shape into itself', function () { var shapes = [[[1, 2, ~1, ~0]]]; - var target = [[[2],[~0]]]; - assert.deepEqual(dissolvePolygons({shapes: shapes}, nodes).shapes, target); + // var target = [[[2],[~0]]]; + var target = [[[~0],[2]]]; // new dissolve function put this hole first + assert.deepEqual(dissolvePolygons({shapes: shapes}, new ArcCollection(coords)).shapes, target); }) }) @@ -177,12 +276,12 @@ describe('mapshaper-dissolve2.js dissolve tests', function () { [[3, 4], [3, 2]], [[3, 2], [2, 3], [3, 4]], [[3, 4], [5, 4]]]; - var nodes = new NodeCollection(coords); + var arcs = new ArcCollection(coords); it('dissolve all', function () { var shapes = [[[0, ~3, ~1, 4]], [[2, 3]], [[1, ~2]]]; var target = [[[0, 4]]] - assert.deepEqual(dissolvePolygons({shapes: shapes}, nodes).shapes, target); + assert.deepEqual(dissolvePolygons({shapes: shapes}, arcs).shapes, target); }) }) @@ -204,14 +303,21 @@ describe('mapshaper-dissolve2.js dissolve tests', function () { [[2, 3], [2, 2]], [[2, 2], [3, 1]], [[3, 1], [1, 1], [2, 2]]]; - var nodes = new NodeCollection(coords); // TODO: removal is a consequence of blocking shared boundaries of // adjacent polygons -- need to reconsider this? it('stem of hourglass is removed', function () { + var arcs = new ArcCollection(coords); var shapes = [[[0, 1, 2, 3, ~1]]]; var target = [[[0], [2, 3]]]; - assert.deepEqual(dissolvePolygons({shapes: shapes}, nodes).shapes, target); + assert.deepEqual(dissolvePolygons({shapes: shapes}, arcs).shapes, target); + }) + + it('stem of hourglass is removed 2', function () { + var arcs = new ArcCollection(coords); + var shapes = [[[1, 2, 3, ~1, 0]]]; // shape starts at stem + var target = [[[0], [2, 3]]]; + assert.deepEqual(dissolvePolygons({shapes: shapes}, arcs).shapes, target); }) }) @@ -231,24 +337,24 @@ describe('mapshaper-dissolve2.js dissolve tests', function () { [[2, 3], [3, 3], [3, 1], [1, 1], [1, 3]]]; it ('should skip spike - test 1', function() { - var nodes = new NodeCollection(coords); + var arcs = new ArcCollection(coords); var shapes = [[[0, 1, ~1, 2]]]; var target = [[[0, 2]]]; - assert.deepEqual(dissolvePolygons({shapes: shapes}, nodes).shapes, target); + assert.deepEqual(dissolvePolygons({shapes: shapes}, arcs).shapes, target); }) it ('should skip spike - test 2', function() { - var nodes = new NodeCollection(coords); + var arcs = new ArcCollection(coords); var shapes = [[[1, ~1, 2, 0]]]; - var target = [[[2, 0]]]; - assert.deepEqual(dissolvePolygons({shapes: shapes}, nodes).shapes, target); + var target = [[[0, 2]]]; + assert.deepEqual(dissolvePolygons({shapes: shapes}, arcs).shapes, target); }) it ('should skip spike - test 3', function() { - var nodes = new NodeCollection(coords); + var arcs = new ArcCollection(coords); var shapes = [[[~1, 2, 0, 1]]]; - var target = [[[2, 0]]]; - assert.deepEqual(dissolvePolygons({shapes: shapes}, nodes).shapes, target); + var target = [[[0, 2]]]; + assert.deepEqual(dissolvePolygons({shapes: shapes}, arcs).shapes, target); }) }) @@ -269,12 +375,12 @@ describe('mapshaper-dissolve2.js dissolve tests', function () { [[3, 3], [2, 2], [1, 3]], [[1, 3], [3, 3]], [[3, 3], [3, 1], [1, 1], [1, 3]]]; - var nodes = new NodeCollection(coords); + var arcs = new ArcCollection(coords); it ('should dissolve overlapping rings', function() { var shapes = [[[0, 1]], [[2, 3]]]; var target = [[[0, 3]]]; - assert.deepEqual(dissolvePolygons({shapes: shapes}, nodes).shapes, target); + assert.deepEqual(dissolvePolygons({shapes: shapes}, arcs).shapes, target); }) }) @@ -296,7 +402,7 @@ describe('mapshaper-dissolve2.js dissolve tests', function () { data: new api.internal.DataTable([{foo: 1}, {foo: 1}]), shapes: [[[0, 1]], [[-2, 2]]] }; - var lyr2 = dissolvePolygons(lyr, new NodeCollection(coords), {field: 'foo'}); + var lyr2 = dissolvePolygons(lyr, new ArcCollection(coords), {field: 'foo'}); assert.deepEqual(lyr2.shapes, [[[0, 2]]]); assert.deepEqual(lyr2.data.getRecords(), [{foo: 1}]) }) @@ -308,7 +414,7 @@ describe('mapshaper-dissolve2.js dissolve tests', function () { data: new api.internal.DataTable([{foo: 1}, {foo: 1}]), shapes: [[[0, 1]], [[2, -2]]] }; - var lyr2 = dissolvePolygons(lyr, new NodeCollection(coords), {field: 'foo'}); + var lyr2 = dissolvePolygons(lyr, new ArcCollection(coords), {field: 'foo'}); assert.deepEqual(lyr2.shapes, [[[0, 2]]]); }) @@ -318,7 +424,7 @@ describe('mapshaper-dissolve2.js dissolve tests', function () { data: new api.internal.DataTable([{foo: 1}, {foo: 1}]), shapes: [[[1, 0]], [[2, -2]]] }; - var lyr2 = dissolvePolygons(lyr, new NodeCollection(coords), {field: 'foo'}); + var lyr2 = dissolvePolygons(lyr, new ArcCollection(coords), {field: 'foo'}); assert.deepEqual(lyr2.shapes, [[[0, 2]]]); }) @@ -328,7 +434,7 @@ describe('mapshaper-dissolve2.js dissolve tests', function () { data: new api.internal.DataTable([{foo: 1}, {foo: 1}]), shapes: [[[1, 0]], [[2, -2]]] }; - var lyr2 = dissolvePolygons(lyr, new NodeCollection(coords), {}); + var lyr2 = dissolvePolygons(lyr, new ArcCollection(coords), {}); assert.deepEqual(lyr2.shapes, [[[0, 2]]]); assert.deepEqual(lyr2.data.getRecords(), [{}]); // empty table (?) }) @@ -340,7 +446,7 @@ describe('mapshaper-dissolve2.js dissolve tests', function () { data: new api.internal.DataTable(records), shapes: [null, [[0, 1]], [[-2, 2]], null] }; - var lyr2 = dissolvePolygons(lyr, new NodeCollection(coords), {field: 'foo'}); + var lyr2 = dissolvePolygons(lyr, new ArcCollection(coords), {field: 'foo'}); assert.deepEqual(lyr2.shapes, [null, [[0, 2]]]); assert.deepEqual(lyr2.data.getRecords(), [{foo: 2}, {foo: 1}]) }) @@ -352,7 +458,7 @@ describe('mapshaper-dissolve2.js dissolve tests', function () { data: new api.internal.DataTable(records), shapes: [null, [[0, 1]], [[-2, 2]], null] }; - var lyr2 = dissolvePolygons(lyr, new NodeCollection(coords), {field: 'foo'}); + var lyr2 = dissolvePolygons(lyr, new ArcCollection(coords), {field: 'foo'}); assert.deepEqual(lyr2.data.getRecords(), [{foo: 1}, {foo: 2}]) assert.deepEqual(lyr2.shapes, [[[0, 2]], null]); }) @@ -363,7 +469,7 @@ describe('mapshaper-dissolve2.js dissolve tests', function () { data: new api.internal.DataTable([{foo: 1}, {foo: 2}]), shapes: [[[0, 1]], [[-2, 2]]] }; - var lyr2 = dissolvePolygons(lyr, new NodeCollection(coords), {field: 'foo'}); + var lyr2 = dissolvePolygons(lyr, new ArcCollection(coords), {field: 'foo'}); assert.deepEqual(lyr2.shapes, [[[0, 1]], [[-2, 2]]]); }) @@ -379,7 +485,7 @@ describe('mapshaper-dissolve2.js dissolve tests', function () { layers:[lyr], arcs: new ArcCollection(coords) }; - var lyr2 = dissolve2(lyr, dataset, {field:'foo'}); + var lyr2 = dissolve2(dataset.layers, dataset, {field:'foo'})[0]; assert.deepEqual(lyr2.shapes, [[[0, 1]], [[~1, 2]]]); }) @@ -393,7 +499,7 @@ describe('mapshaper-dissolve2.js dissolve tests', function () { layers: [lyr], arcs: new ArcCollection(coords) }; - var lyr2 = dissolve2(lyr, dataset, {field: 'foo'}); + var lyr2 = dissolve2(dataset.layers, dataset, {field: 'foo'})[0]; assert.deepEqual(lyr2.shapes, [[[0, 2]]]); }) diff --git a/test/dissolve3-test.js b/test/dissolve3-test.js new file mode 100644 index 000000000..123d719b3 --- /dev/null +++ b/test/dissolve3-test.js @@ -0,0 +1,121 @@ +var assert = require('assert'), + api = require("../"); + +function test(input, opts, expect, done) { + var opts = opts || {}; + var gapArg = 'min-gap-area=' + (opts.min_gap_area || 0); + var expectArray = Array.isArray(expect); + var cmd = '-i in.json -dissolve2 ' + gapArg + ' ' + (opts.field || '') + ' -o out.json'; + api.applyCommands(cmd, {'in.json': input}, function(err, output) { + var out = JSON.parse(output['out.json']); + var result = out.geometries || out.features; + if (!expectArray) { + assert.equal(result.length, 1); + result = result[0]; + } + assert.deepEqual(result, expect); + done(); + }); +} + +describe('mapshaper-dissolve2.js II', function () { + + describe('-dissolve2 command', function () { + + it('dissolves cw ring inside another cw ring', function (done) { + // Fig. 14 + var input = { + type: 'GeometryCollection', + geometries: [{ + type: 'Polygon', + coordinates: [[[0, 0], [0, 3], [3, 3], [3, 0], [0, 0]]] + }, { + type: 'Polygon', + coordinates: [[[1, 1], [1, 2], [2, 2], [2, 1], [1, 1]]] + }] + }; + var expect = { + type: 'Polygon', + coordinates: [[[0, 0], [0, 3], [3, 3], [3, 0], [0, 0]]] + }; + test(input, null, expect, done); + }) + + it('dissolving single polygon preserves hole', function (done) { + // Fig. 14 + var input = { + type: 'Polygon', + coordinates: [[[0, 0], [0, 3], [3, 3], [3, 0], [0, 0]], [[1, 1], [2, 1], [2, 2], [1, 2], [1, 1]]] + }; + var expect = { + type: 'Polygon', + coordinates: [[[0, 0], [0, 3], [3, 3], [3, 0], [0, 0]], [[1, 1], [2, 1], [2, 2], [1, 2], [1, 1]]] + }; + test(input, null, expect, done); + }) + + it('dissolving single polygon with min-gap-area= removes hole', function (done) { + // Fig. 14 + var input = { + type: 'Polygon', + coordinates: [[[0, 100], [0, 103], [3, 103], [3, 100], [0, 100]], // y-coord is kludge to prevent lat-long detection + [[1, 101], [2, 101], [2, 102], [1, 102], [1, 101]]] + }; + var expect = { + type: 'Polygon', + coordinates: [[[0, 100], [0, 103], [3, 103], [3, 100], [0,100]]] + }; + test(input, {min_gap_area: 1.1}, expect, done); + }) + + it('min-gap-area= supports units', function(done) { + // Fig. 14 + var input = { + type: 'Polygon', + coordinates: [[[0, 0], [0, 13], [3, 13], [3, 0], [0, 0]], + [[1, 1], [1.02, 1], [1.02, 1.02], [1, 1.02], [1, 1]]] + }; + var expect = { + type: 'Polygon', + coordinates: [[[0, 0], [0, 13], [3, 13], [3, 0], [0, 0]]] + }; + test(input, {min_gap_area: '10km2'}, expect, done); + }) + + + it('dissolving single polygon with min-gap-area= retains hole', function (done) { + // Fig. 14 + var input = { + type: 'Polygon', + coordinates: [[[0, 100], [0, 103], [3, 103], [3, 100], [0, 100]], // y-coord is kludge to prevent lat-long detection + [[1, 101], [2, 101], [2, 102], [1, 102], [1, 101]]] + }; + var expect = { + type: 'Polygon', + coordinates: [[[0, 100], [0, 103], [3, 103], [3, 100], [0,100]], + [[1, 101], [2, 101], [2, 102], [1, 102], [1, 101]]] + }; + test(input, {min_gap_area: 0.9}, expect, done); + }) + + + it('donut and hole dissolve cleanly', function (done) { + // Fig. 14 + var input = { + type: 'GeometryCollection', + geometries: [{ + type: 'Polygon', + coordinates: [[[0, 0], [0, 3], [3, 3], [3, 0], [0, 0]], [[1, 1], [2, 1], [2, 2], [1, 2], [1, 1]]] + }, { + type: 'Polygon', + coordinates: [[[1, 2], [2, 2], [2, 1], [1, 1], [1, 2]]] // rotated relative to containing hole + }] + }; + var expect = { + type: 'Polygon', + coordinates: [[[0, 0], [0, 3], [3, 3], [3, 0], [0, 0]]] + }; + test(input, null, expect, done); + }) + }) +}) diff --git a/test/drop-test.js b/test/drop-test.js new file mode 100644 index 000000000..c559ecf64 --- /dev/null +++ b/test/drop-test.js @@ -0,0 +1,146 @@ +var assert = require('assert'), + api = require("../"); + +describe('mapshaper-drop.js', function () { + + describe('-drop removes target layer(s)', function () { + + it('removes layers from multiple datasets', function(done) { + var a = 'a\na', + b = 'b\nb', + c = 'c\nc', + d = 'd\nd', + cmd = '-i combine-files a.csv b.csv -i c.csv -i d.csv -drop target=b,c -o target=*'; + api.applyCommands(cmd, {'a.csv':a, 'b.csv': b, 'c.csv': c, 'd.csv': d}, function(err, out) { + assert.deepEqual(out, {'a.csv': 'a\na', 'd.csv': 'd\nd'}); + done(); + }); + }); + + it('removes one of two layers', function (done) { + var a = 'a,b,c,d\n1,2,3,4\n'; + var b = 'e\n5\n'; + api.applyCommands('-i a.csv b.csv combine-files -drop target=a -o', {'a.csv': a, 'b.csv': b}, function(err, output) { + assert.deepEqual(Object.keys(output), ['b.csv']); + assert.equal(output['b.csv'], 'e\n5'); + done(); + }); + }) + + it('removes implicit target', function (done) { + var a = 'a,b,c,d\n1,2,3,4\n'; + var b = 'e\n5\n'; + api.applyCommands('-i a.csv -i b.csv -drop -o', {'a.csv': a, 'b.csv': b}, function(err, output) { + assert.deepEqual(Object.keys(output), ['a.csv']); + assert.equal(output['a.csv'], 'a,b,c,d\n1,2,3,4'); + done(); + }); + }) + + it('removes two of three layers', function (done) { + var a = { + type: 'LineString', + coordinates: [[0, 0], [0, 1]] + }; + var b = { + type: 'LineString', + coordinates: [[1, 0], [1, 1]] + } + var c = { + type: 'LineString', + coordinates: [[1, 0], [1, 1]] + } + api.applyCommands('-i a.json b.json c.json combine-files -drop target=a,c -o', {'a.json': a, 'b.json': b, 'c.json': c}, function(err, output) { + var json = JSON.parse(output['b.json']); + assert.deepEqual(Object.keys(output), ['b.json']); + assert.deepEqual(json.geometries[0], b); + done(); + }); + }) + + + it('Error if -o command is run after all layers are dropped', function (done) { + var a = 'a,b,c,d\n1,2,3,4\n'; + var b = 'e\n5\n'; + api.applyCommands('-i a.csv b.csv combine-files -drop target=* -o', {'a.csv': a, 'b.csv': b}, function(err, output) { + assert.equal(err.name, 'UserError'); + done(); + }); + }) + + it('No error if -rectangle command is run after all layers are dropped', function (done) { + var a = 'a,b,c,d\n1,2,3,4\n'; + var b = 'e\n5\n'; + api.applyCommands('-i a.csv b.csv combine-files -drop target=* -rectangle bbox=0,0,1,1 -o target=* format=geojson', {'a.csv': a, 'b.csv': b}, function(err, output) { + var geo = JSON.parse(output['rectangle.json']); + assert.deepEqual(Object.keys(output), ['rectangle.json']) + assert.deepEqual(geo.geometries[0], { + type: 'Polygon', + coordinates: [[[0, 0], [0, 1], [1, 1], [1, 0], [0, 0]]] + }); + done(); + }); + }) + + }) + + describe('-drop geometry removes geometry', function () { + it('removes geometry from a GeoJSON feature', function (done) { + var input = { + type: 'Feature', + properties: {foo: 'a', bar: 'b'}, + geometry: { + type: 'Point', + coordinates: [0,0] + } + } + api.applyCommands('-i in.json -drop geometry -o out.json', {'in.json': input}, function(err, output) { + var json = JSON.parse(output['out.json']); + var target = { + type: 'FeatureCollection', + features: [{ + type: 'Feature', + geometry: null, + properties: {foo: 'a', bar: 'b'}, + }] + }; + assert.deepEqual(json, target); + done(); + }); + }) + }) + + describe('-drop fields= removes a list of data fields', function () { + + it('fields=* removes all attributes', function (done) { + var input = { + type: 'Feature', + properties: {foo: 'a', bar: 'b'}, + geometry: { + type: 'Point', + coordinates: [0,0] + } + } + api.applyCommands('-i in.json -drop fields=* -o out.json', {'in.json': input}, function(err, output) { + var json = JSON.parse(output['out.json']); + var target = { + type: 'GeometryCollection', + geometries: [{ + type: 'Point', + coordinates: [0,0] + }] + }; + assert.deepEqual(json, target); + done(); + }); + }) + + it('fields= removes the listed fields', function (done) { + var input = 'a,b,c,d\n1,2,3,4\n'; + api.applyCommands('-i in.csv -drop fields=b,d -o out.csv', {'in.csv': input}, function(err, output) { + assert.equal(output['out.csv'], 'a,c\n1,3'); + done(); + }); + }) + }) +}) diff --git a/test/each-calc-test.js b/test/each-calc-test.js index aa75e7b1f..040cf6f06 100644 --- a/test/each-calc-test.js +++ b/test/each-calc-test.js @@ -42,6 +42,24 @@ describe('mapshaper-each-calc.js', function () { assert.deepEqual(records, [{foo:'mi'}, {foo:'be'}]); }) + it('this.properties exposes feature data', function() { + var records = [{'label-text':'Finland'}, {'label-text':'Sweden'}]; + var lyr = { + data: new api.internal.DataTable(records) + }; + api.evaluateEachFeature(lyr, nullArcs, "this.properties['label-text'] = this.properties['label-text'].toUpperCase()"); + assert.deepEqual(records, [{'label-text':'FINLAND'}, {'label-text':'SWEDEN'}]); + }) + + it('"d" is equivalent to "this.properties"', function() { + var records = [{'label-text':'Finland'}, {'label-text':'Sweden'}]; + var lyr = { + data: new api.internal.DataTable(records) + }; + api.evaluateEachFeature(lyr, nullArcs, "d['label-text'] = d['label-text'].toUpperCase()"); + assert.deepEqual(records, [{'label-text':'FINLAND'}, {'label-text':'SWEDEN'}]); + }) + it('test $.partCount', function () { var records = [{}, {}]; var lyr = { @@ -161,6 +179,16 @@ describe('mapshaper-each-calc.js', function () { assert.deepEqual(lyr.data.getRecords(), [{x: 0, y: 1}, {x: 2, y: 3}, {x: null, y: null}]); }) + it ('x and y setters are implemented', function() { + var lyr = { + geometry_type: 'point', + shapes: [[[0, 1]], [[2, 3], [3, 4]], null] + }; + // first point of multipoint is set; null shapes are ignored (for now) + api.evaluateEachFeature(lyr, null, "$.x = 0, $.y = 0"); + assert.deepEqual(lyr.shapes, [[[0, 0]], [[0, 0], [3, 4]], null]); + }) + it ('point coords are exposed', function() { var lyr = { geometry_type: 'point', diff --git a/test/encodings-test.js b/test/encodings-test.js index 1ff205c2e..7e5f39846 100644 --- a/test/encodings-test.js +++ b/test/encodings-test.js @@ -1,31 +1,96 @@ var api = require('../'), + internal = api.internal, fs = require('fs'), - assert = require('assert'); + assert = require('assert'), + utils = api.utils; describe('mapshaper-encodings.js', function () { - describe('decodeString()', function () { - it('should remove BOM', function () { + + describe('cli.readFile() accepts encoding param', function () { + it('trims BOM', function () { // BOM removal also tested in delim-table-test.js - var buf = fs.readFileSync('test/test_data/text/utf16bom.txt'); + var str = api.cli.readFile('test/test_data/text/utf16bom.txt', 'utf-16'); + assert.equal(str, 'NAME\n国语國語'); + }) + }) + + describe('decodeString()', function () { + it('utf-16 example', function () { + var buf = fs.readFileSync('test/test_data/text/utf16.txt'); var str = api.internal.decodeString(buf, 'utf-16'); assert.equal(str, 'NAME\n国语國語'); }) }) + describe('encodeString()', function () { + it('utf-16', function () { + assert.equal(internal.decodeString(internal.encodeString('有朋自远方来', 'utf-16'), 'utf16'), '有朋自远方来'); + }) + }) + + describe('bufferToString()', function () { + it('accepts start and end arguments', function () { + var buf = utils.createBuffer('012345678') + assert.equal(internal.bufferToString(buf, 'utf8', 2, 3), '2'); + }) + + it('start and end positions are byte positions, not character positions', function () { + var buf = utils.createBuffer('...朋友 ') + assert.equal(internal.bufferToString(buf, 'utf8', 3, 9), '朋友'); + }) + + }) + describe('encodingIsSupported()', function () { it('ISO-8859-7', function () { - assert.ok(api.internal.encodingIsSupported('ISO-8859-7')); + assert.ok(internal.encodingIsSupported('ISO-8859-7')); }) }) describe('standardizeEncodingName()', function () { it('UTF-8 -> utf8', function () { - assert.equal(api.internal.standardizeEncodingName('UTF-8'), 'utf8'); + assert.equal(internal.standardizeEncodingName('UTF-8'), 'utf8'); }) it('UTF-16BE -> utf16be', function () { - assert.equal(api.internal.standardizeEncodingName('UTF-16BE'), 'utf16be'); + assert.equal(internal.standardizeEncodingName('UTF-16BE'), 'utf16be'); }) }) + describe('encodingIsUtf8()', function() { + it('positive examples', function() { + assert(internal.encodingIsUtf8('utf-8')) + assert(internal.encodingIsUtf8('UTF-8')) + assert(internal.encodingIsUtf8('')) + assert(internal.encodingIsUtf8()) + }); + + it('negative examples', function() { + assert(!internal.encodingIsUtf8('utf')) + assert(!internal.encodingIsUtf8('UTF-16')) + assert(!internal.encodingIsUtf8('ascii')) + assert(!internal.encodingIsUtf8('latin-1')) + }) + + }) + + describe('encodingIsAsciiCompat()', function () { + it('positive examples', function () { + assert(internal.encodingIsAsciiCompat('utf-8')) + assert(internal.encodingIsAsciiCompat('latin1')) + assert(internal.encodingIsAsciiCompat('')) + assert(internal.encodingIsAsciiCompat('ascii')) + assert(internal.encodingIsAsciiCompat('win1253')) + assert(internal.encodingIsAsciiCompat('gbk')) + assert(internal.encodingIsAsciiCompat('gb18030')) + assert(internal.encodingIsAsciiCompat('iso-8859-1')) + }) + + it('negative examples', function() { + assert(!internal.encodingIsAsciiCompat('utf-16')) + assert(!internal.encodingIsAsciiCompat('big-5')) + }) + + }) + }) \ No newline at end of file diff --git a/test/export-test.js b/test/export-test.js index a78e7df8d..d2976b203 100644 --- a/test/export-test.js +++ b/test/export-test.js @@ -4,6 +4,23 @@ var api = require('../'), describe('mapshaper-export.js', function () { + describe('Issue: merging datasets for output should not modify the original datasets', function() { + it('svg output from two datasets', function(done) { + var box = { + type: 'Polygon', + coordinates: [[[1, 0], [0, 1], [1, 2], [2, 1], [1, 0]]] + }; + api.applyCommands('-i box.json -rectangle source=box -o target=box,rectangle merged.svg -o format=geojson target=rectangle -o format=geojson target=box', {'box.json': box}, function(e, output) { + var box = JSON.parse(output['box.json']).geometries[0]; + var shape = JSON.parse(output['rectangle.json']).geometries[0]; + assert(output['merged.svg'].length > 0); + assert.deepEqual(box.coordinates, [[[1, 0], [0, 1], [1, 2], [2, 1], [1, 0]]]); + assert.deepEqual(shape.coordinates, [[[0,0],[0,2],[2,2],[2,0],[0,0]]]) + done(); + }) + }); + }); + describe('Issue: output should not rename original layers', function () { it('unnamed layers, csv output', function (done) { var lyr1 = { diff --git a/test/expression-utils-test.js b/test/expression-utils-test.js new file mode 100644 index 000000000..7fb3d0e83 --- /dev/null +++ b/test/expression-utils-test.js @@ -0,0 +1,31 @@ + +var assert = require('assert'); +var api = require(".."); + +describe('mapshaper-expression-utils.js', function() { + + describe('round()', function() { + + it ('test 1', function(done) { + var data = [{a: 100.1}, {a: 0.5}, {a: -2.001}]; + var target = [{a: 100.1, b: 100, c: 100.1}, {a: 0.5, b: 1, c: 0.5}, {a: -2.001, b: -2, c: -2}]; + api.applyCommands('-i a.json -each "b=round(a), c=_.round(a, 1)" -o', {'a.json': data}, function(err, output) { + assert.deepEqual(JSON.parse(output['a.json']), target); + done(); + }); + }); + }); + + describe('sprintf()', function() { + + it ('test 1', function(done) { + var data = 'a,b\n3000,3.001' + var target = 'a,b,c\n3000,3.001,"3,000 3.0"'; + api.applyCommands('-i data.csv -each "c = sprintf(\'%,d %.1f\', a, b)" -o', {'data.csv': data}, function(err, output) { + assert.equal(output['data.csv'], target); + done(); + }); + }); + }); + +}); diff --git a/test/expressions-test.js b/test/expressions-test.js index 5dde29bfa..a667c9ebb 100644 --- a/test/expressions-test.js +++ b/test/expressions-test.js @@ -11,8 +11,8 @@ describe('mapshaper-expressions.js', function () { it('global properties are masked', function () { var env = api.internal.getBaseContext(); - assert.strictEqual(env.mapshaper, null); - assert.strictEqual(env.global, null); + assert.strictEqual(env.mapshaper, undefined); + assert.strictEqual(env.global, undefined); }) it('build-in functions and libraries are not masked', function () { diff --git a/test/figures.txt b/test/figures.txt new file mode 100644 index 000000000..95bb1aef5 --- /dev/null +++ b/test/figures.txt @@ -0,0 +1,184 @@ + +Fig. 1 + + b --- d + / \ / + / \ / + a --- c + +Fig. 2 + + b d --- e + / \ \ / + / \ \ / + a --- c f + +Fig. 3 + + e + / \ + / \ + / a \ + / / \ \ + h d b f + \ \ / / + \ c / + \ / + \ / + g + +Fig. 4 + + e + /|\ + / | \ + / a \ + / / \ \ + h d b f + \ \ / / + \ c / + \ / + \ / + g + +Fig. 5 + + e + /|\ + / | \ + / a \ + / / \ \ + h d b f + \ \ / / + \ c / + \ | / + \|/ + g + + +Fig. 6 + + + d -- e -- a + | / \ | + | g - f | + | | + c ------- b + +Fig. 7 + + d -- e -- a + | /|\ | + | h | f | + | \|/ | + | g | + | | + c ------- b + + +Fig. 8 + + b - c + \ / + a + | + d + / \ + f - e + +Fig. 9 + + a - b - d + | | | + | c | + | | + f ----- e + +Fig. 10 + + b + / \ + a --- c + | \ / | + | d | + | | + f --- e + +Fig. 11 + + g ----- h + | | + fe---- ai + || || + || bj + || || + nd --- ck + | | + m ----- l + +Fig. 12 + + b d + / \ / + / \ / + a --- c + +Fig. 13 + + b d --- f + / \ / \ + / \ / \ + a --- c e + +Fig. 14 + + a --------- b + | | + | e - f | + | | | | + | h - g | + | | + d --------- c + +Fig. 15 + + a --------------- b + | | + | e --------- f | + | | | | + | | i - j | | + | | | | | | + | | l - k | | + | | | | + | h --------- g | + | | + d --------------- c + +Fig. 16 + h + | \ + d \ + | \ \ + a ----- b - c - g + | | + | | + | | + f ----- e + +Fig. 17 + +l --------------------- m +| | +| a --------------- b | +| | | | +| | e --------- f | | +| | | | | | +| | | i - j | | | +| | | | | | | | +| | | l - k | | | +| | | | | | +| | h --------- g | | +| | | | +| d --------------- c | +| | +o --------------------- n \ No newline at end of file diff --git a/test/file-reader-test.js b/test/file-reader-test.js new file mode 100644 index 000000000..3d2e9e9db --- /dev/null +++ b/test/file-reader-test.js @@ -0,0 +1,95 @@ +var fs = require('fs'), + api = require('..'), + FileReader = api.internal.FileReader, + Reader = require('./helpers.js').Reader, + assert = require('assert'); + +function toString(buf) { + return buf.toString('utf8'); +} + +describe('test Reader', function () { + it('chunk len greater than buf len', function() { + var str = "foo bar"; + var r = new Reader(str, 256); + assert.equal(r.readSync(0).toString('utf8'), str); + }) + + it('chunk len less than buf len', function() { + var str = "foo bar"; + var r = new Reader(str, 4); + assert.equal(r.readSync(0).toString('utf8'), "foo "); + r.expandBuffer(); + assert.equal(r.readSync(0).toString('utf8'), "foo bar"); + }) +}) + +describe('mapshaper-file-reader.js', function () { + + it('buffer larger than file cache', function () { + var reader = new FileReader('test/test_data/lorem.txt', {cacheSize: 2, bufferSize: 4}); + assert.equal(toString(reader.readSync(2)), 'rem '); + assert.equal(toString(reader.readSync(4)), 'm ip'); + assert.equal(toString(reader.readSync(7)), 'psum'); + assert.equal(toString(reader.readSync(0)), 'lore'); // go back in file + assert.equal(toString(reader.readSync(4)), 'm ip'); // skip forward + assert.equal(toString(reader.readSync(1)), 'orem'); // go back in file + assert.equal(toString(reader.readSync(6)), 'ipsu'); // skip forward + reader.expandBuffer(); + assert.equal(toString(reader.readSync(0)), 'lorem ip'); + assert.equal(toString(reader.expandBuffer().readSync(0)), 'lorem ipsum'); // end of file + }) + + + describe('FileReader', function () { + + it('file cache larger than file', function () { + var reader = new FileReader('test/test_data/lorem.txt', {cacheSize: 0x1000, bufferSize: 2}); + assert.equal(toString(reader.readSync(2)), 're'); + assert.equal(toString(reader.expandBuffer().readSync(6)), 'ipsu'); + assert.equal(toString(reader.expandBuffer().readSync(10)), 'm'); // end of file + assert.equal(toString(reader.readSync(0)), 'lorem ip'); // go back in file + }) + + it('buffer same size as file', function () { + var reader = new FileReader('test/test_data/lorem.txt', {cacheSize: 0x1000, bufferSize: 11}); + assert.equal(toString(reader.readSync(0)), 'lorem ipsum'); + assert.equal(toString(reader.readSync(1)), 'orem ipsum'); + assert.equal(toString(reader.readSync(2)), 'rem ipsum'); + assert.equal(toString(reader.readSync(10)), 'm'); + }) + + it('try to read beyond file end', function() { + var reader = new FileReader('test/test_data/lorem.txt', {cacheSize: 0x1000, bufferSize: 12}); + assert.equal(toString(reader.readSync(11)), ''); // at eof: return empty buffer + assert.throws(function() { + reader.readSync(12); + }); + }) + }) + + + describe('#findString()', function () { + it('test1', function () { + var json = '{"type": "FeatureCollection", "features": []}'; + var reader = new Reader(json); + var target = { + text: '{"type": "FeatureCollection", ', + offset: 40 + }; + assert.deepEqual(reader.findString('"features"'), target); + }) + + it('test2', function () { + var json = '{"type": "FeatureCollection", "features": []}'; + var reader = new Reader(json); + var target = { + text: '{"type": ', + offset: 28 + }; + assert.deepEqual(reader.findString('"FeatureCollection"'), target); + }) + + }) + +}) diff --git a/test/filter-geom-test.js b/test/filter-geom-test.js new file mode 100644 index 000000000..79ba25af4 --- /dev/null +++ b/test/filter-geom-test.js @@ -0,0 +1,71 @@ + +var api = require('..'), + assert = require('assert'); + +describe('mapshaper-filter-geom.js', function () { + + describe('bbox= option', function () { + + it('error: missing geometry', function(done) { + var data = [{foo: "bar"}]; + api.applyCommands('-i data.json -filter-geom bbox=0,0,1,1 -o', {'data.json':data}, function(err, out) { + assert.equal(err.name, 'UserError'); + done(); + }) + }) + + it('point layer', function (done) { + var points = { + type: 'GeometryCollection', + geometries: [{ + type: 'MultiPoint', + coordinates: [[0, 0], [180, 0], [180, -1], [-180, 90]] + }, { + type: 'Point', + coordinates: [10, -10] + }] + }; + var expected = { + type: 'GeometryCollection', + geometries: [{ + type: 'MultiPoint', + coordinates: [[0, 0], [180, 0], [-180, 90]] + }] + }; + var cmd = '-i points.json -filter-geom bbox=-180,0,180,90 -o'; + api.applyCommands(cmd, {'points.json': points}, function(err, out) { + var result = JSON.parse(out['points.json']); + assert.deepEqual(result, expected) + done(); + }); + }) + + it('polyline layer', function (done) { + var lines = { + type: 'GeometryCollection', + geometries: [{ + type: 'MultiLineString', + coordinates: [[[0, 0], [0, -10]], [[180, -1], [179, -2]], [[-180, 90], [-180, 89]]] + }, { + type: 'LineString', + coordinates: [[10, -10], [11, -11]] + }] + }; + var expected = { + type: 'GeometryCollection', + geometries: [{ + type: 'MultiLineString', + coordinates: [[[0, 0], [0, -10]], [[-180, 90], [-180, 89]]] + }] + }; + var cmd = '-i lines.json -filter-geom bbox=-180,0,180,90 -o'; + api.applyCommands(cmd, {'lines.json': lines}, function(err, out) { + var result = JSON.parse(out['lines.json']); + assert.deepEqual(result, expected) + done(); + }); + }); + + }) + +}) diff --git a/test/filter-test.js b/test/filter-test.js index 5585bd0bb..b769c2f5e 100644 --- a/test/filter-test.js +++ b/test/filter-test.js @@ -3,7 +3,8 @@ var assert = require('assert'), internal = api.internal; describe('mapshaper-filter.js', function () { - describe('Command line tests', function() { + + describe('Command line options', function() { var geojson = { type:"FeatureCollection", features: [{ @@ -23,7 +24,7 @@ describe('mapshaper-filter.js', function () { it ('empty expression throws an error', function(done) { api.applyCommands('-filter ""', JSON.stringify(geojson), function(err) { - assert.equal(err.name, 'APIError'); + assert.equal(err.name, 'UserError'); done(); }); }) @@ -47,7 +48,6 @@ describe('mapshaper-filter.js', function () { // filter a layer with no-replace; check that modifying data in the filtered layer does not change the source layer. api.applyCommands('-filter \'name == "b"\' + name=filtered -each target=filtered \'name="foo"\'', geojson, function(err, data) { if (err) console.log(err); - assert.equal(typeof data, 'string'); var output = JSON.parse(data); assert.deepEqual(output.features[0].properties, {name: 'foo'}) assert.equal(output.features.length, 1); @@ -74,6 +74,8 @@ describe('mapshaper-filter.js', function () { }) }) + + describe('filter()', function () { var nullArcs = new api.internal.ArcCollection([]); it('removes records based on attribute value', function () { diff --git a/test/frame-test.js b/test/frame-test.js new file mode 100644 index 000000000..307fc62aa --- /dev/null +++ b/test/frame-test.js @@ -0,0 +1,24 @@ +var assert = require('assert'), + api = require("../"), + Bounds = api.internal.Bounds; + +describe('mapshaper-frame.js', function () { + + describe('getAspectRatioArg()', function() { + it('works with height range', function() { + var out = api.internal.getAspectRatioArg('4', '1,2'); + assert.equal(out, '2,4'); + }); + }); + + describe('getFrameSize()', function () { + it('works with pixels option', function () { + var bounds = new Bounds(0, 0, 4, 2); + var opts = { + pixels: 200 + }; + var out = api.internal.getFrameSize(bounds, opts); + assert.deepEqual(out, [20, 10]); + }) + }) +}); diff --git a/test/gaps-test.js b/test/gaps-test.js new file mode 100644 index 000000000..a1c68ae71 --- /dev/null +++ b/test/gaps-test.js @@ -0,0 +1,19 @@ +var api = require('../'), + assert = require('assert'), + ArcCollection = api.internal.ArcCollection; + +describe('mapshaper-gaps.js', function () { + + describe('getDirectedArcPresenceTest()', function () { + it('test 1', function () { + var arcs = [~1, 4, 5, 0]; + var test = api.internal.getDirectedArcPresenceTest(arcs, 6); + assert(test(~1)); + assert(test(4)); + assert(test(0)); + assert(!test(1)); + assert(!test(~0)); + assert(!test(3)); + }) + }) +}); diff --git a/test/geojson-reader-test.js b/test/geojson-reader-test.js new file mode 100644 index 000000000..dc2899466 --- /dev/null +++ b/test/geojson-reader-test.js @@ -0,0 +1,101 @@ +var fs = require('fs'), + api = require('..'), + assert = require('assert'), + GeoJSONReader = api.internal.GeoJSONReader, + FileReader = api.internal.FileReader, + StringReader = require('./helpers.js').Reader; + +function toString(buf) { + return buf.toString('utf8'); +} + +function parseTest(input, output) { + var features = []; + new GeoJSONReader(new StringReader(JSON.stringify(input))).readObjects(function(o) {features.push(o)}); + assert.deepEqual(features, output); +} + +describe('geojson-reader.js', function () { + + describe('GeoJSONReader()', function () { + + describe('parseFile()', function () { + it('test1', function () { + var json = { + type: "Point", + coordinates: [0, 0] + }; + parseTest(json, [json]); + }) + + it('test2', function () { + var json = {type: 'GeometryCollection', geometries: [{ + type: "Point", + coordinates: [0, 0] + }, { + type: "Point", + coordinates: [1, 1] + }]}; + parseTest(json, json.geometries); + }) + + it('test3', function () { + var json = {type: 'FeatureCollection', features: [{ + type: 'Feature', + geometry: { + type: "Point", + coordinates: [0, 0] + }, + properties: {foo: {}} + }]}; + parseTest(json, json.features); + }) + + it('file reading test', function() { + var file = 'test/test_data/three_points.geojson'; + var reader = new FileReader(file); + var features = []; + var contents = require('fs').readFileSync(file, 'utf8'); + var target = JSON.parse(contents).features; + new GeoJSONReader(reader).readObjects(function(feat) {features.push(feat)}); + assert.deepEqual(features, target); + + }); + }) + + describe('readObject()', function () { + it('test1', function () { + var reader = new GeoJSONReader(new StringReader('{}')); + var target = {text: '{}', offset: 2}; + assert.deepEqual(reader.readObject(0), target); + }) + + it('test2', function () { + var reader = new GeoJSONReader(new StringReader('{"foo": {"type": "Point"}}')); + var target = {text: '{"type": "Point"}', offset: 25}; + assert.deepEqual(reader.readObject(6), target); + }) + + it('test3', function () { + var reader = new GeoJSONReader(new StringReader('{"foo": {"type": "Point"}}')); + var target = {text: '{"foo": {"type": "Point"}}', offset: 26}; + assert.deepEqual(reader.readObject(0), target); + }) + + it('test4', function () { + var reader = new GeoJSONReader(new StringReader('{"a": "}""}\\"}"}')); + var target = {text: '{"a": "}\""}\\\"}"}', offset: 16}; + assert.deepEqual(reader.readObject(0), target); + }) + + it('test5', function () { + var reader = new GeoJSONReader(new StringReader('[{"a": 0},\n{"b": 1}]')); + var target = {text: '{"b": 1}', offset: 19}; + assert.deepEqual(reader.readObject(9), target); + }) + + }) + + }) + +}) diff --git a/test/geojson-test.js b/test/geojson-test.js index 84d31f778..b96012b3b 100644 --- a/test/geojson-test.js +++ b/test/geojson-test.js @@ -9,6 +9,76 @@ function fixPath(p) { } describe('mapshaper-geojson.js', function () { + + describe('getDatasetBbox()', function() { + + describe('RFC 7946 bbox', function() { + function getBbox(geojson) { + var d = api.internal.importGeoJSON(geojson, {}); + return api.internal.getDatasetBbox(d, true); + } + + it('wrapped bbox 1', function() { + var input = { + type: 'MultiPoint', + coordinates: [[-170, 0], [170, 0]] + } + assert.deepEqual(getBbox(input), [170, 0, -170, 0]); + }) + + it('wrapped bbox2', function() { + var input = { + type: 'MultiPoint', + coordinates: [[-180, 0], [180, 1], [10, -1]] + } + assert.deepEqual(getBbox(input), [10, -1, -180, 1]); + }) + + it('wrapped bbox 3 (lines)', function() { + var input = { + type: 'MultiLineString', + coordinates: [[[-180, 0], [-170, 1]], [[170, -1], [175, -2]]] + } + assert.deepEqual(getBbox(input), [170, -2, -170, 1]); + }) + + it('non-wrapped points: Western Hemisphere', function() { + var input = { + type: 'MultiPoint', + coordinates: [[-170, 0], [-180, 1], [-90, -1]] + } + assert.deepEqual(getBbox(input), [-180, -1, -90, 1]); + }) + + it('non-wrapped points: Eastern Hemisphere', function() { + var input = { + type: 'MultiPoint', + coordinates: [[170, 0], [180, 1], [90, -1]] + } + assert.deepEqual(getBbox(input), [90, -1, 180, 1]); + }) + + it('non-wrapped points 3', function() { + var input = { + type: 'MultiPoint', + coordinates: [[100, 0], [0, 1], [-100, -1]] + } + assert.deepEqual(getBbox(input), [-100, -1, 100, 1]); + }) + + it('null bbox', function() { + var input = { + type: 'GeometryCollection', + geometries: [] + } + assert.strictEqual(getBbox(input), null); + }) + + }); + + }); + + describe('importGeoJSON', function () { it('Import FeatureCollection with polygon geometries', function () { var data = api.importFile(fixPath('test_data/two_states.json')) @@ -158,7 +228,7 @@ describe('mapshaper-geojson.js', function () { } }; var dataset = api.internal.importGeoJSON(src, {}); - var output = api.internal.exportGeoJSONCollection(dataset.layers[0], dataset); + var output = api.internal.exportDatasetAsGeoJSON(dataset, {}); assert.deepEqual(output.features[0], target); }) }) @@ -166,6 +236,129 @@ describe('mapshaper-geojson.js', function () { describe('exportGeoJSON()', function () { + describe('-o geojson-type= option', function() { + + it('geojson-type=Feature, no attributes', function() { + var input = {type: 'Point', coordinates: [0, 0]}; + var output = api.internal.exportGeoJSON(api.internal.importGeoJSON(input, {}), {geojson_type: 'Feature'})[0].content; + assert.deepEqual(JSON.parse(output), { + type: 'Feature', + properties: null, + geometry: { + type: 'Point', + coordinates: [0, 0] + } + }); + }); + + it('geojson-type=FeatureCollection, no attributes', function() { + var input = {type: 'Point', coordinates: [0, 0]}; + var output = api.internal.exportGeoJSON(api.internal.importGeoJSON(input, {}), {geojson_type: 'FeatureCollection'})[0].content; + assert.deepEqual(JSON.parse(output), { + type: 'FeatureCollection', + features: [{ + type: 'Feature', + properties: null, + geometry: { + type: 'Point', + coordinates: [0, 0] + } + }] + }); + }); + + it('geojson-type=GeometryCollection (data has attributes)', function() { + var input = {type: 'Feature', properties: {name: 'foo'}, geometry: {type: 'Point', coordinates: [0, 0]}}; + var output = api.internal.exportGeoJSON(api.internal.importGeoJSON(input, {}), {geojson_type: 'GeometryCollection'})[0].content; + assert.deepEqual(JSON.parse(output), { + type: 'GeometryCollection', + geometries: [ { + type: 'Point', + coordinates: [0, 0] + }] + }); + }); + + }); + + describe('-o rfc7946 option', function () { + + it('Default coordinate precision is 6 decimals', function() { + var input = { + type: 'MultiPoint', + coordinates: [[4.000000000000001, 3.999999999999], [0.123456789,-9.87654321]] + }; + var output = api.internal.exportGeoJSON(api.internal.importGeoJSON(input, {}), {rfc7946: true})[0].content.toString(); + var coords = output.match(/"coordinates.*\]\]/)[0]; + assert.equal(coords, '"coordinates":[[4,4],[0.123457,-9.876543]]'); + }); + + it('A warning is generated for non-lat-long datasets', function() { + var input = { + type: 'Point', + coordinates: [100, 100] + }, + dataset = api.internal.importGeoJSON(input, {}); + assert(/RFC 7946 warning/.test(api.internal.getRFC7946Warnings(dataset))); + }) + + it('Use CCW winding order for rings and CW for holes', function (done) { + var input = { + type:"GeometryCollection", + geometries:[{ + type: "Polygon", + coordinates: [[[100.0, 0.0], [100.0, 10.0], [110.0, 10.0], [110.0, 0.0], [100.0, 0.0]], + [[101.0, 1.0], [109.0, 1.0], [109.0, 9.0], [101.0, 9.0], [101.0, 1.0]] + ] + }]}; + + var target = [[[100.0, 0.0], [110.0, 0.0], [110.0, 10.0], [100.0, 10.0], [100.0, 0.0]], + [[101.0, 1.0], [101.0, 9.0], [109.0, 9.0], [109.0, 1.0], [101.0, 1.0]] + ]; + + api.applyCommands('-i input.json -o output.json rfc7946', {'input.json': input}, function(err, output) { + var json = JSON.parse(output['output.json']); + assert.deepEqual(json.geometries[0].coordinates, target); + done(); + }); + + }) + }) + + describe('-i geometry-type option', function () { + it('filters geometry types inside nested GeometryCollection', function (done) { + var geo = { + type: 'GeometryCollection', + geometries: [{ + type: 'GeometryCollection', + geometries: [{ + type: 'Point', + coordinates: [0, 0] + }, { + type: 'LineString', + coordinates: [[1, 1], [0, 1]] + }, { + type: 'Polygon', + coordinates: [[[5, 5], [5, 6], [6, 6], [5, 5]]] + }] + }] + }; + var expect = { + type: 'GeometryCollection', + geometries: [{ + type: 'Point', + coordinates: [0, 0] + }] + } + api.applyCommands('-i geo.json geometry-type=point -o', {'geo.json': geo}, function(err, output) { + var geom = JSON.parse(output['geo.json']); + assert.deepEqual(geom, expect) + done(); + }); + assert.equal() + }) + }) + describe('-o combine-layers option', function () { it('combines datasets derived from same input file', function(done) { var a = { @@ -280,7 +473,7 @@ describe('mapshaper-geojson.js', function () { {type: 'Feature', geometry: null, properties: {foo: 'a'}} ]}; - assert.deepEqual(api.internal.exportGeoJSONCollection(lyr, dataset), target); + assert.deepEqual(api.internal.exportDatasetAsGeoJSON(dataset, {}), target); }) it('collapsed polygon exported as null geometry', function () { @@ -299,7 +492,7 @@ describe('mapshaper-geojson.js', function () { {type: 'Feature', properties: {ID: 1}, geometry: null} ]}; - assert.deepEqual(api.internal.exportGeoJSONCollection(lyr, dataset), target); + assert.deepEqual(api.internal.exportDatasetAsGeoJSON(dataset, {}), target); }) it('use cut_table option', function () { @@ -375,7 +568,7 @@ describe('mapshaper-geojson.js', function () { bbox: [0, 1, 2, 4] }; - var result = api.internal.exportGeoJSONCollection(lyr, dataset, {bbox: true}); + var result = api.internal.exportDatasetAsGeoJSON(dataset, {bbox: true}); assert.deepEqual(result, target); }) @@ -401,7 +594,7 @@ describe('mapshaper-geojson.js', function () { ] , bbox: [-1, 0, 2, 3] }; - var result = api.internal.exportGeoJSONCollection(lyr, dataset, {bbox: true}); + var result = api.internal.exportDatasetAsGeoJSON(dataset, {bbox: true}); assert.deepEqual(result, target); }) @@ -424,7 +617,7 @@ describe('mapshaper-geojson.js', function () { } }] }; - var result = api.internal.exportGeoJSONCollection(lyr, dataset, {id_field: 'FID'}); + var result = api.internal.exportDatasetAsGeoJSON(dataset, {id_field: 'FID'}); assert.deepEqual(result, target); }) @@ -665,15 +858,15 @@ describe('mapshaper-geojson.js', function () { function geoJSONRoundTrip(fname) { var data = api.importFile(fixPath(fname)); var files = api.internal.exportFileContent(data, {format:'geojson'}); - var data2 = api.internal.importFileContent(files[0].content, 'json'); + var json = files[0].content.toString(); + var data2 = api.internal.importFileContent(json, 'json'); var files2 = api.internal.exportFileContent(data2, {format:'geojson'}); - - assert.equal(files2[0].content, files[0].content); - // assert.equal(files2[0].filename, files[0].filename); // these are different + var json2 = files2[0].content.toString(); + assert.equal(json, json2); } function importExport(obj, noTopo) { var json = Utils.isString(obj) ? obj : JSON.stringify(obj); var geom = api.internal.importFileContent(json, 'json', {no_topology: noTopo}); - return api.internal.exportGeoJSONCollection(geom.layers[0], geom); + return api.internal.exportDatasetAsGeoJSON(geom, {}); } diff --git a/test/geojson-to-svg-test.js b/test/geojson-to-svg-test.js index 4bfb97253..53ef658bb 100644 --- a/test/geojson-to-svg-test.js +++ b/test/geojson-to-svg-test.js @@ -5,10 +5,22 @@ var api = require('../'), describe('geojson-to-svg.js', function () { describe('importGeoJSONFeatures()', function() { + it('invalid multi-part become empty tags', function() { + var input = [{ + type: 'MultiPolygon', + coordinates: [] + }, { + type: 'MultiPoint', + coordinates: [] + }]; + var output = [{tag: 'g'}, {tag: 'g'}]; + assert.deepEqual(SVG.importGeoJSONFeatures(input), output); + }) + it('single point geometry', function() { var geo = { type: "MultiPoint", - coordinates: [[0, -1], [1, -2]] + coordinates: [[0, 1], [1, 2]] }; var target = [{ tag: 'g', @@ -20,7 +32,8 @@ describe('geojson-to-svg.js', function () { properties: {cx: 1, cy: 2} }] }]; - assert.deepEqual(SVG.importGeoJSONFeatures([geo], {r: 2}), target); + var output = SVG.importGeoJSONFeatures([geo]); + assert.deepEqual(output, target); }) it('single point feature', function() { @@ -29,23 +42,195 @@ describe('geojson-to-svg.js', function () { properties: {r: 2, opacity: 0.5, 'class': "dot pinkdot"}, geometry: { type: "MultiPoint", - coordinates: [[0, -1], [1, -2]] + coordinates: [[0, 1], [1, 2]] } }; var target = [{ tag: 'g', - properties: {opacity: "0.5"}, + properties: {opacity: "0.5", 'class': "dot pinkdot"}, // class attached container, not glyph children: [{ tag: 'circle', - properties: {cx: 0, cy: 1, r: 2, 'class': "dot pinkdot"} // class attached to glyph, not container + properties: {cx: 0, cy: 1, r: 2} }, { tag: 'circle', - properties: {cx: 1, cy: 2, r: 2, 'class': "dot pinkdot"} + properties: {cx: 1, cy: 2, r: 2} + }] + }]; + assert.deepEqual(SVG.importGeoJSONFeatures([geo]), target); + }) + + it('feature with null geometry', function() { + var geo = { + type: 'Feature', + properties: {r: 2}, + geometry: null + }; + var expected = [{ + tag: 'g', + }]; + assert.deepEqual(SVG.importGeoJSONFeatures([geo], {point_symbol: 'square'}), expected) + }) + + it('point feature with square symbol', function() { + var geo = { + type: 'Feature', + properties: {r: 2}, + geometry: {type: 'Point', coordinates: [5, 5]} + }; + var expected = [{ + tag: 'rect', + properties: {x: 3, y: 3, width: 4, height: 4} + }]; + assert.deepEqual(SVG.importGeoJSONFeatures([geo], {point_symbol: 'square'}), expected) + + }); + + it('point feature with square symbol and label', function() { + var geo = { + type: 'Feature', + properties: {r: 2, 'label-text': 'foo'}, + geometry: {type: 'Point', coordinates: [5, 5]} + }; + var expected = [{ + tag: 'g', + children: [{ + tag: 'rect', + properties: {x: 3, y: 3, width: 4, height: 4} + }, { + tag: 'text', + value: 'foo', + // properties: {x: 5, y: 5} + properties: {transform: 'translate(5 5)', x: 0, y: 0} }] }]; - assert.deepEqual(SVG.importGeoJSONFeatures([geo], {r: 2}), target); + assert.deepEqual(SVG.importGeoJSONFeatures([geo], {point_symbol: 'square'}), expected) + + }); + + + it('label feature', function() { + var geo = { + type: "Feature", + properties: {'label-text': 'TBD'}, + geometry: { + type: "MultiPoint", + coordinates: [[0, 1]] + } + }; + var target = [{ + tag: 'g', + children: [{ + tag: 'text', + value: 'TBD', + // properties: {x: 0, y: 1} + properties: {transform: 'translate(0 1)', x: 0, y: 0} + }] + }]; + var output = SVG.importGeoJSONFeatures([geo]); + assert.deepEqual(output, target); }) + it('multiline label', function() { + var geo = { + type: "Feature", + properties: {'label-text': 'New\nYork\nCity', 'line-height': '1.3em'}, + geometry: { + type: "MultiPoint", + coordinates: [[0, 1]] + } + }; + var target = [{ + tag: 'g', + children: [{ + tag: 'text', + value: 'New', + // properties: {x: 0, y: 1}, + properties: {transform: 'translate(0 1)', x: 0, y: 0}, + children: [{ + tag: 'tspan', + value: 'York', + properties: { + x: 0, + dy: '1.3em', + } + }, { + tag: 'tspan', + value: 'City', + properties: { + x: 0, + dy: '1.3em', + } + }] + }] + }]; + var output = SVG.importGeoJSONFeatures([geo]); + assert.deepEqual(output, target); + }) + + + it('label with dx, dy and font style properties', function() { + var geo = { + type: "Feature", + properties: { + 'foo': 'bar', // should not be in output + 'label-text': 'TBD', + 'font-style': 'italic', + 'font-weight': 'bold', + 'font-family': 'Gill Sans, sans-serif', // TODO: handle quotes + dx: '10px', + dy: '-1em', + }, + geometry: { + type: "MultiPoint", + coordinates: [[0, 1]] + } + }; + var target = [{ + tag: 'g', + children: [{ + tag: 'text', + value: 'TBD', + // properties: {x: 0, y: 1, dx: '10px', dy: '-1em'} + properties: {transform: 'translate(0 1)', x: '10px', y: '-1em'} + }], + properties: {'font-family': 'Gill Sans, sans-serif', 'font-style': 'italic', 'font-weight': 'bold'} + }]; + var output = SVG.importGeoJSONFeatures([geo]); + assert.deepEqual(output, target); + }); + + + it('label with anchor point and label text', function() { + var geo = { + type: "Feature", + properties: { + 'label-text': 'Milwaukee', + 'text-anchor': 'start', + dx: 5, + r: 2 + }, + geometry: { + type: "Point", + coordinates: [0, 1] + } + }; + var target = [{ + tag: 'g', + children: [{ + tag: 'circle', + properties: {cx: 0, cy: 1, r: 2} + },{ + tag: 'text', + value: 'Milwaukee', + // properties: {x: 0, y: 1, dx: 5} + properties: {transform: 'translate(0 1)', x: 5, y: 0} + }], + properties: {'text-anchor': 'start'} + }]; + var output = SVG.importGeoJSONFeatures([geo]); + assert.deepEqual(output, target); + }); + it('feature collection with ids', function() { var geo = { type: "FeatureCollection", @@ -55,7 +240,7 @@ describe('geojson-to-svg.js', function () { properties: { r: 4, stroke: 'black', - stroke_width: 2 + 'stroke-width': 2 }, geometry: { type: 'MultiPoint', @@ -66,11 +251,11 @@ describe('geojson-to-svg.js', function () { id: 'b', properties: { stroke: 'steelblue', - stroke_width: 1 + 'stroke-width': 1 }, geometry: { type: 'LineString', - coordinates: [[1, -2], [0, -2]] + coordinates: [[1, 2], [0, 2]] } }] }; @@ -81,14 +266,15 @@ describe('geojson-to-svg.js', function () { properties: {cx: 0, cy: 0, r: 4} }, { tag: 'circle', - properties: {cx: 1, cy: -1, r: 4} + properties: {cx: 1, cy: 1, r: 4} }], properties: {id: 'a', stroke: 'black', 'stroke-width': 2} }, { tag: 'path', properties: {d: 'M 1 2 0 2', id: 'b', stroke: 'steelblue', 'stroke-width': 1} }]; - assert.deepEqual(SVG.importGeoJSONFeatures(geo.features), target); + var output = SVG.importGeoJSONFeatures(geo.features); + assert.deepEqual(output, target); }) it('filter out styles that do not match LineString type', function() { @@ -118,57 +304,38 @@ describe('geojson-to-svg.js', function () { }; var target = [{ tag: 'path', - properties: {d: 'M 0 0 1 0 1 -1 0 0 Z', fill: '#eee'} + properties: {d: 'M 0 0 1 0 1 1 0 0 Z', fill: '#eee'} }]; assert.deepEqual(SVG.importGeoJSONFeatures([geo]), target); }) }) - describe('stringify()', function () { - it('g element, no children', function () { - var obj = {tag: 'g'}; - assert.equal(SVG.stringify(obj), ''); - }) - - it('path element', function() { - var obj = {tag: 'path', properties: {d: 'M 0 0 1 1'}}; - assert.equal(SVG.stringify(obj), '') - }) - - it('group inside a group', function() { - var obj = { - tag: 'g', + describe('SVG.importLabel()', function () { + it('recognizes several newline markers', function () { + var str = 'line one\nline two\\nline three
line four'; + var obj = SVG.importLabel({'label-text': str}, [1, 2]) + var target = { + tag: 'text', + value: 'line one', + // properties: {x: 1, y: 2}, + properties: {transform: 'translate(1 2)', x: 0, y: 0}, children: [{ - tag: 'g' - }] - } - assert.equal(SVG.stringify(obj), '\n\n'); - }); - - it('group of two circles', function() { - var obj = { - tag: 'g', - properties: {id: 0}, - children: [{ - tag: 'circle', - properties: { - cx: 0, - cy: 1 - } + tag: 'tspan', + value: 'line two', + properties: {x: 0, dy: '1.1em'} }, { - tag: 'circle', - properties: { - cx: -1, - cy: 0 - } + tag: 'tspan', + value: 'line three', + properties: {x: 0, dy: '1.1em'} + }, { + tag: 'tspan', + value: 'line four', + properties: {x: 0, dy: '1.1em'} }] - }; - var target = '\n' + - '\n' + - '\n' + - ''; - assert.equal(SVG.stringify(obj), target); + } + assert.deepEqual(obj, target); }) }) + }) diff --git a/test/geom-test.js b/test/geom-test.js index 9a563d392..e40aa9697 100644 --- a/test/geom-test.js +++ b/test/geom-test.js @@ -37,6 +37,17 @@ function coordBuffersEqual(a, b) { describe("mapshaper-geom.js", function() { + describe('findClosestPointOnSeg()', function () { + it('test 1', function () { + assert.deepEqual(geom.findClosestPointOnSeg(0, 0, 0, 2, 2, 0), [1, 1]); + assert.deepEqual(geom.findClosestPointOnSeg(0, 0, 0, -2, -2, 0), [-1, -1]); + assert.deepEqual(geom.findClosestPointOnSeg(3, 0, 0, 2, 2, 0), [2, 0]); + assert.deepEqual(geom.findClosestPointOnSeg(-2, 0, 0, 2, 2, 0), [0, 2]); + assert.deepEqual(geom.findClosestPointOnSeg(0, 0, 0, 2, 0, 2), [0, 2]); // 0 len + assert.deepEqual(geom.findClosestPointOnSeg(2, 0, 0, 2, 2, 0), [2, 0]); // coincident pt + }) + }) + describe('pointSegDistSq()', function () { it('Perpendicular dist. to vertical line', function () { assert.equal(geom.pointSegDistSq(0, 0, 2, -1, 2, 3), 4); diff --git a/test/graticule-test.js b/test/graticule-test.js index 5c56109c1..25a1f55bf 100644 --- a/test/graticule-test.js +++ b/test/graticule-test.js @@ -7,7 +7,7 @@ describe('mapshaper-graticule.js', function () { api.internal.testCommands('-graticule', function(err, dataset) { assert.equal(dataset.layers[0].name, 'graticule'); - assert(api.internal.getDatasetProjection(dataset).is_latlong); + assert(api.internal.getDatasetCRS(dataset).is_latlong); done(); }); }); diff --git a/test/helpers.js b/test/helpers.js index a894633c7..931b4eea5 100644 --- a/test/helpers.js +++ b/test/helpers.js @@ -1,7 +1,48 @@ +var api = require('..'); +var utils = api.utils; +var assert = require('assert'); -/* -exports.getTempDir = function(done) { +module.exports.coordinatesAlmostEqual = coordinatesAlmostEqual; +module.exports.almostEqual = almostEqual; +module.exports.Reader = Reader; - done(null, ""); +function almostEqual(a, b, eps) { + eps = eps || 1e-10; + if (Math.abs(a - b) < eps) { + assert(true); + } else { + assert.equal(a, b) + } }; -*/ + +function coordinatesAlmostEqual(a, b, eps) { + if (Array.isArray(a) && Array.isArray(b)) { + for (var i=0, n=Math.max(a.length, b.length); i]* id="vertices"/.test(svg)) + assert(/]* id="line"/.test(svg)) + done(); + }) + }); + + it ('-o id-prefix= is applied to SVG layer and feature ids', function() { + var dataset = { + layers: [{ + name: 'dataset', + geometry_type: 'point', + shapes: [[[0,0], [1,1]]], + data: new api.internal.DataTable([{FID: 'A'}]) + }] + }; + var out = api.internal.exportLayerForSVG(dataset.layers[0], dataset, {id_prefix: 'points-'}); + var target = { + tag: 'g', + properties: {id: 'points-dataset'}, + children: [{ + tag: 'g', + properties: {id: 'points-A'}, + children: [{ + "tag": "circle", + "properties": { + "cx": 0, + "cy": 0 + } + }, { + "tag": "circle", + "properties": { + "cx": 1, + "cy": 1 + } + }] + }] + } + assert.deepEqual(out, target); + }); + +}); diff --git a/test/issue-269-field-order.js b/test/issue-269-field-order.js new file mode 100644 index 000000000..b02c0935a --- /dev/null +++ b/test/issue-269-field-order.js @@ -0,0 +1,27 @@ +var api = require('../'), + assert = require('assert'); + +describe('Issue 269 - dbf output should preserve field order', function () { + + it ('joined fields appear after local fields', function(done) { + var a = 'id,N,M\n1,n,m'; + var b = 'id,Z,Y,X,A,B,C\n1,z,y,x,a,b,c'; + var cmd = '-i a.csv -join b.csv keys=id,id -o format=dbf'; + api.applyCommands(cmd, {'a.csv': a, 'b.csv': b}, function(err, output) { + var dbf = new api.internal.DbfReader(output['a.dbf']); + assert.deepEqual(dbf.getFields(), 'id,N,M,Z,Y,X,A,B,C'.split(',')); + done(); + }); + }); + + it ('created fields appear after original fields', function(done) { + var a = 'A,Z,B,Y\na,z,b,y'; + var cmd = '-i a.csv -each \'C = "c", X = "x"\' -o format=dbf'; + api.applyCommands(cmd, {'a.csv': a}, function(err, output) { + var dbf = new api.internal.DbfReader(output['a.dbf']); + assert.deepEqual(dbf.getFields(), 'A,Z,B,Y,C,X'.split(',')); + done(); + }); + }); + +}); diff --git a/test/issue-304-test.js b/test/issue-304-test.js new file mode 100644 index 000000000..81bcff50b --- /dev/null +++ b/test/issue-304-test.js @@ -0,0 +1,32 @@ +var fs = require('fs'), + api = require('..'), + assert = require('assert'); + +describe('Issue #304 (centroid of tiny polygons can fall outside the polygon)', function () { + function pointInBBox(point, polygon) { + var polyCoords = polygon.coordinates[0]; + var xx = polyCoords.map(function(p) {return p[0]}); + var yy = polyCoords.map(function(p) {return p[1]}); + var minx = Math.min.apply(xx, xx); + var maxx = Math.max.apply(xx, xx); + var miny = Math.min.apply(yy, yy); + var maxy = Math.max.apply(yy, yy); + var p = point.coordinates; + return p[0] > minx && p[0] < maxx && p[1] > miny && p[1] < maxy; + } + + it ('test1', function(done) { + // from user-submitted data + var coords = [[15.191851000000042,55.32173700000004],[15.191819000000066,55.32171500000004],[15.191767000000084,55.32172300000008],[15.191820000000064,55.32175200000006],[15.191851000000042,55.32173700000004]]; + var input = { + type: 'Polygon', + coordinates: [coords] + }; + var cmd = '-i data.json -points -o'; + api.applyCommands(cmd, {'data.json': input}, function(err, output) { + assert(pointInBBox(JSON.parse(output['data.json']).geometries[0], input)); + done(); + }); + }); + +}); diff --git a/test/join-test.js b/test/join-test.js index 391ad9162..64385ed4a 100644 --- a/test/join-test.js +++ b/test/join-test.js @@ -13,7 +13,93 @@ function fixPath(p) { describe('mapshaper-join.js', function () { describe('-join command', function () { - it('test1', function (done) { + + it('includes source key with fields=* option', function(done) { + var a = 'id,name\n1,foo'; + var b = 'key,score\n1,100'; + api.applyCommands('a.csv -join b.csv keys=id,key fields=* -o', {'a.csv': a, 'b.csv': b}, function(err, out) { + assert.deepEqual(out['a.csv'], 'id,name,key,score\n1,foo,1,100'); + done(); + }); + }); + + it('error if source and target key fields have different types', function(done) { + var a = 'id,name\n1,foo'; + var b = 'key,score\n1,100'; + api.applyCommands('a.csv string-fields=id -join b.csv keys=id,key fields=* -o', {'a.csv': a, 'b.csv': b}, function(err, out) { + assert(err.message.indexOf('string and number') > -1); + done(); + }); + }) + + it('error if source key field has null values', function(done) { + var a = [{id: null, name: 'foo'}]; + var b = [{key: 1, score: 100}]; + api.applyCommands('a.json -join b.json keys=id,key fields=* -o', {'a.json': a, 'b.json': b}, function(err, out) { + assert(err.message.indexOf('unsupported data type') > -1); + done(); + }); + }) + + it('error if target key field has null values', function(done) { + var a = [{id: 1, name: 'foo'}]; + var b = [{key: null, score: 100}]; + api.applyCommands('a.json -join b.json keys=id,key fields=* -o', {'a.json': a, 'b.json': b}, function(err, out) { + assert(err.message.indexOf('unsupported data type') > -1); + done(); + }); + }) + + it('excludes source key by default', function(done) { + var a = 'id\n1'; + var b = 'key,score\n1,100'; + api.applyCommands('a.csv -join b.csv keys=id,key -o', {'a.csv': a, 'b.csv': b}, function(err, out) { + assert.deepEqual(out['a.csv'], 'id,score\n1,100'); + done(); + }); + }); + + it('calc assignments add values to unmatched records', function(done) { + var a = 'id\n1\n2'; + var b = 'id\n1'; + api.applyCommands('a.csv -join b.csv keys=id,id calc="JOINS=count(), AVG=average(id)" -o format=json', {'a.csv': a, 'b.csv': b}, function(err, out) { + var json = JSON.parse(out['a.json']); + assert.deepEqual(json, [{id: 1, JOINS: 1, AVG: 1}, {id: 2, JOINS: 0, AVG: null}]); + done(); + }); + }); + + it('calc() assignments supersede fields= assignments', function(done) { + var a = 'id\n1\n2'; + var b = 'id,COUNT\n1,45\n1,35'; + api.applyCommands('a.csv -join b.csv keys=id,id calc="COUNT=count()" fields=COUNT -o format=json', {'a.csv': a, 'b.csv': b}, function(err, out) { + var json = JSON.parse(out['a.json']); + assert.deepEqual(json, [{id: 1, COUNT: 2}, {id: 2, COUNT: 0}]); + done(); + }); + }); + + it('fields= option with an empty list copies no fields', function(done) { + var a = 'id\n1'; + var b = 'id,PARTIAL,TOTAL\n1,4,35'; + api.applyCommands('a.csv -join b.csv keys=id,id calc="COUNT=count()" fields= -o format=json', {'a.csv': a, 'b.csv': b}, function(err, out) { + var json = JSON.parse(out['a.json']); + assert.deepEqual(json, [{id: 1, COUNT: 1}]); + done(); + }); + }); + + it('calc= functions can use the same field as input and output', function(done) { + var a = 'id\n1'; + var b = 'id,COUNT\n1,4\n1,3'; + api.applyCommands('a.csv -join b.csv keys=id,id calc="COUNT=sum(COUNT)" -o format=json', {'a.csv': a, 'b.csv': b}, function(err, out) { + var json = JSON.parse(out['a.json']); + assert.deepEqual(json, [{id: 1, COUNT: 7}]); + done(); + }); + }); + + it('test1, with field-types= option', function (done) { var shp = "test/test_data/two_states.shp"; var csv = "test/test_data/text/states.csv"; var cmd = api.utils.format("-i %s -join %s keys=FIPS,STATE_FIPS fields=POP2010,SUB_REGION field-types=STATE_FIPS:str", shp, csv), @@ -26,6 +112,19 @@ describe('mapshaper-join.js', function () { }); }) + it('test2, with string-fields= option', function (done) { + var shp = "test/test_data/two_states.shp"; + var csv = "test/test_data/text/states.csv"; + var cmd = api.utils.format("-i %s -join %s keys=FIPS,STATE_FIPS fields=POP2010,SUB_REGION string-fields=STATE_FIPS,POP2010", shp, csv), + target = [{"STATE_NAME":"Oregon","FIPS":"41","STATE":"OR","LAT":43.94,"LONG":-120.55,"POP2010":"3831074","SUB_REGION":"Pacific"}, + {"STATE_NAME":"Washington","FIPS":"53","STATE":"WA","LAT":47.38,"LONG":-120.00,"POP2010":"6724540","SUB_REGION":"Pacific"}]; + api.internal.testCommands(cmd, function(err, data) { + if (err) throw err; + assert.deepEqual(data.layers[0].data.getRecords(), target); + done(); + }); + }) + it('join layers from two separately loaded datasets', function(done) { var shp = "test/test_data/two_states.shp"; var csv = "test/test_data/text/states.csv"; @@ -227,6 +326,15 @@ describe('mapshaper-join.js', function () { }) }) + describe('findCollisionFields()', function() { + var src = {foo: null, bar: 'a', baz: 0}, + dest = {foo: 1, bar: undefined, baz: 0}, + fields = []; + api.internal.findCollisionFields(dest, src, ['foo', 'bar', 'baz'], fields); + assert.deepEqual(fields, ['foo', 'bar']); + + }); + describe('getFieldsToJoin()', function () { it('Use fields option, if present', function () { var fields = api.internal.getFieldsToJoin([], ['st', 'co'], {fields: ['st']}) @@ -243,6 +351,16 @@ describe('mapshaper-join.js', function () { assert.deepEqual(fields, ['st', 'co']); }) + it('Exclude source key, if fields option is missing', function () { + var fields = api.internal.getFieldsToJoin([], ['st', 'co'], {keys: ['id', 'st']}) + assert.deepEqual(fields, ['co']); + }) + + it('Include source key, if fields option in "*"', function () { + var fields = api.internal.getFieldsToJoin([], ['st', 'co'], {fields: ['*'], keys: ['id', 'st']}) + assert.deepEqual(fields, ['st','co']); + }) + it('Do not join fields that are already present in dest table', function () { var fields = api.internal.getFieldsToJoin(['st'], ['st', 'co'], {}) assert.deepEqual(fields, ['co']); @@ -253,9 +371,20 @@ describe('mapshaper-join.js', function () { assert.deepEqual(fields, ['st', 'co']); }) - it('Do not join all fields by default if calc= option is present', function () { + // Changed in v0.74. + // it('Do not join all fields by default if calc= option is present', function () { + // var fields = api.internal.getFieldsToJoin([], ['st', 'co'], {calc: 'n=count()'}) + // assert.deepEqual(fields, []); + // }) + it('Join all fields by default even if calc= option is present', function () { var fields = api.internal.getFieldsToJoin([], ['st', 'co'], {calc: 'n=count()'}) - assert.deepEqual(fields, []); + assert.deepEqual(fields, ['st', 'co']); + }) + + it('Error if type hints are present', function() { + assert.throws(function() { + var fields = api.internal.getFieldsToJoin([], ['st', 'co'], {fields: ['st:str']}) + }) }) }) diff --git a/test/json-import-test.js b/test/json-import-test.js new file mode 100644 index 000000000..54c5f47f5 --- /dev/null +++ b/test/json-import-test.js @@ -0,0 +1,31 @@ +var api = require('..'), + internal = api.internal, + assert = require('assert'); + + +describe('mapshaper-json-import.js', function () { + describe('identifyJSONString()', function () { + function identify(str) { + return internal.identifyJSONString(str); + } + + it('Arrays of JSON records are type "json"', function () { + assert.equal(identify('[]'), 'json'); + assert.equal(identify('\n [ \n {'), 'json'); + }) + + + it('TopoJSON', function() { + assert.equal(identify('{\n"type": "TopoJSON", "arcs":\n[]'), 'topojson'); + assert.equal(identify('{ "objects": {'), 'topojson'); + assert.equal(identify(' { "bbox": [0,0,0,0], "transform": {"'), 'topojson'); + }) + + it('GeoJSON', function() { + assert.equal(identify('{\n"type": "Point", "coordinates":\n['), 'geojson'); + assert.equal(identify('{ "features": ['), 'geojson'); + assert.equal(identify(' {\r"geometries": ['), 'geojson'); + }) + + }) +}) diff --git a/test/keep-shapes-test.js b/test/keep-shapes-test.js index f2cfc5b9f..28eb966f2 100644 --- a/test/keep-shapes-test.js +++ b/test/keep-shapes-test.js @@ -4,6 +4,36 @@ var assert = require('assert'), describe("mapshaper-keep-shapes.js", function() { + describe('Issue #228 -- island shapes not always preserved', function () { + it('edge case: adding two points fails to inflate island', function (done) { + var poly = { + type: 'Polygon', + coordinates: [[[0, 0], [0, 1], [0.5, 0], [0, -1], [0, 0]]] + } + var expect = poly; + var cmd = '-i poly.json -simplify keep-shapes dp 0% -o'; + api.applyCommands(cmd, {'poly.json': poly}, function(err, output) { + var result = JSON.parse(output['poly.json']).geometries[0]; + assert.deepEqual(result, poly); + done(); + }); + }) + + it('edge case 2: collapsed shape has tiny positive area (to simulate rounding error)', function (done) { + var poly = { + type: 'Polygon', + coordinates: [[[-1e-11, 0], [0, 1], [0.5, 0], [0, -1], [-1e-11, 0]]] + } + var expect = poly; + var cmd = '-i poly.json -simplify keep-shapes dp 0% -o'; + api.applyCommands(cmd, {'poly.json': poly}, function(err, output) { + var result = JSON.parse(output['poly.json']).geometries[0]; + assert.deepEqual(result, poly); + done(); + }); + }) + }) + describe("#replaceInArray()", function() { var uu2, uu3, uu5; diff --git a/test/merge-files-test.js b/test/merge-files-test.js index 6704fd48a..d97142100 100644 --- a/test/merge-files-test.js +++ b/test/merge-files-test.js @@ -6,7 +6,7 @@ describe('mapshaper-merge-files.js', function () { var a = 'test/test_data/three_points.geojson', b = 'test/test_data/text/two_states.csv'; var combined = api.internal.importFiles([a, b], {}); - assert(combined.info.crs.is_latlong); + assert(api.internal.getDatasetCRS(combined).is_latlong); assert.deepEqual(combined.info.input_files, ['test/test_data/three_points.geojson', 'test/test_data/text/two_states.csv']); assert.deepEqual(combined.info.input_formats, ['geojson', 'dsv']); }) @@ -15,7 +15,7 @@ describe('mapshaper-merge-files.js', function () { var a = 'test/test_data/six_counties.shp', b = 'test/test_data/two_states.json', combined = api.internal.importFiles([a, b], {}); - assert(combined.info.crs.is_latlong); + assert(api.internal.getDatasetCRS(combined).is_latlong); // TODO: check geometry }) diff --git a/test/merge-layers-test.js b/test/merge-layers-test.js index 3cf225d02..e8791787a 100644 --- a/test/merge-layers-test.js +++ b/test/merge-layers-test.js @@ -4,7 +4,123 @@ var assert = require('assert'), describe('mapshaper-merge-layers.js', function () { + describe('-merge-layers command', function() { + + it('handles empty layers', function(done) { + var a = 'id\n1', + b = 'id\n2', + c = 'id\n3', + d = 'id\n4'; + var cmd = '-i a.csv -filter false -i b.csv c.csv combine-files -i d.csv -merge-layers target=* -o out.csv'; + var data = {'a.csv': a, 'b.csv': b, 'c.csv': c, 'd.csv': d}; + api.applyCommands(cmd, data, function(err, out) { + assert.equal(out['out.csv'], 'id\n2\n3\n4'); + done(); + }); + + + }); + + it('force flag works', function(done) { + var a = 'id\na'; + var b = 'ID\nb'; + api.applyCommands('a.csv b.csv combine-files -merge-layers target=* force -o c.csv', {'a.csv': a, 'b.csv': b}, function(err, out) { + var c = out['c.csv']; + assert.equal(c, 'id,ID\na,\n,b'); + done(); + }); + + }); + + it('supports merging layers from multiple datasets', function(done) { + var a = 'FIPS\n36', + b = 'FIPS\n34', + c = 'FIPS\n52', + // merge two of three datasets + cmd = '-i a.csv -i b.csv -i c.csv -merge-layers target=b,c name=bc -o target=*'; + api.applyCommands(cmd, {'a.csv': a, 'b.csv': b, 'c.csv': c}, function(err, out) { + var a = out['a.csv'], + bc = out['bc.csv']; + assert.deepEqual(Object.keys(out).sort(), ['a.csv', 'bc.csv']); + assert.equal(a, 'FIPS\n36'); + assert.equal(bc, 'FIPS\n34\n52'); + done(); + }); + }); + + it('supports merging layers from multiple datasets 2', function(done) { + var a = 'FIPS\n36', + b = 'FIPS\n34', + c = 'FIPS\n52', + // test that default target after merge is the merged layer + cmd = '-i a.csv b.csv combine-files -i c.csv -merge-layers target=b,c name=bc -each \'FIPS=null\' -o target=*'; + api.applyCommands(cmd, {'a.csv': a, 'b.csv': b, 'c.csv': c}, function(err, out) { + var a = out['a.csv'], + bc = out['bc.csv']; + assert.deepEqual(Object.keys(out).sort(), ['a.csv', 'bc.csv']); + assert.equal(a, 'FIPS\n36'); + assert.equal(bc, 'FIPS\n\n'); + done(); + }); + }); + + it('supports merging layers from multiple datasets 3', function(done) { + var a = 'FIPS\n36', + b = 'FIPS\n34', + c = 'FIPS\n52', + // merge all datasets + cmd = '-i a.csv -i b.csv -i c.csv -merge-layers target=* name=abc -o target=*'; + api.applyCommands(cmd, {'a.csv': a, 'b.csv': b, 'c.csv': c}, function(err, out) { + var abc = out['abc.csv']; + assert.deepEqual(Object.keys(out), ['abc.csv']); + assert.equal(abc, 'FIPS\n36\n34\n52'); + done(); + }); + }); + + + it('identifies shared topology between layers', function(done) { + + var line = { + type: 'LineString', + coordinates: [[0, 0], [1, 1], [2, 2]] + }; + var target = { + type: 'Topology', + arcs: [[[0, 0], [1, 1], [2, 2]]], + objects: {layer: { + type: 'GeometryCollection', + geometries: [{ + type: 'LineString', + arcs: [0] + },{ + type: 'LineString', + arcs: [0] + }] + }} + }; + var cmd = '-i a.json -i b.json -merge-layers target=a,b -o ab.json format=topojson no-quantization'; + api.applyCommands(cmd, {'a.json': line, 'b.json': line}, function(err, output) { + var json = JSON.parse(output['ab.json']); + assert.deepEqual(json, target); + done(); + }); + }) + + }) + describe('mergeLayers()', function () { + it('merging a single layer returns reference to original layer', function() { + var lyr1 = { + geometry_type: "point", + shapes: [[[0, 1]], [[2, 1]]], + data: new internal.DataTable([{a: 9}, {a: 8}]) + }; + var merged = api.mergeLayers([lyr1]); + assert.strictEqual(merged[0], lyr1); + }) + + it('compatible layers are merged', function () { var lyr1 = { geometry_type: "point", @@ -18,6 +134,8 @@ describe('mapshaper-merge-layers.js', function () { }; var merged = api.mergeLayers([lyr1, lyr2]); assert.deepEqual(merged[0].data.getRecords(), [{a: 9}, {a: 8}, {a: 7}]); + assert.deepEqual(merged[0].shapes, [[[0, 1]], [[2, 1]], [[4, 3]]]); + assert.equal(merged[0].geometry_type, 'point'); }) it('layers with incompatible geometries are not merged', function () { @@ -34,6 +152,26 @@ describe('mapshaper-merge-layers.js', function () { }) }) + it('layers with only geometry are merged', function() { + var lyr1 = { + name: 'a', + geometry_type: "point", + shapes: [[[0, 1]], [[2, 1]]] + }; + var lyr2 = { + name: 'b', + geometry_type: "point", + shapes: [[[4, 3]]] + }; + var merged = api.mergeLayers([lyr1, lyr2]); + assert.deepEqual(merged[0], { + name: '', + geometry_type: 'point', + shapes: [[[0, 1]], [[2, 1]], [[4, 3]]], + data: null + }); + }); + it('layers with only data are merged', function () { var lyr1 = { data: new internal.DataTable([{a: 9, b: ''}, {b: 'b', a: 8}]) @@ -63,7 +201,7 @@ describe('mapshaper-merge-layers.js', function () { }) }) - it('layers with incompatible data are not merged', function () { + it('layers with inconsistent fields are not merged', function () { var lyr1 = { geometry_type: "point", shapes: [[[0, 1]], [[2, 1]]], @@ -79,6 +217,36 @@ describe('mapshaper-merge-layers.js', function () { }) }) + it('layers with inconsistent fields are merged if force-merging', function () { + var lyr1 = { + geometry_type: "point", + shapes: [[[0, 1]], [[2, 1]]], + data: new internal.DataTable([{a: 9}, {a: 8}]) + }; + var lyr2 = { + geometry_type: "point", + shapes: [[[4, 3]]], + data: new internal.DataTable([{a: 7, b: 0}]) + }; + var merged = api.mergeLayers([lyr1, lyr2], {force: true})[0].data.getRecords(); + assert.deepEqual(merged, [{a: 9, b: undefined}, {a: 8, b: undefined}, {a: 7, b: 0}]); + assert.strictEqual(merged[0].b, undefined); + }) + + it('force-merging allows layers with no data to be merged', function () { + var lyr1 = { + geometry_type: "point", + shapes: [[[0, 1]], [[2, 1]]], + data: null + }; + var lyr2 = { + geometry_type: "point", + shapes: [[[4, 3]]], + data: new internal.DataTable([{a: 7, b: 0}]) + }; + var merged = api.mergeLayers([lyr1, lyr2], {force: true})[0].data.getRecords(); + assert.deepEqual(merged, [{a: undefined, b: undefined}, {a: undefined, b: undefined}, {a: 7, b: 0}]); + }) }) -}) \ No newline at end of file +}) diff --git a/test/metadata-test.js b/test/metadata-test.js new file mode 100644 index 000000000..27ef0601a --- /dev/null +++ b/test/metadata-test.js @@ -0,0 +1,39 @@ + +var api = require('../'), + assert = require('assert'), + TopoJSON = api.internal.topojson; + + +describe('mapshaper-metadata.js', function () { + + describe('Import/export tests', function() { + it('projected CRS is imported, reprojected and exported', function(done) { + var input = { + type: "Topology", + metadata: { + proj4: "+proj=merc" + }, + arcs: [], + objects: { + point: { + type: "GeometryCollection", + geometries: [{ + type: "Point", + coordinates: [0, 10000] + }] + } + } + }; + var cmd = '-i data.json -proj wgs84 -o no-quantization metadata'; + api.applyCommands(cmd, {'data.json': input}, function(err, out) { + var topology = JSON.parse(out['data.json']); + assert.equal(topology.metadata.proj4, '+proj=longlat +datum=WGS84'); + + done(); + }); + + }) + + }) + +}) diff --git a/test/nodes-test.js b/test/nodes-test.js index 10de48328..f57dbee1d 100644 --- a/test/nodes-test.js +++ b/test/nodes-test.js @@ -5,28 +5,239 @@ var api = require('../'), describe('mapshaper-nodes.js', function () { - describe('NodeCollection#toArray()', function () { - it('test 1', function () { + describe('NodeCollection() Fig. 1 tests', function () { + // Fig. 1 + // + // b --- d + // / \ / + // / \ / + // a --- c + // + // cab, bc, bdc + // 0, 1, 2 - // b --- d + var arcs = [[[3, 1], [1, 1], [2, 3]], [[2, 3], [3, 1]], [[2, 3], [4, 3], [3, 1]]]; + + it('#toArray()', function () { + var nodes = new NodeCollection(new ArcCollection(arcs)); + assert.deepEqual(nodes.toArray(), [{ + coordinates: [3, 1], + arcs: [~0, 1, 2] + }, { + coordinates: [2, 3], + arcs: [0, ~1, ~2] + }]); + }) + + it('Optional filter function constructor argument filters arcs', function() { + var filter = function(id) {return id != 0;}; // exclude arc 0 + var nodes = new NodeCollection(new ArcCollection(arcs), filter); + assert.deepEqual(nodes.getConnectedArcs(0), []); + assert.deepEqual(nodes.getConnectedArcs(1), [2]); + assert.deepEqual(nodes.getConnectedArcs(2), [1]); + assert.deepEqual(nodes.getConnectedArcs(~0), []); + assert.deepEqual(nodes.getConnectedArcs(~1), [~2]); + assert.deepEqual(nodes.getConnectedArcs(~2), [~1]); + assert.deepEqual(nodes.toArray(), [{ + coordinates: [2, 3], + arcs: [~1, ~2] + }, { + coordinates: [3, 1], + arcs: [1, 2] + }]); + + }) + + it('#getConnectedArcs() takes an optional filter function argument', function() { + var filter = function(id) { + return id != 0;}; // exclude arc 0 + var nodes = new NodeCollection(new ArcCollection(arcs)); + assert.deepEqual(nodes.getConnectedArcs(0, filter), []); + assert.deepEqual(nodes.getConnectedArcs(1, filter), [2]); + assert.deepEqual(nodes.getConnectedArcs(2, filter), [1]); + assert.deepEqual(nodes.getConnectedArcs(~0, filter), []); + assert.deepEqual(nodes.getConnectedArcs(~1, filter), [~2]); + assert.deepEqual(nodes.getConnectedArcs(~2, filter), [~1]); + }) + + + }) + + describe('#detachArc()', function() { + it ('test 1', function() { + // Same as Fig. 1 above + var arcs = [[[3, 1], [1, 1], [2, 3]], [[2, 3], [3, 1]], [[2, 3], [4, 3], [3, 1]]]; + var nodes = new NodeCollection(new ArcCollection(arcs)); + nodes.detachArc(0); + assert.deepEqual(nodes.toArray(), [{ + coordinates: [2, 3], + arcs: [~1, ~2] + }, { + coordinates: [3, 1], + arcs: [1, 2] + }]); + + // remove same arc (in opposite direction) -- same expected output + nodes.detachArc(~0); + assert.deepEqual(nodes.toArray(), [{ + coordinates: [2, 3], + arcs: [~1, ~2] + }, { + coordinates: [3, 1], + arcs: [1, 2] + }]); + + // remove another arc + nodes.detachArc(~2); + assert.deepEqual(nodes.toArray(), [{ + coordinates: [2, 3], + arcs: [~1] + }, { + coordinates: [3, 1], + arcs: [1] + }]); + }); + + it ('test 2', function() { + // same as Fig. 1 + var arcs = [[[3, 1], [1, 1], [2, 3]], [[2, 3], [3, 1]], [[2, 3], [4, 3], [3, 1]]]; + var nodes = new NodeCollection(new ArcCollection(arcs)); + nodes.detachArc(~1); + assert.deepEqual(nodes.toArray(), [{ + coordinates: [3, 1], + arcs: [~0, 2] + }, { + coordinates: [2, 3], + arcs: [0, ~2] + }]); + }); + + it ('test 3 - spike', function () { + // Fig. 2 + // + // b d // / \ / // / \ / // a --- c // - // cab, bc, bdc + // cab, bc, cd // 0, 1, 2 - var arcs = [[[3, 1], [1, 1], [2, 3]], [[2, 3], [3, 1]], [[2, 3], [4, 3], [3, 1]]]; - var nodes = new NodeCollection(new ArcCollection(arcs)).toArray(); + var arcs = [[[3, 1], [1, 1], [2, 3]], [[2, 3], [3, 1]], [[3, 1], [4, 3]]]; + var nodes = new NodeCollection(new ArcCollection(arcs)); + + assert.deepEqual(nodes.toArray(), [{ + coordinates: [3, 1], + arcs: [~0, 1, ~2] + }, { + coordinates: [2, 3], + arcs: [0, ~1] + }, { + coordinates: [4, 3], + arcs: [2] + }]); + assert.deepEqual(nodes.getConnectedArcs(2), []); + assert.deepEqual(nodes.getConnectedArcs(~2), [~0, 1]); + assert.deepEqual(nodes.getConnectedArcs(1), [~2, ~0]); + nodes.detachArc(2); + assert.deepEqual(nodes.getConnectedArcs(2), []); + assert.deepEqual(nodes.getConnectedArcs(~2), []); + assert.deepEqual(nodes.getConnectedArcs(1), [~0]); + assert.deepEqual(nodes.toArray(), [{ + coordinates: [3, 1], + arcs: [~0, 1] + }, { + coordinates: [2, 3], + arcs: [0, ~1] + }]); + }); + }); + + describe('#detachAcyclicArcs()', function () { - assert.deepEqual(nodes, [[3, 1], [2, 3]]); + it ('test 3 - spike', function () { + // Fig. 3 + // + // b d --- f + // / \ / \ + // / \ / \ + // a --- c e + // + // cab, bc, cd, de, fe + // 0, 1, 2, 3, 4 + + var arcs = [[[3, 1], [1, 1], [2, 3]], [[2, 3], [3, 1]], + [[3, 1], [4, 3]], [[4, 3], [5, 1]], [[6, 3], [4, 3]]]; + var nodes = new NodeCollection(new ArcCollection(arcs)); + assert.deepEqual(nodes.toArray(), [{ + coordinates: [3, 1], + arcs: [~0, 1, ~2] + }, { + coordinates: [2, 3], + arcs: [0, ~1] + }, { + coordinates: [4, 3], + arcs: [2, ~3, 4] + }, { + coordinates: [5, 1], + arcs: [3] + }, { + coordinates: [6, 3], + arcs: [~4] + }]); + assert.deepEqual(nodes.getConnectedArcs(1), [~2, ~0]) + assert.deepEqual(nodes.getConnectedArcs(2), [~3, 4]) + var count = nodes.detachAcyclicArcs(); + assert.equal(count, 3); + assert.deepEqual(nodes.getConnectedArcs(1), [~0]) + assert.deepEqual(nodes.getConnectedArcs(2), []) + assert.deepEqual(nodes.toArray(), [{ + coordinates: [3, 1], + arcs: [~0, 1] + }, { + coordinates: [2, 3], + arcs: [0, ~1] + }]); + }); + }); + + describe('#findDanglingEndpoints()', function () { + it('Fig. 3', function () { + var arcs = [[[3, 1], [1, 1], [2, 3]], [[2, 3], [3, 1]], + [[3, 1], [4, 3]], [[4, 3], [5, 1]], [[6, 3], [4, 3]]]; + var nodes = new NodeCollection(new ArcCollection(arcs)); + var target = [{ + point: [5, 1], + arc: 3 + }, { + point: [6, 3], + arc: ~4 + }]; + var count; + assert.deepEqual(nodes.findDanglingEndpoints(), target); + count = nodes.detachAcyclicArcs(); + assert.equal(count, 3); + assert.deepEqual(nodes.findDanglingEndpoints(), []); + nodes.detachArc(~1); + assert.deepEqual(nodes.findDanglingEndpoints(), [{ + arc: ~0, + point: [3, 1] + }, { + arc: 0, + point: [2, 3] + }]); + count = nodes.detachAcyclicArcs(); + assert.equal(count, 1); + assert.deepEqual(nodes.findDanglingEndpoints(), []); }) }) + /* describe('NodeCollection#getNextArc()', function () { it('test 1', function () { - + // Fig. 4 + // // b --- d // / \ / // / \ / @@ -48,7 +259,8 @@ describe('mapshaper-nodes.js', function () { }) */ - describe('Fig. 2', function() { + describe('test 2', function() { + // Fig. 5 // // g ----- h // | | @@ -84,17 +296,16 @@ describe('mapshaper-nodes.js', function () { assert.equal(nodes.internal.testArcMatch(~1, 2), false) }) - it ("NodeCollection#findMatchingArc()", function() { - assert.equal(nodes.findMatchingArc(0), 0); - assert.equal(nodes.findMatchingArc(~0), ~0); - assert.equal(nodes.findMatchingArc(5), 0); - assert.equal(nodes.findMatchingArc(~5), ~0); - assert.equal(nodes.findMatchingArc(~7), ~2); - assert.equal(nodes.findMatchingArc(7), 2); - assert.equal(nodes.findMatchingArc(2), 2); + it ("NodeCollection#findDuplicateArc()", function() { + assert.equal(nodes.findDuplicateArc(0), 0); + assert.equal(nodes.findDuplicateArc(~0), ~0); + assert.equal(nodes.findDuplicateArc(5), 0); + assert.equal(nodes.findDuplicateArc(~5), ~0); + assert.equal(nodes.findDuplicateArc(~7), ~2); + assert.equal(nodes.findDuplicateArc(7), 2); + assert.equal(nodes.findDuplicateArc(2), 2); }); - }); -}); \ No newline at end of file +}); diff --git a/test/option-parser-test.js b/test/option-parser-test.js new file mode 100644 index 000000000..b66e0983e --- /dev/null +++ b/test/option-parser-test.js @@ -0,0 +1,46 @@ +var api = require('../'), + internal = api.internal, + assert = require('assert'); + +describe('mapshaper-option-parser.js', function () { + + describe('parseStringList()', function () { + var list1 = '"County FIPS,State FIPS"', + list2 = '"County FIPS","State FIPS"'; + + it(list1, function() { + assert.deepEqual(internal.parseStringList(list1), ["County FIPS", "State FIPS"]); + }) + + it(list2, function() { + assert.deepEqual(internal.parseStringList(list2), ["County FIPS", "State FIPS"]); + }) + }) + + describe('parseColorList()', function () { + var list1 = '"white black"', + list2 = '"white","black"', + list3 = '"white, black"', + list4 = '"white", "black"', + expected = ['white', 'black']; + + var list5 = 'rgba(0, 0, 0, 0), rgb(22,32,0),aliceblue', + expected5 = ['rgba(0,0,0,0)', 'rgb(22,32,0)', 'aliceblue']; + + it(list1, function() { + assert.deepEqual(internal.parseColorList(list1), expected); + }) + it(list2, function() { + assert.deepEqual(internal.parseColorList(list2), expected); + }) + it(list3, function() { + assert.deepEqual(internal.parseColorList(list3), expected); + }) + it(list4, function() { + assert.deepEqual(internal.parseColorList(list4), expected); + }) + it(list5, function() { + assert.deepEqual(internal.parseColorList(list5), expected5); + }) + }) +}) diff --git a/test/options-test.js b/test/options-test.js index 1be47762c..2a620cf07 100644 --- a/test/options-test.js +++ b/test/options-test.js @@ -12,17 +12,20 @@ describe('mapshaper-options.js', function () { bad("-i precision " + file1); bad("-i precision 0 " + file1); // filename expansion - good('-i snap', {auto_snap: true}); // same as auto-snap - good('-i auto-snap', {auto_snap: true}); + good('-i snap', {snap: true}); + good('-i auto-snap', {snap: true}); good('-i', {}); // now accepting no files good("-i " + file1, {files: [file1]}); good("-i no-topology " + file1 + " auto-snap precision 0.1", - {files: [file1], auto_snap: true, no_topology: true, precision: 0.1}); - good("-i " + file1 + " snap-interval 0.001", {snap_interval: 0.001, files: [file1]}); + {files: [file1], snap: true, no_topology: true, precision: 0.1}); + good("-i " + file1 + " snap-interval 0.001", {snap_interval: '0.001', files: [file1]}); + good("-i " + file1 + " snap-interval 1ft", {snap_interval: '1ft', files: [file1]}); good("-i merge-files " + file1 + " " + file2, {merge_files: true, files: [file1, file2]}); good("-i combine-files " + file1 + " " + file2, {combine_files: true, files: [file1, file2]}); good("-", {stdin: true}); good("/dev/stdin", {stdin: true}); + good("files=states.json", {files:['states.json']}); + good("files=states.json,counties.json", {files:['states.json', 'counties.json']}); good("file.shp name=states", {files:['file.shp'], name: 'states'}); good("file.shp name=", {files:['file.shp'], name: ''}); good("file.shp name=''", {files:['file.shp'], name: ''}); @@ -50,6 +53,9 @@ describe('mapshaper-options.js', function () { good("-o -", {stdout: true}) good("-o /dev/stdout", {stdout: true}) + good("-o field-order=ascending", {field_order: "ascending"}) + bad("-o field-order=descending"); + // topojson options good("-o quantization 10000", {quantization: 10000}); good("-o no-quantization", {no_quantization: true}); @@ -87,6 +93,9 @@ describe('mapshaper-options.js', function () { describe('colorizer', function () { good('-colorizer breaks=0,10 colors="red white blue" name=col', {name: "col", breaks: [0, 10], colors: ["red", "white", "blue"]}) + good('-colorizer categories="good,bad" colors=\'"#000", "white"\'', + {categories: ['good', 'bad'], colors: ['#000', 'white']}); + // TODO: accept arguments like: colors="#000","#FFF" }) describe('innerlines', function () { @@ -100,8 +109,8 @@ describe('mapshaper-options.js', function () { describe('simplify', function() { bad("-s") // no alias (add one?) bad("-simplify cartesian i 0.001") - good("-simplify visvalingam 10%", {method: "visvalingam", percentage: 0.1}) - good("-simplify cartesian 1%", {planar: true, percentage: 0.01}) + good("-simplify visvalingam 10%", {method: "visvalingam", percentage: '10%'}) + good("-simplify cartesian 1%", {planar: true, percentage: '1%'}) // invalid method names // now handled in simplify function @@ -111,27 +120,28 @@ describe('mapshaper-options.js', function () { bad('-simplify 5% keep-shapes=true'); bad('-simplify 5% dp=true'); - good("-simplify 0%", {percentage: 0}); - good("-simplify 0%", {percentage: 0}); - good("-simplify 4%", {percentage: 0.04}); - good("-simplify 0.04", {percentage: 0.04}); - good("-simplify percentage=4%", {percentage: 0.04}); - good("-simplify percentage=.04", {percentage: 0.04}); - good("-simplify percentage 4%", {percentage: 0.04}); - bad("-simplify 10"); - bad("-simplify -5%"); - bad("-simplify 101%"); - bad("-simplify percentage=101%"); - good("-simplify keep-shapes rdp 10%", {keep_shapes: true, method: "dp", percentage: 0.1}); - bad("-simplify interval=10km"); // need integer + good("-simplify 0%", {percentage: '0%'}); + good("-simplify 0%", {percentage: '0%'}); + good("-simplify 4%", {percentage: '4%'}); + good("-simplify 0.04", {percentage: '0.04'}); + good("-simplify percentage=4%", {percentage: '4%'}); + good("-simplify percentage=.04", {percentage: '.04'}); + good("-simplify percentage 4%", {percentage: '4%'}); + // percentage validation now occurs in -simplify command + // bad("-simplify 10"); + // bad("-simplify -5%"); + // bad("-simplify 101%"); + // bad("-simplify percentage=101%"); + // bad("-simplify 10km"); + good("-simplify keep-shapes rdp 10%", {keep_shapes: true, method: "dp", percentage: '10%'}); + // bad("-simplify interval=10km"); // need integer bad("-simplify percentage"); - bad("-simplify 10km"); - good("-simplify 3% no-repair", {percentage: 0.03, no_repair: true}); + good("-simplify 3% no-repair", {percentage: '3%', no_repair: true}); }) describe('filter-fields', function () { good('-filter-fields STATE,FIPS:STATE_FIPS', {fields:["STATE", "FIPS:STATE_FIPS"]}); - good('-filter-fields', {fields: []}); + good('-filter-fields', {}); }) describe('filter', function () { @@ -173,8 +183,9 @@ describe('mapshaper-options.js', function () { describe('dissolve', function() { good("-dissolve", {}); - good("-dissolve STATE", {field: 'STATE'}); - good("-dissolve FIPS sum-fields POP copy-fields NAME,FIPS", {field: "FIPS", copy_fields: ["NAME", "FIPS"], sum_fields: ["POP"]}); + good("-dissolve STATE", {fields: ['STATE']}); + good("-dissolve STATE,REGION", {fields: ['STATE', 'REGION']}); + good("-dissolve FIPS sum-fields POP copy-fields NAME,FIPS", {fields: ["FIPS"], copy_fields: ["NAME", "FIPS"], sum_fields: ["POP"]}); bad("-dissolve STATE COUNTY"); bad("-dissolve name -o"); // expects name= }) @@ -207,11 +218,21 @@ describe('mapshaper-options.js', function () { describe('proj', function() { good("-proj +proj=merc +ellps=sphere", { - projection: '+proj=merc +ellps=sphere' + crs: '+proj=merc +ellps=sphere' }); good("-proj albersusa densify", { - projection: 'albersusa', + crs: 'albersusa', + densify: true + }); + + good("-proj crs='+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs'", { + crs: '+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs' + }); + + // projection= is alias for crs=, for backwards compatibility + good("-proj projection=albersusa densify", { + crs: 'albersusa', densify: true }); diff --git a/test/path-division-test.js b/test/path-division-test.js index 5c55df83c..38eb08a04 100644 --- a/test/path-division-test.js +++ b/test/path-division-test.js @@ -12,6 +12,13 @@ describe('mapshaper-path-division.js', function () { var map = insertCutPoints(points, arcs); assert.deepEqual(arcs.toArray(), [[[0, 0], [1, 0]]]); }) + + it('skip point at end of an arc', function () { + var arcs = new ArcCollection([[[0, 0], [1, 0]]]); + var points = [{x: 1, y: 0, i: 1}]; + var map = insertCutPoints(points, arcs); + assert.deepEqual(arcs.toArray(), [[[0, 0], [1, 0]]]); + }) }) describe('getCutPoint()', function () { @@ -111,9 +118,6 @@ describe('mapshaper-path-division.js', function () { var coords = [[[3, 3], [3, 1], [1, 1], [1, 3], [3, 3]], [[2, 2], [2, 4], [4, 4], [4, 2], [2, 2]]]; - var arcs = new ArcCollection(coords); - var map = api.internal.divideArcs(arcs); - var nodes = new api.internal.NodeCollection(arcs); it('insert clipping points', function () { @@ -127,7 +131,7 @@ describe('mapshaper-path-division.js', function () { // c ----- b // - var result = arcs.toArray(); + var arcs = new ArcCollection(coords); var targetArcs = [[[3, 3], [3, 2]], [[3, 2], [3, 1], [1, 1], [1, 3], [2, 3]], [[2, 3], [3, 3]], @@ -135,11 +139,13 @@ describe('mapshaper-path-division.js', function () { [[2, 3], [2, 4], [4, 4], [4, 2], [3, 2]], [[3, 2], [2, 2]]]; - assert.deepEqual(result, targetArcs); + var map = api.internal.divideArcs(arcs); + assert.deepEqual(arcs.toArray(), targetArcs); assert.deepEqual(api.utils.toArray(map), [0, 3]); }) it('update polygon ids', function () { + var arcs = new ArcCollection(coords); var lyrA = { geometry_type: "polygon", shapes: [[[0]]] @@ -148,16 +154,16 @@ describe('mapshaper-path-division.js', function () { geometry_type: "polygon", shapes: [[[1]]] }; + var dataset = {arcs: arcs, layers: [lyrA, lyrB]}; var targetA = [[[0, 1, 2]]], targetB = [[[3, 4, 5]]]; - api.internal.updateArcIds(lyrA.shapes, map, nodes); - api.internal.updateArcIds(lyrB.shapes, map, nodes); + api.internal.cutPathsAtIntersections(dataset); assert.deepEqual(lyrA.shapes, targetA); assert.deepEqual(lyrB.shapes, targetB); }) - it('update ids of reversed polygons', function () { + var arcs = new ArcCollection(coords); var lyrA = { geometry_type: "polygon", shapes: [[[~0]]] @@ -166,33 +172,15 @@ describe('mapshaper-path-division.js', function () { geometry_type: "polygon", shapes: [[[~1]]] }; + var dataset = {arcs: arcs, layers: [lyrA, lyrB]}; var targetA = [[[~2, ~1, ~0]]], targetB = [[[~5, ~4, ~3]]]; - api.internal.updateArcIds(lyrA.shapes, map, nodes); - api.internal.updateArcIds(lyrB.shapes, map, nodes); + api.internal.cutPathsAtIntersections(dataset); assert.deepEqual(lyrA.shapes, targetA); assert.deepEqual(lyrB.shapes, targetB); }) - /* - it('divide lyr A polygon', function () { - var lyrA = { - geometry_type: "polygon", - shapes: [[[0]]] - }; - var lyrB = { - geometry_type: "polygon", - shapes: [[[1]]] - }; - var target = [[[0, 5, 3, 2], [1, ~3, ~5]]]; - api.internal.updateArcIds(lyrA.shapes, map, arcs); - api.internal.updateArcIds(lyrB.shapes, map, arcs); - var dividedLyr = api.dividePolygonLayer(lyrA, lyrB, arcs); - assert.deepEqual(dividedLyr.shapes, target); - }) - */ - }) describe('Fig. 2 polygons - point-segment (T) intersections', function () { @@ -211,11 +199,9 @@ describe('mapshaper-path-division.js', function () { var coords = [[[3, 3], [3, 1], [1, 1], [1, 3], [3, 3]], [[2, 2], [2, 3], [2, 4], [4, 4], [4, 2], [3, 2], [2, 2]]]; - - var arcs = new ArcCollection(coords); - var map = api.internal.divideArcs(arcs); - it('arcs are divided', function () { + var arcs = new ArcCollection(coords); + var map = api.internal.divideArcs(arcs); var targetArcs = [ [[3, 3], [3, 2]], // (0) [[3, 2], [3, 1], [1, 1], [1, 3], [2, 3]], @@ -263,11 +249,9 @@ describe('mapshaper-path-division.js', function () { geometry_type: "polygon", shapes: [[[1, 2]], [[4, ~2]]] }; + var dataset = {arcs: arcs, layers: [lyrA, lyrB]}; - var map = api.internal.divideArcs(arcs); - var nodes = new api.internal.NodeCollection(arcs); - api.internal.updateArcIds(lyrA.shapes, map, nodes); - api.internal.updateArcIds(lyrB.shapes, map, nodes); + api.internal.cutPathsAtIntersections(dataset); it ("divide arcs", function() { @@ -301,11 +285,11 @@ describe('mapshaper-path-division.js', function () { [[2, 2], [2, 3]]]; // .f assert.deepEqual(coords, target); - assert.deepEqual(api.utils.toArray(map), [0, 3, 7, 9, 12]) + // assert.deepEqual(api.utils.toArray(map), [0, 3, 7, 9, 12]) }) it ("layer A remapped", function() { - var targetA = [[[0, 1, 2], [9, 5, 11]]]; + var targetA = [[[0, 1, 2], [9, 10, 11]]]; assert.deepEqual(lyrA.shapes, targetA); }) diff --git a/test/path-index-test.js b/test/path-index-test.js index 28aa04187..0b130b7dd 100644 --- a/test/path-index-test.js +++ b/test/path-index-test.js @@ -4,6 +4,68 @@ var api = require('../'), describe('mapshaper-path-index.js', function () { + describe('findSmallestEnclosingPolygon()', function () { + + it('Finds id of smallest enclosing ring from a collection of nested rings', function() { + var input = { + type: 'GeometryCollection', + geometries: [ + { + type: 'Polygon', + coordinates: [[[0, 0], [0, 3], [3, 3], [3, 0], [0, 0]]] + }, { + type: 'Polygon', + coordinates: [[[1, 1], [2, 1], [2, 2], [1, 2], [1, 1]]] + }, { + type: 'Polygon', + coordinates: [[[-1,-1], [-1, 4], [4, 4], [4, -1], [-1, -1]]] + }, { + type: 'Polygon', + coordinates: [[[1.1, 1.1], [1.9, 1.1], [1.9, 1.9], [1.1, 1.9], [1.1, 1.1]]] + } + ] + }; + var dataset = api.internal.importGeoJSON(input, {}); + var shapes = dataset.layers[0].shapes; + var index = new api.internal.PathIndex(shapes, dataset.arcs); + assert.equal(index.findSmallestEnclosingPolygon([0]), 2); + assert.equal(index.findSmallestEnclosingPolygon([1]), 0); + assert.equal(index.findSmallestEnclosingPolygon([2]), -1); + assert.equal(index.findSmallestEnclosingPolygon([3]), 1); + }); + + it('Ignores congruent polygons', function () { + var input = { + type: 'GeometryCollection', + geometries: [{ + type: 'Polygon', + coordinates: [[[0, 0], [0, 3], [3, 3], [3, 0], [0, 0]]] + }, { + type: 'Polygon', + coordinates: [[[1, 1], [1, 2], [2, 2], [2, 1], [1, 1]]] + }, { + type: 'Polygon', + coordinates: [[[1, 1], [1, 2], [2, 2], [2, 1], [1, 1]]] // CW + }] + }; + var dataset = api.internal.importGeoJSON(input, {}); + var shapes = dataset.layers[0].shapes; + var index = new api.internal.PathIndex(shapes, dataset.arcs); + + assert.equal(index.findSmallestEnclosingPolygon([0]), -1); + assert.equal(index.findSmallestEnclosingPolygon([~0]), -1); + assert.equal(index.findSmallestEnclosingPolygon([1]), 0); + assert.equal(index.findSmallestEnclosingPolygon([~1]), 0); + assert.equal(index.findSmallestEnclosingPolygon([2]), 0); + assert.equal(index.findSmallestEnclosingPolygon([~2]), 0); + assert.deepEqual(shapes, [[[0]], [[1]], [[2]]]); // imported without topology + assert.deepEqual(dataset.arcs.toArray(), [ + [[0, 0], [0, 3], [3, 3], [3, 0], [0, 0]], + [[1, 1], [1, 2], [2, 2], [2, 1], [1, 1]], + [[1, 1], [1, 2], [2, 2], [2, 1], [1, 1]]]); + }) + }) + describe('Fig. 1', function () { // e diff --git a/test/path-utils-test.js b/test/path-utils-test.js index c6954d35f..06737de95 100644 --- a/test/path-utils-test.js +++ b/test/path-utils-test.js @@ -3,6 +3,27 @@ var api = require('../'), describe('mapshaper-filename-utils.js', function () { + describe('getArcPresenceTest2()', function() { + it('handles point layer without error', function() { + var arcs = [[[0, 0], [1, 1]], [[1, 1], [2, 2]], [[2, 2], [3, 3]]]; // three arcs + var layers = [{ + geometry_type: 'polyline', + shapes: [[[0, ~1]]] + }, { + geometry_type: 'point', + shapes: [[[3, 3]], [[1, 1]]] + }]; + var test = api.internal.getArcPresenceTest2(layers, new api.internal.ArcCollection(arcs)); + assert.strictEqual(test(0), true); + assert.strictEqual(test(~0), true); + assert.strictEqual(test(1), true); + assert.strictEqual(test(~1), true); + assert.strictEqual(test(2), false); + assert.strictEqual(test(~2), false); + assert.strictEqual(test(3), false); + }) + }) + describe('parseLocalPath()', function () { var path1 = "shapefiles/usa.shp"; it(path1, function () { diff --git a/test/pixel-transform-test.js b/test/pixel-transform-test.js new file mode 100644 index 000000000..68bab19ad --- /dev/null +++ b/test/pixel-transform-test.js @@ -0,0 +1,69 @@ +var assert = require('assert'), + api = require("../"), + util = require("./helpers.js"), + Bounds = api.internal.Bounds; + +describe('mapshaper-pixel-transform.js', function () { + + describe('calcOutputSizeInPixels()', function () { + var calcOutputSizeInPixels = api.internal.calcOutputSizeInPixels; + + it('max-height option limits height of relatively tall maps', function () { + var bounds = new Bounds(100, 200, 200, 400); + var opts = { + width: 10, + max_height: 10, + margin: 0 + }; + var bounds2 = calcOutputSizeInPixels(bounds, opts); + assert.deepEqual(bounds2.toArray(), [0, 0, 10, 10]) + assert.deepEqual(bounds.toArray(), [50, 200, 250, 400]); // equal padding left and right + }); + }) + + function test(opts, points, expectedPoints, expectedSize) { + var dataset = { + layers: [{ + geometry_type: 'point', + shapes: [points] + }] + }; + var size = api.internal.transformDatasetToPixels(dataset, opts); + var points2 = dataset.layers[0].shapes[0]; + expectedPoints.forEach(function(p, i) { + util.almostEqual(points2[i][0], p[0]); + util.almostEqual(points2[i][1], p[1]); + }); + if (expectedSize) { + assert.deepEqual(size, expectedSize); + } + } + + it ('width + margin + invert_y', function() { + var points = [[0, 0], [50, 50]]; + var opts = {width: 800, margin: 10, invert_y: true}; + var target = [[10, 790], [790, 10]]; + var size = test(opts, points, target, [800, 800]); + }) + + it ('svg_scale + margin + invert_y', function() { + var points = [[20, 20], [520, 270]]; // 2:1 aspect ratio + var opts = {svg_scale: 2, margin: 10, invert_y: true}; + var target = [[10, 135], [260, 10]]; + var size = test(opts, points, target, [270, 145]); + }) + + describe('parseMarginOption()', function () { + var parse = api.internal.parseMarginOption; + it('tests', function () { + assert.deepEqual(parse(''), [1,1,1,1]); + assert.deepEqual(parse(), [1,1,1,1]); + assert.deepEqual(parse(null), [1,1,1,1]); + assert.deepEqual(parse('0'), [0,0,0,0]); + assert.deepEqual(parse('3, 1'), [3,1,3,1]); + assert.deepEqual(parse('3 1 2'), [3,1,2,2]); + assert.deepEqual(parse('0,12,9,0'), [0,12,9,0]); + }) + }) + +}) \ No newline at end of file diff --git a/test/point-grid-test.js b/test/point-grid-test.js index 7e60b781b..ef269e380 100644 --- a/test/point-grid-test.js +++ b/test/point-grid-test.js @@ -3,6 +3,60 @@ var api = require('../'), describe('mapshaper-point-grid.js', function () { + describe('-point-grid command', function () { + + it('create a grid without importing a file using ', function (done) { + var cmd = '-point-grid bbox=10,10,20,20 2,2 -o out.json'; + api.applyCommands(cmd, {}, function(err, out) { + var json = JSON.parse(out['out.json']); + var expected = { + type: 'GeometryCollection', + geometries: [{ + type: 'Point', + coordinates: [12.5, 12.5] + }, { + type: 'Point', + coordinates: [17.5, 12.5] + }, { + type: 'Point', + coordinates: [12.5, 17.5] + }, { + type: 'Point', + coordinates: [17.5, 17.5] + }] + }; + assert.deepEqual(json, expected); + done(); + }) + }) + + it('create a grid without importing a file using interval=', function (done) { + var cmd = '-point-grid bbox=10,10,20,20 interval=5 -o out.json'; + api.applyCommands(cmd, {}, function(err, out) { + var json = JSON.parse(out['out.json']); + var expected = { + type: 'GeometryCollection', + geometries: [{ + type: 'Point', + coordinates: [12.5, 12.5] + }, { + type: 'Point', + coordinates: [17.5, 12.5] + }, { + type: 'Point', + coordinates: [12.5, 17.5] + }, { + type: 'Point', + coordinates: [17.5, 17.5] + }] + }; + assert.deepEqual(json, expected); + done(); + }) + }) + + }) + it('grid with rows, cols has margins', function() { var opts = { bbox: [0, 0, 2, 4], diff --git a/test/points-test.js b/test/points-test.js new file mode 100644 index 000000000..e4c323288 --- /dev/null +++ b/test/points-test.js @@ -0,0 +1,75 @@ +var assert = require('assert'), + api = require("../"); + +describe('mapshaper-points.js', function () { + + it ('interpolated points', function(done) { + var a = { + type: 'LineString', + coordinates: [[0, 0], [300, 0], [300, 300], [300, 310], [300, 311], [300, 600]] + }; + var expected = { + type: 'MultiPoint', + coordinates: [[0, 0], [200, 0], [300, 100], [300, 300], [300, 500], [300, 600]] + }; + api.applyCommands('-i a.json -points interpolated interval=200 -o', {'a.json': a}, function(err, output) { + var geom = JSON.parse(output['a.json']).geometries[0]; + assert.deepEqual(geom, expected); + done(); + }) + }) + + it ('interpolated points with interval in km', function(done) { + var a = { + type: 'LineString', + coordinates: [[100, 100], [100, 10000]] + }; + var expected = { + type: 'MultiPoint', + coordinates: [[100, 100], [100, 2100], [100, 4100], [100, 6100], [100, 8100], [100, 10000]] + }; + var cmd = '-i a.json -proj from=webmercator -points interpolated interval=2km -o'; + api.applyCommands(cmd, {'a.json': a}, function(err, output) { + var geom = JSON.parse(output['a.json']); + assert.deepEqual(geom.geometries[0], expected); + done(); + }) + }) + + it ('-points command with vertices option', function(done) { + var a = { + type: 'Polygon', + coordinates: [[[2, 2], [3, 2], [2, 1], [2, 2]]] + }; + var expected = { + type: 'GeometryCollection', + geometries: [{ + type: 'MultiPoint', + coordinates: [[2, 2], [3, 2], [2, 1]] + }] + }; + api.applyCommands('-i a.json -points vertices -o', {'a.json': a}, function(err, output) { + assert.deepEqual(JSON.parse(output['a.json']), expected); + done(); + }) + }) + + it ('-points command with vertices2 option', function(done) { + var a = { + type: 'Polygon', + coordinates: [[[2, 2], [3, 2], [2, 1], [2, 2]]] + }; + var expected = { + type: 'GeometryCollection', + geometries: [{ + type: 'MultiPoint', + coordinates: [[2, 2], [3, 2], [2, 1], [2, 2]] + }] + }; + api.applyCommands('-i a.json -points vertices2 -o', {'a.json': a}, function(err, output) { + assert.deepEqual(JSON.parse(output['a.json']), expected); + done(); + }) + }) + +}) diff --git a/test/polygon-mosaic-test.js b/test/polygon-mosaic-test.js index 26d0005fa..4ff9c2467 100644 --- a/test/polygon-mosaic-test.js +++ b/test/polygon-mosaic-test.js @@ -4,7 +4,7 @@ var assert = require('assert'), NodeCollection = api.internal.NodeCollection; describe('mapshaper-polygon-mosaic.js', function () { - + return; // TODO: restore these tests describe('buildPolygonMosaic()', function () { it ('works for single ring', function() { var coords = [[[0, 0], [0, 1], [1, 0], [0, 0]]]; diff --git a/test/polygons-test.js b/test/polygons-test.js new file mode 100644 index 000000000..93be5caee --- /dev/null +++ b/test/polygons-test.js @@ -0,0 +1,70 @@ +var api = require('../'), + assert = require('assert'), + helpers = require('./helpers.js'); + +describe('mapshaper-polygons.js', function () { + + it ('test 1: tic-tac-toe board', function(done) { + var input = { + type: 'MultiLineString', + coordinates: [ + [[1, 0], [1, 3]], + [[2, 0], [2, 3]], + [[3, 1], [0, 1]], + [[0, 2], [3, 2]] + ] + }; + var target = { + type: 'Polygon', + coordinates: [ [ [ 1, 1 ], [ 1, 2 ], [ 2, 2 ], [ 2, 1 ], [ 1, 1 ] ] ] + } + api.applyCommands('in.json -polygons -o out.json', {'in.json': input}, function(err, out) { + var poly = JSON.parse(out['out.json']).geometries[0]; + assert.deepEqual(poly, target); + done(); + }) + + }); + + it ('test 2: tic-tac-toe board with gaps', function(done) { + var input = { + type: 'MultiLineString', + coordinates: [ + [[1, 0], [1, 1.9]], + [[2, 1.1], [2, 3]], + [[3, 1], [1.1, 1]], + [[0, 2], [3, 2]] + ] + }; + var target = { + type: 'Polygon', + coordinates: [ [ [ 1, 1 ], [ 1, 2 ], [ 2, 2 ], [ 2, 1 ], [ 1, 1 ] ] ] + } + api.applyCommands('in.json -polygons gap-tolerance 0.11 -o out.json', {'in.json': input}, function(err, out) { + var poly = JSON.parse(out['out.json']).geometries[0]; + helpers.coordinatesAlmostEqual(poly.coordinates, target.coordinates, 1e-12); + done(); + }) + + }); + + it ('test 3: partially overlapping lines, gap', function(done) { + var input = { + type: 'MultiLineString', + coordinates: [ + [[1, 1], [1, 3], [3, 3]], + [[1, 2], [1, 1], [2, 1], [2, 3 - 1e-6]] + ] + }; + var target = { + type: 'Polygon', + coordinates: [[[1, 1], [1, 2], [1, 3], [2, 3], [2, 1], [1, 1]]] + } + api.applyCommands('in.json -polygons gap-tolerance=1e-5 -o out.json', {'in.json': input}, function(err, out) { + var poly = JSON.parse(out['out.json']).geometries[0]; + helpers.coordinatesAlmostEqual(poly.coordinates, target.coordinates, 1e-12); + done(); + }) + }) + +}); \ No newline at end of file diff --git a/test/proj-test.js b/test/proj-test.js new file mode 100644 index 000000000..18dddc839 --- /dev/null +++ b/test/proj-test.js @@ -0,0 +1,115 @@ + +var assert = require('assert'); +var api = require(".."); + +describe('mapshaper-proj.js', function() { + describe('-proj ', function() { + it('webmercator alias', function(done) { + api.applyCommands('-i test/test_data/three_points.shp -proj webmercator -o', + {}, function(err, output) { + assert(/Mercator/.test(output['three_points.prj'])); + done(); + }) + }) + + it('robinson alias', function(done) { + api.applyCommands('-i test/test_data/three_points.shp -proj robinson -o', + {}, function(err, output) { + assert(/Robinson/.test(output['three_points.prj'])); + done(); + }) + }) + }) + + describe('-proj from= tests', function () { + it('Assign projection to bare .shp file', function (done) { + var cmd = '-i test/test_data/two_states_merc_copy.shp -proj from="+proj=merc" +proj=robin -o robin.shp'; + api.applyCommands(cmd, null, function(err, output) { + assert(/Robinson/.test(output['robin.prj'])); + done(); + }) + }) + + it('from= sets CRS if no dest CRS is given', function (done) { + var cmd = '-i test/test_data/two_states_merc_copy.shp -proj from="+proj=merc" -o merc.shp'; + api.applyCommands(cmd, null, function(err, output) { + assert(/Mercator/.test(output['merc.prj'])); + done(); + }) + }) + + it('from= works even if dataset is empty', function (done) { + var input = {type: 'GeometryCollection', geometries: []}; + var cmd = '-i in.json -proj from="+proj=merc" -o merc.shp'; + api.applyCommands(cmd, {'in.json': input}, function(err, output) { + assert(/Mercator/.test(output['merc.prj'])); + done(); + }) + }) + + + it('Match a .prj file', function (done) { + var cmd = '-i test/test_data/two_states_merc_copy.shp -proj from="test/test_data/two_states_mercator.prj" +proj=robin -o robin.shp'; + api.applyCommands(cmd, null, function(err, output) { + assert(/Robinson/.test(output['robin.prj'])); + done(); + }) + }) + + it('Match a .prj file even if dataset is empty', function (done) { + var input = {type: 'GeometryCollection', geometries: []}; + var cmd = '-i in.json -proj from="test/test_data/two_states_mercator.prj" +proj=robin -o robin.shp'; + api.applyCommands(cmd, {'in.json': input}, function(err, output) { + assert(/Robinson/.test(output['robin.prj'])); + done(); + }) + }) + + }) + + describe('-proj match= tests', function () { + it('match= argument can be a .prj file', function(done) { + api.applyCommands('-i test/test_data/three_points.shp -proj match=test/test_data/two_states_mercator.prj -o', + {}, function(err, output) { + assert(/Mercator/.test(output['three_points.prj'])); + done(); + }) + }) + + it('source= is an alias for match= (TODO: phase this out)', function(done) { + api.applyCommands('-i test/test_data/three_points.shp -proj source=test/test_data/two_states_mercator.prj -o', + {}, function(err, output) { + assert(/Mercator/.test(output['three_points.prj'])); + done(); + }) + }) + + it('match= argument can be a layer name', function(done) { + api.applyCommands('-i test/test_data/two_states_mercator.shp name=states -i test/test_data/three_points.shp -proj match=states -o', + {}, function(err, output) { + assert(/Mercator/.test(output['three_points.prj'])); + done(); + }) + }) + + it('match= works even if dataset is empty', function(done) { + var empty = {type: 'GeometryCollection', geometries: []}; + api.applyCommands('-i test/test_data/two_states_mercator.shp name=states -i in.json -proj match=states -o format=shapefile', + {'in.json': empty}, function(err, output) { + assert(/Mercator/.test(output['in.prj'])); + done(); + }) + }) + + it('output copies .prj string from match= source', function(done) { + var prj = require('fs').readFileSync('test/test_data/two_states_mercator.prj', 'utf8'); + api.applyCommands('-i test/test_data/two_states_mercator.shp name=states -i test/test_data/three_points.shp -proj match=states -o', + {}, function(err, output) { + var prj2 = output['three_points.prj']; + assert.equal(prj2, prj); + done(); + }) + }) + + }) +}); diff --git a/test/projections-test.js b/test/projections-test.js index 4f87e231a..6e6bf5792 100644 --- a/test/projections-test.js +++ b/test/projections-test.js @@ -2,18 +2,19 @@ var assert = require('assert'); var api = require(".."); var mproj = require("mproj"); +var util = require('./helpers.js'); function roundtrip(proj, xy) { it (proj, function() { - var src = api.internal.getProjection('wgs84'); - var dest = api.internal.getProjection(proj); + var src = api.internal.getCRS('wgs84'); + var dest = api.internal.getCRS(proj); var fwd = api.internal.getProjTransform(src, dest); var inv = api.internal.getProjTransform(dest, src); var xy2 = fwd(xy[0], xy[1]); var xy3 = inv(xy2[0], xy2[1]); var e = 1e-7; - almostEqual(xy[0], xy3[0], e); - almostEqual(xy[1], xy3[1], e); + util.almostEqual(xy[0], xy3[0], e); + util.almostEqual(xy[1], xy3[1], e); }); } @@ -21,21 +22,28 @@ function roundtrip(proj, xy) { function invalid(proj) { it('invalid: ' + proj, function() { assert.throws(function() { - api.internal.getProjection(proj); + api.internal.getCRS(proj); }); }) } -function almostEqual(a, b, e) { - e = e || 1e-10; - if (Math.abs(a - b) < e) { - assert(true); - } else { - assert.equal(a, b) - } -} describe('mapshaper-projections.js', function() { + + describe('findProjLibs()', function() { + it('tests', function() { + assert.deepEqual(api.internal.findProjLibs('+init=epsg:4300 +init=esri:10099'), ['epsg', 'esri']); + assert.deepEqual(api.internal.findProjLibs('+proj=merc'), []); + assert.deepEqual(api.internal.findProjLibs('+init=epsg:4300 +init=dummy:10099 +init=epsg:1000'), ['epsg']); + }); + + it('Works with upper case library names (e.g. EPSG:1000', function() { + assert.deepEqual(api.internal.findProjLibs('+init=EPSG:4300 +init=ESRI:10099'), ['epsg', 'esri']); + }) + }); + + + describe('roundtrip tests', function () { roundtrip('albersusa', [-96, 40]); roundtrip('+proj=robin', [10, 0]); @@ -52,8 +60,8 @@ describe('mapshaper-projections.js', function() { describe('test aliases', function () { it('webmercator', function () { - var a = api.internal.getProjection('webmercator'); - var b = api.internal.getProjection('+proj=merc +a=6378137'); + var a = api.internal.getCRS('webmercator'); + var b = api.internal.getCRS('+proj=merc +a=6378137'); var lp = {lam: 0.3, phi: 0.2}; assert.deepEqual(mproj.pj_fwd(lp, a), mproj.pj_fwd(lp, b)); }) diff --git a/test/rectangle-test.js b/test/rectangle-test.js new file mode 100644 index 000000000..f688f57bd --- /dev/null +++ b/test/rectangle-test.js @@ -0,0 +1,90 @@ +var assert = require('assert'), + api = require("../"), + Bounds = api.internal.Bounds; + +describe('mapshaper-rectangle.js', function () { + + describe('applyAspectRatio()', function () { + var applyAspectRatio = api.internal.applyAspectRatio; + it('Handle max ratio', function () { + var bounds = new Bounds(1, 1, 4, 2); // wide box + applyAspectRatio(',1', bounds) + assert.deepEqual(bounds.toArray(), [1, 0, 4, 3]); + }) + + it('Handle min ratio', function () { + var bounds = new Bounds(1, 1, 2, 4); // tall box + applyAspectRatio('1,', bounds) + assert.deepEqual(bounds.toArray(), [0, 1, 3, 4]); + }) + + it('Handle fixed ratio', function () { + var bounds = new Bounds(0, 0, 2, 2); // tall box + applyAspectRatio('2', bounds); + assert.deepEqual(bounds.toArray(), [-1, 0, 3, 2]); + }) + + it('Handle min and max ratio 1', function () { + var bounds = new Bounds(0, 0, 2, 2); // tall box + applyAspectRatio('1,2', bounds); + assert.deepEqual(bounds.toArray(), [0, 0, 2, 2]); // box fits + }) + + it('Handle min and max ratio 2', function () { + var bounds = new Bounds(0, 0, 4, 1); // tall box + applyAspectRatio('1,2', bounds); + assert.deepEqual(bounds.toArray(), [0, -0.5, 4, 1.5]); // pad vertically + }) + + + it('Handle min and max ratio 3 -- min,max order reversed', function () { + var bounds = new Bounds(0, 0, 4, 1); // tall box + applyAspectRatio('2,1', bounds); + assert.deepEqual(bounds.toArray(), [0, -0.5, 4, 1.5]); // pad vertically + }) + }) + + it('Rectangles created using -rectangle source= are assigned CRS of source', function(done) { + var cmd = '-rectangle bbox=0,0,1,1 name=box1 -proj +proj=merc -rectangle source=box1 name=box2' + + ' -o target=box2 format=shapefile'; + api.applyCommands(cmd, {}, function(err, o) { + var prj = o['box2.prj'] || ''; + assert(prj.indexOf('Mercator') > -1); + done(); + }); + }); + + it ('create a rectangle using -rectangle bbox= and offset=', function(done) { + api.applyCommands('-rectangle bbox=1,1,4,4 offset=1 -o out.json', {}, function(err, out) { + var geom = JSON.parse(out['out.json']).geometries[0]; + assert.deepEqual(geom, { + type: 'Polygon', + coordinates: [[[0,0], [0,5], [5,5], [5,0], [0,0]]] + }); + done(); + }); + }) + + it ('create a rectangle from an existing layer with percentage offsets', function(done) { + var geom = { + type: 'LineString', + coordinates: [[0, 1], [1, 2], [2, 1], [1, 0]] + }; + api.applyCommands('-i in.json -rectangle offset=50%,100%,150%,200% -o out.json', + {'in.json': geom}, function(err, output) { + var geom = JSON.parse(output['out.json']); + var expect = { + type: 'Polygon', + coordinates: [[[-1, -2], [-1, 6], [5, 6], [5, -2], [-1, -2]]] + }; + assert.deepEqual(geom.geometries[0], expect); + done(); + }); + + + }) + + + + +}) diff --git a/test/rename-layers-test.js b/test/rename-layers-test.js index 5d466a175..ca4164a1d 100644 --- a/test/rename-layers-test.js +++ b/test/rename-layers-test.js @@ -3,6 +3,23 @@ var assert = require('assert'), describe('mapshaper-rename-layers.js', function () { + it ('Accept field names with spaces, in quotes', function(done) { + var csv = 'County FIPS,"State FIPS"\n10001,10'; + api.applyCommands('-i csv.csv -rename-fields "CFIPS=County FIPS,SFIPS=State FIPS" -o format=json', {'csv.csv': csv}, function(err, output) { + var json = JSON.parse(output['csv.json']); + assert.deepEqual(json, [{CFIPS: 10001, SFIPS: 10}]); + done(); + }); + }); + + it ('Accept field names with spaces, with alternate quotes', function(done) { + var csv = 'County FIPS,"State FIPS"\n10001,10'; + api.applyCommands('-i csv.csv -rename-fields CFIPS="County FIPS",SFIPS="State FIPS" -o format=json', {'csv.csv': csv}, function(err, output) { + var json = JSON.parse(output['csv.json']); + done(); + }); + }); + it ('All layers are targeted by default', function(done) { var a = { type: 'Polygon', @@ -45,6 +62,13 @@ describe('mapshaper-rename-layers.js', function () { assert.deepEqual(layers, [{name: 'layer1'}, {name: 'layer2'}]); }) + it ('use last name + count if more layers than names', function() { + var layers = [{}, {}, {}, {}], + names = ['counties', 'outline', 'innerlines']; + api.renameLayers(layers, names); + assert.deepEqual(layers, [{name: 'counties'}, {name: 'outline'}, {name: 'innerlines1'}, {name: 'innerlines2'}]); + }) + it ('ignore excess names', function() { var layers = [{}, {}], names = ['a', 'b', 'c']; diff --git a/test/require-test.js b/test/require-test.js new file mode 100644 index 000000000..0e9bfbbc2 --- /dev/null +++ b/test/require-test.js @@ -0,0 +1,25 @@ +var api = require('../'), + assert = require('assert'); + +describe('mapshaper-require.js', function () { + describe('-require command', function () { + it('require a named module and use it', function (done) { + var json = [{foo: 'bar'}]; + var cmd = '-i in.json -require underscore alias=_ -each "str = _.isString(foo)" -o out.json'; + api.applyCommands(cmd, {'in.json': json}, function(err, result) { + assert.deepEqual(JSON.parse(result['out.json']), [{foo: 'bar', str: true}]); + done(); + }); + }) + + it('require a module file and initialize it', function(done) { + var json = [{foo: 'bar'}]; + var cmd = '-i in.json name=info -require test/test_data/require/test_module.js \ + init="setName(target.layer.name)" -each "layer_name = getName()" -o out.json'; + api.applyCommands(cmd, {'in.json': json}, function(err, result) { + assert.deepEqual(JSON.parse(result['out.json']), [{foo: 'bar', layer_name: 'info'}]); + done(); + }); + }); + }) +}) diff --git a/test/rounding-test.js b/test/rounding-test.js index 673295759..4cecfe41a 100644 --- a/test/rounding-test.js +++ b/test/rounding-test.js @@ -107,6 +107,8 @@ describe('mapshaper-rounding.js', function () { }) describe('exporting rounded GeoJSON', function () { + // removing cleanup after rounding -- unreliable + /* it('removes a spike', function () { var json = { type: "GeometryCollection", @@ -176,6 +178,7 @@ describe('mapshaper-rounding.js', function () { api.internal.setCoordinatePrecision(dataset, 1); assert.deepEqual(dataset.layers[0].shapes, [null]); }); + */ it('bounding box is updated', function() { var json = { diff --git a/test/run-test.js b/test/run-test.js new file mode 100644 index 000000000..a8d02d3be --- /dev/null +++ b/test/run-test.js @@ -0,0 +1,23 @@ +var api = require('../'), + assert = require('assert'); + +describe('mapshaper-run.js', function () { + describe('-run command', function () { + it('supports creating a command on-the-fly and running it', function (done) { + var data = [{foo: 'bar'}]; + var include = '{ \ + getCommand: function(target) { \ + return "-rename-layers " + target.layer.name + "2"; \ + }}'; + var input = { + 'data.json': data, + 'include.js': include + }; + var cmd = '-i data.json -include include.js -run "getCommand(target)" -o'; + api.applyCommands(cmd, input, function(err, result) { + assert('data2.json' in result); + done(); + }) + }) + }) +}) \ No newline at end of file diff --git a/test/scalebar-test.js b/test/scalebar-test.js new file mode 100644 index 000000000..5397a11e4 --- /dev/null +++ b/test/scalebar-test.js @@ -0,0 +1,26 @@ +var api = require('../'), + assert = require('assert'); + +describe('mapshaper-scalebar.js', function () { + it('parseScalebarLabelToKm()', function () { + var toKm = 1.60934; + var parse = api.internal.parseScalebarLabelToKm; + assert.equal(parse('1 mile'), toKm); + assert.equal(parse('1 MILE'), toKm); + assert.equal(parse('1 / 2 MILE'), 1 / 2 * toKm); + assert.equal(parse('1/2 MILE'), 1 / 2 * toKm); + assert.equal(parse('0.5 MILE'), 0.5 * toKm); + assert.equal(parse('1km'), 1); + assert.equal(parse('1 kilometer'), 1); + assert.equal(parse('5 kilometres'), 5); + assert.equal(parse('1,000 KILOMETERS'), 1000); + }) + + it('formatDistanceLabelAsMiles()', function() { + var format = api.internal.formatDistanceLabelAsMiles; + assert.equal(format('1,000'), '1,000 MILES') + assert.equal(format('1'), '1 MILE') + assert.equal(format('1.5'), '1.5 MILES') + assert.equal(format('1/8'), '1/8 MILE') + }) +}) diff --git a/test/shape-test.js b/test/shape-test.js new file mode 100644 index 000000000..be15d3c6e --- /dev/null +++ b/test/shape-test.js @@ -0,0 +1,39 @@ +var assert = require('assert'), + api = require("../"); + +describe('mapshaper-shape.js', function () { + + it ('create a polyline', function(done) { + api.applyCommands('-shape coordinates=10,10 offsets=0,10,10,0,0,-10 -o out.json', {}, function(err, output) { + var line = JSON.parse(output['out.json']).geometries[0]; + assert.deepEqual(line, { + type: 'LineString', + coordinates: [[10,10], [10,20], [20,20], [20,10]] + }) + done(); + }) + }) + + it ('create a polygon with closed and offsets= option', function(done) { + api.applyCommands('-shape coordinates=10,10 offsets=0,10,10,0,0,-10 closed -o out.json', {}, function(err, output) { + var line = JSON.parse(output['out.json']).geometries[0]; + assert.deepEqual(line, { + type: 'Polygon', + coordinates: [[[10,10], [10,20], [20,20], [20,10], [10,10]]] + }) + done(); + }) + }) + + it ('create a polygon from coordinates', function(done) { + api.applyCommands('-shape coordinates=10,10,10,20,20,20,20,10,10,10 -o out.json', {}, function(err, output) { + var line = JSON.parse(output['out.json']).geometries[0]; + assert.deepEqual(line, { + type: 'Polygon', + coordinates: [[[10,10], [10,20], [20,20], [20,10], [10,10]]] + }) + done(); + }) + }) + +}) diff --git a/test/shapefile-test.js b/test/shapefile-test.js index e00a613c5..7b151a7a3 100644 --- a/test/shapefile-test.js +++ b/test/shapefile-test.js @@ -19,6 +19,16 @@ describe('mapshaper-shapefile.js', function () { }) describe('.prj tests', function() { + + it('prj is exported even if mapshaper can not parse it (Issue #193)', function() { + var data = api.importFile(fixPath('test_data/issues/193/three_points.shp'), {}); + var files = api.internal.exportFileContent(data, {}); + var prj = Utils.find(files, function(o) { + return o.filename == 'three_points.prj'; + }); + assert.equal(prj && prj.filename, 'three_points.prj'); + }); + it('prj is exported if input prj is present', function() { var data = api.importFile(fixPath('test_data/three_points.shp'), {}); var files = api.internal.exportFileContent(data, {}); @@ -27,6 +37,39 @@ describe('mapshaper-shapefile.js', function () { }); assert.equal(prj && prj.filename, 'three_points.prj'); }); + + it('prj is exported if data is reprojected to "webmercator"', function(done) { + api.applyCommands('-i test/test_data/three_points.shp -proj webmercator -o', {}, function(err, output) { + var prj = output['three_points.prj'] + assert(/Pseudo-Mercator/.test(prj)); + done(); + }); + }); + + it('Albers WKT is exported if data is reprojected to "albersusa"', function(done) { + api.applyCommands('-i test/test_data/three_points.shp -proj albersusa -o', {}, function(err, output) { + var prj = output['three_points.prj'] + assert(/Albers/.test(prj)); + done(); + }); + }); + + it('WGS84 prj is generated if input is unprojected GeoJSON', function(done) { + api.applyCommands('-i test/test_data/three_points.geojson -o format=shapefile', {}, function(err, output) { + var prj = output['three_points.prj'] + assert(/WGS84/.test(prj)); + done(); + }); + }); + + it('No prj is generated if CRS has no WKT equivalent', function(done) { + api.applyCommands('-i test/test_data/three_points.geojson -proj +proj=boggs -o format=shapefile', {}, function(err, output) { + var prj = output['three_points.prj'] + assert(!err && !prj); + done(); + }); + }); + }) describe('Export and import layers containing data but no shapes', function () { @@ -49,9 +92,86 @@ describe('mapshaper-shapefile.js', function () { }) }) - describe('Import/Export rountrip tests', function() { + describe('GeoJSON -> Shapefile -> GeoJSON roundtrip tests', function() { + + it ('Point type dataset (testing shp type 1 output)', function(done) { + var input = { + type: 'FeatureCollection', + features: [{ + type: 'Feature', + properties: { + name: 'alpha', + value: 94.3 + }, + geometry: { + type: 'Point', + coordinates: [-35.8, 22.4] + } + }, { + type: 'Feature', + properties: { + name: 'beta', + value: 0 + }, + geometry: { + type: 'Point', + coordinates: [10.2, -55.1] + } + }] + }; + roundtrip(input, done); + }); + it ('Mixed point type dataset', function(done) { + var input = { + type: 'FeatureCollection', + features: [{ + type: 'Feature', + properties: { + name: 'alpha', + value: 94.3 + }, + geometry: { + type: 'Point', + coordinates: [-35.8, 22.4] + } + }, { + type: 'Feature', + properties: { + name: 'beta', + value: 0 + }, + geometry: { + type: 'MultiPoint', + coordinates: [[10.2, -55.1], [-180, -90]] + } + }] + }; + roundtrip(input, done); + }); + function fail(err) { + assert(false, err); + } + + function roundtrip(input, done) { + toShapefile(input, function(err, output) { + if (err) fail(err); + toGeoJSON(output, function(err, output) { + if (err) fail(err); + assert.deepEqual(JSON.parse(output['output.json']), input); + done(); + }); + }); + } + + function toShapefile(input, cb) { + api.applyCommands('-i input.json -o output.shp', {'input.json': input}, cb); + } + + function toGeoJSON(input, cb) { + api.applyCommands('-i output.shp -o output.json format=geojson', input, cb); + } }) describe('Export/Import roundtrip tests', function () { @@ -91,8 +211,10 @@ describe('mapshaper-shapefile.js', function () { function shapefileRoundTrip(fname) { var data = api.importFile(fixPath(fname), {encoding: 'ascii'}); var files = api.internal.exportFileContent(data, {encoding: 'ascii', format:"shapefile"}); - - var data2 = api.internal.importFileContent(files[0].content, fname, {encoding: 'ascii'}); + var input2 = { + shp: {filename: fname, content: files[0].content}, + shx: {content: files[1].content}}; + var data2 = api.internal.importContent(input2, {encoding: 'ascii'}); var files2 = api.internal.exportFileContent(data2, {encoding: 'ascii', format:"shapefile"}); assert.ok(Utils.buffersAreIdentical(files[0].content, files2[0].content)); diff --git a/test/simplify-test.js b/test/simplify-test.js index 303dba388..21c801390 100644 --- a/test/simplify-test.js +++ b/test/simplify-test.js @@ -4,6 +4,91 @@ var assert = require('assert'), describe("mapshaper-simplify.js", function() { + describe('convertSimplifyInterval', function () { + it('wgs84 / km', function () { + var input = { + type: 'LineString', + coordinates: [[-100, 40], [-101, 42], [-105, 47]] + } + var dataset = api.internal.importGeoJSON(input, {}); + var interval = api.internal.convertSimplifyInterval('0.5km', dataset, {}); + assert.equal(interval, 500) + }) + + it('Error: wgs84 / km / planar', function() { + assert.throws(function() { + var input = { + type: 'LineString', + coordinates: [[-100, 40], [-101, 42], [-105, 47]] + } + var dataset = api.internal.importGeoJSON(input, {}); + var interval = api.internal.convertSimplifyInterval('0.5km', dataset, {planar: true}); + }); + }) + + it('wgs84 / [no units] / planer', function() { + var input = { + type: 'LineString', + coordinates: [[-100, 40], [-101, 42], [-105, 47]] + } + var dataset = api.internal.importGeoJSON(input, {}); + var interval = api.internal.convertSimplifyInterval(3, dataset, {planar: true}); + assert.equal(interval, 3) + }) + }) + + describe('-simplify target= option', function () { + // TODO: change this behavior + it('targeting one layer in a dataset simplifies all layers in the dataset', function (done) { + var a = { + type: 'LineString', + coordinates: [[0, 0], [0, 1], [1, 1]] + }; + var b = { + type: 'LineString', + coordinates: [[2, 0], [2, 1], [3, 1]] + } + var cmd = '-i a.json b.json combine-files -simplify target=a 5% -o target=*'; + api.applyCommands(cmd, {'a.json': a, 'b.json': b}, function(err, out) { + var a = JSON.parse(out['a.json']); + var b = JSON.parse(out['b.json']); + assert.deepEqual(a.geometries[0].coordinates, [[0, 0], [1, 1]]); + assert.deepEqual(b.geometries[0].coordinates, [[2, 0], [3, 1]]); + done(); + }); + }) + }) + + + describe('-simplify resolution= option', function () { + + it('resolution=100x100', function (done) { + var input = { + type: 'LineString', + coordinates: [[0, 0], [0, 1], [1, 1], [1, 2]] + } + api.applyCommands('-i line.json -simplify resolution=100x100 -o', {'line.json': input}, function(err, out) { + var output = JSON.parse(out['line.json']); + assert.deepEqual(output.geometries[0], input); + done(); + }) + }) + }) + + describe('Fix: -simplify 0% removes all removable vertices', function () { + it('-simplify planar 0%', function (done) { + var input = { + type: 'LineString', + coordinates: [[0,0], [0,1], [0.1, 1.1], [0, 1.2], [0, 2]] + }; + api.applyCommands('-i in.json -simplify planar 0% -o out.json', {'in.json': input}, function(err, output) { + var json = JSON.parse(output['out.json']); + assert.deepEqual(json.geometries[0].coordinates, [[0,0], [0, 2]]); + done(); + }) + }) + }) + describe('simplify() can be re-applied', function () { it('test 1', function(done) { @@ -35,26 +120,26 @@ describe("mapshaper-simplify.js", function() { }) - describe('simplify() creates database.info.simplify object', function () { + describe('simplify() creates dataset.info.simplify object', function () { it('default method, auto-detect spherical', function () { var arcs = new api.internal.ArcCollection([[[180, 90], [-180, -90]]]); var dataset = {arcs: arcs}; - api.simplify(dataset); - assert.deepEqual(dataset.info.simplify, {method: 'weighted_visvalingam', spherical: true}); + api.simplify(dataset, {percentage: 1}); + assert.deepEqual(dataset.info.simplify, {method: 'weighted_visvalingam', spherical: true, percentage: 1}); }) it('Douglas-Peucker, auto-detect planar', function () { var arcs = new api.internal.ArcCollection([[[0, 100], [100, 100]]]); var dataset = {arcs: arcs}; - api.simplify(dataset, {method: 'dp'}); - assert.deepEqual(dataset.info.simplify, {method: 'dp', spherical: false}); + api.simplify(dataset, {method: 'dp', percentage: 0.5}); + assert.deepEqual(dataset.info.simplify, {method: 'dp', spherical: false, percentage: 0.5}); }) it('unweighted Visvalingam, explicit planar', function () { var arcs = new api.internal.ArcCollection([[[0, 0], [1, -1]]]); var dataset = {arcs: arcs}; - api.simplify(dataset, {method: 'visvalingam', planar: true}); - assert.deepEqual(dataset.info.simplify, {method: 'visvalingam', spherical: false, planar: true}); + api.simplify(dataset, {method: 'visvalingam', planar: true, percentage: 0}); + assert.deepEqual(dataset.info.simplify, {method: 'visvalingam', spherical: false, planar: true, percentage: 0}); }) }) @@ -108,6 +193,12 @@ describe("mapshaper-simplify.js", function() { it('parse grid', function () { assert.deepEqual(api.internal.parseSimplifyResolution('100x200'), [100, 200]); }) + it('parse grid (comma delim)', function () { + assert.deepEqual(api.internal.parseSimplifyResolution('100,200'), [100, 200]); + }) + it('parse grid (space delim)', function () { + assert.deepEqual(api.internal.parseSimplifyResolution('100 200'), [100, 200]); + }) it('parse partial grid', function () { assert.deepEqual(api.internal.parseSimplifyResolution('x200'), [0, 200]); assert.deepEqual(api.internal.parseSimplifyResolution('100x'), [100, 0]); diff --git a/test/snapping-test.js b/test/snapping-test.js index 238fae861..729894214 100644 --- a/test/snapping-test.js +++ b/test/snapping-test.js @@ -28,6 +28,34 @@ describe('mapshaper-snapping.js', function () { }) */ + describe('-i snap', function () { + it('polyline A, outside threshold', function (done) { + var input = { + type: 'LineString', + coordinates: [[0, 0], [0.1, 0.1], [1, 1]] + }; + api.applyCommands('-i snap-interval=0.11 line.json -o', {'line.json': input}, function(err, data) { + var output = JSON.parse(data['line.json']); + assert.deepEqual(output.geometries[0].coordinates, input.coordinates); + done(); + }); + }) + + + it('polyline A, inside threshold', function (done) { + var input = { + type: 'LineString', + coordinates: [[0, 0], [0.05, 0.05], [0.1, 0.1], [1, 1], [1.1, 1.1]] + }; + api.applyCommands('-i snap-interval=0.2 line.json -o', {'line.json': input}, function(err, data) { + var output = JSON.parse(data['line.json']); + assert.deepEqual(output.geometries[0].coordinates, [[0, 0], [1, 1]]); + done(); + }); + }) + + }) + describe('sortCoordinateIds()', function () { it('test 2', function () { diff --git a/test/sort-test.js b/test/sort-test.js index 9a5366c41..d5dee742c 100644 --- a/test/sort-test.js +++ b/test/sort-test.js @@ -2,6 +2,14 @@ var assert = require('assert'), api = require("../"); describe('mapshaper-sort.js', function () { + it ('sort is stable across multiple calls', function(done) { + var csv = 'name,rank\nbeta,0\nzeta,1\nalpha,0\ngamma,1\ndelta,1\ntheta,0'; + var target = 'name,rank\ndelta,1\ngamma,1\nzeta,1\nalpha,0\nbeta,0\ntheta,0'; + api.applyCommands('in.csv -sort name -sort rank descending -o out.csv', {'in.csv': csv}, function(err, output) { + assert.equal(output['out.csv'], target); + done(); + }) + }) it ('sort ascending on data field', function() { var data = new api.internal.DataTable([{foo: -1}, {foo: 5}, {foo: 4}]), diff --git a/test/spatial-join-test.js b/test/spatial-join-test.js index f6b9f2b3e..a2f2e97bb 100644 --- a/test/spatial-join-test.js +++ b/test/spatial-join-test.js @@ -4,6 +4,94 @@ var api = require('../'), DataTable = api.internal.DataTable; describe('mapshaper-spatial-join.js', function () { + describe('Bug fix: need to handle congruent / overlapping polygons', function () { + + it('join point to two congruent polygons', function(done) { + var polygons = { + type: 'GeometryCollection', + geometries: [{ + type: 'Polygon', + coordinates: [[[0,0], [0,1], [1,1], [1,0], [0,0]]] + }, { + type: 'Polygon', + coordinates: [[[0,0], [0,1], [1,1], [1,0], [0,0]]] + }] + }; + var point = { + type: 'Feature', + properties: {a: 'foo'}, + geometry: { + type: "Point", coordinates: [0.5, 0.5] + } + }; + + api.applyCommands('-i point.json -i polygons.json -join point -o output.json', + {'polygons.json': polygons, 'point.json': point}, function(err, o) { + var out = JSON.parse(o['output.json']); + assert.deepEqual(out.features[0].properties, {a: 'foo'}); + assert.deepEqual(out.features[1].properties, {a: 'foo'}); + done(); + }); + }); + + + it('join two congruent polygons to point', function(done) { + var polygons = { + type: 'FeatureCollection', + features: [{ + type: 'Feature', + properties: {foo: 2}, + geometry: { + type: 'Polygon', + coordinates: [[[0,0], [0,1], [1,1], [1,0], [0,0]]] + } + }, { + type: 'Feature', + properties: {foo: 3}, + geometry: { + type: 'Polygon', + coordinates: [[[0,0], [0,1], [1,1], [1,0], [0,0]]] + } + }] + }; + var point = { + type: 'Feature', + properties: {id: "bar"}, + geometry: { + type: "Point", coordinates: [0.5, 0.5] + } + }; + + api.applyCommands('-i polygons.json -i point.json -join polygons calc="foo = sum(foo)" -o output.json', + {'polygons.json': polygons, 'point.json': point}, function(err, o) { + var out = JSON.parse(o['output.json']); + assert.deepEqual(out.features[0].properties, {id: 'bar', foo: 5}); + done(); + }); + }); + + }) + + + describe('point-to-point join', function() { + it('simple one-point join', function(done) { + var a = { + type: 'Point', + coordinates: [1, 1] + }; + var b = { + type: 'Feature', + properties: {id: 'foo'}, + geometry: {type: 'Point', coordinates: [1, 1]} + }; + api.applyCommands('-i a.json -join b.json -o', {'a.json': a, 'b.json': b}, function(err, output) { + var features = JSON.parse(output['a.json']).features; + assert.deepEqual(features[0].properties, {id: 'foo'}); + done(); + }); + }); + + }); describe('joinPointsToPolygons()', function () { it('simple point to polygon join', function () { @@ -25,6 +113,7 @@ describe('mapshaper-spatial-join.js', function () { assert.deepEqual(target.layers[0].data.getRecords(), [{foo: 'a'}] ) }) + it('join several points to polygon', function () { var arcs = [[[0, 0], [0, 1], [1, 1], [1, 0], [0, 0]]]; var target = { @@ -41,7 +130,7 @@ describe('mapshaper-spatial-join.js', function () { }; var opts = {calc: "joins = _.count(), total=sum(count)"}; api.joinPointsToPolygons(target.layers[0], target.arcs, src, opts); - assert.deepEqual(target.layers[0].data.getRecords(), [{total: 4, joins: 2}] ) + assert.deepEqual(target.layers[0].data.getRecords(), [{total: 4, joins: 2, foo: 'a', count: 1}] ) }) it('simple polygon to point join', function () { diff --git a/test/split-on-grid-test.js b/test/split-on-grid-test.js index ed45133ac..d0d4a62b5 100644 --- a/test/split-on-grid-test.js +++ b/test/split-on-grid-test.js @@ -2,8 +2,8 @@ var assert = require('assert'), api = require("../"); describe('mapshaper-split-on-grid.js', function () { - describe('splitLayerOnGrid()', function (done) { - it('assign cell id to layer containing one point', function () { + describe('splitLayerOnGrid()', function () { + it('assign cell id to layer containing one point', function (done) { var geojson = { type: 'Point', coordinates: [1, 1] @@ -25,7 +25,7 @@ describe('mapshaper-split-on-grid.js', function () { }) }) - it('Split point layer into two layers', function () { + it('Split point layer into two layers', function (done) { var geojson = { type: "GeometryCollection", geometries: [{ @@ -50,8 +50,12 @@ describe('mapshaper-split-on-grid.js', function () { }] }]; - api.applyCommands('-split-on-grid 2,2', geojson, function(err, data) { - assert.deepEqual(JSON.parse(data), target); + api.applyCommands('-i data.json -split-on-grid 2,2 -o', {'data.json': geojson}, function(err, out) { + var a = JSON.parse(out['r0c0.json']); + var b = JSON.parse(out['r1c1.json']); + + assert.deepEqual(a, target[0]); + assert.deepEqual(b, target[1]); done(); }); diff --git a/test/svg-stringify-test.js b/test/svg-stringify-test.js new file mode 100644 index 000000000..fde47a375 --- /dev/null +++ b/test/svg-stringify-test.js @@ -0,0 +1,62 @@ + +var api = require('../'), + SVG = api.internal.svg, + assert = require('assert'); + +describe('svg-stringfy.js', function () { + + describe('SVG.stringify()', function () { + it('g element, no children', function () { + var obj = {tag: 'g'}; + assert.equal(SVG.stringify(obj), ''); + }) + + it('path element', function() { + var obj = {tag: 'path', properties: {d: 'M 0 0 1 1'}}; + assert.equal(SVG.stringify(obj), '') + }) + + it('null and undefined properties are omitted', function() { + var obj = {tag: 'circle', properties: { + cx: 144, cy: 380, r: 5, stroke: undefined, fill: undefined, 'stroke-width': null + }}; + var expect = ''; + assert.equal(SVG.stringify(obj), expect); + }) + + it('group inside a group', function() { + var obj = { + tag: 'g', + children: [{ + tag: 'g' + }] + } + assert.equal(SVG.stringify(obj), '\n\n'); + }); + + it('group of two circles', function() { + var obj = { + tag: 'g', + properties: {id: 0}, + children: [{ + tag: 'circle', + properties: { + cx: 0, + cy: 1 + } + }, { + tag: 'circle', + properties: { + cx: 1, + cy: 0 + } + }] + }; + var target = '\n' + + '\n' + + '\n' + + ''; + assert.equal(SVG.stringify(obj), target); + }) + }) +}) \ No newline at end of file diff --git a/test/svg-style-test.js b/test/svg-style-test.js index aa2c927df..da728bff8 100644 --- a/test/svg-style-test.js +++ b/test/svg-style-test.js @@ -2,6 +2,32 @@ var api = require('../'), assert = require('assert'); describe('mapshaper-svg-style.js', function () { + + describe('command line tests', function() { + it('-svg-style (old name) works', function(done) { + var input = [{ + name: 'foo' + }]; + api.applyCommands('-i data.json -svg-style r=2 -o', {'data.json': input}, function(err, out) { + var result = JSON.parse(out['data.json']); + assert.deepEqual(result, [{name: 'foo', r: 2}]); + done(); + }); + }) + + it('-style (new name) works', function(done) { + var input = [{ + name: 'foo' + }]; + api.applyCommands('-i data.json -style r=2 -o', {'data.json': input}, function(err, out) { + var result = JSON.parse(out['data.json']); + assert.deepEqual(result, [{name: 'foo', r: 2}]); + done(); + }); + }) + }) + + describe('isSvgColor()', function () { var isSvgColor = api.internal.isSvgColor; it('hits', function () { @@ -12,7 +38,6 @@ describe('mapshaper-svg-style.js', function () { assert(isSvgColor('rgba(0, 255, 92, 0.2)')) }) it('misses', function() { - assert.equal(isSvgColor('area', ['population', 'area']), false) assert.equal(isSvgColor('#'), false) assert.equal(isSvgColor('33'), false) }) @@ -42,7 +67,6 @@ describe('mapshaper-svg-style.js', function () { assert(isSvgClassName('class-0')) }) it('misses', function () { - assert.equal(isSvgClassName('somefield', ['somefield']), false) assert.equal(isSvgClassName('-somevar'), false) assert.equal(isSvgClassName(''), false) assert.equal(isSvgClassName('5'), false) @@ -57,7 +81,7 @@ describe('mapshaper-svg-style.js', function () { }; var opts = { stroke: 'baz', - stroke_width: 'foo / 2', + 'stroke-width': 'foo / 2', fill: 'bar == "a" ? "pink" : "green"' }; var target = [{ @@ -65,14 +89,14 @@ describe('mapshaper-svg-style.js', function () { bar: 'a', baz: 'white', stroke: 'white', - stroke_width: 1, + 'stroke-width': 1, fill: 'pink' }, { foo: 0.5, bar: 'b', baz: 'black', stroke: 'black', - stroke_width: 0.25, + 'stroke-width': 0.25, fill: 'green' }]; api.svgStyle(lyr, {}, opts); @@ -86,12 +110,12 @@ describe('mapshaper-svg-style.js', function () { }; var opts = { stroke: '#222222', - stroke_width: '4', + 'stroke-width': '4', fill: 'rgba(255,255,255,0.2)' }; var target = [{ stroke: '#222222', - stroke_width: 4, + 'stroke-width': 4, fill: 'rgba(255,255,255,0.2)' }]; api.svgStyle(lyr, {}, opts); diff --git a/test/svg-test.js b/test/svg-test.js index e79ea4ce5..8c425ce27 100644 --- a/test/svg-test.js +++ b/test/svg-test.js @@ -4,6 +4,75 @@ var api = require('../'), describe('mapshaper-svg.js', function () { + describe('exportDatasetForSVG()', function () { + it('export label properties', function () { + var lyr = { + name: 'labels', + geometry_type: 'point', + shapes: [[[0, 0]], [[1, 1]]], + data: new api.internal.DataTable([{ + dx: 5, + dy: -6, + 'label-text': 'TEXAS', + 'font-size': '13', + 'text-anchor': 'start' + }, { + dx: -5, + dy: -6, + 'label-text': 'OKLA.', + 'font-size': '13', + 'text-anchor': 'end' + }]) + }; + var dataset = { + layers: [lyr], + info: {} + }; + + var target= { + tag: 'g', + properties: { + id: 'labels', + 'font-family': 'sans-serif', + 'font-size': '12', + 'text-anchor': 'middle' + }, + children: [{ + tag: 'text', + value: 'TEXAS', + properties: { + //x: 0, + //y: 0, + //dx: 5, + //dy: -6, + transform: 'translate(0 0)', + x: 5, + y: -6, + 'font-size': '13', + 'text-anchor': 'start' + } + }, { + tag: 'text', + value: 'OKLA.', + properties: { + // x: 1, + // y: 1, + // dx: -5, + // dy: -6, + transform: 'translate(1 1)', + x: -5, + y: -6, + 'font-size': '13', + 'text-anchor': 'end' + } + }] + }; + + var output = api.internal.exportLayerForSVG(lyr, dataset, {}); + assert.deepEqual(output, target); + }); + }) + it ('default scaling w/ 1px margin, single point', function(done) { var geo = { type: 'Feature', diff --git a/test/target-test.js b/test/target-test.js index 028c3ae82..ed326d51e 100644 --- a/test/target-test.js +++ b/test/target-test.js @@ -29,19 +29,58 @@ describe('mapshaper-target.js', function () { }) }) + it('-target name= option renames target layer', function(done) { + var cmd = "-i test/test_data/three_points.shp -target 1 name=a -o format=geojson"; + api.applyCommands(cmd, {}, function(err, output) { + var a = JSON.parse(output['a.json']); + assert.equal(a.type, 'FeatureCollection'); + done(); + }) + }) + it('error if no layer is matched', function(done) { var cmd = "-i test/test_data/three_points.shp -target states"; api.runCommands(cmd, function(err) { - assert.equal(err.name, 'APIError'); + assert.equal(err.name, 'UserError'); done(); }) }) - it('error if multiple layers are matched', function(done) { - var cmd = "-i test/test_data/three_points.shp -i test/test_data/three_points.shp -target three_points"; - api.runCommands(cmd, function(err) { - assert.equal(err.name, 'APIError'); + it('layers on separate datasets can be matched', function(done) { + var cmd = "-i test/test_data/three_points.shp -i test/test_data/three_points.shp \ + -rename-layers layer1,layer2 -target * -o format=geojson"; + api.applyCommands(cmd, function(err, output) { + assert('layer1.json' in output); + assert('layer2.json' in output); done(); }) }) + + it('select target by type', function(done) { + var cmd = "-i test/test_data/issues/177/mixed_feature.json -target type=point -o point.json"; + var target = { + "type": "FeatureCollection", + "features": [{ + "type": "Feature", + "properties": {"name": "A"}, + "geometry": { + "type": "MultiPoint", + "coordinates": [[0, 1], [2, 3]] + } + }] + }; + api.applyCommands(cmd, {}, function(err, output) { + assert.deepEqual(JSON.parse(output['point.json']), target); + done(); + }) + }) + + it('select target by type and target=', function(done) { + var cmd = "-i test/test_data/issues/177/mixed_feature.json name=features -target features type=point -o point.json"; + api.applyCommands(cmd, {}, function(err, output) { + assert(!!output['point.json']); + done(); + }) + }) + }) \ No newline at end of file diff --git a/test/target-utils-test.js b/test/target-utils-test.js index 9bb8835a1..2af857131 100644 --- a/test/target-utils-test.js +++ b/test/target-utils-test.js @@ -8,46 +8,46 @@ describe('mapshaper-target-utils.js', function () { var layers = [{name: 'layer1'}, {name: 'layer2'}]; assert.deepEqual(api.internal.findMatchingLayers(layers, 'layer1'), - [{name: 'layer1', match_id: 0}, {name: 'layer2', match_id: -1}]); + [{name: 'layer1', target_id: 0}]); }) it("missing layer", function() { var layers = [{name: 'layer1'}, {name: 'layer2'}]; assert.deepEqual(api.internal.findMatchingLayers(layers, 'layer3'), - [{name: 'layer1', match_id: -1}, {name: 'layer2', match_id: -1}]); + []); }); it("comma sep. + wildcard", function() { var layers = [{name: 'layer1'}, {name: 'layer2'}, {name: 'points'}, {name: 'polygons'}]; assert.deepEqual(api.internal.findMatchingLayers(layers, 'points,layer*'), - [{name: 'layer1', match_id: 1}, {name: 'layer2', match_id: 2}, - {name: 'points', match_id: 0}, {name: 'polygons', match_id: -1}]); + [{name: 'points', target_id: 0}, {name: 'layer1', target_id: 1}, {name: 'layer2', target_id: 2} + ]); }) it("all layers (*)", function() { var layers = [{name: 'layer1'}, {name: 'layer2'}, {name: 'points'}, {name: 'polygons'}]; assert.deepEqual(api.internal.findMatchingLayers(layers, '*'), - [{name: 'layer1', match_id: 0}, {name: 'layer2', match_id: 1}, - {name: 'points', match_id: 2}, {name: 'polygons', match_id: 3}]); + [{name: 'layer1', target_id: 0}, {name: 'layer2', target_id: 1}, + {name: 'points', target_id: 2}, {name: 'polygons', target_id: 3}]); }) it("numerically indexed layers", function() { var layers = [{name: 'layer1'}, {name: 'layer2'}, {name: 'points'}, {name: 'polygons'}]; - assert.deepEqual(api.internal.findMatchingLayers(layers, '1,3'), - [{name: 'layer1', match_id: 0}, {name: 'layer2', match_id: -1}, - {name: 'points', match_id: 1}, {name: 'polygons', match_id: -1}]); + var matches = api.internal.findMatchingLayers(layers, '1,3'); + assert.deepEqual(matches, + [{name: 'layer1', target_id: 0}, {name: 'points', target_id: 1}]); }) it("no dupes", function() { var layers = [{name: 'points'}, {name: 'layer2'}]; assert.deepEqual(api.internal.findMatchingLayers(layers, '2,layer2,layer*,2'), - [{name: 'points', match_id: -1}, {name: 'layer2', match_id: 0}]); + [{name: 'layer2', target_id: 0}]); }) it("layers with same suffix", function() { var layers = [{name: 'cz'}, {name: 'cz-points'}]; assert.deepEqual(api.internal.findMatchingLayers(layers, 'cz'), - [{name: 'cz', match_id: 0}, {name: 'cz-points', match_id: -1}]) + [{name: 'cz', target_id: 0}]) }) }) diff --git a/test/test_data/dbf/ne_10m_time_zones.dbf b/test/test_data/dbf/ne_10m_time_zones.dbf new file mode 100755 index 000000000..3c4f99559 Binary files /dev/null and b/test/test_data/dbf/ne_10m_time_zones.dbf differ diff --git a/test/test_data/issues/177/mixed_feature.json b/test/test_data/issues/177/mixed_feature.json new file mode 100644 index 000000000..c7208b52f --- /dev/null +++ b/test/test_data/issues/177/mixed_feature.json @@ -0,0 +1,26 @@ + +{ + "type": "FeatureCollection", + "features": [{ + "type": "Feature", + "properties": {"name": "A"}, + "geometry": { + "type": "MultiPoint", + "coordinates": [[0, 1], [2, 3]] + } + }, { + "type": "Feature", + "properties": {"name": "B"}, + "geometry": { + "type": "LineString", + "coordinates": [[0, 1], [2, 3], [4, 5]] + } + },{ + "type": "Feature", + "properties": {"name": "C"}, + "geometry": { + "type": "Polygon", + "coordinates": [[[0, 1], [1, 1], [0, 0], [0, 1]]] + } + }] +} diff --git a/test/test_data/issues/193/gauss_kruger.prj b/test/test_data/issues/193/gauss_kruger.prj new file mode 100755 index 000000000..90247a2dd --- /dev/null +++ b/test/test_data/issues/193/gauss_kruger.prj @@ -0,0 +1 @@ +PROJCS["Beijing_1954_3_Degree_GK_CM_114E",GEOGCS["GCS_Beijing_1954",DATUM["D_Beijing_1954",SPHEROID["Krasovsky_1940",6378245.0,298.3]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Gauss_Kruger"],PARAMETER["False_Easting",500000.0],PARAMETER["False_Northing",0.0],PARAMETER["Central_Meridian",114.0],PARAMETER["Scale_Factor",1.0],PARAMETER["Latitude_Of_Origin",0.0],UNIT["Meter",1.0]] \ No newline at end of file diff --git a/test/test_data/issues/193/gauss_kruger.shp b/test/test_data/issues/193/gauss_kruger.shp new file mode 100644 index 000000000..49bc233a7 Binary files /dev/null and b/test/test_data/issues/193/gauss_kruger.shp differ diff --git a/test/test_data/issues/193/three_points.dbf b/test/test_data/issues/193/three_points.dbf new file mode 100644 index 000000000..f0f9510a6 Binary files /dev/null and b/test/test_data/issues/193/three_points.dbf differ diff --git a/test/test_data/issues/193/three_points.prj b/test/test_data/issues/193/three_points.prj new file mode 100644 index 000000000..4b31b8153 --- /dev/null +++ b/test/test_data/issues/193/three_points.prj @@ -0,0 +1 @@ +PROJCS["Unknown",GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]],PROJECTION["Unknown Projection"],PARAMETER["central_meridian",0],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["Meter",1],PARAMETER["standard_parallel_1",0.0]] \ No newline at end of file diff --git a/test/test_data/issues/193/three_points.shp b/test/test_data/issues/193/three_points.shp new file mode 100644 index 000000000..49bc233a7 Binary files /dev/null and b/test/test_data/issues/193/three_points.shp differ diff --git a/test/test_data/issues/193/three_points.shx b/test/test_data/issues/193/three_points.shx new file mode 100644 index 000000000..350773194 Binary files /dev/null and b/test/test_data/issues/193/three_points.shx differ diff --git a/test/test_data/issues/236/point.geojson b/test/test_data/issues/236/point.geojson new file mode 100644 index 000000000..1809f30d8 --- /dev/null +++ b/test/test_data/issues/236/point.geojson @@ -0,0 +1,3 @@ +{"type":"FeatureCollection","features":[{"type":"Feature","properties":{"name":"Niagara Falls"},"geometry":{"type":"Point","coordinates":[-79.04411780507252,43.08771393436908]}}], +"crs":{"type":"name","properties":{"name":"urn:ogc:def:crs:EPSG::4326"}} +} \ No newline at end of file diff --git a/test/test_data/issues/clip_errors/inner2.json b/test/test_data/issues/clip_errors/inner2.json new file mode 100755 index 000000000..8a4e50054 --- /dev/null +++ b/test/test_data/issues/clip_errors/inner2.json @@ -0,0 +1,8 @@ +{"type":"FeatureCollection", "features": [ +{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[ +[-87.683302,42.071478], +[-87.68077699999999,42.073189], +[-87.68074939887087,42.07315957615481], +[-87.67969598493819,42.071478], +[-87.683302,42.071478]]]},"properties":{"GEOID":"IL09","NYTID":"IL09","SEAT":"09","ST":"IL","STATEFP":"17"}} +]} \ No newline at end of file diff --git a/test/test_data/issues/clip_errors/inner3.json b/test/test_data/issues/clip_errors/inner3.json new file mode 100644 index 000000000..a04c3fe53 --- /dev/null +++ b/test/test_data/issues/clip_errors/inner3.json @@ -0,0 +1,8 @@ +{"type":"FeatureCollection", "features": [ +{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[ +[-87.683302,42.071478], +[-87.683302,42.07315957615481], +[-87.68074939887087,42.07315957615481], +[-87.67969598493819,42.071478], +[-87.683302,42.071478]]]},"properties":{"GEOID":"IL09","NYTID":"IL09","SEAT":"09","ST":"IL","STATEFP":"17"}} +]} \ No newline at end of file diff --git a/test/test_data/issues/clip_errors/outer.json b/test/test_data/issues/clip_errors/outer.json new file mode 100755 index 000000000..ced1faa8a --- /dev/null +++ b/test/test_data/issues/clip_errors/outer.json @@ -0,0 +1,3 @@ +{"type":"FeatureCollection", "features": [ +{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[-87.68203199115044,42.076721],[-87.68235899999999,42.075728999999995],[-87.679843229159,42.071713047556294],[-87.67936772808278,42.070954],[-87.684057,42.070954],[-87.684057,42.076721],[-87.68203199115044,42.076721]]]},"properties":{"GEOID":"17031","NAME":"Cook","ST":"IL","STATEFP":"17"}} +]} \ No newline at end of file diff --git a/test/test_data/lorem.txt b/test/test_data/lorem.txt new file mode 100644 index 000000000..34c92c2d9 --- /dev/null +++ b/test/test_data/lorem.txt @@ -0,0 +1 @@ +lorem ipsum \ No newline at end of file diff --git a/test/test_data/require/test_module.js b/test/test_data/require/test_module.js new file mode 100644 index 000000000..5b65acbd9 --- /dev/null +++ b/test/test_data/require/test_module.js @@ -0,0 +1,5 @@ +var name = ''; +module.exports = { + setName: function(str) {name = str;}, + getName: function() {return name;} +}; diff --git a/test/test_data/text/empty.csv b/test/test_data/text/empty.csv new file mode 100644 index 000000000..e69de29bb diff --git a/test/test_data/two_states_merc_copy.shp b/test/test_data/two_states_merc_copy.shp new file mode 100644 index 000000000..df6deed2a Binary files /dev/null and b/test/test_data/two_states_merc_copy.shp differ diff --git a/test/topojson-test.js b/test/topojson-test.js index ceee8681f..2ac0a8ed1 100644 --- a/test/topojson-test.js +++ b/test/topojson-test.js @@ -67,8 +67,6 @@ describe('topojson-export.js and topojson-import.js', function () { }) }); - - describe('exportProperties', function () { it('use id_field option', function () { var geometries = [{type: null}, {type: null}], @@ -203,6 +201,169 @@ describe('topojson-export.js and topojson-import.js', function () { describe('TopoJSON export', function () { + it('-o singles option', function(done) { + var input = { + type: 'GeometryCollection', + geometries: [{ + type: 'Point', + coordinates: [0, 0] + }, { + type: 'LineString', + coordinates: [[1, 1], [2, 2]] + }, { + type: 'Polygon', + coordinates: [[[3, 3], [3, 4], [4, 3], [3, 3]]] + }] + }; + var cmd = '-i in.json -rename-layers points,lines,polygons -o format=topojson no-quantization singles'; + api.applyCommands(cmd, {'in.json': input}, function(err, output) { + var points = JSON.parse(output['points.json']); + var lines = JSON.parse(output['lines.json']); + var polygons = JSON.parse(output['polygons.json']); + assert.deepEqual(points.objects.points, { + type: 'GeometryCollection', + geometries: [{type: 'Point', coordinates: [0, 0]}] + }); + assert.equal(lines.objects.lines.geometries[0].type, 'LineString'); + assert.equal(lines.objects.lines.geometries.length, 1); + assert.equal(polygons.objects.polygons.geometries[0].type, 'Polygon'); + assert.equal(polygons.objects.polygons.geometries.length, 1); + done(); + }); + + }); + + describe('-o width= option', function () { + + it('apply width and margin to points', function () { + var input = { + type: 'MultiPoint', + coordinates: [[1, 1], [2, 2]] + } + var dataset = api.internal.importGeoJSON(input, {}); + var opts = { + width: 800, margin: 2, bbox: true, + no_quantization: true, + precision: 0.001 // remove rounding errors + }; + var output = api.internal.exportTopoJSON(dataset, opts); + var outputObj = JSON.parse(output[0].content); + var target = { + type: 'Topology', + bbox: [2, 2, 798, 798], + arcs: [], + objects: { + layer1: { + type: 'GeometryCollection', + geometries: [{ + type: 'MultiPoint', + coordinates: [[2, 798], [798, 2]] + }] + } + } + } + assert.deepEqual(outputObj, target); + }) + }) + + describe('-o height= option', function () { + + it('apply height and margin to points', function () { + var input = { + type: 'MultiPoint', + coordinates: [[1, 1], [2, 3]] + } + var dataset = api.internal.importGeoJSON(input, {}); + var opts = { + height: 800, margin: 2, bbox: true, + no_quantization: true, + precision: 0.001 // remove rounding errors + }; + var output = api.internal.exportTopoJSON(dataset, opts); + var outputObj = JSON.parse(output[0].content); + var target = { + type: 'Topology', + bbox: [2, 2, 400, 798], + arcs: [], + objects: { + layer1: { + type: 'GeometryCollection', + geometries: [{ + type: 'MultiPoint', + coordinates: [[2, 798], [400, 2]] + }] + } + } + } + assert.deepEqual(outputObj, target); + }) + }) + + describe('-o width= and height= options', function () { + + it('content is centered horizontally to fit a wide bbox', function () { + var input = { + type: 'MultiPoint', + coordinates: [[1, 1], [2, 3]] + } + var dataset = api.internal.importGeoJSON(input, {}); + var opts = { + height: 80, width: 80, margin: 2, bbox: true, + no_quantization: true, + precision: 0.001 // remove rounding errors + }; + var output = api.internal.exportTopoJSON(dataset, opts); + var outputObj = JSON.parse(output[0].content); + var target = { + type: 'Topology', + bbox: [21, 2, 59, 78], + arcs: [], + objects: { + layer1: { + type: 'GeometryCollection', + geometries: [{ + type: 'MultiPoint', + coordinates: [[21, 78], [59, 2]] + }] + } + } + } + assert.deepEqual(outputObj, target); + }) + + it('content is centered vertically to fit a tall bbox', function () { + var input = { + type: 'MultiPoint', + coordinates: [[1, 1], [3, 2]] + } + var dataset = api.internal.importGeoJSON(input, {}); + var opts = { + height: 80, width: 80, margin: 2, bbox: true, + no_quantization: true, + precision: 0.001 // remove rounding errors + }; + var output = api.internal.exportTopoJSON(dataset, opts); + var outputObj = JSON.parse(output[0].content); + var target = { + type: 'Topology', + bbox: [2, 21, 78, 59], + arcs: [], + objects: { + layer1: { + type: 'GeometryCollection', + geometries: [{ + type: 'MultiPoint', + coordinates: [[2, 59], [78, 21]] + }] + } + } + } + assert.deepEqual(outputObj, target); + }) + + }) + + it('default file extension is .json', function(done) { api.applyCommands('-i test/test_data/two_states.shp -o format=topojson', {}, function(err, output) { assert('two_states.json' in output); diff --git a/test/topology-test.js b/test/topology-test.js index a5df173a9..ff18f3496 100644 --- a/test/topology-test.js +++ b/test/topology-test.js @@ -1,8 +1,6 @@ var assert = require('assert'), api = require("../"), - utils = api.utils, - trace = api.internal.trace; - + utils = api.utils; function buildPathTopology(nn, xx, yy) { var obj = api.internal.buildPathTopology(nn, xx, yy); diff --git a/test/uniq-test.js b/test/uniq-test.js index 279be6bea..b35805bad 100644 --- a/test/uniq-test.js +++ b/test/uniq-test.js @@ -11,4 +11,24 @@ describe('mapshaper-uniq.js', function () { assert.deepEqual(lyr.data.getRecords(), [{foo: 'a'}, {foo: 'b'}]); assert.deepEqual(lyr.shapes, [[[1, 2]], [[3, 4]]]); }) + + it ('-uniq max-count=2', function() { + var data = new api.internal.DataTable([{foo: 'a'}, {foo: 'b'}, {foo: 'a'}, {foo: 'a'}]), + shapes = [[[1, 2]], [[3, 4]], [[5, 6]], [[7, 8]]], + lyr = {data: data, shapes: shapes, geometry_type: 'point'}; + api.uniq(lyr, null, {expression: 'foo', max_count: 2}); + assert.deepEqual(lyr.data.getRecords(), [{foo: 'a'}, {foo: 'b'}, {foo: 'a'}]); + assert.deepEqual(lyr.shapes, [[[1, 2]], [[3, 4]], [[5, 6]]]); + }) + + it ('-uniq invert', function() { + var data = new api.internal.DataTable([{foo: 'a', id: 0}, {foo: 'b', id: 1}, + {foo: 'a', id: 2}, {foo: 'a', id: 3}]), + shapes = [[[1, 2]], [[3, 4]], [[5, 6]], [[7, 8]]], + lyr = {data: data, shapes: shapes, geometry_type: 'point'}; + api.uniq(lyr, null, {expression: 'foo', invert: true}); + assert.deepEqual(lyr.data.getRecords(), [{foo: 'a', id: 2}, {foo: 'a', id: 3}]); + assert.deepEqual(lyr.shapes, [[[5, 6]], [[7, 8]]]); + }) + }) diff --git a/test/units-test.js b/test/units-test.js new file mode 100644 index 000000000..72f4be87c --- /dev/null +++ b/test/units-test.js @@ -0,0 +1,153 @@ + +var api = require('..'), + assert = require('assert'); + +describe('mapshaper-units.js', function () { + describe('parseMeasure()', function () { + function good(str, expect) { + it(str, function() { + var o = api.internal.parseMeasure(str); + assert.deepEqual(o, expect) + }); + } + + function bad(s) { + it(s, function() { + assert.throws(function() { + api.internal.parseMeasure(s); + }); + }) + } + + good('5km', {units: 'kilometers', areal: false, value: 5}) + good('5000 km2', {units: 'kilometers', areal: true, value: 5000}) + good('5.0sqkm', {units: 'kilometers', areal: true, value: 5}) + good('10000ft', {units: 'feet', areal: false, value: 10000}) + good('1e5 feet', {units: 'feet', areal: false, value: 100000}) + good('1e5', {value: 100000}) + good('2.43e3 m2', {units: 'meters', areal: true, value: 2430}) + good('5000 miles', {value: 5000, units: 'miles', areal: false}) + good('5000mi', {value: 5000, units: 'miles', areal: false}) + + bad('a'); + bad(''); + bad('30 hectares'); + }) + + describe('getIntervalConversionFactor()', function () { + function good(param, crs, expect) { + it(param + ', ' + crs, function() { + var P = crs ? api.internal.getCRS(crs) : null; + var k = api.internal.getIntervalConversionFactor(param, P); + assert.strictEqual(k, expect); + }); + } + + function bad(param, crs) { + it('invalid: ' + param + ', ' + crs, function() { + assert.throws(function() { + var P = crs ? api.internal.getCRS(crs) : null; + var k = api.internal.getIntervalConversionFactor(param, P); + }); + }) + } + + good('meters', '+init=epsg:3424', 1/0.304800609601219) // state plane (us-ft) + good('miles', '+init=epsg:3424', 1609.344 * 1/0.304800609601219) // state plane (us-ft) + good('kilometers', '+init=epsg:3707', 1000) // UTM 60N (meters) + + good('', null, 1) + good('', 'wgs84', 1) + good('kilometers', 'wgs84', 1000) + good('meters', 'wgs84', 1) + good('feet', 'wgs84', 0.3048) + good('miles', 'wgs84', 1609.344) + good('miles', 'wgs84', 1609.344) + + bad('hectares', 'wgs84') + bad('kilometers', null) + bad('meters', null) + + }) + + describe('convertAreaParam()', function () { + it('km2/wgs84', function () { + var json = require('fs').readFileSync('test/test_data/three_points.geojson', 'utf8'); + var crs = api.internal.getDatasetCRS(api.internal.importGeoJSON(json, {})); + var val = api.internal.convertAreaParam('20km2', crs); + assert.equal(val, 20e6) + }) + }) + + describe('convertDistanceParam()', function () { + var wgs84 = api.internal.getCRS('wgs84') + it('areal units trigger error', function () { + assert.throws(function() { + var val = api.internal.convertDistanceParam('20km2', wgs84); + }) + }) + + it('miles/wgs84', function () { + var val = api.internal.convertDistanceParam('10mi', wgs84); + assert.equal(val, 10 * 1609.344); + }) + + it('no units/wgs84', function () { + var val = api.internal.convertDistanceParam('4000', wgs84); + assert.equal(val, 4000); + }) + + }) + + describe('convertIntervalParam()', function () { + var wgs84 = api.internal.getCRS('wgs84') + it('km units trigger error for latlong dataset', function () { + assert.throws(function() { + var val = api.internal.convertIntervalParam('20km', wgs84); + }) + }) + + it('mi units trigger error for latlong dataset', function () { + assert.throws(function() { + var val = api.internal.convertIntervalParam('10mi', wgs84); + }) + }) + + it('no units/wgs84', function () { + var val = api.internal.convertIntervalParam('4000', wgs84); + assert.equal(val, 4000); + }) + }) + + describe('convertIntervalPair()', function () { + var crs = api.internal.getCRS('wgs84'); + it('less than two args = error', function () { + assert.throws(function() { + var val = api.internal.convertIntervalPair(['20'], crs); + }) + }) + + it('mi units trigger error for latlong dataset', function () { + assert.throws(function() { + var val = api.internal.convertIntervalPair(['10mi', '2mi'], crs); + }) + }) + + it('no units/wgs84', function () { + var val = api.internal.convertIntervalPair(['4000', '2000'], crs); + assert.deepEqual(val, [4000, 2000]); + }) + + it('km/mercator', function(done) { + var cmd = '-i test/test_data/three_points.geojson -proj webmercator'; + api.internal.testCommands(cmd, function(err, dataset) { + var pair = api.internal.convertIntervalPair(['2km','5km'], api.internal.getDatasetCRS(dataset)); + assert.deepEqual(pair, [2000, 5000]) + done(); + }); + }) + + }) + + +}) diff --git a/test/utils-test.js b/test/utils-test.js index 80f600f33..9f90b027f 100644 --- a/test/utils-test.js +++ b/test/utils-test.js @@ -58,6 +58,25 @@ describe('mapshaper-utils.js', function () { }) + describe('isNonNegNumber()', function () { + it('positive tests', function () { + assert(utils.isNonNegNumber(0)) + assert(utils.isNonNegNumber(1)) + assert(utils.isNonNegNumber(Infinity)) + }) + + it('negative tests', function() { + assert.equal(utils.isNonNegNumber(-1e-11), false); + assert.equal(utils.isNonNegNumber(-Infinity), false); + assert.equal(utils.isNonNegNumber(), false); + assert.equal(utils.isNonNegNumber(NaN), false); + assert.equal(utils.isNonNegNumber(null), false); + assert.equal(utils.isNonNegNumber({}), false); + assert.equal(utils.isNonNegNumber('0'), false); + assert.equal(utils.isNonNegNumber('1'), false); + }) + }) + describe('isFiniteNumber()', function () { it('positive tests', function () { assert(utils.isFiniteNumber(1)); diff --git a/test/variable-simplify-test.js b/test/variable-simplify-test.js new file mode 100644 index 000000000..ae97f6ffd --- /dev/null +++ b/test/variable-simplify-test.js @@ -0,0 +1,103 @@ +var assert = require('assert'), + api = require("../"), + utils = api.utils, + fs = require('fs'); + +function simplifyGeoJsonContent(contentStr, simplifyArgs, cb) { + var cmd = '-i data.json -simplify ' + simplifyArgs + ' -o'; + api.applyCommands(cmd, {'data.json': contentStr}, function(err, output) { + if (err) return cb(err); + cb(null, output['data.json'].toString()); + }); +} + +function sameOutputTest(contentStr, standardArgs, variableArgs, done) { + simplifyGeoJsonContent(contentStr, standardArgs, function(err, output) { + simplifyGeoJsonContent(contentStr, variableArgs, function(err, output2) { + if (err) { + console.log(err) + } + assert(!err); + assert.equal(output2.length, output.length); + // console.log(contentStr.length, output.length, output2.length, output == output2); + done(); + }) + }); +} + +describe("mapshaper-variable-simplify.js", function() { + + describe('Variable simplification', function() { + var boxes = { + type: 'GeometryCollection', + geometries: [{ + type: 'Polygon', + coordinates: [[[0, 0], [0, 1], [1, 1], [1, 0], [0, 0]]] + }, { + type: 'Polygon', + coordinates: [[[2, 0], [2, 1], [3, 1], [3, 0], [2, 0]]] + }] + }; + + it ('remove one box, retain the other', function(done) { + var cmd='-i data.json -each "id = this.id" -simplify variable percentage="id === 0 ? \'100%\' : \'0%\'" -o'; + api.applyCommands(cmd, {'data.json': boxes}, function(err, output) { + var data2 = JSON.parse(output['data.json']); + var target = { + type: 'FeatureCollection', + features: [{ + type: 'Feature', + properties: {id: 0}, + geometry: boxes.geometries[0] + }, { + type: 'Feature', + properties: {id: 1}, + geometry: null + }] + }; + assert.deepEqual(data2, target); + done(); + }) + }) + + it ('If two features share the same arc, the less-simplified feature wins', function(done) { + var lines = { + type: 'GeometryCollection', + geometries: [{ + type: 'LineString', + coordinates: [[0, 0], [0, 1], [1, 1]] + }, { + type: 'LineString', + coordinates: [[0, 0], [0, 1], [1, 1]] + }] + }; + var cmd = '-i data.json -simplify percentage=\'this.id == 0 ? "0%" : "100%"\' variable -o'; + api.applyCommands(cmd, {'data.json': lines}, function(err, output) { + var data2 = JSON.parse(output['data.json']); + assert.deepEqual(data2, lines); + done(); + }) + + }) + }) + + describe('-variable simplify has same output as standard simplify when applied uniformly', function () { + var content = fs.readFileSync('test/test_data/six_counties_three_null.json') + it('5%', function (done) { + sameOutputTest(content, '10%', 'variable percentage=\'"10" + "%"\'', done); + }) + + it('0% keep-shapes', function (done) { + sameOutputTest(content, '0% keep-shapes', 'variable keep-shapes percentage=\'true && "0%"\'', done); + }) + + it('resolution=800', function (done) { + sameOutputTest(content, 'resolution=800', 'variable resolution=800', done); + }) + + it('interval=1km', function (done) { + sameOutputTest(content, 'interval=0.1km', 'variable interval=true&&"0.1km"', done); + }) + + }) +}) diff --git a/test/x_clipping_bug.js b/test/x_clipping_bug.js new file mode 100644 index 000000000..9c1f54ca2 --- /dev/null +++ b/test/x_clipping_bug.js @@ -0,0 +1,28 @@ +var assert = require('assert'), + api = require("../"); + +describe('x_clipping_bug', function () { + + describe('mapshaper-clip-erase.js', function () { + + describe('Issue: bbox clipping can fail along almost-parallel segments', function () { + + it('test 2', function(done) { + // Polygon had been disappearing after bbox clipping + var polygon = { + type: "Polygon", + coordinates: [[[-0.9,0.4],[-0.4,0.4],[-0.4,0],[-0.9,-1.734723475976807e-18],[-0.9,0.4]]] + }; + api.applyCommands('-clip bbox=-1,0,0,1 -debug', polygon, function(err, output) { + var geojson = JSON.parse(output); + // console.log("err:", err, 'output:', geojson) + var coords = geojson.geometries[0].coordinates[0]; + assert.deepEqual(coords, [[-0.9,0.4],[-0.4,0.4],[-0.4,0],[-0.9,0], [-0.9, 0.4]]) + done(); + }); + }) + + }) + }) + +}) diff --git a/www/SourceSansPro-Regular.woff b/www/assets/SourceSansPro-Regular.woff similarity index 100% rename from www/SourceSansPro-Regular.woff rename to www/assets/SourceSansPro-Regular.woff diff --git a/www/SourceSansPro-Semibold.woff b/www/assets/SourceSansPro-Semibold.woff similarity index 100% rename from www/SourceSansPro-Semibold.woff rename to www/assets/SourceSansPro-Semibold.woff diff --git a/www/assets/epsg b/www/assets/epsg new file mode 100644 index 000000000..5159b79d5 --- /dev/null +++ b/www/assets/epsg @@ -0,0 +1,11288 @@ +# HD1909 +<3819> +proj=longlat +ellps=bessel +towgs84=595.48,121.69,515.35,4.115,-2.9383,0.853,-3.408 +no_defs <> +# TWD67 +<3821> +proj=longlat +ellps=aust_SA +no_defs <> +# TWD97 +<3824> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# IGRS +<3889> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# MGI 1901 +<3906> +proj=longlat +ellps=bessel +towgs84=682,-203,480,0,0,0,0 +no_defs <> +# Unknown datum based upon the Airy 1830 ellipsoid +<4001> +proj=longlat +ellps=airy +no_defs <> +# Unknown datum based upon the Airy Modified 1849 ellipsoid +<4002> +proj=longlat +ellps=mod_airy +no_defs <> +# Unknown datum based upon the Australian National Spheroid +<4003> +proj=longlat +ellps=aust_SA +no_defs <> +# Unknown datum based upon the Bessel 1841 ellipsoid +<4004> +proj=longlat +ellps=bessel +no_defs <> +# Unknown datum based upon the Bessel Modified ellipsoid +<4005> +proj=longlat +a=6377492.018 +b=6356173.508712696 +no_defs <> +# Unknown datum based upon the Bessel Namibia ellipsoid +<4006> +proj=longlat +ellps=bess_nam +no_defs <> +# Unknown datum based upon the Clarke 1858 ellipsoid +<4007> +proj=longlat +a=6378293.645208759 +b=6356617.987679838 +no_defs <> +# Unknown datum based upon the Clarke 1866 ellipsoid +<4008> +proj=longlat +ellps=clrk66 +no_defs <> +# Unknown datum based upon the Clarke 1866 Michigan ellipsoid +<4009> +proj=longlat +a=6378450.047548896 +b=6356826.621488444 +no_defs <> +# Unknown datum based upon the Clarke 1880 (Benoit) ellipsoid +<4010> +proj=longlat +a=6378300.789 +b=6356566.435 +no_defs <> +# Unknown datum based upon the Clarke 1880 (IGN) ellipsoid +<4011> +proj=longlat +a=6378249.2 +b=6356515 +no_defs <> +# Unknown datum based upon the Clarke 1880 (RGS) ellipsoid +<4012> +proj=longlat +ellps=clrk80 +no_defs <> +# Unknown datum based upon the Clarke 1880 (Arc) ellipsoid +<4013> +proj=longlat +a=6378249.145 +b=6356514.966398753 +no_defs <> +# Unknown datum based upon the Clarke 1880 (SGA 1922) ellipsoid +<4014> +proj=longlat +a=6378249.2 +b=6356514.996941779 +no_defs <> +# Unknown datum based upon the Everest 1830 (1937 Adjustment) ellipsoid +<4015> +proj=longlat +a=6377276.345 +b=6356075.41314024 +no_defs <> +# Unknown datum based upon the Everest 1830 (1967 Definition) ellipsoid +<4016> +proj=longlat +ellps=evrstSS +no_defs <> +# Unknown datum based upon the Everest 1830 Modified ellipsoid +<4018> +proj=longlat +a=6377304.063 +b=6356103.038993155 +no_defs <> +# Unknown datum based upon the GRS 1980 ellipsoid +<4019> +proj=longlat +ellps=GRS80 +no_defs <> +# Unknown datum based upon the Helmert 1906 ellipsoid +<4020> +proj=longlat +ellps=helmert +no_defs <> +# Unknown datum based upon the Indonesian National Spheroid +<4021> +proj=longlat +a=6378160 +b=6356774.50408554 +no_defs <> +# Unknown datum based upon the International 1924 ellipsoid +<4022> +proj=longlat +ellps=intl +no_defs <> +# MOLDREF99 +<4023> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# Unknown datum based upon the Krassowsky 1940 ellipsoid +<4024> +proj=longlat +ellps=krass +no_defs <> +# Unknown datum based upon the NWL 9D ellipsoid +<4025> +proj=longlat +ellps=WGS66 +no_defs <> +# Unknown datum based upon the Plessis 1817 ellipsoid +<4027> +proj=longlat +a=6376523 +b=6355862.933255573 +no_defs <> +# Unknown datum based upon the Struve 1860 ellipsoid +<4028> +proj=longlat +a=6378298.3 +b=6356657.142669561 +no_defs <> +# Unknown datum based upon the War Office ellipsoid +<4029> +proj=longlat +a=6378300 +b=6356751.689189189 +no_defs <> +# Unknown datum based upon the WGS 84 ellipsoid +<4030> +proj=longlat +ellps=WGS84 +no_defs <> +# Unknown datum based upon the GEM 10C ellipsoid +<4031> +proj=longlat +ellps=WGS84 +no_defs <> +# Unknown datum based upon the OSU86F ellipsoid +<4032> +proj=longlat +a=6378136.2 +b=6356751.516927429 +no_defs <> +# Unknown datum based upon the OSU91A ellipsoid +<4033> +proj=longlat +a=6378136.3 +b=6356751.616592146 +no_defs <> +# Unknown datum based upon the Clarke 1880 ellipsoid +<4034> +proj=longlat +a=6378249.144808011 +b=6356514.966204134 +no_defs <> +# Unknown datum based upon the Authalic Sphere +<4035> +proj=longlat +a=6371000 +b=6371000 +no_defs <> +# Unknown datum based upon the GRS 1967 ellipsoid +<4036> +proj=longlat +ellps=GRS67 +no_defs <> +# Unknown datum based upon the Average Terrestrial System 1977 ellipsoid +<4041> +proj=longlat +a=6378135 +b=6356750.304921594 +no_defs <> +# Unknown datum based upon the Everest (1830 Definition) ellipsoid +<4042> +proj=longlat +a=6377299.36559538 +b=6356098.359005156 +no_defs <> +# Unknown datum based upon the WGS 72 ellipsoid +<4043> +proj=longlat +ellps=WGS72 +no_defs <> +# Unknown datum based upon the Everest 1830 (1962 Definition) ellipsoid +<4044> +proj=longlat +a=6377301.243 +b=6356100.230165384 +no_defs <> +# Unknown datum based upon the Everest 1830 (1975 Definition) ellipsoid +<4045> +proj=longlat +a=6377299.151 +b=6356098.145120132 +no_defs <> +# RGRDC 2005 +<4046> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# Unspecified datum based upon the GRS 1980 Authalic Sphere +<4047> +proj=longlat +a=6371007 +b=6371007 +no_defs <> +# Unspecified datum based upon the Clarke 1866 Authalic Sphere +<4052> +proj=longlat +a=6370997 +b=6370997 +no_defs <> +# Unspecified datum based upon the International 1924 Authalic Sphere +<4053> +proj=longlat +a=6371228 +b=6371228 +no_defs <> +# Unspecified datum based upon the Hughes 1980 ellipsoid +<4054> +proj=longlat +a=6378273 +b=6356889.449 +no_defs <> +# Popular Visualisation CRS +<4055> +proj=longlat +a=6378137 +b=6378137 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# SREF98 +<4075> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# REGCAN95 +<4081> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# Greek +<4120> +proj=longlat +ellps=bessel +no_defs <> +# GGRS87 +<4121> +proj=longlat +datum=GGRS87 +no_defs <> +# ATS77 +<4122> +proj=longlat +a=6378135 +b=6356750.304921594 +no_defs <> +# KKJ +<4123> +proj=longlat +ellps=intl +towgs84=-96.062,-82.428,-121.753,4.801,0.345,-1.376,1.496 +no_defs <> +# RT90 +<4124> +proj=longlat +ellps=bessel +towgs84=414.1,41.3,603.1,-0.855,2.141,-7.023,0 +no_defs <> +# Samboja +<4125> +proj=longlat +ellps=bessel +towgs84=-404.78,685.68,45.47,0,0,0,0 +no_defs <> +# LKS94 (ETRS89) +<4126> +proj=longlat +ellps=GRS80 +no_defs <> +# Tete +<4127> +proj=longlat +ellps=clrk66 +towgs84=-80,-100,-228,0,0,0,0 +no_defs <> +# Madzansua +<4128> +proj=longlat +ellps=clrk66 +no_defs <> +# Observatario +<4129> +proj=longlat +ellps=clrk66 +towgs84=-132,-110,-335,0,0,0,0 +no_defs <> +# Moznet +<4130> +proj=longlat +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# Indian 1960 +<4131> +proj=longlat +a=6377276.345 +b=6356075.41314024 +towgs84=198,881,317,0,0,0,0 +no_defs <> +# FD58 +<4132> +proj=longlat +ellps=clrk80 +towgs84=-241.54,-163.64,396.06,0,0,0,0 +no_defs <> +# EST92 +<4133> +proj=longlat +ellps=GRS80 +towgs84=0.055,-0.541,-0.185,0.0183,-0.0003,-0.007,-0.014 +no_defs <> +# PSD93 +<4134> +proj=longlat +ellps=clrk80 +towgs84=-180.624,-225.516,173.919,-0.81,-1.898,8.336,16.71006 +no_defs <> +# Old Hawaiian +<4135> +proj=longlat +ellps=clrk66 +towgs84=61,-285,-181,0,0,0,0 +no_defs <> +# St. Lawrence Island +<4136> +proj=longlat +ellps=clrk66 +no_defs <> +# St. Paul Island +<4137> +proj=longlat +ellps=clrk66 +no_defs <> +# St. George Island +<4138> +proj=longlat +ellps=clrk66 +no_defs <> +# Puerto Rico +<4139> +proj=longlat +ellps=clrk66 +towgs84=11,72,-101,0,0,0,0 +no_defs <> +# NAD83(CSRS98) +<4140> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# Israel 1993 +<4141> +proj=longlat +ellps=GRS80 +towgs84=-48,55,52,0,0,0,0 +no_defs <> +# Locodjo 1965 +<4142> +proj=longlat +ellps=clrk80 +towgs84=-125,53,467,0,0,0,0 +no_defs <> +# Abidjan 1987 +<4143> +proj=longlat +ellps=clrk80 +towgs84=-124.76,53,466.79,0,0,0,0 +no_defs <> +# Kalianpur 1937 +<4144> +proj=longlat +a=6377276.345 +b=6356075.41314024 +towgs84=214,804,268,0,0,0,0 +no_defs <> +# Kalianpur 1962 +<4145> +proj=longlat +a=6377301.243 +b=6356100.230165384 +towgs84=283,682,231,0,0,0,0 +no_defs <> +# Kalianpur 1975 +<4146> +proj=longlat +a=6377299.151 +b=6356098.145120132 +towgs84=295,736,257,0,0,0,0 +no_defs <> +# Hanoi 1972 +<4147> +proj=longlat +ellps=krass +towgs84=-17.51,-108.32,-62.39,0,0,0,0 +no_defs <> +# Hartebeesthoek94 +<4148> +proj=longlat +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# CH1903 +<4149> +proj=longlat +ellps=bessel +towgs84=674.374,15.056,405.346,0,0,0,0 +no_defs <> +# CH1903+ +<4150> +proj=longlat +ellps=bessel +towgs84=674.374,15.056,405.346,0,0,0,0 +no_defs <> +# CHTRF95 +<4151> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# NAD83(HARN) +<4152> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# Rassadiran +<4153> +proj=longlat +ellps=intl +towgs84=-133.63,-157.5,-158.62,0,0,0,0 +no_defs <> +# ED50(ED77) +<4154> +proj=longlat +ellps=intl +towgs84=-117,-132,-164,0,0,0,0 +no_defs <> +# Dabola 1981 +<4155> +proj=longlat +a=6378249.2 +b=6356515 +towgs84=-83,37,124,0,0,0,0 +no_defs <> +# S-JTSK +<4156> +proj=longlat +ellps=bessel +towgs84=589,76,480,0,0,0,0 +no_defs <> +# Mount Dillon +<4157> +proj=longlat +a=6378293.645208759 +b=6356617.987679838 +no_defs <> +# Naparima 1955 +<4158> +proj=longlat +ellps=intl +towgs84=-0.465,372.095,171.736,0,0,0,0 +no_defs <> +# ELD79 +<4159> +proj=longlat +ellps=intl +towgs84=-115.8543,-99.0583,-152.4616,0,0,0,0 +no_defs <> +# Chos Malal 1914 +<4160> +proj=longlat +ellps=intl +no_defs <> +# Pampa del Castillo +<4161> +proj=longlat +ellps=intl +towgs84=27.5,14,186.4,0,0,0,0 +no_defs <> +# Korean 1985 +<4162> +proj=longlat +ellps=bessel +no_defs <> +# Yemen NGN96 +<4163> +proj=longlat +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# South Yemen +<4164> +proj=longlat +ellps=krass +towgs84=-76,-138,67,0,0,0,0 +no_defs <> +# Bissau +<4165> +proj=longlat +ellps=intl +towgs84=-173,253,27,0,0,0,0 +no_defs <> +# Korean 1995 +<4166> +proj=longlat +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# NZGD2000 +<4167> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# Accra +<4168> +proj=longlat +a=6378300 +b=6356751.689189189 +towgs84=-199,32,322,0,0,0,0 +no_defs <> +# American Samoa 1962 +<4169> +proj=longlat +ellps=clrk66 +towgs84=-115,118,426,0,0,0,0 +no_defs <> +# SIRGAS 1995 +<4170> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# RGF93 +<4171> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# POSGAR +<4172> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# IRENET95 +<4173> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# Sierra Leone 1924 +<4174> +proj=longlat +a=6378300 +b=6356751.689189189 +no_defs <> +# Sierra Leone 1968 +<4175> +proj=longlat +ellps=clrk80 +towgs84=-88,4,101,0,0,0,0 +no_defs <> +# Australian Antarctic +<4176> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# Pulkovo 1942(83) +<4178> +proj=longlat +ellps=krass +towgs84=26,-121,-78,0,0,0,0 +no_defs <> +# Pulkovo 1942(58) +<4179> +proj=longlat +ellps=krass +towgs84=33.4,-146.6,-76.3,-0.359,-0.053,0.844,-0.84 +no_defs <> +# EST97 +<4180> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# Luxembourg 1930 +<4181> +proj=longlat +ellps=intl +towgs84=-189.6806,18.3463,-42.7695,-0.33746,-3.09264,2.53861,0.4598 +no_defs <> +# Azores Occidental 1939 +<4182> +proj=longlat +ellps=intl +towgs84=-425,-169,81,0,0,0,0 +no_defs <> +# Azores Central 1948 +<4183> +proj=longlat +ellps=intl +towgs84=-104,167,-38,0,0,0,0 +no_defs <> +# Azores Oriental 1940 +<4184> +proj=longlat +ellps=intl +towgs84=-203,141,53,0,0,0,0 +no_defs <> +# Madeira 1936 +<4185> +proj=longlat +ellps=intl +no_defs <> +# OSNI 1952 +<4188> +proj=longlat +ellps=airy +towgs84=482.5,-130.6,564.6,-1.042,-0.214,-0.631,8.15 +no_defs <> +# REGVEN +<4189> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# POSGAR 98 +<4190> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# Albanian 1987 +<4191> +proj=longlat +ellps=krass +towgs84=-44.183,-0.58,-38.489,2.3867,2.7072,-3.5196,-8.2703 +no_defs <> +# Douala 1948 +<4192> +proj=longlat +ellps=intl +towgs84=-206.1,-174.7,-87.7,0,0,0,0 +no_defs <> +# Manoca 1962 +<4193> +proj=longlat +a=6378249.2 +b=6356515 +towgs84=-70.9,-151.8,-41.4,0,0,0,0 +no_defs <> +# Qornoq 1927 +<4194> +proj=longlat +ellps=intl +towgs84=164,138,-189,0,0,0,0 +no_defs <> +# Scoresbysund 1952 +<4195> +proj=longlat +ellps=intl +towgs84=105,326,-102.5,0,0,0.814,-0.6 +no_defs <> +# Ammassalik 1958 +<4196> +proj=longlat +ellps=intl +towgs84=-45,417,-3.5,0,0,0.814,-0.6 +no_defs <> +# Garoua +<4197> +proj=longlat +ellps=clrk80 +no_defs <> +# Kousseri +<4198> +proj=longlat +ellps=clrk80 +no_defs <> +# Egypt 1930 +<4199> +proj=longlat +ellps=intl +no_defs <> +# Pulkovo 1995 +<4200> +proj=longlat +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +no_defs <> +# Adindan +<4201> +proj=longlat +ellps=clrk80 +towgs84=-166,-15,204,0,0,0,0 +no_defs <> +# AGD66 +<4202> +proj=longlat +ellps=aust_SA +towgs84=-117.808,-51.536,137.784,0.303,0.446,0.234,-0.29 +no_defs <> +# AGD84 +<4203> +proj=longlat +ellps=aust_SA +towgs84=-134,-48,149,0,0,0,0 +no_defs <> +# Ain el Abd +<4204> +proj=longlat +ellps=intl +towgs84=-143,-236,7,0,0,0,0 +no_defs <> +# Afgooye +<4205> +proj=longlat +ellps=krass +towgs84=-43,-163,45,0,0,0,0 +no_defs <> +# Agadez +<4206> +proj=longlat +a=6378249.2 +b=6356515 +no_defs <> +# Lisbon +<4207> +proj=longlat +ellps=intl +towgs84=-304.046,-60.576,103.64,0,0,0,0 +no_defs <> +# Aratu +<4208> +proj=longlat +ellps=intl +towgs84=-151.99,287.04,-147.45,0,0,0,0 +no_defs <> +# Arc 1950 +<4209> +proj=longlat +a=6378249.145 +b=6356514.966398753 +towgs84=-143,-90,-294,0,0,0,0 +no_defs <> +# Arc 1960 +<4210> +proj=longlat +ellps=clrk80 +towgs84=-160,-6,-302,0,0,0,0 +no_defs <> +# Batavia +<4211> +proj=longlat +ellps=bessel +towgs84=-377,681,-50,0,0,0,0 +no_defs <> +# Barbados 1938 +<4212> +proj=longlat +ellps=clrk80 +towgs84=31.95,300.99,419.19,0,0,0,0 +no_defs <> +# Beduaram +<4213> +proj=longlat +a=6378249.2 +b=6356515 +towgs84=-106,-87,188,0,0,0,0 +no_defs <> +# Beijing 1954 +<4214> +proj=longlat +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +no_defs <> +# Belge 1950 +<4215> +proj=longlat +ellps=intl +no_defs <> +# Bermuda 1957 +<4216> +proj=longlat +ellps=clrk66 +towgs84=-73,213,296,0,0,0,0 +no_defs <> +# Bogota 1975 +<4218> +proj=longlat +ellps=intl +towgs84=307,304,-318,0,0,0,0 +no_defs <> +# Bukit Rimpah +<4219> +proj=longlat +ellps=bessel +towgs84=-384,664,-48,0,0,0,0 +no_defs <> +# Camacupa +<4220> +proj=longlat +ellps=clrk80 +towgs84=-50.9,-347.6,-231,0,0,0,0 +no_defs <> +# Campo Inchauspe +<4221> +proj=longlat +ellps=intl +towgs84=-148,136,90,0,0,0,0 +no_defs <> +# Cape +<4222> +proj=longlat +a=6378249.145 +b=6356514.966398753 +towgs84=-136,-108,-292,0,0,0,0 +no_defs <> +# Carthage +<4223> +proj=longlat +datum=carthage +no_defs <> +# Chua +<4224> +proj=longlat +ellps=intl +towgs84=-143.87,243.37,-33.52,0,0,0,0 +no_defs <> +# Corrego Alegre 1970-72 +<4225> +proj=longlat +ellps=intl +towgs84=-205.57,168.77,-4.12,0,0,0,0 +no_defs <> +# Cote d'Ivoire +<4226> +proj=longlat +a=6378249.2 +b=6356515 +no_defs <> +# Deir ez Zor +<4227> +proj=longlat +a=6378249.2 +b=6356515 +towgs84=-190.421,8.532,238.69,0,0,0,0 +no_defs <> +# Douala +<4228> +proj=longlat +a=6378249.2 +b=6356515 +no_defs <> +# Egypt 1907 +<4229> +proj=longlat +ellps=helmert +towgs84=-130,110,-13,0,0,0,0 +no_defs <> +# ED50 +<4230> +proj=longlat +ellps=intl +towgs84=-87,-98,-121,0,0,0,0 +no_defs <> +# ED87 +<4231> +proj=longlat +ellps=intl +towgs84=-83.11,-97.38,-117.22,0.005693,-0.044698,0.044285,0.1218 +no_defs <> +# Fahud +<4232> +proj=longlat +ellps=clrk80 +towgs84=-333.102,-11.02,230.69,0,0,0.554,0.219 +no_defs <> +# Gandajika 1970 +<4233> +proj=longlat +ellps=intl +towgs84=-133,-321,50,0,0,0,0 +no_defs <> +# Garoua +<4234> +proj=longlat +a=6378249.2 +b=6356515 +no_defs <> +# Guyane Francaise +<4235> +proj=longlat +ellps=intl +no_defs <> +# Hu Tzu Shan 1950 +<4236> +proj=longlat +ellps=intl +towgs84=-637,-549,-203,0,0,0,0 +no_defs <> +# HD72 +<4237> +proj=longlat +ellps=GRS67 +towgs84=52.17,-71.82,-14.9,0,0,0,0 +no_defs <> +# ID74 +<4238> +proj=longlat +a=6378160 +b=6356774.50408554 +towgs84=-24,-15,5,0,0,0,0 +no_defs <> +# Indian 1954 +<4239> +proj=longlat +a=6377276.345 +b=6356075.41314024 +towgs84=217,823,299,0,0,0,0 +no_defs <> +# Indian 1975 +<4240> +proj=longlat +a=6377276.345 +b=6356075.41314024 +towgs84=210,814,289,0,0,0,0 +no_defs <> +# Jamaica 1875 +<4241> +proj=longlat +a=6378249.144808011 +b=6356514.966204134 +no_defs <> +# JAD69 +<4242> +proj=longlat +ellps=clrk66 +towgs84=70,207,389.5,0,0,0,0 +no_defs <> +# Kalianpur 1880 +<4243> +proj=longlat +a=6377299.36559538 +b=6356098.359005156 +no_defs <> +# Kandawala +<4244> +proj=longlat +a=6377276.345 +b=6356075.41314024 +towgs84=-97,787,86,0,0,0,0 +no_defs <> +# Kertau 1968 +<4245> +proj=longlat +a=6377304.063 +b=6356103.038993155 +towgs84=-11,851,5,0,0,0,0 +no_defs <> +# KOC +<4246> +proj=longlat +ellps=clrk80 +towgs84=-294.7,-200.1,525.5,0,0,0,0 +no_defs <> +# La Canoa +<4247> +proj=longlat +ellps=intl +towgs84=-273.5,110.6,-357.9,0,0,0,0 +no_defs <> +# PSAD56 +<4248> +proj=longlat +ellps=intl +towgs84=-288,175,-376,0,0,0,0 +no_defs <> +# Lake +<4249> +proj=longlat +ellps=intl +no_defs <> +# Leigon +<4250> +proj=longlat +ellps=clrk80 +towgs84=-130,29,364,0,0,0,0 +no_defs <> +# Liberia 1964 +<4251> +proj=longlat +ellps=clrk80 +towgs84=-90,40,88,0,0,0,0 +no_defs <> +# Lome +<4252> +proj=longlat +a=6378249.2 +b=6356515 +no_defs <> +# Luzon 1911 +<4253> +proj=longlat +ellps=clrk66 +towgs84=-133,-77,-51,0,0,0,0 +no_defs <> +# Hito XVIII 1963 +<4254> +proj=longlat +ellps=intl +towgs84=16,196,93,0,0,0,0 +no_defs <> +# Herat North +<4255> +proj=longlat +ellps=intl +towgs84=-333,-222,114,0,0,0,0 +no_defs <> +# Mahe 1971 +<4256> +proj=longlat +ellps=clrk80 +towgs84=41,-220,-134,0,0,0,0 +no_defs <> +# Makassar +<4257> +proj=longlat +ellps=bessel +towgs84=-587.8,519.75,145.76,0,0,0,0 +no_defs <> +# ETRS89 +<4258> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# Malongo 1987 +<4259> +proj=longlat +ellps=intl +towgs84=-254.1,-5.36,-100.29,0,0,0,0 +no_defs <> +# Manoca +<4260> +proj=longlat +ellps=clrk80 +towgs84=-70.9,-151.8,-41.4,0,0,0,0 +no_defs <> +# Merchich +<4261> +proj=longlat +a=6378249.2 +b=6356515 +towgs84=31,146,47,0,0,0,0 +no_defs <> +# Massawa +<4262> +proj=longlat +ellps=bessel +towgs84=639,405,60,0,0,0,0 +no_defs <> +# Minna +<4263> +proj=longlat +ellps=clrk80 +towgs84=-92,-93,122,0,0,0,0 +no_defs <> +# Mhast +<4264> +proj=longlat +ellps=intl +towgs84=-252.95,-4.11,-96.38,0,0,0,0 +no_defs <> +# Monte Mario +<4265> +proj=longlat +ellps=intl +towgs84=-104.1,-49.1,-9.9,0.971,-2.917,0.714,-11.68 +no_defs <> +# M'poraloko +<4266> +proj=longlat +a=6378249.2 +b=6356515 +towgs84=-74,-130,42,0,0,0,0 +no_defs <> +# NAD27 +<4267> +proj=longlat +datum=NAD27 +no_defs <> +# NAD27 Michigan +<4268> +proj=longlat +a=6378450.047548896 +b=6356826.621488444 +no_defs <> +# NAD83 +<4269> +proj=longlat +datum=NAD83 +no_defs <> +# Nahrwan 1967 +<4270> +proj=longlat +ellps=clrk80 +towgs84=-249,-156,381,0,0,0,0 +no_defs <> +# Naparima 1972 +<4271> +proj=longlat +ellps=intl +towgs84=-10,375,165,0,0,0,0 +no_defs <> +# NZGD49 +<4272> +proj=longlat +datum=nzgd49 +no_defs <> +# NGO 1948 +<4273> +proj=longlat +a=6377492.018 +b=6356173.508712696 +towgs84=278.3,93,474.5,7.889,0.05,-6.61,6.21 +no_defs <> +# Datum 73 +<4274> +proj=longlat +ellps=intl +towgs84=-223.237,110.193,36.649,0,0,0,0 +no_defs <> +# NTF +<4275> +proj=longlat +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +no_defs <> +# NSWC 9Z-2 +<4276> +proj=longlat +ellps=WGS66 +no_defs <> +# OSGB 1936 +<4277> +proj=longlat +datum=OSGB36 +no_defs <> +# OSGB70 +<4278> +proj=longlat +ellps=airy +no_defs <> +# OS(SN)80 +<4279> +proj=longlat +ellps=airy +no_defs <> +# Padang +<4280> +proj=longlat +ellps=bessel +no_defs <> +# Palestine 1923 +<4281> +proj=longlat +a=6378300.789 +b=6356566.435 +towgs84=-275.7224,94.7824,340.8944,-8.001,-4.42,-11.821,1 +no_defs <> +# Pointe Noire +<4282> +proj=longlat +a=6378249.2 +b=6356515 +towgs84=-148,51,-291,0,0,0,0 +no_defs <> +# GDA94 +<4283> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# Pulkovo 1942 +<4284> +proj=longlat +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +no_defs <> +# Qatar 1974 +<4285> +proj=longlat +ellps=intl +towgs84=-128.16,-282.42,21.93,0,0,0,0 +no_defs <> +# Qatar 1948 +<4286> +proj=longlat +ellps=helmert +no_defs <> +# Qornoq +<4287> +proj=longlat +ellps=intl +towgs84=164,138,-189,0,0,0,0 +no_defs <> +# Loma Quintana +<4288> +proj=longlat +ellps=intl +no_defs <> +# Amersfoort +<4289> +proj=longlat +ellps=bessel +towgs84=565.2369,50.0087,465.658,-0.406857,0.350733,-1.87035,4.0812 +no_defs <> +# SAD69 +<4291> +proj=longlat +ellps=GRS67 +towgs84=-57,1,-41,0,0,0,0 +no_defs <> +# Sapper Hill 1943 +<4292> +proj=longlat +ellps=intl +towgs84=-355,21,72,0,0,0,0 +no_defs <> +# Schwarzeck +<4293> +proj=longlat +ellps=bess_nam +towgs84=616,97,-251,0,0,0,0 +no_defs <> +# Segora +<4294> +proj=longlat +ellps=bessel +towgs84=-403,684,41,0,0,0,0 +no_defs <> +# Serindung +<4295> +proj=longlat +ellps=bessel +no_defs <> +# Sudan +<4296> +proj=longlat +a=6378249.2 +b=6356515 +no_defs <> +# Tananarive +<4297> +proj=longlat +ellps=intl +towgs84=-189,-242,-91,0,0,0,0 +no_defs <> +# Timbalai 1948 +<4298> +proj=longlat +ellps=evrstSS +towgs84=-679,669,-48,0,0,0,0 +no_defs <> +# TM65 +<4299> +proj=longlat +datum=ire65 +no_defs <> +# TM75 +<4300> +proj=longlat +ellps=mod_airy +towgs84=482.5,-130.6,564.6,-1.042,-0.214,-0.631,8.15 +no_defs <> +# Tokyo +<4301> +proj=longlat +ellps=bessel +towgs84=-146.414,507.337,680.507,0,0,0,0 +no_defs <> +# Trinidad 1903 +<4302> +proj=longlat +a=6378293.645208759 +b=6356617.987679838 +towgs84=-61.702,284.488,472.052,0,0,0,0 +no_defs <> +# TC(1948) +<4303> +proj=longlat +ellps=helmert +no_defs <> +# Voirol 1875 +<4304> +proj=longlat +a=6378249.2 +b=6356515 +towgs84=-73,-247,227,0,0,0,0 +no_defs <> +# Bern 1938 +<4306> +proj=longlat +ellps=bessel +no_defs <> +# Nord Sahara 1959 +<4307> +proj=longlat +ellps=clrk80 +towgs84=-209.3622,-87.8162,404.6198,0.0046,3.4784,0.5805,-1.4547 +no_defs <> +# RT38 +<4308> +proj=longlat +ellps=bessel +no_defs <> +# Yacare +<4309> +proj=longlat +ellps=intl +towgs84=-155,171,37,0,0,0,0 +no_defs <> +# Yoff +<4310> +proj=longlat +a=6378249.2 +b=6356515 +towgs84=-30,190,89,0,0,0,0 +no_defs <> +# Zanderij +<4311> +proj=longlat +ellps=intl +towgs84=-265,120,-358,0,0,0,0 +no_defs <> +# MGI +<4312> +proj=longlat +datum=hermannskogel +no_defs <> +# Belge 1972 +<4313> +proj=longlat +ellps=intl +towgs84=-106.8686,52.2978,-103.7239,0.3366,-0.457,1.8422,-1.2747 +no_defs <> +# DHDN +<4314> +proj=longlat +datum=potsdam +no_defs <> +# Conakry 1905 +<4315> +proj=longlat +a=6378249.2 +b=6356515 +towgs84=-23,259,-9,0,0,0,0 +no_defs <> +# Dealul Piscului 1930 +<4316> +proj=longlat +ellps=intl +towgs84=103.25,-100.4,-307.19,0,0,0,0 +no_defs <> +# Dealul Piscului 1970 +<4317> +proj=longlat +ellps=krass +towgs84=28,-121,-77,0,0,0,0 +no_defs <> +# NGN +<4318> +proj=longlat +ellps=WGS84 +towgs84=-3.2,-5.7,2.8,0,0,0,0 +no_defs <> +# KUDAMS +<4319> +proj=longlat +ellps=GRS80 +towgs84=-20.8,11.3,2.4,0,0,0,0 +no_defs <> +# WGS 72 +<4322> +proj=longlat +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +no_defs <> +# WGS 72BE +<4324> +proj=longlat +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +no_defs <> +# WGS 84 +<4326> +proj=longlat +datum=WGS84 +no_defs <> +# RGSPM06 +<4463> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# RGM04 +<4470> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# Cadastre 1997 +<4475> +proj=longlat +ellps=intl +towgs84=-381.788,-57.501,-256.673,0,0,0,0 +no_defs <> +# Mexico ITRF92 +<4483> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# China Geodetic Coordinate System 2000 +<4490> +proj=longlat +ellps=GRS80 +no_defs <> +# New Beijing +<4555> +proj=longlat +ellps=krass +no_defs <> +# RRAF 1991 +<4558> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# Anguilla 1957 +<4600> +proj=longlat +ellps=clrk80 +no_defs <> +# Antigua 1943 +<4601> +proj=longlat +ellps=clrk80 +towgs84=-255,-15,71,0,0,0,0 +no_defs <> +# Dominica 1945 +<4602> +proj=longlat +ellps=clrk80 +towgs84=725,685,536,0,0,0,0 +no_defs <> +# Grenada 1953 +<4603> +proj=longlat +ellps=clrk80 +towgs84=72,213.7,93,0,0,0,0 +no_defs <> +# Montserrat 1958 +<4604> +proj=longlat +ellps=clrk80 +towgs84=174,359,365,0,0,0,0 +no_defs <> +# St. Kitts 1955 +<4605> +proj=longlat +ellps=clrk80 +towgs84=9,183,236,0,0,0,0 +no_defs <> +# St. Lucia 1955 +<4606> +proj=longlat +ellps=clrk80 +towgs84=-149,128,296,0,0,0,0 +no_defs <> +# St. Vincent 1945 +<4607> +proj=longlat +ellps=clrk80 +towgs84=195.671,332.517,274.607,0,0,0,0 +no_defs <> +# NAD27(76) +<4608> +proj=longlat +ellps=clrk66 +no_defs <> +# NAD27(CGQ77) +<4609> +proj=longlat +ellps=clrk66 +no_defs <> +# Xian 1980 +<4610> +proj=longlat +a=6378140 +b=6356755.288157528 +no_defs <> +# Hong Kong 1980 +<4611> +proj=longlat +ellps=intl +towgs84=-162.619,-276.959,-161.764,0.067753,-2.243649,-1.158827,-1.094246 +no_defs <> +# JGD2000 +<4612> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# Segara +<4613> +proj=longlat +ellps=bessel +towgs84=-403,684,41,0,0,0,0 +no_defs <> +# QND95 +<4614> +proj=longlat +ellps=intl +towgs84=-119.4248,-303.65872,-11.00061,1.164298,0.174458,1.096259,3.657065 +no_defs <> +# Porto Santo +<4615> +proj=longlat +ellps=intl +towgs84=-499,-249,314,0,0,0,0 +no_defs <> +# Selvagem Grande +<4616> +proj=longlat +ellps=intl +towgs84=-289,-124,60,0,0,0,0 +no_defs <> +# NAD83(CSRS) +<4617> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# SAD69 +<4618> +proj=longlat +ellps=aust_SA +towgs84=-66.87,4.37,-38.52,0,0,0,0 +no_defs <> +# SWEREF99 +<4619> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# Point 58 +<4620> +proj=longlat +ellps=clrk80 +towgs84=-106,-129,165,0,0,0,0 +no_defs <> +# Fort Marigot +<4621> +proj=longlat +ellps=intl +towgs84=137,248,-430,0,0,0,0 +no_defs <> +# Guadeloupe 1948 +<4622> +proj=longlat +ellps=intl +towgs84=-467,-16,-300,0,0,0,0 +no_defs <> +# CSG67 +<4623> +proj=longlat +ellps=intl +towgs84=-186,230,110,0,0,0,0 +no_defs <> +# RGFG95 +<4624> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# Martinique 1938 +<4625> +proj=longlat +ellps=intl +towgs84=186,482,151,0,0,0,0 +no_defs <> +# Reunion 1947 +<4626> +proj=longlat +ellps=intl +towgs84=94,-948,-1262,0,0,0,0 +no_defs <> +# RGR92 +<4627> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# Tahiti 52 +<4628> +proj=longlat +ellps=intl +towgs84=162,117,154,0,0,0,0 +no_defs <> +# Tahaa 54 +<4629> +proj=longlat +ellps=intl +towgs84=72.438,345.918,79.486,1.6045,0.8823,0.5565,1.3746 +no_defs <> +# IGN72 Nuku Hiva +<4630> +proj=longlat +ellps=intl +towgs84=84,274,65,0,0,0,0 +no_defs <> +# K0 1949 +<4631> +proj=longlat +ellps=intl +towgs84=145,-187,103,0,0,0,0 +no_defs <> +# Combani 1950 +<4632> +proj=longlat +ellps=intl +towgs84=-382,-59,-262,0,0,0,0 +no_defs <> +# IGN56 Lifou +<4633> +proj=longlat +ellps=intl +towgs84=335.47,222.58,-230.94,0,0,0,0 +no_defs <> +# IGN72 Grand Terre +<4634> +proj=longlat +ellps=intl +towgs84=-13,-348,292,0,0,0,0 +no_defs <> +# ST87 Ouvea +<4635> +proj=longlat +ellps=intl +towgs84=-122.383,-188.696,103.344,3.5107,-4.9668,-5.7047,4.4798 +no_defs <> +# Petrels 1972 +<4636> +proj=longlat +ellps=intl +towgs84=365,194,166,0,0,0,0 +no_defs <> +# Perroud 1950 +<4637> +proj=longlat +ellps=intl +towgs84=325,154,172,0,0,0,0 +no_defs <> +# Saint Pierre et Miquelon 1950 +<4638> +proj=longlat +ellps=clrk66 +towgs84=30,430,368,0,0,0,0 +no_defs <> +# MOP78 +<4639> +proj=longlat +ellps=intl +towgs84=253,-132,-127,0,0,0,0 +no_defs <> +# RRAF 1991 +<4640> +proj=longlat +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# IGN53 Mare +<4641> +proj=longlat +ellps=intl +towgs84=287.58,177.78,-135.41,0,0,0,0 +no_defs <> +# ST84 Ile des Pins +<4642> +proj=longlat +ellps=intl +towgs84=-13,-348,292,0,0,0,0 +no_defs <> +# ST71 Belep +<4643> +proj=longlat +ellps=intl +towgs84=-480.26,-438.32,-643.429,16.3119,20.1721,-4.0349,-111.7002 +no_defs <> +# NEA74 Noumea +<4644> +proj=longlat +ellps=intl +towgs84=-10.18,-350.43,291.37,0,0,0,0 +no_defs <> +# RGNC 1991 +<4645> +proj=longlat +ellps=intl +towgs84=0,0,0,0,0,0,0 +no_defs <> +# Grand Comoros +<4646> +proj=longlat +ellps=intl +towgs84=-963,510,-359,0,0,0,0 +no_defs <> +# Reykjavik 1900 +<4657> +proj=longlat +a=6377019.27 +b=6355762.5391 +towgs84=-28,199,5,0,0,0,0 +no_defs <> +# Hjorsey 1955 +<4658> +proj=longlat +ellps=intl +towgs84=-73,47,-83,0,0,0,0 +no_defs <> +# ISN93 +<4659> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# Helle 1954 +<4660> +proj=longlat +ellps=intl +towgs84=982.6087,552.753,-540.873,6.6816266,-31.6114924,-19.84816,16.805 +no_defs <> +# LKS92 +<4661> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# IGN72 Grande Terre +<4662> +proj=longlat +ellps=intl +towgs84=-11.64,-348.6,291.98,0,0,0,0 +no_defs <> +# Porto Santo 1995 +<4663> +proj=longlat +ellps=intl +towgs84=-502.862,-247.438,312.724,0,0,0,0 +no_defs <> +# Azores Oriental 1995 +<4664> +proj=longlat +ellps=intl +towgs84=-204.619,140.176,55.226,0,0,0,0 +no_defs <> +# Azores Central 1995 +<4665> +proj=longlat +ellps=intl +towgs84=-106.226,166.366,-37.893,0,0,0,0 +no_defs <> +# Lisbon 1890 +<4666> +proj=longlat +ellps=bessel +towgs84=508.088,-191.042,565.223,0,0,0,0 +no_defs <> +# IKBD-92 +<4667> +proj=longlat +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# ED79 +<4668> +proj=longlat +ellps=intl +towgs84=-86,-98,-119,0,0,0,0 +no_defs <> +# LKS94 +<4669> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# IGM95 +<4670> +proj=longlat +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# Voirol 1879 +<4671> +proj=longlat +a=6378249.2 +b=6356515 +no_defs <> +# Chatham Islands 1971 +<4672> +proj=longlat +ellps=intl +towgs84=175,-38,113,0,0,0,0 +no_defs <> +# Chatham Islands 1979 +<4673> +proj=longlat +ellps=intl +towgs84=174.05,-25.49,112.57,0,0,0.554,0.2263 +no_defs <> +# SIRGAS 2000 +<4674> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# Guam 1963 +<4675> +proj=longlat +ellps=clrk66 +towgs84=-100,-248,259,0,0,0,0 +no_defs <> +# Vientiane 1982 +<4676> +proj=longlat +ellps=krass +no_defs <> +# Lao 1993 +<4677> +proj=longlat +ellps=krass +no_defs <> +# Lao 1997 +<4678> +proj=longlat +ellps=krass +towgs84=44.585,-131.212,-39.544,0,0,0,0 +no_defs <> +# Jouik 1961 +<4679> +proj=longlat +ellps=clrk80 +towgs84=-80.01,253.26,291.19,0,0,0,0 +no_defs <> +# Nouakchott 1965 +<4680> +proj=longlat +ellps=clrk80 +towgs84=124.5,-63.5,-281,0,0,0,0 +no_defs <> +# Mauritania 1999 +<4681> +proj=longlat +ellps=clrk80 +no_defs <> +# Gulshan 303 +<4682> +proj=longlat +a=6377276.345 +b=6356075.41314024 +towgs84=283.7,735.9,261.1,0,0,0,0 +no_defs <> +# PRS92 +<4683> +proj=longlat +ellps=clrk66 +towgs84=-127.62,-67.24,-47.04,-3.068,4.903,1.578,-1.06 +no_defs <> +# Gan 1970 +<4684> +proj=longlat +ellps=intl +towgs84=-133,-321,50,0,0,0,0 +no_defs <> +# Gandajika +<4685> +proj=longlat +ellps=intl +no_defs <> +# MAGNA-SIRGAS +<4686> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# RGPF +<4687> +proj=longlat +ellps=GRS80 +towgs84=0.072,-0.507,-0.245,-0.0183,0.0003,-0.007,-0.0093 +no_defs <> +# Fatu Iva 72 +<4688> +proj=longlat +ellps=intl +towgs84=347.103,1078.125,2623.922,-33.8875,70.6773,-9.3943,186.074 +no_defs <> +# IGN63 Hiva Oa +<4689> +proj=longlat +ellps=intl +towgs84=410.721,55.049,80.746,2.5779,2.3514,0.6664,17.3311 +no_defs <> +# Tahiti 79 +<4690> +proj=longlat +ellps=intl +towgs84=221.525,152.948,176.768,-2.3847,-1.3896,-0.877,11.4741 +no_defs <> +# Moorea 87 +<4691> +proj=longlat +ellps=intl +towgs84=215.525,149.593,176.229,-3.2624,-1.692,-1.1571,10.4773 +no_defs <> +# Maupiti 83 +<4692> +proj=longlat +ellps=intl +towgs84=217.037,86.959,23.956,0,0,0,0 +no_defs <> +# Nakhl-e Ghanem +<4693> +proj=longlat +ellps=WGS84 +towgs84=0,-0.15,0.68,0,0,0,0 +no_defs <> +# POSGAR 94 +<4694> +proj=longlat +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# Katanga 1955 +<4695> +proj=longlat +ellps=clrk66 +towgs84=-103.746,-9.614,-255.95,0,0,0,0 +no_defs <> +# Kasai 1953 +<4696> +proj=longlat +ellps=clrk80 +no_defs <> +# IGC 1962 6th Parallel South +<4697> +proj=longlat +ellps=clrk80 +no_defs <> +# IGN 1962 Kerguelen +<4698> +proj=longlat +ellps=intl +towgs84=145,-187,103,0,0,0,0 +no_defs <> +# Le Pouce 1934 +<4699> +proj=longlat +ellps=clrk80 +towgs84=-770.1,158.4,-498.2,0,0,0,0 +no_defs <> +# IGN Astro 1960 +<4700> +proj=longlat +ellps=clrk80 +no_defs <> +# IGCB 1955 +<4701> +proj=longlat +ellps=clrk80 +towgs84=-79.9,-158,-168.9,0,0,0,0 +no_defs <> +# Mauritania 1999 +<4702> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# Mhast 1951 +<4703> +proj=longlat +ellps=clrk80 +no_defs <> +# Mhast (onshore) +<4704> +proj=longlat +ellps=intl +no_defs <> +# Mhast (offshore) +<4705> +proj=longlat +ellps=intl +no_defs <> +# Egypt Gulf of Suez S-650 TL +<4706> +proj=longlat +ellps=helmert +towgs84=-146.21,112.63,4.05,0,0,0,0 +no_defs <> +# Tern Island 1961 +<4707> +proj=longlat +ellps=intl +towgs84=114,-116,-333,0,0,0,0 +no_defs <> +# Cocos Islands 1965 +<4708> +proj=longlat +ellps=aust_SA +towgs84=-491,-22,435,0,0,0,0 +no_defs <> +# Iwo Jima 1945 +<4709> +proj=longlat +ellps=intl +towgs84=145,75,-272,0,0,0,0 +no_defs <> +# Astro DOS 71 +<4710> +proj=longlat +ellps=intl +towgs84=-320,550,-494,0,0,0,0 +no_defs <> +# Marcus Island 1952 +<4711> +proj=longlat +ellps=intl +towgs84=124,-234,-25,0,0,0,0 +no_defs <> +# Ascension Island 1958 +<4712> +proj=longlat +ellps=intl +towgs84=-205,107,53,0,0,0,0 +no_defs <> +# Ayabelle Lighthouse +<4713> +proj=longlat +ellps=clrk80 +towgs84=-77,-128,142,0,0,0,0 +no_defs <> +# Bellevue +<4714> +proj=longlat +ellps=intl +towgs84=-127,-769,472,0,0,0,0 +no_defs <> +# Camp Area Astro +<4715> +proj=longlat +ellps=intl +towgs84=-104,-129,239,0,0,0,0 +no_defs <> +# Phoenix Islands 1966 +<4716> +proj=longlat +ellps=intl +towgs84=298,-304,-375,0,0,0,0 +no_defs <> +# Cape Canaveral +<4717> +proj=longlat +ellps=clrk66 +towgs84=-2,151,181,0,0,0,0 +no_defs <> +# Solomon 1968 +<4718> +proj=longlat +ellps=intl +towgs84=230,-199,-752,0,0,0,0 +no_defs <> +# Easter Island 1967 +<4719> +proj=longlat +ellps=intl +towgs84=211,147,111,0,0,0,0 +no_defs <> +# Fiji 1986 +<4720> +proj=longlat +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +no_defs <> +# Fiji 1956 +<4721> +proj=longlat +ellps=intl +towgs84=265.025,384.929,-194.046,0,0,0,0 +no_defs <> +# South Georgia 1968 +<4722> +proj=longlat +ellps=intl +towgs84=-794,119,-298,0,0,0,0 +no_defs <> +# GCGD59 +<4723> +proj=longlat +ellps=clrk66 +towgs84=-179.483,-69.379,-27.584,-7.862,8.163,6.042,-13.925 +no_defs <> +# Diego Garcia 1969 +<4724> +proj=longlat +ellps=intl +towgs84=208,-435,-229,0,0,0,0 +no_defs <> +# Johnston Island 1961 +<4725> +proj=longlat +ellps=intl +towgs84=189,-79,-202,0,0,0,0 +no_defs <> +# SIGD61 +<4726> +proj=longlat +ellps=clrk66 +towgs84=8.853,-52.644,180.304,-0.393,-2.323,2.96,-24.081 +no_defs <> +# Midway 1961 +<4727> +proj=longlat +ellps=intl +towgs84=403,-81,277,0,0,0,0 +no_defs <> +# Pico de las Nieves 1984 +<4728> +proj=longlat +ellps=intl +towgs84=-307,-92,127,0,0,0,0 +no_defs <> +# Pitcairn 1967 +<4729> +proj=longlat +ellps=intl +towgs84=185,165,42,0,0,0,0 +no_defs <> +# Santo 1965 +<4730> +proj=longlat +ellps=intl +towgs84=170,42,84,0,0,0,0 +no_defs <> +# Viti Levu 1916 +<4731> +proj=longlat +ellps=clrk80 +towgs84=51,391,-36,0,0,0,0 +no_defs <> +# Marshall Islands 1960 +<4732> +proj=longlat +a=6378270 +b=6356794.343434343 +towgs84=102,52,-38,0,0,0,0 +no_defs <> +# Wake Island 1952 +<4733> +proj=longlat +ellps=intl +towgs84=276,-57,149,0,0,0,0 +no_defs <> +# Tristan 1968 +<4734> +proj=longlat +ellps=intl +towgs84=-632,438,-609,0,0,0,0 +no_defs <> +# Kusaie 1951 +<4735> +proj=longlat +ellps=intl +towgs84=647,1777,-1124,0,0,0,0 +no_defs <> +# Deception Island +<4736> +proj=longlat +ellps=clrk80 +towgs84=260,12,-147,0,0,0,0 +no_defs <> +# Korea 2000 +<4737> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# Hong Kong 1963 +<4738> +proj=longlat +a=6378293.645208759 +b=6356617.987679838 +no_defs <> +# Hong Kong 1963(67) +<4739> +proj=longlat +ellps=intl +towgs84=-156,-271,-189,0,0,0,0 +no_defs <> +# PZ-90 +<4740> +proj=longlat +a=6378136 +b=6356751.361745712 +towgs84=0,0,1.5,0,0,0.076,0 +no_defs <> +# FD54 +<4741> +proj=longlat +ellps=intl +no_defs <> +# GDM2000 +<4742> +proj=longlat +ellps=GRS80 +no_defs <> +# Karbala 1979 +<4743> +proj=longlat +ellps=clrk80 +towgs84=70.995,-335.916,262.898,0,0,0,0 +no_defs <> +# Nahrwan 1934 +<4744> +proj=longlat +ellps=clrk80 +towgs84=-242.2,-144.9,370.3,0,0,0,0 +no_defs <> +# RD/83 +<4745> +proj=longlat +ellps=bessel +no_defs <> +# PD/83 +<4746> +proj=longlat +ellps=bessel +no_defs <> +# GR96 +<4747> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# Vanua Levu 1915 +<4748> +proj=longlat +a=6378306.3696 +b=6356571.996 +towgs84=51,391,-36,0,0,0,0 +no_defs <> +# RGNC91-93 +<4749> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# ST87 Ouvea +<4750> +proj=longlat +ellps=WGS84 +towgs84=-56.263,16.136,-22.856,0,0,0,0 +no_defs <> +# Kertau (RSO) +<4751> +proj=longlat +a=6377295.664 +b=6356094.667915204 +no_defs <> +# Viti Levu 1912 +<4752> +proj=longlat +a=6378306.3696 +b=6356571.996 +towgs84=98,390,-22,0,0,0,0 +no_defs <> +# fk89 +<4753> +proj=longlat +ellps=intl +no_defs <> +# LGD2006 +<4754> +proj=longlat +ellps=intl +towgs84=-208.4058,-109.8777,-2.5764,0,0,0,0 +no_defs <> +# DGN95 +<4755> +proj=longlat +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# VN-2000 +<4756> +proj=longlat +ellps=WGS84 +towgs84=-191.90441429,-39.30318279,-111.45032835,0.00928836,-0.01975479,0.00427372,0.252906278 +no_defs <> +# SVY21 +<4757> +proj=longlat +ellps=WGS84 +no_defs <> +# JAD2001 +<4758> +proj=longlat +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# NAD83(NSRS2007) +<4759> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# WGS 66 +<4760> +proj=longlat +ellps=WGS66 +no_defs <> +# HTRS96 +<4761> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# BDA2000 +<4762> +proj=longlat +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# Pitcairn 2006 +<4763> +proj=longlat +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# RSRGD2000 +<4764> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# Slovenia 1996 +<4765> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# Bern 1898 (Bern) +<4801> +proj=longlat +ellps=bessel +towgs84=674.374,15.056,405.346,0,0,0,0 +pm=bern +no_defs <> +# Bogota 1975 (Bogota) +<4802> +proj=longlat +ellps=intl +towgs84=307,304,-318,0,0,0,0 +pm=bogota +no_defs <> +# Lisbon (Lisbon) +<4803> +proj=longlat +ellps=intl +towgs84=-304.046,-60.576,103.64,0,0,0,0 +pm=lisbon +no_defs <> +# Makassar (Jakarta) +<4804> +proj=longlat +ellps=bessel +towgs84=-587.8,519.75,145.76,0,0,0,0 +pm=jakarta +no_defs <> +# MGI (Ferro) +<4805> +proj=longlat +ellps=bessel +towgs84=682,-203,480,0,0,0,0 +pm=ferro +no_defs <> +# Monte Mario (Rome) +<4806> +proj=longlat +ellps=intl +towgs84=-104.1,-49.1,-9.9,0.971,-2.917,0.714,-11.68 +pm=rome +no_defs <> +# NTF (Paris) +<4807> +proj=longlat +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +no_defs <> +# Padang (Jakarta) +<4808> +proj=longlat +ellps=bessel +pm=jakarta +no_defs <> +# Belge 1950 (Brussels) +<4809> +proj=longlat +ellps=intl +pm=brussels +no_defs <> +# Tananarive (Paris) +<4810> +proj=longlat +ellps=intl +towgs84=-189,-242,-91,0,0,0,0 +pm=paris +no_defs <> +# Voirol 1875 (Paris) +<4811> +proj=longlat +a=6378249.2 +b=6356515 +towgs84=-73,-247,227,0,0,0,0 +pm=paris +no_defs <> +# Batavia (Jakarta) +<4813> +proj=longlat +ellps=bessel +towgs84=-377,681,-50,0,0,0,0 +pm=jakarta +no_defs <> +# RT38 (Stockholm) +<4814> +proj=longlat +ellps=bessel +pm=stockholm +no_defs <> +# Greek (Athens) +<4815> +proj=longlat +ellps=bessel +pm=athens +no_defs <> +# Carthage (Paris) +<4816> +proj=longlat +a=6378249.2 +b=6356515 +towgs84=-263,6,431,0,0,0,0 +pm=paris +no_defs <> +# NGO 1948 (Oslo) +<4817> +proj=longlat +a=6377492.018 +b=6356173.508712696 +towgs84=278.3,93,474.5,7.889,0.05,-6.61,6.21 +pm=oslo +no_defs <> +# S-JTSK (Ferro) +<4818> +proj=longlat +ellps=bessel +towgs84=589,76,480,0,0,0,0 +pm=ferro +no_defs <> +# Nord Sahara 1959 (Paris) +<4819> +proj=longlat +ellps=clrk80 +towgs84=-209.3622,-87.8162,404.6198,0.0046,3.4784,0.5805,-1.4547 +pm=paris +no_defs <> +# Segara (Jakarta) +<4820> +proj=longlat +ellps=bessel +towgs84=-403,684,41,0,0,0,0 +pm=jakarta +no_defs <> +# Voirol 1879 (Paris) +<4821> +proj=longlat +a=6378249.2 +b=6356515 +pm=paris +no_defs <> +# Sao Tome +<4823> +proj=longlat +ellps=intl +no_defs <> +# Principe +<4824> +proj=longlat +ellps=intl +no_defs <> +# ATF (Paris) +<4901> +proj=longlat +a=6376523 +b=6355862.933255573 +pm=2.337208333333333 +no_defs <> +# NDG (Paris) +<4902> +proj=longlat +a=6376523 +b=6355862.933255573 +pm=paris +no_defs <> +# Madrid 1870 (Madrid) +<4903> +proj=longlat +a=6378298.3 +b=6356657.142669561 +pm=madrid +no_defs <> +# Lisbon 1890 (Lisbon) +<4904> +proj=longlat +ellps=bessel +towgs84=508.088,-191.042,565.223,0,0,0,0 +pm=lisbon +no_defs <> +# PTRA08 +<5013> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# Tokyo 1892 +<5132> +proj=longlat +ellps=bessel +no_defs <> +# S-JTSK/05 +<5228> +proj=longlat +ellps=bessel +towgs84=572.213,85.334,461.94,4.9732,1.529,5.2484,3.5378 +no_defs <> +# S-JTSK/05 (Ferro) +<5229> +proj=longlat +ellps=bessel +towgs84=572.213,85.334,461.94,4.9732,1.529,5.2484,3.5378 +pm=ferro +no_defs <> +# SLD99 +<5233> +proj=longlat +a=6377276.345 +b=6356075.41314024 +towgs84=-0.293,766.95,87.713,0.195704,1.695068,3.473016,-0.039338 +no_defs <> +# GDBD2009 +<5246> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# TUREF +<5252> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# DRUKREF 03 +<5264> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# ISN2004 +<5324> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# POSGAR 2007 +<5340> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# MARGEN +<5354> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# SIRGAS-Chile +<5360> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# CR05 +<5365> +proj=longlat +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# MACARIO SOLIS +<5371> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# Peru96 +<5373> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# SIRGAS-ROU98 +<5381> +proj=longlat +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# SIRGAS_ES2007.8 +<5393> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# Ocotepeque 1935 +<5451> +proj=longlat +ellps=clrk66 +towgs84=205,96,-98,0,0,0,0 +no_defs <> +# Sibun Gorge 1922 +<5464> +proj=longlat +a=6378293.645208759 +b=6356617.987679838 +no_defs <> +# Panama-Colon 1911 +<5467> +proj=longlat +ellps=clrk66 +no_defs <> +# RGAF09 +<5489> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# Corrego Alegre 1961 +<5524> +proj=longlat +ellps=intl +no_defs <> +# SAD69(96) +<5527> +proj=longlat +ellps=aust_SA +towgs84=-67.35,3.88,-38.22,0,0,0,0 +no_defs <> +# PNG94 +<5546> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# UCS-2000 +<5561> +proj=longlat +ellps=krass +towgs84=25,-141,-78.5,0,0.35,0.736,0 +no_defs <> +# FEH2010 +<5593> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# DB_REF +<5681> +proj=longlat +ellps=bessel +no_defs <> +# TGD2005 +<5886> +proj=longlat +ellps=GRS80 +no_defs <> +# CIGD11 +<6135> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# Nepal 1981 +<6207> +proj=longlat +a=6377276.345 +b=6356075.41314024 +towgs84=293.17,726.18,245.36,0,0,0,0 +no_defs <> +# CGRS93 +<6311> +proj=longlat +ellps=WGS84 +towgs84=8.846,-4.394,-1.122,-0.00237,-0.146528,0.130428,0.783926 +no_defs <> +# NAD83(2011) +<6318> +proj=longlat +ellps=GRS80 +no_defs <> +# NAD83(PA11) +<6322> +proj=longlat +ellps=GRS80 +no_defs <> +# NAD83(MA11) +<6325> +proj=longlat +ellps=GRS80 +no_defs <> +# Mexico ITRF2008 +<6365> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# JGD2011 +<6668> +proj=longlat +ellps=GRS80 +no_defs <> +# RDN2008 +<6706> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# NAD83(CORS96) +<6783> +proj=longlat +ellps=GRS80 +no_defs <> +# Aden 1925 +<6881> +proj=longlat +ellps=clrk80 +towgs84=-24,-203,268,0,0,0,0 +no_defs <> +# Bekaa Valley 1920 +<6882> +proj=longlat +ellps=clrk80 +towgs84=-183,-15,273,0,0,0,0 +no_defs <> +# Bioko +<6883> +proj=longlat +ellps=intl +towgs84=-235,-110,393,0,0,0,0 +no_defs <> +# South East Island 1943 +<6892> +proj=longlat +ellps=clrk80 +towgs84=-43.685,-179.785,-267.721,0,0,0,0 +no_defs <> +# Gambia +<6894> +proj=longlat +ellps=clrk80 +towgs84=-63,176,185,0,0,0,0 +no_defs <> +# IGD05 +<6980> +proj=longlat +ellps=GRS80 +no_defs <> +# IG05 Intermediate CRS +<6983> +proj=longlat +ellps=GRS80 +no_defs <> +# IGD05/12 +<6987> +proj=longlat +ellps=GRS80 +no_defs <> +# IG05/12 Intermediate CRS +<6990> +proj=longlat +ellps=GRS80 +no_defs <> +# RGSPM06 (lon-lat) +<7035> +proj=longlat +ellps=GRS80 +no_defs <> +# RGR92 (lon-lat) +<7037> +proj=longlat +ellps=GRS80 +no_defs <> +# RGM04 (lon-lat) +<7039> +proj=longlat +ellps=GRS80 +no_defs <> +# RGFG95 (lon-lat) +<7041> +proj=longlat +ellps=GRS80 +no_defs <> +# RGTAAF07 +<7073> +proj=longlat +ellps=GRS80 +no_defs <> +# RGF93 (lon-lat) +<7084> +proj=longlat +ellps=GRS80 +no_defs <> +# RGAF09 (lon-lat) +<7086> +proj=longlat +ellps=GRS80 +no_defs <> +# RGTAAF07 (lon-lat) +<7088> +proj=longlat +ellps=GRS80 +no_defs <> +# RGTAAF07 (lon-lat) +<7133> +proj=longlat +ellps=GRS80 +no_defs <> +# IGD05 +<7136> +proj=longlat +ellps=WGS84 +no_defs <> +# IGD05/12 +<7139> +proj=longlat +ellps=WGS84 +no_defs <> +# ONGD14 +<7373> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# GSK-2011 +<7683> +proj=longlat +a=6378136.5 +b=6356751.757955603 +no_defs <> +# Kyrg-06 +<7686> +proj=longlat +ellps=GRS80 +no_defs <> +# BGS2005 +<7798> +proj=longlat +ellps=GRS80 +no_defs <> +# GDA2020 +<7844> +proj=longlat +ellps=GRS80 +no_defs <> +# St. Helena Tritan +<7881> +proj=longlat +ellps=WGS84 +towgs84=-0.077,0.079,0.086,0,0,0,0 +no_defs <> +# SHGD2015 +<7886> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# Anguilla 1957 / British West Indies Grid +<2000> +proj=tmerc +lat_0=0 +lon_0=-62 +k=0.9995000000000001 +x_0=400000 +y_0=0 +ellps=clrk80 +units=m +no_defs <> +# Antigua 1943 / British West Indies Grid +<2001> +proj=tmerc +lat_0=0 +lon_0=-62 +k=0.9995000000000001 +x_0=400000 +y_0=0 +ellps=clrk80 +towgs84=-255,-15,71,0,0,0,0 +units=m +no_defs <> +# Dominica 1945 / British West Indies Grid +<2002> +proj=tmerc +lat_0=0 +lon_0=-62 +k=0.9995000000000001 +x_0=400000 +y_0=0 +ellps=clrk80 +towgs84=725,685,536,0,0,0,0 +units=m +no_defs <> +# Grenada 1953 / British West Indies Grid +<2003> +proj=tmerc +lat_0=0 +lon_0=-62 +k=0.9995000000000001 +x_0=400000 +y_0=0 +ellps=clrk80 +towgs84=72,213.7,93,0,0,0,0 +units=m +no_defs <> +# Montserrat 1958 / British West Indies Grid +<2004> +proj=tmerc +lat_0=0 +lon_0=-62 +k=0.9995000000000001 +x_0=400000 +y_0=0 +ellps=clrk80 +towgs84=174,359,365,0,0,0,0 +units=m +no_defs <> +# St. Kitts 1955 / British West Indies Grid +<2005> +proj=tmerc +lat_0=0 +lon_0=-62 +k=0.9995000000000001 +x_0=400000 +y_0=0 +ellps=clrk80 +towgs84=9,183,236,0,0,0,0 +units=m +no_defs <> +# St. Lucia 1955 / British West Indies Grid +<2006> +proj=tmerc +lat_0=0 +lon_0=-62 +k=0.9995000000000001 +x_0=400000 +y_0=0 +ellps=clrk80 +towgs84=-149,128,296,0,0,0,0 +units=m +no_defs <> +# St. Vincent 45 / British West Indies Grid +<2007> +proj=tmerc +lat_0=0 +lon_0=-62 +k=0.9995000000000001 +x_0=400000 +y_0=0 +ellps=clrk80 +towgs84=195.671,332.517,274.607,0,0,0,0 +units=m +no_defs <> +# NAD27(CGQ77) / SCoPQ zone 2 (deprecated) +<2008> +proj=tmerc +lat_0=0 +lon_0=-55.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m +no_defs <> +# NAD27(CGQ77) / SCoPQ zone 3 +<2009> +proj=tmerc +lat_0=0 +lon_0=-58.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m +no_defs <> +# NAD27(CGQ77) / SCoPQ zone 4 +<2010> +proj=tmerc +lat_0=0 +lon_0=-61.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m +no_defs <> +# NAD27(CGQ77) / SCoPQ zone 5 +<2011> +proj=tmerc +lat_0=0 +lon_0=-64.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m +no_defs <> +# NAD27(CGQ77) / SCoPQ zone 6 +<2012> +proj=tmerc +lat_0=0 +lon_0=-67.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m +no_defs <> +# NAD27(CGQ77) / SCoPQ zone 7 +<2013> +proj=tmerc +lat_0=0 +lon_0=-70.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m +no_defs <> +# NAD27(CGQ77) / SCoPQ zone 8 +<2014> +proj=tmerc +lat_0=0 +lon_0=-73.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m +no_defs <> +# NAD27(CGQ77) / SCoPQ zone 9 +<2015> +proj=tmerc +lat_0=0 +lon_0=-76.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m +no_defs <> +# NAD27(CGQ77) / SCoPQ zone 10 +<2016> +proj=tmerc +lat_0=0 +lon_0=-79.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m +no_defs <> +# NAD27(76) / MTM zone 8 +<2017> +proj=tmerc +lat_0=0 +lon_0=-73.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m +no_defs <> +# NAD27(76) / MTM zone 9 +<2018> +proj=tmerc +lat_0=0 +lon_0=-76.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m +no_defs <> +# NAD27(76) / MTM zone 10 +<2019> +proj=tmerc +lat_0=0 +lon_0=-79.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m +no_defs <> +# NAD27(76) / MTM zone 11 +<2020> +proj=tmerc +lat_0=0 +lon_0=-82.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m +no_defs <> +# NAD27(76) / MTM zone 12 +<2021> +proj=tmerc +lat_0=0 +lon_0=-81 +k=0.9999 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m +no_defs <> +# NAD27(76) / MTM zone 13 +<2022> +proj=tmerc +lat_0=0 +lon_0=-84 +k=0.9999 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m +no_defs <> +# NAD27(76) / MTM zone 14 +<2023> +proj=tmerc +lat_0=0 +lon_0=-87 +k=0.9999 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m +no_defs <> +# NAD27(76) / MTM zone 15 +<2024> +proj=tmerc +lat_0=0 +lon_0=-90 +k=0.9999 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m +no_defs <> +# NAD27(76) / MTM zone 16 +<2025> +proj=tmerc +lat_0=0 +lon_0=-93 +k=0.9999 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m +no_defs <> +# NAD27(76) / MTM zone 17 +<2026> +proj=tmerc +lat_0=0 +lon_0=-96 +k=0.9999 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m +no_defs <> +# NAD27(76) / UTM zone 15N +<2027> +proj=utm +zone=15 +ellps=clrk66 +units=m +no_defs <> +# NAD27(76) / UTM zone 16N +<2028> +proj=utm +zone=16 +ellps=clrk66 +units=m +no_defs <> +# NAD27(76) / UTM zone 17N +<2029> +proj=utm +zone=17 +ellps=clrk66 +units=m +no_defs <> +# NAD27(76) / UTM zone 18N +<2030> +proj=utm +zone=18 +ellps=clrk66 +units=m +no_defs <> +# NAD27(CGQ77) / UTM zone 17N +<2031> +proj=utm +zone=17 +ellps=clrk66 +units=m +no_defs <> +# NAD27(CGQ77) / UTM zone 18N +<2032> +proj=utm +zone=18 +ellps=clrk66 +units=m +no_defs <> +# NAD27(CGQ77) / UTM zone 19N +<2033> +proj=utm +zone=19 +ellps=clrk66 +units=m +no_defs <> +# NAD27(CGQ77) / UTM zone 20N +<2034> +proj=utm +zone=20 +ellps=clrk66 +units=m +no_defs <> +# NAD27(CGQ77) / UTM zone 21N +<2035> +proj=utm +zone=21 +ellps=clrk66 +units=m +no_defs <> +# NAD83(CSRS98) / New Brunswick Stereo (deprecated) +<2036> +proj=sterea +lat_0=46.5 +lon_0=-66.5 +k=0.999912 +x_0=2500000 +y_0=7500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS98) / UTM zone 19N (deprecated) +<2037> +proj=utm +zone=19 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS98) / UTM zone 20N (deprecated) +<2038> +proj=utm +zone=20 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Israel 1993 / Israeli TM Grid +<2039> +proj=tmerc +lat_0=31.73439361111111 +lon_0=35.20451694444445 +k=1.0000067 +x_0=219529.584 +y_0=626907.39 +ellps=GRS80 +towgs84=-48,55,52,0,0,0,0 +units=m +no_defs <> +# Locodjo 1965 / UTM zone 30N +<2040> +proj=utm +zone=30 +ellps=clrk80 +towgs84=-125,53,467,0,0,0,0 +units=m +no_defs <> +# Abidjan 1987 / UTM zone 30N +<2041> +proj=utm +zone=30 +ellps=clrk80 +towgs84=-124.76,53,466.79,0,0,0,0 +units=m +no_defs <> +# Locodjo 1965 / UTM zone 29N +<2042> +proj=utm +zone=29 +ellps=clrk80 +towgs84=-125,53,467,0,0,0,0 +units=m +no_defs <> +# Abidjan 1987 / UTM zone 29N +<2043> +proj=utm +zone=29 +ellps=clrk80 +towgs84=-124.76,53,466.79,0,0,0,0 +units=m +no_defs <> +# Hanoi 1972 / Gauss-Kruger zone 18 +<2044> +proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=18500000 +y_0=0 +ellps=krass +towgs84=-17.51,-108.32,-62.39,0,0,0,0 +units=m +no_defs <> +# Hanoi 1972 / Gauss-Kruger zone 19 +<2045> +proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=19500000 +y_0=0 +ellps=krass +towgs84=-17.51,-108.32,-62.39,0,0,0,0 +units=m +no_defs <> +# Hartebeesthoek94 / Lo15 +<2046> +proj=tmerc +lat_0=0 +lon_0=15 +k=1 +x_0=0 +y_0=0 +axis=wsu +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Hartebeesthoek94 / Lo17 +<2047> +proj=tmerc +lat_0=0 +lon_0=17 +k=1 +x_0=0 +y_0=0 +axis=wsu +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Hartebeesthoek94 / Lo19 +<2048> +proj=tmerc +lat_0=0 +lon_0=19 +k=1 +x_0=0 +y_0=0 +axis=wsu +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Hartebeesthoek94 / Lo21 +<2049> +proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=0 +y_0=0 +axis=wsu +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Hartebeesthoek94 / Lo23 +<2050> +proj=tmerc +lat_0=0 +lon_0=23 +k=1 +x_0=0 +y_0=0 +axis=wsu +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Hartebeesthoek94 / Lo25 +<2051> +proj=tmerc +lat_0=0 +lon_0=25 +k=1 +x_0=0 +y_0=0 +axis=wsu +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Hartebeesthoek94 / Lo27 +<2052> +proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=0 +y_0=0 +axis=wsu +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Hartebeesthoek94 / Lo29 +<2053> +proj=tmerc +lat_0=0 +lon_0=29 +k=1 +x_0=0 +y_0=0 +axis=wsu +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Hartebeesthoek94 / Lo31 +<2054> +proj=tmerc +lat_0=0 +lon_0=31 +k=1 +x_0=0 +y_0=0 +axis=wsu +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Hartebeesthoek94 / Lo33 +<2055> +proj=tmerc +lat_0=0 +lon_0=33 +k=1 +x_0=0 +y_0=0 +axis=wsu +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# CH1903+ / LV95 +<2056> +proj=somerc +lat_0=46.95240555555556 +lon_0=7.439583333333333 +k_0=1 +x_0=2600000 +y_0=1200000 +ellps=bessel +towgs84=674.374,15.056,405.346,0,0,0,0 +units=m +no_defs <> +# Rassadiran / Nakhl e Taqi +<2057> +proj=omerc +lat_0=27.51882880555555 +lonc=52.60353916666667 +alpha=0.5716611944444444 +k=0.999895934 +x_0=658377.437 +y_0=3044969.194 +gamma=0.5716611944444444 +ellps=intl +towgs84=-133.63,-157.5,-158.62,0,0,0,0 +units=m +no_defs <> +# ED50(ED77) / UTM zone 38N +<2058> +proj=utm +zone=38 +ellps=intl +towgs84=-117,-132,-164,0,0,0,0 +units=m +no_defs <> +# ED50(ED77) / UTM zone 39N +<2059> +proj=utm +zone=39 +ellps=intl +towgs84=-117,-132,-164,0,0,0,0 +units=m +no_defs <> +# ED50(ED77) / UTM zone 40N +<2060> +proj=utm +zone=40 +ellps=intl +towgs84=-117,-132,-164,0,0,0,0 +units=m +no_defs <> +# ED50(ED77) / UTM zone 41N +<2061> +proj=utm +zone=41 +ellps=intl +towgs84=-117,-132,-164,0,0,0,0 +units=m +no_defs <> +# Madrid 1870 (Madrid) / Spain +<2062> +proj=lcc +lat_1=40 +lat_0=40 +lon_0=0 +k_0=0.9988085293 +x_0=600000 +y_0=600000 +a=6378298.3 +b=6356657.142669561 +pm=madrid +units=m +no_defs <> +# Dabola 1981 / UTM zone 28N (deprecated) +<2063> +proj=utm +zone=28 +a=6378249.2 +b=6356515 +towgs84=-23,259,-9,0,0,0,0 +units=m +no_defs <> +# Dabola 1981 / UTM zone 29N (deprecated) +<2064> +proj=utm +zone=29 +a=6378249.2 +b=6356515 +towgs84=-23,259,-9,0,0,0,0 +units=m +no_defs <> +# S-JTSK (Ferro) / Krovak +<2065> +proj=krovak +lat_0=49.5 +lon_0=42.5 +alpha=30.28813972222222 +k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +towgs84=570.8,85.7,462.8,4.998,1.587,5.261,3.56 +pm=ferro +units=m +no_defs <> +# Mount Dillon / Tobago Grid +<2066> +proj=cass +lat_0=11.25217861111111 +lon_0=-60.68600888888889 +x_0=37718.66159325 +y_0=36209.91512952 +a=6378293.645208759 +b=6356617.987679838 +to_meter=0.201166195164 +no_defs <> +# Naparima 1955 / UTM zone 20N +<2067> +proj=utm +zone=20 +ellps=intl +towgs84=-0.465,372.095,171.736,0,0,0,0 +units=m +no_defs <> +# ELD79 / Libya zone 5 +<2068> +proj=tmerc +lat_0=0 +lon_0=9 +k=0.9999 +x_0=200000 +y_0=0 +ellps=intl +towgs84=-115.8543,-99.0583,-152.4616,0,0,0,0 +units=m +no_defs <> +# ELD79 / Libya zone 6 +<2069> +proj=tmerc +lat_0=0 +lon_0=11 +k=0.9999 +x_0=200000 +y_0=0 +ellps=intl +towgs84=-115.8543,-99.0583,-152.4616,0,0,0,0 +units=m +no_defs <> +# ELD79 / Libya zone 7 +<2070> +proj=tmerc +lat_0=0 +lon_0=13 +k=0.9999 +x_0=200000 +y_0=0 +ellps=intl +towgs84=-115.8543,-99.0583,-152.4616,0,0,0,0 +units=m +no_defs <> +# ELD79 / Libya zone 8 +<2071> +proj=tmerc +lat_0=0 +lon_0=15 +k=0.9999 +x_0=200000 +y_0=0 +ellps=intl +towgs84=-115.8543,-99.0583,-152.4616,0,0,0,0 +units=m +no_defs <> +# ELD79 / Libya zone 9 +<2072> +proj=tmerc +lat_0=0 +lon_0=17 +k=0.9999 +x_0=200000 +y_0=0 +ellps=intl +towgs84=-115.8543,-99.0583,-152.4616,0,0,0,0 +units=m +no_defs <> +# ELD79 / Libya zone 10 +<2073> +proj=tmerc +lat_0=0 +lon_0=19 +k=0.9999 +x_0=200000 +y_0=0 +ellps=intl +towgs84=-115.8543,-99.0583,-152.4616,0,0,0,0 +units=m +no_defs <> +# ELD79 / Libya zone 11 +<2074> +proj=tmerc +lat_0=0 +lon_0=21 +k=0.9999 +x_0=200000 +y_0=0 +ellps=intl +towgs84=-115.8543,-99.0583,-152.4616,0,0,0,0 +units=m +no_defs <> +# ELD79 / Libya zone 12 +<2075> +proj=tmerc +lat_0=0 +lon_0=23 +k=0.9999 +x_0=200000 +y_0=0 +ellps=intl +towgs84=-115.8543,-99.0583,-152.4616,0,0,0,0 +units=m +no_defs <> +# ELD79 / Libya zone 13 +<2076> +proj=tmerc +lat_0=0 +lon_0=25 +k=0.9999 +x_0=200000 +y_0=0 +ellps=intl +towgs84=-115.8543,-99.0583,-152.4616,0,0,0,0 +units=m +no_defs <> +# ELD79 / UTM zone 32N +<2077> +proj=utm +zone=32 +ellps=intl +towgs84=-115.8543,-99.0583,-152.4616,0,0,0,0 +units=m +no_defs <> +# ELD79 / UTM zone 33N +<2078> +proj=utm +zone=33 +ellps=intl +towgs84=-115.8543,-99.0583,-152.4616,0,0,0,0 +units=m +no_defs <> +# ELD79 / UTM zone 34N +<2079> +proj=utm +zone=34 +ellps=intl +towgs84=-115.8543,-99.0583,-152.4616,0,0,0,0 +units=m +no_defs <> +# ELD79 / UTM zone 35N +<2080> +proj=utm +zone=35 +ellps=intl +towgs84=-115.8543,-99.0583,-152.4616,0,0,0,0 +units=m +no_defs <> +# Chos Malal 1914 / Argentina 2 +<2081> +proj=tmerc +lat_0=-90 +lon_0=-69 +k=1 +x_0=2500000 +y_0=0 +ellps=intl +units=m +no_defs <> +# Pampa del Castillo / Argentina 2 +<2082> +proj=tmerc +lat_0=-90 +lon_0=-69 +k=1 +x_0=2500000 +y_0=0 +ellps=intl +towgs84=27.5,14,186.4,0,0,0,0 +units=m +no_defs <> +# Hito XVIII 1963 / Argentina 2 +<2083> +proj=tmerc +lat_0=-90 +lon_0=-69 +k=1 +x_0=2500000 +y_0=0 +ellps=intl +towgs84=16,196,93,0,0,0,0 +units=m +no_defs <> +# Hito XVIII 1963 / UTM zone 19S +<2084> +proj=utm +zone=19 +south +ellps=intl +towgs84=16,196,93,0,0,0,0 +units=m +no_defs <> +# NAD27 / Cuba Norte (deprecated) +<2085> +proj=lcc +lat_1=22.35 +lat_0=22.35 +lon_0=-81 +k_0=0.99993602 +x_0=500000 +y_0=280296.016 +datum=NAD27 +units=m +no_defs <> +# NAD27 / Cuba Sur (deprecated) +<2086> +proj=lcc +lat_1=20.71666666666667 +lat_0=20.71666666666667 +lon_0=-76.83333333333333 +k_0=0.99994848 +x_0=500000 +y_0=229126.939 +datum=NAD27 +units=m +no_defs <> +# ELD79 / TM 12 NE +<2087> +proj=tmerc +lat_0=0 +lon_0=12 +k=0.9996 +x_0=500000 +y_0=0 +ellps=intl +towgs84=-115.8543,-99.0583,-152.4616,0,0,0,0 +units=m +no_defs <> +# Carthage / TM 11 NE +<2088> +proj=tmerc +lat_0=0 +lon_0=11 +k=0.9996 +x_0=500000 +y_0=0 +datum=carthage +units=m +no_defs <> +# Yemen NGN96 / UTM zone 38N +<2089> +proj=utm +zone=38 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Yemen NGN96 / UTM zone 39N +<2090> +proj=utm +zone=39 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# South Yemen / Gauss Kruger zone 8 (deprecated) +<2091> +proj=tmerc +lat_0=0 +lon_0=45 +k=1 +x_0=8500000 +y_0=0 +ellps=krass +towgs84=-76,-138,67,0,0,0,0 +units=m +no_defs <> +# South Yemen / Gauss Kruger zone 9 (deprecated) +<2092> +proj=tmerc +lat_0=0 +lon_0=51 +k=1 +x_0=9500000 +y_0=0 +ellps=krass +towgs84=-76,-138,67,0,0,0,0 +units=m +no_defs <> +# Hanoi 1972 / GK 106 NE +<2093> +proj=tmerc +lat_0=0 +lon_0=106 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=-17.51,-108.32,-62.39,0,0,0,0 +units=m +no_defs <> +# WGS 72BE / TM 106 NE +<2094> +proj=tmerc +lat_0=0 +lon_0=106 +k=0.9996 +x_0=500000 +y_0=0 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# Bissau / UTM zone 28N +<2095> +proj=utm +zone=28 +ellps=intl +towgs84=-173,253,27,0,0,0,0 +units=m +no_defs <> +# Korean 1985 / East Belt +<2096> +proj=tmerc +lat_0=38 +lon_0=129 +k=1 +x_0=200000 +y_0=500000 +ellps=bessel +units=m +no_defs <> +# Korean 1985 / Central Belt +<2097> +proj=tmerc +lat_0=38 +lon_0=127 +k=1 +x_0=200000 +y_0=500000 +ellps=bessel +units=m +no_defs <> +# Korean 1985 / West Belt +<2098> +proj=tmerc +lat_0=38 +lon_0=125 +k=1 +x_0=200000 +y_0=500000 +ellps=bessel +units=m +no_defs <> +# Qatar 1948 / Qatar Grid +<2099> +proj=cass +lat_0=25.38236111111111 +lon_0=50.76138888888889 +x_0=100000 +y_0=100000 +ellps=helmert +units=m +no_defs <> +# GGRS87 / Greek Grid +<2100> +proj=tmerc +lat_0=0 +lon_0=24 +k=0.9996 +x_0=500000 +y_0=0 +datum=GGRS87 +units=m +no_defs <> +# Lake / Maracaibo Grid M1 +<2101> +proj=lcc +lat_1=10.16666666666667 +lat_0=10.16666666666667 +lon_0=-71.60561777777777 +k_0=1 +x_0=0 +y_0=-52684.972 +ellps=intl +units=m +no_defs <> +# Lake / Maracaibo Grid +<2102> +proj=lcc +lat_1=10.16666666666667 +lat_0=10.16666666666667 +lon_0=-71.60561777777777 +k_0=1 +x_0=200000 +y_0=147315.028 +ellps=intl +units=m +no_defs <> +# Lake / Maracaibo Grid M3 +<2103> +proj=lcc +lat_1=10.16666666666667 +lat_0=10.16666666666667 +lon_0=-71.60561777777777 +k_0=1 +x_0=500000 +y_0=447315.028 +ellps=intl +units=m +no_defs <> +# Lake / Maracaibo La Rosa Grid +<2104> +proj=lcc +lat_1=10.16666666666667 +lat_0=10.16666666666667 +lon_0=-71.60561777777777 +k_0=1 +x_0=-17044 +y_0=-23139.97 +ellps=intl +units=m +no_defs <> +# NZGD2000 / Mount Eden 2000 +<2105> +proj=tmerc +lat_0=-36.87972222222222 +lon_0=174.7641666666667 +k=0.9999 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NZGD2000 / Bay of Plenty 2000 +<2106> +proj=tmerc +lat_0=-37.76111111111111 +lon_0=176.4661111111111 +k=1 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NZGD2000 / Poverty Bay 2000 +<2107> +proj=tmerc +lat_0=-38.62444444444444 +lon_0=177.8855555555556 +k=1 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NZGD2000 / Hawkes Bay 2000 +<2108> +proj=tmerc +lat_0=-39.65083333333333 +lon_0=176.6736111111111 +k=1 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NZGD2000 / Taranaki 2000 +<2109> +proj=tmerc +lat_0=-39.13555555555556 +lon_0=174.2277777777778 +k=1 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NZGD2000 / Tuhirangi 2000 +<2110> +proj=tmerc +lat_0=-39.51222222222222 +lon_0=175.64 +k=1 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NZGD2000 / Wanganui 2000 +<2111> +proj=tmerc +lat_0=-40.24194444444444 +lon_0=175.4880555555555 +k=1 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NZGD2000 / Wairarapa 2000 +<2112> +proj=tmerc +lat_0=-40.92527777777777 +lon_0=175.6472222222222 +k=1 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NZGD2000 / Wellington 2000 +<2113> +proj=tmerc +lat_0=-41.3011111111111 +lon_0=174.7763888888889 +k=1 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NZGD2000 / Collingwood 2000 +<2114> +proj=tmerc +lat_0=-40.71472222222223 +lon_0=172.6719444444444 +k=1 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NZGD2000 / Nelson 2000 +<2115> +proj=tmerc +lat_0=-41.27444444444444 +lon_0=173.2991666666667 +k=1 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NZGD2000 / Karamea 2000 +<2116> +proj=tmerc +lat_0=-41.28972222222222 +lon_0=172.1088888888889 +k=1 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NZGD2000 / Buller 2000 +<2117> +proj=tmerc +lat_0=-41.81055555555555 +lon_0=171.5811111111111 +k=1 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NZGD2000 / Grey 2000 +<2118> +proj=tmerc +lat_0=-42.33361111111111 +lon_0=171.5497222222222 +k=1 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NZGD2000 / Amuri 2000 +<2119> +proj=tmerc +lat_0=-42.68888888888888 +lon_0=173.01 +k=1 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NZGD2000 / Marlborough 2000 +<2120> +proj=tmerc +lat_0=-41.54444444444444 +lon_0=173.8019444444444 +k=1 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NZGD2000 / Hokitika 2000 +<2121> +proj=tmerc +lat_0=-42.88611111111111 +lon_0=170.9797222222222 +k=1 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NZGD2000 / Okarito 2000 +<2122> +proj=tmerc +lat_0=-43.11 +lon_0=170.2608333333333 +k=1 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NZGD2000 / Jacksons Bay 2000 +<2123> +proj=tmerc +lat_0=-43.97777777777778 +lon_0=168.6061111111111 +k=1 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NZGD2000 / Mount Pleasant 2000 +<2124> +proj=tmerc +lat_0=-43.59055555555556 +lon_0=172.7269444444445 +k=1 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NZGD2000 / Gawler 2000 +<2125> +proj=tmerc +lat_0=-43.74861111111111 +lon_0=171.3605555555555 +k=1 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NZGD2000 / Timaru 2000 +<2126> +proj=tmerc +lat_0=-44.40194444444445 +lon_0=171.0572222222222 +k=1 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NZGD2000 / Lindis Peak 2000 +<2127> +proj=tmerc +lat_0=-44.735 +lon_0=169.4675 +k=1 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NZGD2000 / Mount Nicholas 2000 +<2128> +proj=tmerc +lat_0=-45.13277777777778 +lon_0=168.3986111111111 +k=1 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NZGD2000 / Mount York 2000 +<2129> +proj=tmerc +lat_0=-45.56361111111111 +lon_0=167.7386111111111 +k=1 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NZGD2000 / Observation Point 2000 +<2130> +proj=tmerc +lat_0=-45.81611111111111 +lon_0=170.6283333333333 +k=1 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NZGD2000 / North Taieri 2000 +<2131> +proj=tmerc +lat_0=-45.86138888888889 +lon_0=170.2825 +k=0.99996 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NZGD2000 / Bluff 2000 +<2132> +proj=tmerc +lat_0=-46.6 +lon_0=168.3427777777778 +k=1 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NZGD2000 / UTM zone 58S +<2133> +proj=utm +zone=58 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NZGD2000 / UTM zone 59S +<2134> +proj=utm +zone=59 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NZGD2000 / UTM zone 60S +<2135> +proj=utm +zone=60 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Accra / Ghana National Grid +<2136> +proj=tmerc +lat_0=4.666666666666667 +lon_0=-1 +k=0.99975 +x_0=274319.7391633579 +y_0=0 +a=6378300 +b=6356751.689189189 +towgs84=-199,32,322,0,0,0,0 +to_meter=0.3047997101815088 +no_defs <> +# Accra / TM 1 NW +<2137> +proj=tmerc +lat_0=0 +lon_0=-1 +k=0.9996 +x_0=500000 +y_0=0 +a=6378300 +b=6356751.689189189 +towgs84=-199,32,322,0,0,0,0 +units=m +no_defs <> +# NAD27(CGQ77) / Quebec Lambert +<2138> +proj=lcc +lat_1=60 +lat_2=46 +lat_0=44 +lon_0=-68.5 +x_0=0 +y_0=0 +ellps=clrk66 +units=m +no_defs <> +# NAD83(CSRS98) / SCoPQ zone 2 (deprecated) +<2139> +proj=tmerc +lat_0=0 +lon_0=-55.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS98) / MTM zone 3 (deprecated) +<2140> +proj=tmerc +lat_0=0 +lon_0=-58.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS98) / MTM zone 4 (deprecated) +<2141> +proj=tmerc +lat_0=0 +lon_0=-61.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS98) / MTM zone 5 (deprecated) +<2142> +proj=tmerc +lat_0=0 +lon_0=-64.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS98) / MTM zone 6 (deprecated) +<2143> +proj=tmerc +lat_0=0 +lon_0=-67.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS98) / MTM zone 7 (deprecated) +<2144> +proj=tmerc +lat_0=0 +lon_0=-70.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS98) / MTM zone 8 (deprecated) +<2145> +proj=tmerc +lat_0=0 +lon_0=-73.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS98) / MTM zone 9 (deprecated) +<2146> +proj=tmerc +lat_0=0 +lon_0=-76.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS98) / MTM zone 10 (deprecated) +<2147> +proj=tmerc +lat_0=0 +lon_0=-79.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS98) / UTM zone 21N (deprecated) +<2148> +proj=utm +zone=21 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS98) / UTM zone 18N (deprecated) +<2149> +proj=utm +zone=18 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS98) / UTM zone 17N (deprecated) +<2150> +proj=utm +zone=17 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS98) / UTM zone 13N (deprecated) +<2151> +proj=utm +zone=13 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS98) / UTM zone 12N (deprecated) +<2152> +proj=utm +zone=12 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS98) / UTM zone 11N (deprecated) +<2153> +proj=utm +zone=11 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# RGF93 / Lambert-93 +<2154> +proj=lcc +lat_1=49 +lat_2=44 +lat_0=46.5 +lon_0=3 +x_0=700000 +y_0=6600000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# American Samoa 1962 / American Samoa Lambert (deprecated) +<2155> +proj=lcc +lat_1=-14.26666666666667 +lat_0=-14.26666666666667 +lon_0=170 +k_0=1 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +towgs84=-115,118,426,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(HARN) / UTM zone 59S (deprecated) +<2156> +proj=utm +zone=59 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# IRENET95 / Irish Transverse Mercator +<2157> +proj=tmerc +lat_0=53.5 +lon_0=-8 +k=0.99982 +x_0=600000 +y_0=750000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# IRENET95 / UTM zone 29N +<2158> +proj=utm +zone=29 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Sierra Leone 1924 / New Colony Grid +<2159> +proj=tmerc +lat_0=6.666666666666667 +lon_0=-12 +k=1 +x_0=152399.8550907544 +y_0=0 +a=6378300 +b=6356751.689189189 +to_meter=0.3047997101815088 +no_defs <> +# Sierra Leone 1924 / New War Office Grid +<2160> +proj=tmerc +lat_0=6.666666666666667 +lon_0=-12 +k=1 +x_0=243839.7681452071 +y_0=182879.8261089053 +a=6378300 +b=6356751.689189189 +to_meter=0.3047997101815088 +no_defs <> +# Sierra Leone 1968 / UTM zone 28N +<2161> +proj=utm +zone=28 +ellps=clrk80 +towgs84=-88,4,101,0,0,0,0 +units=m +no_defs <> +# Sierra Leone 1968 / UTM zone 29N +<2162> +proj=utm +zone=29 +ellps=clrk80 +towgs84=-88,4,101,0,0,0,0 +units=m +no_defs <> +# US National Atlas Equal Area +<2163> +proj=laea +lat_0=45 +lon_0=-100 +x_0=0 +y_0=0 +a=6370997 +b=6370997 +units=m +no_defs <> +# Locodjo 1965 / TM 5 NW +<2164> +proj=tmerc +lat_0=0 +lon_0=-5 +k=0.9996 +x_0=500000 +y_0=0 +ellps=clrk80 +towgs84=-125,53,467,0,0,0,0 +units=m +no_defs <> +# Abidjan 1987 / TM 5 NW +<2165> +proj=tmerc +lat_0=0 +lon_0=-5 +k=0.9996 +x_0=500000 +y_0=0 +ellps=clrk80 +towgs84=-124.76,53,466.79,0,0,0,0 +units=m +no_defs <> +# Pulkovo 1942(83) / Gauss Kruger zone 3 (deprecated) +<2166> +proj=tmerc +lat_0=0 +lon_0=9 +k=1 +x_0=3500000 +y_0=0 +ellps=krass +towgs84=26,-121,-78,0,0,0,0 +units=m +no_defs <> +# Pulkovo 1942(83) / Gauss Kruger zone 4 (deprecated) +<2167> +proj=tmerc +lat_0=0 +lon_0=12 +k=1 +x_0=4500000 +y_0=0 +ellps=krass +towgs84=26,-121,-78,0,0,0,0 +units=m +no_defs <> +# Pulkovo 1942(83) / Gauss Kruger zone 5 (deprecated) +<2168> +proj=tmerc +lat_0=0 +lon_0=15 +k=1 +x_0=5500000 +y_0=0 +ellps=krass +towgs84=26,-121,-78,0,0,0,0 +units=m +no_defs <> +# Luxembourg 1930 / Gauss +<2169> +proj=tmerc +lat_0=49.83333333333334 +lon_0=6.166666666666667 +k=1 +x_0=80000 +y_0=100000 +ellps=intl +towgs84=-189.6806,18.3463,-42.7695,-0.33746,-3.09264,2.53861,0.4598 +units=m +no_defs <> +# MGI / Slovenia Grid (deprecated) +<2170> +proj=tmerc +lat_0=0 +lon_0=15 +k=0.9999 +x_0=500000 +y_0=0 +datum=hermannskogel +units=m +no_defs <> +# Pulkovo 1942(58) / Poland zone I (deprecated) +<2171> +proj=sterea +lat_0=50.625 +lon_0=21.08333333333333 +k=0.9998 +x_0=4637000 +y_0=5647000 +ellps=krass +towgs84=33.4,-146.6,-76.3,-0.359,-0.053,0.844,-0.84 +units=m +no_defs <> +# Pulkovo 1942(58) / Poland zone II +<2172> +proj=sterea +lat_0=53.00194444444445 +lon_0=21.50277777777778 +k=0.9998 +x_0=4603000 +y_0=5806000 +ellps=krass +towgs84=33.4,-146.6,-76.3,-0.359,-0.053,0.844,-0.84 +units=m +no_defs <> +# Pulkovo 1942(58) / Poland zone III +<2173> +proj=sterea +lat_0=53.58333333333334 +lon_0=17.00833333333333 +k=0.9998 +x_0=3501000 +y_0=5999000 +ellps=krass +towgs84=33.4,-146.6,-76.3,-0.359,-0.053,0.844,-0.84 +units=m +no_defs <> +# Pulkovo 1942(58) / Poland zone IV +<2174> +proj=sterea +lat_0=51.67083333333333 +lon_0=16.67222222222222 +k=0.9998 +x_0=3703000 +y_0=5627000 +ellps=krass +towgs84=33.4,-146.6,-76.3,-0.359,-0.053,0.844,-0.84 +units=m +no_defs <> +# Pulkovo 1942(58) / Poland zone V +<2175> +proj=tmerc +lat_0=0 +lon_0=18.95833333333333 +k=0.999983 +x_0=237000 +y_0=-4700000 +ellps=krass +towgs84=33.4,-146.6,-76.3,-0.359,-0.053,0.844,-0.84 +units=m +no_defs <> +# ETRS89 / Poland CS2000 zone 5 +<2176> +proj=tmerc +lat_0=0 +lon_0=15 +k=0.999923 +x_0=5500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / Poland CS2000 zone 6 +<2177> +proj=tmerc +lat_0=0 +lon_0=18 +k=0.999923 +x_0=6500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / Poland CS2000 zone 7 +<2178> +proj=tmerc +lat_0=0 +lon_0=21 +k=0.999923 +x_0=7500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / Poland CS2000 zone 8 +<2179> +proj=tmerc +lat_0=0 +lon_0=24 +k=0.999923 +x_0=8500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / Poland CS92 +<2180> +proj=tmerc +lat_0=0 +lon_0=19 +k=0.9993 +x_0=500000 +y_0=-5300000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Azores Occidental 1939 / UTM zone 25N +<2188> +proj=utm +zone=25 +ellps=intl +towgs84=-425,-169,81,0,0,0,0 +units=m +no_defs <> +# Azores Central 1948 / UTM zone 26N +<2189> +proj=utm +zone=26 +ellps=intl +towgs84=-104,167,-38,0,0,0,0 +units=m +no_defs <> +# Azores Oriental 1940 / UTM zone 26N +<2190> +proj=utm +zone=26 +ellps=intl +towgs84=-203,141,53,0,0,0,0 +units=m +no_defs <> +# Madeira 1936 / UTM zone 28N (deprecated) +<2191> +proj=utm +zone=28 +ellps=intl +units=m +no_defs <> +# ED50 / France EuroLambert (deprecated) +<2192> +proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=2.337229166666667 +k_0=0.99987742 +x_0=600000 +y_0=2200000 +ellps=intl +towgs84=-87,-98,-121,0,0,0,0 +units=m +no_defs <> +# NZGD2000 / New Zealand Transverse Mercator 2000 +<2193> +proj=tmerc +lat_0=0 +lon_0=173 +k=0.9996 +x_0=1600000 +y_0=10000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# American Samoa 1962 / American Samoa Lambert (deprecated) +<2194> +proj=lcc +lat_1=-14.26666666666667 +lat_0=-14.26666666666667 +lon_0=-170 +k_0=1 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +towgs84=-115,118,426,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(HARN) / UTM zone 2S +<2195> +proj=utm +zone=2 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / Kp2000 Jutland +<2196> +proj=tmerc +lat_0=0 +lon_0=9.5 +k=0.99995 +x_0=200000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / Kp2000 Zealand +<2197> +proj=tmerc +lat_0=0 +lon_0=12 +k=0.99995 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / Kp2000 Bornholm +<2198> +proj=tmerc +lat_0=0 +lon_0=15 +k=1 +x_0=900000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Albanian 1987 / Gauss Kruger zone 4 (deprecated) +<2199> +proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=4500000 +y_0=0 +ellps=krass +towgs84=-44.183,-0.58,-38.489,2.3867,2.7072,-3.5196,-8.2703 +units=m +no_defs <> +# ATS77 / New Brunswick Stereographic (ATS77) +<2200> +proj=sterea +lat_0=46.5 +lon_0=-66.5 +k=0.999912 +x_0=300000 +y_0=800000 +a=6378135 +b=6356750.304921594 +units=m +no_defs <> +# REGVEN / UTM zone 18N +<2201> +proj=utm +zone=18 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# REGVEN / UTM zone 19N +<2202> +proj=utm +zone=19 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# REGVEN / UTM zone 20N +<2203> +proj=utm +zone=20 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD27 / Tennessee +<2204> +proj=lcc +lat_1=35.25 +lat_2=36.41666666666666 +lat_0=34.66666666666666 +lon_0=-86 +x_0=609601.2192024384 +y_0=30480.06096012192 +datum=NAD27 +units=us-ft +no_defs <> +# NAD83 / Kentucky North +<2205> +proj=lcc +lat_1=37.96666666666667 +lat_2=38.96666666666667 +lat_0=37.5 +lon_0=-84.25 +x_0=500000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# ED50 / 3-degree Gauss-Kruger zone 9 +<2206> +proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=9500000 +y_0=0 +ellps=intl +towgs84=-87,-98,-121,0,0,0,0 +units=m +no_defs <> +# ED50 / 3-degree Gauss-Kruger zone 10 +<2207> +proj=tmerc +lat_0=0 +lon_0=30 +k=1 +x_0=10500000 +y_0=0 +ellps=intl +towgs84=-87,-98,-121,0,0,0,0 +units=m +no_defs <> +# ED50 / 3-degree Gauss-Kruger zone 11 +<2208> +proj=tmerc +lat_0=0 +lon_0=33 +k=1 +x_0=11500000 +y_0=0 +ellps=intl +towgs84=-87,-98,-121,0,0,0,0 +units=m +no_defs <> +# ED50 / 3-degree Gauss-Kruger zone 12 +<2209> +proj=tmerc +lat_0=0 +lon_0=36 +k=1 +x_0=12500000 +y_0=0 +ellps=intl +towgs84=-87,-98,-121,0,0,0,0 +units=m +no_defs <> +# ED50 / 3-degree Gauss-Kruger zone 13 +<2210> +proj=tmerc +lat_0=0 +lon_0=39 +k=1 +x_0=13500000 +y_0=0 +ellps=intl +towgs84=-87,-98,-121,0,0,0,0 +units=m +no_defs <> +# ED50 / 3-degree Gauss-Kruger zone 14 +<2211> +proj=tmerc +lat_0=0 +lon_0=42 +k=1 +x_0=14500000 +y_0=0 +ellps=intl +towgs84=-87,-98,-121,0,0,0,0 +units=m +no_defs <> +# ED50 / 3-degree Gauss-Kruger zone 15 +<2212> +proj=tmerc +lat_0=0 +lon_0=45 +k=1 +x_0=15500000 +y_0=0 +ellps=intl +towgs84=-87,-98,-121,0,0,0,0 +units=m +no_defs <> +# ETRS89 / TM 30 NE +<2213> +proj=tmerc +lat_0=0 +lon_0=30 +k=0.9996 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Douala 1948 / AOF west (deprecated) +<2214> +proj=tmerc +lat_0=0 +lon_0=10.5 +k=0.999 +x_0=1000000 +y_0=1000000 +ellps=intl +towgs84=-206.1,-174.7,-87.7,0,0,0,0 +units=m +no_defs <> +# Manoca 1962 / UTM zone 32N +<2215> +proj=utm +zone=32 +a=6378249.2 +b=6356515 +towgs84=-70.9,-151.8,-41.4,0,0,0,0 +units=m +no_defs <> +# Qornoq 1927 / UTM zone 22N +<2216> +proj=utm +zone=22 +ellps=intl +towgs84=164,138,-189,0,0,0,0 +units=m +no_defs <> +# Qornoq 1927 / UTM zone 23N +<2217> +proj=utm +zone=23 +ellps=intl +towgs84=164,138,-189,0,0,0,0 +units=m +no_defs <> +# Scoresbysund 1952 / Greenland zone 5 east +# Unable to translate coordinate system EPSG:2218 into PROJ.4 format. +# +# ATS77 / UTM zone 19N +<2219> +proj=utm +zone=19 +a=6378135 +b=6356750.304921594 +units=m +no_defs <> +# ATS77 / UTM zone 20N +<2220> +proj=utm +zone=20 +a=6378135 +b=6356750.304921594 +units=m +no_defs <> +# Scoresbysund 1952 / Greenland zone 6 east +# Unable to translate coordinate system EPSG:2221 into PROJ.4 format. +# +# NAD83 / Arizona East (ft) +<2222> +proj=tmerc +lat_0=31 +lon_0=-110.1666666666667 +k=0.9999 +x_0=213360 +y_0=0 +datum=NAD83 +units=ft +no_defs <> +# NAD83 / Arizona Central (ft) +<2223> +proj=tmerc +lat_0=31 +lon_0=-111.9166666666667 +k=0.9999 +x_0=213360 +y_0=0 +datum=NAD83 +units=ft +no_defs <> +# NAD83 / Arizona West (ft) +<2224> +proj=tmerc +lat_0=31 +lon_0=-113.75 +k=0.999933333 +x_0=213360 +y_0=0 +datum=NAD83 +units=ft +no_defs <> +# NAD83 / California zone 1 (ftUS) +<2225> +proj=lcc +lat_1=41.66666666666666 +lat_2=40 +lat_0=39.33333333333334 +lon_0=-122 +x_0=2000000.0001016 +y_0=500000.0001016001 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / California zone 2 (ftUS) +<2226> +proj=lcc +lat_1=39.83333333333334 +lat_2=38.33333333333334 +lat_0=37.66666666666666 +lon_0=-122 +x_0=2000000.0001016 +y_0=500000.0001016001 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / California zone 3 (ftUS) +<2227> +proj=lcc +lat_1=38.43333333333333 +lat_2=37.06666666666667 +lat_0=36.5 +lon_0=-120.5 +x_0=2000000.0001016 +y_0=500000.0001016001 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / California zone 4 (ftUS) +<2228> +proj=lcc +lat_1=37.25 +lat_2=36 +lat_0=35.33333333333334 +lon_0=-119 +x_0=2000000.0001016 +y_0=500000.0001016001 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / California zone 5 (ftUS) +<2229> +proj=lcc +lat_1=35.46666666666667 +lat_2=34.03333333333333 +lat_0=33.5 +lon_0=-118 +x_0=2000000.0001016 +y_0=500000.0001016001 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / California zone 6 (ftUS) +<2230> +proj=lcc +lat_1=33.88333333333333 +lat_2=32.78333333333333 +lat_0=32.16666666666666 +lon_0=-116.25 +x_0=2000000.0001016 +y_0=500000.0001016001 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / Colorado North (ftUS) +<2231> +proj=lcc +lat_1=40.78333333333333 +lat_2=39.71666666666667 +lat_0=39.33333333333334 +lon_0=-105.5 +x_0=914401.8288036576 +y_0=304800.6096012192 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / Colorado Central (ftUS) +<2232> +proj=lcc +lat_1=39.75 +lat_2=38.45 +lat_0=37.83333333333334 +lon_0=-105.5 +x_0=914401.8288036576 +y_0=304800.6096012192 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / Colorado South (ftUS) +<2233> +proj=lcc +lat_1=38.43333333333333 +lat_2=37.23333333333333 +lat_0=36.66666666666666 +lon_0=-105.5 +x_0=914401.8288036576 +y_0=304800.6096012192 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / Connecticut (ftUS) +<2234> +proj=lcc +lat_1=41.86666666666667 +lat_2=41.2 +lat_0=40.83333333333334 +lon_0=-72.75 +x_0=304800.6096012192 +y_0=152400.3048006096 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / Delaware (ftUS) +<2235> +proj=tmerc +lat_0=38 +lon_0=-75.41666666666667 +k=0.999995 +x_0=200000.0001016002 +y_0=0 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / Florida East (ftUS) +<2236> +proj=tmerc +lat_0=24.33333333333333 +lon_0=-81 +k=0.999941177 +x_0=200000.0001016002 +y_0=0 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / Florida West (ftUS) +<2237> +proj=tmerc +lat_0=24.33333333333333 +lon_0=-82 +k=0.999941177 +x_0=200000.0001016002 +y_0=0 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / Florida North (ftUS) +<2238> +proj=lcc +lat_1=30.75 +lat_2=29.58333333333333 +lat_0=29 +lon_0=-84.5 +x_0=600000 +y_0=0 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / Georgia East (ftUS) +<2239> +proj=tmerc +lat_0=30 +lon_0=-82.16666666666667 +k=0.9999 +x_0=200000.0001016002 +y_0=0 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / Georgia West (ftUS) +<2240> +proj=tmerc +lat_0=30 +lon_0=-84.16666666666667 +k=0.9999 +x_0=699999.9998983998 +y_0=0 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / Idaho East (ftUS) +<2241> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-112.1666666666667 +k=0.9999473679999999 +x_0=200000.0001016002 +y_0=0 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / Idaho Central (ftUS) +<2242> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-114 +k=0.9999473679999999 +x_0=500000.0001016001 +y_0=0 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / Idaho West (ftUS) +<2243> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-115.75 +k=0.999933333 +x_0=800000.0001016001 +y_0=0 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / Indiana East (ftUS) (deprecated) +<2244> +proj=tmerc +lat_0=37.5 +lon_0=-85.66666666666667 +k=0.999966667 +x_0=99999.99989839978 +y_0=249364.9987299975 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / Indiana West (ftUS) (deprecated) +<2245> +proj=tmerc +lat_0=37.5 +lon_0=-87.08333333333333 +k=0.999966667 +x_0=900000 +y_0=249364.9987299975 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / Kentucky North (ftUS) +<2246> +proj=lcc +lat_1=37.96666666666667 +lat_2=38.96666666666667 +lat_0=37.5 +lon_0=-84.25 +x_0=500000.0001016001 +y_0=0 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / Kentucky South (ftUS) +<2247> +proj=lcc +lat_1=37.93333333333333 +lat_2=36.73333333333333 +lat_0=36.33333333333334 +lon_0=-85.75 +x_0=500000.0001016001 +y_0=500000.0001016001 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / Maryland (ftUS) +<2248> +proj=lcc +lat_1=39.45 +lat_2=38.3 +lat_0=37.66666666666666 +lon_0=-77 +x_0=399999.9998983998 +y_0=0 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / Massachusetts Mainland (ftUS) +<2249> +proj=lcc +lat_1=42.68333333333333 +lat_2=41.71666666666667 +lat_0=41 +lon_0=-71.5 +x_0=200000.0001016002 +y_0=750000 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / Massachusetts Island (ftUS) +<2250> +proj=lcc +lat_1=41.48333333333333 +lat_2=41.28333333333333 +lat_0=41 +lon_0=-70.5 +x_0=500000.0001016001 +y_0=0 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / Michigan North (ft) +<2251> +proj=lcc +lat_1=47.08333333333334 +lat_2=45.48333333333333 +lat_0=44.78333333333333 +lon_0=-87 +x_0=7999999.999968001 +y_0=0 +datum=NAD83 +units=ft +no_defs <> +# NAD83 / Michigan Central (ft) +<2252> +proj=lcc +lat_1=45.7 +lat_2=44.18333333333333 +lat_0=43.31666666666667 +lon_0=-84.36666666666666 +x_0=5999999.999976001 +y_0=0 +datum=NAD83 +units=ft +no_defs <> +# NAD83 / Michigan South (ft) +<2253> +proj=lcc +lat_1=43.66666666666666 +lat_2=42.1 +lat_0=41.5 +lon_0=-84.36666666666666 +x_0=3999999.999984 +y_0=0 +datum=NAD83 +units=ft +no_defs <> +# NAD83 / Mississippi East (ftUS) +<2254> +proj=tmerc +lat_0=29.5 +lon_0=-88.83333333333333 +k=0.99995 +x_0=300000.0000000001 +y_0=0 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / Mississippi West (ftUS) +<2255> +proj=tmerc +lat_0=29.5 +lon_0=-90.33333333333333 +k=0.99995 +x_0=699999.9998983998 +y_0=0 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / Montana (ft) +<2256> +proj=lcc +lat_1=49 +lat_2=45 +lat_0=44.25 +lon_0=-109.5 +x_0=599999.9999976 +y_0=0 +datum=NAD83 +units=ft +no_defs <> +# NAD83 / New Mexico East (ftUS) +<2257> +proj=tmerc +lat_0=31 +lon_0=-104.3333333333333 +k=0.999909091 +x_0=165000 +y_0=0 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / New Mexico Central (ftUS) +<2258> +proj=tmerc +lat_0=31 +lon_0=-106.25 +k=0.9999 +x_0=500000.0001016001 +y_0=0 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / New Mexico West (ftUS) +<2259> +proj=tmerc +lat_0=31 +lon_0=-107.8333333333333 +k=0.999916667 +x_0=830000.0001016001 +y_0=0 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / New York East (ftUS) +<2260> +proj=tmerc +lat_0=38.83333333333334 +lon_0=-74.5 +k=0.9999 +x_0=150000 +y_0=0 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / New York Central (ftUS) +<2261> +proj=tmerc +lat_0=40 +lon_0=-76.58333333333333 +k=0.9999375 +x_0=249999.9998983998 +y_0=0 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / New York West (ftUS) +<2262> +proj=tmerc +lat_0=40 +lon_0=-78.58333333333333 +k=0.9999375 +x_0=350000.0001016001 +y_0=0 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / New York Long Island (ftUS) +<2263> +proj=lcc +lat_1=41.03333333333333 +lat_2=40.66666666666666 +lat_0=40.16666666666666 +lon_0=-74 +x_0=300000.0000000001 +y_0=0 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / North Carolina (ftUS) +<2264> +proj=lcc +lat_1=36.16666666666666 +lat_2=34.33333333333334 +lat_0=33.75 +lon_0=-79 +x_0=609601.2192024384 +y_0=0 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / North Dakota North (ft) +<2265> +proj=lcc +lat_1=48.73333333333333 +lat_2=47.43333333333333 +lat_0=47 +lon_0=-100.5 +x_0=599999.9999976 +y_0=0 +datum=NAD83 +units=ft +no_defs <> +# NAD83 / North Dakota South (ft) +<2266> +proj=lcc +lat_1=47.48333333333333 +lat_2=46.18333333333333 +lat_0=45.66666666666666 +lon_0=-100.5 +x_0=599999.9999976 +y_0=0 +datum=NAD83 +units=ft +no_defs <> +# NAD83 / Oklahoma North (ftUS) +<2267> +proj=lcc +lat_1=36.76666666666667 +lat_2=35.56666666666667 +lat_0=35 +lon_0=-98 +x_0=600000 +y_0=0 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / Oklahoma South (ftUS) +<2268> +proj=lcc +lat_1=35.23333333333333 +lat_2=33.93333333333333 +lat_0=33.33333333333334 +lon_0=-98 +x_0=600000 +y_0=0 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / Oregon North (ft) +<2269> +proj=lcc +lat_1=46 +lat_2=44.33333333333334 +lat_0=43.66666666666666 +lon_0=-120.5 +x_0=2500000.0001424 +y_0=0 +datum=NAD83 +units=ft +no_defs <> +# NAD83 / Oregon South (ft) +<2270> +proj=lcc +lat_1=44 +lat_2=42.33333333333334 +lat_0=41.66666666666666 +lon_0=-120.5 +x_0=1500000.0001464 +y_0=0 +datum=NAD83 +units=ft +no_defs <> +# NAD83 / Pennsylvania North (ftUS) +<2271> +proj=lcc +lat_1=41.95 +lat_2=40.88333333333333 +lat_0=40.16666666666666 +lon_0=-77.75 +x_0=600000 +y_0=0 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / Pennsylvania South (ftUS) +<2272> +proj=lcc +lat_1=40.96666666666667 +lat_2=39.93333333333333 +lat_0=39.33333333333334 +lon_0=-77.75 +x_0=600000 +y_0=0 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / South Carolina (ft) +<2273> +proj=lcc +lat_1=34.83333333333334 +lat_2=32.5 +lat_0=31.83333333333333 +lon_0=-81 +x_0=609600 +y_0=0 +datum=NAD83 +units=ft +no_defs <> +# NAD83 / Tennessee (ftUS) +<2274> +proj=lcc +lat_1=36.41666666666666 +lat_2=35.25 +lat_0=34.33333333333334 +lon_0=-86 +x_0=600000 +y_0=0 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / Texas North (ftUS) +<2275> +proj=lcc +lat_1=36.18333333333333 +lat_2=34.65 +lat_0=34 +lon_0=-101.5 +x_0=200000.0001016002 +y_0=999999.9998983998 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / Texas North Central (ftUS) +<2276> +proj=lcc +lat_1=33.96666666666667 +lat_2=32.13333333333333 +lat_0=31.66666666666667 +lon_0=-98.5 +x_0=600000 +y_0=2000000.0001016 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / Texas Central (ftUS) +<2277> +proj=lcc +lat_1=31.88333333333333 +lat_2=30.11666666666667 +lat_0=29.66666666666667 +lon_0=-100.3333333333333 +x_0=699999.9998983998 +y_0=3000000 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / Texas South Central (ftUS) +<2278> +proj=lcc +lat_1=30.28333333333333 +lat_2=28.38333333333333 +lat_0=27.83333333333333 +lon_0=-99 +x_0=600000 +y_0=3999999.9998984 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / Texas South (ftUS) +<2279> +proj=lcc +lat_1=27.83333333333333 +lat_2=26.16666666666667 +lat_0=25.66666666666667 +lon_0=-98.5 +x_0=300000.0000000001 +y_0=5000000.0001016 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / Utah North (ft) +<2280> +proj=lcc +lat_1=41.78333333333333 +lat_2=40.71666666666667 +lat_0=40.33333333333334 +lon_0=-111.5 +x_0=500000.0001504 +y_0=999999.9999960001 +datum=NAD83 +units=ft +no_defs <> +# NAD83 / Utah Central (ft) +<2281> +proj=lcc +lat_1=40.65 +lat_2=39.01666666666667 +lat_0=38.33333333333334 +lon_0=-111.5 +x_0=500000.0001504 +y_0=1999999.999992 +datum=NAD83 +units=ft +no_defs <> +# NAD83 / Utah South (ft) +<2282> +proj=lcc +lat_1=38.35 +lat_2=37.21666666666667 +lat_0=36.66666666666666 +lon_0=-111.5 +x_0=500000.0001504 +y_0=2999999.999988 +datum=NAD83 +units=ft +no_defs <> +# NAD83 / Virginia North (ftUS) +<2283> +proj=lcc +lat_1=39.2 +lat_2=38.03333333333333 +lat_0=37.66666666666666 +lon_0=-78.5 +x_0=3500000.0001016 +y_0=2000000.0001016 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / Virginia South (ftUS) +<2284> +proj=lcc +lat_1=37.96666666666667 +lat_2=36.76666666666667 +lat_0=36.33333333333334 +lon_0=-78.5 +x_0=3500000.0001016 +y_0=999999.9998983998 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / Washington North (ftUS) +<2285> +proj=lcc +lat_1=48.73333333333333 +lat_2=47.5 +lat_0=47 +lon_0=-120.8333333333333 +x_0=500000.0001016001 +y_0=0 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / Washington South (ftUS) +<2286> +proj=lcc +lat_1=47.33333333333334 +lat_2=45.83333333333334 +lat_0=45.33333333333334 +lon_0=-120.5 +x_0=500000.0001016001 +y_0=0 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / Wisconsin North (ftUS) +<2287> +proj=lcc +lat_1=46.76666666666667 +lat_2=45.56666666666667 +lat_0=45.16666666666666 +lon_0=-90 +x_0=600000 +y_0=0 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / Wisconsin Central (ftUS) +<2288> +proj=lcc +lat_1=45.5 +lat_2=44.25 +lat_0=43.83333333333334 +lon_0=-90 +x_0=600000 +y_0=0 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / Wisconsin South (ftUS) +<2289> +proj=lcc +lat_1=44.06666666666667 +lat_2=42.73333333333333 +lat_0=42 +lon_0=-90 +x_0=600000 +y_0=0 +datum=NAD83 +units=us-ft +no_defs <> +# ATS77 / Prince Edward Isl. Stereographic (ATS77) +<2290> +proj=sterea +lat_0=47.25 +lon_0=-63 +k=0.999912 +x_0=700000 +y_0=400000 +a=6378135 +b=6356750.304921594 +units=m +no_defs <> +# NAD83(CSRS98) / Prince Edward Isl. Stereographic (NAD83) (deprecated) +<2291> +proj=sterea +lat_0=47.25 +lon_0=-63 +k=0.999912 +x_0=400000 +y_0=800000 +a=6378135 +b=6356750.304921594 +units=m +no_defs <> +# NAD83(CSRS98) / Prince Edward Isl. Stereographic (NAD83) (deprecated) +<2292> +proj=sterea +lat_0=47.25 +lon_0=-63 +k=0.999912 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ATS77 / MTM Nova Scotia zone 4 +<2294> +proj=tmerc +lat_0=0 +lon_0=-61.5 +k=0.9999 +x_0=4500000 +y_0=0 +a=6378135 +b=6356750.304921594 +units=m +no_defs <> +# ATS77 / MTM Nova Scotia zone 5 +<2295> +proj=tmerc +lat_0=0 +lon_0=-64.5 +k=0.9999 +x_0=5500000 +y_0=0 +a=6378135 +b=6356750.304921594 +units=m +no_defs <> +# Ammassalik 1958 / Greenland zone 7 east +# Unable to translate coordinate system EPSG:2296 into PROJ.4 format. +# +# Qornoq 1927 / Greenland zone 1 east (deprecated) +# Unable to translate coordinate system EPSG:2297 into PROJ.4 format. +# +# Qornoq 1927 / Greenland zone 2 east (deprecated) +# Unable to translate coordinate system EPSG:2298 into PROJ.4 format. +# +# Qornoq 1927 / Greenland zone 2 west +# Unable to translate coordinate system EPSG:2299 into PROJ.4 format. +# +# Qornoq 1927 / Greenland zone 3 east (deprecated) +# Unable to translate coordinate system EPSG:2300 into PROJ.4 format. +# +# Qornoq 1927 / Greenland zone 3 west +# Unable to translate coordinate system EPSG:2301 into PROJ.4 format. +# +# Qornoq 1927 / Greenland zone 4 east (deprecated) +# Unable to translate coordinate system EPSG:2302 into PROJ.4 format. +# +# Qornoq 1927 / Greenland zone 4 west +# Unable to translate coordinate system EPSG:2303 into PROJ.4 format. +# +# Qornoq 1927 / Greenland zone 5 west +# Unable to translate coordinate system EPSG:2304 into PROJ.4 format. +# +# Qornoq 1927 / Greenland zone 6 west +# Unable to translate coordinate system EPSG:2305 into PROJ.4 format. +# +# Qornoq 1927 / Greenland zone 7 west +# Unable to translate coordinate system EPSG:2306 into PROJ.4 format. +# +# Qornoq 1927 / Greenland zone 8 east +# Unable to translate coordinate system EPSG:2307 into PROJ.4 format. +# +# Batavia / TM 109 SE +<2308> +proj=tmerc +lat_0=0 +lon_0=109 +k=0.9996 +x_0=500000 +y_0=10000000 +ellps=bessel +towgs84=-377,681,-50,0,0,0,0 +units=m +no_defs <> +# WGS 84 / TM 116 SE +<2309> +proj=tmerc +lat_0=0 +lon_0=116 +k=0.9996 +x_0=500000 +y_0=10000000 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / TM 132 SE +<2310> +proj=tmerc +lat_0=0 +lon_0=132 +k=0.9996 +x_0=500000 +y_0=10000000 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / TM 6 NE +<2311> +proj=tmerc +lat_0=0 +lon_0=6 +k=0.9996 +x_0=500000 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# Garoua / UTM zone 33N +<2312> +proj=utm +zone=33 +ellps=clrk80 +units=m +no_defs <> +# Kousseri / UTM zone 33N +<2313> +proj=utm +zone=33 +ellps=clrk80 +units=m +no_defs <> +# Trinidad 1903 / Trinidad Grid (ftCla) +<2314> +proj=cass +lat_0=10.44166666666667 +lon_0=-61.33333333333334 +x_0=86501.46392052001 +y_0=65379.0134283 +a=6378293.645208759 +b=6356617.987679838 +towgs84=-61.702,284.488,472.052,0,0,0,0 +to_meter=0.3047972654 +no_defs <> +# Campo Inchauspe / UTM zone 19S +<2315> +proj=utm +zone=19 +south +ellps=intl +towgs84=-148,136,90,0,0,0,0 +units=m +no_defs <> +# Campo Inchauspe / UTM zone 20S +<2316> +proj=utm +zone=20 +south +ellps=intl +towgs84=-148,136,90,0,0,0,0 +units=m +no_defs <> +# PSAD56 / ICN Regional +<2317> +proj=lcc +lat_1=9 +lat_2=3 +lat_0=6 +lon_0=-66 +x_0=1000000 +y_0=1000000 +ellps=intl +towgs84=-288,175,-376,0,0,0,0 +units=m +no_defs <> +# Ain el Abd / Aramco Lambert +<2318> +proj=lcc +lat_1=17 +lat_2=33 +lat_0=25.08951 +lon_0=48 +x_0=0 +y_0=0 +ellps=intl +towgs84=-143,-236,7,0,0,0,0 +units=m +no_defs <> +# ED50 / TM27 +<2319> +proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=500000 +y_0=0 +ellps=intl +towgs84=-87,-98,-121,0,0,0,0 +units=m +no_defs <> +# ED50 / TM30 +<2320> +proj=tmerc +lat_0=0 +lon_0=30 +k=1 +x_0=500000 +y_0=0 +ellps=intl +towgs84=-87,-98,-121,0,0,0,0 +units=m +no_defs <> +# ED50 / TM33 +<2321> +proj=tmerc +lat_0=0 +lon_0=33 +k=1 +x_0=500000 +y_0=0 +ellps=intl +towgs84=-87,-98,-121,0,0,0,0 +units=m +no_defs <> +# ED50 / TM36 +<2322> +proj=tmerc +lat_0=0 +lon_0=36 +k=1 +x_0=500000 +y_0=0 +ellps=intl +towgs84=-87,-98,-121,0,0,0,0 +units=m +no_defs <> +# ED50 / TM39 +<2323> +proj=tmerc +lat_0=0 +lon_0=39 +k=1 +x_0=500000 +y_0=0 +ellps=intl +towgs84=-87,-98,-121,0,0,0,0 +units=m +no_defs <> +# ED50 / TM42 +<2324> +proj=tmerc +lat_0=0 +lon_0=42 +k=1 +x_0=500000 +y_0=0 +ellps=intl +towgs84=-87,-98,-121,0,0,0,0 +units=m +no_defs <> +# ED50 / TM45 +<2325> +proj=tmerc +lat_0=0 +lon_0=45 +k=1 +x_0=500000 +y_0=0 +ellps=intl +towgs84=-87,-98,-121,0,0,0,0 +units=m +no_defs <> +# Hong Kong 1980 Grid System +<2326> +proj=tmerc +lat_0=22.31213333333334 +lon_0=114.1785555555556 +k=1 +x_0=836694.05 +y_0=819069.8 +ellps=intl +towgs84=-162.619,-276.959,-161.764,0.067753,-2.243649,-1.158827,-1.094246 +units=m +no_defs <> +# Xian 1980 / Gauss-Kruger zone 13 +<2327> +proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=13500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / Gauss-Kruger zone 14 +<2328> +proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=14500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / Gauss-Kruger zone 15 +<2329> +proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=15500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / Gauss-Kruger zone 16 +<2330> +proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=16500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / Gauss-Kruger zone 17 +<2331> +proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=17500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / Gauss-Kruger zone 18 +<2332> +proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=18500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / Gauss-Kruger zone 19 +<2333> +proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=19500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / Gauss-Kruger zone 20 +<2334> +proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=20500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / Gauss-Kruger zone 21 +<2335> +proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=21500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / Gauss-Kruger zone 22 +<2336> +proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=22500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / Gauss-Kruger zone 23 +<2337> +proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=23500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / Gauss-Kruger CM 75E +<2338> +proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / Gauss-Kruger CM 81E +<2339> +proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / Gauss-Kruger CM 87E +<2340> +proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / Gauss-Kruger CM 93E +<2341> +proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / Gauss-Kruger CM 99E +<2342> +proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / Gauss-Kruger CM 105E +<2343> +proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / Gauss-Kruger CM 111E +<2344> +proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / Gauss-Kruger CM 117E +<2345> +proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / Gauss-Kruger CM 123E +<2346> +proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / Gauss-Kruger CM 129E +<2347> +proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / Gauss-Kruger CM 135E +<2348> +proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger zone 25 +<2349> +proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=25500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger zone 26 +<2350> +proj=tmerc +lat_0=0 +lon_0=78 +k=1 +x_0=26500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger zone 27 +<2351> +proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=27500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger zone 28 +<2352> +proj=tmerc +lat_0=0 +lon_0=84 +k=1 +x_0=28500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger zone 29 +<2353> +proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=29500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger zone 30 +<2354> +proj=tmerc +lat_0=0 +lon_0=90 +k=1 +x_0=30500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger zone 31 +<2355> +proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=31500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger zone 32 +<2356> +proj=tmerc +lat_0=0 +lon_0=96 +k=1 +x_0=32500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger zone 33 +<2357> +proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=33500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger zone 34 +<2358> +proj=tmerc +lat_0=0 +lon_0=102 +k=1 +x_0=34500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger zone 35 +<2359> +proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=35500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger zone 36 +<2360> +proj=tmerc +lat_0=0 +lon_0=108 +k=1 +x_0=36500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger zone 37 +<2361> +proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=37500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger zone 38 +<2362> +proj=tmerc +lat_0=0 +lon_0=114 +k=1 +x_0=38500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger zone 39 +<2363> +proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=39500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger zone 40 +<2364> +proj=tmerc +lat_0=0 +lon_0=120 +k=1 +x_0=40500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger zone 41 +<2365> +proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=41500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger zone 42 +<2366> +proj=tmerc +lat_0=0 +lon_0=126 +k=1 +x_0=42500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger zone 43 +<2367> +proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=43500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger zone 44 +<2368> +proj=tmerc +lat_0=0 +lon_0=132 +k=1 +x_0=44500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger zone 45 +<2369> +proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=45500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger CM 75E +<2370> +proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger CM 78E +<2371> +proj=tmerc +lat_0=0 +lon_0=78 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger CM 81E +<2372> +proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger CM 84E +<2373> +proj=tmerc +lat_0=0 +lon_0=84 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger CM 87E +<2374> +proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger CM 90E +<2375> +proj=tmerc +lat_0=0 +lon_0=90 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger CM 93E +<2376> +proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger CM 96E +<2377> +proj=tmerc +lat_0=0 +lon_0=96 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger CM 99E +<2378> +proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger CM 102E +<2379> +proj=tmerc +lat_0=0 +lon_0=102 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger CM 105E +<2380> +proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger CM 108E +<2381> +proj=tmerc +lat_0=0 +lon_0=108 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger CM 111E +<2382> +proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger CM 114E +<2383> +proj=tmerc +lat_0=0 +lon_0=114 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger CM 117E +<2384> +proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger CM 120E +<2385> +proj=tmerc +lat_0=0 +lon_0=120 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger CM 123E +<2386> +proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger CM 126E +<2387> +proj=tmerc +lat_0=0 +lon_0=126 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger CM 129E +<2388> +proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger CM 132E +<2389> +proj=tmerc +lat_0=0 +lon_0=132 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger CM 135E +<2390> +proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# KKJ / Finland zone 1 +<2391> +proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=1500000 +y_0=0 +ellps=intl +towgs84=-96.062,-82.428,-121.753,4.801,0.345,-1.376,1.496 +units=m +no_defs <> +# KKJ / Finland zone 2 +<2392> +proj=tmerc +lat_0=0 +lon_0=24 +k=1 +x_0=2500000 +y_0=0 +ellps=intl +towgs84=-96.062,-82.428,-121.753,4.801,0.345,-1.376,1.496 +units=m +no_defs <> +# KKJ / Finland Uniform Coordinate System +<2393> +proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=3500000 +y_0=0 +ellps=intl +towgs84=-96.062,-82.428,-121.753,4.801,0.345,-1.376,1.496 +units=m +no_defs <> +# KKJ / Finland zone 4 +<2394> +proj=tmerc +lat_0=0 +lon_0=30 +k=1 +x_0=4500000 +y_0=0 +ellps=intl +towgs84=-96.062,-82.428,-121.753,4.801,0.345,-1.376,1.496 +units=m +no_defs <> +# South Yemen / Gauss-Kruger zone 8 +<2395> +proj=tmerc +lat_0=0 +lon_0=45 +k=1 +x_0=8500000 +y_0=0 +ellps=krass +towgs84=-76,-138,67,0,0,0,0 +units=m +no_defs <> +# South Yemen / Gauss-Kruger zone 9 +<2396> +proj=tmerc +lat_0=0 +lon_0=51 +k=1 +x_0=9500000 +y_0=0 +ellps=krass +towgs84=-76,-138,67,0,0,0,0 +units=m +no_defs <> +# Pulkovo 1942(83) / 3-degree Gauss-Kruger zone 3 +<2397> +proj=tmerc +lat_0=0 +lon_0=9 +k=1 +x_0=3500000 +y_0=0 +ellps=krass +towgs84=24.9,-126.4,-93.2,-0.063,-0.247,-0.041,1.01 +units=m +no_defs <> +# Pulkovo 1942(83) / 3-degree Gauss-Kruger zone 4 +<2398> +proj=tmerc +lat_0=0 +lon_0=12 +k=1 +x_0=4500000 +y_0=0 +ellps=krass +towgs84=24.9,-126.4,-93.2,-0.063,-0.247,-0.041,1.01 +units=m +no_defs <> +# Pulkovo 1942(83) / 3-degree Gauss-Kruger zone 5 +<2399> +proj=tmerc +lat_0=0 +lon_0=15 +k=1 +x_0=5500000 +y_0=0 +ellps=krass +towgs84=24.9,-126.4,-93.2,-0.063,-0.247,-0.041,1.01 +units=m +no_defs <> +# RT90 2.5 gon W (deprecated) +<2400> +proj=tmerc +lat_0=0 +lon_0=15.80827777777778 +k=1 +x_0=1500000 +y_0=0 +ellps=bessel +towgs84=414.1,41.3,603.1,-0.855,2.141,-7.023,0 +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger zone 25 +<2401> +proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=25500000 +y_0=0 +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger zone 26 +<2402> +proj=tmerc +lat_0=0 +lon_0=78 +k=1 +x_0=26500000 +y_0=0 +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger zone 27 +<2403> +proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=27500000 +y_0=0 +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger zone 28 +<2404> +proj=tmerc +lat_0=0 +lon_0=84 +k=1 +x_0=28500000 +y_0=0 +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger zone 29 +<2405> +proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=29500000 +y_0=0 +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger zone 30 +<2406> +proj=tmerc +lat_0=0 +lon_0=90 +k=1 +x_0=30500000 +y_0=0 +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger zone 31 +<2407> +proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=31500000 +y_0=0 +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger zone 32 +<2408> +proj=tmerc +lat_0=0 +lon_0=96 +k=1 +x_0=32500000 +y_0=0 +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger zone 33 +<2409> +proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=33500000 +y_0=0 +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger zone 34 +<2410> +proj=tmerc +lat_0=0 +lon_0=102 +k=1 +x_0=34500000 +y_0=0 +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger zone 35 +<2411> +proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=35500000 +y_0=0 +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger zone 36 +<2412> +proj=tmerc +lat_0=0 +lon_0=108 +k=1 +x_0=36500000 +y_0=0 +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger zone 37 +<2413> +proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=37500000 +y_0=0 +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger zone 38 +<2414> +proj=tmerc +lat_0=0 +lon_0=114 +k=1 +x_0=38500000 +y_0=0 +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger zone 39 +<2415> +proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=39500000 +y_0=0 +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger zone 40 +<2416> +proj=tmerc +lat_0=0 +lon_0=120 +k=1 +x_0=40500000 +y_0=0 +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger zone 41 +<2417> +proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=41500000 +y_0=0 +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger zone 42 +<2418> +proj=tmerc +lat_0=0 +lon_0=126 +k=1 +x_0=42500000 +y_0=0 +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger zone 43 +<2419> +proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=43500000 +y_0=0 +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger zone 44 +<2420> +proj=tmerc +lat_0=0 +lon_0=132 +k=1 +x_0=44500000 +y_0=0 +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger zone 45 +<2421> +proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=45500000 +y_0=0 +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger CM 75E +<2422> +proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger CM 78E +<2423> +proj=tmerc +lat_0=0 +lon_0=78 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger CM 81E +<2424> +proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger CM 84E +<2425> +proj=tmerc +lat_0=0 +lon_0=84 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger CM 87E +<2426> +proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger CM 90E +<2427> +proj=tmerc +lat_0=0 +lon_0=90 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger CM 93E +<2428> +proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger CM 96E +<2429> +proj=tmerc +lat_0=0 +lon_0=96 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger CM 99E +<2430> +proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger CM 102E +<2431> +proj=tmerc +lat_0=0 +lon_0=102 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger CM 105E +<2432> +proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger CM 108E +<2433> +proj=tmerc +lat_0=0 +lon_0=108 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger CM 111E +<2434> +proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger CM 114E +<2435> +proj=tmerc +lat_0=0 +lon_0=114 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger CM 117E +<2436> +proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger CM 120E +<2437> +proj=tmerc +lat_0=0 +lon_0=120 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger CM 123E +<2438> +proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger CM 126E +<2439> +proj=tmerc +lat_0=0 +lon_0=126 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger CM 129E +<2440> +proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger CM 132E +<2441> +proj=tmerc +lat_0=0 +lon_0=132 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger CM 135E +<2442> +proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +units=m +no_defs <> +# JGD2000 / Japan Plane Rectangular CS I +<2443> +proj=tmerc +lat_0=33 +lon_0=129.5 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# JGD2000 / Japan Plane Rectangular CS II +<2444> +proj=tmerc +lat_0=33 +lon_0=131 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# JGD2000 / Japan Plane Rectangular CS III +<2445> +proj=tmerc +lat_0=36 +lon_0=132.1666666666667 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# JGD2000 / Japan Plane Rectangular CS IV +<2446> +proj=tmerc +lat_0=33 +lon_0=133.5 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# JGD2000 / Japan Plane Rectangular CS V +<2447> +proj=tmerc +lat_0=36 +lon_0=134.3333333333333 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# JGD2000 / Japan Plane Rectangular CS VI +<2448> +proj=tmerc +lat_0=36 +lon_0=136 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# JGD2000 / Japan Plane Rectangular CS VII +<2449> +proj=tmerc +lat_0=36 +lon_0=137.1666666666667 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# JGD2000 / Japan Plane Rectangular CS VIII +<2450> +proj=tmerc +lat_0=36 +lon_0=138.5 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# JGD2000 / Japan Plane Rectangular CS IX +<2451> +proj=tmerc +lat_0=36 +lon_0=139.8333333333333 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# JGD2000 / Japan Plane Rectangular CS X +<2452> +proj=tmerc +lat_0=40 +lon_0=140.8333333333333 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# JGD2000 / Japan Plane Rectangular CS XI +<2453> +proj=tmerc +lat_0=44 +lon_0=140.25 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# JGD2000 / Japan Plane Rectangular CS XII +<2454> +proj=tmerc +lat_0=44 +lon_0=142.25 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# JGD2000 / Japan Plane Rectangular CS XIII +<2455> +proj=tmerc +lat_0=44 +lon_0=144.25 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# JGD2000 / Japan Plane Rectangular CS XIV +<2456> +proj=tmerc +lat_0=26 +lon_0=142 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# JGD2000 / Japan Plane Rectangular CS XV +<2457> +proj=tmerc +lat_0=26 +lon_0=127.5 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# JGD2000 / Japan Plane Rectangular CS XVI +<2458> +proj=tmerc +lat_0=26 +lon_0=124 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# JGD2000 / Japan Plane Rectangular CS XVII +<2459> +proj=tmerc +lat_0=26 +lon_0=131 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# JGD2000 / Japan Plane Rectangular CS XVIII +<2460> +proj=tmerc +lat_0=20 +lon_0=136 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# JGD2000 / Japan Plane Rectangular CS XIX +<2461> +proj=tmerc +lat_0=26 +lon_0=154 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Albanian 1987 / Gauss-Kruger zone 4 +<2462> +proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=4500000 +y_0=0 +ellps=krass +towgs84=-44.183,-0.58,-38.489,2.3867,2.7072,-3.5196,-8.2703 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger CM 21E +<2463> +proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger CM 27E +<2464> +proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger CM 33E +<2465> +proj=tmerc +lat_0=0 +lon_0=33 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger CM 39E +<2466> +proj=tmerc +lat_0=0 +lon_0=39 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger CM 45E +<2467> +proj=tmerc +lat_0=0 +lon_0=45 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger CM 51E +<2468> +proj=tmerc +lat_0=0 +lon_0=51 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger CM 57E +<2469> +proj=tmerc +lat_0=0 +lon_0=57 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger CM 63E +<2470> +proj=tmerc +lat_0=0 +lon_0=63 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger CM 69E +<2471> +proj=tmerc +lat_0=0 +lon_0=69 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger CM 75E +<2472> +proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger CM 81E +<2473> +proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger CM 87E +<2474> +proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger CM 93E +<2475> +proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger CM 99E +<2476> +proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger CM 105E +<2477> +proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger CM 111E +<2478> +proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger CM 117E +<2479> +proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger CM 123E +<2480> +proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger CM 129E +<2481> +proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger CM 135E +<2482> +proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger CM 141E +<2483> +proj=tmerc +lat_0=0 +lon_0=141 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger CM 147E +<2484> +proj=tmerc +lat_0=0 +lon_0=147 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger CM 153E +<2485> +proj=tmerc +lat_0=0 +lon_0=153 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger CM 159E +<2486> +proj=tmerc +lat_0=0 +lon_0=159 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger CM 165E +<2487> +proj=tmerc +lat_0=0 +lon_0=165 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger CM 171E +<2488> +proj=tmerc +lat_0=0 +lon_0=171 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger CM 177E +<2489> +proj=tmerc +lat_0=0 +lon_0=177 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger CM 177W +<2490> +proj=tmerc +lat_0=0 +lon_0=-177 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger CM 171W +<2491> +proj=tmerc +lat_0=0 +lon_0=-171 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger CM 9E (deprecated) +<2492> +proj=tmerc +lat_0=0 +lon_0=9 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger CM 15E (deprecated) +<2493> +proj=tmerc +lat_0=0 +lon_0=15 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger CM 21E +<2494> +proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger CM 27E +<2495> +proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger CM 33E +<2496> +proj=tmerc +lat_0=0 +lon_0=33 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger CM 39E +<2497> +proj=tmerc +lat_0=0 +lon_0=39 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger CM 45E +<2498> +proj=tmerc +lat_0=0 +lon_0=45 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger CM 51E +<2499> +proj=tmerc +lat_0=0 +lon_0=51 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger CM 57E +<2500> +proj=tmerc +lat_0=0 +lon_0=57 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger CM 63E +<2501> +proj=tmerc +lat_0=0 +lon_0=63 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger CM 69E +<2502> +proj=tmerc +lat_0=0 +lon_0=69 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger CM 75E +<2503> +proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger CM 81E +<2504> +proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger CM 87E +<2505> +proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger CM 93E +<2506> +proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger CM 99E +<2507> +proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger CM 105E +<2508> +proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger CM 111E +<2509> +proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger CM 117E +<2510> +proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger CM 123E +<2511> +proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger CM 129E +<2512> +proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger CM 135E +<2513> +proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger CM 141E +<2514> +proj=tmerc +lat_0=0 +lon_0=141 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger CM 147E +<2515> +proj=tmerc +lat_0=0 +lon_0=147 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger CM 153E +<2516> +proj=tmerc +lat_0=0 +lon_0=153 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger CM 159E +<2517> +proj=tmerc +lat_0=0 +lon_0=159 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger CM 165E +<2518> +proj=tmerc +lat_0=0 +lon_0=165 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger CM 171E +<2519> +proj=tmerc +lat_0=0 +lon_0=171 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger CM 177E +<2520> +proj=tmerc +lat_0=0 +lon_0=177 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger CM 177W +<2521> +proj=tmerc +lat_0=0 +lon_0=-177 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger CM 171W +<2522> +proj=tmerc +lat_0=0 +lon_0=-171 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 7 +<2523> +proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=7500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 8 +<2524> +proj=tmerc +lat_0=0 +lon_0=24 +k=1 +x_0=8500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 9 +<2525> +proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=9500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 10 +<2526> +proj=tmerc +lat_0=0 +lon_0=30 +k=1 +x_0=10500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 11 +<2527> +proj=tmerc +lat_0=0 +lon_0=33 +k=1 +x_0=11500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 12 +<2528> +proj=tmerc +lat_0=0 +lon_0=36 +k=1 +x_0=12500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 13 +<2529> +proj=tmerc +lat_0=0 +lon_0=39 +k=1 +x_0=13500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 14 +<2530> +proj=tmerc +lat_0=0 +lon_0=42 +k=1 +x_0=14500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 15 +<2531> +proj=tmerc +lat_0=0 +lon_0=45 +k=1 +x_0=15500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 16 +<2532> +proj=tmerc +lat_0=0 +lon_0=48 +k=1 +x_0=16500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 17 +<2533> +proj=tmerc +lat_0=0 +lon_0=51 +k=1 +x_0=17500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 18 +<2534> +proj=tmerc +lat_0=0 +lon_0=54 +k=1 +x_0=18500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 19 +<2535> +proj=tmerc +lat_0=0 +lon_0=57 +k=1 +x_0=19500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 20 +<2536> +proj=tmerc +lat_0=0 +lon_0=60 +k=1 +x_0=20500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 21 +<2537> +proj=tmerc +lat_0=0 +lon_0=63 +k=1 +x_0=21500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 22 +<2538> +proj=tmerc +lat_0=0 +lon_0=66 +k=1 +x_0=22500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 23 +<2539> +proj=tmerc +lat_0=0 +lon_0=69 +k=1 +x_0=23500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 24 +<2540> +proj=tmerc +lat_0=0 +lon_0=72 +k=1 +x_0=24500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 25 +<2541> +proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=25500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 26 +<2542> +proj=tmerc +lat_0=0 +lon_0=78 +k=1 +x_0=26500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 27 +<2543> +proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=27500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 28 +<2544> +proj=tmerc +lat_0=0 +lon_0=84 +k=1 +x_0=28500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 29 +<2545> +proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=29500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 30 +<2546> +proj=tmerc +lat_0=0 +lon_0=90 +k=1 +x_0=30500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 31 +<2547> +proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=31500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 32 +<2548> +proj=tmerc +lat_0=0 +lon_0=96 +k=1 +x_0=32500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 33 +<2549> +proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=33500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Samboja / UTM zone 50S (deprecated) +<2550> +proj=utm +zone=50 +south +ellps=bessel +towgs84=-404.78,685.68,45.47,0,0,0,0 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 34 +<2551> +proj=tmerc +lat_0=0 +lon_0=102 +k=1 +x_0=34500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 35 +<2552> +proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=35500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 36 +<2553> +proj=tmerc +lat_0=0 +lon_0=108 +k=1 +x_0=36500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 37 +<2554> +proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=37500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 38 +<2555> +proj=tmerc +lat_0=0 +lon_0=114 +k=1 +x_0=38500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 39 +<2556> +proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=39500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 40 +<2557> +proj=tmerc +lat_0=0 +lon_0=120 +k=1 +x_0=40500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 41 +<2558> +proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=41500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 42 +<2559> +proj=tmerc +lat_0=0 +lon_0=126 +k=1 +x_0=42500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 43 +<2560> +proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=43500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 44 +<2561> +proj=tmerc +lat_0=0 +lon_0=132 +k=1 +x_0=44500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 45 +<2562> +proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=45500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 46 +<2563> +proj=tmerc +lat_0=0 +lon_0=138 +k=1 +x_0=46500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 47 +<2564> +proj=tmerc +lat_0=0 +lon_0=141 +k=1 +x_0=47500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 48 +<2565> +proj=tmerc +lat_0=0 +lon_0=144 +k=1 +x_0=48500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 49 +<2566> +proj=tmerc +lat_0=0 +lon_0=147 +k=1 +x_0=49500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 50 +<2567> +proj=tmerc +lat_0=0 +lon_0=150 +k=1 +x_0=50500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 51 +<2568> +proj=tmerc +lat_0=0 +lon_0=153 +k=1 +x_0=51500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 52 +<2569> +proj=tmerc +lat_0=0 +lon_0=156 +k=1 +x_0=52500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 53 +<2570> +proj=tmerc +lat_0=0 +lon_0=159 +k=1 +x_0=53500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 54 +<2571> +proj=tmerc +lat_0=0 +lon_0=162 +k=1 +x_0=54500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 55 +<2572> +proj=tmerc +lat_0=0 +lon_0=165 +k=1 +x_0=55500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 56 +<2573> +proj=tmerc +lat_0=0 +lon_0=168 +k=1 +x_0=56500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 57 +<2574> +proj=tmerc +lat_0=0 +lon_0=171 +k=1 +x_0=57500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 58 +<2575> +proj=tmerc +lat_0=0 +lon_0=174 +k=1 +x_0=58500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 59 +<2576> +proj=tmerc +lat_0=0 +lon_0=177 +k=1 +x_0=59500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 60 (deprecated) +<2577> +proj=tmerc +lat_0=0 +lon_0=180 +k=1 +x_0=60000000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 61 +<2578> +proj=tmerc +lat_0=0 +lon_0=-177 +k=1 +x_0=61500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 62 +<2579> +proj=tmerc +lat_0=0 +lon_0=-174 +k=1 +x_0=62500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 63 +<2580> +proj=tmerc +lat_0=0 +lon_0=-171 +k=1 +x_0=63500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 64 +<2581> +proj=tmerc +lat_0=0 +lon_0=-168 +k=1 +x_0=64500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 21E +<2582> +proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 24E +<2583> +proj=tmerc +lat_0=0 +lon_0=24 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 27E +<2584> +proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 30E +<2585> +proj=tmerc +lat_0=0 +lon_0=30 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 33E +<2586> +proj=tmerc +lat_0=0 +lon_0=33 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 36E +<2587> +proj=tmerc +lat_0=0 +lon_0=36 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 39E +<2588> +proj=tmerc +lat_0=0 +lon_0=39 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 42E +<2589> +proj=tmerc +lat_0=0 +lon_0=42 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 45E +<2590> +proj=tmerc +lat_0=0 +lon_0=45 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 48E +<2591> +proj=tmerc +lat_0=0 +lon_0=48 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 51E +<2592> +proj=tmerc +lat_0=0 +lon_0=51 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 54E +<2593> +proj=tmerc +lat_0=0 +lon_0=54 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 57E +<2594> +proj=tmerc +lat_0=0 +lon_0=57 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 60E +<2595> +proj=tmerc +lat_0=0 +lon_0=60 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 63E +<2596> +proj=tmerc +lat_0=0 +lon_0=63 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 66E +<2597> +proj=tmerc +lat_0=0 +lon_0=66 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 69E +<2598> +proj=tmerc +lat_0=0 +lon_0=69 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 72E +<2599> +proj=tmerc +lat_0=0 +lon_0=72 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Lietuvos Koordinoei Sistema 1994 (deprecated) +<2600> +proj=tmerc +lat_0=0 +lon_0=24 +k=0.9998 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 75E +<2601> +proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 78E +<2602> +proj=tmerc +lat_0=0 +lon_0=78 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 81E +<2603> +proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 84E +<2604> +proj=tmerc +lat_0=0 +lon_0=84 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 87E +<2605> +proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 90E +<2606> +proj=tmerc +lat_0=0 +lon_0=90 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 93E +<2607> +proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 96E +<2608> +proj=tmerc +lat_0=0 +lon_0=96 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 99E +<2609> +proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 102E +<2610> +proj=tmerc +lat_0=0 +lon_0=102 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 105E +<2611> +proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 108E +<2612> +proj=tmerc +lat_0=0 +lon_0=108 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 111E +<2613> +proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 114E +<2614> +proj=tmerc +lat_0=0 +lon_0=114 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 117E +<2615> +proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 120E +<2616> +proj=tmerc +lat_0=0 +lon_0=120 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 123E +<2617> +proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 126E +<2618> +proj=tmerc +lat_0=0 +lon_0=126 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 129E +<2619> +proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 132E +<2620> +proj=tmerc +lat_0=0 +lon_0=132 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 135E +<2621> +proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 138E +<2622> +proj=tmerc +lat_0=0 +lon_0=138 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 141E +<2623> +proj=tmerc +lat_0=0 +lon_0=141 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 144E +<2624> +proj=tmerc +lat_0=0 +lon_0=144 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 147E +<2625> +proj=tmerc +lat_0=0 +lon_0=147 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 150E +<2626> +proj=tmerc +lat_0=0 +lon_0=150 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 153E +<2627> +proj=tmerc +lat_0=0 +lon_0=153 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 156E +<2628> +proj=tmerc +lat_0=0 +lon_0=156 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 159E +<2629> +proj=tmerc +lat_0=0 +lon_0=159 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 162E +<2630> +proj=tmerc +lat_0=0 +lon_0=162 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 165E +<2631> +proj=tmerc +lat_0=0 +lon_0=165 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 168E +<2632> +proj=tmerc +lat_0=0 +lon_0=168 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 171E +<2633> +proj=tmerc +lat_0=0 +lon_0=171 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 174E +<2634> +proj=tmerc +lat_0=0 +lon_0=174 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 177E +<2635> +proj=tmerc +lat_0=0 +lon_0=177 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 180E +<2636> +proj=tmerc +lat_0=0 +lon_0=180 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 177W +<2637> +proj=tmerc +lat_0=0 +lon_0=-177 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 174W +<2638> +proj=tmerc +lat_0=0 +lon_0=-174 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 171W +<2639> +proj=tmerc +lat_0=0 +lon_0=-171 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 168W +<2640> +proj=tmerc +lat_0=0 +lon_0=-168 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 7 +<2641> +proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=7500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 8 +<2642> +proj=tmerc +lat_0=0 +lon_0=24 +k=1 +x_0=8500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 9 +<2643> +proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=9500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 10 +<2644> +proj=tmerc +lat_0=0 +lon_0=30 +k=1 +x_0=10500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 11 +<2645> +proj=tmerc +lat_0=0 +lon_0=33 +k=1 +x_0=11500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 12 +<2646> +proj=tmerc +lat_0=0 +lon_0=36 +k=1 +x_0=12500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 13 +<2647> +proj=tmerc +lat_0=0 +lon_0=39 +k=1 +x_0=13500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 14 +<2648> +proj=tmerc +lat_0=0 +lon_0=42 +k=1 +x_0=14500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 15 +<2649> +proj=tmerc +lat_0=0 +lon_0=45 +k=1 +x_0=15500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 16 +<2650> +proj=tmerc +lat_0=0 +lon_0=48 +k=1 +x_0=16500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 17 +<2651> +proj=tmerc +lat_0=0 +lon_0=51 +k=1 +x_0=17500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 18 +<2652> +proj=tmerc +lat_0=0 +lon_0=54 +k=1 +x_0=18500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 19 +<2653> +proj=tmerc +lat_0=0 +lon_0=57 +k=1 +x_0=19500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 20 +<2654> +proj=tmerc +lat_0=0 +lon_0=60 +k=1 +x_0=20500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 21 +<2655> +proj=tmerc +lat_0=0 +lon_0=63 +k=1 +x_0=21500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 22 +<2656> +proj=tmerc +lat_0=0 +lon_0=66 +k=1 +x_0=22500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 23 +<2657> +proj=tmerc +lat_0=0 +lon_0=69 +k=1 +x_0=23500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 24 +<2658> +proj=tmerc +lat_0=0 +lon_0=72 +k=1 +x_0=24500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 25 +<2659> +proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=25500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 26 +<2660> +proj=tmerc +lat_0=0 +lon_0=78 +k=1 +x_0=26500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 27 +<2661> +proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=27500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 28 +<2662> +proj=tmerc +lat_0=0 +lon_0=84 +k=1 +x_0=28500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 29 +<2663> +proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=29500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 30 +<2664> +proj=tmerc +lat_0=0 +lon_0=90 +k=1 +x_0=30500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 31 +<2665> +proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=31500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 32 +<2666> +proj=tmerc +lat_0=0 +lon_0=96 +k=1 +x_0=32500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 33 +<2667> +proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=33500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 34 +<2668> +proj=tmerc +lat_0=0 +lon_0=102 +k=1 +x_0=34500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 35 +<2669> +proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=35500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 36 +<2670> +proj=tmerc +lat_0=0 +lon_0=108 +k=1 +x_0=36500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 37 +<2671> +proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=37500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 38 +<2672> +proj=tmerc +lat_0=0 +lon_0=114 +k=1 +x_0=38500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 39 +<2673> +proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=39500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 40 +<2674> +proj=tmerc +lat_0=0 +lon_0=120 +k=1 +x_0=40500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 41 +<2675> +proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=41500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 42 +<2676> +proj=tmerc +lat_0=0 +lon_0=126 +k=1 +x_0=42500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 43 +<2677> +proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=43500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 44 +<2678> +proj=tmerc +lat_0=0 +lon_0=132 +k=1 +x_0=44500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 45 +<2679> +proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=45500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 46 +<2680> +proj=tmerc +lat_0=0 +lon_0=138 +k=1 +x_0=46500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 47 +<2681> +proj=tmerc +lat_0=0 +lon_0=141 +k=1 +x_0=47500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 48 +<2682> +proj=tmerc +lat_0=0 +lon_0=144 +k=1 +x_0=48500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 49 +<2683> +proj=tmerc +lat_0=0 +lon_0=147 +k=1 +x_0=49500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 50 +<2684> +proj=tmerc +lat_0=0 +lon_0=150 +k=1 +x_0=50500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 51 +<2685> +proj=tmerc +lat_0=0 +lon_0=153 +k=1 +x_0=51500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 52 +<2686> +proj=tmerc +lat_0=0 +lon_0=156 +k=1 +x_0=52500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 53 +<2687> +proj=tmerc +lat_0=0 +lon_0=159 +k=1 +x_0=53500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 54 +<2688> +proj=tmerc +lat_0=0 +lon_0=162 +k=1 +x_0=54500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 55 +<2689> +proj=tmerc +lat_0=0 +lon_0=165 +k=1 +x_0=55500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 56 +<2690> +proj=tmerc +lat_0=0 +lon_0=168 +k=1 +x_0=56500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 57 +<2691> +proj=tmerc +lat_0=0 +lon_0=171 +k=1 +x_0=57500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 58 +<2692> +proj=tmerc +lat_0=0 +lon_0=174 +k=1 +x_0=58500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 59 +<2693> +proj=tmerc +lat_0=0 +lon_0=177 +k=1 +x_0=59500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 60 (deprecated) +<2694> +proj=tmerc +lat_0=0 +lon_0=180 +k=1 +x_0=60000000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 61 +<2695> +proj=tmerc +lat_0=0 +lon_0=-177 +k=1 +x_0=61500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 62 +<2696> +proj=tmerc +lat_0=0 +lon_0=-174 +k=1 +x_0=62500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 63 +<2697> +proj=tmerc +lat_0=0 +lon_0=-171 +k=1 +x_0=63500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 64 +<2698> +proj=tmerc +lat_0=0 +lon_0=-168 +k=1 +x_0=64500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 21E +<2699> +proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 24E +<2700> +proj=tmerc +lat_0=0 +lon_0=24 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 27E +<2701> +proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 30E +<2702> +proj=tmerc +lat_0=0 +lon_0=30 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 33E +<2703> +proj=tmerc +lat_0=0 +lon_0=33 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 36E +<2704> +proj=tmerc +lat_0=0 +lon_0=36 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 39E +<2705> +proj=tmerc +lat_0=0 +lon_0=39 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 42E +<2706> +proj=tmerc +lat_0=0 +lon_0=42 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 45E +<2707> +proj=tmerc +lat_0=0 +lon_0=45 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 48E +<2708> +proj=tmerc +lat_0=0 +lon_0=48 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 51E +<2709> +proj=tmerc +lat_0=0 +lon_0=51 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 54E +<2710> +proj=tmerc +lat_0=0 +lon_0=54 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 57E +<2711> +proj=tmerc +lat_0=0 +lon_0=57 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 60E +<2712> +proj=tmerc +lat_0=0 +lon_0=60 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 63E +<2713> +proj=tmerc +lat_0=0 +lon_0=63 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 66E +<2714> +proj=tmerc +lat_0=0 +lon_0=66 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 69E +<2715> +proj=tmerc +lat_0=0 +lon_0=69 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 72E +<2716> +proj=tmerc +lat_0=0 +lon_0=72 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 75E +<2717> +proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 78E +<2718> +proj=tmerc +lat_0=0 +lon_0=78 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 81E +<2719> +proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 84E +<2720> +proj=tmerc +lat_0=0 +lon_0=84 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 87E +<2721> +proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 90E +<2722> +proj=tmerc +lat_0=0 +lon_0=90 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 93E +<2723> +proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 96E +<2724> +proj=tmerc +lat_0=0 +lon_0=96 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 99E +<2725> +proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 102E +<2726> +proj=tmerc +lat_0=0 +lon_0=102 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 105E +<2727> +proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 108E +<2728> +proj=tmerc +lat_0=0 +lon_0=108 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 111E +<2729> +proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 114E +<2730> +proj=tmerc +lat_0=0 +lon_0=114 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 117E +<2731> +proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 120E +<2732> +proj=tmerc +lat_0=0 +lon_0=120 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 123E +<2733> +proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 126E +<2734> +proj=tmerc +lat_0=0 +lon_0=126 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 129E +<2735> +proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Tete / UTM zone 36S +<2736> +proj=utm +zone=36 +south +ellps=clrk66 +towgs84=-80,-100,-228,0,0,0,0 +units=m +no_defs <> +# Tete / UTM zone 37S +<2737> +proj=utm +zone=37 +south +ellps=clrk66 +towgs84=-80,-100,-228,0,0,0,0 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 132E +<2738> +proj=tmerc +lat_0=0 +lon_0=132 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 135E +<2739> +proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 138E +<2740> +proj=tmerc +lat_0=0 +lon_0=138 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 141E +<2741> +proj=tmerc +lat_0=0 +lon_0=141 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 144E +<2742> +proj=tmerc +lat_0=0 +lon_0=144 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 147E +<2743> +proj=tmerc +lat_0=0 +lon_0=147 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 150E +<2744> +proj=tmerc +lat_0=0 +lon_0=150 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 153E +<2745> +proj=tmerc +lat_0=0 +lon_0=153 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 156E +<2746> +proj=tmerc +lat_0=0 +lon_0=156 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 159E +<2747> +proj=tmerc +lat_0=0 +lon_0=159 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 162E +<2748> +proj=tmerc +lat_0=0 +lon_0=162 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 165E +<2749> +proj=tmerc +lat_0=0 +lon_0=165 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 168E +<2750> +proj=tmerc +lat_0=0 +lon_0=168 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 171E +<2751> +proj=tmerc +lat_0=0 +lon_0=171 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 174E +<2752> +proj=tmerc +lat_0=0 +lon_0=174 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 177E +<2753> +proj=tmerc +lat_0=0 +lon_0=177 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 180E +<2754> +proj=tmerc +lat_0=0 +lon_0=180 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 177W +<2755> +proj=tmerc +lat_0=0 +lon_0=-177 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 174W +<2756> +proj=tmerc +lat_0=0 +lon_0=-174 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 171W +<2757> +proj=tmerc +lat_0=0 +lon_0=-171 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 168W +<2758> +proj=tmerc +lat_0=0 +lon_0=-168 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# NAD83(HARN) / Alabama East +<2759> +proj=tmerc +lat_0=30.5 +lon_0=-85.83333333333333 +k=0.99996 +x_0=200000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Alabama West +<2760> +proj=tmerc +lat_0=30 +lon_0=-87.5 +k=0.999933333 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Arizona East +<2761> +proj=tmerc +lat_0=31 +lon_0=-110.1666666666667 +k=0.9999 +x_0=213360 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Arizona Central +<2762> +proj=tmerc +lat_0=31 +lon_0=-111.9166666666667 +k=0.9999 +x_0=213360 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Arizona West +<2763> +proj=tmerc +lat_0=31 +lon_0=-113.75 +k=0.999933333 +x_0=213360 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Arkansas North +<2764> +proj=lcc +lat_1=36.23333333333333 +lat_2=34.93333333333333 +lat_0=34.33333333333334 +lon_0=-92 +x_0=400000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Arkansas South +<2765> +proj=lcc +lat_1=34.76666666666667 +lat_2=33.3 +lat_0=32.66666666666666 +lon_0=-92 +x_0=400000 +y_0=400000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / California zone 1 +<2766> +proj=lcc +lat_1=41.66666666666666 +lat_2=40 +lat_0=39.33333333333334 +lon_0=-122 +x_0=2000000 +y_0=500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / California zone 2 +<2767> +proj=lcc +lat_1=39.83333333333334 +lat_2=38.33333333333334 +lat_0=37.66666666666666 +lon_0=-122 +x_0=2000000 +y_0=500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / California zone 3 +<2768> +proj=lcc +lat_1=38.43333333333333 +lat_2=37.06666666666667 +lat_0=36.5 +lon_0=-120.5 +x_0=2000000 +y_0=500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / California zone 4 +<2769> +proj=lcc +lat_1=37.25 +lat_2=36 +lat_0=35.33333333333334 +lon_0=-119 +x_0=2000000 +y_0=500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / California zone 5 +<2770> +proj=lcc +lat_1=35.46666666666667 +lat_2=34.03333333333333 +lat_0=33.5 +lon_0=-118 +x_0=2000000 +y_0=500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / California zone 6 +<2771> +proj=lcc +lat_1=33.88333333333333 +lat_2=32.78333333333333 +lat_0=32.16666666666666 +lon_0=-116.25 +x_0=2000000 +y_0=500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Colorado North +<2772> +proj=lcc +lat_1=40.78333333333333 +lat_2=39.71666666666667 +lat_0=39.33333333333334 +lon_0=-105.5 +x_0=914401.8289 +y_0=304800.6096 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Colorado Central +<2773> +proj=lcc +lat_1=39.75 +lat_2=38.45 +lat_0=37.83333333333334 +lon_0=-105.5 +x_0=914401.8289 +y_0=304800.6096 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Colorado South +<2774> +proj=lcc +lat_1=38.43333333333333 +lat_2=37.23333333333333 +lat_0=36.66666666666666 +lon_0=-105.5 +x_0=914401.8289 +y_0=304800.6096 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Connecticut +<2775> +proj=lcc +lat_1=41.86666666666667 +lat_2=41.2 +lat_0=40.83333333333334 +lon_0=-72.75 +x_0=304800.6096 +y_0=152400.3048 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Delaware +<2776> +proj=tmerc +lat_0=38 +lon_0=-75.41666666666667 +k=0.999995 +x_0=200000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Florida East +<2777> +proj=tmerc +lat_0=24.33333333333333 +lon_0=-81 +k=0.999941177 +x_0=200000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Florida West +<2778> +proj=tmerc +lat_0=24.33333333333333 +lon_0=-82 +k=0.999941177 +x_0=200000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Florida North +<2779> +proj=lcc +lat_1=30.75 +lat_2=29.58333333333333 +lat_0=29 +lon_0=-84.5 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Georgia East +<2780> +proj=tmerc +lat_0=30 +lon_0=-82.16666666666667 +k=0.9999 +x_0=200000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Georgia West +<2781> +proj=tmerc +lat_0=30 +lon_0=-84.16666666666667 +k=0.9999 +x_0=700000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Hawaii zone 1 +<2782> +proj=tmerc +lat_0=18.83333333333333 +lon_0=-155.5 +k=0.999966667 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Hawaii zone 2 +<2783> +proj=tmerc +lat_0=20.33333333333333 +lon_0=-156.6666666666667 +k=0.999966667 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Hawaii zone 3 +<2784> +proj=tmerc +lat_0=21.16666666666667 +lon_0=-158 +k=0.99999 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Hawaii zone 4 +<2785> +proj=tmerc +lat_0=21.83333333333333 +lon_0=-159.5 +k=0.99999 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Hawaii zone 5 +<2786> +proj=tmerc +lat_0=21.66666666666667 +lon_0=-160.1666666666667 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Idaho East +<2787> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-112.1666666666667 +k=0.9999473679999999 +x_0=200000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Idaho Central +<2788> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-114 +k=0.9999473679999999 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Idaho West +<2789> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-115.75 +k=0.999933333 +x_0=800000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Illinois East +<2790> +proj=tmerc +lat_0=36.66666666666666 +lon_0=-88.33333333333333 +k=0.9999749999999999 +x_0=300000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Illinois West +<2791> +proj=tmerc +lat_0=36.66666666666666 +lon_0=-90.16666666666667 +k=0.999941177 +x_0=700000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Indiana East +<2792> +proj=tmerc +lat_0=37.5 +lon_0=-85.66666666666667 +k=0.999966667 +x_0=100000 +y_0=250000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Indiana West +<2793> +proj=tmerc +lat_0=37.5 +lon_0=-87.08333333333333 +k=0.999966667 +x_0=900000 +y_0=250000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Iowa North +<2794> +proj=lcc +lat_1=43.26666666666667 +lat_2=42.06666666666667 +lat_0=41.5 +lon_0=-93.5 +x_0=1500000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Iowa South +<2795> +proj=lcc +lat_1=41.78333333333333 +lat_2=40.61666666666667 +lat_0=40 +lon_0=-93.5 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Kansas North +<2796> +proj=lcc +lat_1=39.78333333333333 +lat_2=38.71666666666667 +lat_0=38.33333333333334 +lon_0=-98 +x_0=400000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Kansas South +<2797> +proj=lcc +lat_1=38.56666666666667 +lat_2=37.26666666666667 +lat_0=36.66666666666666 +lon_0=-98.5 +x_0=400000 +y_0=400000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Kentucky North +<2798> +proj=lcc +lat_1=37.96666666666667 +lat_2=38.96666666666667 +lat_0=37.5 +lon_0=-84.25 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Kentucky South +<2799> +proj=lcc +lat_1=37.93333333333333 +lat_2=36.73333333333333 +lat_0=36.33333333333334 +lon_0=-85.75 +x_0=500000 +y_0=500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Louisiana North +<2800> +proj=lcc +lat_1=32.66666666666666 +lat_2=31.16666666666667 +lat_0=30.5 +lon_0=-92.5 +x_0=1000000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Louisiana South +<2801> +proj=lcc +lat_1=30.7 +lat_2=29.3 +lat_0=28.5 +lon_0=-91.33333333333333 +x_0=1000000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Maine East +<2802> +proj=tmerc +lat_0=43.66666666666666 +lon_0=-68.5 +k=0.9999 +x_0=300000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Maine West +<2803> +proj=tmerc +lat_0=42.83333333333334 +lon_0=-70.16666666666667 +k=0.999966667 +x_0=900000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Maryland +<2804> +proj=lcc +lat_1=39.45 +lat_2=38.3 +lat_0=37.66666666666666 +lon_0=-77 +x_0=400000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Massachusetts Mainland +<2805> +proj=lcc +lat_1=42.68333333333333 +lat_2=41.71666666666667 +lat_0=41 +lon_0=-71.5 +x_0=200000 +y_0=750000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Massachusetts Island +<2806> +proj=lcc +lat_1=41.48333333333333 +lat_2=41.28333333333333 +lat_0=41 +lon_0=-70.5 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Michigan North +<2807> +proj=lcc +lat_1=47.08333333333334 +lat_2=45.48333333333333 +lat_0=44.78333333333333 +lon_0=-87 +x_0=8000000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Michigan Central +<2808> +proj=lcc +lat_1=45.7 +lat_2=44.18333333333333 +lat_0=43.31666666666667 +lon_0=-84.36666666666666 +x_0=6000000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Michigan South +<2809> +proj=lcc +lat_1=43.66666666666666 +lat_2=42.1 +lat_0=41.5 +lon_0=-84.36666666666666 +x_0=4000000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Minnesota North +<2810> +proj=lcc +lat_1=48.63333333333333 +lat_2=47.03333333333333 +lat_0=46.5 +lon_0=-93.09999999999999 +x_0=800000 +y_0=100000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Minnesota Central +<2811> +proj=lcc +lat_1=47.05 +lat_2=45.61666666666667 +lat_0=45 +lon_0=-94.25 +x_0=800000 +y_0=100000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Minnesota South +<2812> +proj=lcc +lat_1=45.21666666666667 +lat_2=43.78333333333333 +lat_0=43 +lon_0=-94 +x_0=800000 +y_0=100000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Mississippi East +<2813> +proj=tmerc +lat_0=29.5 +lon_0=-88.83333333333333 +k=0.99995 +x_0=300000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Mississippi West +<2814> +proj=tmerc +lat_0=29.5 +lon_0=-90.33333333333333 +k=0.99995 +x_0=700000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Missouri East +<2815> +proj=tmerc +lat_0=35.83333333333334 +lon_0=-90.5 +k=0.999933333 +x_0=250000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Missouri Central +<2816> +proj=tmerc +lat_0=35.83333333333334 +lon_0=-92.5 +k=0.999933333 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Missouri West +<2817> +proj=tmerc +lat_0=36.16666666666666 +lon_0=-94.5 +k=0.999941177 +x_0=850000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Montana +<2818> +proj=lcc +lat_1=49 +lat_2=45 +lat_0=44.25 +lon_0=-109.5 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Nebraska +<2819> +proj=lcc +lat_1=43 +lat_2=40 +lat_0=39.83333333333334 +lon_0=-100 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Nevada East +<2820> +proj=tmerc +lat_0=34.75 +lon_0=-115.5833333333333 +k=0.9999 +x_0=200000 +y_0=8000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Nevada Central +<2821> +proj=tmerc +lat_0=34.75 +lon_0=-116.6666666666667 +k=0.9999 +x_0=500000 +y_0=6000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Nevada West +<2822> +proj=tmerc +lat_0=34.75 +lon_0=-118.5833333333333 +k=0.9999 +x_0=800000 +y_0=4000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / New Hampshire +<2823> +proj=tmerc +lat_0=42.5 +lon_0=-71.66666666666667 +k=0.999966667 +x_0=300000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / New Jersey +<2824> +proj=tmerc +lat_0=38.83333333333334 +lon_0=-74.5 +k=0.9999 +x_0=150000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / New Mexico East +<2825> +proj=tmerc +lat_0=31 +lon_0=-104.3333333333333 +k=0.999909091 +x_0=165000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / New Mexico Central +<2826> +proj=tmerc +lat_0=31 +lon_0=-106.25 +k=0.9999 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / New Mexico West +<2827> +proj=tmerc +lat_0=31 +lon_0=-107.8333333333333 +k=0.999916667 +x_0=830000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / New York East +<2828> +proj=tmerc +lat_0=38.83333333333334 +lon_0=-74.5 +k=0.9999 +x_0=150000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / New York Central +<2829> +proj=tmerc +lat_0=40 +lon_0=-76.58333333333333 +k=0.9999375 +x_0=250000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / New York West +<2830> +proj=tmerc +lat_0=40 +lon_0=-78.58333333333333 +k=0.9999375 +x_0=350000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / New York Long Island +<2831> +proj=lcc +lat_1=41.03333333333333 +lat_2=40.66666666666666 +lat_0=40.16666666666666 +lon_0=-74 +x_0=300000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / North Dakota North +<2832> +proj=lcc +lat_1=48.73333333333333 +lat_2=47.43333333333333 +lat_0=47 +lon_0=-100.5 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / North Dakota South +<2833> +proj=lcc +lat_1=47.48333333333333 +lat_2=46.18333333333333 +lat_0=45.66666666666666 +lon_0=-100.5 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Ohio North +<2834> +proj=lcc +lat_1=41.7 +lat_2=40.43333333333333 +lat_0=39.66666666666666 +lon_0=-82.5 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Ohio South +<2835> +proj=lcc +lat_1=40.03333333333333 +lat_2=38.73333333333333 +lat_0=38 +lon_0=-82.5 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Oklahoma North +<2836> +proj=lcc +lat_1=36.76666666666667 +lat_2=35.56666666666667 +lat_0=35 +lon_0=-98 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Oklahoma South +<2837> +proj=lcc +lat_1=35.23333333333333 +lat_2=33.93333333333333 +lat_0=33.33333333333334 +lon_0=-98 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Oregon North +<2838> +proj=lcc +lat_1=46 +lat_2=44.33333333333334 +lat_0=43.66666666666666 +lon_0=-120.5 +x_0=2500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Oregon South +<2839> +proj=lcc +lat_1=44 +lat_2=42.33333333333334 +lat_0=41.66666666666666 +lon_0=-120.5 +x_0=1500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Rhode Island +<2840> +proj=tmerc +lat_0=41.08333333333334 +lon_0=-71.5 +k=0.99999375 +x_0=100000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / South Dakota North +<2841> +proj=lcc +lat_1=45.68333333333333 +lat_2=44.41666666666666 +lat_0=43.83333333333334 +lon_0=-100 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / South Dakota South +<2842> +proj=lcc +lat_1=44.4 +lat_2=42.83333333333334 +lat_0=42.33333333333334 +lon_0=-100.3333333333333 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Tennessee +<2843> +proj=lcc +lat_1=36.41666666666666 +lat_2=35.25 +lat_0=34.33333333333334 +lon_0=-86 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Texas North +<2844> +proj=lcc +lat_1=36.18333333333333 +lat_2=34.65 +lat_0=34 +lon_0=-101.5 +x_0=200000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Texas North Central +<2845> +proj=lcc +lat_1=33.96666666666667 +lat_2=32.13333333333333 +lat_0=31.66666666666667 +lon_0=-98.5 +x_0=600000 +y_0=2000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Texas Central +<2846> +proj=lcc +lat_1=31.88333333333333 +lat_2=30.11666666666667 +lat_0=29.66666666666667 +lon_0=-100.3333333333333 +x_0=700000 +y_0=3000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Texas South Central +<2847> +proj=lcc +lat_1=30.28333333333333 +lat_2=28.38333333333333 +lat_0=27.83333333333333 +lon_0=-99 +x_0=600000 +y_0=4000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Texas South +<2848> +proj=lcc +lat_1=27.83333333333333 +lat_2=26.16666666666667 +lat_0=25.66666666666667 +lon_0=-98.5 +x_0=300000 +y_0=5000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Utah North +<2849> +proj=lcc +lat_1=41.78333333333333 +lat_2=40.71666666666667 +lat_0=40.33333333333334 +lon_0=-111.5 +x_0=500000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Utah Central +<2850> +proj=lcc +lat_1=40.65 +lat_2=39.01666666666667 +lat_0=38.33333333333334 +lon_0=-111.5 +x_0=500000 +y_0=2000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Utah South +<2851> +proj=lcc +lat_1=38.35 +lat_2=37.21666666666667 +lat_0=36.66666666666666 +lon_0=-111.5 +x_0=500000 +y_0=3000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Vermont +<2852> +proj=tmerc +lat_0=42.5 +lon_0=-72.5 +k=0.999964286 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Virginia North +<2853> +proj=lcc +lat_1=39.2 +lat_2=38.03333333333333 +lat_0=37.66666666666666 +lon_0=-78.5 +x_0=3500000 +y_0=2000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Virginia South +<2854> +proj=lcc +lat_1=37.96666666666667 +lat_2=36.76666666666667 +lat_0=36.33333333333334 +lon_0=-78.5 +x_0=3500000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Washington North +<2855> +proj=lcc +lat_1=48.73333333333333 +lat_2=47.5 +lat_0=47 +lon_0=-120.8333333333333 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Washington South +<2856> +proj=lcc +lat_1=47.33333333333334 +lat_2=45.83333333333334 +lat_0=45.33333333333334 +lon_0=-120.5 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / West Virginia North +<2857> +proj=lcc +lat_1=40.25 +lat_2=39 +lat_0=38.5 +lon_0=-79.5 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / West Virginia South +<2858> +proj=lcc +lat_1=38.88333333333333 +lat_2=37.48333333333333 +lat_0=37 +lon_0=-81 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Wisconsin North +<2859> +proj=lcc +lat_1=46.76666666666667 +lat_2=45.56666666666667 +lat_0=45.16666666666666 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Wisconsin Central +<2860> +proj=lcc +lat_1=45.5 +lat_2=44.25 +lat_0=43.83333333333334 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Wisconsin South +<2861> +proj=lcc +lat_1=44.06666666666667 +lat_2=42.73333333333333 +lat_0=42 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Wyoming East +<2862> +proj=tmerc +lat_0=40.5 +lon_0=-105.1666666666667 +k=0.9999375 +x_0=200000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Wyoming East Central +<2863> +proj=tmerc +lat_0=40.5 +lon_0=-107.3333333333333 +k=0.9999375 +x_0=400000 +y_0=100000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Wyoming West Central +<2864> +proj=tmerc +lat_0=40.5 +lon_0=-108.75 +k=0.9999375 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Wyoming West +<2865> +proj=tmerc +lat_0=40.5 +lon_0=-110.0833333333333 +k=0.9999375 +x_0=800000 +y_0=100000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Puerto Rico and Virgin Is. +<2866> +proj=lcc +lat_1=18.43333333333333 +lat_2=18.03333333333333 +lat_0=17.83333333333333 +lon_0=-66.43333333333334 +x_0=200000 +y_0=200000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Arizona East (ft) +<2867> +proj=tmerc +lat_0=31 +lon_0=-110.1666666666667 +k=0.9999 +x_0=213360 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=ft +no_defs <> +# NAD83(HARN) / Arizona Central (ft) +<2868> +proj=tmerc +lat_0=31 +lon_0=-111.9166666666667 +k=0.9999 +x_0=213360 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=ft +no_defs <> +# NAD83(HARN) / Arizona West (ft) +<2869> +proj=tmerc +lat_0=31 +lon_0=-113.75 +k=0.999933333 +x_0=213360 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=ft +no_defs <> +# NAD83(HARN) / California zone 1 (ftUS) +<2870> +proj=lcc +lat_1=41.66666666666666 +lat_2=40 +lat_0=39.33333333333334 +lon_0=-122 +x_0=2000000.0001016 +y_0=500000.0001016001 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(HARN) / California zone 2 (ftUS) +<2871> +proj=lcc +lat_1=39.83333333333334 +lat_2=38.33333333333334 +lat_0=37.66666666666666 +lon_0=-122 +x_0=2000000.0001016 +y_0=500000.0001016001 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(HARN) / California zone 3 (ftUS) +<2872> +proj=lcc +lat_1=38.43333333333333 +lat_2=37.06666666666667 +lat_0=36.5 +lon_0=-120.5 +x_0=2000000.0001016 +y_0=500000.0001016001 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(HARN) / California zone 4 (ftUS) +<2873> +proj=lcc +lat_1=37.25 +lat_2=36 +lat_0=35.33333333333334 +lon_0=-119 +x_0=2000000.0001016 +y_0=500000.0001016001 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(HARN) / California zone 5 (ftUS) +<2874> +proj=lcc +lat_1=35.46666666666667 +lat_2=34.03333333333333 +lat_0=33.5 +lon_0=-118 +x_0=2000000.0001016 +y_0=500000.0001016001 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(HARN) / California zone 6 (ftUS) +<2875> +proj=lcc +lat_1=33.88333333333333 +lat_2=32.78333333333333 +lat_0=32.16666666666666 +lon_0=-116.25 +x_0=2000000.0001016 +y_0=500000.0001016001 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(HARN) / Colorado North (ftUS) +<2876> +proj=lcc +lat_1=40.78333333333333 +lat_2=39.71666666666667 +lat_0=39.33333333333334 +lon_0=-105.5 +x_0=914401.8288036576 +y_0=304800.6096012192 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(HARN) / Colorado Central (ftUS) +<2877> +proj=lcc +lat_1=39.75 +lat_2=38.45 +lat_0=37.83333333333334 +lon_0=-105.5 +x_0=914401.8288036576 +y_0=304800.6096012192 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(HARN) / Colorado South (ftUS) +<2878> +proj=lcc +lat_1=38.43333333333333 +lat_2=37.23333333333333 +lat_0=36.66666666666666 +lon_0=-105.5 +x_0=914401.8288036576 +y_0=304800.6096012192 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(HARN) / Connecticut (ftUS) +<2879> +proj=lcc +lat_1=41.86666666666667 +lat_2=41.2 +lat_0=40.83333333333334 +lon_0=-72.75 +x_0=304800.6096012192 +y_0=152400.3048006096 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(HARN) / Delaware (ftUS) +<2880> +proj=tmerc +lat_0=38 +lon_0=-75.41666666666667 +k=0.999995 +x_0=200000.0001016002 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(HARN) / Florida East (ftUS) +<2881> +proj=tmerc +lat_0=24.33333333333333 +lon_0=-81 +k=0.999941177 +x_0=200000.0001016002 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(HARN) / Florida West (ftUS) +<2882> +proj=tmerc +lat_0=24.33333333333333 +lon_0=-82 +k=0.999941177 +x_0=200000.0001016002 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(HARN) / Florida North (ftUS) +<2883> +proj=lcc +lat_1=30.75 +lat_2=29.58333333333333 +lat_0=29 +lon_0=-84.5 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(HARN) / Georgia East (ftUS) +<2884> +proj=tmerc +lat_0=30 +lon_0=-82.16666666666667 +k=0.9999 +x_0=200000.0001016002 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(HARN) / Georgia West (ftUS) +<2885> +proj=tmerc +lat_0=30 +lon_0=-84.16666666666667 +k=0.9999 +x_0=699999.9998983998 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(HARN) / Idaho East (ftUS) +<2886> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-112.1666666666667 +k=0.9999473679999999 +x_0=200000.0001016002 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(HARN) / Idaho Central (ftUS) +<2887> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-114 +k=0.9999473679999999 +x_0=500000.0001016001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(HARN) / Idaho West (ftUS) +<2888> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-115.75 +k=0.999933333 +x_0=800000.0001016001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(HARN) / Indiana East (ftUS) (deprecated) +<2889> +proj=tmerc +lat_0=37.5 +lon_0=-85.66666666666667 +k=0.999966667 +x_0=99999.99989839978 +y_0=249364.9987299975 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(HARN) / Indiana West (ftUS) (deprecated) +<2890> +proj=tmerc +lat_0=37.5 +lon_0=-87.08333333333333 +k=0.999966667 +x_0=900000 +y_0=249364.9987299975 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(HARN) / Kentucky North (ftUS) +<2891> +proj=lcc +lat_1=37.96666666666667 +lat_2=38.96666666666667 +lat_0=37.5 +lon_0=-84.25 +x_0=500000.0001016001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(HARN) / Kentucky South (ftUS) +<2892> +proj=lcc +lat_1=37.93333333333333 +lat_2=36.73333333333333 +lat_0=36.33333333333334 +lon_0=-85.75 +x_0=500000.0001016001 +y_0=500000.0001016001 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(HARN) / Maryland (ftUS) +<2893> +proj=lcc +lat_1=39.45 +lat_2=38.3 +lat_0=37.66666666666666 +lon_0=-77 +x_0=399999.9998983998 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(HARN) / Massachusetts Mainland (ftUS) +<2894> +proj=lcc +lat_1=42.68333333333333 +lat_2=41.71666666666667 +lat_0=41 +lon_0=-71.5 +x_0=200000.0001016002 +y_0=750000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(HARN) / Massachusetts Island (ftUS) +<2895> +proj=lcc +lat_1=41.48333333333333 +lat_2=41.28333333333333 +lat_0=41 +lon_0=-70.5 +x_0=500000.0001016001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(HARN) / Michigan North (ft) +<2896> +proj=lcc +lat_1=47.08333333333334 +lat_2=45.48333333333333 +lat_0=44.78333333333333 +lon_0=-87 +x_0=7999999.999968001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=ft +no_defs <> +# NAD83(HARN) / Michigan Central (ft) +<2897> +proj=lcc +lat_1=45.7 +lat_2=44.18333333333333 +lat_0=43.31666666666667 +lon_0=-84.36666666666666 +x_0=5999999.999976001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=ft +no_defs <> +# NAD83(HARN) / Michigan South (ft) +<2898> +proj=lcc +lat_1=43.66666666666666 +lat_2=42.1 +lat_0=41.5 +lon_0=-84.36666666666666 +x_0=3999999.999984 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=ft +no_defs <> +# NAD83(HARN) / Mississippi East (ftUS) +<2899> +proj=tmerc +lat_0=29.5 +lon_0=-88.83333333333333 +k=0.99995 +x_0=300000.0000000001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(HARN) / Mississippi West (ftUS) +<2900> +proj=tmerc +lat_0=29.5 +lon_0=-90.33333333333333 +k=0.99995 +x_0=699999.9998983998 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(HARN) / Montana (ft) +<2901> +proj=lcc +lat_1=49 +lat_2=45 +lat_0=44.25 +lon_0=-109.5 +x_0=599999.9999976 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=ft +no_defs <> +# NAD83(HARN) / New Mexico East (ftUS) +<2902> +proj=tmerc +lat_0=31 +lon_0=-104.3333333333333 +k=0.999909091 +x_0=165000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(HARN) / New Mexico Central (ftUS) +<2903> +proj=tmerc +lat_0=31 +lon_0=-106.25 +k=0.9999 +x_0=500000.0001016001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(HARN) / New Mexico West (ftUS) +<2904> +proj=tmerc +lat_0=31 +lon_0=-107.8333333333333 +k=0.999916667 +x_0=830000.0001016001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(HARN) / New York East (ftUS) +<2905> +proj=tmerc +lat_0=38.83333333333334 +lon_0=-74.5 +k=0.9999 +x_0=150000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(HARN) / New York Central (ftUS) +<2906> +proj=tmerc +lat_0=40 +lon_0=-76.58333333333333 +k=0.9999375 +x_0=249999.9998983998 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(HARN) / New York West (ftUS) +<2907> +proj=tmerc +lat_0=40 +lon_0=-78.58333333333333 +k=0.9999375 +x_0=350000.0001016001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(HARN) / New York Long Island (ftUS) +<2908> +proj=lcc +lat_1=41.03333333333333 +lat_2=40.66666666666666 +lat_0=40.16666666666666 +lon_0=-74 +x_0=300000.0000000001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(HARN) / North Dakota North (ft) +<2909> +proj=lcc +lat_1=48.73333333333333 +lat_2=47.43333333333333 +lat_0=47 +lon_0=-100.5 +x_0=599999.9999976 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=ft +no_defs <> +# NAD83(HARN) / North Dakota South (ft) +<2910> +proj=lcc +lat_1=47.48333333333333 +lat_2=46.18333333333333 +lat_0=45.66666666666666 +lon_0=-100.5 +x_0=599999.9999976 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=ft +no_defs <> +# NAD83(HARN) / Oklahoma North (ftUS) +<2911> +proj=lcc +lat_1=36.76666666666667 +lat_2=35.56666666666667 +lat_0=35 +lon_0=-98 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(HARN) / Oklahoma South (ftUS) +<2912> +proj=lcc +lat_1=35.23333333333333 +lat_2=33.93333333333333 +lat_0=33.33333333333334 +lon_0=-98 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(HARN) / Oregon North (ft) +<2913> +proj=lcc +lat_1=46 +lat_2=44.33333333333334 +lat_0=43.66666666666666 +lon_0=-120.5 +x_0=2500000.0001424 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=ft +no_defs <> +# NAD83(HARN) / Oregon South (ft) +<2914> +proj=lcc +lat_1=44 +lat_2=42.33333333333334 +lat_0=41.66666666666666 +lon_0=-120.5 +x_0=1500000.0001464 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=ft +no_defs <> +# NAD83(HARN) / Tennessee (ftUS) +<2915> +proj=lcc +lat_1=36.41666666666666 +lat_2=35.25 +lat_0=34.33333333333334 +lon_0=-86 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(HARN) / Texas North (ftUS) +<2916> +proj=lcc +lat_1=36.18333333333333 +lat_2=34.65 +lat_0=34 +lon_0=-101.5 +x_0=200000.0001016002 +y_0=999999.9998983998 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(HARN) / Texas North Central (ftUS) +<2917> +proj=lcc +lat_1=33.96666666666667 +lat_2=32.13333333333333 +lat_0=31.66666666666667 +lon_0=-98.5 +x_0=600000 +y_0=2000000.0001016 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(HARN) / Texas Central (ftUS) +<2918> +proj=lcc +lat_1=31.88333333333333 +lat_2=30.11666666666667 +lat_0=29.66666666666667 +lon_0=-100.3333333333333 +x_0=699999.9998983998 +y_0=3000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(HARN) / Texas South Central (ftUS) +<2919> +proj=lcc +lat_1=30.28333333333333 +lat_2=28.38333333333333 +lat_0=27.83333333333333 +lon_0=-99 +x_0=600000 +y_0=3999999.9998984 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(HARN) / Texas South (ftUS) +<2920> +proj=lcc +lat_1=27.83333333333333 +lat_2=26.16666666666667 +lat_0=25.66666666666667 +lon_0=-98.5 +x_0=300000.0000000001 +y_0=5000000.0001016 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(HARN) / Utah North (ft) +<2921> +proj=lcc +lat_1=41.78333333333333 +lat_2=40.71666666666667 +lat_0=40.33333333333334 +lon_0=-111.5 +x_0=500000.0001504 +y_0=999999.9999960001 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=ft +no_defs <> +# NAD83(HARN) / Utah Central (ft) +<2922> +proj=lcc +lat_1=40.65 +lat_2=39.01666666666667 +lat_0=38.33333333333334 +lon_0=-111.5 +x_0=500000.0001504 +y_0=1999999.999992 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=ft +no_defs <> +# NAD83(HARN) / Utah South (ft) +<2923> +proj=lcc +lat_1=38.35 +lat_2=37.21666666666667 +lat_0=36.66666666666666 +lon_0=-111.5 +x_0=500000.0001504 +y_0=2999999.999988 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=ft +no_defs <> +# NAD83(HARN) / Virginia North (ftUS) +<2924> +proj=lcc +lat_1=39.2 +lat_2=38.03333333333333 +lat_0=37.66666666666666 +lon_0=-78.5 +x_0=3500000.0001016 +y_0=2000000.0001016 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(HARN) / Virginia South (ftUS) +<2925> +proj=lcc +lat_1=37.96666666666667 +lat_2=36.76666666666667 +lat_0=36.33333333333334 +lon_0=-78.5 +x_0=3500000.0001016 +y_0=999999.9998983998 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(HARN) / Washington North (ftUS) +<2926> +proj=lcc +lat_1=48.73333333333333 +lat_2=47.5 +lat_0=47 +lon_0=-120.8333333333333 +x_0=500000.0001016001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(HARN) / Washington South (ftUS) +<2927> +proj=lcc +lat_1=47.33333333333334 +lat_2=45.83333333333334 +lat_0=45.33333333333334 +lon_0=-120.5 +x_0=500000.0001016001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(HARN) / Wisconsin North (ftUS) +<2928> +proj=lcc +lat_1=46.76666666666667 +lat_2=45.56666666666667 +lat_0=45.16666666666666 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(HARN) / Wisconsin Central (ftUS) +<2929> +proj=lcc +lat_1=45.5 +lat_2=44.25 +lat_0=43.83333333333334 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(HARN) / Wisconsin South (ftUS) +<2930> +proj=lcc +lat_1=44.06666666666667 +lat_2=42.73333333333333 +lat_0=42 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# Beduaram / TM 13 NE +<2931> +proj=tmerc +lat_0=0 +lon_0=13 +k=0.9996 +x_0=500000 +y_0=0 +a=6378249.2 +b=6356515 +towgs84=-106,-87,188,0,0,0,0 +units=m +no_defs <> +# QND95 / Qatar National Grid +<2932> +proj=tmerc +lat_0=24.45 +lon_0=51.21666666666667 +k=0.99999 +x_0=200000 +y_0=300000 +ellps=intl +towgs84=-119.4248,-303.65872,-11.00061,1.164298,0.174458,1.096259,3.657065 +units=m +no_defs <> +# Segara / UTM zone 50S +<2933> +proj=utm +zone=50 +south +ellps=bessel +towgs84=-403,684,41,0,0,0,0 +units=m +no_defs <> +# Segara (Jakarta) / NEIEZ (deprecated) +<2934> +proj=merc +lon_0=110 +k=0.997 +x_0=3900000 +y_0=900000 +ellps=bessel +towgs84=-403,684,41,0,0,0,0 +pm=jakarta +units=m +no_defs <> +# Pulkovo 1942 / CS63 zone A1 +<2935> +proj=tmerc +lat_0=0.1166666666666667 +lon_0=41.53333333333333 +k=1 +x_0=1300000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / CS63 zone A2 +<2936> +proj=tmerc +lat_0=0.1166666666666667 +lon_0=44.53333333333333 +k=1 +x_0=2300000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / CS63 zone A3 +<2937> +proj=tmerc +lat_0=0.1166666666666667 +lon_0=47.53333333333333 +k=1 +x_0=3300000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / CS63 zone A4 +<2938> +proj=tmerc +lat_0=0.1166666666666667 +lon_0=50.53333333333333 +k=1 +x_0=4300000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / CS63 zone K2 +<2939> +proj=tmerc +lat_0=0.1333333333333333 +lon_0=50.76666666666667 +k=1 +x_0=2300000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / CS63 zone K3 +<2940> +proj=tmerc +lat_0=0.1333333333333333 +lon_0=53.76666666666667 +k=1 +x_0=3300000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / CS63 zone K4 +<2941> +proj=tmerc +lat_0=0.1333333333333333 +lon_0=56.76666666666667 +k=1 +x_0=4300000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Porto Santo / UTM zone 28N +<2942> +proj=utm +zone=28 +ellps=intl +towgs84=-499,-249,314,0,0,0,0 +units=m +no_defs <> +# Selvagem Grande / UTM zone 28N +<2943> +proj=utm +zone=28 +ellps=intl +towgs84=-289,-124,60,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS) / SCoPQ zone 2 (deprecated) +<2944> +proj=tmerc +lat_0=0 +lon_0=-55.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS) / MTM zone 3 +<2945> +proj=tmerc +lat_0=0 +lon_0=-58.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS) / MTM zone 4 +<2946> +proj=tmerc +lat_0=0 +lon_0=-61.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS) / MTM zone 5 +<2947> +proj=tmerc +lat_0=0 +lon_0=-64.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS) / MTM zone 6 +<2948> +proj=tmerc +lat_0=0 +lon_0=-67.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS) / MTM zone 7 +<2949> +proj=tmerc +lat_0=0 +lon_0=-70.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS) / MTM zone 8 +<2950> +proj=tmerc +lat_0=0 +lon_0=-73.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS) / MTM zone 9 +<2951> +proj=tmerc +lat_0=0 +lon_0=-76.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS) / MTM zone 10 +<2952> +proj=tmerc +lat_0=0 +lon_0=-79.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS) / New Brunswick Stereographic +<2953> +proj=sterea +lat_0=46.5 +lon_0=-66.5 +k=0.999912 +x_0=2500000 +y_0=7500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS) / Prince Edward Isl. Stereographic (NAD83) +<2954> +proj=sterea +lat_0=47.25 +lon_0=-63 +k=0.999912 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS) / UTM zone 11N +<2955> +proj=utm +zone=11 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS) / UTM zone 12N +<2956> +proj=utm +zone=12 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS) / UTM zone 13N +<2957> +proj=utm +zone=13 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS) / UTM zone 17N +<2958> +proj=utm +zone=17 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS) / UTM zone 18N +<2959> +proj=utm +zone=18 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS) / UTM zone 19N +<2960> +proj=utm +zone=19 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS) / UTM zone 20N +<2961> +proj=utm +zone=20 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS) / UTM zone 21N +<2962> +proj=utm +zone=21 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Lisbon 1890 (Lisbon) / Portugal Bonne +# Unable to translate coordinate system EPSG:2963 into PROJ.4 format. +# +# NAD27 / Alaska Albers +<2964> +proj=aea +lat_1=55 +lat_2=65 +lat_0=50 +lon_0=-154 +x_0=0 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD83 / Indiana East (ftUS) +<2965> +proj=tmerc +lat_0=37.5 +lon_0=-85.66666666666667 +k=0.999966667 +x_0=99999.99989839978 +y_0=249999.9998983998 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / Indiana West (ftUS) +<2966> +proj=tmerc +lat_0=37.5 +lon_0=-87.08333333333333 +k=0.999966667 +x_0=900000 +y_0=249999.9998983998 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83(HARN) / Indiana East (ftUS) +<2967> +proj=tmerc +lat_0=37.5 +lon_0=-85.66666666666667 +k=0.999966667 +x_0=99999.99989839978 +y_0=249999.9998983998 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(HARN) / Indiana West (ftUS) +<2968> +proj=tmerc +lat_0=37.5 +lon_0=-87.08333333333333 +k=0.999966667 +x_0=900000 +y_0=249999.9998983998 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# Fort Marigot / UTM zone 20N +<2969> +proj=utm +zone=20 +ellps=intl +towgs84=137,248,-430,0,0,0,0 +units=m +no_defs <> +# Guadeloupe 1948 / UTM zone 20N +<2970> +proj=utm +zone=20 +ellps=intl +towgs84=-467,-16,-300,0,0,0,0 +units=m +no_defs <> +# CSG67 / UTM zone 22N +<2971> +proj=utm +zone=22 +ellps=intl +towgs84=-186,230,110,0,0,0,0 +units=m +no_defs <> +# RGFG95 / UTM zone 22N +<2972> +proj=utm +zone=22 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Martinique 1938 / UTM zone 20N +<2973> +proj=utm +zone=20 +ellps=intl +towgs84=186,482,151,0,0,0,0 +units=m +no_defs <> +# RGR92 / UTM zone 40S +<2975> +proj=utm +zone=40 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Tahiti 52 / UTM zone 6S +<2976> +proj=utm +zone=6 +south +ellps=intl +towgs84=162,117,154,0,0,0,0 +units=m +no_defs <> +# Tahaa 54 / UTM zone 5S +<2977> +proj=utm +zone=5 +south +ellps=intl +towgs84=72.438,345.918,79.486,1.6045,0.8823,0.5565,1.3746 +units=m +no_defs <> +# IGN72 Nuku Hiva / UTM zone 7S +<2978> +proj=utm +zone=7 +south +ellps=intl +towgs84=84,274,65,0,0,0,0 +units=m +no_defs <> +# K0 1949 / UTM zone 42S (deprecated) +<2979> +proj=utm +zone=42 +south +ellps=intl +towgs84=145,-187,103,0,0,0,0 +units=m +no_defs <> +# Combani 1950 / UTM zone 38S +<2980> +proj=utm +zone=38 +south +ellps=intl +towgs84=-382,-59,-262,0,0,0,0 +units=m +no_defs <> +# IGN56 Lifou / UTM zone 58S +<2981> +proj=utm +zone=58 +south +ellps=intl +towgs84=335.47,222.58,-230.94,0,0,0,0 +units=m +no_defs <> +# IGN72 Grand Terre / UTM zone 58S (deprecated) +<2982> +proj=utm +zone=58 +south +ellps=intl +towgs84=-13,-348,292,0,0,0,0 +units=m +no_defs <> +# ST87 Ouvea / UTM zone 58S (deprecated) +<2983> +proj=utm +zone=58 +south +ellps=intl +towgs84=-122.383,-188.696,103.344,3.5107,-4.9668,-5.7047,4.4798 +units=m +no_defs <> +# RGNC 1991 / Lambert New Caledonia (deprecated) +<2984> +proj=lcc +lat_1=-20.66666666666667 +lat_2=-22.33333333333333 +lat_0=-21.5 +lon_0=166 +x_0=400000 +y_0=300000 +ellps=intl +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Petrels 1972 / Terre Adelie Polar Stereographic +# Unable to translate coordinate system EPSG:2985 into PROJ.4 format. +# +# Perroud 1950 / Terre Adelie Polar Stereographic +# Unable to translate coordinate system EPSG:2986 into PROJ.4 format. +# +# Saint Pierre et Miquelon 1950 / UTM zone 21N +<2987> +proj=utm +zone=21 +ellps=clrk66 +towgs84=30,430,368,0,0,0,0 +units=m +no_defs <> +# MOP78 / UTM zone 1S +<2988> +proj=utm +zone=1 +south +ellps=intl +towgs84=253,-132,-127,0,0,0,0 +units=m +no_defs <> +# RRAF 1991 / UTM zone 20N (deprecated) +<2989> +proj=utm +zone=20 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Reunion 1947 / TM Reunion (deprecated) +<2990> +proj=tmerc +lat_0=-21.11666666666667 +lon_0=55.53333333333333 +k=1 +x_0=50000 +y_0=160000 +ellps=intl +towgs84=94,-948,-1262,0,0,0,0 +units=m +no_defs <> +# NAD83 / Oregon LCC (m) +<2991> +proj=lcc +lat_1=43 +lat_2=45.5 +lat_0=41.75 +lon_0=-120.5 +x_0=400000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Oregon GIC Lambert (ft) +<2992> +proj=lcc +lat_1=43 +lat_2=45.5 +lat_0=41.75 +lon_0=-120.5 +x_0=399999.9999984 +y_0=0 +datum=NAD83 +units=ft +no_defs <> +# NAD83(HARN) / Oregon LCC (m) +<2993> +proj=lcc +lat_1=43 +lat_2=45.5 +lat_0=41.75 +lon_0=-120.5 +x_0=400000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Oregon GIC Lambert (ft) +<2994> +proj=lcc +lat_1=43 +lat_2=45.5 +lat_0=41.75 +lon_0=-120.5 +x_0=399999.9999984 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=ft +no_defs <> +# IGN53 Mare / UTM zone 58S +<2995> +proj=utm +zone=58 +south +ellps=intl +towgs84=287.58,177.78,-135.41,0,0,0,0 +units=m +no_defs <> +# ST84 Ile des Pins / UTM zone 58S +<2996> +proj=utm +zone=58 +south +ellps=intl +towgs84=-13,-348,292,0,0,0,0 +units=m +no_defs <> +# ST71 Belep / UTM zone 58S +<2997> +proj=utm +zone=58 +south +ellps=intl +towgs84=-480.26,-438.32,-643.429,16.3119,20.1721,-4.0349,-111.7002 +units=m +no_defs <> +# NEA74 Noumea / UTM zone 58S +<2998> +proj=utm +zone=58 +south +ellps=intl +towgs84=-10.18,-350.43,291.37,0,0,0,0 +units=m +no_defs <> +# Grand Comoros / UTM zone 38S +<2999> +proj=utm +zone=38 +south +ellps=intl +towgs84=-963,510,-359,0,0,0,0 +units=m +no_defs <> +# Segara / NEIEZ +<3000> +proj=merc +lon_0=110 +k=0.997 +x_0=3900000 +y_0=900000 +ellps=bessel +towgs84=-403,684,41,0,0,0,0 +units=m +no_defs <> +# Batavia / NEIEZ +<3001> +proj=merc +lon_0=110 +k=0.997 +x_0=3900000 +y_0=900000 +ellps=bessel +towgs84=-377,681,-50,0,0,0,0 +units=m +no_defs <> +# Makassar / NEIEZ +<3002> +proj=merc +lon_0=110 +k=0.997 +x_0=3900000 +y_0=900000 +ellps=bessel +towgs84=-587.8,519.75,145.76,0,0,0,0 +units=m +no_defs <> +# Monte Mario / Italy zone 1 +<3003> +proj=tmerc +lat_0=0 +lon_0=9 +k=0.9996 +x_0=1500000 +y_0=0 +ellps=intl +towgs84=-104.1,-49.1,-9.9,0.971,-2.917,0.714,-11.68 +units=m +no_defs <> +# Monte Mario / Italy zone 2 +<3004> +proj=tmerc +lat_0=0 +lon_0=15 +k=0.9996 +x_0=2520000 +y_0=0 +ellps=intl +towgs84=-104.1,-49.1,-9.9,0.971,-2.917,0.714,-11.68 +units=m +no_defs <> +# NAD83 / BC Albers +<3005> +proj=aea +lat_1=50 +lat_2=58.5 +lat_0=45 +lon_0=-126 +x_0=1000000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# SWEREF99 TM +<3006> +proj=utm +zone=33 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# SWEREF99 12 00 +<3007> +proj=tmerc +lat_0=0 +lon_0=12 +k=1 +x_0=150000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# SWEREF99 13 30 +<3008> +proj=tmerc +lat_0=0 +lon_0=13.5 +k=1 +x_0=150000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# SWEREF99 15 00 +<3009> +proj=tmerc +lat_0=0 +lon_0=15 +k=1 +x_0=150000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# SWEREF99 16 30 +<3010> +proj=tmerc +lat_0=0 +lon_0=16.5 +k=1 +x_0=150000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# SWEREF99 18 00 +<3011> +proj=tmerc +lat_0=0 +lon_0=18 +k=1 +x_0=150000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# SWEREF99 14 15 +<3012> +proj=tmerc +lat_0=0 +lon_0=14.25 +k=1 +x_0=150000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# SWEREF99 15 45 +<3013> +proj=tmerc +lat_0=0 +lon_0=15.75 +k=1 +x_0=150000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# SWEREF99 17 15 +<3014> +proj=tmerc +lat_0=0 +lon_0=17.25 +k=1 +x_0=150000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# SWEREF99 18 45 +<3015> +proj=tmerc +lat_0=0 +lon_0=18.75 +k=1 +x_0=150000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# SWEREF99 20 15 +<3016> +proj=tmerc +lat_0=0 +lon_0=20.25 +k=1 +x_0=150000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# SWEREF99 21 45 +<3017> +proj=tmerc +lat_0=0 +lon_0=21.75 +k=1 +x_0=150000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# SWEREF99 23 15 +<3018> +proj=tmerc +lat_0=0 +lon_0=23.25 +k=1 +x_0=150000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# RT90 7.5 gon V +<3019> +proj=tmerc +lat_0=0 +lon_0=11.30827777777778 +k=1 +x_0=1500000 +y_0=0 +ellps=bessel +towgs84=414.1,41.3,603.1,-0.855,2.141,-7.023,0 +units=m +no_defs <> +# RT90 5 gon V +<3020> +proj=tmerc +lat_0=0 +lon_0=13.55827777777778 +k=1 +x_0=1500000 +y_0=0 +ellps=bessel +towgs84=414.1,41.3,603.1,-0.855,2.141,-7.023,0 +units=m +no_defs <> +# RT90 2.5 gon V +<3021> +proj=tmerc +lat_0=0 +lon_0=15.80827777777778 +k=1 +x_0=1500000 +y_0=0 +ellps=bessel +towgs84=414.1,41.3,603.1,-0.855,2.141,-7.023,0 +units=m +no_defs <> +# RT90 0 gon +<3022> +proj=tmerc +lat_0=0 +lon_0=18.05827777777778 +k=1 +x_0=1500000 +y_0=0 +ellps=bessel +towgs84=414.1,41.3,603.1,-0.855,2.141,-7.023,0 +units=m +no_defs <> +# RT90 2.5 gon O +<3023> +proj=tmerc +lat_0=0 +lon_0=20.30827777777778 +k=1 +x_0=1500000 +y_0=0 +ellps=bessel +towgs84=414.1,41.3,603.1,-0.855,2.141,-7.023,0 +units=m +no_defs <> +# RT90 5 gon O +<3024> +proj=tmerc +lat_0=0 +lon_0=22.55827777777778 +k=1 +x_0=1500000 +y_0=0 +ellps=bessel +towgs84=414.1,41.3,603.1,-0.855,2.141,-7.023,0 +units=m +no_defs <> +# RT38 7.5 gon V +<3025> +proj=tmerc +lat_0=0 +lon_0=11.30827777777778 +k=1 +x_0=1500000 +y_0=0 +ellps=bessel +units=m +no_defs <> +# RT38 5 gon V +<3026> +proj=tmerc +lat_0=0 +lon_0=13.55827777777778 +k=1 +x_0=1500000 +y_0=0 +ellps=bessel +units=m +no_defs <> +# RT38 2.5 gon V +<3027> +proj=tmerc +lat_0=0 +lon_0=15.80827777777778 +k=1 +x_0=1500000 +y_0=0 +ellps=bessel +units=m +no_defs <> +# RT38 0 gon +<3028> +proj=tmerc +lat_0=0 +lon_0=18.05827777777778 +k=1 +x_0=1500000 +y_0=0 +ellps=bessel +units=m +no_defs <> +# RT38 2.5 gon O +<3029> +proj=tmerc +lat_0=0 +lon_0=20.30827777777778 +k=1 +x_0=1500000 +y_0=0 +ellps=bessel +units=m +no_defs <> +# RT38 5 gon O +<3030> +proj=tmerc +lat_0=0 +lon_0=22.55827777777778 +k=1 +x_0=1500000 +y_0=0 +ellps=bessel +units=m +no_defs <> +# WGS 84 / Antarctic Polar Stereographic +<3031> +proj=stere +lat_0=-90 +lat_ts=-71 +lon_0=0 +k=1 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / Australian Antarctic Polar Stereographic +<3032> +proj=stere +lat_0=-90 +lat_ts=-71 +lon_0=70 +k=1 +x_0=6000000 +y_0=6000000 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / Australian Antarctic Lambert +<3033> +proj=lcc +lat_1=-68.5 +lat_2=-74.5 +lat_0=-50 +lon_0=70 +x_0=6000000 +y_0=6000000 +datum=WGS84 +units=m +no_defs <> +# ETRS89 / LCC Europe +<3034> +proj=lcc +lat_1=35 +lat_2=65 +lat_0=52 +lon_0=10 +x_0=4000000 +y_0=2800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / LAEA Europe +<3035> +proj=laea +lat_0=52 +lon_0=10 +x_0=4321000 +y_0=3210000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Moznet / UTM zone 36S +<3036> +proj=utm +zone=36 +south +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Moznet / UTM zone 37S +<3037> +proj=utm +zone=37 +south +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / TM26 (deprecated) +<3038> +proj=utm +zone=26 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / TM27 (deprecated) +<3039> +proj=utm +zone=27 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / UTM zone 28N (N-E) +<3040> +proj=utm +zone=28 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / UTM zone 29N (N-E) +<3041> +proj=utm +zone=29 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / UTM zone 30N (N-E) +<3042> +proj=utm +zone=30 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / UTM zone 31N (N-E) +<3043> +proj=utm +zone=31 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / UTM zone 32N (N-E) +<3044> +proj=utm +zone=32 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / UTM zone 33N (N-E) +<3045> +proj=utm +zone=33 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / UTM zone 34N (N-E) +<3046> +proj=utm +zone=34 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / UTM zone 35N (N-E) +<3047> +proj=utm +zone=35 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / UTM zone 36N (N-E) +<3048> +proj=utm +zone=36 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / UTM zone 37N (N-E) +<3049> +proj=utm +zone=37 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / TM38 (deprecated) +<3050> +proj=utm +zone=38 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / TM39 (deprecated) +<3051> +proj=utm +zone=39 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Reykjavik 1900 / Lambert 1900 +# Unable to translate coordinate system EPSG:3052 into PROJ.4 format. +# +# Hjorsey 1955 / Lambert 1955 +# Unable to translate coordinate system EPSG:3053 into PROJ.4 format. +# +# Hjorsey 1955 / UTM zone 26N +<3054> +proj=utm +zone=26 +ellps=intl +towgs84=-73,47,-83,0,0,0,0 +units=m +no_defs <> +# Hjorsey 1955 / UTM zone 27N +<3055> +proj=utm +zone=27 +ellps=intl +towgs84=-73,47,-83,0,0,0,0 +units=m +no_defs <> +# Hjorsey 1955 / UTM zone 28N +<3056> +proj=utm +zone=28 +ellps=intl +towgs84=-73,47,-83,0,0,0,0 +units=m +no_defs <> +# ISN93 / Lambert 1993 +<3057> +proj=lcc +lat_1=64.25 +lat_2=65.75 +lat_0=65 +lon_0=-19 +x_0=500000 +y_0=500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Helle 1954 / Jan Mayen Grid +<3058> +proj=tmerc +lat_0=0 +lon_0=-8.5 +k=1 +x_0=50000 +y_0=-7800000 +ellps=intl +towgs84=982.6087,552.753,-540.873,6.6816266,-31.6114924,-19.84816,16.805 +units=m +no_defs <> +# LKS92 / Latvia TM +<3059> +proj=tmerc +lat_0=0 +lon_0=24 +k=0.9996 +x_0=500000 +y_0=-6000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# IGN72 Grande Terre / UTM zone 58S +<3060> +proj=utm +zone=58 +south +ellps=intl +towgs84=-11.64,-348.6,291.98,0,0,0,0 +units=m +no_defs <> +# Porto Santo 1995 / UTM zone 28N +<3061> +proj=utm +zone=28 +ellps=intl +towgs84=-502.862,-247.438,312.724,0,0,0,0 +units=m +no_defs <> +# Azores Oriental 1995 / UTM zone 26N +<3062> +proj=utm +zone=26 +ellps=intl +towgs84=-204.619,140.176,55.226,0,0,0,0 +units=m +no_defs <> +# Azores Central 1995 / UTM zone 26N +<3063> +proj=utm +zone=26 +ellps=intl +towgs84=-106.226,166.366,-37.893,0,0,0,0 +units=m +no_defs <> +# IGM95 / UTM zone 32N +<3064> +proj=utm +zone=32 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# IGM95 / UTM zone 33N +<3065> +proj=utm +zone=33 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ED50 / Jordan TM +<3066> +proj=tmerc +lat_0=0 +lon_0=37 +k=0.9998 +x_0=500000 +y_0=-3000000 +ellps=intl +towgs84=-87,-98,-121,0,0,0,0 +units=m +no_defs <> +# ETRS89 / TM35FIN(E,N) +<3067> +proj=utm +zone=35 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# DHDN / Soldner Berlin +<3068> +proj=cass +lat_0=52.41864827777778 +lon_0=13.62720366666667 +x_0=40000 +y_0=10000 +datum=potsdam +units=m +no_defs <> +# NAD27 / Wisconsin Transverse Mercator +<3069> +proj=tmerc +lat_0=0 +lon_0=-90 +k=0.9996 +x_0=500000 +y_0=-4500000 +datum=NAD27 +units=m +no_defs <> +# NAD83 / Wisconsin Transverse Mercator +<3070> +proj=tmerc +lat_0=0 +lon_0=-90 +k=0.9996 +x_0=520000 +y_0=-4480000 +datum=NAD83 +units=m +no_defs <> +# NAD83(HARN) / Wisconsin Transverse Mercator +<3071> +proj=tmerc +lat_0=0 +lon_0=-90 +k=0.9996 +x_0=520000 +y_0=-4480000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83 / Maine CS2000 East +<3072> +proj=tmerc +lat_0=43.83333333333334 +lon_0=-67.875 +k=0.99998 +x_0=700000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Maine CS2000 Central (deprecated) +<3073> +proj=tmerc +lat_0=43 +lon_0=-69.125 +k=0.99998 +x_0=500000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Maine CS2000 West +<3074> +proj=tmerc +lat_0=42.83333333333334 +lon_0=-70.375 +k=0.99998 +x_0=300000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83(HARN) / Maine CS2000 East +<3075> +proj=tmerc +lat_0=43.83333333333334 +lon_0=-67.875 +k=0.99998 +x_0=700000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Maine CS2000 Central (deprecated) +<3076> +proj=tmerc +lat_0=43 +lon_0=-69.125 +k=0.99998 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Maine CS2000 West +<3077> +proj=tmerc +lat_0=42.83333333333334 +lon_0=-70.375 +k=0.99998 +x_0=300000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83 / Michigan Oblique Mercator +<3078> +proj=omerc +lat_0=45.30916666666666 +lonc=-86 +alpha=337.25556 +k=0.9996 +x_0=2546731.496 +y_0=-4354009.816 +no_uoff +gamma=337.25556 +datum=NAD83 +units=m +no_defs <> +# NAD83(HARN) / Michigan Oblique Mercator +<3079> +proj=omerc +lat_0=45.30916666666666 +lonc=-86 +alpha=337.25556 +k=0.9996 +x_0=2546731.496 +y_0=-4354009.816 +no_uoff +gamma=337.25556 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD27 / Shackleford +<3080> +proj=lcc +lat_1=27.41666666666667 +lat_2=34.91666666666666 +lat_0=31.16666666666667 +lon_0=-100 +x_0=914400 +y_0=914400 +datum=NAD27 +units=ft +no_defs <> +# NAD83 / Texas State Mapping System +<3081> +proj=lcc +lat_1=27.41666666666667 +lat_2=34.91666666666666 +lat_0=31.16666666666667 +lon_0=-100 +x_0=1000000 +y_0=1000000 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Texas Centric Lambert Conformal +<3082> +proj=lcc +lat_1=27.5 +lat_2=35 +lat_0=18 +lon_0=-100 +x_0=1500000 +y_0=5000000 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Texas Centric Albers Equal Area +<3083> +proj=aea +lat_1=27.5 +lat_2=35 +lat_0=18 +lon_0=-100 +x_0=1500000 +y_0=6000000 +datum=NAD83 +units=m +no_defs <> +# NAD83(HARN) / Texas Centric Lambert Conformal +<3084> +proj=lcc +lat_1=27.5 +lat_2=35 +lat_0=18 +lon_0=-100 +x_0=1500000 +y_0=5000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Texas Centric Albers Equal Area +<3085> +proj=aea +lat_1=27.5 +lat_2=35 +lat_0=18 +lon_0=-100 +x_0=1500000 +y_0=6000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83 / Florida GDL Albers +<3086> +proj=aea +lat_1=24 +lat_2=31.5 +lat_0=24 +lon_0=-84 +x_0=400000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83(HARN) / Florida GDL Albers +<3087> +proj=aea +lat_1=24 +lat_2=31.5 +lat_0=24 +lon_0=-84 +x_0=400000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83 / Kentucky Single Zone +<3088> +proj=lcc +lat_1=37.08333333333334 +lat_2=38.66666666666666 +lat_0=36.33333333333334 +lon_0=-85.75 +x_0=1500000 +y_0=1000000 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Kentucky Single Zone (ftUS) +<3089> +proj=lcc +lat_1=37.08333333333334 +lat_2=38.66666666666666 +lat_0=36.33333333333334 +lon_0=-85.75 +x_0=1500000 +y_0=999999.9998983998 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83(HARN) / Kentucky Single Zone +<3090> +proj=lcc +lat_1=37.08333333333334 +lat_2=38.66666666666666 +lat_0=36.33333333333334 +lon_0=-85.75 +x_0=1500000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Kentucky Single Zone (ftUS) +<3091> +proj=lcc +lat_1=37.08333333333334 +lat_2=38.66666666666666 +lat_0=36.33333333333334 +lon_0=-85.75 +x_0=1500000 +y_0=999999.9998983998 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# Tokyo / UTM zone 51N +<3092> +proj=utm +zone=51 +ellps=bessel +towgs84=-146.414,507.337,680.507,0,0,0,0 +units=m +no_defs <> +# Tokyo / UTM zone 52N +<3093> +proj=utm +zone=52 +ellps=bessel +towgs84=-146.414,507.337,680.507,0,0,0,0 +units=m +no_defs <> +# Tokyo / UTM zone 53N +<3094> +proj=utm +zone=53 +ellps=bessel +towgs84=-146.414,507.337,680.507,0,0,0,0 +units=m +no_defs <> +# Tokyo / UTM zone 54N +<3095> +proj=utm +zone=54 +ellps=bessel +towgs84=-146.414,507.337,680.507,0,0,0,0 +units=m +no_defs <> +# Tokyo / UTM zone 55N +<3096> +proj=utm +zone=55 +ellps=bessel +towgs84=-146.414,507.337,680.507,0,0,0,0 +units=m +no_defs <> +# JGD2000 / UTM zone 51N +<3097> +proj=utm +zone=51 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# JGD2000 / UTM zone 52N +<3098> +proj=utm +zone=52 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# JGD2000 / UTM zone 53N +<3099> +proj=utm +zone=53 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# JGD2000 / UTM zone 54N +<3100> +proj=utm +zone=54 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# JGD2000 / UTM zone 55N +<3101> +proj=utm +zone=55 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# American Samoa 1962 / American Samoa Lambert +<3102> +proj=lcc +lat_1=-14.26666666666667 +lat_0=-14.26666666666667 +lon_0=-170 +k_0=1 +x_0=152400.3048006096 +y_0=95169.31165862332 +ellps=clrk66 +towgs84=-115,118,426,0,0,0,0 +units=us-ft +no_defs <> +# Mauritania 1999 / UTM zone 28N (deprecated) +<3103> +proj=utm +zone=28 +ellps=clrk80 +units=m +no_defs <> +# Mauritania 1999 / UTM zone 29N (deprecated) +<3104> +proj=utm +zone=29 +ellps=clrk80 +units=m +no_defs <> +# Mauritania 1999 / UTM zone 30N (deprecated) +<3105> +proj=utm +zone=30 +ellps=clrk80 +units=m +no_defs <> +# Gulshan 303 / Bangladesh Transverse Mercator +<3106> +proj=tmerc +lat_0=0 +lon_0=90 +k=0.9996 +x_0=500000 +y_0=0 +a=6377276.345 +b=6356075.41314024 +towgs84=283.7,735.9,261.1,0,0,0,0 +units=m +no_defs <> +# GDA94 / SA Lambert +<3107> +proj=lcc +lat_1=-28 +lat_2=-36 +lat_0=-32 +lon_0=135 +x_0=1000000 +y_0=2000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / Guernsey Grid +<3108> +proj=tmerc +lat_0=49.5 +lon_0=-2.416666666666667 +k=0.999997 +x_0=47000 +y_0=50000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / Jersey Transverse Mercator +<3109> +proj=tmerc +lat_0=49.225 +lon_0=-2.135 +k=0.9999999000000001 +x_0=40000 +y_0=70000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# AGD66 / Vicgrid66 +<3110> +proj=lcc +lat_1=-36 +lat_2=-38 +lat_0=-37 +lon_0=145 +x_0=2500000 +y_0=4500000 +ellps=aust_SA +towgs84=-117.808,-51.536,137.784,0.303,0.446,0.234,-0.29 +units=m +no_defs <> +# GDA94 / Vicgrid +<3111> +proj=lcc +lat_1=-36 +lat_2=-38 +lat_0=-37 +lon_0=145 +x_0=2500000 +y_0=2500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# GDA94 / Geoscience Australia Lambert +<3112> +proj=lcc +lat_1=-18 +lat_2=-36 +lat_0=0 +lon_0=134 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# GDA94 / BCSG02 +<3113> +proj=tmerc +lat_0=-28 +lon_0=153 +k=0.99999 +x_0=50000 +y_0=100000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# MAGNA-SIRGAS / Colombia Far West zone +<3114> +proj=tmerc +lat_0=4.596200416666666 +lon_0=-80.07750791666666 +k=1 +x_0=1000000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# MAGNA-SIRGAS / Colombia West zone +<3115> +proj=tmerc +lat_0=4.596200416666666 +lon_0=-77.07750791666666 +k=1 +x_0=1000000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# MAGNA-SIRGAS / Colombia Bogota zone +<3116> +proj=tmerc +lat_0=4.596200416666666 +lon_0=-74.07750791666666 +k=1 +x_0=1000000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# MAGNA-SIRGAS / Colombia East Central zone +<3117> +proj=tmerc +lat_0=4.596200416666666 +lon_0=-71.07750791666666 +k=1 +x_0=1000000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# MAGNA-SIRGAS / Colombia East zone +<3118> +proj=tmerc +lat_0=4.596200416666666 +lon_0=-68.07750791666666 +k=1 +x_0=1000000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Douala 1948 / AEF west +<3119> +proj=tmerc +lat_0=0 +lon_0=10.5 +k=0.999 +x_0=1000000 +y_0=1000000 +ellps=intl +towgs84=-206.1,-174.7,-87.7,0,0,0,0 +units=m +no_defs <> +# Pulkovo 1942(58) / Poland zone I +<3120> +proj=sterea +lat_0=50.625 +lon_0=21.08333333333333 +k=0.9998 +x_0=4637000 +y_0=5467000 +ellps=krass +towgs84=33.4,-146.6,-76.3,-0.359,-0.053,0.844,-0.84 +units=m +no_defs <> +# PRS92 / Philippines zone 1 +<3121> +proj=tmerc +lat_0=0 +lon_0=117 +k=0.99995 +x_0=500000 +y_0=0 +ellps=clrk66 +towgs84=-127.62,-67.24,-47.04,-3.068,4.903,1.578,-1.06 +units=m +no_defs <> +# PRS92 / Philippines zone 2 +<3122> +proj=tmerc +lat_0=0 +lon_0=119 +k=0.99995 +x_0=500000 +y_0=0 +ellps=clrk66 +towgs84=-127.62,-67.24,-47.04,-3.068,4.903,1.578,-1.06 +units=m +no_defs <> +# PRS92 / Philippines zone 3 +<3123> +proj=tmerc +lat_0=0 +lon_0=121 +k=0.99995 +x_0=500000 +y_0=0 +ellps=clrk66 +towgs84=-127.62,-67.24,-47.04,-3.068,4.903,1.578,-1.06 +units=m +no_defs <> +# PRS92 / Philippines zone 4 +<3124> +proj=tmerc +lat_0=0 +lon_0=123 +k=0.99995 +x_0=500000 +y_0=0 +ellps=clrk66 +towgs84=-127.62,-67.24,-47.04,-3.068,4.903,1.578,-1.06 +units=m +no_defs <> +# PRS92 / Philippines zone 5 +<3125> +proj=tmerc +lat_0=0 +lon_0=125 +k=0.99995 +x_0=500000 +y_0=0 +ellps=clrk66 +towgs84=-127.62,-67.24,-47.04,-3.068,4.903,1.578,-1.06 +units=m +no_defs <> +# ETRS89 / ETRS-GK19FIN +<3126> +proj=tmerc +lat_0=0 +lon_0=19 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / ETRS-GK20FIN +<3127> +proj=tmerc +lat_0=0 +lon_0=20 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / ETRS-GK21FIN +<3128> +proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / ETRS-GK22FIN +<3129> +proj=tmerc +lat_0=0 +lon_0=22 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / ETRS-GK23FIN +<3130> +proj=tmerc +lat_0=0 +lon_0=23 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / ETRS-GK24FIN +<3131> +proj=tmerc +lat_0=0 +lon_0=24 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / ETRS-GK25FIN +<3132> +proj=tmerc +lat_0=0 +lon_0=25 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / ETRS-GK26FIN +<3133> +proj=tmerc +lat_0=0 +lon_0=26 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / ETRS-GK27FIN +<3134> +proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / ETRS-GK28FIN +<3135> +proj=tmerc +lat_0=0 +lon_0=28 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / ETRS-GK29FIN +<3136> +proj=tmerc +lat_0=0 +lon_0=29 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / ETRS-GK30FIN +<3137> +proj=tmerc +lat_0=0 +lon_0=30 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / ETRS-GK31FIN +<3138> +proj=tmerc +lat_0=0 +lon_0=31 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Vanua Levu 1915 / Vanua Levu Grid +# Unable to translate coordinate system EPSG:3139 into PROJ.4 format. +# +# Viti Levu 1912 / Viti Levu Grid +<3140> +proj=cass +lat_0=-18 +lon_0=178 +x_0=109435.392 +y_0=141622.272 +a=6378306.3696 +b=6356571.996 +towgs84=98,390,-22,0,0,0,0 +units=link +no_defs <> +# Fiji 1956 / UTM zone 60S +<3141> +proj=utm +zone=60 +south +ellps=intl +towgs84=265.025,384.929,-194.046,0,0,0,0 +units=m +no_defs <> +# Fiji 1956 / UTM zone 1S +<3142> +proj=utm +zone=1 +south +ellps=intl +towgs84=265.025,384.929,-194.046,0,0,0,0 +units=m +no_defs <> +# Fiji 1986 / Fiji Map Grid (deprecated) +<3143> +proj=tmerc +lat_0=-17 +lon_0=178.75 +k=0.99985 +x_0=2000000 +y_0=4000000 +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# FD54 / Faroe Lambert +# Unable to translate coordinate system EPSG:3144 into PROJ.4 format. +# +# ETRS89 / Faroe Lambert +# Unable to translate coordinate system EPSG:3145 into PROJ.4 format. +# +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 6 (deprecated) +<3146> +proj=tmerc +lat_0=0 +lon_0=18 +k=1 +x_0=6500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 18E (deprecated) +<3147> +proj=tmerc +lat_0=0 +lon_0=18 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Indian 1960 / UTM zone 48N +<3148> +proj=utm +zone=48 +a=6377276.345 +b=6356075.41314024 +towgs84=198,881,317,0,0,0,0 +units=m +no_defs <> +# Indian 1960 / UTM zone 49N +<3149> +proj=utm +zone=49 +a=6377276.345 +b=6356075.41314024 +towgs84=198,881,317,0,0,0,0 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 6 (deprecated) +<3150> +proj=tmerc +lat_0=0 +lon_0=18 +k=1 +x_0=6500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 18E (deprecated) +<3151> +proj=tmerc +lat_0=0 +lon_0=18 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# ST74 +<3152> +proj=tmerc +lat_0=0 +lon_0=18.05779 +k=0.99999425 +x_0=100178.1808 +y_0=-6500614.7836 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS) / BC Albers +<3153> +proj=aea +lat_1=50 +lat_2=58.5 +lat_0=45 +lon_0=-126 +x_0=1000000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS) / UTM zone 7N +<3154> +proj=utm +zone=7 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS) / UTM zone 8N +<3155> +proj=utm +zone=8 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS) / UTM zone 9N +<3156> +proj=utm +zone=9 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS) / UTM zone 10N +<3157> +proj=utm +zone=10 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS) / UTM zone 14N +<3158> +proj=utm +zone=14 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS) / UTM zone 15N +<3159> +proj=utm +zone=15 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS) / UTM zone 16N +<3160> +proj=utm +zone=16 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83 / Ontario MNR Lambert +<3161> +proj=lcc +lat_1=44.5 +lat_2=53.5 +lat_0=0 +lon_0=-85 +x_0=930000 +y_0=6430000 +datum=NAD83 +units=m +no_defs <> +# NAD83(CSRS) / Ontario MNR Lambert +<3162> +proj=lcc +lat_1=44.5 +lat_2=53.5 +lat_0=0 +lon_0=-85 +x_0=930000 +y_0=6430000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# RGNC91-93 / Lambert New Caledonia +<3163> +proj=lcc +lat_1=-20.66666666666667 +lat_2=-22.33333333333333 +lat_0=-21.5 +lon_0=166 +x_0=400000 +y_0=300000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ST87 Ouvea / UTM zone 58S +<3164> +proj=utm +zone=58 +south +ellps=WGS84 +towgs84=-56.263,16.136,-22.856,0,0,0,0 +units=m +no_defs <> +# NEA74 Noumea / Noumea Lambert +<3165> +proj=lcc +lat_1=-22.24469175 +lat_2=-22.29469175 +lat_0=-22.26969175 +lon_0=166.44242575 +x_0=0.66 +y_0=1.02 +ellps=intl +towgs84=-10.18,-350.43,291.37,0,0,0,0 +units=m +no_defs <> +# NEA74 Noumea / Noumea Lambert 2 +<3166> +proj=lcc +lat_1=-22.24472222222222 +lat_2=-22.29472222222222 +lat_0=-22.26972222222222 +lon_0=166.4425 +x_0=8.313000000000001 +y_0=-2.354 +ellps=intl +towgs84=-10.18,-350.43,291.37,0,0,0,0 +units=m +no_defs <> +# Kertau (RSO) / RSO Malaya (ch) +<3167> +proj=omerc +lat_0=4 +lonc=102.25 +alpha=323.0257905 +k=0.99984 +x_0=40000 +y_0=0 +no_uoff +gamma=323.1301023611111 +a=6377295.664 +b=6356094.667915204 +to_meter=20.116756 +no_defs <> +# Kertau (RSO) / RSO Malaya (m) +<3168> +proj=omerc +lat_0=4 +lonc=102.25 +alpha=323.0257905 +k=0.99984 +x_0=804670.24 +y_0=0 +no_uoff +gamma=323.1301023611111 +a=6377295.664 +b=6356094.667915204 +units=m +no_defs <> +# RGNC91-93 / UTM zone 57S +<3169> +proj=utm +zone=57 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# RGNC91-93 / UTM zone 58S +<3170> +proj=utm +zone=58 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# RGNC91-93 / UTM zone 59S +<3171> +proj=utm +zone=59 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# IGN53 Mare / UTM zone 59S +<3172> +proj=utm +zone=59 +south +ellps=intl +towgs84=287.58,177.78,-135.41,0,0,0,0 +units=m +no_defs <> +# fk89 / Faroe Lambert FK89 +# Unable to translate coordinate system EPSG:3173 into PROJ.4 format. +# +# NAD83 / Great Lakes Albers +<3174> +proj=aea +lat_1=42.122774 +lat_2=49.01518 +lat_0=45.568977 +lon_0=-84.455955 +x_0=1000000 +y_0=1000000 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Great Lakes and St Lawrence Albers +<3175> +proj=aea +lat_1=42.122774 +lat_2=49.01518 +lat_0=45.568977 +lon_0=-83.248627 +x_0=1000000 +y_0=1000000 +datum=NAD83 +units=m +no_defs <> +# Indian 1960 / TM 106 NE +<3176> +proj=tmerc +lat_0=0 +lon_0=106 +k=0.9996 +x_0=500000 +y_0=0 +a=6377276.345 +b=6356075.41314024 +towgs84=198,881,317,0,0,0,0 +units=m +no_defs <> +# LGD2006 / Libya TM +<3177> +proj=tmerc +lat_0=0 +lon_0=17 +k=0.9965000000000001 +x_0=1000000 +y_0=0 +ellps=intl +towgs84=-208.4058,-109.8777,-2.5764,0,0,0,0 +units=m +no_defs <> +# GR96 / UTM zone 18N +<3178> +proj=utm +zone=18 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# GR96 / UTM zone 19N +<3179> +proj=utm +zone=19 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# GR96 / UTM zone 20N +<3180> +proj=utm +zone=20 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# GR96 / UTM zone 21N +<3181> +proj=utm +zone=21 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# GR96 / UTM zone 22N +<3182> +proj=utm +zone=22 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# GR96 / UTM zone 23N +<3183> +proj=utm +zone=23 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# GR96 / UTM zone 24N +<3184> +proj=utm +zone=24 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# GR96 / UTM zone 25N +<3185> +proj=utm +zone=25 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# GR96 / UTM zone 26N +<3186> +proj=utm +zone=26 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# GR96 / UTM zone 27N +<3187> +proj=utm +zone=27 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# GR96 / UTM zone 28N +<3188> +proj=utm +zone=28 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# GR96 / UTM zone 29N +<3189> +proj=utm +zone=29 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# LGD2006 / Libya TM zone 5 +<3190> +proj=tmerc +lat_0=0 +lon_0=9 +k=0.99995 +x_0=200000 +y_0=0 +ellps=intl +towgs84=-208.4058,-109.8777,-2.5764,0,0,0,0 +units=m +no_defs <> +# LGD2006 / Libya TM zone 6 +<3191> +proj=tmerc +lat_0=0 +lon_0=11 +k=0.99995 +x_0=200000 +y_0=0 +ellps=intl +towgs84=-208.4058,-109.8777,-2.5764,0,0,0,0 +units=m +no_defs <> +# LGD2006 / Libya TM zone 7 +<3192> +proj=tmerc +lat_0=0 +lon_0=13 +k=0.99995 +x_0=200000 +y_0=0 +ellps=intl +towgs84=-208.4058,-109.8777,-2.5764,0,0,0,0 +units=m +no_defs <> +# LGD2006 / Libya TM zone 8 +<3193> +proj=tmerc +lat_0=0 +lon_0=15 +k=0.99995 +x_0=200000 +y_0=0 +ellps=intl +towgs84=-208.4058,-109.8777,-2.5764,0,0,0,0 +units=m +no_defs <> +# LGD2006 / Libya TM zone 9 +<3194> +proj=tmerc +lat_0=0 +lon_0=17 +k=0.99995 +x_0=200000 +y_0=0 +ellps=intl +towgs84=-208.4058,-109.8777,-2.5764,0,0,0,0 +units=m +no_defs <> +# LGD2006 / Libya TM zone 10 +<3195> +proj=tmerc +lat_0=0 +lon_0=19 +k=0.99995 +x_0=200000 +y_0=0 +ellps=intl +towgs84=-208.4058,-109.8777,-2.5764,0,0,0,0 +units=m +no_defs <> +# LGD2006 / Libya TM zone 11 +<3196> +proj=tmerc +lat_0=0 +lon_0=21 +k=0.99995 +x_0=200000 +y_0=0 +ellps=intl +towgs84=-208.4058,-109.8777,-2.5764,0,0,0,0 +units=m +no_defs <> +# LGD2006 / Libya TM zone 12 +<3197> +proj=tmerc +lat_0=0 +lon_0=23 +k=0.99995 +x_0=200000 +y_0=0 +ellps=intl +towgs84=-208.4058,-109.8777,-2.5764,0,0,0,0 +units=m +no_defs <> +# LGD2006 / Libya TM zone 13 +<3198> +proj=tmerc +lat_0=0 +lon_0=25 +k=0.99995 +x_0=200000 +y_0=0 +ellps=intl +towgs84=-208.4058,-109.8777,-2.5764,0,0,0,0 +units=m +no_defs <> +# LGD2006 / UTM zone 32N +<3199> +proj=utm +zone=32 +ellps=intl +towgs84=-208.4058,-109.8777,-2.5764,0,0,0,0 +units=m +no_defs <> +# FD58 / Iraq zone +<3200> +proj=lcc +lat_1=32.5 +lat_0=32.5 +lon_0=45 +k_0=0.9987864078000001 +x_0=1500000 +y_0=1166200 +ellps=clrk80 +towgs84=-241.54,-163.64,396.06,0,0,0,0 +units=m +no_defs <> +# LGD2006 / UTM zone 33N +<3201> +proj=utm +zone=33 +ellps=intl +towgs84=-208.4058,-109.8777,-2.5764,0,0,0,0 +units=m +no_defs <> +# LGD2006 / UTM zone 34N +<3202> +proj=utm +zone=34 +ellps=intl +towgs84=-208.4058,-109.8777,-2.5764,0,0,0,0 +units=m +no_defs <> +# LGD2006 / UTM zone 35N +<3203> +proj=utm +zone=35 +ellps=intl +towgs84=-208.4058,-109.8777,-2.5764,0,0,0,0 +units=m +no_defs <> +# WGS 84 / SCAR IMW SP19-20 +<3204> +proj=lcc +lat_1=-60.66666666666666 +lat_2=-63.33333333333334 +lat_0=-90 +lon_0=-66 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW SP21-22 +<3205> +proj=lcc +lat_1=-60.66666666666666 +lat_2=-63.33333333333334 +lat_0=-90 +lon_0=-54 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW SP23-24 +<3206> +proj=lcc +lat_1=-60.66666666666666 +lat_2=-63.33333333333334 +lat_0=-90 +lon_0=-42 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW SQ01-02 +<3207> +proj=lcc +lat_1=-64.66666666666667 +lat_2=-67.33333333333333 +lat_0=-90 +lon_0=-174 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW SQ19-20 +<3208> +proj=lcc +lat_1=-64.66666666666667 +lat_2=-67.33333333333333 +lat_0=-90 +lon_0=-66 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW SQ21-22 +<3209> +proj=lcc +lat_1=-64.66666666666667 +lat_2=-67.33333333333333 +lat_0=-90 +lon_0=-54 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW SQ37-38 +<3210> +proj=lcc +lat_1=-64.66666666666667 +lat_2=-67.33333333333333 +lat_0=-90 +lon_0=42 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW SQ39-40 +<3211> +proj=lcc +lat_1=-64.66666666666667 +lat_2=-67.33333333333333 +lat_0=-90 +lon_0=54 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW SQ41-42 +<3212> +proj=lcc +lat_1=-64.66666666666667 +lat_2=-67.33333333333333 +lat_0=-90 +lon_0=66 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW SQ43-44 +<3213> +proj=lcc +lat_1=-64.66666666666667 +lat_2=-67.33333333333333 +lat_0=-90 +lon_0=78 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW SQ45-46 +<3214> +proj=lcc +lat_1=-64.66666666666667 +lat_2=-67.33333333333333 +lat_0=-90 +lon_0=90 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW SQ47-48 +<3215> +proj=lcc +lat_1=-64.66666666666667 +lat_2=-67.33333333333333 +lat_0=-90 +lon_0=102 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW SQ49-50 +<3216> +proj=lcc +lat_1=-64.66666666666667 +lat_2=-67.33333333333333 +lat_0=-90 +lon_0=114 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW SQ51-52 +<3217> +proj=lcc +lat_1=-64.66666666666667 +lat_2=-67.33333333333333 +lat_0=-90 +lon_0=126 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW SQ53-54 +<3218> +proj=lcc +lat_1=-64.66666666666667 +lat_2=-67.33333333333333 +lat_0=-90 +lon_0=138 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW SQ55-56 +<3219> +proj=lcc +lat_1=-64.66666666666667 +lat_2=-67.33333333333333 +lat_0=-90 +lon_0=150 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW SQ57-58 +<3220> +proj=lcc +lat_1=-64.66666666666667 +lat_2=-67.33333333333333 +lat_0=-90 +lon_0=162 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW SR13-14 +<3221> +proj=lcc +lat_1=-68.66666666666667 +lat_2=-71.33333333333333 +lat_0=-90 +lon_0=-102 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW SR15-16 +<3222> +proj=lcc +lat_1=-68.66666666666667 +lat_2=-71.33333333333333 +lat_0=-90 +lon_0=-90 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW SR17-18 +<3223> +proj=lcc +lat_1=-68.66666666666667 +lat_2=-71.33333333333333 +lat_0=-90 +lon_0=-78 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW SR19-20 +<3224> +proj=lcc +lat_1=-68.66666666666667 +lat_2=-71.33333333333333 +lat_0=-90 +lon_0=-66 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW SR27-28 +<3225> +proj=lcc +lat_1=-68.66666666666667 +lat_2=-71.33333333333333 +lat_0=-90 +lon_0=-18 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW SR29-30 +<3226> +proj=lcc +lat_1=-68.66666666666667 +lat_2=-71.33333333333333 +lat_0=-90 +lon_0=-6 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW SR31-32 +<3227> +proj=lcc +lat_1=-68.66666666666667 +lat_2=-71.33333333333333 +lat_0=-90 +lon_0=6 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW SR33-34 +<3228> +proj=lcc +lat_1=-68.66666666666667 +lat_2=-71.33333333333333 +lat_0=-90 +lon_0=18 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW SR35-36 +<3229> +proj=lcc +lat_1=-68.66666666666667 +lat_2=-71.33333333333333 +lat_0=-90 +lon_0=30 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW SR37-38 +<3230> +proj=lcc +lat_1=-68.66666666666667 +lat_2=-71.33333333333333 +lat_0=-90 +lon_0=42 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW SR39-40 +<3231> +proj=lcc +lat_1=-68.66666666666667 +lat_2=-71.33333333333333 +lat_0=-90 +lon_0=54 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW SR41-42 +<3232> +proj=lcc +lat_1=-68.66666666666667 +lat_2=-71.33333333333333 +lat_0=-90 +lon_0=66 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW SR43-44 +<3233> +proj=lcc +lat_1=-68.66666666666667 +lat_2=-71.33333333333333 +lat_0=-90 +lon_0=78 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW SR45-46 +<3234> +proj=lcc +lat_1=-68.66666666666667 +lat_2=-71.33333333333333 +lat_0=-90 +lon_0=90 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW SR47-48 +<3235> +proj=lcc +lat_1=-68.66666666666667 +lat_2=-71.33333333333333 +lat_0=-90 +lon_0=102 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW SR49-50 +<3236> +proj=lcc +lat_1=-68.66666666666667 +lat_2=-71.33333333333333 +lat_0=-90 +lon_0=114 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW SR51-52 +<3237> +proj=lcc +lat_1=-68.66666666666667 +lat_2=-71.33333333333333 +lat_0=-90 +lon_0=126 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW SR53-54 +<3238> +proj=lcc +lat_1=-68.66666666666667 +lat_2=-71.33333333333333 +lat_0=-90 +lon_0=138 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW SR55-56 +<3239> +proj=lcc +lat_1=-68.66666666666667 +lat_2=-71.33333333333333 +lat_0=-90 +lon_0=150 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW SR57-58 +<3240> +proj=lcc +lat_1=-68.66666666666667 +lat_2=-71.33333333333333 +lat_0=-90 +lon_0=162 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW SR59-60 +<3241> +proj=lcc +lat_1=-68.66666666666667 +lat_2=-71.33333333333333 +lat_0=-90 +lon_0=174 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW SS04-06 +<3242> +proj=lcc +lat_1=-72.66666666666667 +lat_2=-75.33333333333333 +lat_0=-90 +lon_0=-153 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW SS07-09 +<3243> +proj=lcc +lat_1=-72.66666666666667 +lat_2=-75.33333333333333 +lat_0=-90 +lon_0=-135 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW SS10-12 +<3244> +proj=lcc +lat_1=-72.66666666666667 +lat_2=-75.33333333333333 +lat_0=-90 +lon_0=-117 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW SS13-15 +<3245> +proj=lcc +lat_1=-72.66666666666667 +lat_2=-75.33333333333333 +lat_0=-90 +lon_0=-99 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW SS16-18 +<3246> +proj=lcc +lat_1=-72.66666666666667 +lat_2=-75.33333333333333 +lat_0=-90 +lon_0=-81 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW SS19-21 +<3247> +proj=lcc +lat_1=-72.66666666666667 +lat_2=-75.33333333333333 +lat_0=-90 +lon_0=-63 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW SS25-27 +<3248> +proj=lcc +lat_1=-72.66666666666667 +lat_2=-75.33333333333333 +lat_0=-90 +lon_0=-27 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW SS28-30 +<3249> +proj=lcc +lat_1=-72.66666666666667 +lat_2=-75.33333333333333 +lat_0=-90 +lon_0=-9 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW SS31-33 +<3250> +proj=lcc +lat_1=-72.66666666666667 +lat_2=-75.33333333333333 +lat_0=-90 +lon_0=9 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW SS34-36 +<3251> +proj=lcc +lat_1=-72.66666666666667 +lat_2=-75.33333333333333 +lat_0=-90 +lon_0=27 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW SS37-39 +<3252> +proj=lcc +lat_1=-72.66666666666667 +lat_2=-75.33333333333333 +lat_0=-90 +lon_0=45 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW SS40-42 +<3253> +proj=lcc +lat_1=-72.66666666666667 +lat_2=-75.33333333333333 +lat_0=-90 +lon_0=63 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW SS43-45 +<3254> +proj=lcc +lat_1=-72.66666666666667 +lat_2=-75.33333333333333 +lat_0=-90 +lon_0=81 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW SS46-48 +<3255> +proj=lcc +lat_1=-72.66666666666667 +lat_2=-75.33333333333333 +lat_0=-90 +lon_0=99 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW SS49-51 +<3256> +proj=lcc +lat_1=-72.66666666666667 +lat_2=-75.33333333333333 +lat_0=-90 +lon_0=117 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW SS52-54 +<3257> +proj=lcc +lat_1=-72.66666666666667 +lat_2=-75.33333333333333 +lat_0=-90 +lon_0=135 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW SS55-57 +<3258> +proj=lcc +lat_1=-72.66666666666667 +lat_2=-75.33333333333333 +lat_0=-90 +lon_0=153 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW SS58-60 +<3259> +proj=lcc +lat_1=-72.66666666666667 +lat_2=-75.33333333333333 +lat_0=-90 +lon_0=171 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW ST01-04 +<3260> +proj=lcc +lat_1=-76.66666666666667 +lat_2=-79.33333333333333 +lat_0=-90 +lon_0=-168 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW ST05-08 +<3261> +proj=lcc +lat_1=-76.66666666666667 +lat_2=-79.33333333333333 +lat_0=-90 +lon_0=-144 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW ST09-12 +<3262> +proj=lcc +lat_1=-76.66666666666667 +lat_2=-79.33333333333333 +lat_0=-90 +lon_0=-120 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW ST13-16 +<3263> +proj=lcc +lat_1=-76.66666666666667 +lat_2=-79.33333333333333 +lat_0=-90 +lon_0=-96 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW ST17-20 +<3264> +proj=lcc +lat_1=-76.66666666666667 +lat_2=-79.33333333333333 +lat_0=-90 +lon_0=-72 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW ST21-24 +<3265> +proj=lcc +lat_1=-76.66666666666667 +lat_2=-79.33333333333333 +lat_0=-90 +lon_0=-48 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW ST25-28 +<3266> +proj=lcc +lat_1=-76.66666666666667 +lat_2=-79.33333333333333 +lat_0=-90 +lon_0=-24 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW ST29-32 +<3267> +proj=lcc +lat_1=-76.66666666666667 +lat_2=-79.33333333333333 +lat_0=-90 +lon_0=0 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW ST33-36 +<3268> +proj=lcc +lat_1=-76.66666666666667 +lat_2=-79.33333333333333 +lat_0=-90 +lon_0=24 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW ST37-40 +<3269> +proj=lcc +lat_1=-76.66666666666667 +lat_2=-79.33333333333333 +lat_0=-90 +lon_0=48 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW ST41-44 +<3270> +proj=lcc +lat_1=-76.66666666666667 +lat_2=-79.33333333333333 +lat_0=-90 +lon_0=72 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW ST45-48 +<3271> +proj=lcc +lat_1=-76.66666666666667 +lat_2=-79.33333333333333 +lat_0=-90 +lon_0=96 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW ST49-52 +<3272> +proj=lcc +lat_1=-76.66666666666667 +lat_2=-79.33333333333333 +lat_0=-90 +lon_0=120 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW ST53-56 +<3273> +proj=lcc +lat_1=-76.66666666666667 +lat_2=-79.33333333333333 +lat_0=-90 +lon_0=144 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW ST57-60 +<3274> +proj=lcc +lat_1=-76.66666666666667 +lat_2=-79.33333333333333 +lat_0=-90 +lon_0=168 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW SU01-05 +<3275> +proj=stere +lat_0=-90 +lat_ts=-80.23861111111111 +lon_0=-165 +k=1 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW SU06-10 +<3276> +proj=stere +lat_0=-90 +lat_ts=-80.23861111111111 +lon_0=-135 +k=1 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW SU11-15 +<3277> +proj=stere +lat_0=-90 +lat_ts=-80.23861111111111 +lon_0=-105 +k=1 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW SU16-20 +<3278> +proj=stere +lat_0=-90 +lat_ts=-80.23861111111111 +lon_0=-75 +k=1 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW SU21-25 +<3279> +proj=stere +lat_0=-90 +lat_ts=-80.23861111111111 +lon_0=-45 +k=1 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW SU26-30 +<3280> +proj=stere +lat_0=-90 +lat_ts=-80.23861111111111 +lon_0=-15 +k=1 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW SU31-35 +<3281> +proj=stere +lat_0=-90 +lat_ts=-80.23861111111111 +lon_0=15 +k=1 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW SU36-40 +<3282> +proj=stere +lat_0=-90 +lat_ts=-80.23861111111111 +lon_0=45 +k=1 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW SU41-45 +<3283> +proj=stere +lat_0=-90 +lat_ts=-80.23861111111111 +lon_0=75 +k=1 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW SU46-50 +<3284> +proj=stere +lat_0=-90 +lat_ts=-80.23861111111111 +lon_0=105 +k=1 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW SU51-55 +<3285> +proj=stere +lat_0=-90 +lat_ts=-80.23861111111111 +lon_0=135 +k=1 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW SU56-60 +<3286> +proj=stere +lat_0=-90 +lat_ts=-80.23861111111111 +lon_0=165 +k=1 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW SV01-10 +<3287> +proj=stere +lat_0=-90 +lat_ts=-80.23861111111111 +lon_0=-150 +k=1 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW SV11-20 +<3288> +proj=stere +lat_0=-90 +lat_ts=-80.23861111111111 +lon_0=-90 +k=1 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW SV21-30 +<3289> +proj=stere +lat_0=-90 +lat_ts=-80.23861111111111 +lon_0=-30 +k=1 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW SV31-40 +<3290> +proj=stere +lat_0=-90 +lat_ts=-80.23861111111111 +lon_0=30 +k=1 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW SV41-50 +<3291> +proj=stere +lat_0=-90 +lat_ts=-80.23861111111111 +lon_0=90 +k=1 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW SV51-60 +<3292> +proj=stere +lat_0=-90 +lat_ts=-80.23861111111111 +lon_0=150 +k=1 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / SCAR IMW SW01-60 +<3293> +proj=stere +lat_0=-90 +lat_ts=-80.23861111111111 +lon_0=0 +k=1 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / USGS Transantarctic Mountains +<3294> +proj=lcc +lat_1=-76.66666666666667 +lat_2=-79.33333333333333 +lat_0=-78 +lon_0=162 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# Guam 1963 / Yap Islands +# Unable to translate coordinate system EPSG:3295 into PROJ.4 format. +# +# RGPF / UTM zone 5S +<3296> +proj=utm +zone=5 +south +ellps=GRS80 +towgs84=0.072,-0.507,-0.245,-0.0183,0.0003,-0.007,-0.0093 +units=m +no_defs <> +# RGPF / UTM zone 6S +<3297> +proj=utm +zone=6 +south +ellps=GRS80 +towgs84=0.072,-0.507,-0.245,-0.0183,0.0003,-0.007,-0.0093 +units=m +no_defs <> +# RGPF / UTM zone 7S +<3298> +proj=utm +zone=7 +south +ellps=GRS80 +towgs84=0.072,-0.507,-0.245,-0.0183,0.0003,-0.007,-0.0093 +units=m +no_defs <> +# RGPF / UTM zone 8S +<3299> +proj=utm +zone=8 +south +ellps=GRS80 +towgs84=0.072,-0.507,-0.245,-0.0183,0.0003,-0.007,-0.0093 +units=m +no_defs <> +# Estonian Coordinate System of 1992 +<3300> +proj=lcc +lat_1=59.33333333333334 +lat_2=58 +lat_0=57.51755393055556 +lon_0=24 +x_0=500000 +y_0=6375000 +ellps=GRS80 +towgs84=0.055,-0.541,-0.185,0.0183,-0.0003,-0.007,-0.014 +units=m +no_defs <> +# Estonian Coordinate System of 1997 +<3301> +proj=lcc +lat_1=59.33333333333334 +lat_2=58 +lat_0=57.51755393055556 +lon_0=24 +x_0=500000 +y_0=6375000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# IGN63 Hiva Oa / UTM zone 7S +<3302> +proj=utm +zone=7 +south +ellps=intl +towgs84=410.721,55.049,80.746,2.5779,2.3514,0.6664,17.3311 +units=m +no_defs <> +# Fatu Iva 72 / UTM zone 7S +<3303> +proj=utm +zone=7 +south +ellps=intl +towgs84=347.103,1078.125,2623.922,-33.8875,70.6773,-9.3943,186.074 +units=m +no_defs <> +# Tahiti 79 / UTM zone 6S +<3304> +proj=utm +zone=6 +south +ellps=intl +towgs84=221.525,152.948,176.768,-2.3847,-1.3896,-0.877,11.4741 +units=m +no_defs <> +# Moorea 87 / UTM zone 6S +<3305> +proj=utm +zone=6 +south +ellps=intl +towgs84=215.525,149.593,176.229,-3.2624,-1.692,-1.1571,10.4773 +units=m +no_defs <> +# Maupiti 83 / UTM zone 5S +<3306> +proj=utm +zone=5 +south +ellps=intl +towgs84=217.037,86.959,23.956,0,0,0,0 +units=m +no_defs <> +# Nakhl-e Ghanem / UTM zone 39N +<3307> +proj=utm +zone=39 +ellps=WGS84 +towgs84=0,-0.15,0.68,0,0,0,0 +units=m +no_defs <> +# GDA94 / NSW Lambert +<3308> +proj=lcc +lat_1=-30.75 +lat_2=-35.75 +lat_0=-33.25 +lon_0=147 +x_0=9300000 +y_0=4500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD27 / California Albers +<3309> +proj=aea +lat_1=34 +lat_2=40.5 +lat_0=0 +lon_0=-120 +x_0=0 +y_0=-4000000 +datum=NAD27 +units=m +no_defs <> +# NAD83 / California Albers +<3310> +proj=aea +lat_1=34 +lat_2=40.5 +lat_0=0 +lon_0=-120 +x_0=0 +y_0=-4000000 +datum=NAD83 +units=m +no_defs <> +# NAD83(HARN) / California Albers +<3311> +proj=aea +lat_1=34 +lat_2=40.5 +lat_0=0 +lon_0=-120 +x_0=0 +y_0=-4000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# CSG67 / UTM zone 21N +<3312> +proj=utm +zone=21 +ellps=intl +towgs84=-186,230,110,0,0,0,0 +units=m +no_defs <> +# RGFG95 / UTM zone 21N +<3313> +proj=utm +zone=21 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Katanga 1955 / Katanga Lambert (deprecated) +<3314> +proj=lcc +lat_1=-6.5 +lat_2=-11.5 +lat_0=0 +lon_0=26 +x_0=0 +y_0=0 +ellps=clrk66 +towgs84=-103.746,-9.614,-255.95,0,0,0,0 +units=m +no_defs <> +# Katanga 1955 / Katanga TM (deprecated) +<3315> +proj=tmerc +lat_0=-9 +lon_0=26 +k=0.9998 +x_0=0 +y_0=0 +ellps=clrk66 +towgs84=-103.746,-9.614,-255.95,0,0,0,0 +units=m +no_defs <> +# Kasai 1953 / Congo TM zone 22 +<3316> +proj=tmerc +lat_0=0 +lon_0=22 +k=0.9999 +x_0=500000 +y_0=10000000 +ellps=clrk80 +units=m +no_defs <> +# Kasai 1953 / Congo TM zone 24 +<3317> +proj=tmerc +lat_0=0 +lon_0=24 +k=0.9999 +x_0=500000 +y_0=10000000 +ellps=clrk80 +units=m +no_defs <> +# IGC 1962 / Congo TM zone 12 +<3318> +proj=tmerc +lat_0=0 +lon_0=12 +k=0.9999 +x_0=500000 +y_0=10000000 +ellps=clrk80 +units=m +no_defs <> +# IGC 1962 / Congo TM zone 14 +<3319> +proj=tmerc +lat_0=0 +lon_0=14 +k=0.9999 +x_0=500000 +y_0=10000000 +ellps=clrk80 +units=m +no_defs <> +# IGC 1962 / Congo TM zone 16 +<3320> +proj=tmerc +lat_0=0 +lon_0=16 +k=0.9999 +x_0=500000 +y_0=10000000 +ellps=clrk80 +units=m +no_defs <> +# IGC 1962 / Congo TM zone 18 +<3321> +proj=tmerc +lat_0=0 +lon_0=18 +k=0.9999 +x_0=500000 +y_0=10000000 +ellps=clrk80 +units=m +no_defs <> +# IGC 1962 / Congo TM zone 20 +<3322> +proj=tmerc +lat_0=0 +lon_0=20 +k=0.9999 +x_0=500000 +y_0=10000000 +ellps=clrk80 +units=m +no_defs <> +# IGC 1962 / Congo TM zone 22 +<3323> +proj=tmerc +lat_0=0 +lon_0=22 +k=0.9999 +x_0=500000 +y_0=10000000 +ellps=clrk80 +units=m +no_defs <> +# IGC 1962 / Congo TM zone 24 +<3324> +proj=tmerc +lat_0=0 +lon_0=24 +k=0.9999 +x_0=500000 +y_0=10000000 +ellps=clrk80 +units=m +no_defs <> +# IGC 1962 / Congo TM zone 26 +<3325> +proj=tmerc +lat_0=0 +lon_0=26 +k=0.9999 +x_0=500000 +y_0=10000000 +ellps=clrk80 +units=m +no_defs <> +# IGC 1962 / Congo TM zone 28 +<3326> +proj=tmerc +lat_0=0 +lon_0=28 +k=0.9999 +x_0=500000 +y_0=10000000 +ellps=clrk80 +units=m +no_defs <> +# IGC 1962 / Congo TM zone 30 +<3327> +proj=tmerc +lat_0=0 +lon_0=30 +k=0.9999 +x_0=500000 +y_0=10000000 +ellps=clrk80 +units=m +no_defs <> +# Pulkovo 1942(58) / GUGiK-80 +<3328> +proj=sterea +lat_0=52.16666666666666 +lon_0=19.16666666666667 +k=0.999714 +x_0=500000 +y_0=500000 +ellps=krass +towgs84=33.4,-146.6,-76.3,-0.359,-0.053,0.844,-0.84 +units=m +no_defs <> +# Pulkovo 1942(58) / 3-degree Gauss-Kruger zone 5 +<3329> +proj=tmerc +lat_0=0 +lon_0=15 +k=1 +x_0=5500000 +y_0=0 +ellps=krass +towgs84=33.4,-146.6,-76.3,-0.359,-0.053,0.844,-0.84 +units=m +no_defs <> +# Pulkovo 1942(58) / 3-degree Gauss-Kruger zone 6 +<3330> +proj=tmerc +lat_0=0 +lon_0=18 +k=1 +x_0=6500000 +y_0=0 +ellps=krass +towgs84=33.4,-146.6,-76.3,-0.359,-0.053,0.844,-0.84 +units=m +no_defs <> +# Pulkovo 1942(58) / 3-degree Gauss-Kruger zone 7 +<3331> +proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=7500000 +y_0=0 +ellps=krass +towgs84=33.4,-146.6,-76.3,-0.359,-0.053,0.844,-0.84 +units=m +no_defs <> +# Pulkovo 1942(58) / 3-degree Gauss-Kruger zone 8 +<3332> +proj=tmerc +lat_0=0 +lon_0=24 +k=1 +x_0=8500000 +y_0=0 +ellps=krass +towgs84=33.4,-146.6,-76.3,-0.359,-0.053,0.844,-0.84 +units=m +no_defs <> +# Pulkovo 1942(58) / Gauss-Kruger zone 3 +<3333> +proj=tmerc +lat_0=0 +lon_0=15 +k=1 +x_0=3500000 +y_0=0 +ellps=krass +towgs84=33.4,-146.6,-76.3,-0.359,-0.053,0.844,-0.84 +units=m +no_defs <> +# Pulkovo 1942(58) / Gauss-Kruger zone 4 +<3334> +proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=4500000 +y_0=0 +ellps=krass +towgs84=33.4,-146.6,-76.3,-0.359,-0.053,0.844,-0.84 +units=m +no_defs <> +# Pulkovo 1942(58) / Gauss-Kruger zone 5 +<3335> +proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=5500000 +y_0=0 +ellps=krass +towgs84=33.4,-146.6,-76.3,-0.359,-0.053,0.844,-0.84 +units=m +no_defs <> +# IGN 1962 Kerguelen / UTM zone 42S +<3336> +proj=utm +zone=42 +south +ellps=intl +towgs84=145,-187,103,0,0,0,0 +units=m +no_defs <> +# Le Pouce 1934 / Mauritius Grid +<3337> +proj=lcc +lat_1=-20.19506944444445 +lat_0=-20.19506944444445 +lon_0=57.52182777777778 +k_0=1 +x_0=1000000 +y_0=1000000 +ellps=clrk80 +towgs84=-770.1,158.4,-498.2,0,0,0,0 +units=m +no_defs <> +# NAD83 / Alaska Albers +<3338> +proj=aea +lat_1=55 +lat_2=65 +lat_0=50 +lon_0=-154 +x_0=0 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# IGCB 1955 / Congo TM zone 12 +<3339> +proj=tmerc +lat_0=0 +lon_0=12 +k=0.9999 +x_0=500000 +y_0=10000000 +ellps=clrk80 +towgs84=-79.9,-158,-168.9,0,0,0,0 +units=m +no_defs <> +# IGCB 1955 / Congo TM zone 14 +<3340> +proj=tmerc +lat_0=0 +lon_0=14 +k=0.9999 +x_0=500000 +y_0=10000000 +ellps=clrk80 +towgs84=-79.9,-158,-168.9,0,0,0,0 +units=m +no_defs <> +# IGCB 1955 / Congo TM zone 16 +<3341> +proj=tmerc +lat_0=0 +lon_0=16 +k=0.9999 +x_0=500000 +y_0=10000000 +ellps=clrk80 +towgs84=-79.9,-158,-168.9,0,0,0,0 +units=m +no_defs <> +# IGCB 1955 / UTM zone 33S +<3342> +proj=utm +zone=33 +south +ellps=clrk80 +towgs84=-79.9,-158,-168.9,0,0,0,0 +units=m +no_defs <> +# Mauritania 1999 / UTM zone 28N +<3343> +proj=utm +zone=28 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Mauritania 1999 / UTM zone 29N +<3344> +proj=utm +zone=29 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Mauritania 1999 / UTM zone 30N +<3345> +proj=utm +zone=30 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# LKS94 / Lithuania TM +<3346> +proj=tmerc +lat_0=0 +lon_0=24 +k=0.9998 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83 / Statistics Canada Lambert +<3347> +proj=lcc +lat_1=49 +lat_2=77 +lat_0=63.390675 +lon_0=-91.86666666666666 +x_0=6200000 +y_0=3000000 +datum=NAD83 +units=m +no_defs <> +# NAD83(CSRS) / Statistics Canada Lambert +<3348> +proj=lcc +lat_1=49 +lat_2=77 +lat_0=63.390675 +lon_0=-91.86666666666666 +x_0=6200000 +y_0=3000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# WGS 84 / PDC Mercator (deprecated) +<3349> +proj=merc +lon_0=-150 +k=1 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# Pulkovo 1942 / CS63 zone C0 +<3350> +proj=tmerc +lat_0=0.1 +lon_0=21.95 +k=1 +x_0=250000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / CS63 zone C1 +<3351> +proj=tmerc +lat_0=0.1 +lon_0=24.95 +k=1 +x_0=1250000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / CS63 zone C2 +<3352> +proj=tmerc +lat_0=0.1 +lon_0=27.95 +k=1 +x_0=2250000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Mhast (onshore) / UTM zone 32S +<3353> +proj=utm +zone=32 +south +ellps=intl +units=m +no_defs <> +# Mhast (offshore) / UTM zone 32S +<3354> +proj=utm +zone=32 +south +ellps=intl +units=m +no_defs <> +# Egypt Gulf of Suez S-650 TL / Red Belt +<3355> +proj=tmerc +lat_0=30 +lon_0=31 +k=1 +x_0=615000 +y_0=810000 +ellps=helmert +towgs84=-146.21,112.63,4.05,0,0,0,0 +units=m +no_defs <> +# Grand Cayman 1959 / UTM zone 17N (deprecated) +<3356> +proj=utm +zone=17 +ellps=clrk66 +towgs84=-179.483,-69.379,-27.584,-7.862,8.163,6.042,-13.925 +units=m +no_defs <> +# Little Cayman 1961 / UTM zone 17N (deprecated) +<3357> +proj=utm +zone=17 +ellps=clrk66 +towgs84=8.853,-52.644,180.304,-0.393,-2.323,2.96,-24.081 +units=m +no_defs <> +# NAD83(HARN) / North Carolina +<3358> +proj=lcc +lat_1=36.16666666666666 +lat_2=34.33333333333334 +lat_0=33.75 +lon_0=-79 +x_0=609601.22 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / North Carolina (ftUS) (deprecated) +<3359> +proj=lcc +lat_1=36.16666666666666 +lat_2=34.33333333333334 +lat_0=33.75 +lon_0=-79 +x_0=609601.2192024385 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=ft +no_defs <> +# NAD83(HARN) / South Carolina +<3360> +proj=lcc +lat_1=34.83333333333334 +lat_2=32.5 +lat_0=31.83333333333333 +lon_0=-81 +x_0=609600 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / South Carolina (ft) +<3361> +proj=lcc +lat_1=34.83333333333334 +lat_2=32.5 +lat_0=31.83333333333333 +lon_0=-81 +x_0=609600 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=ft +no_defs <> +# NAD83(HARN) / Pennsylvania North +<3362> +proj=lcc +lat_1=41.95 +lat_2=40.88333333333333 +lat_0=40.16666666666666 +lon_0=-77.75 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Pennsylvania North (ftUS) +<3363> +proj=lcc +lat_1=41.95 +lat_2=40.88333333333333 +lat_0=40.16666666666666 +lon_0=-77.75 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(HARN) / Pennsylvania South +<3364> +proj=lcc +lat_1=40.96666666666667 +lat_2=39.93333333333333 +lat_0=39.33333333333334 +lon_0=-77.75 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Pennsylvania South (ftUS) +<3365> +proj=lcc +lat_1=40.96666666666667 +lat_2=39.93333333333333 +lat_0=39.33333333333334 +lon_0=-77.75 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# Hong Kong 1963 Grid System (deprecated) +<3366> +proj=cass +lat_0=22.31213333333334 +lon_0=114.1785555555556 +x_0=40243.57775604237 +y_0=19069.93351512578 +a=6378293.645208759 +b=6356617.987679838 +units=m +no_defs <> +# IGN Astro 1960 / UTM zone 28N +<3367> +proj=utm +zone=28 +ellps=clrk80 +units=m +no_defs <> +# IGN Astro 1960 / UTM zone 29N +<3368> +proj=utm +zone=29 +ellps=clrk80 +units=m +no_defs <> +# IGN Astro 1960 / UTM zone 30N +<3369> +proj=utm +zone=30 +ellps=clrk80 +units=m +no_defs <> +# NAD27 / UTM zone 59N +<3370> +proj=utm +zone=59 +datum=NAD27 +units=m +no_defs <> +# NAD27 / UTM zone 60N +<3371> +proj=utm +zone=60 +datum=NAD27 +units=m +no_defs <> +# NAD83 / UTM zone 59N +<3372> +proj=utm +zone=59 +datum=NAD83 +units=m +no_defs <> +# NAD83 / UTM zone 60N +<3373> +proj=utm +zone=60 +datum=NAD83 +units=m +no_defs <> +# FD54 / UTM zone 29N +<3374> +proj=utm +zone=29 +ellps=intl +units=m +no_defs <> +# GDM2000 / Peninsula RSO +<3375> +proj=omerc +lat_0=4 +lonc=102.25 +alpha=323.0257964666666 +k=0.99984 +x_0=804671 +y_0=0 +no_uoff +gamma=323.1301023611111 +ellps=GRS80 +units=m +no_defs <> +# GDM2000 / East Malaysia BRSO +<3376> +proj=omerc +lat_0=4 +lonc=115 +alpha=53.31580995 +k=0.99984 +x_0=0 +y_0=0 +no_uoff +gamma=53.13010236111111 +ellps=GRS80 +units=m +no_defs <> +# GDM2000 / Johor Grid +<3377> +proj=cass +lat_0=2.121679744444445 +lon_0=103.4279362361111 +x_0=-14810.562 +y_0=8758.32 +ellps=GRS80 +units=m +no_defs <> +# GDM2000 / Sembilan and Melaka Grid +<3378> +proj=cass +lat_0=2.682347636111111 +lon_0=101.9749050416667 +x_0=3673.785 +y_0=-4240.573 +ellps=GRS80 +units=m +no_defs <> +# GDM2000 / Pahang Grid +<3379> +proj=cass +lat_0=3.769388088888889 +lon_0=102.3682989833333 +x_0=-7368.228 +y_0=6485.858 +ellps=GRS80 +units=m +no_defs <> +# GDM2000 / Selangor Grid +<3380> +proj=cass +lat_0=3.68464905 +lon_0=101.3891079138889 +x_0=-34836.161 +y_0=56464.049 +ellps=GRS80 +units=m +no_defs <> +# GDM2000 / Terengganu Grid +<3381> +proj=cass +lat_0=4.9762852 +lon_0=103.070275625 +x_0=19594.245 +y_0=3371.895 +ellps=GRS80 +units=m +no_defs <> +# GDM2000 / Pinang Grid +<3382> +proj=cass +lat_0=5.421517541666667 +lon_0=100.3443769638889 +x_0=-23.414 +y_0=62.283 +ellps=GRS80 +units=m +no_defs <> +# GDM2000 / Kedah and Perlis Grid +<3383> +proj=cass +lat_0=5.964672713888889 +lon_0=100.6363711111111 +x_0=0 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# GDM2000 / Perak Grid +<3384> +proj=cass +lat_0=4.859063022222222 +lon_0=100.8154105861111 +x_0=-1.769 +y_0=133454.779 +ellps=GRS80 +units=m +no_defs <> +# GDM2000 / Kelantan Grid +<3385> +proj=cass +lat_0=5.972543658333334 +lon_0=102.2952416694444 +x_0=13227.851 +y_0=8739.894 +ellps=GRS80 +units=m +no_defs <> +# KKJ / Finland zone 0 +<3386> +proj=tmerc +lat_0=0 +lon_0=18 +k=1 +x_0=500000 +y_0=0 +ellps=intl +towgs84=-96.062,-82.428,-121.753,4.801,0.345,-1.376,1.496 +units=m +no_defs <> +# KKJ / Finland zone 5 +<3387> +proj=tmerc +lat_0=0 +lon_0=33 +k=1 +x_0=5500000 +y_0=0 +ellps=intl +towgs84=-96.062,-82.428,-121.753,4.801,0.345,-1.376,1.496 +units=m +no_defs <> +# Pulkovo 1942 / Caspian Sea Mercator +<3388> +proj=merc +lon_0=51 +lat_ts=42 +x_0=0 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 60 +<3389> +proj=tmerc +lat_0=0 +lon_0=180 +k=1 +x_0=60500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 60 +<3390> +proj=tmerc +lat_0=0 +lon_0=180 +k=1 +x_0=60500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Karbala 1979 / UTM zone 37N +<3391> +proj=utm +zone=37 +ellps=clrk80 +towgs84=70.995,-335.916,262.898,0,0,0,0 +units=m +no_defs <> +# Karbala 1979 / UTM zone 38N +<3392> +proj=utm +zone=38 +ellps=clrk80 +towgs84=70.995,-335.916,262.898,0,0,0,0 +units=m +no_defs <> +# Karbala 1979 / UTM zone 39N +<3393> +proj=utm +zone=39 +ellps=clrk80 +towgs84=70.995,-335.916,262.898,0,0,0,0 +units=m +no_defs <> +# Nahrwan 1934 / Iraq zone +<3394> +proj=lcc +lat_1=32.5 +lat_0=32.5 +lon_0=45 +k_0=0.9987864078000001 +x_0=1500000 +y_0=1166200 +ellps=clrk80 +towgs84=-242.2,-144.9,370.3,0,0,0,0 +units=m +no_defs <> +# WGS 84 / World Mercator +<3395> +proj=merc +lon_0=0 +k=1 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# PD/83 / 3-degree Gauss-Kruger zone 3 +<3396> +proj=tmerc +lat_0=0 +lon_0=9 +k=1 +x_0=3500000 +y_0=0 +ellps=bessel +units=m +no_defs <> +# PD/83 / 3-degree Gauss-Kruger zone 4 +<3397> +proj=tmerc +lat_0=0 +lon_0=12 +k=1 +x_0=4500000 +y_0=0 +ellps=bessel +units=m +no_defs <> +# RD/83 / 3-degree Gauss-Kruger zone 4 +<3398> +proj=tmerc +lat_0=0 +lon_0=12 +k=1 +x_0=4500000 +y_0=0 +ellps=bessel +units=m +no_defs <> +# RD/83 / 3-degree Gauss-Kruger zone 5 +<3399> +proj=tmerc +lat_0=0 +lon_0=15 +k=1 +x_0=5500000 +y_0=0 +ellps=bessel +units=m +no_defs <> +# NAD83 / Alberta 10-TM (Forest) +<3400> +proj=tmerc +lat_0=0 +lon_0=-115 +k=0.9992 +x_0=500000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Alberta 10-TM (Resource) +<3401> +proj=tmerc +lat_0=0 +lon_0=-115 +k=0.9992 +x_0=0 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83(CSRS) / Alberta 10-TM (Forest) +<3402> +proj=tmerc +lat_0=0 +lon_0=-115 +k=0.9992 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS) / Alberta 10-TM (Resource) +<3403> +proj=tmerc +lat_0=0 +lon_0=-115 +k=0.9992 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / North Carolina (ftUS) +<3404> +proj=lcc +lat_1=36.16666666666666 +lat_2=34.33333333333334 +lat_0=33.75 +lon_0=-79 +x_0=609601.2192024384 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# VN-2000 / UTM zone 48N +<3405> +proj=utm +zone=48 +ellps=WGS84 +towgs84=-191.90441429,-39.30318279,-111.45032835,0.00928836,-0.01975479,0.00427372,0.252906278 +units=m +no_defs <> +# VN-2000 / UTM zone 49N +<3406> +proj=utm +zone=49 +ellps=WGS84 +towgs84=-191.90441429,-39.30318279,-111.45032835,0.00928836,-0.01975479,0.00427372,0.252906278 +units=m +no_defs <> +# Hong Kong 1963 Grid System +<3407> +proj=cass +lat_0=22.31213333333334 +lon_0=114.1785555555556 +x_0=40243.57775604237 +y_0=19069.93351512578 +a=6378293.645208759 +b=6356617.987679838 +to_meter=0.3047972654 +no_defs <> +# NSIDC EASE-Grid North +<3408> +proj=laea +lat_0=90 +lon_0=0 +x_0=0 +y_0=0 +a=6371228 +b=6371228 +units=m +no_defs <> +# NSIDC EASE-Grid South +<3409> +proj=laea +lat_0=-90 +lon_0=0 +x_0=0 +y_0=0 +a=6371228 +b=6371228 +units=m +no_defs <> +# NSIDC EASE-Grid Global +<3410> +proj=cea +lon_0=0 +lat_ts=30 +x_0=0 +y_0=0 +a=6371228 +b=6371228 +units=m +no_defs <> +# NSIDC Sea Ice Polar Stereographic North +<3411> +proj=stere +lat_0=90 +lat_ts=70 +lon_0=-45 +k=1 +x_0=0 +y_0=0 +a=6378273 +b=6356889.449 +units=m +no_defs <> +# NSIDC Sea Ice Polar Stereographic South +<3412> +proj=stere +lat_0=-90 +lat_ts=-70 +lon_0=0 +k=1 +x_0=0 +y_0=0 +a=6378273 +b=6356889.449 +units=m +no_defs <> +# WGS 84 / NSIDC Sea Ice Polar Stereographic North +<3413> +proj=stere +lat_0=90 +lat_ts=70 +lon_0=-45 +k=1 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# SVY21 / Singapore TM +<3414> +proj=tmerc +lat_0=1.366666666666667 +lon_0=103.8333333333333 +k=1 +x_0=28001.642 +y_0=38744.572 +ellps=WGS84 +units=m +no_defs <> +# WGS 72BE / South China Sea Lambert +<3415> +proj=lcc +lat_1=18 +lat_2=24 +lat_0=21 +lon_0=114 +x_0=500000 +y_0=500000 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# ETRS89 / Austria Lambert +<3416> +proj=lcc +lat_1=49 +lat_2=46 +lat_0=47.5 +lon_0=13.33333333333333 +x_0=400000 +y_0=400000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83 / Iowa North (ftUS) +<3417> +proj=lcc +lat_1=43.26666666666667 +lat_2=42.06666666666667 +lat_0=41.5 +lon_0=-93.5 +x_0=1500000 +y_0=999999.9999898402 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / Iowa South (ftUS) +<3418> +proj=lcc +lat_1=41.78333333333333 +lat_2=40.61666666666667 +lat_0=40 +lon_0=-93.5 +x_0=500000.00001016 +y_0=0 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / Kansas North (ftUS) +<3419> +proj=lcc +lat_1=39.78333333333333 +lat_2=38.71666666666667 +lat_0=38.33333333333334 +lon_0=-98 +x_0=399999.99998984 +y_0=0 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / Kansas South (ftUS) +<3420> +proj=lcc +lat_1=38.56666666666667 +lat_2=37.26666666666667 +lat_0=36.66666666666666 +lon_0=-98.5 +x_0=399999.99998984 +y_0=399999.99998984 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / Nevada East (ftUS) +<3421> +proj=tmerc +lat_0=34.75 +lon_0=-115.5833333333333 +k=0.9999 +x_0=200000.00001016 +y_0=8000000.000010163 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / Nevada Central (ftUS) +<3422> +proj=tmerc +lat_0=34.75 +lon_0=-116.6666666666667 +k=0.9999 +x_0=500000.00001016 +y_0=6000000 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / Nevada West (ftUS) +<3423> +proj=tmerc +lat_0=34.75 +lon_0=-118.5833333333333 +k=0.9999 +x_0=800000.0000101599 +y_0=3999999.99998984 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / New Jersey (ftUS) +<3424> +proj=tmerc +lat_0=38.83333333333334 +lon_0=-74.5 +k=0.9999 +x_0=150000 +y_0=0 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83(HARN) / Iowa North (ftUS) +<3425> +proj=lcc +lat_1=43.26666666666667 +lat_2=42.06666666666667 +lat_0=41.5 +lon_0=-93.5 +x_0=1500000 +y_0=999999.9999898402 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(HARN) / Iowa South (ftUS) +<3426> +proj=lcc +lat_1=41.78333333333333 +lat_2=40.61666666666667 +lat_0=40 +lon_0=-93.5 +x_0=500000.00001016 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(HARN) / Kansas North (ftUS) +<3427> +proj=lcc +lat_1=39.78333333333333 +lat_2=38.71666666666667 +lat_0=38.33333333333334 +lon_0=-98 +x_0=399999.99998984 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(HARN) / Kansas South (ftUS) +<3428> +proj=lcc +lat_1=38.56666666666667 +lat_2=37.26666666666667 +lat_0=36.66666666666666 +lon_0=-98.5 +x_0=399999.99998984 +y_0=399999.99998984 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(HARN) / Nevada East (ftUS) +<3429> +proj=tmerc +lat_0=34.75 +lon_0=-115.5833333333333 +k=0.9999 +x_0=200000.00001016 +y_0=8000000.000010163 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(HARN) / Nevada Central (ftUS) +<3430> +proj=tmerc +lat_0=34.75 +lon_0=-116.6666666666667 +k=0.9999 +x_0=500000.00001016 +y_0=6000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(HARN) / Nevada West (ftUS) +<3431> +proj=tmerc +lat_0=34.75 +lon_0=-118.5833333333333 +k=0.9999 +x_0=800000.0000101599 +y_0=3999999.99998984 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(HARN) / New Jersey (ftUS) +<3432> +proj=tmerc +lat_0=38.83333333333334 +lon_0=-74.5 +k=0.9999 +x_0=150000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83 / Arkansas North (ftUS) +<3433> +proj=lcc +lat_1=36.23333333333333 +lat_2=34.93333333333333 +lat_0=34.33333333333334 +lon_0=-92 +x_0=399999.99998984 +y_0=0 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / Arkansas South (ftUS) +<3434> +proj=lcc +lat_1=34.76666666666667 +lat_2=33.3 +lat_0=32.66666666666666 +lon_0=-92 +x_0=399999.99998984 +y_0=399999.99998984 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / Illinois East (ftUS) +<3435> +proj=tmerc +lat_0=36.66666666666666 +lon_0=-88.33333333333333 +k=0.9999749999999999 +x_0=300000.0000000001 +y_0=0 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / Illinois West (ftUS) +<3436> +proj=tmerc +lat_0=36.66666666666666 +lon_0=-90.16666666666667 +k=0.999941177 +x_0=699999.9999898402 +y_0=0 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / New Hampshire (ftUS) +<3437> +proj=tmerc +lat_0=42.5 +lon_0=-71.66666666666667 +k=0.999966667 +x_0=300000.0000000001 +y_0=0 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / Rhode Island (ftUS) +<3438> +proj=tmerc +lat_0=41.08333333333334 +lon_0=-71.5 +k=0.99999375 +x_0=99999.99998983997 +y_0=0 +datum=NAD83 +units=us-ft +no_defs <> +# PSD93 / UTM zone 39N +<3439> +proj=utm +zone=39 +ellps=clrk80 +towgs84=-180.624,-225.516,173.919,-0.81,-1.898,8.336,16.71006 +units=m +no_defs <> +# PSD93 / UTM zone 40N +<3440> +proj=utm +zone=40 +ellps=clrk80 +towgs84=-180.624,-225.516,173.919,-0.81,-1.898,8.336,16.71006 +units=m +no_defs <> +# NAD83(HARN) / Arkansas North (ftUS) +<3441> +proj=lcc +lat_1=36.23333333333333 +lat_2=34.93333333333333 +lat_0=34.33333333333334 +lon_0=-92 +x_0=399999.99998984 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(HARN) / Arkansas South (ftUS) +<3442> +proj=lcc +lat_1=34.76666666666667 +lat_2=33.3 +lat_0=32.66666666666666 +lon_0=-92 +x_0=399999.99998984 +y_0=399999.99998984 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(HARN) / Illinois East (ftUS) +<3443> +proj=tmerc +lat_0=36.66666666666666 +lon_0=-88.33333333333333 +k=0.9999749999999999 +x_0=300000.0000000001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(HARN) / Illinois West (ftUS) +<3444> +proj=tmerc +lat_0=36.66666666666666 +lon_0=-90.16666666666667 +k=0.999941177 +x_0=699999.9999898402 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(HARN) / New Hampshire (ftUS) +<3445> +proj=tmerc +lat_0=42.5 +lon_0=-71.66666666666667 +k=0.999966667 +x_0=300000.0000000001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(HARN) / Rhode Island (ftUS) +<3446> +proj=tmerc +lat_0=41.08333333333334 +lon_0=-71.5 +k=0.99999375 +x_0=99999.99998983997 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# ETRS89 / Belgian Lambert 2005 +<3447> +proj=lcc +lat_1=49.83333333333334 +lat_2=51.16666666666666 +lat_0=50.797815 +lon_0=4.359215833333333 +x_0=150328 +y_0=166262 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# JAD2001 / Jamaica Metric Grid +<3448> +proj=lcc +lat_1=18 +lat_0=18 +lon_0=-77 +k_0=1 +x_0=750000 +y_0=650000 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# JAD2001 / UTM zone 17N +<3449> +proj=utm +zone=17 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# JAD2001 / UTM zone 18N +<3450> +proj=utm +zone=18 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83 / Louisiana North (ftUS) +<3451> +proj=lcc +lat_1=32.66666666666666 +lat_2=31.16666666666667 +lat_0=30.5 +lon_0=-92.5 +x_0=999999.9999898402 +y_0=0 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / Louisiana South (ftUS) +<3452> +proj=lcc +lat_1=30.7 +lat_2=29.3 +lat_0=28.5 +lon_0=-91.33333333333333 +x_0=999999.9999898402 +y_0=0 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / Louisiana Offshore (ftUS) +<3453> +proj=lcc +lat_1=27.83333333333333 +lat_2=26.16666666666667 +lat_0=25.5 +lon_0=-91.33333333333333 +x_0=999999.9999898402 +y_0=0 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / South Dakota North (ftUS) (deprecated) +<3454> +proj=lcc +lat_1=44.4 +lat_2=42.83333333333334 +lat_0=42.33333333333334 +lon_0=-100.3333333333333 +x_0=600000 +y_0=0 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / South Dakota South (ftUS) +<3455> +proj=lcc +lat_1=44.4 +lat_2=42.83333333333334 +lat_0=42.33333333333334 +lon_0=-100.3333333333333 +x_0=600000 +y_0=0 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83(HARN) / Louisiana North (ftUS) +<3456> +proj=lcc +lat_1=32.66666666666666 +lat_2=31.16666666666667 +lat_0=30.5 +lon_0=-92.5 +x_0=999999.9999898402 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(HARN) / Louisiana South (ftUS) +<3457> +proj=lcc +lat_1=30.7 +lat_2=29.3 +lat_0=28.5 +lon_0=-91.33333333333333 +x_0=999999.9999898402 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(HARN) / South Dakota North (ftUS) +<3458> +proj=lcc +lat_1=45.68333333333333 +lat_2=44.41666666666666 +lat_0=43.83333333333334 +lon_0=-100 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(HARN) / South Dakota South (ftUS) +<3459> +proj=lcc +lat_1=44.4 +lat_2=42.83333333333334 +lat_0=42.33333333333334 +lon_0=-100.3333333333333 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# Fiji 1986 / Fiji Map Grid +<3460> +proj=tmerc +lat_0=-17 +lon_0=178.75 +k=0.99985 +x_0=2000000 +y_0=4000000 +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# Dabola 1981 / UTM zone 28N +<3461> +proj=utm +zone=28 +a=6378249.2 +b=6356515 +towgs84=-83,37,124,0,0,0,0 +units=m +no_defs <> +# Dabola 1981 / UTM zone 29N +<3462> +proj=utm +zone=29 +a=6378249.2 +b=6356515 +towgs84=-83,37,124,0,0,0,0 +units=m +no_defs <> +# NAD83 / Maine CS2000 Central +<3463> +proj=tmerc +lat_0=43.5 +lon_0=-69.125 +k=0.99998 +x_0=500000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83(HARN) / Maine CS2000 Central +<3464> +proj=tmerc +lat_0=43.5 +lon_0=-69.125 +k=0.99998 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Alabama East +<3465> +proj=tmerc +lat_0=30.5 +lon_0=-85.83333333333333 +k=0.99996 +x_0=200000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Alabama West +<3466> +proj=tmerc +lat_0=30 +lon_0=-87.5 +k=0.999933333 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Alaska Albers +<3467> +proj=aea +lat_1=55 +lat_2=65 +lat_0=50 +lon_0=-154 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Alaska zone 1 +<3468> +proj=omerc +lat_0=57 +lonc=-133.6666666666667 +alpha=323.1301023611111 +k=0.9999 +x_0=5000000 +y_0=-5000000 +no_uoff +gamma=323.1301023611111 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Alaska zone 2 +<3469> +proj=tmerc +lat_0=54 +lon_0=-142 +k=0.9999 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Alaska zone 3 +<3470> +proj=tmerc +lat_0=54 +lon_0=-146 +k=0.9999 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Alaska zone 4 +<3471> +proj=tmerc +lat_0=54 +lon_0=-150 +k=0.9999 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Alaska zone 5 +<3472> +proj=tmerc +lat_0=54 +lon_0=-154 +k=0.9999 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Alaska zone 6 +<3473> +proj=tmerc +lat_0=54 +lon_0=-158 +k=0.9999 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Alaska zone 7 +<3474> +proj=tmerc +lat_0=54 +lon_0=-162 +k=0.9999 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Alaska zone 8 +<3475> +proj=tmerc +lat_0=54 +lon_0=-166 +k=0.9999 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Alaska zone 9 +<3476> +proj=tmerc +lat_0=54 +lon_0=-170 +k=0.9999 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Alaska zone 10 +<3477> +proj=lcc +lat_1=53.83333333333334 +lat_2=51.83333333333334 +lat_0=51 +lon_0=-176 +x_0=1000000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Arizona Central +<3478> +proj=tmerc +lat_0=31 +lon_0=-111.9166666666667 +k=0.9999 +x_0=213360 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Arizona Central (ft) +<3479> +proj=tmerc +lat_0=31 +lon_0=-111.9166666666667 +k=0.9999 +x_0=213360 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=ft +no_defs <> +# NAD83(NSRS2007) / Arizona East +<3480> +proj=tmerc +lat_0=31 +lon_0=-110.1666666666667 +k=0.9999 +x_0=213360 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Arizona East (ft) +<3481> +proj=tmerc +lat_0=31 +lon_0=-110.1666666666667 +k=0.9999 +x_0=213360 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=ft +no_defs <> +# NAD83(NSRS2007) / Arizona West +<3482> +proj=tmerc +lat_0=31 +lon_0=-113.75 +k=0.999933333 +x_0=213360 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Arizona West (ft) +<3483> +proj=tmerc +lat_0=31 +lon_0=-113.75 +k=0.999933333 +x_0=213360 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=ft +no_defs <> +# NAD83(NSRS2007) / Arkansas North +<3484> +proj=lcc +lat_1=36.23333333333333 +lat_2=34.93333333333333 +lat_0=34.33333333333334 +lon_0=-92 +x_0=400000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Arkansas North (ftUS) +<3485> +proj=lcc +lat_1=36.23333333333333 +lat_2=34.93333333333333 +lat_0=34.33333333333334 +lon_0=-92 +x_0=399999.99998984 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / Arkansas South +<3486> +proj=lcc +lat_1=34.76666666666667 +lat_2=33.3 +lat_0=32.66666666666666 +lon_0=-92 +x_0=400000 +y_0=400000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Arkansas South (ftUS) +<3487> +proj=lcc +lat_1=34.76666666666667 +lat_2=33.3 +lat_0=32.66666666666666 +lon_0=-92 +x_0=399999.99998984 +y_0=399999.99998984 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / California Albers +<3488> +proj=aea +lat_1=34 +lat_2=40.5 +lat_0=0 +lon_0=-120 +x_0=0 +y_0=-4000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / California zone 1 +<3489> +proj=lcc +lat_1=41.66666666666666 +lat_2=40 +lat_0=39.33333333333334 +lon_0=-122 +x_0=2000000 +y_0=500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / California zone 1 (ftUS) +<3490> +proj=lcc +lat_1=41.66666666666666 +lat_2=40 +lat_0=39.33333333333334 +lon_0=-122 +x_0=2000000.0001016 +y_0=500000.0001016001 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / California zone 2 +<3491> +proj=lcc +lat_1=39.83333333333334 +lat_2=38.33333333333334 +lat_0=37.66666666666666 +lon_0=-122 +x_0=2000000 +y_0=500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / California zone 2 (ftUS) +<3492> +proj=lcc +lat_1=39.83333333333334 +lat_2=38.33333333333334 +lat_0=37.66666666666666 +lon_0=-122 +x_0=2000000.0001016 +y_0=500000.0001016001 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / California zone 3 +<3493> +proj=lcc +lat_1=38.43333333333333 +lat_2=37.06666666666667 +lat_0=36.5 +lon_0=-120.5 +x_0=2000000 +y_0=500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / California zone 3 (ftUS) +<3494> +proj=lcc +lat_1=38.43333333333333 +lat_2=37.06666666666667 +lat_0=36.5 +lon_0=-120.5 +x_0=2000000.0001016 +y_0=500000.0001016001 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / California zone 4 +<3495> +proj=lcc +lat_1=37.25 +lat_2=36 +lat_0=35.33333333333334 +lon_0=-119 +x_0=2000000 +y_0=500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / California zone 4 (ftUS) +<3496> +proj=lcc +lat_1=37.25 +lat_2=36 +lat_0=35.33333333333334 +lon_0=-119 +x_0=2000000.0001016 +y_0=500000.0001016001 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / California zone 5 +<3497> +proj=lcc +lat_1=35.46666666666667 +lat_2=34.03333333333333 +lat_0=33.5 +lon_0=-118 +x_0=2000000 +y_0=500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / California zone 5 (ftUS) +<3498> +proj=lcc +lat_1=35.46666666666667 +lat_2=34.03333333333333 +lat_0=33.5 +lon_0=-118 +x_0=2000000.0001016 +y_0=500000.0001016001 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / California zone 6 +<3499> +proj=lcc +lat_1=33.88333333333333 +lat_2=32.78333333333333 +lat_0=32.16666666666666 +lon_0=-116.25 +x_0=2000000 +y_0=500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / California zone 6 (ftUS) +<3500> +proj=lcc +lat_1=33.88333333333333 +lat_2=32.78333333333333 +lat_0=32.16666666666666 +lon_0=-116.25 +x_0=2000000.0001016 +y_0=500000.0001016001 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / Colorado Central +<3501> +proj=lcc +lat_1=39.75 +lat_2=38.45 +lat_0=37.83333333333334 +lon_0=-105.5 +x_0=914401.8289 +y_0=304800.6096 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Colorado Central (ftUS) +<3502> +proj=lcc +lat_1=39.75 +lat_2=38.45 +lat_0=37.83333333333334 +lon_0=-105.5 +x_0=914401.8288036576 +y_0=304800.6096012192 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / Colorado North +<3503> +proj=lcc +lat_1=40.78333333333333 +lat_2=39.71666666666667 +lat_0=39.33333333333334 +lon_0=-105.5 +x_0=914401.8289 +y_0=304800.6096 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Colorado North (ftUS) +<3504> +proj=lcc +lat_1=40.78333333333333 +lat_2=39.71666666666667 +lat_0=39.33333333333334 +lon_0=-105.5 +x_0=914401.8288036576 +y_0=304800.6096012192 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / Colorado South +<3505> +proj=lcc +lat_1=38.43333333333333 +lat_2=37.23333333333333 +lat_0=36.66666666666666 +lon_0=-105.5 +x_0=914401.8289 +y_0=304800.6096 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Colorado South (ftUS) +<3506> +proj=lcc +lat_1=38.43333333333333 +lat_2=37.23333333333333 +lat_0=36.66666666666666 +lon_0=-105.5 +x_0=914401.8288036576 +y_0=304800.6096012192 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / Connecticut +<3507> +proj=lcc +lat_1=41.86666666666667 +lat_2=41.2 +lat_0=40.83333333333334 +lon_0=-72.75 +x_0=304800.6096 +y_0=152400.3048 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Connecticut (ftUS) +<3508> +proj=lcc +lat_1=41.86666666666667 +lat_2=41.2 +lat_0=40.83333333333334 +lon_0=-72.75 +x_0=304800.6096012192 +y_0=152400.3048006096 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / Delaware +<3509> +proj=tmerc +lat_0=38 +lon_0=-75.41666666666667 +k=0.999995 +x_0=200000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Delaware (ftUS) +<3510> +proj=tmerc +lat_0=38 +lon_0=-75.41666666666667 +k=0.999995 +x_0=200000.0001016002 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / Florida East +<3511> +proj=tmerc +lat_0=24.33333333333333 +lon_0=-81 +k=0.999941177 +x_0=200000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Florida East (ftUS) +<3512> +proj=tmerc +lat_0=24.33333333333333 +lon_0=-81 +k=0.999941177 +x_0=200000.0001016002 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / Florida GDL Albers +<3513> +proj=aea +lat_1=24 +lat_2=31.5 +lat_0=24 +lon_0=-84 +x_0=400000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Florida North +<3514> +proj=lcc +lat_1=30.75 +lat_2=29.58333333333333 +lat_0=29 +lon_0=-84.5 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Florida North (ftUS) +<3515> +proj=lcc +lat_1=30.75 +lat_2=29.58333333333333 +lat_0=29 +lon_0=-84.5 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / Florida West +<3516> +proj=tmerc +lat_0=24.33333333333333 +lon_0=-82 +k=0.999941177 +x_0=200000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Florida West (ftUS) +<3517> +proj=tmerc +lat_0=24.33333333333333 +lon_0=-82 +k=0.999941177 +x_0=200000.0001016002 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / Georgia East +<3518> +proj=tmerc +lat_0=30 +lon_0=-82.16666666666667 +k=0.9999 +x_0=200000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Georgia East (ftUS) +<3519> +proj=tmerc +lat_0=30 +lon_0=-82.16666666666667 +k=0.9999 +x_0=200000.0001016002 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / Georgia West +<3520> +proj=tmerc +lat_0=30 +lon_0=-84.16666666666667 +k=0.9999 +x_0=700000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Georgia West (ftUS) +<3521> +proj=tmerc +lat_0=30 +lon_0=-84.16666666666667 +k=0.9999 +x_0=699999.9998983998 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / Idaho Central +<3522> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-114 +k=0.9999473679999999 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Idaho Central (ftUS) +<3523> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-114 +k=0.9999473679999999 +x_0=500000.0001016001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / Idaho East +<3524> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-112.1666666666667 +k=0.9999473679999999 +x_0=200000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Idaho East (ftUS) +<3525> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-112.1666666666667 +k=0.9999473679999999 +x_0=200000.0001016002 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / Idaho West +<3526> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-115.75 +k=0.999933333 +x_0=800000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Idaho West (ftUS) +<3527> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-115.75 +k=0.999933333 +x_0=800000.0001016001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / Illinois East +<3528> +proj=tmerc +lat_0=36.66666666666666 +lon_0=-88.33333333333333 +k=0.9999749999999999 +x_0=300000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Illinois East (ftUS) +<3529> +proj=tmerc +lat_0=36.66666666666666 +lon_0=-88.33333333333333 +k=0.9999749999999999 +x_0=300000.0000000001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / Illinois West +<3530> +proj=tmerc +lat_0=36.66666666666666 +lon_0=-90.16666666666667 +k=0.999941177 +x_0=700000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Illinois West (ftUS) +<3531> +proj=tmerc +lat_0=36.66666666666666 +lon_0=-90.16666666666667 +k=0.999941177 +x_0=699999.9999898402 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / Indiana East +<3532> +proj=tmerc +lat_0=37.5 +lon_0=-85.66666666666667 +k=0.999966667 +x_0=100000 +y_0=250000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Indiana East (ftUS) +<3533> +proj=tmerc +lat_0=37.5 +lon_0=-85.66666666666667 +k=0.999966667 +x_0=99999.99989839978 +y_0=249999.9998983998 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / Indiana West +<3534> +proj=tmerc +lat_0=37.5 +lon_0=-87.08333333333333 +k=0.999966667 +x_0=900000 +y_0=250000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Indiana West (ftUS) +<3535> +proj=tmerc +lat_0=37.5 +lon_0=-87.08333333333333 +k=0.999966667 +x_0=900000 +y_0=249999.9998983998 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / Iowa North +<3536> +proj=lcc +lat_1=43.26666666666667 +lat_2=42.06666666666667 +lat_0=41.5 +lon_0=-93.5 +x_0=1500000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Iowa North (ftUS) +<3537> +proj=lcc +lat_1=43.26666666666667 +lat_2=42.06666666666667 +lat_0=41.5 +lon_0=-93.5 +x_0=1500000 +y_0=999999.9999898402 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / Iowa South +<3538> +proj=lcc +lat_1=41.78333333333333 +lat_2=40.61666666666667 +lat_0=40 +lon_0=-93.5 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Iowa South (ftUS) +<3539> +proj=lcc +lat_1=41.78333333333333 +lat_2=40.61666666666667 +lat_0=40 +lon_0=-93.5 +x_0=500000.00001016 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / Kansas North +<3540> +proj=lcc +lat_1=39.78333333333333 +lat_2=38.71666666666667 +lat_0=38.33333333333334 +lon_0=-98 +x_0=400000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Kansas North (ftUS) +<3541> +proj=lcc +lat_1=39.78333333333333 +lat_2=38.71666666666667 +lat_0=38.33333333333334 +lon_0=-98 +x_0=399999.99998984 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / Kansas South +<3542> +proj=lcc +lat_1=38.56666666666667 +lat_2=37.26666666666667 +lat_0=36.66666666666666 +lon_0=-98.5 +x_0=400000 +y_0=400000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Kansas South (ftUS) +<3543> +proj=lcc +lat_1=38.56666666666667 +lat_2=37.26666666666667 +lat_0=36.66666666666666 +lon_0=-98.5 +x_0=399999.99998984 +y_0=399999.99998984 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / Kentucky North +<3544> +proj=lcc +lat_1=37.96666666666667 +lat_2=38.96666666666667 +lat_0=37.5 +lon_0=-84.25 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Kentucky North (ftUS) +<3545> +proj=lcc +lat_1=37.96666666666667 +lat_2=38.96666666666667 +lat_0=37.5 +lon_0=-84.25 +x_0=500000.0001016001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / Kentucky Single Zone +<3546> +proj=lcc +lat_1=37.08333333333334 +lat_2=38.66666666666666 +lat_0=36.33333333333334 +lon_0=-85.75 +x_0=1500000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Kentucky Single Zone (ftUS) +<3547> +proj=lcc +lat_1=37.08333333333334 +lat_2=38.66666666666666 +lat_0=36.33333333333334 +lon_0=-85.75 +x_0=1500000 +y_0=999999.9998983998 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / Kentucky South +<3548> +proj=lcc +lat_1=37.93333333333333 +lat_2=36.73333333333333 +lat_0=36.33333333333334 +lon_0=-85.75 +x_0=500000 +y_0=500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Kentucky South (ftUS) +<3549> +proj=lcc +lat_1=37.93333333333333 +lat_2=36.73333333333333 +lat_0=36.33333333333334 +lon_0=-85.75 +x_0=500000.0001016001 +y_0=500000.0001016001 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / Louisiana North +<3550> +proj=lcc +lat_1=32.66666666666666 +lat_2=31.16666666666667 +lat_0=30.5 +lon_0=-92.5 +x_0=1000000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Louisiana North (ftUS) +<3551> +proj=lcc +lat_1=32.66666666666666 +lat_2=31.16666666666667 +lat_0=30.5 +lon_0=-92.5 +x_0=999999.9999898402 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / Louisiana South +<3552> +proj=lcc +lat_1=30.7 +lat_2=29.3 +lat_0=28.5 +lon_0=-91.33333333333333 +x_0=1000000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Louisiana South (ftUS) +<3553> +proj=lcc +lat_1=30.7 +lat_2=29.3 +lat_0=28.5 +lon_0=-91.33333333333333 +x_0=999999.9999898402 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / Maine CS2000 Central +<3554> +proj=tmerc +lat_0=43.5 +lon_0=-69.125 +k=0.99998 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Maine CS2000 East +<3555> +proj=tmerc +lat_0=43.83333333333334 +lon_0=-67.875 +k=0.99998 +x_0=700000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Maine CS2000 West +<3556> +proj=tmerc +lat_0=42.83333333333334 +lon_0=-70.375 +k=0.99998 +x_0=300000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Maine East +<3557> +proj=tmerc +lat_0=43.66666666666666 +lon_0=-68.5 +k=0.9999 +x_0=300000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Maine West +<3558> +proj=tmerc +lat_0=42.83333333333334 +lon_0=-70.16666666666667 +k=0.999966667 +x_0=900000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Maryland +<3559> +proj=lcc +lat_1=39.45 +lat_2=38.3 +lat_0=37.66666666666666 +lon_0=-77 +x_0=400000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83 / Utah North (ftUS) +<3560> +proj=lcc +lat_1=41.78333333333333 +lat_2=40.71666666666667 +lat_0=40.33333333333334 +lon_0=-111.5 +x_0=500000.00001016 +y_0=999999.9999898402 +datum=NAD83 +units=us-ft +no_defs <> +# Old Hawaiian / Hawaii zone 1 +<3561> +proj=tmerc +lat_0=18.83333333333333 +lon_0=-155.5 +k=0.999966667 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +towgs84=61,-285,-181,0,0,0,0 +units=us-ft +no_defs <> +# Old Hawaiian / Hawaii zone 2 +<3562> +proj=tmerc +lat_0=20.33333333333333 +lon_0=-156.6666666666667 +k=0.999966667 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +towgs84=61,-285,-181,0,0,0,0 +units=us-ft +no_defs <> +# Old Hawaiian / Hawaii zone 3 +<3563> +proj=tmerc +lat_0=21.16666666666667 +lon_0=-158 +k=0.99999 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +towgs84=61,-285,-181,0,0,0,0 +units=us-ft +no_defs <> +# Old Hawaiian / Hawaii zone 4 +<3564> +proj=tmerc +lat_0=21.83333333333333 +lon_0=-159.5 +k=0.99999 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +towgs84=61,-285,-181,0,0,0,0 +units=us-ft +no_defs <> +# Old Hawaiian / Hawaii zone 5 +<3565> +proj=tmerc +lat_0=21.66666666666667 +lon_0=-160.1666666666667 +k=1 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +towgs84=61,-285,-181,0,0,0,0 +units=us-ft +no_defs <> +# NAD83 / Utah Central (ftUS) +<3566> +proj=lcc +lat_1=40.65 +lat_2=39.01666666666667 +lat_0=38.33333333333334 +lon_0=-111.5 +x_0=500000.00001016 +y_0=2000000.00001016 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / Utah South (ftUS) +<3567> +proj=lcc +lat_1=38.35 +lat_2=37.21666666666667 +lat_0=36.66666666666666 +lon_0=-111.5 +x_0=500000.00001016 +y_0=3000000 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83(HARN) / Utah North (ftUS) +<3568> +proj=lcc +lat_1=41.78333333333333 +lat_2=40.71666666666667 +lat_0=40.33333333333334 +lon_0=-111.5 +x_0=500000.00001016 +y_0=999999.9999898402 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(HARN) / Utah Central (ftUS) +<3569> +proj=lcc +lat_1=40.65 +lat_2=39.01666666666667 +lat_0=38.33333333333334 +lon_0=-111.5 +x_0=500000.00001016 +y_0=2000000.00001016 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(HARN) / Utah South (ftUS) +<3570> +proj=lcc +lat_1=38.35 +lat_2=37.21666666666667 +lat_0=36.66666666666666 +lon_0=-111.5 +x_0=500000.00001016 +y_0=3000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# WGS 84 / North Pole LAEA Bering Sea +<3571> +proj=laea +lat_0=90 +lon_0=180 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / North Pole LAEA Alaska +<3572> +proj=laea +lat_0=90 +lon_0=-150 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / North Pole LAEA Canada +<3573> +proj=laea +lat_0=90 +lon_0=-100 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / North Pole LAEA Atlantic +<3574> +proj=laea +lat_0=90 +lon_0=-40 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / North Pole LAEA Europe +<3575> +proj=laea +lat_0=90 +lon_0=10 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / North Pole LAEA Russia +<3576> +proj=laea +lat_0=90 +lon_0=90 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# GDA94 / Australian Albers +<3577> +proj=aea +lat_1=-18 +lat_2=-36 +lat_0=0 +lon_0=132 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83 / Yukon Albers +<3578> +proj=aea +lat_1=61.66666666666666 +lat_2=68 +lat_0=59 +lon_0=-132.5 +x_0=500000 +y_0=500000 +datum=NAD83 +units=m +no_defs <> +# NAD83(CSRS) / Yukon Albers +<3579> +proj=aea +lat_1=61.66666666666666 +lat_2=68 +lat_0=59 +lon_0=-132.5 +x_0=500000 +y_0=500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83 / NWT Lambert +<3580> +proj=lcc +lat_1=62 +lat_2=70 +lat_0=0 +lon_0=-112 +x_0=0 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83(CSRS) / NWT Lambert +<3581> +proj=lcc +lat_1=62 +lat_2=70 +lat_0=0 +lon_0=-112 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Maryland (ftUS) +<3582> +proj=lcc +lat_1=39.45 +lat_2=38.3 +lat_0=37.66666666666666 +lon_0=-77 +x_0=399999.9998983998 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / Massachusetts Island +<3583> +proj=lcc +lat_1=41.48333333333333 +lat_2=41.28333333333333 +lat_0=41 +lon_0=-70.5 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Massachusetts Island (ftUS) +<3584> +proj=lcc +lat_1=41.48333333333333 +lat_2=41.28333333333333 +lat_0=41 +lon_0=-70.5 +x_0=500000.0001016001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / Massachusetts Mainland +<3585> +proj=lcc +lat_1=42.68333333333333 +lat_2=41.71666666666667 +lat_0=41 +lon_0=-71.5 +x_0=200000 +y_0=750000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Massachusetts Mainland (ftUS) +<3586> +proj=lcc +lat_1=42.68333333333333 +lat_2=41.71666666666667 +lat_0=41 +lon_0=-71.5 +x_0=200000.0001016002 +y_0=750000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / Michigan Central +<3587> +proj=lcc +lat_1=45.7 +lat_2=44.18333333333333 +lat_0=43.31666666666667 +lon_0=-84.36666666666666 +x_0=6000000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Michigan Central (ft) +<3588> +proj=lcc +lat_1=45.7 +lat_2=44.18333333333333 +lat_0=43.31666666666667 +lon_0=-84.36666666666666 +x_0=5999999.999976001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=ft +no_defs <> +# NAD83(NSRS2007) / Michigan North +<3589> +proj=lcc +lat_1=47.08333333333334 +lat_2=45.48333333333333 +lat_0=44.78333333333333 +lon_0=-87 +x_0=8000000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Michigan North (ft) +<3590> +proj=lcc +lat_1=47.08333333333334 +lat_2=45.48333333333333 +lat_0=44.78333333333333 +lon_0=-87 +x_0=7999999.999968001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=ft +no_defs <> +# NAD83(NSRS2007) / Michigan Oblique Mercator +<3591> +proj=omerc +lat_0=45.30916666666666 +lonc=-86 +alpha=337.25556 +k=0.9996 +x_0=2546731.496 +y_0=-4354009.816 +no_uoff +gamma=337.25556 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Michigan South +<3592> +proj=lcc +lat_1=43.66666666666666 +lat_2=42.1 +lat_0=41.5 +lon_0=-84.36666666666666 +x_0=4000000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Michigan South (ft) +<3593> +proj=lcc +lat_1=43.66666666666666 +lat_2=42.1 +lat_0=41.5 +lon_0=-84.36666666666666 +x_0=3999999.999984 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=ft +no_defs <> +# NAD83(NSRS2007) / Minnesota Central +<3594> +proj=lcc +lat_1=47.05 +lat_2=45.61666666666667 +lat_0=45 +lon_0=-94.25 +x_0=800000 +y_0=100000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Minnesota North +<3595> +proj=lcc +lat_1=48.63333333333333 +lat_2=47.03333333333333 +lat_0=46.5 +lon_0=-93.09999999999999 +x_0=800000 +y_0=100000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Minnesota South +<3596> +proj=lcc +lat_1=45.21666666666667 +lat_2=43.78333333333333 +lat_0=43 +lon_0=-94 +x_0=800000 +y_0=100000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Mississippi East +<3597> +proj=tmerc +lat_0=29.5 +lon_0=-88.83333333333333 +k=0.99995 +x_0=300000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Mississippi East (ftUS) +<3598> +proj=tmerc +lat_0=29.5 +lon_0=-88.83333333333333 +k=0.99995 +x_0=300000.0000000001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / Mississippi West +<3599> +proj=tmerc +lat_0=29.5 +lon_0=-90.33333333333333 +k=0.99995 +x_0=700000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Mississippi West (ftUS) +<3600> +proj=tmerc +lat_0=29.5 +lon_0=-90.33333333333333 +k=0.99995 +x_0=699999.9998983998 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / Missouri Central +<3601> +proj=tmerc +lat_0=35.83333333333334 +lon_0=-92.5 +k=0.999933333 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Missouri East +<3602> +proj=tmerc +lat_0=35.83333333333334 +lon_0=-90.5 +k=0.999933333 +x_0=250000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Missouri West +<3603> +proj=tmerc +lat_0=36.16666666666666 +lon_0=-94.5 +k=0.999941177 +x_0=850000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Montana +<3604> +proj=lcc +lat_1=49 +lat_2=45 +lat_0=44.25 +lon_0=-109.5 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Montana (ft) +<3605> +proj=lcc +lat_1=49 +lat_2=45 +lat_0=44.25 +lon_0=-109.5 +x_0=599999.9999976 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=ft +no_defs <> +# NAD83(NSRS2007) / Nebraska +<3606> +proj=lcc +lat_1=43 +lat_2=40 +lat_0=39.83333333333334 +lon_0=-100 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Nevada Central +<3607> +proj=tmerc +lat_0=34.75 +lon_0=-116.6666666666667 +k=0.9999 +x_0=500000 +y_0=6000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Nevada Central (ftUS) +<3608> +proj=tmerc +lat_0=34.75 +lon_0=-116.6666666666667 +k=0.9999 +x_0=500000.00001016 +y_0=6000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / Nevada East +<3609> +proj=tmerc +lat_0=34.75 +lon_0=-115.5833333333333 +k=0.9999 +x_0=200000 +y_0=8000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Nevada East (ftUS) +<3610> +proj=tmerc +lat_0=34.75 +lon_0=-115.5833333333333 +k=0.9999 +x_0=200000.00001016 +y_0=8000000.000010163 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / Nevada West +<3611> +proj=tmerc +lat_0=34.75 +lon_0=-118.5833333333333 +k=0.9999 +x_0=800000 +y_0=4000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Nevada West (ftUS) +<3612> +proj=tmerc +lat_0=34.75 +lon_0=-118.5833333333333 +k=0.9999 +x_0=800000.0000101599 +y_0=3999999.99998984 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / New Hampshire +<3613> +proj=tmerc +lat_0=42.5 +lon_0=-71.66666666666667 +k=0.999966667 +x_0=300000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / New Hampshire (ftUS) +<3614> +proj=tmerc +lat_0=42.5 +lon_0=-71.66666666666667 +k=0.999966667 +x_0=300000.0000000001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / New Jersey +<3615> +proj=tmerc +lat_0=38.83333333333334 +lon_0=-74.5 +k=0.9999 +x_0=150000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / New Jersey (ftUS) +<3616> +proj=tmerc +lat_0=38.83333333333334 +lon_0=-74.5 +k=0.9999 +x_0=150000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / New Mexico Central +<3617> +proj=tmerc +lat_0=31 +lon_0=-106.25 +k=0.9999 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / New Mexico Central (ftUS) +<3618> +proj=tmerc +lat_0=31 +lon_0=-106.25 +k=0.9999 +x_0=500000.0001016001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / New Mexico East +<3619> +proj=tmerc +lat_0=31 +lon_0=-104.3333333333333 +k=0.999909091 +x_0=165000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / New Mexico East (ftUS) +<3620> +proj=tmerc +lat_0=31 +lon_0=-104.3333333333333 +k=0.999909091 +x_0=165000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / New Mexico West +<3621> +proj=tmerc +lat_0=31 +lon_0=-107.8333333333333 +k=0.999916667 +x_0=830000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / New Mexico West (ftUS) +<3622> +proj=tmerc +lat_0=31 +lon_0=-107.8333333333333 +k=0.999916667 +x_0=830000.0001016001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / New York Central +<3623> +proj=tmerc +lat_0=40 +lon_0=-76.58333333333333 +k=0.9999375 +x_0=250000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / New York Central (ftUS) +<3624> +proj=tmerc +lat_0=40 +lon_0=-76.58333333333333 +k=0.9999375 +x_0=249999.9998983998 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / New York East +<3625> +proj=tmerc +lat_0=38.83333333333334 +lon_0=-74.5 +k=0.9999 +x_0=150000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / New York East (ftUS) +<3626> +proj=tmerc +lat_0=38.83333333333334 +lon_0=-74.5 +k=0.9999 +x_0=150000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / New York Long Island +<3627> +proj=lcc +lat_1=41.03333333333333 +lat_2=40.66666666666666 +lat_0=40.16666666666666 +lon_0=-74 +x_0=300000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / New York Long Island (ftUS) +<3628> +proj=lcc +lat_1=41.03333333333333 +lat_2=40.66666666666666 +lat_0=40.16666666666666 +lon_0=-74 +x_0=300000.0000000001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / New York West +<3629> +proj=tmerc +lat_0=40 +lon_0=-78.58333333333333 +k=0.9999375 +x_0=350000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / New York West (ftUS) +<3630> +proj=tmerc +lat_0=40 +lon_0=-78.58333333333333 +k=0.9999375 +x_0=350000.0001016001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / North Carolina +<3631> +proj=lcc +lat_1=36.16666666666666 +lat_2=34.33333333333334 +lat_0=33.75 +lon_0=-79 +x_0=609601.22 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / North Carolina (ftUS) +<3632> +proj=lcc +lat_1=36.16666666666666 +lat_2=34.33333333333334 +lat_0=33.75 +lon_0=-79 +x_0=609601.2192024384 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / North Dakota North +<3633> +proj=lcc +lat_1=48.73333333333333 +lat_2=47.43333333333333 +lat_0=47 +lon_0=-100.5 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / North Dakota North (ft) +<3634> +proj=lcc +lat_1=48.73333333333333 +lat_2=47.43333333333333 +lat_0=47 +lon_0=-100.5 +x_0=599999.9999976 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=ft +no_defs <> +# NAD83(NSRS2007) / North Dakota South +<3635> +proj=lcc +lat_1=47.48333333333333 +lat_2=46.18333333333333 +lat_0=45.66666666666666 +lon_0=-100.5 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / North Dakota South (ft) +<3636> +proj=lcc +lat_1=47.48333333333333 +lat_2=46.18333333333333 +lat_0=45.66666666666666 +lon_0=-100.5 +x_0=599999.9999976 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=ft +no_defs <> +# NAD83(NSRS2007) / Ohio North +<3637> +proj=lcc +lat_1=41.7 +lat_2=40.43333333333333 +lat_0=39.66666666666666 +lon_0=-82.5 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Ohio South +<3638> +proj=lcc +lat_1=40.03333333333333 +lat_2=38.73333333333333 +lat_0=38 +lon_0=-82.5 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Oklahoma North +<3639> +proj=lcc +lat_1=36.76666666666667 +lat_2=35.56666666666667 +lat_0=35 +lon_0=-98 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Oklahoma North (ftUS) +<3640> +proj=lcc +lat_1=36.76666666666667 +lat_2=35.56666666666667 +lat_0=35 +lon_0=-98 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / Oklahoma South +<3641> +proj=lcc +lat_1=35.23333333333333 +lat_2=33.93333333333333 +lat_0=33.33333333333334 +lon_0=-98 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Oklahoma South (ftUS) +<3642> +proj=lcc +lat_1=35.23333333333333 +lat_2=33.93333333333333 +lat_0=33.33333333333334 +lon_0=-98 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / Oregon LCC (m) +<3643> +proj=lcc +lat_1=43 +lat_2=45.5 +lat_0=41.75 +lon_0=-120.5 +x_0=400000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Oregon GIC Lambert (ft) +<3644> +proj=lcc +lat_1=43 +lat_2=45.5 +lat_0=41.75 +lon_0=-120.5 +x_0=399999.9999984 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=ft +no_defs <> +# NAD83(NSRS2007) / Oregon North +<3645> +proj=lcc +lat_1=46 +lat_2=44.33333333333334 +lat_0=43.66666666666666 +lon_0=-120.5 +x_0=2500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Oregon North (ft) +<3646> +proj=lcc +lat_1=46 +lat_2=44.33333333333334 +lat_0=43.66666666666666 +lon_0=-120.5 +x_0=2500000.0001424 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=ft +no_defs <> +# NAD83(NSRS2007) / Oregon South +<3647> +proj=lcc +lat_1=44 +lat_2=42.33333333333334 +lat_0=41.66666666666666 +lon_0=-120.5 +x_0=1500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Oregon South (ft) +<3648> +proj=lcc +lat_1=44 +lat_2=42.33333333333334 +lat_0=41.66666666666666 +lon_0=-120.5 +x_0=1500000.0001464 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=ft +no_defs <> +# NAD83(NSRS2007) / Pennsylvania North +<3649> +proj=lcc +lat_1=41.95 +lat_2=40.88333333333333 +lat_0=40.16666666666666 +lon_0=-77.75 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Pennsylvania North (ftUS) +<3650> +proj=lcc +lat_1=41.95 +lat_2=40.88333333333333 +lat_0=40.16666666666666 +lon_0=-77.75 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / Pennsylvania South +<3651> +proj=lcc +lat_1=40.96666666666667 +lat_2=39.93333333333333 +lat_0=39.33333333333334 +lon_0=-77.75 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Pennsylvania South (ftUS) +<3652> +proj=lcc +lat_1=40.96666666666667 +lat_2=39.93333333333333 +lat_0=39.33333333333334 +lon_0=-77.75 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / Rhode Island +<3653> +proj=tmerc +lat_0=41.08333333333334 +lon_0=-71.5 +k=0.99999375 +x_0=100000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Rhode Island (ftUS) +<3654> +proj=tmerc +lat_0=41.08333333333334 +lon_0=-71.5 +k=0.99999375 +x_0=99999.99998983997 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / South Carolina +<3655> +proj=lcc +lat_1=34.83333333333334 +lat_2=32.5 +lat_0=31.83333333333333 +lon_0=-81 +x_0=609600 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / South Carolina (ft) +<3656> +proj=lcc +lat_1=34.83333333333334 +lat_2=32.5 +lat_0=31.83333333333333 +lon_0=-81 +x_0=609600 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=ft +no_defs <> +# NAD83(NSRS2007) / South Dakota North +<3657> +proj=lcc +lat_1=45.68333333333333 +lat_2=44.41666666666666 +lat_0=43.83333333333334 +lon_0=-100 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / South Dakota North (ftUS) +<3658> +proj=lcc +lat_1=45.68333333333333 +lat_2=44.41666666666666 +lat_0=43.83333333333334 +lon_0=-100 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / South Dakota South +<3659> +proj=lcc +lat_1=44.4 +lat_2=42.83333333333334 +lat_0=42.33333333333334 +lon_0=-100.3333333333333 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / South Dakota South (ftUS) +<3660> +proj=lcc +lat_1=44.4 +lat_2=42.83333333333334 +lat_0=42.33333333333334 +lon_0=-100.3333333333333 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / Tennessee +<3661> +proj=lcc +lat_1=36.41666666666666 +lat_2=35.25 +lat_0=34.33333333333334 +lon_0=-86 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Tennessee (ftUS) +<3662> +proj=lcc +lat_1=36.41666666666666 +lat_2=35.25 +lat_0=34.33333333333334 +lon_0=-86 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / Texas Central +<3663> +proj=lcc +lat_1=31.88333333333333 +lat_2=30.11666666666667 +lat_0=29.66666666666667 +lon_0=-100.3333333333333 +x_0=700000 +y_0=3000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Texas Central (ftUS) +<3664> +proj=lcc +lat_1=31.88333333333333 +lat_2=30.11666666666667 +lat_0=29.66666666666667 +lon_0=-100.3333333333333 +x_0=699999.9998983998 +y_0=3000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / Texas Centric Albers Equal Area +<3665> +proj=aea +lat_1=27.5 +lat_2=35 +lat_0=18 +lon_0=-100 +x_0=1500000 +y_0=6000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Texas Centric Lambert Conformal +<3666> +proj=lcc +lat_1=27.5 +lat_2=35 +lat_0=18 +lon_0=-100 +x_0=1500000 +y_0=5000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Texas North +<3667> +proj=lcc +lat_1=36.18333333333333 +lat_2=34.65 +lat_0=34 +lon_0=-101.5 +x_0=200000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Texas North (ftUS) +<3668> +proj=lcc +lat_1=36.18333333333333 +lat_2=34.65 +lat_0=34 +lon_0=-101.5 +x_0=200000.0001016002 +y_0=999999.9998983998 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / Texas North Central +<3669> +proj=lcc +lat_1=33.96666666666667 +lat_2=32.13333333333333 +lat_0=31.66666666666667 +lon_0=-98.5 +x_0=600000 +y_0=2000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Texas North Central (ftUS) +<3670> +proj=lcc +lat_1=33.96666666666667 +lat_2=32.13333333333333 +lat_0=31.66666666666667 +lon_0=-98.5 +x_0=600000 +y_0=2000000.0001016 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / Texas South +<3671> +proj=lcc +lat_1=27.83333333333333 +lat_2=26.16666666666667 +lat_0=25.66666666666667 +lon_0=-98.5 +x_0=300000 +y_0=5000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Texas South (ftUS) +<3672> +proj=lcc +lat_1=27.83333333333333 +lat_2=26.16666666666667 +lat_0=25.66666666666667 +lon_0=-98.5 +x_0=300000.0000000001 +y_0=5000000.0001016 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / Texas South Central +<3673> +proj=lcc +lat_1=30.28333333333333 +lat_2=28.38333333333333 +lat_0=27.83333333333333 +lon_0=-99 +x_0=600000 +y_0=4000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Texas South Central (ftUS) +<3674> +proj=lcc +lat_1=30.28333333333333 +lat_2=28.38333333333333 +lat_0=27.83333333333333 +lon_0=-99 +x_0=600000 +y_0=3999999.9998984 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / Utah Central +<3675> +proj=lcc +lat_1=40.65 +lat_2=39.01666666666667 +lat_0=38.33333333333334 +lon_0=-111.5 +x_0=500000 +y_0=2000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Utah Central (ft) +<3676> +proj=lcc +lat_1=40.65 +lat_2=39.01666666666667 +lat_0=38.33333333333334 +lon_0=-111.5 +x_0=500000.0001504 +y_0=1999999.999992 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=ft +no_defs <> +# NAD83(NSRS2007) / Utah Central (ftUS) +<3677> +proj=lcc +lat_1=40.65 +lat_2=39.01666666666667 +lat_0=38.33333333333334 +lon_0=-111.5 +x_0=500000.00001016 +y_0=2000000.00001016 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / Utah North +<3678> +proj=lcc +lat_1=41.78333333333333 +lat_2=40.71666666666667 +lat_0=40.33333333333334 +lon_0=-111.5 +x_0=500000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Utah North (ft) +<3679> +proj=lcc +lat_1=41.78333333333333 +lat_2=40.71666666666667 +lat_0=40.33333333333334 +lon_0=-111.5 +x_0=500000.0001504 +y_0=999999.9999960001 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=ft +no_defs <> +# NAD83(NSRS2007) / Utah North (ftUS) +<3680> +proj=lcc +lat_1=41.78333333333333 +lat_2=40.71666666666667 +lat_0=40.33333333333334 +lon_0=-111.5 +x_0=500000.00001016 +y_0=999999.9999898402 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / Utah South +<3681> +proj=lcc +lat_1=38.35 +lat_2=37.21666666666667 +lat_0=36.66666666666666 +lon_0=-111.5 +x_0=500000 +y_0=3000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Utah South (ft) +<3682> +proj=lcc +lat_1=38.35 +lat_2=37.21666666666667 +lat_0=36.66666666666666 +lon_0=-111.5 +x_0=500000.0001504 +y_0=2999999.999988 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=ft +no_defs <> +# NAD83(NSRS2007) / Utah South (ftUS) +<3683> +proj=lcc +lat_1=38.35 +lat_2=37.21666666666667 +lat_0=36.66666666666666 +lon_0=-111.5 +x_0=500000.00001016 +y_0=3000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / Vermont +<3684> +proj=tmerc +lat_0=42.5 +lon_0=-72.5 +k=0.999964286 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Virginia North +<3685> +proj=lcc +lat_1=39.2 +lat_2=38.03333333333333 +lat_0=37.66666666666666 +lon_0=-78.5 +x_0=3500000 +y_0=2000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Virginia North (ftUS) +<3686> +proj=lcc +lat_1=39.2 +lat_2=38.03333333333333 +lat_0=37.66666666666666 +lon_0=-78.5 +x_0=3500000.0001016 +y_0=2000000.0001016 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / Virginia South +<3687> +proj=lcc +lat_1=37.96666666666667 +lat_2=36.76666666666667 +lat_0=36.33333333333334 +lon_0=-78.5 +x_0=3500000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Virginia South (ftUS) +<3688> +proj=lcc +lat_1=37.96666666666667 +lat_2=36.76666666666667 +lat_0=36.33333333333334 +lon_0=-78.5 +x_0=3500000.0001016 +y_0=999999.9998983998 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / Washington North +<3689> +proj=lcc +lat_1=48.73333333333333 +lat_2=47.5 +lat_0=47 +lon_0=-120.8333333333333 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Washington North (ftUS) +<3690> +proj=lcc +lat_1=48.73333333333333 +lat_2=47.5 +lat_0=47 +lon_0=-120.8333333333333 +x_0=500000.0001016001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / Washington South +<3691> +proj=lcc +lat_1=47.33333333333334 +lat_2=45.83333333333334 +lat_0=45.33333333333334 +lon_0=-120.5 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Washington South (ftUS) +<3692> +proj=lcc +lat_1=47.33333333333334 +lat_2=45.83333333333334 +lat_0=45.33333333333334 +lon_0=-120.5 +x_0=500000.0001016001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / West Virginia North +<3693> +proj=lcc +lat_1=40.25 +lat_2=39 +lat_0=38.5 +lon_0=-79.5 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / West Virginia South +<3694> +proj=lcc +lat_1=38.88333333333333 +lat_2=37.48333333333333 +lat_0=37 +lon_0=-81 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Wisconsin Central +<3695> +proj=lcc +lat_1=45.5 +lat_2=44.25 +lat_0=43.83333333333334 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Wisconsin Central (ftUS) +<3696> +proj=lcc +lat_1=45.5 +lat_2=44.25 +lat_0=43.83333333333334 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / Wisconsin North +<3697> +proj=lcc +lat_1=46.76666666666667 +lat_2=45.56666666666667 +lat_0=45.16666666666666 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Wisconsin North (ftUS) +<3698> +proj=lcc +lat_1=46.76666666666667 +lat_2=45.56666666666667 +lat_0=45.16666666666666 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / Wisconsin South +<3699> +proj=lcc +lat_1=44.06666666666667 +lat_2=42.73333333333333 +lat_0=42 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Wisconsin South (ftUS) +<3700> +proj=lcc +lat_1=44.06666666666667 +lat_2=42.73333333333333 +lat_0=42 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / Wisconsin Transverse Mercator +<3701> +proj=tmerc +lat_0=0 +lon_0=-90 +k=0.9996 +x_0=520000 +y_0=-4480000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Wyoming East +<3702> +proj=tmerc +lat_0=40.5 +lon_0=-105.1666666666667 +k=0.9999375 +x_0=200000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Wyoming East Central +<3703> +proj=tmerc +lat_0=40.5 +lon_0=-107.3333333333333 +k=0.9999375 +x_0=400000 +y_0=100000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Wyoming West Central +<3704> +proj=tmerc +lat_0=40.5 +lon_0=-108.75 +k=0.9999375 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Wyoming West +<3705> +proj=tmerc +lat_0=40.5 +lon_0=-110.0833333333333 +k=0.9999375 +x_0=800000 +y_0=100000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / UTM zone 59N +<3706> +proj=utm +zone=59 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / UTM zone 60N +<3707> +proj=utm +zone=60 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / UTM zone 1N +<3708> +proj=utm +zone=1 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / UTM zone 2N +<3709> +proj=utm +zone=2 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / UTM zone 3N +<3710> +proj=utm +zone=3 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / UTM zone 4N +<3711> +proj=utm +zone=4 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / UTM zone 5N +<3712> +proj=utm +zone=5 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / UTM zone 6N +<3713> +proj=utm +zone=6 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / UTM zone 7N +<3714> +proj=utm +zone=7 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / UTM zone 8N +<3715> +proj=utm +zone=8 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / UTM zone 9N +<3716> +proj=utm +zone=9 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / UTM zone 10N +<3717> +proj=utm +zone=10 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / UTM zone 11N +<3718> +proj=utm +zone=11 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / UTM zone 12N +<3719> +proj=utm +zone=12 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / UTM zone 13N +<3720> +proj=utm +zone=13 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / UTM zone 14N +<3721> +proj=utm +zone=14 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / UTM zone 15N +<3722> +proj=utm +zone=15 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / UTM zone 16N +<3723> +proj=utm +zone=16 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / UTM zone 17N +<3724> +proj=utm +zone=17 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / UTM zone 18N +<3725> +proj=utm +zone=18 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / UTM zone 19N +<3726> +proj=utm +zone=19 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Reunion 1947 / TM Reunion +<3727> +proj=tmerc +lat_0=-21.11666666666667 +lon_0=55.53333333333333 +k=1 +x_0=160000 +y_0=50000 +ellps=intl +towgs84=94,-948,-1262,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Ohio North (ftUS) +<3728> +proj=lcc +lat_1=41.7 +lat_2=40.43333333333333 +lat_0=39.66666666666666 +lon_0=-82.5 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / Ohio South (ftUS) +<3729> +proj=lcc +lat_1=40.03333333333333 +lat_2=38.73333333333333 +lat_0=38 +lon_0=-82.5 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / Wyoming East (ftUS) +<3730> +proj=tmerc +lat_0=40.5 +lon_0=-105.1666666666667 +k=0.9999375 +x_0=200000.00001016 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / Wyoming East Central (ftUS) +<3731> +proj=tmerc +lat_0=40.5 +lon_0=-107.3333333333333 +k=0.9999375 +x_0=399999.99998984 +y_0=99999.99998983997 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / Wyoming West Central (ftUS) +<3732> +proj=tmerc +lat_0=40.5 +lon_0=-108.75 +k=0.9999375 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / Wyoming West (ftUS) +<3733> +proj=tmerc +lat_0=40.5 +lon_0=-110.0833333333333 +k=0.9999375 +x_0=800000.0000101599 +y_0=99999.99998983997 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83 / Ohio North (ftUS) +<3734> +proj=lcc +lat_1=41.7 +lat_2=40.43333333333333 +lat_0=39.66666666666666 +lon_0=-82.5 +x_0=600000 +y_0=0 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / Ohio South (ftUS) +<3735> +proj=lcc +lat_1=40.03333333333333 +lat_2=38.73333333333333 +lat_0=38 +lon_0=-82.5 +x_0=600000 +y_0=0 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / Wyoming East (ftUS) +<3736> +proj=tmerc +lat_0=40.5 +lon_0=-105.1666666666667 +k=0.9999375 +x_0=200000.00001016 +y_0=0 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / Wyoming East Central (ftUS) +<3737> +proj=tmerc +lat_0=40.5 +lon_0=-107.3333333333333 +k=0.9999375 +x_0=399999.99998984 +y_0=99999.99998983997 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / Wyoming West Central (ftUS) +<3738> +proj=tmerc +lat_0=40.5 +lon_0=-108.75 +k=0.9999375 +x_0=600000 +y_0=0 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / Wyoming West (ftUS) +<3739> +proj=tmerc +lat_0=40.5 +lon_0=-110.0833333333333 +k=0.9999375 +x_0=800000.0000101599 +y_0=99999.99998983997 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83(HARN) / UTM zone 10N +<3740> +proj=utm +zone=10 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / UTM zone 11N +<3741> +proj=utm +zone=11 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / UTM zone 12N +<3742> +proj=utm +zone=12 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / UTM zone 13N +<3743> +proj=utm +zone=13 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / UTM zone 14N +<3744> +proj=utm +zone=14 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / UTM zone 15N +<3745> +proj=utm +zone=15 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / UTM zone 16N +<3746> +proj=utm +zone=16 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / UTM zone 17N +<3747> +proj=utm +zone=17 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / UTM zone 18N +<3748> +proj=utm +zone=18 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / UTM zone 19N +<3749> +proj=utm +zone=19 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / UTM zone 4N +<3750> +proj=utm +zone=4 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / UTM zone 5N +<3751> +proj=utm +zone=5 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# WGS 84 / Mercator 41 (deprecated) +<3752> +proj=merc +lon_0=100 +lat_ts=-41 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# NAD83(HARN) / Ohio North (ftUS) +<3753> +proj=lcc +lat_1=41.7 +lat_2=40.43333333333333 +lat_0=39.66666666666666 +lon_0=-82.5 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(HARN) / Ohio South (ftUS) +<3754> +proj=lcc +lat_1=40.03333333333333 +lat_2=38.73333333333333 +lat_0=38 +lon_0=-82.5 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(HARN) / Wyoming East (ftUS) +<3755> +proj=tmerc +lat_0=40.5 +lon_0=-105.1666666666667 +k=0.9999375 +x_0=200000.00001016 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(HARN) / Wyoming East Central (ftUS) +<3756> +proj=tmerc +lat_0=40.5 +lon_0=-107.3333333333333 +k=0.9999375 +x_0=399999.99998984 +y_0=99999.99998983997 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(HARN) / Wyoming West Central (ftUS) +<3757> +proj=tmerc +lat_0=40.5 +lon_0=-108.75 +k=0.9999375 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(HARN) / Wyoming West (ftUS) +<3758> +proj=tmerc +lat_0=40.5 +lon_0=-110.0833333333333 +k=0.9999375 +x_0=800000.0000101599 +y_0=99999.99998983997 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83 / Hawaii zone 3 (ftUS) +<3759> +proj=tmerc +lat_0=21.16666666666667 +lon_0=-158 +k=0.99999 +x_0=500000.00001016 +y_0=0 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83(HARN) / Hawaii zone 3 (ftUS) +<3760> +proj=tmerc +lat_0=21.16666666666667 +lon_0=-158 +k=0.99999 +x_0=500000.00001016 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(CSRS) / UTM zone 22N +<3761> +proj=utm +zone=22 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# WGS 84 / South Georgia Lambert +<3762> +proj=lcc +lat_1=-54 +lat_2=-54.75 +lat_0=-55 +lon_0=-37 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# ETRS89 / Portugal TM06 +<3763> +proj=tmerc +lat_0=39.66825833333333 +lon_0=-8.133108333333334 +k=1 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NZGD2000 / Chatham Island Circuit 2000 +<3764> +proj=tmerc +lat_0=-44 +lon_0=-176.5 +k=1 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# HTRS96 / Croatia TM +<3765> +proj=tmerc +lat_0=0 +lon_0=16.5 +k=0.9999 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# HTRS96 / Croatia LCC +<3766> +proj=lcc +lat_1=45.91666666666666 +lat_2=43.08333333333334 +lat_0=0 +lon_0=16.5 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# HTRS96 / UTM zone 33N +<3767> +proj=utm +zone=33 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# HTRS96 / UTM zone 34N +<3768> +proj=utm +zone=34 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Bermuda 1957 / UTM zone 20N +<3769> +proj=utm +zone=20 +ellps=clrk66 +towgs84=-73,213,296,0,0,0,0 +units=m +no_defs <> +# BDA2000 / Bermuda 2000 National Grid +<3770> +proj=tmerc +lat_0=32 +lon_0=-64.75 +k=1 +x_0=550000 +y_0=100000 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD27 / Alberta 3TM ref merid 111 W +<3771> +proj=tmerc +lat_0=0 +lon_0=-111 +k=0.9999 +x_0=0 +y_0=0 +datum=NAD27 +units=m +no_defs <> +# NAD27 / Alberta 3TM ref merid 114 W +<3772> +proj=tmerc +lat_0=0 +lon_0=-114 +k=0.9999 +x_0=0 +y_0=0 +datum=NAD27 +units=m +no_defs <> +# NAD27 / Alberta 3TM ref merid 117 W +<3773> +proj=tmerc +lat_0=0 +lon_0=-117 +k=0.9999 +x_0=0 +y_0=0 +datum=NAD27 +units=m +no_defs <> +# NAD27 / Alberta 3TM ref merid 120 W (deprecated) +<3774> +proj=tmerc +lat_0=0 +lon_0=-120 +k=0.9999 +x_0=0 +y_0=0 +datum=NAD27 +units=m +no_defs <> +# NAD83 / Alberta 3TM ref merid 111 W +<3775> +proj=tmerc +lat_0=0 +lon_0=-111 +k=0.9999 +x_0=0 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Alberta 3TM ref merid 114 W +<3776> +proj=tmerc +lat_0=0 +lon_0=-114 +k=0.9999 +x_0=0 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Alberta 3TM ref merid 117 W +<3777> +proj=tmerc +lat_0=0 +lon_0=-117 +k=0.9999 +x_0=0 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Alberta 3TM ref merid 120 W (deprecated) +<3778> +proj=tmerc +lat_0=0 +lon_0=-120 +k=0.9999 +x_0=0 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83(CSRS) / Alberta 3TM ref merid 111 W +<3779> +proj=tmerc +lat_0=0 +lon_0=-111 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS) / Alberta 3TM ref merid 114 W +<3780> +proj=tmerc +lat_0=0 +lon_0=-114 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS) / Alberta 3TM ref merid 117 W +<3781> +proj=tmerc +lat_0=0 +lon_0=-117 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS) / Alberta 3TM ref merid 120 W (deprecated) +<3782> +proj=tmerc +lat_0=0 +lon_0=-120 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Pitcairn 2006 / Pitcairn TM 2006 +<3783> +proj=tmerc +lat_0=-25.06855261111111 +lon_0=-130.1129671111111 +k=1 +x_0=14200 +y_0=15500 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Pitcairn 1967 / UTM zone 9S +<3784> +proj=utm +zone=9 +south +ellps=intl +towgs84=185,165,42,0,0,0,0 +units=m +no_defs <> +# Popular Visualisation CRS / Mercator (deprecated) +<3785> +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs <> +# World Equidistant Cylindrical (Sphere) (deprecated) +<3786> +proj=eqc +lat_ts=0 +lat_0=0 +lon_0=0 +x_0=0 +y_0=0 +a=6371007 +b=6371007 +units=m +no_defs <> +# MGI / Slovene National Grid (deprecated) +<3787> +proj=tmerc +lat_0=0 +lon_0=15 +k=0.9999 +x_0=500000 +y_0=-5000000 +datum=hermannskogel +units=m +no_defs <> +# NZGD2000 / Auckland Islands TM 2000 +<3788> +proj=tmerc +lat_0=0 +lon_0=166 +k=1 +x_0=3500000 +y_0=10000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NZGD2000 / Campbell Island TM 2000 +<3789> +proj=tmerc +lat_0=0 +lon_0=169 +k=1 +x_0=3500000 +y_0=10000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NZGD2000 / Antipodes Islands TM 2000 +<3790> +proj=tmerc +lat_0=0 +lon_0=179 +k=1 +x_0=3500000 +y_0=10000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NZGD2000 / Raoul Island TM 2000 +<3791> +proj=tmerc +lat_0=0 +lon_0=-178 +k=1 +x_0=3500000 +y_0=10000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NZGD2000 / Chatham Islands TM 2000 +<3793> +proj=tmerc +lat_0=0 +lon_0=-176.5 +k=1 +x_0=3500000 +y_0=10000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Slovenia 1996 / Slovene National Grid +<3794> +proj=tmerc +lat_0=0 +lon_0=15 +k=0.9999 +x_0=500000 +y_0=-5000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD27 / Cuba Norte +<3795> +proj=lcc +lat_1=23 +lat_2=21.7 +lat_0=22.35 +lon_0=-81 +x_0=500000 +y_0=280296.016 +datum=NAD27 +units=m +no_defs <> +# NAD27 / Cuba Sur +<3796> +proj=lcc +lat_1=21.3 +lat_2=20.13333333333333 +lat_0=20.71666666666667 +lon_0=-76.83333333333333 +x_0=500000 +y_0=229126.939 +datum=NAD27 +units=m +no_defs <> +# NAD27 / MTQ Lambert +<3797> +proj=lcc +lat_1=50 +lat_2=46 +lat_0=44 +lon_0=-70 +x_0=800000 +y_0=0 +datum=NAD27 +units=m +no_defs <> +# NAD83 / MTQ Lambert +<3798> +proj=lcc +lat_1=50 +lat_2=46 +lat_0=44 +lon_0=-70 +x_0=800000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83(CSRS) / MTQ Lambert +<3799> +proj=lcc +lat_1=50 +lat_2=46 +lat_0=44 +lon_0=-70 +x_0=800000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD27 / Alberta 3TM ref merid 120 W +<3800> +proj=tmerc +lat_0=0 +lon_0=-120 +k=0.9999 +x_0=0 +y_0=0 +datum=NAD27 +units=m +no_defs <> +# NAD83 / Alberta 3TM ref merid 120 W +<3801> +proj=tmerc +lat_0=0 +lon_0=-120 +k=0.9999 +x_0=0 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83(CSRS) / Alberta 3TM ref merid 120 W +<3802> +proj=tmerc +lat_0=0 +lon_0=-120 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / Belgian Lambert 2008 +<3812> +proj=lcc +lat_1=49.83333333333334 +lat_2=51.16666666666666 +lat_0=50.797815 +lon_0=4.359215833333333 +x_0=649328 +y_0=665262 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83 / Mississippi TM +<3814> +proj=tmerc +lat_0=32.5 +lon_0=-89.75 +k=0.9998335 +x_0=500000 +y_0=1300000 +datum=NAD83 +units=m +no_defs <> +# NAD83(HARN) / Mississippi TM +<3815> +proj=tmerc +lat_0=32.5 +lon_0=-89.75 +k=0.9998335 +x_0=500000 +y_0=1300000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Mississippi TM +<3816> +proj=tmerc +lat_0=32.5 +lon_0=-89.75 +k=0.9998335 +x_0=500000 +y_0=1300000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# TWD97 / TM2 zone 119 +<3825> +proj=tmerc +lat_0=0 +lon_0=119 +k=0.9999 +x_0=250000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# TWD97 / TM2 zone 121 +<3826> +proj=tmerc +lat_0=0 +lon_0=121 +k=0.9999 +x_0=250000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# TWD67 / TM2 zone 119 +<3827> +proj=tmerc +lat_0=0 +lon_0=119 +k=0.9999 +x_0=250000 +y_0=0 +ellps=aust_SA +units=m +no_defs <> +# TWD67 / TM2 zone 121 +<3828> +proj=tmerc +lat_0=0 +lon_0=121 +k=0.9999 +x_0=250000 +y_0=0 +ellps=aust_SA +units=m +no_defs <> +# Hu Tzu Shan 1950 / UTM zone 51N +<3829> +proj=utm +zone=51 +ellps=intl +towgs84=-637,-549,-203,0,0,0,0 +units=m +no_defs <> +# WGS 84 / PDC Mercator +<3832> +proj=merc +lon_0=150 +k=1 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# Pulkovo 1942(58) / Gauss-Kruger zone 2 +<3833> +proj=tmerc +lat_0=0 +lon_0=9 +k=1 +x_0=2500000 +y_0=0 +ellps=krass +towgs84=33.4,-146.6,-76.3,-0.359,-0.053,0.844,-0.84 +units=m +no_defs <> +# Pulkovo 1942(83) / Gauss-Kruger zone 2 +<3834> +proj=tmerc +lat_0=0 +lon_0=9 +k=1 +x_0=2500000 +y_0=0 +ellps=krass +towgs84=26,-121,-78,0,0,0,0 +units=m +no_defs <> +# Pulkovo 1942(83) / Gauss-Kruger zone 3 +<3835> +proj=tmerc +lat_0=0 +lon_0=15 +k=1 +x_0=3500000 +y_0=0 +ellps=krass +towgs84=26,-121,-78,0,0,0,0 +units=m +no_defs <> +# Pulkovo 1942(83) / Gauss-Kruger zone 4 +<3836> +proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=4500000 +y_0=0 +ellps=krass +towgs84=26,-121,-78,0,0,0,0 +units=m +no_defs <> +# Pulkovo 1942(58) / 3-degree Gauss-Kruger zone 3 +<3837> +proj=tmerc +lat_0=0 +lon_0=9 +k=1 +x_0=3500000 +y_0=0 +ellps=krass +towgs84=33.4,-146.6,-76.3,-0.359,-0.053,0.844,-0.84 +units=m +no_defs <> +# Pulkovo 1942(58) / 3-degree Gauss-Kruger zone 4 +<3838> +proj=tmerc +lat_0=0 +lon_0=12 +k=1 +x_0=4500000 +y_0=0 +ellps=krass +towgs84=33.4,-146.6,-76.3,-0.359,-0.053,0.844,-0.84 +units=m +no_defs <> +# Pulkovo 1942(58) / 3-degree Gauss-Kruger zone 9 +<3839> +proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=9500000 +y_0=0 +ellps=krass +towgs84=33.4,-146.6,-76.3,-0.359,-0.053,0.844,-0.84 +units=m +no_defs <> +# Pulkovo 1942(58) / 3-degree Gauss-Kruger zone 10 +<3840> +proj=tmerc +lat_0=0 +lon_0=30 +k=1 +x_0=10500000 +y_0=0 +ellps=krass +towgs84=33.4,-146.6,-76.3,-0.359,-0.053,0.844,-0.84 +units=m +no_defs <> +# Pulkovo 1942(83) / 3-degree Gauss-Kruger zone 6 +<3841> +proj=tmerc +lat_0=0 +lon_0=18 +k=1 +x_0=6500000 +y_0=0 +ellps=krass +towgs84=26,-121,-78,0,0,0,0 +units=m +no_defs <> +# Pulkovo 1942(83) / 3-degree Gauss-Kruger zone 7 (deprecated) +<3842> +proj=tmerc +lat_0=0 +lon_0=18 +k=1 +x_0=6500000 +y_0=0 +ellps=krass +towgs84=26,-121,-78,0,0,0,0 +units=m +no_defs <> +# Pulkovo 1942(83) / 3-degree Gauss-Kruger zone 8 (deprecated) +<3843> +proj=tmerc +lat_0=0 +lon_0=18 +k=1 +x_0=6500000 +y_0=0 +ellps=krass +towgs84=26,-121,-78,0,0,0,0 +units=m +no_defs <> +# Pulkovo 1942(58) / Stereo70 +<3844> +proj=sterea +lat_0=46 +lon_0=25 +k=0.99975 +x_0=500000 +y_0=500000 +ellps=krass +towgs84=2.329,-147.042,-92.08,0.309,-0.325,-0.497,5.69 +units=m +no_defs <> +# SWEREF99 / RT90 7.5 gon V emulation +<3845> +proj=tmerc +lat_0=0 +lon_0=11.30625 +k=1.000006 +x_0=1500025.141 +y_0=-667.282 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# SWEREF99 / RT90 5 gon V emulation +<3846> +proj=tmerc +lat_0=0 +lon_0=13.55626666666667 +k=1.0000058 +x_0=1500044.695 +y_0=-667.13 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# SWEREF99 / RT90 2.5 gon V emulation +<3847> +proj=tmerc +lat_0=0 +lon_0=15.80628452944445 +k=1.00000561024 +x_0=1500064.274 +y_0=-667.711 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# SWEREF99 / RT90 0 gon emulation +<3848> +proj=tmerc +lat_0=0 +lon_0=18.0563 +k=1.0000054 +x_0=1500083.521 +y_0=-668.8440000000001 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# SWEREF99 / RT90 2.5 gon O emulation +<3849> +proj=tmerc +lat_0=0 +lon_0=20.30631666666667 +k=1.0000052 +x_0=1500102.765 +y_0=-670.706 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# SWEREF99 / RT90 5 gon O emulation +<3850> +proj=tmerc +lat_0=0 +lon_0=22.55633333333333 +k=1.0000049 +x_0=1500121.846 +y_0=-672.557 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NZGD2000 / NZCS2000 +<3851> +proj=lcc +lat_1=-37.5 +lat_2=-44.5 +lat_0=-41 +lon_0=173 +x_0=3000000 +y_0=7000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# RSRGD2000 / DGLC2000 +<3852> +proj=lcc +lat_1=-76.66666666666667 +lat_2=-79.33333333333333 +lat_0=-90 +lon_0=157 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# County ST74 +<3854> +proj=tmerc +lat_0=0 +lon_0=18.05787 +k=0.99999506 +x_0=100182.7406 +y_0=-6500620.1207 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# WGS 84 / Pseudo-Mercator +<3857> +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs <> +# ETRS89 / GK19FIN +<3873> +proj=tmerc +lat_0=0 +lon_0=19 +k=1 +x_0=19500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / GK20FIN +<3874> +proj=tmerc +lat_0=0 +lon_0=20 +k=1 +x_0=20500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / GK21FIN +<3875> +proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=21500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / GK22FIN +<3876> +proj=tmerc +lat_0=0 +lon_0=22 +k=1 +x_0=22500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / GK23FIN +<3877> +proj=tmerc +lat_0=0 +lon_0=23 +k=1 +x_0=23500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / GK24FIN +<3878> +proj=tmerc +lat_0=0 +lon_0=24 +k=1 +x_0=24500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / GK25FIN +<3879> +proj=tmerc +lat_0=0 +lon_0=25 +k=1 +x_0=25500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / GK26FIN +<3880> +proj=tmerc +lat_0=0 +lon_0=26 +k=1 +x_0=26500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / GK27FIN +<3881> +proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=27500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / GK28FIN +<3882> +proj=tmerc +lat_0=0 +lon_0=28 +k=1 +x_0=28500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / GK29FIN +<3883> +proj=tmerc +lat_0=0 +lon_0=29 +k=1 +x_0=29500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / GK30FIN +<3884> +proj=tmerc +lat_0=0 +lon_0=30 +k=1 +x_0=30500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / GK31FIN +<3885> +proj=tmerc +lat_0=0 +lon_0=31 +k=1 +x_0=31500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# IGRS / UTM zone 37N +<3890> +proj=utm +zone=37 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# IGRS / UTM zone 38N +<3891> +proj=utm +zone=38 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# IGRS / UTM zone 39N +<3892> +proj=utm +zone=39 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ED50 / Iraq National Grid +<3893> +proj=tmerc +lat_0=29.02626833333333 +lon_0=46.5 +k=0.9994 +x_0=800000 +y_0=0 +ellps=intl +towgs84=-87,-98,-121,0,0,0,0 +units=m +no_defs <> +# MGI 1901 / Balkans zone 5 +<3907> +proj=tmerc +lat_0=0 +lon_0=15 +k=0.9999 +x_0=5500000 +y_0=0 +ellps=bessel +towgs84=682,-203,480,0,0,0,0 +units=m +no_defs <> +# MGI 1901 / Balkans zone 6 +<3908> +proj=tmerc +lat_0=0 +lon_0=18 +k=0.9999 +x_0=6500000 +y_0=0 +ellps=bessel +towgs84=682,-203,480,0,0,0,0 +units=m +no_defs <> +# MGI 1901 / Balkans zone 7 +<3909> +proj=tmerc +lat_0=0 +lon_0=21 +k=0.9999 +x_0=7500000 +y_0=0 +ellps=bessel +towgs84=682,-203,480,0,0,0,0 +units=m +no_defs <> +# MGI 1901 / Balkans zone 8 +<3910> +proj=tmerc +lat_0=0 +lon_0=24 +k=0.9999 +x_0=8500000 +y_0=0 +ellps=bessel +towgs84=682,-203,480,0,0,0,0 +units=m +no_defs <> +# MGI 1901 / Slovenia Grid +<3911> +proj=tmerc +lat_0=0 +lon_0=15 +k=0.9999 +x_0=500000 +y_0=0 +ellps=bessel +towgs84=682,-203,480,0,0,0,0 +units=m +no_defs <> +# MGI 1901 / Slovene National Grid +<3912> +proj=tmerc +lat_0=0 +lon_0=15 +k=0.9999 +x_0=500000 +y_0=-5000000 +ellps=bessel +towgs84=682,-203,480,0,0,0,0 +units=m +no_defs <> +# Puerto Rico / UTM zone 20N +<3920> +proj=utm +zone=20 +ellps=clrk66 +towgs84=11,72,-101,0,0,0,0 +units=m +no_defs <> +# RGF93 / CC42 +<3942> +proj=lcc +lat_1=41.25 +lat_2=42.75 +lat_0=42 +lon_0=3 +x_0=1700000 +y_0=1200000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# RGF93 / CC43 +<3943> +proj=lcc +lat_1=42.25 +lat_2=43.75 +lat_0=43 +lon_0=3 +x_0=1700000 +y_0=2200000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# RGF93 / CC44 +<3944> +proj=lcc +lat_1=43.25 +lat_2=44.75 +lat_0=44 +lon_0=3 +x_0=1700000 +y_0=3200000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# RGF93 / CC45 +<3945> +proj=lcc +lat_1=44.25 +lat_2=45.75 +lat_0=45 +lon_0=3 +x_0=1700000 +y_0=4200000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# RGF93 / CC46 +<3946> +proj=lcc +lat_1=45.25 +lat_2=46.75 +lat_0=46 +lon_0=3 +x_0=1700000 +y_0=5200000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# RGF93 / CC47 +<3947> +proj=lcc +lat_1=46.25 +lat_2=47.75 +lat_0=47 +lon_0=3 +x_0=1700000 +y_0=6200000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# RGF93 / CC48 +<3948> +proj=lcc +lat_1=47.25 +lat_2=48.75 +lat_0=48 +lon_0=3 +x_0=1700000 +y_0=7200000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# RGF93 / CC49 +<3949> +proj=lcc +lat_1=48.25 +lat_2=49.75 +lat_0=49 +lon_0=3 +x_0=1700000 +y_0=8200000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# RGF93 / CC50 +<3950> +proj=lcc +lat_1=49.25 +lat_2=50.75 +lat_0=50 +lon_0=3 +x_0=1700000 +y_0=9200000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83 / Virginia Lambert +<3968> +proj=lcc +lat_1=37 +lat_2=39.5 +lat_0=36 +lon_0=-79.5 +x_0=0 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83(HARN) / Virginia Lambert +<3969> +proj=lcc +lat_1=37 +lat_2=39.5 +lat_0=36 +lon_0=-79.5 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Virginia Lambert +<3970> +proj=lcc +lat_1=37 +lat_2=39.5 +lat_0=36 +lon_0=-79.5 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# WGS 84 / NSIDC EASE-Grid North (deprecated) +<3973> +proj=laea +lat_0=90 +lon_0=0 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / NSIDC EASE-Grid South (deprecated) +<3974> +proj=laea +lat_0=-90 +lon_0=0 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / NSIDC EASE-Grid Global (deprecated) +<3975> +proj=cea +lon_0=0 +lat_ts=30 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / NSIDC Sea Ice Polar Stereographic South +<3976> +proj=stere +lat_0=-90 +lat_ts=-70 +lon_0=0 +k=1 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# NAD83 / Canada Atlas Lambert +<3978> +proj=lcc +lat_1=49 +lat_2=77 +lat_0=49 +lon_0=-95 +x_0=0 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83(CSRS) / Canada Atlas Lambert +<3979> +proj=lcc +lat_1=49 +lat_2=77 +lat_0=49 +lon_0=-95 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Katanga 1955 / Katanga Lambert (deprecated) +<3985> +proj=lcc +lat_1=-6.5 +lat_2=-11.5 +lat_0=9 +lon_0=26 +x_0=500000 +y_0=500000 +ellps=clrk66 +towgs84=-103.746,-9.614,-255.95,0,0,0,0 +units=m +no_defs <> +# Katanga 1955 / Katanga Gauss zone A +<3986> +proj=tmerc +lat_0=-9 +lon_0=30 +k=1 +x_0=200000 +y_0=500000 +ellps=clrk66 +towgs84=-103.746,-9.614,-255.95,0,0,0,0 +units=m +no_defs <> +# Katanga 1955 / Katanga Gauss zone B +<3987> +proj=tmerc +lat_0=-9 +lon_0=28 +k=1 +x_0=200000 +y_0=500000 +ellps=clrk66 +towgs84=-103.746,-9.614,-255.95,0,0,0,0 +units=m +no_defs <> +# Katanga 1955 / Katanga Gauss zone C +<3988> +proj=tmerc +lat_0=-9 +lon_0=26 +k=1 +x_0=200000 +y_0=500000 +ellps=clrk66 +towgs84=-103.746,-9.614,-255.95,0,0,0,0 +units=m +no_defs <> +# Katanga 1955 / Katanga Gauss zone D +<3989> +proj=tmerc +lat_0=-9 +lon_0=24 +k=1 +x_0=200000 +y_0=500000 +ellps=clrk66 +towgs84=-103.746,-9.614,-255.95,0,0,0,0 +units=m +no_defs <> +# Puerto Rico State Plane CS of 1927 +<3991> +proj=lcc +lat_1=18.43333333333333 +lat_2=18.03333333333333 +lat_0=17.83333333333333 +lon_0=-66.43333333333334 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +towgs84=11,72,-101,0,0,0,0 +units=us-ft +no_defs <> +# Puerto Rico / St. Croix +<3992> +proj=lcc +lat_1=18.43333333333333 +lat_2=18.03333333333333 +lat_0=17.83333333333333 +lon_0=-66.43333333333334 +x_0=152400.3048006096 +y_0=30480.06096012192 +ellps=clrk66 +towgs84=11,72,-101,0,0,0,0 +units=us-ft +no_defs <> +# Guam 1963 / Guam SPCS +# Unable to translate coordinate system EPSG:3993 into PROJ.4 format. +# +# WGS 84 / Mercator 41 +<3994> +proj=merc +lon_0=100 +lat_ts=-41 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / Arctic Polar Stereographic +<3995> +proj=stere +lat_0=90 +lat_ts=71 +lon_0=0 +k=1 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / IBCAO Polar Stereographic +<3996> +proj=stere +lat_0=90 +lat_ts=75 +lon_0=0 +k=1 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / Dubai Local TM +<3997> +proj=tmerc +lat_0=0 +lon_0=55.33333333333334 +k=1 +x_0=500000 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# MOLDREF99 / Moldova TM +<4026> +proj=tmerc +lat_0=0 +lon_0=28.4 +k=0.9999400000000001 +x_0=200000 +y_0=-5000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# WGS 84 / TMzn35N +<4037> +proj=utm +zone=35 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / TMzn36N +<4038> +proj=utm +zone=36 +datum=WGS84 +units=m +no_defs <> +# RGRDC 2005 / Congo TM zone 12 +<4048> +proj=tmerc +lat_0=0 +lon_0=12 +k=0.9999 +x_0=500000 +y_0=10000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# RGRDC 2005 / Congo TM zone 14 +<4049> +proj=tmerc +lat_0=0 +lon_0=14 +k=0.9999 +x_0=500000 +y_0=10000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# RGRDC 2005 / Congo TM zone 16 +<4050> +proj=tmerc +lat_0=0 +lon_0=16 +k=0.9999 +x_0=500000 +y_0=10000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# RGRDC 2005 / Congo TM zone 18 +<4051> +proj=tmerc +lat_0=0 +lon_0=18 +k=0.9999 +x_0=500000 +y_0=10000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# RGRDC 2005 / Congo TM zone 20 +<4056> +proj=tmerc +lat_0=0 +lon_0=20 +k=0.9999 +x_0=500000 +y_0=10000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# RGRDC 2005 / Congo TM zone 22 +<4057> +proj=tmerc +lat_0=0 +lon_0=22 +k=0.9999 +x_0=500000 +y_0=10000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# RGRDC 2005 / Congo TM zone 24 +<4058> +proj=tmerc +lat_0=0 +lon_0=24 +k=0.9999 +x_0=500000 +y_0=10000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# RGRDC 2005 / Congo TM zone 26 +<4059> +proj=tmerc +lat_0=0 +lon_0=26 +k=0.9999 +x_0=500000 +y_0=10000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# RGRDC 2005 / Congo TM zone 28 +<4060> +proj=tmerc +lat_0=0 +lon_0=28 +k=0.9999 +x_0=500000 +y_0=10000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# RGRDC 2005 / UTM zone 33S +<4061> +proj=utm +zone=33 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# RGRDC 2005 / UTM zone 34S +<4062> +proj=utm +zone=34 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# RGRDC 2005 / UTM zone 35S +<4063> +proj=utm +zone=35 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Chua / UTM zone 23S +<4071> +proj=utm +zone=23 +south +ellps=intl +towgs84=-143.87,243.37,-33.52,0,0,0,0 +units=m +no_defs <> +# REGCAN95 / UTM zone 27N +<4082> +proj=utm +zone=27 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# REGCAN95 / UTM zone 28N +<4083> +proj=utm +zone=28 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# WGS 84 / World Equidistant Cylindrical +<4087> +proj=eqc +lat_ts=0 +lat_0=0 +lon_0=0 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# World Equidistant Cylindrical (Sphere) +<4088> +proj=eqc +lat_ts=0 +lat_0=0 +lon_0=0 +x_0=0 +y_0=0 +a=6371007 +b=6371007 +units=m +no_defs <> +# ETRS89 / DKTM1 +<4093> +proj=tmerc +lat_0=0 +lon_0=9 +k=0.99998 +x_0=200000 +y_0=-5000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / DKTM2 +<4094> +proj=tmerc +lat_0=0 +lon_0=10 +k=0.99998 +x_0=400000 +y_0=-5000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / DKTM3 +<4095> +proj=tmerc +lat_0=0 +lon_0=11.75 +k=0.99998 +x_0=600000 +y_0=-5000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / DKTM4 +<4096> +proj=tmerc +lat_0=0 +lon_0=15 +k=1 +x_0=800000 +y_0=-5000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83 / BLM 59N (ftUS) +<4217> +proj=tmerc +lat_0=0 +lon_0=171 +k=0.9996 +x_0=500000.001016002 +y_0=0 +datum=NAD83 +units=us-ft +no_defs <> +# Kertau 1968 / Johor Grid +<4390> +proj=cass +lat_0=2.042583333333333 +lon_0=103.5627583333333 +x_0=0 +y_0=0 +a=6377304.063 +b=6356103.038993155 +towgs84=-11,851,5,0,0,0,0 +units=m +no_defs <> +# Kertau 1968 / Sembilan and Melaka Grid +<4391> +proj=cass +lat_0=2.712283333333334 +lon_0=101.9411666666667 +x_0=-242.005 +y_0=-948.547 +a=6377304.063 +b=6356103.038993155 +towgs84=-11,851,5,0,0,0,0 +units=m +no_defs <> +# Kertau 1968 / Pahang Grid +<4392> +proj=cass +lat_0=3.710972222222222 +lon_0=102.4361777777778 +x_0=0 +y_0=0 +a=6377304.063 +b=6356103.038993155 +towgs84=-11,851,5,0,0,0,0 +units=m +no_defs <> +# Kertau 1968 / Selangor Grid +<4393> +proj=cass +lat_0=3.680344444444444 +lon_0=101.5082444444444 +x_0=-21759.438 +y_0=55960.906 +a=6377304.063 +b=6356103.038993155 +towgs84=-11,851,5,0,0,0,0 +units=m +no_defs <> +# Kertau 1968 / Terengganu Grid +<4394> +proj=cass +lat_0=4.946141666666667 +lon_0=102.8952083333333 +x_0=0 +y_0=0 +a=6377304.063 +b=6356103.038993155 +towgs84=-11,851,5,0,0,0,0 +units=m +no_defs <> +# Kertau 1968 / Pinang Grid +<4395> +proj=cass +lat_0=5.421325 +lon_0=100.3458694444444 +x_0=0 +y_0=0 +a=6377304.063 +b=6356103.038993155 +towgs84=-11,851,5,0,0,0,0 +units=m +no_defs <> +# Kertau 1968 / Kedah and Perlis Grid +<4396> +proj=cass +lat_0=5.965147222222223 +lon_0=100.6375944444444 +x_0=0 +y_0=0 +a=6377304.063 +b=6356103.038993155 +towgs84=-11,851,5,0,0,0,0 +units=m +no_defs <> +# Kertau 1968 / Perak Revised Grid +<4397> +proj=cass +lat_0=4.859380555555555 +lon_0=100.8167666666667 +x_0=0 +y_0=133453.669 +a=6377304.063 +b=6356103.038993155 +towgs84=-11,851,5,0,0,0,0 +units=m +no_defs <> +# Kertau 1968 / Kelantan Grid +<4398> +proj=cass +lat_0=5.893922222222222 +lon_0=102.1772916666667 +x_0=0 +y_0=0 +a=6377304.063 +b=6356103.038993155 +towgs84=-11,851,5,0,0,0,0 +units=m +no_defs <> +# NAD27 / BLM 59N (ftUS) +<4399> +proj=tmerc +lat_0=0 +lon_0=171 +k=0.9996 +x_0=500000.001016002 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / BLM 60N (ftUS) +<4400> +proj=tmerc +lat_0=0 +lon_0=177 +k=0.9996 +x_0=500000.001016002 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / BLM 1N (ftUS) +<4401> +proj=tmerc +lat_0=0 +lon_0=-177 +k=0.9996 +x_0=500000.001016002 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / BLM 2N (ftUS) +<4402> +proj=tmerc +lat_0=0 +lon_0=-171 +k=0.9996 +x_0=500000.001016002 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / BLM 3N (ftUS) +<4403> +proj=tmerc +lat_0=0 +lon_0=-165 +k=0.9996 +x_0=500000.001016002 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / BLM 4N (ftUS) +<4404> +proj=tmerc +lat_0=0 +lon_0=-159 +k=0.9996 +x_0=500000.001016002 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / BLM 5N (ftUS) +<4405> +proj=tmerc +lat_0=0 +lon_0=-153 +k=0.9996 +x_0=500000.001016002 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / BLM 6N (ftUS) +<4406> +proj=tmerc +lat_0=0 +lon_0=-147 +k=0.9996 +x_0=500000.001016002 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / BLM 7N (ftUS) +<4407> +proj=tmerc +lat_0=0 +lon_0=-141 +k=0.9996 +x_0=500000.001016002 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / BLM 8N (ftUS) +<4408> +proj=tmerc +lat_0=0 +lon_0=-135 +k=0.9996 +x_0=500000.001016002 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / BLM 9N (ftUS) +<4409> +proj=tmerc +lat_0=0 +lon_0=-129 +k=0.9996 +x_0=500000.001016002 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / BLM 10N (ftUS) +<4410> +proj=tmerc +lat_0=0 +lon_0=-123 +k=0.9996 +x_0=500000.001016002 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / BLM 11N (ftUS) +<4411> +proj=tmerc +lat_0=0 +lon_0=-117 +k=0.9996 +x_0=500000.001016002 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / BLM 12N (ftUS) +<4412> +proj=tmerc +lat_0=0 +lon_0=-111 +k=0.9996 +x_0=500000.001016002 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / BLM 13N (ftUS) +<4413> +proj=tmerc +lat_0=0 +lon_0=-105 +k=0.9996 +x_0=500000.001016002 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD83(HARN) / Guam Map Grid +<4414> +proj=tmerc +lat_0=13.5 +lon_0=144.75 +k=1 +x_0=100000 +y_0=200000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Katanga 1955 / Katanga Lambert +<4415> +proj=lcc +lat_1=-6.5 +lat_2=-11.5 +lat_0=-9 +lon_0=26 +x_0=500000 +y_0=500000 +ellps=clrk66 +towgs84=-103.746,-9.614,-255.95,0,0,0,0 +units=m +no_defs <> +# Pulkovo 1942(83) / 3-degree Gauss-Kruger zone 7 +<4417> +proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=7500000 +y_0=0 +ellps=krass +towgs84=26,-121,-78,0,0,0,0 +units=m +no_defs <> +# NAD27 / BLM 18N (ftUS) +<4418> +proj=tmerc +lat_0=0 +lon_0=-75 +k=0.9996 +x_0=500000.001016002 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / BLM 19N (ftUS) +<4419> +proj=tmerc +lat_0=0 +lon_0=-69 +k=0.9996 +x_0=500000.001016002 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD83 / BLM 60N (ftUS) +<4420> +proj=tmerc +lat_0=0 +lon_0=177 +k=0.9996 +x_0=500000.001016002 +y_0=0 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / BLM 1N (ftUS) +<4421> +proj=tmerc +lat_0=0 +lon_0=-177 +k=0.9996 +x_0=500000.001016002 +y_0=0 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / BLM 2N (ftUS) +<4422> +proj=tmerc +lat_0=0 +lon_0=-171 +k=0.9996 +x_0=500000.001016002 +y_0=0 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / BLM 3N (ftUS) +<4423> +proj=tmerc +lat_0=0 +lon_0=-165 +k=0.9996 +x_0=500000.001016002 +y_0=0 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / BLM 4N (ftUS) +<4424> +proj=tmerc +lat_0=0 +lon_0=-159 +k=0.9996 +x_0=500000.001016002 +y_0=0 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / BLM 5N (ftUS) +<4425> +proj=tmerc +lat_0=0 +lon_0=-153 +k=0.9996 +x_0=500000.001016002 +y_0=0 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / BLM 6N (ftUS) +<4426> +proj=tmerc +lat_0=0 +lon_0=-147 +k=0.9996 +x_0=500000.001016002 +y_0=0 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / BLM 7N (ftUS) +<4427> +proj=tmerc +lat_0=0 +lon_0=-141 +k=0.9996 +x_0=500000.001016002 +y_0=0 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / BLM 8N (ftUS) +<4428> +proj=tmerc +lat_0=0 +lon_0=-135 +k=0.9996 +x_0=500000.001016002 +y_0=0 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / BLM 9N (ftUS) +<4429> +proj=tmerc +lat_0=0 +lon_0=-129 +k=0.9996 +x_0=500000.001016002 +y_0=0 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / BLM 10N (ftUS) +<4430> +proj=tmerc +lat_0=0 +lon_0=-123 +k=0.9996 +x_0=500000.001016002 +y_0=0 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / BLM 11N (ftUS) +<4431> +proj=tmerc +lat_0=0 +lon_0=-117 +k=0.9996 +x_0=500000.001016002 +y_0=0 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / BLM 12N (ftUS) +<4432> +proj=tmerc +lat_0=0 +lon_0=-111 +k=0.9996 +x_0=500000.001016002 +y_0=0 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / BLM 13N (ftUS) +<4433> +proj=tmerc +lat_0=0 +lon_0=-105 +k=0.9996 +x_0=500000.001016002 +y_0=0 +datum=NAD83 +units=us-ft +no_defs <> +# Pulkovo 1942(83) / 3-degree Gauss-Kruger zone 8 +<4434> +proj=tmerc +lat_0=0 +lon_0=24 +k=1 +x_0=8500000 +y_0=0 +ellps=krass +towgs84=26,-121,-78,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Puerto Rico and Virgin Is. +<4437> +proj=lcc +lat_1=18.43333333333333 +lat_2=18.03333333333333 +lat_0=17.83333333333333 +lon_0=-66.43333333333334 +x_0=200000 +y_0=200000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83 / BLM 18N (ftUS) +<4438> +proj=tmerc +lat_0=0 +lon_0=-75 +k=0.9996 +x_0=500000.001016002 +y_0=0 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / BLM 19N (ftUS) +<4439> +proj=tmerc +lat_0=0 +lon_0=-69 +k=0.9996 +x_0=500000.001016002 +y_0=0 +datum=NAD83 +units=us-ft +no_defs <> +# NAD27 / Pennsylvania South +<4455> +proj=lcc +lat_1=40.96666666666667 +lat_2=39.93333333333333 +lat_0=39.33333333333334 +lon_0=-77.75 +x_0=609601.2192024384 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / New York Long Island +<4456> +proj=lcc +lat_1=41.03333333333333 +lat_2=40.66666666666666 +lat_0=40.5 +lon_0=-74 +x_0=609601.2192024384 +y_0=30480.06096012192 +datum=NAD27 +units=us-ft +no_defs <> +# NAD83 / South Dakota North (ftUS) +<4457> +proj=lcc +lat_1=45.68333333333333 +lat_2=44.41666666666666 +lat_0=43.83333333333334 +lon_0=-100 +x_0=600000 +y_0=0 +datum=NAD83 +units=us-ft +no_defs <> +# WGS 84 / Australian Centre for Remote Sensing Lambert +<4462> +proj=lcc +lat_1=-18 +lat_2=-36 +lat_0=-27 +lon_0=132 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# RGSPM06 / UTM zone 21N +<4467> +proj=utm +zone=21 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# RGM04 / UTM zone 38S +<4471> +proj=utm +zone=38 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Cadastre 1997 / UTM zone 38S (deprecated) +<4474> +proj=utm +zone=38 +south +ellps=intl +towgs84=-382,-59,-262,0,0,0,0 +units=m +no_defs <> +# Mexico ITRF92 / UTM zone 11N +<4484> +proj=utm +zone=11 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Mexico ITRF92 / UTM zone 12N +<4485> +proj=utm +zone=12 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Mexico ITRF92 / UTM zone 13N +<4486> +proj=utm +zone=13 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Mexico ITRF92 / UTM zone 14N +<4487> +proj=utm +zone=14 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Mexico ITRF92 / UTM zone 15N +<4488> +proj=utm +zone=15 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Mexico ITRF92 / UTM zone 16N +<4489> +proj=utm +zone=16 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# CGCS2000 / Gauss-Kruger zone 13 +<4491> +proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=13500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# CGCS2000 / Gauss-Kruger zone 14 +<4492> +proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=14500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# CGCS2000 / Gauss-Kruger zone 15 +<4493> +proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=15500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# CGCS2000 / Gauss-Kruger zone 16 +<4494> +proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=16500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# CGCS2000 / Gauss-Kruger zone 17 +<4495> +proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=17500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# CGCS2000 / Gauss-Kruger zone 18 +<4496> +proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=18500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# CGCS2000 / Gauss-Kruger zone 19 +<4497> +proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=19500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# CGCS2000 / Gauss-Kruger zone 20 +<4498> +proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=20500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# CGCS2000 / Gauss-Kruger zone 21 +<4499> +proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=21500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# CGCS2000 / Gauss-Kruger zone 22 +<4500> +proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=22500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# CGCS2000 / Gauss-Kruger zone 23 +<4501> +proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=23500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# CGCS2000 / Gauss-Kruger CM 75E +<4502> +proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# CGCS2000 / Gauss-Kruger CM 81E +<4503> +proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# CGCS2000 / Gauss-Kruger CM 87E +<4504> +proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# CGCS2000 / Gauss-Kruger CM 93E +<4505> +proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# CGCS2000 / Gauss-Kruger CM 99E +<4506> +proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# CGCS2000 / Gauss-Kruger CM 105E +<4507> +proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# CGCS2000 / Gauss-Kruger CM 111E +<4508> +proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# CGCS2000 / Gauss-Kruger CM 117E +<4509> +proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# CGCS2000 / Gauss-Kruger CM 123E +<4510> +proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# CGCS2000 / Gauss-Kruger CM 129E +<4511> +proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# CGCS2000 / Gauss-Kruger CM 135E +<4512> +proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# CGCS2000 / 3-degree Gauss-Kruger zone 25 +<4513> +proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=25500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# CGCS2000 / 3-degree Gauss-Kruger zone 26 +<4514> +proj=tmerc +lat_0=0 +lon_0=78 +k=1 +x_0=26500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# CGCS2000 / 3-degree Gauss-Kruger zone 27 +<4515> +proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=27500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# CGCS2000 / 3-degree Gauss-Kruger zone 28 +<4516> +proj=tmerc +lat_0=0 +lon_0=84 +k=1 +x_0=28500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# CGCS2000 / 3-degree Gauss-Kruger zone 29 +<4517> +proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=29500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# CGCS2000 / 3-degree Gauss-Kruger zone 30 +<4518> +proj=tmerc +lat_0=0 +lon_0=90 +k=1 +x_0=30500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# CGCS2000 / 3-degree Gauss-Kruger zone 31 +<4519> +proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=31500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# CGCS2000 / 3-degree Gauss-Kruger zone 32 +<4520> +proj=tmerc +lat_0=0 +lon_0=96 +k=1 +x_0=32500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# CGCS2000 / 3-degree Gauss-Kruger zone 33 +<4521> +proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=33500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# CGCS2000 / 3-degree Gauss-Kruger zone 34 +<4522> +proj=tmerc +lat_0=0 +lon_0=102 +k=1 +x_0=34500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# CGCS2000 / 3-degree Gauss-Kruger zone 35 +<4523> +proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=35500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# CGCS2000 / 3-degree Gauss-Kruger zone 36 +<4524> +proj=tmerc +lat_0=0 +lon_0=108 +k=1 +x_0=36500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# CGCS2000 / 3-degree Gauss-Kruger zone 37 +<4525> +proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=37500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# CGCS2000 / 3-degree Gauss-Kruger zone 38 +<4526> +proj=tmerc +lat_0=0 +lon_0=114 +k=1 +x_0=38500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# CGCS2000 / 3-degree Gauss-Kruger zone 39 +<4527> +proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=39500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# CGCS2000 / 3-degree Gauss-Kruger zone 40 +<4528> +proj=tmerc +lat_0=0 +lon_0=120 +k=1 +x_0=40500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# CGCS2000 / 3-degree Gauss-Kruger zone 41 +<4529> +proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=41500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# CGCS2000 / 3-degree Gauss-Kruger zone 42 +<4530> +proj=tmerc +lat_0=0 +lon_0=126 +k=1 +x_0=42500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# CGCS2000 / 3-degree Gauss-Kruger zone 43 +<4531> +proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=43500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# CGCS2000 / 3-degree Gauss-Kruger zone 44 +<4532> +proj=tmerc +lat_0=0 +lon_0=132 +k=1 +x_0=44500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# CGCS2000 / 3-degree Gauss-Kruger zone 45 +<4533> +proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=45500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# CGCS2000 / 3-degree Gauss-Kruger CM 75E +<4534> +proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# CGCS2000 / 3-degree Gauss-Kruger CM 78E +<4535> +proj=tmerc +lat_0=0 +lon_0=78 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# CGCS2000 / 3-degree Gauss-Kruger CM 81E +<4536> +proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# CGCS2000 / 3-degree Gauss-Kruger CM 84E +<4537> +proj=tmerc +lat_0=0 +lon_0=84 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# CGCS2000 / 3-degree Gauss-Kruger CM 87E +<4538> +proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# CGCS2000 / 3-degree Gauss-Kruger CM 90E +<4539> +proj=tmerc +lat_0=0 +lon_0=90 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# CGCS2000 / 3-degree Gauss-Kruger CM 93E +<4540> +proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# CGCS2000 / 3-degree Gauss-Kruger CM 96E +<4541> +proj=tmerc +lat_0=0 +lon_0=96 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# CGCS2000 / 3-degree Gauss-Kruger CM 99E +<4542> +proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# CGCS2000 / 3-degree Gauss-Kruger CM 102E +<4543> +proj=tmerc +lat_0=0 +lon_0=102 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# CGCS2000 / 3-degree Gauss-Kruger CM 105E +<4544> +proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# CGCS2000 / 3-degree Gauss-Kruger CM 108E +<4545> +proj=tmerc +lat_0=0 +lon_0=108 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# CGCS2000 / 3-degree Gauss-Kruger CM 111E +<4546> +proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# CGCS2000 / 3-degree Gauss-Kruger CM 114E +<4547> +proj=tmerc +lat_0=0 +lon_0=114 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# CGCS2000 / 3-degree Gauss-Kruger CM 117E +<4548> +proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# CGCS2000 / 3-degree Gauss-Kruger CM 120E +<4549> +proj=tmerc +lat_0=0 +lon_0=120 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# CGCS2000 / 3-degree Gauss-Kruger CM 123E +<4550> +proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# CGCS2000 / 3-degree Gauss-Kruger CM 126E +<4551> +proj=tmerc +lat_0=0 +lon_0=126 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# CGCS2000 / 3-degree Gauss-Kruger CM 129E +<4552> +proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# CGCS2000 / 3-degree Gauss-Kruger CM 132E +<4553> +proj=tmerc +lat_0=0 +lon_0=132 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# CGCS2000 / 3-degree Gauss-Kruger CM 135E +<4554> +proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# RRAF 1991 / UTM zone 20N +<4559> +proj=utm +zone=20 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# New Beijing / Gauss-Kruger zone 13 +<4568> +proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=13500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# New Beijing / Gauss-Kruger zone 14 +<4569> +proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=14500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# New Beijing / Gauss-Kruger zone 15 +<4570> +proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=15500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# New Beijing / Gauss-Kruger zone 16 +<4571> +proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=16500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# New Beijing / Gauss-Kruger zone 17 +<4572> +proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=17500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# New Beijing / Gauss-Kruger zone 18 +<4573> +proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=18500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# New Beijing / Gauss-Kruger zone 19 +<4574> +proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=19500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# New Beijing / Gauss-Kruger zone 20 +<4575> +proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=20500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# New Beijing / Gauss-Kruger zone 21 +<4576> +proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=21500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# New Beijing / Gauss-Kruger zone 22 +<4577> +proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=22500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# New Beijing / Gauss-Kruger zone 23 +<4578> +proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=23500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# New Beijing / Gauss-Kruger CM 75E +<4579> +proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# New Beijing / Gauss-Kruger CM 81E +<4580> +proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# New Beijing / Gauss-Kruger CM 87E +<4581> +proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# New Beijing / Gauss-Kruger CM 93E +<4582> +proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# New Beijing / Gauss-Kruger CM 99E +<4583> +proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# New Beijing / Gauss-Kruger CM 105E +<4584> +proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# New Beijing / Gauss-Kruger CM 111E +<4585> +proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# New Beijing / Gauss-Kruger CM 117E +<4586> +proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# New Beijing / Gauss-Kruger CM 123E +<4587> +proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# New Beijing / Gauss-Kruger CM 129E +<4588> +proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# New Beijing / Gauss-Kruger CM 135E +<4589> +proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# ETRS89 / UTM zone 32N (zE-N) +<4647> +proj=tmerc +lat_0=0 +lon_0=9 +k=0.9996 +x_0=32500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# New Beijing / 3-degree Gauss-Kruger zone 25 +<4652> +proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=25500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# New Beijing / 3-degree Gauss-Kruger zone 26 +<4653> +proj=tmerc +lat_0=0 +lon_0=78 +k=1 +x_0=26500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# New Beijing / 3-degree Gauss-Kruger zone 27 +<4654> +proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=27500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# New Beijing / 3-degree Gauss-Kruger zone 28 +<4655> +proj=tmerc +lat_0=0 +lon_0=84 +k=1 +x_0=28500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# New Beijing / 3-degree Gauss-Kruger zone 29 +<4656> +proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=29500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# New Beijing / 3-degree Gauss-Kruger zone 30 +<4766> +proj=tmerc +lat_0=0 +lon_0=90 +k=1 +x_0=30500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# New Beijing / 3-degree Gauss-Kruger zone 31 +<4767> +proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=31500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# New Beijing / 3-degree Gauss-Kruger zone 32 +<4768> +proj=tmerc +lat_0=0 +lon_0=96 +k=1 +x_0=32500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# New Beijing / 3-degree Gauss-Kruger zone 33 +<4769> +proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=33500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# New Beijing / 3-degree Gauss-Kruger zone 34 +<4770> +proj=tmerc +lat_0=0 +lon_0=102 +k=1 +x_0=34500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# New Beijing / 3-degree Gauss-Kruger zone 35 +<4771> +proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=35500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# New Beijing / 3-degree Gauss-Kruger zone 36 +<4772> +proj=tmerc +lat_0=0 +lon_0=108 +k=1 +x_0=36500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# New Beijing / 3-degree Gauss-Kruger zone 37 +<4773> +proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=37500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# New Beijing / 3-degree Gauss-Kruger zone 38 +<4774> +proj=tmerc +lat_0=0 +lon_0=114 +k=1 +x_0=38500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# New Beijing / 3-degree Gauss-Kruger zone 39 +<4775> +proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=39500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# New Beijing / 3-degree Gauss-Kruger zone 40 +<4776> +proj=tmerc +lat_0=0 +lon_0=120 +k=1 +x_0=40500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# New Beijing / 3-degree Gauss-Kruger zone 41 +<4777> +proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=41500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# New Beijing / 3-degree Gauss-Kruger zone 42 +<4778> +proj=tmerc +lat_0=0 +lon_0=126 +k=1 +x_0=42500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# New Beijing / 3-degree Gauss-Kruger zone 43 +<4779> +proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=43500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# New Beijing / 3-degree Gauss-Kruger zone 44 +<4780> +proj=tmerc +lat_0=0 +lon_0=132 +k=1 +x_0=44500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# New Beijing / 3-degree Gauss-Kruger zone 45 +<4781> +proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=45500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# New Beijing / 3-degree Gauss-Kruger CM 75E +<4782> +proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# New Beijing / 3-degree Gauss-Kruger CM 78E +<4783> +proj=tmerc +lat_0=0 +lon_0=78 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# New Beijing / 3-degree Gauss-Kruger CM 81E +<4784> +proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# New Beijing / 3-degree Gauss-Kruger CM 84E +<4785> +proj=tmerc +lat_0=0 +lon_0=84 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# New Beijing / 3-degree Gauss-Kruger CM 87E +<4786> +proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# New Beijing / 3-degree Gauss-Kruger CM 90E +<4787> +proj=tmerc +lat_0=0 +lon_0=90 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# New Beijing / 3-degree Gauss-Kruger CM 93E +<4788> +proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# New Beijing / 3-degree Gauss-Kruger CM 96E +<4789> +proj=tmerc +lat_0=0 +lon_0=96 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# New Beijing / 3-degree Gauss-Kruger CM 99E +<4790> +proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# New Beijing / 3-degree Gauss-Kruger CM 102E +<4791> +proj=tmerc +lat_0=0 +lon_0=102 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# New Beijing / 3-degree Gauss-Kruger CM 105E +<4792> +proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# New Beijing / 3-degree Gauss-Kruger CM 108E +<4793> +proj=tmerc +lat_0=0 +lon_0=108 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# New Beijing / 3-degree Gauss-Kruger CM 111E +<4794> +proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# New Beijing / 3-degree Gauss-Kruger CM 114E +<4795> +proj=tmerc +lat_0=0 +lon_0=114 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# New Beijing / 3-degree Gauss-Kruger CM 117E +<4796> +proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# New Beijing / 3-degree Gauss-Kruger CM 120E +<4797> +proj=tmerc +lat_0=0 +lon_0=120 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# New Beijing / 3-degree Gauss-Kruger CM 123E +<4798> +proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# New Beijing / 3-degree Gauss-Kruger CM 126E +<4799> +proj=tmerc +lat_0=0 +lon_0=126 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# New Beijing / 3-degree Gauss-Kruger CM 129E +<4800> +proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# New Beijing / 3-degree Gauss-Kruger CM 132E +<4812> +proj=tmerc +lat_0=0 +lon_0=132 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# New Beijing / 3-degree Gauss-Kruger CM 135E +<4822> +proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# WGS 84 / Cape Verde National +<4826> +proj=lcc +lat_1=15 +lat_2=16.66666666666667 +lat_0=15.83333333333333 +lon_0=-24 +x_0=161587.83 +y_0=128511.202 +datum=WGS84 +units=m +no_defs <> +# ETRS89 / LCC Germany (N-E) +<4839> +proj=lcc +lat_1=48.66666666666666 +lat_2=53.66666666666666 +lat_0=51 +lon_0=10.5 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / NTM zone 5 (deprecated) +<4855> +proj=tmerc +lat_0=0 +lon_0=5.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / NTM zone 6 (deprecated) +<4856> +proj=tmerc +lat_0=0 +lon_0=6.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / NTM zone 7 (deprecated) +<4857> +proj=tmerc +lat_0=0 +lon_0=7.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / NTM zone 8 (deprecated) +<4858> +proj=tmerc +lat_0=0 +lon_0=8.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / NTM zone 9 (deprecated) +<4859> +proj=tmerc +lat_0=0 +lon_0=9.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / NTM zone 10 (deprecated) +<4860> +proj=tmerc +lat_0=0 +lon_0=10.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / NTM zone 11 (deprecated) +<4861> +proj=tmerc +lat_0=0 +lon_0=11.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / NTM zone 12 (deprecated) +<4862> +proj=tmerc +lat_0=0 +lon_0=12.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / NTM zone 13 (deprecated) +<4863> +proj=tmerc +lat_0=0 +lon_0=13.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / NTM zone 14 (deprecated) +<4864> +proj=tmerc +lat_0=0 +lon_0=14.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / NTM zone 15 (deprecated) +<4865> +proj=tmerc +lat_0=0 +lon_0=15.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / NTM zone 16 (deprecated) +<4866> +proj=tmerc +lat_0=0 +lon_0=16.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / NTM zone 17 (deprecated) +<4867> +proj=tmerc +lat_0=0 +lon_0=17.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / NTM zone 18 (deprecated) +<4868> +proj=tmerc +lat_0=0 +lon_0=18.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / NTM zone 19 (deprecated) +<4869> +proj=tmerc +lat_0=0 +lon_0=19.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / NTM zone 20 (deprecated) +<4870> +proj=tmerc +lat_0=0 +lon_0=20.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / NTM zone 21 (deprecated) +<4871> +proj=tmerc +lat_0=0 +lon_0=21.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / NTM zone 22 (deprecated) +<4872> +proj=tmerc +lat_0=0 +lon_0=22.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / NTM zone 23 (deprecated) +<4873> +proj=tmerc +lat_0=0 +lon_0=23.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / NTM zone 24 (deprecated) +<4874> +proj=tmerc +lat_0=0 +lon_0=24.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / NTM zone 25 (deprecated) +<4875> +proj=tmerc +lat_0=0 +lon_0=25.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / NTM zone 26 (deprecated) +<4876> +proj=tmerc +lat_0=0 +lon_0=26.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / NTM zone 27 (deprecated) +<4877> +proj=tmerc +lat_0=0 +lon_0=27.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / NTM zone 28 (deprecated) +<4878> +proj=tmerc +lat_0=0 +lon_0=28.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / NTM zone 29 (deprecated) +<4879> +proj=tmerc +lat_0=0 +lon_0=29.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / NTM zone 30 (deprecated) +<4880> +proj=tmerc +lat_0=0 +lon_0=30.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# PTRA08 / UTM zone 25N +<5014> +proj=utm +zone=25 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# PTRA08 / UTM zone 26N +<5015> +proj=utm +zone=26 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# PTRA08 / UTM zone 28N +<5016> +proj=utm +zone=28 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Lisbon 1890 / Portugal Bonne New +# Unable to translate coordinate system EPSG:5017 into PROJ.4 format. +# +# Lisbon / Portuguese Grid New +<5018> +proj=tmerc +lat_0=39.66666666666666 +lon_0=-8.131906111111112 +k=1 +x_0=0 +y_0=0 +ellps=intl +towgs84=-304.046,-60.576,103.64,0,0,0,0 +units=m +no_defs <> +# WGS 84 / UPS North (E,N) +<5041> +proj=stere +lat_0=90 +lat_ts=90 +lon_0=0 +k=0.994 +x_0=2000000 +y_0=2000000 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UPS South (E,N) +<5042> +proj=stere +lat_0=-90 +lat_ts=-90 +lon_0=0 +k=0.994 +x_0=2000000 +y_0=2000000 +datum=WGS84 +units=m +no_defs <> +# ETRS89 / TM35FIN(N,E) +<5048> +proj=utm +zone=35 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD27 / Conus Albers +<5069> +proj=aea +lat_1=29.5 +lat_2=45.5 +lat_0=23 +lon_0=-96 +x_0=0 +y_0=0 +datum=NAD27 +units=m +no_defs <> +# NAD83 / Conus Albers +<5070> +proj=aea +lat_1=29.5 +lat_2=45.5 +lat_0=23 +lon_0=-96 +x_0=0 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83(HARN) / Conus Albers +<5071> +proj=aea +lat_1=29.5 +lat_2=45.5 +lat_0=23 +lon_0=-96 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Conus Albers +<5072> +proj=aea +lat_1=29.5 +lat_2=45.5 +lat_0=23 +lon_0=-96 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / NTM zone 5 +<5105> +proj=tmerc +lat_0=58 +lon_0=5.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / NTM zone 6 +<5106> +proj=tmerc +lat_0=58 +lon_0=6.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / NTM zone 7 +<5107> +proj=tmerc +lat_0=58 +lon_0=7.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / NTM zone 8 +<5108> +proj=tmerc +lat_0=58 +lon_0=8.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / NTM zone 9 +<5109> +proj=tmerc +lat_0=58 +lon_0=9.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / NTM zone 10 +<5110> +proj=tmerc +lat_0=58 +lon_0=10.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / NTM zone 11 +<5111> +proj=tmerc +lat_0=58 +lon_0=11.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / NTM zone 12 +<5112> +proj=tmerc +lat_0=58 +lon_0=12.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / NTM zone 13 +<5113> +proj=tmerc +lat_0=58 +lon_0=13.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / NTM zone 14 +<5114> +proj=tmerc +lat_0=58 +lon_0=14.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / NTM zone 15 +<5115> +proj=tmerc +lat_0=58 +lon_0=15.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / NTM zone 16 +<5116> +proj=tmerc +lat_0=58 +lon_0=16.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / NTM zone 17 +<5117> +proj=tmerc +lat_0=58 +lon_0=17.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / NTM zone 18 +<5118> +proj=tmerc +lat_0=58 +lon_0=18.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / NTM zone 19 +<5119> +proj=tmerc +lat_0=58 +lon_0=19.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / NTM zone 20 +<5120> +proj=tmerc +lat_0=58 +lon_0=20.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / NTM zone 21 +<5121> +proj=tmerc +lat_0=58 +lon_0=21.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / NTM zone 22 +<5122> +proj=tmerc +lat_0=58 +lon_0=22.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / NTM zone 23 +<5123> +proj=tmerc +lat_0=58 +lon_0=23.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / NTM zone 24 +<5124> +proj=tmerc +lat_0=58 +lon_0=24.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / NTM zone 25 +<5125> +proj=tmerc +lat_0=58 +lon_0=25.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / NTM zone 26 +<5126> +proj=tmerc +lat_0=58 +lon_0=26.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / NTM zone 27 +<5127> +proj=tmerc +lat_0=58 +lon_0=27.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / NTM zone 28 +<5128> +proj=tmerc +lat_0=58 +lon_0=28.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / NTM zone 29 +<5129> +proj=tmerc +lat_0=58 +lon_0=29.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / NTM zone 30 +<5130> +proj=tmerc +lat_0=58 +lon_0=30.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Korean 1985 / East Sea Belt +<5167> +proj=tmerc +lat_0=38 +lon_0=131 +k=1 +x_0=200000 +y_0=500000 +ellps=bessel +units=m +no_defs <> +# Korean 1985 / Central Belt Jeju +<5168> +proj=tmerc +lat_0=38 +lon_0=127 +k=1 +x_0=200000 +y_0=550000 +ellps=bessel +units=m +no_defs <> +# Tokyo 1892 / Korea West Belt +<5169> +proj=tmerc +lat_0=38 +lon_0=125 +k=1 +x_0=200000 +y_0=500000 +ellps=bessel +units=m +no_defs <> +# Tokyo 1892 / Korea Central Belt +<5170> +proj=tmerc +lat_0=38 +lon_0=127 +k=1 +x_0=200000 +y_0=500000 +ellps=bessel +units=m +no_defs <> +# Tokyo 1892 / Korea East Belt +<5171> +proj=tmerc +lat_0=38 +lon_0=129 +k=1 +x_0=200000 +y_0=500000 +ellps=bessel +units=m +no_defs <> +# Tokyo 1892 / Korea East Sea Belt +<5172> +proj=tmerc +lat_0=38 +lon_0=131 +k=1 +x_0=200000 +y_0=500000 +ellps=bessel +units=m +no_defs <> +# Korean 1985 / Modified West Belt +<5173> +proj=tmerc +lat_0=38 +lon_0=125.0028902777778 +k=1 +x_0=200000 +y_0=500000 +ellps=bessel +units=m +no_defs <> +# Korean 1985 / Modified Central Belt +<5174> +proj=tmerc +lat_0=38 +lon_0=127.0028902777778 +k=1 +x_0=200000 +y_0=500000 +ellps=bessel +units=m +no_defs <> +# Korean 1985 / Modified Central Belt Jeju +<5175> +proj=tmerc +lat_0=38 +lon_0=127.0028902777778 +k=1 +x_0=200000 +y_0=550000 +ellps=bessel +units=m +no_defs <> +# Korean 1985 / Modified East Belt +<5176> +proj=tmerc +lat_0=38 +lon_0=129.0028902777778 +k=1 +x_0=200000 +y_0=500000 +ellps=bessel +units=m +no_defs <> +# Korean 1985 / Modified East Sea Belt +<5177> +proj=tmerc +lat_0=38 +lon_0=131.0028902777778 +k=1 +x_0=200000 +y_0=500000 +ellps=bessel +units=m +no_defs <> +# Korean 1985 / Unified CS +<5178> +proj=tmerc +lat_0=38 +lon_0=127.5 +k=0.9996 +x_0=1000000 +y_0=2000000 +ellps=bessel +units=m +no_defs <> +# Korea 2000 / Unified CS +<5179> +proj=tmerc +lat_0=38 +lon_0=127.5 +k=0.9996 +x_0=1000000 +y_0=2000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Korea 2000 / West Belt +<5180> +proj=tmerc +lat_0=38 +lon_0=125 +k=1 +x_0=200000 +y_0=500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Korea 2000 / Central Belt +<5181> +proj=tmerc +lat_0=38 +lon_0=127 +k=1 +x_0=200000 +y_0=500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Korea 2000 / Central Belt Jeju +<5182> +proj=tmerc +lat_0=38 +lon_0=127 +k=1 +x_0=200000 +y_0=550000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Korea 2000 / East Belt +<5183> +proj=tmerc +lat_0=38 +lon_0=129 +k=1 +x_0=200000 +y_0=500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Korea 2000 / East Sea Belt +<5184> +proj=tmerc +lat_0=38 +lon_0=131 +k=1 +x_0=200000 +y_0=500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Korea 2000 / West Belt 2010 +<5185> +proj=tmerc +lat_0=38 +lon_0=125 +k=1 +x_0=200000 +y_0=600000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Korea 2000 / Central Belt 2010 +<5186> +proj=tmerc +lat_0=38 +lon_0=127 +k=1 +x_0=200000 +y_0=600000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Korea 2000 / East Belt 2010 +<5187> +proj=tmerc +lat_0=38 +lon_0=129 +k=1 +x_0=200000 +y_0=600000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Korea 2000 / East Sea Belt 2010 +<5188> +proj=tmerc +lat_0=38 +lon_0=131 +k=1 +x_0=200000 +y_0=600000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# S-JTSK (Ferro) / Krovak East North +<5221> +proj=krovak +lat_0=49.5 +lon_0=42.5 +alpha=30.28813972222222 +k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +towgs84=589,76,480,0,0,0,0 +pm=ferro +units=m +no_defs <> +# WGS 84 / Gabon TM +<5223> +proj=tmerc +lat_0=0 +lon_0=12 +k=0.9996 +x_0=500000 +y_0=500000 +datum=WGS84 +units=m +no_defs <> +# S-JTSK/05 (Ferro) / Modified Krovak +# Unable to translate coordinate system EPSG:5224 into PROJ.4 format. +# +# S-JTSK/05 (Ferro) / Modified Krovak East North +# Unable to translate coordinate system EPSG:5225 into PROJ.4 format. +# +# Kandawala / Sri Lanka Grid +<5234> +proj=tmerc +lat_0=7.000480277777778 +lon_0=80.77171111111112 +k=0.9999238418 +x_0=200000 +y_0=200000 +a=6377276.345 +b=6356075.41314024 +towgs84=-97,787,86,0,0,0,0 +units=m +no_defs <> +# SLD99 / Sri Lanka Grid 1999 +<5235> +proj=tmerc +lat_0=7.000471527777778 +lon_0=80.77171308333334 +k=0.9999238418 +x_0=500000 +y_0=500000 +a=6377276.345 +b=6356075.41314024 +towgs84=-0.293,766.95,87.713,0.195704,1.695068,3.473016,-0.039338 +units=m +no_defs <> +# ETRS89 / LCC Germany (E-N) +<5243> +proj=lcc +lat_1=48.66666666666666 +lat_2=53.66666666666666 +lat_0=51 +lon_0=10.5 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# GDBD2009 / Brunei BRSO +<5247> +proj=omerc +lat_0=4 +lonc=115 +alpha=53.31580995 +k=0.99984 +x_0=0 +y_0=0 +no_uoff +gamma=53.13010236111111 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# TUREF / TM27 +<5253> +proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# TUREF / TM30 +<5254> +proj=tmerc +lat_0=0 +lon_0=30 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# TUREF / TM33 +<5255> +proj=tmerc +lat_0=0 +lon_0=33 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# TUREF / TM36 +<5256> +proj=tmerc +lat_0=0 +lon_0=36 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# TUREF / TM39 +<5257> +proj=tmerc +lat_0=0 +lon_0=39 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# TUREF / TM42 +<5258> +proj=tmerc +lat_0=0 +lon_0=42 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# TUREF / TM45 +<5259> +proj=tmerc +lat_0=0 +lon_0=45 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# DRUKREF 03 / Bhutan National Grid +<5266> +proj=tmerc +lat_0=0 +lon_0=90 +k=1 +x_0=250000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# TUREF / 3-degree Gauss-Kruger zone 9 +<5269> +proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=9500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# TUREF / 3-degree Gauss-Kruger zone 10 +<5270> +proj=tmerc +lat_0=0 +lon_0=30 +k=1 +x_0=10500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# TUREF / 3-degree Gauss-Kruger zone 11 +<5271> +proj=tmerc +lat_0=0 +lon_0=33 +k=1 +x_0=11500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# TUREF / 3-degree Gauss-Kruger zone 12 +<5272> +proj=tmerc +lat_0=0 +lon_0=36 +k=1 +x_0=12500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# TUREF / 3-degree Gauss-Kruger zone 13 +<5273> +proj=tmerc +lat_0=0 +lon_0=39 +k=1 +x_0=13500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# TUREF / 3-degree Gauss-Kruger zone 14 +<5274> +proj=tmerc +lat_0=0 +lon_0=42 +k=1 +x_0=14500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# TUREF / 3-degree Gauss-Kruger zone 15 +<5275> +proj=tmerc +lat_0=0 +lon_0=45 +k=1 +x_0=15500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# DRUKREF 03 / Bumthang TM +<5292> +proj=tmerc +lat_0=0 +lon_0=90.73333333333333 +k=1 +x_0=250000 +y_0=-2500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# DRUKREF 03 / Chhukha TM +<5293> +proj=tmerc +lat_0=0 +lon_0=89.55 +k=1 +x_0=250000 +y_0=-2500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# DRUKREF 03 / Dagana TM +<5294> +proj=tmerc +lat_0=0 +lon_0=89.84999999999999 +k=1 +x_0=250000 +y_0=-2500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# DRUKREF 03 / Gasa TM +<5295> +proj=tmerc +lat_0=0 +lon_0=90.03333333333333 +k=1 +x_0=250000 +y_0=-2500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# DRUKREF 03 / Ha TM +<5296> +proj=tmerc +lat_0=0 +lon_0=90.15000000000001 +k=1 +x_0=250000 +y_0=-2500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# DRUKREF 03 / Lhuentse TM +<5297> +proj=tmerc +lat_0=0 +lon_0=91.13333333333334 +k=1 +x_0=250000 +y_0=-2500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# DRUKREF 03 / Mongar TM +<5298> +proj=tmerc +lat_0=0 +lon_0=91.23333333333333 +k=1 +x_0=250000 +y_0=-2500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# DRUKREF 03 / Paro TM +<5299> +proj=tmerc +lat_0=0 +lon_0=89.34999999999999 +k=1 +x_0=250000 +y_0=-2500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# DRUKREF 03 / Pemagatshel TM +<5300> +proj=tmerc +lat_0=0 +lon_0=91.34999999999999 +k=1 +x_0=250000 +y_0=-2500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# DRUKREF 03 / Punakha TM +<5301> +proj=tmerc +lat_0=0 +lon_0=89.84999999999999 +k=1 +x_0=250000 +y_0=-2500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# DRUKREF 03 / Samdrup Jongkhar TM +<5302> +proj=tmerc +lat_0=0 +lon_0=91.56666666666666 +k=1 +x_0=250000 +y_0=-2500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# DRUKREF 03 / Samtse TM +<5303> +proj=tmerc +lat_0=0 +lon_0=89.06666666666666 +k=1 +x_0=250000 +y_0=-2500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# DRUKREF 03 / Sarpang TM +<5304> +proj=tmerc +lat_0=0 +lon_0=90.26666666666667 +k=1 +x_0=250000 +y_0=-2500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# DRUKREF 03 / Thimphu TM +<5305> +proj=tmerc +lat_0=0 +lon_0=89.55 +k=1 +x_0=250000 +y_0=-2500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# DRUKREF 03 / Trashigang TM +<5306> +proj=tmerc +lat_0=0 +lon_0=91.75 +k=1 +x_0=250000 +y_0=-2500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# DRUKREF 03 / Trongsa TM +<5307> +proj=tmerc +lat_0=0 +lon_0=90.5 +k=1 +x_0=250000 +y_0=-2500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# DRUKREF 03 / Tsirang TM +<5308> +proj=tmerc +lat_0=0 +lon_0=90.16666666666667 +k=1 +x_0=250000 +y_0=-2500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# DRUKREF 03 / Wangdue Phodrang TM +<5309> +proj=tmerc +lat_0=0 +lon_0=90.11666666666666 +k=1 +x_0=250000 +y_0=-2500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# DRUKREF 03 / Yangtse TM +<5310> +proj=tmerc +lat_0=0 +lon_0=91.56666666666666 +k=1 +x_0=250000 +y_0=-2500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# DRUKREF 03 / Zhemgang TM +<5311> +proj=tmerc +lat_0=0 +lon_0=90.86666666666666 +k=1 +x_0=250000 +y_0=-2500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / Faroe TM +<5316> +proj=tmerc +lat_0=0 +lon_0=-7 +k=0.999997 +x_0=200000 +y_0=-6000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83 / Teranet Ontario Lambert +<5320> +proj=lcc +lat_1=44.5 +lat_2=54.5 +lat_0=0 +lon_0=-84 +x_0=1000000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83(CSRS) / Teranet Ontario Lambert +<5321> +proj=lcc +lat_1=44.5 +lat_2=54.5 +lat_0=0 +lon_0=-84 +x_0=1000000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ISN2004 / Lambert 2004 +<5325> +proj=lcc +lat_1=64.25 +lat_2=65.75 +lat_0=65 +lon_0=-19 +x_0=1700000 +y_0=300000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Segara (Jakarta) / NEIEZ +<5329> +proj=merc +lon_0=3.192280555555556 +k=0.997 +x_0=3900000 +y_0=900000 +ellps=bessel +towgs84=-403,684,41,0,0,0,0 +pm=jakarta +units=m +no_defs <> +# Batavia (Jakarta) / NEIEZ +<5330> +proj=merc +lon_0=3.192280555555556 +k=0.997 +x_0=3900000 +y_0=900000 +ellps=bessel +towgs84=-377,681,-50,0,0,0,0 +pm=jakarta +units=m +no_defs <> +# Makassar (Jakarta) / NEIEZ +<5331> +proj=merc +lon_0=3.192280555555556 +k=0.997 +x_0=3900000 +y_0=900000 +ellps=bessel +towgs84=-587.8,519.75,145.76,0,0,0,0 +pm=jakarta +units=m +no_defs <> +# Aratu / UTM zone 25S +<5337> +proj=utm +zone=25 +south +ellps=intl +towgs84=-151.99,287.04,-147.45,0,0,0,0 +units=m +no_defs <> +# POSGAR 2007 / Argentina 1 +<5343> +proj=tmerc +lat_0=-90 +lon_0=-72 +k=1 +x_0=1500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# POSGAR 2007 / Argentina 2 +<5344> +proj=tmerc +lat_0=-90 +lon_0=-69 +k=1 +x_0=2500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# POSGAR 2007 / Argentina 3 +<5345> +proj=tmerc +lat_0=-90 +lon_0=-66 +k=1 +x_0=3500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# POSGAR 2007 / Argentina 4 +<5346> +proj=tmerc +lat_0=-90 +lon_0=-63 +k=1 +x_0=4500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# POSGAR 2007 / Argentina 5 +<5347> +proj=tmerc +lat_0=-90 +lon_0=-60 +k=1 +x_0=5500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# POSGAR 2007 / Argentina 6 +<5348> +proj=tmerc +lat_0=-90 +lon_0=-57 +k=1 +x_0=6500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# POSGAR 2007 / Argentina 7 +<5349> +proj=tmerc +lat_0=-90 +lon_0=-54 +k=1 +x_0=7500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# MARGEN / UTM zone 20S +<5355> +proj=utm +zone=20 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# MARGEN / UTM zone 19S +<5356> +proj=utm +zone=19 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# MARGEN / UTM zone 21S +<5357> +proj=utm +zone=21 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# SIRGAS-Chile / UTM zone 19S +<5361> +proj=utm +zone=19 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# SIRGAS-Chile / UTM zone 18S +<5362> +proj=utm +zone=18 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# CR05 / CRTM05 +<5367> +proj=tmerc +lat_0=0 +lon_0=-84 +k=0.9999 +x_0=500000 +y_0=0 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# SIRGAS-ROU98 / UTM zone 21S +<5382> +proj=utm +zone=21 +south +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# SIRGAS-ROU98 / UTM zone 22S +<5383> +proj=utm +zone=22 +south +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Peru96 / UTM zone 18S +<5387> +proj=utm +zone=18 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Peru96 / UTM zone 17S (deprecated) +<5388> +proj=utm +zone=17 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Peru96 / UTM zone 19S +<5389> +proj=utm +zone=19 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# SIRGAS 2000 / UTM zone 26S +<5396> +proj=utm +zone=26 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Ocotepeque 1935 / Costa Rica Norte +<5456> +proj=lcc +lat_1=10.46666666666667 +lat_0=10.46666666666667 +lon_0=-84.33333333333333 +k_0=0.99995696 +x_0=500000 +y_0=271820.522 +ellps=clrk66 +towgs84=205,96,-98,0,0,0,0 +units=m +no_defs <> +# Ocotepeque 1935 / Costa Rica Sur +<5457> +proj=lcc +lat_1=9 +lat_0=9 +lon_0=-83.66666666666667 +k_0=0.99995696 +x_0=500000 +y_0=327987.436 +ellps=clrk66 +towgs84=205,96,-98,0,0,0,0 +units=m +no_defs <> +# Ocotepeque 1935 / Guatemala Norte (deprecated) +<5458> +proj=lcc +lat_1=16.81666666666667 +lat_0=16.81666666666667 +lon_0=-90.33333333333333 +k_0=0.99992226 +x_0=500000 +y_0=292209.579 +datum=NAD27 +units=m +no_defs <> +# Ocotepeque 1935 / Guatemala Sur +<5459> +proj=lcc +lat_1=14.9 +lat_0=14.9 +lon_0=-90.33333333333333 +k_0=0.99989906 +x_0=500000 +y_0=325992.681 +ellps=clrk66 +towgs84=205,96,-98,0,0,0,0 +units=m +no_defs <> +# Ocotepeque 1935 / El Salvador Lambert +<5460> +proj=lcc +lat_1=13.78333333333333 +lat_0=13.78333333333333 +lon_0=-89 +k_0=0.99996704 +x_0=500000 +y_0=295809.184 +ellps=clrk66 +towgs84=205,96,-98,0,0,0,0 +units=m +no_defs <> +# Ocotepeque 1935 / Nicaragua Norte +<5461> +proj=lcc +lat_1=13.86666666666667 +lat_0=13.86666666666667 +lon_0=-85.5 +k_0=0.99990314 +x_0=500000 +y_0=359891.816 +ellps=clrk66 +towgs84=205,96,-98,0,0,0,0 +units=m +no_defs <> +# Ocotepeque 1935 / Nicaragua Sur +<5462> +proj=lcc +lat_1=11.73333333333333 +lat_0=11.73333333333333 +lon_0=-85.5 +k_0=0.9999222800000001 +x_0=500000 +y_0=288876.327 +ellps=clrk66 +towgs84=205,96,-98,0,0,0,0 +units=m +no_defs <> +# SAD69 / UTM zone 17N +<5463> +proj=utm +zone=17 +ellps=aust_SA +towgs84=-66.87,4.37,-38.52,0,0,0,0 +units=m +no_defs <> +# Sibun Gorge 1922 / Colony Grid (deprecated) +<5466> +proj=tmerc +lat_0=17.06124194444444 +lon_0=-88.6318575 +k=1 +x_0=66220.02833082761 +y_0=135779.5099885299 +a=6378293.645208759 +b=6356617.987679838 +units=m +no_defs <> +# Panama-Colon 1911 / Panama Lambert +<5469> +proj=lcc +lat_1=8.416666666666666 +lat_0=8.416666666666666 +lon_0=-80 +k_0=0.99989909 +x_0=500000 +y_0=294865.303 +ellps=clrk66 +units=m +no_defs <> +# Panama-Colon 1911 / Panama Polyconic +<5472> +proj=poly +lat_0=8.25 +lon_0=-81 +x_0=914391.7962 +y_0=999404.7217154861 +ellps=clrk66 +to_meter=0.9143917962 +no_defs <> +# RSRGD2000 / MSLC2000 +<5479> +proj=lcc +lat_1=-76.66666666666667 +lat_2=-79.33333333333333 +lat_0=-78 +lon_0=163 +x_0=7000000 +y_0=5000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# RSRGD2000 / BCLC2000 +<5480> +proj=lcc +lat_1=-73.66666666666667 +lat_2=-75.33333333333333 +lat_0=-74.5 +lon_0=165 +x_0=5000000 +y_0=3000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# RSRGD2000 / PCLC2000 +<5481> +proj=lcc +lat_1=-70.66666666666667 +lat_2=-72.33333333333333 +lat_0=-71.5 +lon_0=166 +x_0=3000000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# RSRGD2000 / RSPS2000 +<5482> +proj=stere +lat_0=-90 +lat_ts=-90 +lon_0=180 +k=0.994 +x_0=5000000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# RGAF09 / UTM zone 20N +<5490> +proj=utm +zone=20 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# S-JTSK / Krovak +<5513> +proj=krovak +lat_0=49.5 +lon_0=24.83333333333333 +alpha=30.28813972222222 +k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +towgs84=589,76,480,0,0,0,0 +units=m +no_defs <> +# S-JTSK / Krovak East North +<5514> +proj=krovak +lat_0=49.5 +lon_0=24.83333333333333 +alpha=30.28813972222222 +k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +towgs84=589,76,480,0,0,0,0 +units=m +no_defs <> +# S-JTSK/05 / Modified Krovak +# Unable to translate coordinate system EPSG:5515 into PROJ.4 format. +# +# S-JTSK/05 / Modified Krovak East North +# Unable to translate coordinate system EPSG:5516 into PROJ.4 format. +# +# CI1971 / Chatham Islands Map Grid +<5518> +proj=tmerc +lat_0=-44 +lon_0=-176.5 +k=1 +x_0=350000 +y_0=650000 +ellps=intl +towgs84=175,-38,113,0,0,0,0 +units=m +no_defs <> +# CI1979 / Chatham Islands Map Grid +<5519> +proj=tmerc +lat_0=-44 +lon_0=-176.5 +k=1 +x_0=350000 +y_0=650000 +ellps=intl +towgs84=174.05,-25.49,112.57,0,0,0.554,0.2263 +units=m +no_defs <> +# DHDN / 3-degree Gauss-Kruger zone 1 +<5520> +proj=tmerc +lat_0=0 +lon_0=3 +k=1 +x_0=1500000 +y_0=0 +datum=potsdam +units=m +no_defs <> +# WGS 84 / Gabon TM 2011 +<5523> +proj=tmerc +lat_0=0 +lon_0=11.5 +k=0.9996 +x_0=1500000 +y_0=5500000 +datum=WGS84 +units=m +no_defs <> +# SAD69(96) / Brazil Polyconic +<5530> +proj=poly +lat_0=0 +lon_0=-54 +x_0=5000000 +y_0=10000000 +ellps=aust_SA +towgs84=-67.35,3.88,-38.22,0,0,0,0 +units=m +no_defs <> +# SAD69(96) / UTM zone 21S +<5531> +proj=utm +zone=21 +south +ellps=aust_SA +towgs84=-67.35,3.88,-38.22,0,0,0,0 +units=m +no_defs <> +# SAD69(96) / UTM zone 22S (deprecated) +<5532> +proj=utm +zone=22 +south +ellps=aust_SA +towgs84=-66.87,4.37,-38.52,0,0,0,0 +units=m +no_defs <> +# SAD69(96) / UTM zone 23S +<5533> +proj=utm +zone=23 +south +ellps=aust_SA +towgs84=-67.35,3.88,-38.22,0,0,0,0 +units=m +no_defs <> +# SAD69(96) / UTM zone 24S +<5534> +proj=utm +zone=24 +south +ellps=aust_SA +towgs84=-67.35,3.88,-38.22,0,0,0,0 +units=m +no_defs <> +# SAD69(96) / UTM zone 25S +<5535> +proj=utm +zone=25 +south +ellps=aust_SA +towgs84=-67.35,3.88,-38.22,0,0,0,0 +units=m +no_defs <> +# Corrego Alegre 1961 / UTM zone 21S +<5536> +proj=utm +zone=21 +south +ellps=intl +units=m +no_defs <> +# Corrego Alegre 1961 / UTM zone 22S +<5537> +proj=utm +zone=22 +south +ellps=intl +units=m +no_defs <> +# Corrego Alegre 1961 / UTM zone 23S +<5538> +proj=utm +zone=23 +south +ellps=intl +units=m +no_defs <> +# Corrego Alegre 1961 / UTM zone 24S +<5539> +proj=utm +zone=24 +south +ellps=intl +units=m +no_defs <> +# PNG94 / PNGMG94 zone 54 +<5550> +proj=utm +zone=54 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# PNG94 / PNGMG94 zone 55 +<5551> +proj=utm +zone=55 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# PNG94 / PNGMG94 zone 56 +<5552> +proj=utm +zone=56 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Ocotepeque 1935 / Guatemala Norte +<5559> +proj=lcc +lat_1=16.81666666666667 +lat_0=16.81666666666667 +lon_0=-90.33333333333333 +k_0=0.99992226 +x_0=500000 +y_0=292209.579 +ellps=clrk66 +towgs84=205,96,-98,0,0,0,0 +units=m +no_defs <> +# UCS-2000 / Gauss-Kruger zone 4 +<5562> +proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=4500000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,0,0.35,0.736,0 +units=m +no_defs <> +# UCS-2000 / Gauss-Kruger zone 5 +<5563> +proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=5500000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,0,0.35,0.736,0 +units=m +no_defs <> +# UCS-2000 / Gauss-Kruger zone 6 +<5564> +proj=tmerc +lat_0=0 +lon_0=33 +k=1 +x_0=6500000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,0,0.35,0.736,0 +units=m +no_defs <> +# UCS-2000 / Gauss-Kruger zone 7 +<5565> +proj=tmerc +lat_0=0 +lon_0=39 +k=1 +x_0=7500000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,0,0.35,0.736,0 +units=m +no_defs <> +# UCS-2000 / Gauss-Kruger CM 21E +<5566> +proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,0,0.35,0.736,0 +units=m +no_defs <> +# UCS-2000 / Gauss-Kruger CM 27E +<5567> +proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,0,0.35,0.736,0 +units=m +no_defs <> +# UCS-2000 / Gauss-Kruger CM 33E +<5568> +proj=tmerc +lat_0=0 +lon_0=33 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,0,0.35,0.736,0 +units=m +no_defs <> +# UCS-2000 / Gauss-Kruger CM 39E +<5569> +proj=tmerc +lat_0=0 +lon_0=39 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,0,0.35,0.736,0 +units=m +no_defs <> +# UCS-2000 / 3-degree Gauss-Kruger zone 7 (deprecated) +<5570> +proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=7500000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,0,0.35,0.736,0 +units=m +no_defs <> +# UCS-2000 / 3-degree Gauss-Kruger zone 8 (deprecated) +<5571> +proj=tmerc +lat_0=0 +lon_0=24 +k=1 +x_0=8500000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,0,0.35,0.736,0 +units=m +no_defs <> +# UCS-2000 / 3-degree Gauss-Kruger zone 9 (deprecated) +<5572> +proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=9500000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,0,0.35,0.736,0 +units=m +no_defs <> +# UCS-2000 / 3-degree Gauss-Kruger zone 10 (deprecated) +<5573> +proj=tmerc +lat_0=0 +lon_0=30 +k=1 +x_0=10500000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,0,0.35,0.736,0 +units=m +no_defs <> +# UCS-2000 / 3-degree Gauss-Kruger zone 11 (deprecated) +<5574> +proj=tmerc +lat_0=0 +lon_0=33 +k=1 +x_0=11500000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,0,0.35,0.736,0 +units=m +no_defs <> +# UCS-2000 / 3-degree Gauss-Kruger zone 12 (deprecated) +<5575> +proj=tmerc +lat_0=0 +lon_0=36 +k=1 +x_0=12500000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,0,0.35,0.736,0 +units=m +no_defs <> +# UCS-2000 / 3-degree Gauss-Kruger zone 13 (deprecated) +<5576> +proj=tmerc +lat_0=0 +lon_0=39 +k=1 +x_0=13500000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,0,0.35,0.736,0 +units=m +no_defs <> +# UCS-2000 / 3-degree Gauss-Kruger CM 21E (deprecated) +<5577> +proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,0,0.35,0.736,0 +units=m +no_defs <> +# UCS-2000 / 3-degree Gauss-Kruger CM 24E (deprecated) +<5578> +proj=tmerc +lat_0=0 +lon_0=24 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,0,0.35,0.736,0 +units=m +no_defs <> +# UCS-2000 / 3-degree Gauss-Kruger CM 27E (deprecated) +<5579> +proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,0,0.35,0.736,0 +units=m +no_defs <> +# UCS-2000 / 3-degree Gauss-Kruger CM 30E (deprecated) +<5580> +proj=tmerc +lat_0=0 +lon_0=30 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,0,0.35,0.736,0 +units=m +no_defs <> +# UCS-2000 / 3-degree Gauss-Kruger CM 33E (deprecated) +<5581> +proj=tmerc +lat_0=0 +lon_0=33 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,0,0.35,0.736,0 +units=m +no_defs <> +# UCS-2000 / 3-degree Gauss-Kruger CM 36E (deprecated) +<5582> +proj=tmerc +lat_0=0 +lon_0=36 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,0,0.35,0.736,0 +units=m +no_defs <> +# UCS-2000 / 3-degree Gauss-Kruger CM 39E (deprecated) +<5583> +proj=tmerc +lat_0=0 +lon_0=39 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,0,0.35,0.736,0 +units=m +no_defs <> +# NAD27 / New Brunswick Stereographic (NAD27) +<5588> +proj=sterea +lat_0=46.5 +lon_0=-66.5 +k=0.999912 +x_0=304800 +y_0=304800 +datum=NAD27 +units=ft +no_defs <> +# Sibun Gorge 1922 / Colony Grid +<5589> +proj=tmerc +lat_0=17.06124194444444 +lon_0=-88.6318575 +k=1 +x_0=66220.02833082761 +y_0=135779.5099885299 +a=6378293.645208759 +b=6356617.987679838 +to_meter=0.3047972654 +no_defs <> +# FEH2010 / Fehmarnbelt TM +<5596> +proj=tmerc +lat_0=0 +lon_0=11.33333333333333 +k=1 +x_0=1000000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD27 / Michigan East +<5623> +proj=tmerc +lat_0=41.5 +lon_0=-83.66666666666667 +k=0.999942857 +x_0=152400.3048006096 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Michigan Old Central +<5624> +proj=tmerc +lat_0=41.5 +lon_0=-85.75 +k=0.999909091 +x_0=152400.3048006096 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Michigan West +<5625> +proj=tmerc +lat_0=41.5 +lon_0=-88.75 +k=0.999909091 +x_0=152400.3048006096 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# ED50 / TM 6 NE +<5627> +proj=tmerc +lat_0=0 +lon_0=6 +k=0.9996 +x_0=500000 +y_0=0 +ellps=intl +towgs84=-87,-98,-121,0,0,0,0 +units=m +no_defs <> +# Moznet / UTM zone 38S +<5629> +proj=utm +zone=38 +south +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Pulkovo 1942(58) / Gauss-Kruger zone 2 (E-N) +<5631> +proj=tmerc +lat_0=0 +lon_0=9 +k=1 +x_0=2500000 +y_0=0 +ellps=krass +towgs84=33.4,-146.6,-76.3,-0.359,-0.053,0.844,-0.84 +units=m +no_defs <> +# PTRA08 / LCC Europe +<5632> +proj=lcc +lat_1=35 +lat_2=65 +lat_0=52 +lon_0=10 +x_0=4000000 +y_0=2800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# PTRA08 / LAEA Europe +<5633> +proj=laea +lat_0=52 +lon_0=10 +x_0=4321000 +y_0=3210000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# REGCAN95 / LCC Europe +<5634> +proj=lcc +lat_1=35 +lat_2=65 +lat_0=52 +lon_0=10 +x_0=4000000 +y_0=2800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# REGCAN95 / LAEA Europe +<5635> +proj=laea +lat_0=52 +lon_0=10 +x_0=4321000 +y_0=3210000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# TUREF / LAEA Europe +<5636> +proj=laea +lat_0=52 +lon_0=10 +x_0=4321000 +y_0=3210000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# TUREF / LCC Europe +<5637> +proj=lcc +lat_1=35 +lat_2=65 +lat_0=52 +lon_0=10 +x_0=4000000 +y_0=2800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ISN2004 / LAEA Europe +<5638> +proj=laea +lat_0=52 +lon_0=10 +x_0=4321000 +y_0=3210000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ISN2004 / LCC Europe +<5639> +proj=lcc +lat_1=35 +lat_2=65 +lat_0=52 +lon_0=10 +x_0=4000000 +y_0=2800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# SIRGAS 2000 / Brazil Mercator +<5641> +proj=merc +lon_0=-43 +lat_ts=-2 +x_0=5000000 +y_0=10000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ED50 / SPBA LCC +<5643> +proj=lcc +lat_1=52.66666666666666 +lat_2=54.33333333333334 +lat_0=48 +lon_0=10 +x_0=815000 +y_0=0 +ellps=intl +towgs84=-87,-98,-121,0,0,0,0 +units=m +no_defs <> +# RGR92 / UTM zone 39S +<5644> +proj=utm +zone=39 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83 / Vermont (ftUS) +<5646> +proj=tmerc +lat_0=42.5 +lon_0=-72.5 +k=0.999964286 +x_0=500000.00001016 +y_0=0 +datum=NAD83 +units=us-ft +no_defs <> +# ETRS89 / UTM zone 31N (zE-N) +<5649> +proj=tmerc +lat_0=0 +lon_0=3 +k=0.9996 +x_0=31500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / UTM zone 33N (zE-N) +<5650> +proj=tmerc +lat_0=0 +lon_0=15 +k=0.9996 +x_0=33500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / UTM zone 31N (N-zE) +<5651> +proj=tmerc +lat_0=0 +lon_0=3 +k=0.9996 +x_0=31500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / UTM zone 32N (N-zE) +<5652> +proj=tmerc +lat_0=0 +lon_0=9 +k=0.9996 +x_0=32500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / UTM zone 33N (N-zE) +<5653> +proj=tmerc +lat_0=0 +lon_0=15 +k=0.9996 +x_0=33500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Vermont (ftUS) +<5654> +proj=tmerc +lat_0=42.5 +lon_0=-72.5 +k=0.999964286 +x_0=500000.00001016 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / Vermont (ftUS) +<5655> +proj=tmerc +lat_0=42.5 +lon_0=-72.5 +k=0.999964286 +x_0=500000.00001016 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# Monte Mario / TM Emilia-Romagna +<5659> +proj=tmerc +lat_0=0 +lon_0=9 +k=0.9996 +x_0=500053 +y_0=-3999820 +ellps=intl +towgs84=-104.1,-49.1,-9.9,0.971,-2.917,0.714,-11.68 +units=m +no_defs <> +# Pulkovo 1942(58) / Gauss-Kruger zone 3 (E-N) +<5663> +proj=tmerc +lat_0=0 +lon_0=15 +k=1 +x_0=3500000 +y_0=0 +ellps=krass +towgs84=33.4,-146.6,-76.3,-0.359,-0.053,0.844,-0.84 +units=m +no_defs <> +# Pulkovo 1942(83) / Gauss-Kruger zone 2 (E-N) +<5664> +proj=tmerc +lat_0=0 +lon_0=9 +k=1 +x_0=2500000 +y_0=0 +ellps=krass +towgs84=26,-121,-78,0,0,0,0 +units=m +no_defs <> +# Pulkovo 1942(83) / Gauss-Kruger zone 3 (E-N) +<5665> +proj=tmerc +lat_0=0 +lon_0=15 +k=1 +x_0=3500000 +y_0=0 +ellps=krass +towgs84=26,-121,-78,0,0,0,0 +units=m +no_defs <> +# PD/83 / 3-degree Gauss-Kruger zone 3 (E-N) +<5666> +proj=tmerc +lat_0=0 +lon_0=9 +k=1 +x_0=3500000 +y_0=0 +ellps=bessel +units=m +no_defs <> +# PD/83 / 3-degree Gauss-Kruger zone 4 (E-N) +<5667> +proj=tmerc +lat_0=0 +lon_0=12 +k=1 +x_0=4500000 +y_0=0 +ellps=bessel +units=m +no_defs <> +# RD/83 / 3-degree Gauss-Kruger zone 4 (E-N) +<5668> +proj=tmerc +lat_0=0 +lon_0=12 +k=1 +x_0=4500000 +y_0=0 +ellps=bessel +units=m +no_defs <> +# RD/83 / 3-degree Gauss-Kruger zone 5 (E-N) +<5669> +proj=tmerc +lat_0=0 +lon_0=15 +k=1 +x_0=5500000 +y_0=0 +ellps=bessel +units=m +no_defs <> +# Pulkovo 1942(58) / 3-degree Gauss-Kruger zone 3 (E-N) +<5670> +proj=tmerc +lat_0=0 +lon_0=9 +k=1 +x_0=3500000 +y_0=0 +ellps=krass +towgs84=33.4,-146.6,-76.3,-0.359,-0.053,0.844,-0.84 +units=m +no_defs <> +# Pulkovo 1942(58) / 3-degree Gauss-Kruger zone 4 (E-N) +<5671> +proj=tmerc +lat_0=0 +lon_0=12 +k=1 +x_0=4500000 +y_0=0 +ellps=krass +towgs84=33.4,-146.6,-76.3,-0.359,-0.053,0.844,-0.84 +units=m +no_defs <> +# Pulkovo 1942(58) / 3-degree Gauss-Kruger zone 5 (E-N) +<5672> +proj=tmerc +lat_0=0 +lon_0=15 +k=1 +x_0=5500000 +y_0=0 +ellps=krass +towgs84=33.4,-146.6,-76.3,-0.359,-0.053,0.844,-0.84 +units=m +no_defs <> +# Pulkovo 1942(83) / 3-degree Gauss-Kruger zone 3 (E-N) +<5673> +proj=tmerc +lat_0=0 +lon_0=9 +k=1 +x_0=3500000 +y_0=0 +ellps=krass +towgs84=26,-121,-78,0,0,0,0 +units=m +no_defs <> +# Pulkovo 1942(83) / 3-degree Gauss-Kruger zone 4 (E-N) +<5674> +proj=tmerc +lat_0=0 +lon_0=12 +k=1 +x_0=4500000 +y_0=0 +ellps=krass +towgs84=26,-121,-78,0,0,0,0 +units=m +no_defs <> +# Pulkovo 1942(83) / 3-degree Gauss-Kruger zone 5 (E-N) +<5675> +proj=tmerc +lat_0=0 +lon_0=15 +k=1 +x_0=5500000 +y_0=0 +ellps=krass +towgs84=26,-121,-78,0,0,0,0 +units=m +no_defs <> +# DHDN / 3-degree Gauss-Kruger zone 2 (E-N) +<5676> +proj=tmerc +lat_0=0 +lon_0=6 +k=1 +x_0=2500000 +y_0=0 +datum=potsdam +units=m +no_defs <> +# DHDN / 3-degree Gauss-Kruger zone 3 (E-N) +<5677> +proj=tmerc +lat_0=0 +lon_0=9 +k=1 +x_0=3500000 +y_0=0 +datum=potsdam +units=m +no_defs <> +# DHDN / 3-degree Gauss-Kruger zone 4 (E-N) +<5678> +proj=tmerc +lat_0=0 +lon_0=12 +k=1 +x_0=4500000 +y_0=0 +datum=potsdam +units=m +no_defs <> +# DHDN / 3-degree Gauss-Kruger zone 5 (E-N) +<5679> +proj=tmerc +lat_0=0 +lon_0=15 +k=1 +x_0=5500000 +y_0=0 +datum=potsdam +units=m +no_defs <> +# DHDN / 3-degree Gauss-Kruger zone 1 (E-N) +<5680> +proj=tmerc +lat_0=0 +lon_0=3 +k=1 +x_0=1500000 +y_0=0 +datum=potsdam +units=m +no_defs <> +# DB_REF / 3-degree Gauss-Kruger zone 2 (E-N) +<5682> +proj=tmerc +lat_0=0 +lon_0=6 +k=1 +x_0=2500000 +y_0=0 +ellps=bessel +units=m +no_defs <> +# DB_REF / 3-degree Gauss-Kruger zone 3 (E-N) +<5683> +proj=tmerc +lat_0=0 +lon_0=9 +k=1 +x_0=3500000 +y_0=0 +ellps=bessel +units=m +no_defs <> +# DB_REF / 3-degree Gauss-Kruger zone 4 (E-N) +<5684> +proj=tmerc +lat_0=0 +lon_0=12 +k=1 +x_0=4500000 +y_0=0 +ellps=bessel +units=m +no_defs <> +# DB_REF / 3-degree Gauss-Kruger zone 5 (E-N) +<5685> +proj=tmerc +lat_0=0 +lon_0=15 +k=1 +x_0=5500000 +y_0=0 +ellps=bessel +units=m +no_defs <> +# NZGD2000 / UTM zone 1S +<5700> +proj=utm +zone=1 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# EPSG topocentric example A +# Unable to translate coordinate system EPSG:5819 into PROJ.4 format. +# +# EPSG topocentric example B +# Unable to translate coordinate system EPSG:5820 into PROJ.4 format. +# +# EPSG vertical perspective example +# Unable to translate coordinate system EPSG:5821 into PROJ.4 format. +# +# AGD66 / ACT Standard Grid +<5825> +proj=tmerc +lat_0=-35.31773627777778 +lon_0=149.0092948305555 +k=1.000086 +x_0=200000 +y_0=600000 +ellps=aust_SA +towgs84=-117.808,-51.536,137.784,0.303,0.446,0.234,-0.29 +units=m +no_defs <> +# Yemen NGN96 / UTM zone 37N +<5836> +proj=utm +zone=37 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Yemen NGN96 / UTM zone 40N +<5837> +proj=utm +zone=40 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Peru96 / UTM zone 17S +<5839> +proj=utm +zone=17 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# WGS 84 / TM 12 SE +<5842> +proj=tmerc +lat_0=0 +lon_0=12 +k=0.9996 +x_0=500000 +y_0=10000000 +datum=WGS84 +units=m +no_defs <> +# RGRDC 2005 / Congo TM zone 30 +<5844> +proj=tmerc +lat_0=0 +lon_0=30 +k=0.9999 +x_0=500000 +y_0=10000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# SAD69(96) / UTM zone 22S +<5858> +proj=utm +zone=22 +south +ellps=aust_SA +towgs84=-67.35,3.88,-38.22,0,0,0,0 +units=m +no_defs <> +# SAD69(96) / UTM zone 18S +<5875> +proj=utm +zone=18 +south +ellps=aust_SA +towgs84=-67.35,3.88,-38.22,0,0,0,0 +units=m +no_defs <> +# SAD69(96) / UTM zone 19S +<5876> +proj=utm +zone=19 +south +ellps=aust_SA +towgs84=-67.35,3.88,-38.22,0,0,0,0 +units=m +no_defs <> +# SAD69(96) / UTM zone 20S +<5877> +proj=utm +zone=20 +south +ellps=aust_SA +towgs84=-67.35,3.88,-38.22,0,0,0,0 +units=m +no_defs <> +# Cadastre 1997 / UTM zone 38S +<5879> +proj=utm +zone=38 +south +ellps=intl +towgs84=-381.788,-57.501,-256.673,0,0,0,0 +units=m +no_defs <> +# SIRGAS 2000 / Brazil Polyconic +<5880> +proj=poly +lat_0=0 +lon_0=-54 +x_0=5000000 +y_0=10000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# TGD2005 / Tonga Map Grid +<5887> +proj=tmerc +lat_0=0 +lon_0=-177 +k=0.9996 +x_0=1500000 +y_0=5000000 +ellps=GRS80 +units=m +no_defs <> +# JAXA Snow Depth Polar Stereographic North +<5890> +proj=stere +lat_0=90 +lat_ts=70 +lon_0=90 +k=1 +x_0=0 +y_0=0 +a=6378273 +b=6356889.449 +units=m +no_defs <> +# WGS 84 / EPSG Arctic Regional zone A1 +<5921> +proj=lcc +lat_1=85 +lat_2=77 +lat_0=81.31722600000001 +lon_0=-111 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / EPSG Arctic Regional zone A2 +<5922> +proj=lcc +lat_1=85 +lat_2=77 +lat_0=81.31722600000001 +lon_0=-39 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / EPSG Arctic Regional zone A3 +<5923> +proj=lcc +lat_1=85 +lat_2=77 +lat_0=81.31722600000001 +lon_0=33 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / EPSG Arctic Regional zone A4 +<5924> +proj=lcc +lat_1=85 +lat_2=77 +lat_0=81.31722600000001 +lon_0=105 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / EPSG Arctic Regional zone A5 +<5925> +proj=lcc +lat_1=85 +lat_2=77 +lat_0=81.31722600000001 +lon_0=177 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / EPSG Arctic Regional zone B1 +<5926> +proj=lcc +lat_1=77 +lat_2=69 +lat_0=73.15574086111111 +lon_0=-111 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / EPSG Arctic Regional zone B2 +<5927> +proj=lcc +lat_1=77 +lat_2=69 +lat_0=73.15574086111111 +lon_0=-39 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / EPSG Arctic Regional zone B3 +<5928> +proj=lcc +lat_1=77 +lat_2=69 +lat_0=73.15574086111111 +lon_0=33 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / EPSG Arctic Regional zone B4 +<5929> +proj=lcc +lat_1=77 +lat_2=69 +lat_0=73.15574086111111 +lon_0=105 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / EPSG Arctic Regional zone B5 +<5930> +proj=lcc +lat_1=77 +lat_2=69 +lat_0=73.15574086111111 +lon_0=177 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / EPSG Arctic Regional zone C1 +<5931> +proj=lcc +lat_1=69 +lat_2=61 +lat_0=65.10127088888888 +lon_0=-111 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / EPSG Arctic Regional zone C2 +<5932> +proj=lcc +lat_1=69 +lat_2=61 +lat_0=65.10127088888888 +lon_0=-39 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / EPSG Arctic Regional zone C3 +<5933> +proj=lcc +lat_1=69 +lat_2=61 +lat_0=65.10127088888888 +lon_0=33 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / EPSG Arctic Regional zone C4 +<5934> +proj=lcc +lat_1=69 +lat_2=61 +lat_0=65.10127088888888 +lon_0=105 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / EPSG Arctic Regional zone C5 +<5935> +proj=lcc +lat_1=69 +lat_2=61 +lat_0=65.10127088888888 +lon_0=177 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / EPSG Alaska Polar Stereographic +<5936> +proj=stere +lat_0=90 +lat_ts=90 +lon_0=-150 +k=0.994 +x_0=2000000 +y_0=2000000 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / EPSG Canada Polar Stereographic +<5937> +proj=stere +lat_0=90 +lat_ts=90 +lon_0=-100 +k=0.994 +x_0=2000000 +y_0=2000000 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / EPSG Greenland Polar Stereographic +<5938> +proj=stere +lat_0=90 +lat_ts=90 +lon_0=-33 +k=0.994 +x_0=2000000 +y_0=2000000 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / EPSG Norway Polar Stereographic +<5939> +proj=stere +lat_0=90 +lat_ts=90 +lon_0=18 +k=0.994 +x_0=2000000 +y_0=2000000 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / EPSG Russia Polar Stereographic +<5940> +proj=stere +lat_0=90 +lat_ts=90 +lon_0=105 +k=0.994 +x_0=2000000 +y_0=2000000 +datum=WGS84 +units=m +no_defs <> +# GR96 / EPSG Arctic zone 1-25 +<6050> +proj=lcc +lat_1=87 +lat_2=83.66666666666667 +lat_0=85.43711833333333 +lon_0=-30 +x_0=25500000 +y_0=1500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# GR96 / EPSG Arctic zone 2-18 +<6051> +proj=lcc +lat_1=83.66666666666667 +lat_2=80.33333333333333 +lat_0=82.05842488888888 +lon_0=-52 +x_0=18500000 +y_0=2500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# GR96 / EPSG Arctic zone 2-20 +<6052> +proj=lcc +lat_1=83.66666666666667 +lat_2=80.33333333333333 +lat_0=82.05842488888888 +lon_0=-12 +x_0=20500000 +y_0=2500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# GR96 / EPSG Arctic zone 3-29 +<6053> +proj=lcc +lat_1=80.33333333333333 +lat_2=77 +lat_0=78.70733752777778 +lon_0=-69 +x_0=29500000 +y_0=3500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# GR96 / EPSG Arctic zone 3-31 +<6054> +proj=lcc +lat_1=80.33333333333333 +lat_2=77 +lat_0=78.70733752777778 +lon_0=-39 +x_0=31500000 +y_0=3500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# GR96 / EPSG Arctic zone 3-33 +<6055> +proj=lcc +lat_1=80.33333333333333 +lat_2=77 +lat_0=78.70733752777778 +lon_0=-10 +x_0=33500000 +y_0=3500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# GR96 / EPSG Arctic zone 4-20 +<6056> +proj=lcc +lat_1=77 +lat_2=73.66666666666667 +lat_0=75.36440330555556 +lon_0=-64 +x_0=20500000 +y_0=4500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# GR96 / EPSG Arctic zone 4-22 +<6057> +proj=lcc +lat_1=77 +lat_2=73.66666666666667 +lat_0=75.36440330555556 +lon_0=-39 +x_0=22500000 +y_0=4500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# GR96 / EPSG Arctic zone 4-24 +<6058> +proj=lcc +lat_1=77 +lat_2=73.66666666666667 +lat_0=75.36440330555556 +lon_0=-14 +x_0=24500000 +y_0=4500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# GR96 / EPSG Arctic zone 5-41 +<6059> +proj=lcc +lat_1=73.66666666666667 +lat_2=70.33333333333333 +lat_0=72.02500919444445 +lon_0=-62 +x_0=41500000 +y_0=5500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# GR96 / EPSG Arctic zone 5-43 +<6060> +proj=lcc +lat_1=73.66666666666667 +lat_2=70.33333333333333 +lat_0=72.02500919444445 +lon_0=-42 +x_0=43500000 +y_0=5500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# GR96 / EPSG Arctic zone 5-45 +<6061> +proj=lcc +lat_1=73.66666666666667 +lat_2=70.33333333333333 +lat_0=72.02500919444445 +lon_0=-22 +x_0=45500000 +y_0=5500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# GR96 / EPSG Arctic zone 6-26 +<6062> +proj=lcc +lat_1=70.33333333333333 +lat_2=67 +lat_0=68.68747555555557 +lon_0=-56 +x_0=26500000 +y_0=6500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# GR96 / EPSG Arctic zone 6-28 +<6063> +proj=lcc +lat_1=70.33333333333333 +lat_2=67 +lat_0=68.68747555555557 +lon_0=-38 +x_0=28500000 +y_0=6500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# GR96 / EPSG Arctic zone 6-30 +<6064> +proj=lcc +lat_1=70.33333333333333 +lat_2=67 +lat_0=68.68747555555557 +lon_0=-20 +x_0=30500000 +y_0=6500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# GR96 / EPSG Arctic zone 7-11 +<6065> +proj=lcc +lat_1=67 +lat_2=63.66666666666666 +lat_0=65.35103930555555 +lon_0=-51 +x_0=11500000 +y_0=7500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# GR96 / EPSG Arctic zone 7-13 +<6066> +proj=lcc +lat_1=67 +lat_2=63.66666666666666 +lat_0=65.35103930555555 +lon_0=-34 +x_0=13500000 +y_0=7500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# GR96 / EPSG Arctic zone 8-20 +<6067> +proj=lcc +lat_1=63.66666666666666 +lat_2=60.33333333333334 +lat_0=62.01530688888889 +lon_0=-52 +x_0=20500000 +y_0=8500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# GR96 / EPSG Arctic zone 8-22 +<6068> +proj=lcc +lat_1=63.66666666666666 +lat_2=60.33333333333334 +lat_0=62.01530688888889 +lon_0=-37 +x_0=22500000 +y_0=8500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / EPSG Arctic zone 2-22 +<6069> +proj=lcc +lat_1=83.66666666666667 +lat_2=80.33333333333333 +lat_0=82.05842488888888 +lon_0=16 +x_0=22500000 +y_0=2500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / EPSG Arctic zone 3-11 +<6070> +proj=lcc +lat_1=80.33333333333333 +lat_2=77 +lat_0=78.70733752777778 +lon_0=21 +x_0=11500000 +y_0=3500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / EPSG Arctic zone 4-26 +<6071> +proj=lcc +lat_1=77 +lat_2=73.66666666666667 +lat_0=75.36440330555556 +lon_0=10 +x_0=26500000 +y_0=4500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / EPSG Arctic zone 4-28 +<6072> +proj=lcc +lat_1=77 +lat_2=73.66666666666667 +lat_0=75.36440330555556 +lon_0=34 +x_0=28500000 +y_0=4500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / EPSG Arctic zone 5-11 +<6073> +proj=lcc +lat_1=73.66666666666667 +lat_2=70.33333333333333 +lat_0=72.02500919444445 +lon_0=14 +x_0=11500000 +y_0=5500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / EPSG Arctic zone 5-13 +<6074> +proj=lcc +lat_1=73.66666666666667 +lat_2=70.33333333333333 +lat_0=72.02500919444445 +lon_0=34 +x_0=13500000 +y_0=5500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# WGS 84 / EPSG Arctic zone 2-24 +<6075> +proj=lcc +lat_1=83.66666666666667 +lat_2=80.33333333333333 +lat_0=82.05842488888888 +lon_0=53 +x_0=24500000 +y_0=2500000 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / EPSG Arctic zone 2-26 +<6076> +proj=lcc +lat_1=83.66666666666667 +lat_2=80.33333333333333 +lat_0=82.05842488888888 +lon_0=93 +x_0=26500000 +y_0=2500000 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / EPSG Arctic zone 3-13 +<6077> +proj=lcc +lat_1=80.33333333333333 +lat_2=77 +lat_0=78.70733752777778 +lon_0=52 +x_0=13500000 +y_0=3500000 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / EPSG Arctic zone 3-15 +<6078> +proj=lcc +lat_1=80.33333333333333 +lat_2=77 +lat_0=78.70733752777778 +lon_0=83 +x_0=15500000 +y_0=3500000 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / EPSG Arctic zone 3-17 +<6079> +proj=lcc +lat_1=80.33333333333333 +lat_2=77 +lat_0=78.70733752777778 +lon_0=114 +x_0=17500000 +y_0=3500000 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / EPSG Arctic zone 3-19 +<6080> +proj=lcc +lat_1=80.33333333333333 +lat_2=77 +lat_0=78.70733752777778 +lon_0=145 +x_0=19500000 +y_0=3500000 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / EPSG Arctic zone 4-30 +<6081> +proj=lcc +lat_1=77 +lat_2=73.66666666666667 +lat_0=75.36440330555556 +lon_0=58 +x_0=30500000 +y_0=4500000 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / EPSG Arctic zone 4-32 +<6082> +proj=lcc +lat_1=77 +lat_2=73.66666666666667 +lat_0=75.36440330555556 +lon_0=82 +x_0=32500000 +y_0=4500000 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / EPSG Arctic zone 4-34 +<6083> +proj=lcc +lat_1=77 +lat_2=73.66666666666667 +lat_0=75.36440330555556 +lon_0=106 +x_0=34500000 +y_0=4500000 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / EPSG Arctic zone 4-36 +<6084> +proj=lcc +lat_1=77 +lat_2=73.66666666666667 +lat_0=75.36440330555556 +lon_0=130 +x_0=36500000 +y_0=4500000 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / EPSG Arctic zone 4-38 +<6085> +proj=lcc +lat_1=77 +lat_2=73.66666666666667 +lat_0=75.36440330555556 +lon_0=154 +x_0=38500000 +y_0=4500000 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / EPSG Arctic zone 4-40 +<6086> +proj=lcc +lat_1=77 +lat_2=73.66666666666667 +lat_0=75.36440330555556 +lon_0=179 +x_0=40500000 +y_0=4500000 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / EPSG Arctic zone 5-15 +<6087> +proj=lcc +lat_1=73.66666666666667 +lat_2=70.33333333333333 +lat_0=72.02500919444445 +lon_0=54 +x_0=15500000 +y_0=5500000 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / EPSG Arctic zone 5-17 +<6088> +proj=lcc +lat_1=73.66666666666667 +lat_2=70.33333333333333 +lat_0=72.02500919444445 +lon_0=74 +x_0=17500000 +y_0=5500000 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / EPSG Arctic zone 5-19 +<6089> +proj=lcc +lat_1=73.66666666666667 +lat_2=70.33333333333333 +lat_0=72.02500919444445 +lon_0=95 +x_0=19500000 +y_0=5500000 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / EPSG Arctic zone 5-21 +<6090> +proj=lcc +lat_1=73.66666666666667 +lat_2=70.33333333333333 +lat_0=72.02500919444445 +lon_0=116 +x_0=21500000 +y_0=5500000 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / EPSG Arctic zone 5-23 +<6091> +proj=lcc +lat_1=73.66666666666667 +lat_2=70.33333333333333 +lat_0=72.02500919444445 +lon_0=137 +x_0=23500000 +y_0=5500000 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / EPSG Arctic zone 5-25 +<6092> +proj=lcc +lat_1=73.66666666666667 +lat_2=70.33333333333333 +lat_0=72.02500919444445 +lon_0=158 +x_0=25500000 +y_0=5500000 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / EPSG Arctic zone 5-27 +<6093> +proj=lcc +lat_1=73.66666666666667 +lat_2=70.33333333333333 +lat_0=72.02500919444445 +lon_0=179 +x_0=27500000 +y_0=5500000 +datum=WGS84 +units=m +no_defs <> +# NAD83(NSRS2007) / EPSG Arctic zone 5-29 +<6094> +proj=lcc +lat_1=73.66666666666667 +lat_2=70.33333333333333 +lat_0=72.02500919444445 +lon_0=-163 +x_0=29500000 +y_0=5500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / EPSG Arctic zone 5-31 +<6095> +proj=lcc +lat_1=73.66666666666667 +lat_2=70.33333333333333 +lat_0=72.02500919444445 +lon_0=-147 +x_0=31500000 +y_0=5500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / EPSG Arctic zone 6-14 +<6096> +proj=lcc +lat_1=70.33333333333333 +lat_2=67 +lat_0=68.68747555555557 +lon_0=-165 +x_0=14500000 +y_0=6500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / EPSG Arctic zone 6-16 +<6097> +proj=lcc +lat_1=70.33333333333333 +lat_2=67 +lat_0=68.68747555555557 +lon_0=-147 +x_0=16500000 +y_0=6500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS) / EPSG Arctic zone 1-23 +<6098> +proj=lcc +lat_1=87 +lat_2=83.66666666666667 +lat_0=85.43711833333333 +lon_0=-90 +x_0=23500000 +y_0=1500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS) / EPSG Arctic zone 2-14 +<6099> +proj=lcc +lat_1=83.66666666666667 +lat_2=80.33333333333333 +lat_0=82.05842488888888 +lon_0=-115 +x_0=14500000 +y_0=2500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS) / EPSG Arctic zone 2-16 +<6100> +proj=lcc +lat_1=83.66666666666667 +lat_2=80.33333333333333 +lat_0=82.05842488888888 +lon_0=-75 +x_0=16500000 +y_0=2500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS) / EPSG Arctic zone 3-25 +<6101> +proj=lcc +lat_1=80.33333333333333 +lat_2=77 +lat_0=78.70733752777778 +lon_0=-129 +x_0=25500000 +y_0=3500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS) / EPSG Arctic zone 3-27 +<6102> +proj=lcc +lat_1=80.33333333333333 +lat_2=77 +lat_0=78.70733752777778 +lon_0=-99 +x_0=27500000 +y_0=3500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS) / EPSG Arctic zone 3-29 +<6103> +proj=lcc +lat_1=80.33333333333333 +lat_2=77 +lat_0=78.70733752777778 +lon_0=-69 +x_0=29500000 +y_0=3500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS) / EPSG Arctic zone 4-14 +<6104> +proj=lcc +lat_1=77 +lat_2=73.66666666666667 +lat_0=75.36440330555556 +lon_0=-129 +x_0=14500000 +y_0=4500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS) / EPSG Arctic zone 4-16 +<6105> +proj=lcc +lat_1=77 +lat_2=73.66666666666667 +lat_0=75.36440330555556 +lon_0=-104 +x_0=16500000 +y_0=4500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS) / EPSG Arctic zone 4-18 +<6106> +proj=lcc +lat_1=77 +lat_2=73.66666666666667 +lat_0=75.36440330555556 +lon_0=-79 +x_0=18500000 +y_0=4500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS) / EPSG Arctic zone 5-33 +<6107> +proj=lcc +lat_1=73.66666666666667 +lat_2=70.33333333333333 +lat_0=72.02500919444445 +lon_0=-131 +x_0=33500000 +y_0=5500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS) / EPSG Arctic zone 5-35 +<6108> +proj=lcc +lat_1=73.66666666666667 +lat_2=70.33333333333333 +lat_0=72.02500919444445 +lon_0=-111 +x_0=35500000 +y_0=5500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS) / EPSG Arctic zone 5-37 +<6109> +proj=lcc +lat_1=73.66666666666667 +lat_2=70.33333333333333 +lat_0=72.02500919444445 +lon_0=-91 +x_0=37500000 +y_0=5500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS) / EPSG Arctic zone 5-39 +<6110> +proj=lcc +lat_1=73.66666666666667 +lat_2=70.33333333333333 +lat_0=72.02500919444445 +lon_0=-71 +x_0=39500000 +y_0=5500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS) / EPSG Arctic zone 6-18 +<6111> +proj=lcc +lat_1=70.33333333333333 +lat_2=67 +lat_0=68.68747555555557 +lon_0=-132 +x_0=18500000 +y_0=6500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS) / EPSG Arctic zone 6-20 +<6112> +proj=lcc +lat_1=70.33333333333333 +lat_2=67 +lat_0=68.68747555555557 +lon_0=-113 +x_0=20500000 +y_0=6500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS) / EPSG Arctic zone 6-22 +<6113> +proj=lcc +lat_1=70.33333333333333 +lat_2=67 +lat_0=68.68747555555557 +lon_0=-94 +x_0=22500000 +y_0=6500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS) / EPSG Arctic zone 6-24 +<6114> +proj=lcc +lat_1=70.33333333333333 +lat_2=67 +lat_0=68.68747555555557 +lon_0=-75 +x_0=24500000 +y_0=6500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# WGS 84 / EPSG Arctic zone 1-27 +<6115> +proj=lcc +lat_1=87 +lat_2=83.66666666666667 +lat_0=85.43711833333333 +lon_0=30 +x_0=27500000 +y_0=1500000 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / EPSG Arctic zone 1-29 +<6116> +proj=lcc +lat_1=87 +lat_2=83.66666666666667 +lat_0=85.43711833333333 +lon_0=90 +x_0=29500000 +y_0=1500000 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / EPSG Arctic zone 1-31 +<6117> +proj=lcc +lat_1=87 +lat_2=83.66666666666667 +lat_0=85.43711833333333 +lon_0=150 +x_0=31500000 +y_0=1500000 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / EPSG Arctic zone 1-21 +<6118> +proj=lcc +lat_1=87 +lat_2=83.66666666666667 +lat_0=85.43711833333333 +lon_0=-150 +x_0=21500000 +y_0=1500000 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / EPSG Arctic zone 2-28 +<6119> +proj=lcc +lat_1=83.66666666666667 +lat_2=80.33333333333333 +lat_0=82.05842488888888 +lon_0=133 +x_0=28500000 +y_0=2500000 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / EPSG Arctic zone 2-10 +<6120> +proj=lcc +lat_1=83.66666666666667 +lat_2=80.33333333333333 +lat_0=82.05842488888888 +lon_0=166 +x_0=10500000 +y_0=2500000 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / EPSG Arctic zone 2-12 +<6121> +proj=lcc +lat_1=83.66666666666667 +lat_2=80.33333333333333 +lat_0=82.05842488888888 +lon_0=-154 +x_0=12500000 +y_0=2500000 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / EPSG Arctic zone 3-21 +<6122> +proj=lcc +lat_1=80.33333333333333 +lat_2=77 +lat_0=78.70733752777778 +lon_0=176 +x_0=21500000 +y_0=3500000 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / EPSG Arctic zone 3-23 +<6123> +proj=lcc +lat_1=80.33333333333333 +lat_2=77 +lat_0=78.70733752777778 +lon_0=-153 +x_0=23500000 +y_0=3500000 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / EPSG Arctic zone 4-12 +<6124> +proj=lcc +lat_1=77 +lat_2=73.66666666666667 +lat_0=75.36440330555556 +lon_0=-155 +x_0=12500000 +y_0=4500000 +datum=WGS84 +units=m +no_defs <> +# ETRS89 / EPSG Arctic zone 5-47 +<6125> +proj=lcc +lat_1=73.66666666666667 +lat_2=70.33333333333333 +lat_0=72.02500919444445 +lon_0=-5 +x_0=47500000 +y_0=5500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Grand Cayman National Grid 1959 +<6128> +proj=utm +zone=17 +ellps=clrk66 +towgs84=-179.483,-69.379,-27.584,-7.862,8.163,6.042,-13.925 +units=ft +no_defs <> +# Sister Islands National Grid 1961 +<6129> +proj=utm +zone=17 +ellps=clrk66 +towgs84=8.853,-52.644,180.304,-0.393,-2.323,2.96,-24.081 +units=ft +no_defs <> +# Cayman Islands National Grid 2011 (deprecated) +<6141> +proj=lcc +lat_1=19.33333333333333 +lat_2=19.7 +lat_0=19.33333333333333 +lon_0=80.56666666666666 +x_0=899160 +y_0=579120 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=ft +no_defs <> +# NAD27 / Michigan North (deprecated) +# Unable to translate coordinate system EPSG:6200 into PROJ.4 format. +# +# NAD27 / Michigan Central +# Unable to translate coordinate system EPSG:6201 into PROJ.4 format. +# +# NAD27 / Michigan South +# Unable to translate coordinate system EPSG:6202 into PROJ.4 format. +# +# Macedonia State Coordinate System +<6204> +proj=tmerc +lat_0=0 +lon_0=21 +k=0.9999 +x_0=500000 +y_0=0 +ellps=bessel +towgs84=682,-203,480,0,0,0,0 +units=m +no_defs <> +# SIRGAS 2000 / UTM zone 23N +<6210> +proj=utm +zone=23 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# SIRGAS 2000 / UTM zone 24N +<6211> +proj=utm +zone=24 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# MAGNA-SIRGAS / Arauca urban grid +# Unable to translate coordinate system EPSG:6244 into PROJ.4 format. +# +# MAGNA-SIRGAS / Armenia urban grid +# Unable to translate coordinate system EPSG:6245 into PROJ.4 format. +# +# MAGNA-SIRGAS / Barranquilla urban grid +# Unable to translate coordinate system EPSG:6246 into PROJ.4 format. +# +# MAGNA-SIRGAS / Bogota urban grid +# Unable to translate coordinate system EPSG:6247 into PROJ.4 format. +# +# MAGNA-SIRGAS / Bucaramanga urban grid +# Unable to translate coordinate system EPSG:6248 into PROJ.4 format. +# +# MAGNA-SIRGAS / Cali urban grid +# Unable to translate coordinate system EPSG:6249 into PROJ.4 format. +# +# MAGNA-SIRGAS / Cartagena urban grid +# Unable to translate coordinate system EPSG:6250 into PROJ.4 format. +# +# MAGNA-SIRGAS / Cucuta urban grid +# Unable to translate coordinate system EPSG:6251 into PROJ.4 format. +# +# MAGNA-SIRGAS / Florencia urban grid +# Unable to translate coordinate system EPSG:6252 into PROJ.4 format. +# +# MAGNA-SIRGAS / Ibague urban grid +# Unable to translate coordinate system EPSG:6253 into PROJ.4 format. +# +# MAGNA-SIRGAS / Inirida urban grid +# Unable to translate coordinate system EPSG:6254 into PROJ.4 format. +# +# MAGNA-SIRGAS / Leticia urban grid +# Unable to translate coordinate system EPSG:6255 into PROJ.4 format. +# +# MAGNA-SIRGAS / Manizales urban grid +# Unable to translate coordinate system EPSG:6256 into PROJ.4 format. +# +# MAGNA-SIRGAS / Medellin urban grid +# Unable to translate coordinate system EPSG:6257 into PROJ.4 format. +# +# MAGNA-SIRGAS / Mitu urban grid +# Unable to translate coordinate system EPSG:6258 into PROJ.4 format. +# +# MAGNA-SIRGAS / Mocoa urban grid +# Unable to translate coordinate system EPSG:6259 into PROJ.4 format. +# +# MAGNA-SIRGAS / Monteria urban grid +# Unable to translate coordinate system EPSG:6260 into PROJ.4 format. +# +# MAGNA-SIRGAS / Neiva urban grid +# Unable to translate coordinate system EPSG:6261 into PROJ.4 format. +# +# MAGNA-SIRGAS / Pasto urban grid +# Unable to translate coordinate system EPSG:6262 into PROJ.4 format. +# +# MAGNA-SIRGAS / Pereira urban grid +# Unable to translate coordinate system EPSG:6263 into PROJ.4 format. +# +# MAGNA-SIRGAS / Popayan urban grid +# Unable to translate coordinate system EPSG:6264 into PROJ.4 format. +# +# MAGNA-SIRGAS / Puerto Carreno urban grid +# Unable to translate coordinate system EPSG:6265 into PROJ.4 format. +# +# MAGNA-SIRGAS / Quibdo urban grid +# Unable to translate coordinate system EPSG:6266 into PROJ.4 format. +# +# MAGNA-SIRGAS / Riohacha urban grid +# Unable to translate coordinate system EPSG:6267 into PROJ.4 format. +# +# MAGNA-SIRGAS / San Andres urban grid +# Unable to translate coordinate system EPSG:6268 into PROJ.4 format. +# +# MAGNA-SIRGAS / San Jose del Guaviare urban grid +# Unable to translate coordinate system EPSG:6269 into PROJ.4 format. +# +# MAGNA-SIRGAS / Santa Marta urban grid +# Unable to translate coordinate system EPSG:6270 into PROJ.4 format. +# +# MAGNA-SIRGAS / Sucre urban grid +# Unable to translate coordinate system EPSG:6271 into PROJ.4 format. +# +# MAGNA-SIRGAS / Tunja urban grid +# Unable to translate coordinate system EPSG:6272 into PROJ.4 format. +# +# MAGNA-SIRGAS / Valledupar urban grid +# Unable to translate coordinate system EPSG:6273 into PROJ.4 format. +# +# MAGNA-SIRGAS / Villavicencio urban grid +# Unable to translate coordinate system EPSG:6274 into PROJ.4 format. +# +# MAGNA-SIRGAS / Yopal urban grid +# Unable to translate coordinate system EPSG:6275 into PROJ.4 format. +# +# NAD83(CORS96) / Puerto Rico and Virgin Is. +<6307> +proj=lcc +lat_1=18.43333333333333 +lat_2=18.03333333333333 +lat_0=17.83333333333333 +lon_0=-66.43333333333334 +x_0=200000 +y_0=200000 +ellps=GRS80 +units=m +no_defs <> +# CGRS93 / Cyprus Local Transverse Mercator +<6312> +proj=tmerc +lat_0=0 +lon_0=33 +k=0.99995 +x_0=200000 +y_0=-3500000 +ellps=WGS84 +towgs84=8.846,-4.394,-1.122,-0.00237,-0.146528,0.130428,0.783926 +units=m +no_defs <> +# Macedonia State Coordinate System zone 7 +<6316> +proj=tmerc +lat_0=0 +lon_0=21 +k=0.9999 +x_0=7500000 +y_0=0 +ellps=bessel +towgs84=682,-203,480,0,0,0,0 +units=m +no_defs <> +# NAD83(2011) / UTM zone 59N +<6328> +proj=utm +zone=59 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / UTM zone 60N +<6329> +proj=utm +zone=60 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / UTM zone 1N +<6330> +proj=utm +zone=1 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / UTM zone 2N +<6331> +proj=utm +zone=2 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / UTM zone 3N +<6332> +proj=utm +zone=3 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / UTM zone 4N +<6333> +proj=utm +zone=4 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / UTM zone 5N +<6334> +proj=utm +zone=5 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / UTM zone 6N +<6335> +proj=utm +zone=6 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / UTM zone 7N +<6336> +proj=utm +zone=7 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / UTM zone 8N +<6337> +proj=utm +zone=8 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / UTM zone 9N +<6338> +proj=utm +zone=9 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / UTM zone 10N +<6339> +proj=utm +zone=10 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / UTM zone 11N +<6340> +proj=utm +zone=11 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / UTM zone 12N +<6341> +proj=utm +zone=12 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / UTM zone 13N +<6342> +proj=utm +zone=13 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / UTM zone 14N +<6343> +proj=utm +zone=14 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / UTM zone 15N +<6344> +proj=utm +zone=15 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / UTM zone 16N +<6345> +proj=utm +zone=16 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / UTM zone 17N +<6346> +proj=utm +zone=17 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / UTM zone 18N +<6347> +proj=utm +zone=18 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / UTM zone 19N +<6348> +proj=utm +zone=19 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Conus Albers +<6350> +proj=aea +lat_1=29.5 +lat_2=45.5 +lat_0=23 +lon_0=-96 +x_0=0 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / EPSG Arctic zone 5-29 +<6351> +proj=lcc +lat_1=73.66666666666667 +lat_2=70.33333333333333 +lat_0=72.02500919444445 +lon_0=-163 +x_0=29500000 +y_0=5500000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / EPSG Arctic zone 5-31 +<6352> +proj=lcc +lat_1=73.66666666666667 +lat_2=70.33333333333333 +lat_0=72.02500919444445 +lon_0=-147 +x_0=31500000 +y_0=5500000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / EPSG Arctic zone 6-14 +<6353> +proj=lcc +lat_1=70.33333333333333 +lat_2=67 +lat_0=68.68747555555557 +lon_0=-165 +x_0=14500000 +y_0=6500000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / EPSG Arctic zone 6-16 +<6354> +proj=lcc +lat_1=70.33333333333333 +lat_2=67 +lat_0=68.68747555555557 +lon_0=-147 +x_0=16500000 +y_0=6500000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Alabama East +<6355> +proj=tmerc +lat_0=30.5 +lon_0=-85.83333333333333 +k=0.99996 +x_0=200000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Alabama West +<6356> +proj=tmerc +lat_0=30 +lon_0=-87.5 +k=0.999933333 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# Mexico ITRF92 / LCC +<6362> +proj=lcc +lat_1=17.5 +lat_2=29.5 +lat_0=12 +lon_0=-102 +x_0=2500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Mexico ITRF2008 / UTM zone 11N +<6366> +proj=utm +zone=11 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Mexico ITRF2008 / UTM zone 12N +<6367> +proj=utm +zone=12 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Mexico ITRF2008 / UTM zone 13N +<6368> +proj=utm +zone=13 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Mexico ITRF2008 / UTM zone 14N +<6369> +proj=utm +zone=14 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Mexico ITRF2008 / UTM zone 15N +<6370> +proj=utm +zone=15 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Mexico ITRF2008 / UTM zone 16N +<6371> +proj=utm +zone=16 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Mexico ITRF2008 / LCC +<6372> +proj=lcc +lat_1=17.5 +lat_2=29.5 +lat_0=12 +lon_0=-102 +x_0=2500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# UCS-2000 / Ukraine TM zone 7 +<6381> +proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=300000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,0,0.35,0.736,0 +units=m +no_defs <> +# UCS-2000 / Ukraine TM zone 8 +<6382> +proj=tmerc +lat_0=0 +lon_0=24 +k=1 +x_0=300000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,0,0.35,0.736,0 +units=m +no_defs <> +# UCS-2000 / Ukraine TM zone 9 +<6383> +proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=300000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,0,0.35,0.736,0 +units=m +no_defs <> +# UCS-2000 / Ukraine TM zone 10 +<6384> +proj=tmerc +lat_0=0 +lon_0=30 +k=1 +x_0=300000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,0,0.35,0.736,0 +units=m +no_defs <> +# UCS-2000 / Ukraine TM zone 11 +<6385> +proj=tmerc +lat_0=0 +lon_0=33 +k=1 +x_0=300000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,0,0.35,0.736,0 +units=m +no_defs <> +# UCS-2000 / Ukraine TM zone 12 +<6386> +proj=tmerc +lat_0=0 +lon_0=36 +k=1 +x_0=300000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,0,0.35,0.736,0 +units=m +no_defs <> +# UCS-2000 / Ukraine TM zone 13 +<6387> +proj=tmerc +lat_0=0 +lon_0=39 +k=1 +x_0=300000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,0,0.35,0.736,0 +units=m +no_defs <> +# Cayman Islands National Grid 2011 +<6391> +proj=lcc +lat_1=19.33333333333333 +lat_2=19.7 +lat_0=19.33333333333333 +lon_0=-80.56666666666666 +x_0=899160 +y_0=579120 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=ft +no_defs <> +# NAD83(2011) / Alaska Albers +<6393> +proj=aea +lat_1=55 +lat_2=65 +lat_0=50 +lon_0=-154 +x_0=0 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Alaska zone 1 +<6394> +proj=omerc +lat_0=57 +lonc=-133.6666666666667 +alpha=323.1301023611111 +k=0.9999 +x_0=5000000 +y_0=-5000000 +no_uoff +gamma=323.1301023611111 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Alaska zone 2 +<6395> +proj=tmerc +lat_0=54 +lon_0=-142 +k=0.9999 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Alaska zone 3 +<6396> +proj=tmerc +lat_0=54 +lon_0=-146 +k=0.9999 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Alaska zone 4 +<6397> +proj=tmerc +lat_0=54 +lon_0=-150 +k=0.9999 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Alaska zone 5 +<6398> +proj=tmerc +lat_0=54 +lon_0=-154 +k=0.9999 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Alaska zone 6 +<6399> +proj=tmerc +lat_0=54 +lon_0=-158 +k=0.9999 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Alaska zone 7 +<6400> +proj=tmerc +lat_0=54 +lon_0=-162 +k=0.9999 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Alaska zone 8 +<6401> +proj=tmerc +lat_0=54 +lon_0=-166 +k=0.9999 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Alaska zone 9 +<6402> +proj=tmerc +lat_0=54 +lon_0=-170 +k=0.9999 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Alaska zone 10 +<6403> +proj=lcc +lat_1=53.83333333333334 +lat_2=51.83333333333334 +lat_0=51 +lon_0=-176 +x_0=1000000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Arizona Central +<6404> +proj=tmerc +lat_0=31 +lon_0=-111.9166666666667 +k=0.9999 +x_0=213360 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Arizona Central (ft) +<6405> +proj=tmerc +lat_0=31 +lon_0=-111.9166666666667 +k=0.9999 +x_0=213360 +y_0=0 +ellps=GRS80 +units=ft +no_defs <> +# NAD83(2011) / Arizona East +<6406> +proj=tmerc +lat_0=31 +lon_0=-110.1666666666667 +k=0.9999 +x_0=213360 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Arizona East (ft) +<6407> +proj=tmerc +lat_0=31 +lon_0=-110.1666666666667 +k=0.9999 +x_0=213360 +y_0=0 +ellps=GRS80 +units=ft +no_defs <> +# NAD83(2011) / Arizona West +<6408> +proj=tmerc +lat_0=31 +lon_0=-113.75 +k=0.999933333 +x_0=213360 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Arizona West (ft) +<6409> +proj=tmerc +lat_0=31 +lon_0=-113.75 +k=0.999933333 +x_0=213360 +y_0=0 +ellps=GRS80 +units=ft +no_defs <> +# NAD83(2011) / Arkansas North +<6410> +proj=lcc +lat_1=36.23333333333333 +lat_2=34.93333333333333 +lat_0=34.33333333333334 +lon_0=-92 +x_0=400000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Arkansas North (ftUS) +<6411> +proj=lcc +lat_1=36.23333333333333 +lat_2=34.93333333333333 +lat_0=34.33333333333334 +lon_0=-92 +x_0=399999.99998984 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / Arkansas South +<6412> +proj=lcc +lat_1=34.76666666666667 +lat_2=33.3 +lat_0=32.66666666666666 +lon_0=-92 +x_0=400000 +y_0=400000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Arkansas South (ftUS) +<6413> +proj=lcc +lat_1=34.76666666666667 +lat_2=33.3 +lat_0=32.66666666666666 +lon_0=-92 +x_0=399999.99998984 +y_0=399999.99998984 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / California Albers +<6414> +proj=aea +lat_1=34 +lat_2=40.5 +lat_0=0 +lon_0=-120 +x_0=0 +y_0=-4000000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / California zone 1 +<6415> +proj=lcc +lat_1=41.66666666666666 +lat_2=40 +lat_0=39.33333333333334 +lon_0=-122 +x_0=2000000 +y_0=500000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / California zone 1 (ftUS) +<6416> +proj=lcc +lat_1=41.66666666666666 +lat_2=40 +lat_0=39.33333333333334 +lon_0=-122 +x_0=2000000.0001016 +y_0=500000.0001016001 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / California zone 2 +<6417> +proj=lcc +lat_1=39.83333333333334 +lat_2=38.33333333333334 +lat_0=37.66666666666666 +lon_0=-122 +x_0=2000000 +y_0=500000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / California zone 2 (ftUS) +<6418> +proj=lcc +lat_1=39.83333333333334 +lat_2=38.33333333333334 +lat_0=37.66666666666666 +lon_0=-122 +x_0=2000000.0001016 +y_0=500000.0001016001 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / California zone 3 +<6419> +proj=lcc +lat_1=38.43333333333333 +lat_2=37.06666666666667 +lat_0=36.5 +lon_0=-120.5 +x_0=2000000 +y_0=500000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / California zone 3 (ftUS) +<6420> +proj=lcc +lat_1=38.43333333333333 +lat_2=37.06666666666667 +lat_0=36.5 +lon_0=-120.5 +x_0=2000000.0001016 +y_0=500000.0001016001 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / California zone 4 +<6421> +proj=lcc +lat_1=37.25 +lat_2=36 +lat_0=35.33333333333334 +lon_0=-119 +x_0=2000000 +y_0=500000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / California zone 4 (ftUS) +<6422> +proj=lcc +lat_1=37.25 +lat_2=36 +lat_0=35.33333333333334 +lon_0=-119 +x_0=2000000.0001016 +y_0=500000.0001016001 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / California zone 5 +<6423> +proj=lcc +lat_1=35.46666666666667 +lat_2=34.03333333333333 +lat_0=33.5 +lon_0=-118 +x_0=2000000 +y_0=500000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / California zone 5 (ftUS) +<6424> +proj=lcc +lat_1=35.46666666666667 +lat_2=34.03333333333333 +lat_0=33.5 +lon_0=-118 +x_0=2000000.0001016 +y_0=500000.0001016001 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / California zone 6 +<6425> +proj=lcc +lat_1=33.88333333333333 +lat_2=32.78333333333333 +lat_0=32.16666666666666 +lon_0=-116.25 +x_0=2000000 +y_0=500000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / California zone 6 (ftUS) +<6426> +proj=lcc +lat_1=33.88333333333333 +lat_2=32.78333333333333 +lat_0=32.16666666666666 +lon_0=-116.25 +x_0=2000000.0001016 +y_0=500000.0001016001 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / Colorado Central +<6427> +proj=lcc +lat_1=39.75 +lat_2=38.45 +lat_0=37.83333333333334 +lon_0=-105.5 +x_0=914401.8289 +y_0=304800.6096 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Colorado Central (ftUS) +<6428> +proj=lcc +lat_1=39.75 +lat_2=38.45 +lat_0=37.83333333333334 +lon_0=-105.5 +x_0=914401.8288036576 +y_0=304800.6096012192 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / Colorado North +<6429> +proj=lcc +lat_1=40.78333333333333 +lat_2=39.71666666666667 +lat_0=39.33333333333334 +lon_0=-105.5 +x_0=914401.8289 +y_0=304800.6096 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Colorado North (ftUS) +<6430> +proj=lcc +lat_1=40.78333333333333 +lat_2=39.71666666666667 +lat_0=39.33333333333334 +lon_0=-105.5 +x_0=914401.8288036576 +y_0=304800.6096012192 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / Colorado South +<6431> +proj=lcc +lat_1=38.43333333333333 +lat_2=37.23333333333333 +lat_0=36.66666666666666 +lon_0=-105.5 +x_0=914401.8289 +y_0=304800.6096 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Colorado South (ftUS) +<6432> +proj=lcc +lat_1=38.43333333333333 +lat_2=37.23333333333333 +lat_0=36.66666666666666 +lon_0=-105.5 +x_0=914401.8288036576 +y_0=304800.6096012192 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / Connecticut +<6433> +proj=lcc +lat_1=41.86666666666667 +lat_2=41.2 +lat_0=40.83333333333334 +lon_0=-72.75 +x_0=304800.6096 +y_0=152400.3048 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Connecticut (ftUS) +<6434> +proj=lcc +lat_1=41.86666666666667 +lat_2=41.2 +lat_0=40.83333333333334 +lon_0=-72.75 +x_0=304800.6096012192 +y_0=152400.3048006096 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / Delaware +<6435> +proj=tmerc +lat_0=38 +lon_0=-75.41666666666667 +k=0.999995 +x_0=200000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Delaware (ftUS) +<6436> +proj=tmerc +lat_0=38 +lon_0=-75.41666666666667 +k=0.999995 +x_0=200000.0001016002 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / Florida East +<6437> +proj=tmerc +lat_0=24.33333333333333 +lon_0=-81 +k=0.999941177 +x_0=200000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Florida East (ftUS) +<6438> +proj=tmerc +lat_0=24.33333333333333 +lon_0=-81 +k=0.999941177 +x_0=200000.0001016002 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / Florida GDL Albers +<6439> +proj=aea +lat_1=24 +lat_2=31.5 +lat_0=24 +lon_0=-84 +x_0=400000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Florida North +<6440> +proj=lcc +lat_1=30.75 +lat_2=29.58333333333333 +lat_0=29 +lon_0=-84.5 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Florida North (ftUS) +<6441> +proj=lcc +lat_1=30.75 +lat_2=29.58333333333333 +lat_0=29 +lon_0=-84.5 +x_0=600000 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / Florida West +<6442> +proj=tmerc +lat_0=24.33333333333333 +lon_0=-82 +k=0.999941177 +x_0=200000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Florida West (ftUS) +<6443> +proj=tmerc +lat_0=24.33333333333333 +lon_0=-82 +k=0.999941177 +x_0=200000.0001016002 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / Georgia East +<6444> +proj=tmerc +lat_0=30 +lon_0=-82.16666666666667 +k=0.9999 +x_0=200000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Georgia East (ftUS) +<6445> +proj=tmerc +lat_0=30 +lon_0=-82.16666666666667 +k=0.9999 +x_0=200000.0001016002 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / Georgia West +<6446> +proj=tmerc +lat_0=30 +lon_0=-84.16666666666667 +k=0.9999 +x_0=700000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Georgia West (ftUS) +<6447> +proj=tmerc +lat_0=30 +lon_0=-84.16666666666667 +k=0.9999 +x_0=699999.9998983998 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / Idaho Central +<6448> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-114 +k=0.9999473679999999 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Idaho Central (ftUS) +<6449> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-114 +k=0.9999473679999999 +x_0=500000.0001016001 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / Idaho East +<6450> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-112.1666666666667 +k=0.9999473679999999 +x_0=200000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Idaho East (ftUS) +<6451> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-112.1666666666667 +k=0.9999473679999999 +x_0=200000.0001016002 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / Idaho West +<6452> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-115.75 +k=0.999933333 +x_0=800000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Idaho West (ftUS) +<6453> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-115.75 +k=0.999933333 +x_0=800000.0001016001 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / Illinois East +<6454> +proj=tmerc +lat_0=36.66666666666666 +lon_0=-88.33333333333333 +k=0.9999749999999999 +x_0=300000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Illinois East (ftUS) +<6455> +proj=tmerc +lat_0=36.66666666666666 +lon_0=-88.33333333333333 +k=0.9999749999999999 +x_0=300000.0000000001 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / Illinois West +<6456> +proj=tmerc +lat_0=36.66666666666666 +lon_0=-90.16666666666667 +k=0.999941177 +x_0=700000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Illinois West (ftUS) +<6457> +proj=tmerc +lat_0=36.66666666666666 +lon_0=-90.16666666666667 +k=0.999941177 +x_0=699999.9999898402 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / Indiana East +<6458> +proj=tmerc +lat_0=37.5 +lon_0=-85.66666666666667 +k=0.999966667 +x_0=100000 +y_0=250000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Indiana East (ftUS) +<6459> +proj=tmerc +lat_0=37.5 +lon_0=-85.66666666666667 +k=0.999966667 +x_0=99999.99989839978 +y_0=249999.9998983998 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / Indiana West +<6460> +proj=tmerc +lat_0=37.5 +lon_0=-87.08333333333333 +k=0.999966667 +x_0=900000 +y_0=250000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Indiana West (ftUS) +<6461> +proj=tmerc +lat_0=37.5 +lon_0=-87.08333333333333 +k=0.999966667 +x_0=900000 +y_0=249999.9998983998 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / Iowa North +<6462> +proj=lcc +lat_1=43.26666666666667 +lat_2=42.06666666666667 +lat_0=41.5 +lon_0=-93.5 +x_0=1500000 +y_0=1000000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Iowa North (ftUS) +<6463> +proj=lcc +lat_1=43.26666666666667 +lat_2=42.06666666666667 +lat_0=41.5 +lon_0=-93.5 +x_0=1500000 +y_0=999999.9999898402 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / Iowa South +<6464> +proj=lcc +lat_1=41.78333333333333 +lat_2=40.61666666666667 +lat_0=40 +lon_0=-93.5 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Iowa South (ftUS) +<6465> +proj=lcc +lat_1=41.78333333333333 +lat_2=40.61666666666667 +lat_0=40 +lon_0=-93.5 +x_0=500000.00001016 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / Kansas North +<6466> +proj=lcc +lat_1=39.78333333333333 +lat_2=38.71666666666667 +lat_0=38.33333333333334 +lon_0=-98 +x_0=400000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Kansas North (ftUS) +<6467> +proj=lcc +lat_1=39.78333333333333 +lat_2=38.71666666666667 +lat_0=38.33333333333334 +lon_0=-98 +x_0=399999.99998984 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / Kansas South +<6468> +proj=lcc +lat_1=38.56666666666667 +lat_2=37.26666666666667 +lat_0=36.66666666666666 +lon_0=-98.5 +x_0=400000 +y_0=400000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Kansas South (ftUS) +<6469> +proj=lcc +lat_1=38.56666666666667 +lat_2=37.26666666666667 +lat_0=36.66666666666666 +lon_0=-98.5 +x_0=399999.99998984 +y_0=399999.99998984 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / Kentucky North +<6470> +proj=lcc +lat_1=37.96666666666667 +lat_2=38.96666666666667 +lat_0=37.5 +lon_0=-84.25 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Kentucky North (ftUS) +<6471> +proj=lcc +lat_1=37.96666666666667 +lat_2=38.96666666666667 +lat_0=37.5 +lon_0=-84.25 +x_0=500000.0001016001 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / Kentucky Single Zone +<6472> +proj=lcc +lat_1=37.08333333333334 +lat_2=38.66666666666666 +lat_0=36.33333333333334 +lon_0=-85.75 +x_0=1500000 +y_0=1000000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Kentucky Single Zone (ftUS) +<6473> +proj=lcc +lat_1=37.08333333333334 +lat_2=38.66666666666666 +lat_0=36.33333333333334 +lon_0=-85.75 +x_0=1500000 +y_0=999999.9998983998 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / Kentucky South +<6474> +proj=lcc +lat_1=37.93333333333333 +lat_2=36.73333333333333 +lat_0=36.33333333333334 +lon_0=-85.75 +x_0=500000 +y_0=500000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Kentucky South (ftUS) +<6475> +proj=lcc +lat_1=37.93333333333333 +lat_2=36.73333333333333 +lat_0=36.33333333333334 +lon_0=-85.75 +x_0=500000.0001016001 +y_0=500000.0001016001 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / Louisiana North +<6476> +proj=lcc +lat_1=32.66666666666666 +lat_2=31.16666666666667 +lat_0=30.5 +lon_0=-92.5 +x_0=1000000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Louisiana North (ftUS) +<6477> +proj=lcc +lat_1=32.66666666666666 +lat_2=31.16666666666667 +lat_0=30.5 +lon_0=-92.5 +x_0=999999.9999898402 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / Louisiana South +<6478> +proj=lcc +lat_1=30.7 +lat_2=29.3 +lat_0=28.5 +lon_0=-91.33333333333333 +x_0=1000000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Louisiana South (ftUS) +<6479> +proj=lcc +lat_1=30.7 +lat_2=29.3 +lat_0=28.5 +lon_0=-91.33333333333333 +x_0=999999.9999898402 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / Maine CS2000 Central +<6480> +proj=tmerc +lat_0=43.5 +lon_0=-69.125 +k=0.99998 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Maine CS2000 East +<6481> +proj=tmerc +lat_0=43.83333333333334 +lon_0=-67.875 +k=0.99998 +x_0=700000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Maine CS2000 West +<6482> +proj=tmerc +lat_0=42.83333333333334 +lon_0=-70.375 +k=0.99998 +x_0=300000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Maine East +<6483> +proj=tmerc +lat_0=43.66666666666666 +lon_0=-68.5 +k=0.9999 +x_0=300000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Maine East (ftUS) +<6484> +proj=tmerc +lat_0=43.66666666666666 +lon_0=-68.5 +k=0.9999 +x_0=300000.0000000001 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / Maine West +<6485> +proj=tmerc +lat_0=42.83333333333334 +lon_0=-70.16666666666667 +k=0.999966667 +x_0=900000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Maine West (ftUS) +<6486> +proj=tmerc +lat_0=42.83333333333334 +lon_0=-70.16666666666667 +k=0.999966667 +x_0=900000 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / Maryland +<6487> +proj=lcc +lat_1=39.45 +lat_2=38.3 +lat_0=37.66666666666666 +lon_0=-77 +x_0=400000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Maryland (ftUS) +<6488> +proj=lcc +lat_1=39.45 +lat_2=38.3 +lat_0=37.66666666666666 +lon_0=-77 +x_0=399999.9998983998 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / Massachusetts Island +<6489> +proj=lcc +lat_1=41.48333333333333 +lat_2=41.28333333333333 +lat_0=41 +lon_0=-70.5 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Massachusetts Island (ftUS) +<6490> +proj=lcc +lat_1=41.48333333333333 +lat_2=41.28333333333333 +lat_0=41 +lon_0=-70.5 +x_0=500000.0001016001 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / Massachusetts Mainland +<6491> +proj=lcc +lat_1=42.68333333333333 +lat_2=41.71666666666667 +lat_0=41 +lon_0=-71.5 +x_0=200000 +y_0=750000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Massachusetts Mainland (ftUS) +<6492> +proj=lcc +lat_1=42.68333333333333 +lat_2=41.71666666666667 +lat_0=41 +lon_0=-71.5 +x_0=200000.0001016002 +y_0=750000 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / Michigan Central +<6493> +proj=lcc +lat_1=45.7 +lat_2=44.18333333333333 +lat_0=43.31666666666667 +lon_0=-84.36666666666666 +x_0=6000000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Michigan Central (ft) +<6494> +proj=lcc +lat_1=45.7 +lat_2=44.18333333333333 +lat_0=43.31666666666667 +lon_0=-84.36666666666666 +x_0=5999999.999976001 +y_0=0 +ellps=GRS80 +units=ft +no_defs <> +# NAD83(2011) / Michigan North +<6495> +proj=lcc +lat_1=47.08333333333334 +lat_2=45.48333333333333 +lat_0=44.78333333333333 +lon_0=-87 +x_0=8000000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Michigan North (ft) +<6496> +proj=lcc +lat_1=47.08333333333334 +lat_2=45.48333333333333 +lat_0=44.78333333333333 +lon_0=-87 +x_0=7999999.999968001 +y_0=0 +ellps=GRS80 +units=ft +no_defs <> +# NAD83(2011) / Michigan Oblique Mercator +<6497> +proj=omerc +lat_0=45.30916666666666 +lonc=-86 +alpha=337.25556 +k=0.9996 +x_0=2546731.496 +y_0=-4354009.816 +no_uoff +gamma=337.25556 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Michigan South +<6498> +proj=lcc +lat_1=43.66666666666666 +lat_2=42.1 +lat_0=41.5 +lon_0=-84.36666666666666 +x_0=4000000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Michigan South (ft) +<6499> +proj=lcc +lat_1=43.66666666666666 +lat_2=42.1 +lat_0=41.5 +lon_0=-84.36666666666666 +x_0=3999999.999984 +y_0=0 +ellps=GRS80 +units=ft +no_defs <> +# NAD83(2011) / Minnesota Central +<6500> +proj=lcc +lat_1=47.05 +lat_2=45.61666666666667 +lat_0=45 +lon_0=-94.25 +x_0=800000 +y_0=100000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Minnesota Central (ftUS) +<6501> +proj=lcc +lat_1=47.05 +lat_2=45.61666666666667 +lat_0=45 +lon_0=-94.25 +x_0=800000.0000101599 +y_0=99999.99998983997 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / Minnesota North +<6502> +proj=lcc +lat_1=48.63333333333333 +lat_2=47.03333333333333 +lat_0=46.5 +lon_0=-93.09999999999999 +x_0=800000 +y_0=100000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Minnesota North (ftUS) +<6503> +proj=lcc +lat_1=48.63333333333333 +lat_2=47.03333333333333 +lat_0=46.5 +lon_0=-93.09999999999999 +x_0=800000.0000101599 +y_0=99999.99998983997 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / Minnesota South +<6504> +proj=lcc +lat_1=45.21666666666667 +lat_2=43.78333333333333 +lat_0=43 +lon_0=-94 +x_0=800000 +y_0=100000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Minnesota South (ftUS) +<6505> +proj=lcc +lat_1=45.21666666666667 +lat_2=43.78333333333333 +lat_0=43 +lon_0=-94 +x_0=800000.0000101599 +y_0=99999.99998983997 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / Mississippi East +<6506> +proj=tmerc +lat_0=29.5 +lon_0=-88.83333333333333 +k=0.99995 +x_0=300000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Mississippi East (ftUS) +<6507> +proj=tmerc +lat_0=29.5 +lon_0=-88.83333333333333 +k=0.99995 +x_0=300000.0000000001 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / Mississippi TM +<6508> +proj=tmerc +lat_0=32.5 +lon_0=-89.75 +k=0.9998335 +x_0=500000 +y_0=1300000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Mississippi West +<6509> +proj=tmerc +lat_0=29.5 +lon_0=-90.33333333333333 +k=0.99995 +x_0=700000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Mississippi West (ftUS) +<6510> +proj=tmerc +lat_0=29.5 +lon_0=-90.33333333333333 +k=0.99995 +x_0=699999.9998983998 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / Missouri Central +<6511> +proj=tmerc +lat_0=35.83333333333334 +lon_0=-92.5 +k=0.999933333 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Missouri East +<6512> +proj=tmerc +lat_0=35.83333333333334 +lon_0=-90.5 +k=0.999933333 +x_0=250000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Missouri West +<6513> +proj=tmerc +lat_0=36.16666666666666 +lon_0=-94.5 +k=0.999941177 +x_0=850000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Montana +<6514> +proj=lcc +lat_1=49 +lat_2=45 +lat_0=44.25 +lon_0=-109.5 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Montana (ft) +<6515> +proj=lcc +lat_1=49 +lat_2=45 +lat_0=44.25 +lon_0=-109.5 +x_0=599999.9999976 +y_0=0 +ellps=GRS80 +units=ft +no_defs <> +# NAD83(2011) / Nebraska +<6516> +proj=lcc +lat_1=43 +lat_2=40 +lat_0=39.83333333333334 +lon_0=-100 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Nebraska (ftUS) (deprecated) +<6517> +proj=lcc +lat_1=43 +lat_2=40 +lat_0=39.83333333333334 +lon_0=-100 +x_0=500000.00001016 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(2011) / Nevada Central +<6518> +proj=tmerc +lat_0=34.75 +lon_0=-116.6666666666667 +k=0.9999 +x_0=500000 +y_0=6000000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Nevada Central (ftUS) +<6519> +proj=tmerc +lat_0=34.75 +lon_0=-116.6666666666667 +k=0.9999 +x_0=500000.00001016 +y_0=6000000 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / Nevada East +<6520> +proj=tmerc +lat_0=34.75 +lon_0=-115.5833333333333 +k=0.9999 +x_0=200000 +y_0=8000000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Nevada East (ftUS) +<6521> +proj=tmerc +lat_0=34.75 +lon_0=-115.5833333333333 +k=0.9999 +x_0=200000.00001016 +y_0=8000000.000010163 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / Nevada West +<6522> +proj=tmerc +lat_0=34.75 +lon_0=-118.5833333333333 +k=0.9999 +x_0=800000 +y_0=4000000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Nevada West (ftUS) +<6523> +proj=tmerc +lat_0=34.75 +lon_0=-118.5833333333333 +k=0.9999 +x_0=800000.0000101599 +y_0=3999999.99998984 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / New Hampshire +<6524> +proj=tmerc +lat_0=42.5 +lon_0=-71.66666666666667 +k=0.999966667 +x_0=300000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / New Hampshire (ftUS) +<6525> +proj=tmerc +lat_0=42.5 +lon_0=-71.66666666666667 +k=0.999966667 +x_0=300000.0000000001 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / New Jersey +<6526> +proj=tmerc +lat_0=38.83333333333334 +lon_0=-74.5 +k=0.9999 +x_0=150000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / New Jersey (ftUS) +<6527> +proj=tmerc +lat_0=38.83333333333334 +lon_0=-74.5 +k=0.9999 +x_0=150000 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / New Mexico Central +<6528> +proj=tmerc +lat_0=31 +lon_0=-106.25 +k=0.9999 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / New Mexico Central (ftUS) +<6529> +proj=tmerc +lat_0=31 +lon_0=-106.25 +k=0.9999 +x_0=500000.0001016001 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / New Mexico East +<6530> +proj=tmerc +lat_0=31 +lon_0=-104.3333333333333 +k=0.999909091 +x_0=165000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / New Mexico East (ftUS) +<6531> +proj=tmerc +lat_0=31 +lon_0=-104.3333333333333 +k=0.999909091 +x_0=165000 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / New Mexico West +<6532> +proj=tmerc +lat_0=31 +lon_0=-107.8333333333333 +k=0.999916667 +x_0=830000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / New Mexico West (ftUS) +<6533> +proj=tmerc +lat_0=31 +lon_0=-107.8333333333333 +k=0.999916667 +x_0=830000.0001016001 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / New York Central +<6534> +proj=tmerc +lat_0=40 +lon_0=-76.58333333333333 +k=0.9999375 +x_0=250000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / New York Central (ftUS) +<6535> +proj=tmerc +lat_0=40 +lon_0=-76.58333333333333 +k=0.9999375 +x_0=249999.9998983998 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / New York East +<6536> +proj=tmerc +lat_0=38.83333333333334 +lon_0=-74.5 +k=0.9999 +x_0=150000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / New York East (ftUS) +<6537> +proj=tmerc +lat_0=38.83333333333334 +lon_0=-74.5 +k=0.9999 +x_0=150000 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / New York Long Island +<6538> +proj=lcc +lat_1=41.03333333333333 +lat_2=40.66666666666666 +lat_0=40.16666666666666 +lon_0=-74 +x_0=300000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / New York Long Island (ftUS) +<6539> +proj=lcc +lat_1=41.03333333333333 +lat_2=40.66666666666666 +lat_0=40.16666666666666 +lon_0=-74 +x_0=300000.0000000001 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / New York West +<6540> +proj=tmerc +lat_0=40 +lon_0=-78.58333333333333 +k=0.9999375 +x_0=350000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / New York West (ftUS) +<6541> +proj=tmerc +lat_0=40 +lon_0=-78.58333333333333 +k=0.9999375 +x_0=350000.0001016001 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / North Carolina +<6542> +proj=lcc +lat_1=36.16666666666666 +lat_2=34.33333333333334 +lat_0=33.75 +lon_0=-79 +x_0=609601.22 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / North Carolina (ftUS) +<6543> +proj=lcc +lat_1=36.16666666666666 +lat_2=34.33333333333334 +lat_0=33.75 +lon_0=-79 +x_0=609601.2192024384 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / North Dakota North +<6544> +proj=lcc +lat_1=48.73333333333333 +lat_2=47.43333333333333 +lat_0=47 +lon_0=-100.5 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / North Dakota North (ft) +<6545> +proj=lcc +lat_1=48.73333333333333 +lat_2=47.43333333333333 +lat_0=47 +lon_0=-100.5 +x_0=599999.9999976 +y_0=0 +ellps=GRS80 +units=ft +no_defs <> +# NAD83(2011) / North Dakota South +<6546> +proj=lcc +lat_1=47.48333333333333 +lat_2=46.18333333333333 +lat_0=45.66666666666666 +lon_0=-100.5 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / North Dakota South (ft) +<6547> +proj=lcc +lat_1=47.48333333333333 +lat_2=46.18333333333333 +lat_0=45.66666666666666 +lon_0=-100.5 +x_0=599999.9999976 +y_0=0 +ellps=GRS80 +units=ft +no_defs <> +# NAD83(2011) / Ohio North +<6548> +proj=lcc +lat_1=41.7 +lat_2=40.43333333333333 +lat_0=39.66666666666666 +lon_0=-82.5 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Ohio North (ftUS) +<6549> +proj=lcc +lat_1=41.7 +lat_2=40.43333333333333 +lat_0=39.66666666666666 +lon_0=-82.5 +x_0=600000 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / Ohio South +<6550> +proj=lcc +lat_1=40.03333333333333 +lat_2=38.73333333333333 +lat_0=38 +lon_0=-82.5 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Ohio South (ftUS) +<6551> +proj=lcc +lat_1=40.03333333333333 +lat_2=38.73333333333333 +lat_0=38 +lon_0=-82.5 +x_0=600000 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / Oklahoma North +<6552> +proj=lcc +lat_1=36.76666666666667 +lat_2=35.56666666666667 +lat_0=35 +lon_0=-98 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Oklahoma North (ftUS) +<6553> +proj=lcc +lat_1=36.76666666666667 +lat_2=35.56666666666667 +lat_0=35 +lon_0=-98 +x_0=600000 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / Oklahoma South +<6554> +proj=lcc +lat_1=35.23333333333333 +lat_2=33.93333333333333 +lat_0=33.33333333333334 +lon_0=-98 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Oklahoma South (ftUS) +<6555> +proj=lcc +lat_1=35.23333333333333 +lat_2=33.93333333333333 +lat_0=33.33333333333334 +lon_0=-98 +x_0=600000 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / Oregon LCC (m) +<6556> +proj=lcc +lat_1=43 +lat_2=45.5 +lat_0=41.75 +lon_0=-120.5 +x_0=400000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Oregon GIC Lambert (ft) +<6557> +proj=lcc +lat_1=43 +lat_2=45.5 +lat_0=41.75 +lon_0=-120.5 +x_0=399999.9999984 +y_0=0 +ellps=GRS80 +units=ft +no_defs <> +# NAD83(2011) / Oregon North +<6558> +proj=lcc +lat_1=46 +lat_2=44.33333333333334 +lat_0=43.66666666666666 +lon_0=-120.5 +x_0=2500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Oregon North (ft) +<6559> +proj=lcc +lat_1=46 +lat_2=44.33333333333334 +lat_0=43.66666666666666 +lon_0=-120.5 +x_0=2500000.0001424 +y_0=0 +ellps=GRS80 +units=ft +no_defs <> +# NAD83(2011) / Oregon South +<6560> +proj=lcc +lat_1=44 +lat_2=42.33333333333334 +lat_0=41.66666666666666 +lon_0=-120.5 +x_0=1500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Oregon South (ft) +<6561> +proj=lcc +lat_1=44 +lat_2=42.33333333333334 +lat_0=41.66666666666666 +lon_0=-120.5 +x_0=1500000.0001464 +y_0=0 +ellps=GRS80 +units=ft +no_defs <> +# NAD83(2011) / Pennsylvania North +<6562> +proj=lcc +lat_1=41.95 +lat_2=40.88333333333333 +lat_0=40.16666666666666 +lon_0=-77.75 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Pennsylvania North (ftUS) +<6563> +proj=lcc +lat_1=41.95 +lat_2=40.88333333333333 +lat_0=40.16666666666666 +lon_0=-77.75 +x_0=600000 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / Pennsylvania South +<6564> +proj=lcc +lat_1=40.96666666666667 +lat_2=39.93333333333333 +lat_0=39.33333333333334 +lon_0=-77.75 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Pennsylvania South (ftUS) +<6565> +proj=lcc +lat_1=40.96666666666667 +lat_2=39.93333333333333 +lat_0=39.33333333333334 +lon_0=-77.75 +x_0=600000 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / Puerto Rico and Virgin Is. +<6566> +proj=lcc +lat_1=18.43333333333333 +lat_2=18.03333333333333 +lat_0=17.83333333333333 +lon_0=-66.43333333333334 +x_0=200000 +y_0=200000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Rhode Island +<6567> +proj=tmerc +lat_0=41.08333333333334 +lon_0=-71.5 +k=0.99999375 +x_0=100000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Rhode Island (ftUS) +<6568> +proj=tmerc +lat_0=41.08333333333334 +lon_0=-71.5 +k=0.99999375 +x_0=99999.99998983997 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / South Carolina +<6569> +proj=lcc +lat_1=34.83333333333334 +lat_2=32.5 +lat_0=31.83333333333333 +lon_0=-81 +x_0=609600 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / South Carolina (ft) +<6570> +proj=lcc +lat_1=34.83333333333334 +lat_2=32.5 +lat_0=31.83333333333333 +lon_0=-81 +x_0=609600 +y_0=0 +ellps=GRS80 +units=ft +no_defs <> +# NAD83(2011) / South Dakota North +<6571> +proj=lcc +lat_1=45.68333333333333 +lat_2=44.41666666666666 +lat_0=43.83333333333334 +lon_0=-100 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / South Dakota North (ftUS) +<6572> +proj=lcc +lat_1=45.68333333333333 +lat_2=44.41666666666666 +lat_0=43.83333333333334 +lon_0=-100 +x_0=600000 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / South Dakota South +<6573> +proj=lcc +lat_1=44.4 +lat_2=42.83333333333334 +lat_0=42.33333333333334 +lon_0=-100.3333333333333 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / South Dakota South (ftUS) +<6574> +proj=lcc +lat_1=44.4 +lat_2=42.83333333333334 +lat_0=42.33333333333334 +lon_0=-100.3333333333333 +x_0=600000 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / Tennessee +<6575> +proj=lcc +lat_1=36.41666666666666 +lat_2=35.25 +lat_0=34.33333333333334 +lon_0=-86 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Tennessee (ftUS) +<6576> +proj=lcc +lat_1=36.41666666666666 +lat_2=35.25 +lat_0=34.33333333333334 +lon_0=-86 +x_0=600000 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / Texas Central +<6577> +proj=lcc +lat_1=31.88333333333333 +lat_2=30.11666666666667 +lat_0=29.66666666666667 +lon_0=-100.3333333333333 +x_0=700000 +y_0=3000000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Texas Central (ftUS) +<6578> +proj=lcc +lat_1=31.88333333333333 +lat_2=30.11666666666667 +lat_0=29.66666666666667 +lon_0=-100.3333333333333 +x_0=699999.9998983998 +y_0=3000000 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / Texas Centric Albers Equal Area +<6579> +proj=aea +lat_1=27.5 +lat_2=35 +lat_0=18 +lon_0=-100 +x_0=1500000 +y_0=6000000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Texas Centric Lambert Conformal +<6580> +proj=lcc +lat_1=27.5 +lat_2=35 +lat_0=18 +lon_0=-100 +x_0=1500000 +y_0=5000000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Texas North +<6581> +proj=lcc +lat_1=36.18333333333333 +lat_2=34.65 +lat_0=34 +lon_0=-101.5 +x_0=200000 +y_0=1000000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Texas North (ftUS) +<6582> +proj=lcc +lat_1=36.18333333333333 +lat_2=34.65 +lat_0=34 +lon_0=-101.5 +x_0=200000.0001016002 +y_0=999999.9998983998 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / Texas North Central +<6583> +proj=lcc +lat_1=33.96666666666667 +lat_2=32.13333333333333 +lat_0=31.66666666666667 +lon_0=-98.5 +x_0=600000 +y_0=2000000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Texas North Central (ftUS) +<6584> +proj=lcc +lat_1=33.96666666666667 +lat_2=32.13333333333333 +lat_0=31.66666666666667 +lon_0=-98.5 +x_0=600000 +y_0=2000000.0001016 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / Texas South +<6585> +proj=lcc +lat_1=27.83333333333333 +lat_2=26.16666666666667 +lat_0=25.66666666666667 +lon_0=-98.5 +x_0=300000 +y_0=5000000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Texas South (ftUS) +<6586> +proj=lcc +lat_1=27.83333333333333 +lat_2=26.16666666666667 +lat_0=25.66666666666667 +lon_0=-98.5 +x_0=300000.0000000001 +y_0=5000000.0001016 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / Texas South Central +<6587> +proj=lcc +lat_1=30.28333333333333 +lat_2=28.38333333333333 +lat_0=27.83333333333333 +lon_0=-99 +x_0=600000 +y_0=4000000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Texas South Central (ftUS) +<6588> +proj=lcc +lat_1=30.28333333333333 +lat_2=28.38333333333333 +lat_0=27.83333333333333 +lon_0=-99 +x_0=600000 +y_0=3999999.9998984 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / Vermont +<6589> +proj=tmerc +lat_0=42.5 +lon_0=-72.5 +k=0.999964286 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Vermont (ftUS) +<6590> +proj=tmerc +lat_0=42.5 +lon_0=-72.5 +k=0.999964286 +x_0=500000.00001016 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / Virginia Lambert +<6591> +proj=lcc +lat_1=37 +lat_2=39.5 +lat_0=36 +lon_0=-79.5 +x_0=0 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Virginia North +<6592> +proj=lcc +lat_1=39.2 +lat_2=38.03333333333333 +lat_0=37.66666666666666 +lon_0=-78.5 +x_0=3500000 +y_0=2000000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Virginia North (ftUS) +<6593> +proj=lcc +lat_1=39.2 +lat_2=38.03333333333333 +lat_0=37.66666666666666 +lon_0=-78.5 +x_0=3500000.0001016 +y_0=2000000.0001016 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / Virginia South +<6594> +proj=lcc +lat_1=37.96666666666667 +lat_2=36.76666666666667 +lat_0=36.33333333333334 +lon_0=-78.5 +x_0=3500000 +y_0=1000000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Virginia South (ftUS) +<6595> +proj=lcc +lat_1=37.96666666666667 +lat_2=36.76666666666667 +lat_0=36.33333333333334 +lon_0=-78.5 +x_0=3500000.0001016 +y_0=999999.9998983998 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / Washington North +<6596> +proj=lcc +lat_1=48.73333333333333 +lat_2=47.5 +lat_0=47 +lon_0=-120.8333333333333 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Washington North (ftUS) +<6597> +proj=lcc +lat_1=48.73333333333333 +lat_2=47.5 +lat_0=47 +lon_0=-120.8333333333333 +x_0=500000.0001016001 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / Washington South +<6598> +proj=lcc +lat_1=47.33333333333334 +lat_2=45.83333333333334 +lat_0=45.33333333333334 +lon_0=-120.5 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Washington South (ftUS) +<6599> +proj=lcc +lat_1=47.33333333333334 +lat_2=45.83333333333334 +lat_0=45.33333333333334 +lon_0=-120.5 +x_0=500000.0001016001 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / West Virginia North +<6600> +proj=lcc +lat_1=40.25 +lat_2=39 +lat_0=38.5 +lon_0=-79.5 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / West Virginia North (ftUS) +<6601> +proj=lcc +lat_1=40.25 +lat_2=39 +lat_0=38.5 +lon_0=-79.5 +x_0=600000 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / West Virginia South +<6602> +proj=lcc +lat_1=38.88333333333333 +lat_2=37.48333333333333 +lat_0=37 +lon_0=-81 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / West Virginia South (ftUS) +<6603> +proj=lcc +lat_1=38.88333333333333 +lat_2=37.48333333333333 +lat_0=37 +lon_0=-81 +x_0=600000 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / Wisconsin Central (deprecated) +<6604> +proj=lcc +lat_1=45.5 +lat_2=44.25 +lat_0=43.83333333333334 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(2011) / Wisconsin Central (ftUS) +<6605> +proj=lcc +lat_1=45.5 +lat_2=44.25 +lat_0=43.83333333333334 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / Wisconsin North +<6606> +proj=lcc +lat_1=46.76666666666667 +lat_2=45.56666666666667 +lat_0=45.16666666666666 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Wisconsin North (ftUS) +<6607> +proj=lcc +lat_1=46.76666666666667 +lat_2=45.56666666666667 +lat_0=45.16666666666666 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / Wisconsin South +<6608> +proj=lcc +lat_1=44.06666666666667 +lat_2=42.73333333333333 +lat_0=42 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Wisconsin South (ftUS) +<6609> +proj=lcc +lat_1=44.06666666666667 +lat_2=42.73333333333333 +lat_0=42 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / Wisconsin Transverse Mercator +<6610> +proj=tmerc +lat_0=0 +lon_0=-90 +k=0.9996 +x_0=520000 +y_0=-4480000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Wyoming East +<6611> +proj=tmerc +lat_0=40.5 +lon_0=-105.1666666666667 +k=0.9999375 +x_0=200000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Wyoming East (ftUS) +<6612> +proj=tmerc +lat_0=40.5 +lon_0=-105.1666666666667 +k=0.9999375 +x_0=200000.00001016 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / Wyoming East Central +<6613> +proj=tmerc +lat_0=40.5 +lon_0=-107.3333333333333 +k=0.9999375 +x_0=400000 +y_0=100000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Wyoming East Central (ftUS) +<6614> +proj=tmerc +lat_0=40.5 +lon_0=-107.3333333333333 +k=0.9999375 +x_0=399999.99998984 +y_0=99999.99998983997 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / Wyoming West +<6615> +proj=tmerc +lat_0=40.5 +lon_0=-110.0833333333333 +k=0.9999375 +x_0=800000 +y_0=100000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Wyoming West (ftUS) +<6616> +proj=tmerc +lat_0=40.5 +lon_0=-110.0833333333333 +k=0.9999375 +x_0=800000.0000101599 +y_0=99999.99998983997 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / Wyoming West Central +<6617> +proj=tmerc +lat_0=40.5 +lon_0=-108.75 +k=0.9999375 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Wyoming West Central (ftUS) +<6618> +proj=tmerc +lat_0=40.5 +lon_0=-108.75 +k=0.9999375 +x_0=600000 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / Utah Central +<6619> +proj=lcc +lat_1=40.65 +lat_2=39.01666666666667 +lat_0=38.33333333333334 +lon_0=-111.5 +x_0=500000 +y_0=2000000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Utah North +<6620> +proj=lcc +lat_1=41.78333333333333 +lat_2=40.71666666666667 +lat_0=40.33333333333334 +lon_0=-111.5 +x_0=500000 +y_0=1000000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Utah South +<6621> +proj=lcc +lat_1=38.35 +lat_2=37.21666666666667 +lat_0=36.66666666666666 +lon_0=-111.5 +x_0=500000 +y_0=3000000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(CSRS) / Quebec Lambert +<6622> +proj=lcc +lat_1=60 +lat_2=46 +lat_0=44 +lon_0=-68.5 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83 / Quebec Albers +<6623> +proj=aea +lat_1=60 +lat_2=46 +lat_0=44 +lon_0=-68.5 +x_0=0 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83(CSRS) / Quebec Albers +<6624> +proj=aea +lat_1=60 +lat_2=46 +lat_0=44 +lon_0=-68.5 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(2011) / Utah Central (ftUS) +<6625> +proj=lcc +lat_1=40.65 +lat_2=39.01666666666667 +lat_0=38.33333333333334 +lon_0=-111.5 +x_0=500000.00001016 +y_0=2000000.00001016 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / Utah North (ftUS) +<6626> +proj=lcc +lat_1=41.78333333333333 +lat_2=40.71666666666667 +lat_0=40.33333333333334 +lon_0=-111.5 +x_0=500000.00001016 +y_0=999999.9999898402 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / Utah South (ftUS) +<6627> +proj=lcc +lat_1=38.35 +lat_2=37.21666666666667 +lat_0=36.66666666666666 +lon_0=-111.5 +x_0=500000.00001016 +y_0=3000000 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(PA11) / Hawaii zone 1 +<6628> +proj=tmerc +lat_0=18.83333333333333 +lon_0=-155.5 +k=0.999966667 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(PA11) / Hawaii zone 2 +<6629> +proj=tmerc +lat_0=20.33333333333333 +lon_0=-156.6666666666667 +k=0.999966667 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(PA11) / Hawaii zone 3 +<6630> +proj=tmerc +lat_0=21.16666666666667 +lon_0=-158 +k=0.99999 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(PA11) / Hawaii zone 4 +<6631> +proj=tmerc +lat_0=21.83333333333333 +lon_0=-159.5 +k=0.99999 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(PA11) / Hawaii zone 5 +<6632> +proj=tmerc +lat_0=21.66666666666667 +lon_0=-160.1666666666667 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(PA11) / Hawaii zone 3 (ftUS) +<6633> +proj=tmerc +lat_0=21.16666666666667 +lon_0=-158 +k=0.99999 +x_0=500000.00001016 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(PA11) / UTM zone 4N +<6634> +proj=utm +zone=4 +ellps=GRS80 +units=m +no_defs <> +# NAD83(PA11) / UTM zone 5N +<6635> +proj=utm +zone=5 +ellps=GRS80 +units=m +no_defs <> +# NAD83(PA11) / UTM zone 2S +<6636> +proj=utm +zone=2 +south +ellps=GRS80 +units=m +no_defs <> +# NAD83(MA11) / Guam Map Grid +<6637> +proj=tmerc +lat_0=13.5 +lon_0=144.75 +k=1 +x_0=100000 +y_0=200000 +ellps=GRS80 +units=m +no_defs <> +# Karbala 1979 / Iraq National Grid +<6646> +proj=tmerc +lat_0=29.02626833333333 +lon_0=46.5 +k=0.9994 +x_0=800000 +y_0=0 +ellps=clrk80 +towgs84=70.995,-335.916,262.898,0,0,0,0 +units=m +no_defs <> +# JGD2011 / Japan Plane Rectangular CS I +<6669> +proj=tmerc +lat_0=33 +lon_0=129.5 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# JGD2011 / Japan Plane Rectangular CS II +<6670> +proj=tmerc +lat_0=33 +lon_0=131 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# JGD2011 / Japan Plane Rectangular CS III +<6671> +proj=tmerc +lat_0=36 +lon_0=132.1666666666667 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# JGD2011 / Japan Plane Rectangular CS IV +<6672> +proj=tmerc +lat_0=33 +lon_0=133.5 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# JGD2011 / Japan Plane Rectangular CS V +<6673> +proj=tmerc +lat_0=36 +lon_0=134.3333333333333 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# JGD2011 / Japan Plane Rectangular CS VI +<6674> +proj=tmerc +lat_0=36 +lon_0=136 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# JGD2011 / Japan Plane Rectangular CS VII +<6675> +proj=tmerc +lat_0=36 +lon_0=137.1666666666667 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# JGD2011 / Japan Plane Rectangular CS VIII +<6676> +proj=tmerc +lat_0=36 +lon_0=138.5 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# JGD2011 / Japan Plane Rectangular CS IX +<6677> +proj=tmerc +lat_0=36 +lon_0=139.8333333333333 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# JGD2011 / Japan Plane Rectangular CS X +<6678> +proj=tmerc +lat_0=40 +lon_0=140.8333333333333 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# JGD2011 / Japan Plane Rectangular CS XI +<6679> +proj=tmerc +lat_0=44 +lon_0=140.25 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# JGD2011 / Japan Plane Rectangular CS XII +<6680> +proj=tmerc +lat_0=44 +lon_0=142.25 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# JGD2011 / Japan Plane Rectangular CS XIII +<6681> +proj=tmerc +lat_0=44 +lon_0=144.25 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# JGD2011 / Japan Plane Rectangular CS XIV +<6682> +proj=tmerc +lat_0=26 +lon_0=142 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# JGD2011 / Japan Plane Rectangular CS XV +<6683> +proj=tmerc +lat_0=26 +lon_0=127.5 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# JGD2011 / Japan Plane Rectangular CS XVI +<6684> +proj=tmerc +lat_0=26 +lon_0=124 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# JGD2011 / Japan Plane Rectangular CS XVII +<6685> +proj=tmerc +lat_0=26 +lon_0=131 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# JGD2011 / Japan Plane Rectangular CS XVIII +<6686> +proj=tmerc +lat_0=20 +lon_0=136 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# JGD2011 / Japan Plane Rectangular CS XIX +<6687> +proj=tmerc +lat_0=26 +lon_0=154 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# JGD2011 / UTM zone 51N +<6688> +proj=utm +zone=51 +ellps=GRS80 +units=m +no_defs <> +# JGD2011 / UTM zone 52N +<6689> +proj=utm +zone=52 +ellps=GRS80 +units=m +no_defs <> +# JGD2011 / UTM zone 53N +<6690> +proj=utm +zone=53 +ellps=GRS80 +units=m +no_defs <> +# JGD2011 / UTM zone 54N +<6691> +proj=utm +zone=54 +ellps=GRS80 +units=m +no_defs <> +# JGD2011 / UTM zone 55N +<6692> +proj=utm +zone=55 +ellps=GRS80 +units=m +no_defs <> +# WGS 84 / TM 60 SW +<6703> +proj=tmerc +lat_0=0 +lon_0=-60 +k=0.9996 +x_0=500000 +y_0=10000000 +datum=WGS84 +units=m +no_defs <> +# RDN2008 / UTM zone 32N (N-E) +<6707> +proj=utm +zone=32 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# RDN2008 / UTM zone 33N (N-E) +<6708> +proj=utm +zone=33 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# RDN2008 / UTM zone 34N (N-E) +<6709> +proj=utm +zone=34 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# WGS 84 / CIG92 +<6720> +proj=tmerc +lat_0=0 +lon_0=105.625 +k=1.000024 +x_0=50000 +y_0=1300000 +datum=WGS84 +units=m +no_defs <> +# GDA94 / CIG94 +<6721> +proj=tmerc +lat_0=0 +lon_0=105.625 +k=1.00002514 +x_0=50000 +y_0=1300000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# WGS 84 / CKIG92 +<6722> +proj=tmerc +lat_0=0 +lon_0=96.875 +k=1 +x_0=50000 +y_0=1400000 +datum=WGS84 +units=m +no_defs <> +# GDA94 / CKIG94 +<6723> +proj=tmerc +lat_0=0 +lon_0=96.875 +k=0.99999387 +x_0=50000 +y_0=1500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# GDA94 / MGA zone 41 (deprecated) +<6732> +proj=utm +zone=41 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# GDA94 / MGA zone 42 (deprecated) +<6733> +proj=utm +zone=42 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# GDA94 / MGA zone 43 (deprecated) +<6734> +proj=utm +zone=43 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# GDA94 / MGA zone 44 (deprecated) +<6735> +proj=utm +zone=44 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# GDA94 / MGA zone 46 +<6736> +proj=utm +zone=46 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# GDA94 / MGA zone 47 +<6737> +proj=utm +zone=47 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# GDA94 / MGA zone 59 +<6738> +proj=utm +zone=59 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CORS96) / Oregon Baker zone (m) +<6784> +proj=tmerc +lat_0=44.5 +lon_0=-117.8333333333333 +k=1.00016 +x_0=40000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(CORS96) / Oregon Baker zone (ft) +<6785> +proj=tmerc +lat_0=44.5 +lon_0=-117.8333333333333 +k=1.00016 +x_0=39999.99999984 +y_0=0 +ellps=GRS80 +units=ft +no_defs <> +# NAD83(2011) / Oregon Baker zone (m) +<6786> +proj=tmerc +lat_0=44.5 +lon_0=-117.8333333333333 +k=1.00016 +x_0=40000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Oregon Baker zone (ft) +<6787> +proj=tmerc +lat_0=44.5 +lon_0=-117.8333333333333 +k=1.00016 +x_0=39999.99999984 +y_0=0 +ellps=GRS80 +units=ft +no_defs <> +# NAD83(CORS96) / Oregon Bend-Klamath Falls zone (m) +<6788> +proj=tmerc +lat_0=41.75 +lon_0=-121.75 +k=1.0002 +x_0=80000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(CORS96) / Oregon Bend-Klamath Falls zone (ft) +<6789> +proj=tmerc +lat_0=41.75 +lon_0=-121.75 +k=1.0002 +x_0=79999.99999968 +y_0=0 +ellps=GRS80 +units=ft +no_defs <> +# NAD83(2011) / Oregon Bend-Klamath Falls zone (m) +<6790> +proj=tmerc +lat_0=41.75 +lon_0=-121.75 +k=1.0002 +x_0=80000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Oregon Bend-Klamath Falls zone (ft) +<6791> +proj=tmerc +lat_0=41.75 +lon_0=-121.75 +k=1.0002 +x_0=79999.99999968 +y_0=0 +ellps=GRS80 +units=ft +no_defs <> +# NAD83(CORS96) / Oregon Bend-Redmond-Prineville zone (m) +<6792> +proj=lcc +lat_1=44.66666666666666 +lat_0=44.66666666666666 +lon_0=-121.25 +k_0=1.00012 +x_0=80000 +y_0=130000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(CORS96) / Oregon Bend-Redmond-Prineville zone (ft) +<6793> +proj=lcc +lat_1=44.66666666666666 +lat_0=44.66666666666666 +lon_0=-121.25 +k_0=1.00012 +x_0=79999.99999968 +y_0=130000.00001472 +ellps=GRS80 +units=ft +no_defs <> +# NAD83(2011) / Oregon Bend-Redmond-Prineville zone (m) +<6794> +proj=lcc +lat_1=44.66666666666666 +lat_0=44.66666666666666 +lon_0=-121.25 +k_0=1.00012 +x_0=80000 +y_0=130000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Oregon Bend-Redmond-Prineville zone (ft) +<6795> +proj=lcc +lat_1=44.66666666666666 +lat_0=44.66666666666666 +lon_0=-121.25 +k_0=1.00012 +x_0=79999.99999968 +y_0=130000.00001472 +ellps=GRS80 +units=ft +no_defs <> +# NAD83(CORS96) / Oregon Bend-Burns zone (m) +<6796> +proj=lcc +lat_1=43.66666666666666 +lat_0=43.66666666666666 +lon_0=-119.75 +k_0=1.0002 +x_0=120000 +y_0=60000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(CORS96) / Oregon Bend-Burns zone (ft) +<6797> +proj=lcc +lat_1=43.66666666666666 +lat_0=43.66666666666666 +lon_0=-119.75 +k_0=1.0002 +x_0=119999.99999952 +y_0=59999.99999976 +ellps=GRS80 +units=ft +no_defs <> +# NAD83(2011) / Oregon Bend-Burns zone (m) +<6798> +proj=lcc +lat_1=43.66666666666666 +lat_0=43.66666666666666 +lon_0=-119.75 +k_0=1.0002 +x_0=120000 +y_0=60000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Oregon Bend-Burns zone (ft) +<6799> +proj=lcc +lat_1=43.66666666666666 +lat_0=43.66666666666666 +lon_0=-119.75 +k_0=1.0002 +x_0=119999.99999952 +y_0=59999.99999976 +ellps=GRS80 +units=ft +no_defs <> +# NAD83(CORS96) / Oregon Canyonville-Grants Pass zone (m) +<6800> +proj=tmerc +lat_0=42.5 +lon_0=-123.3333333333333 +k=1.00007 +x_0=40000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(CORS96) / Oregon Canyonville-Grants Pass zone (ft) +<6801> +proj=tmerc +lat_0=42.5 +lon_0=-123.3333333333333 +k=1.00007 +x_0=39999.99999984 +y_0=0 +ellps=GRS80 +units=ft +no_defs <> +# NAD83(2011) / Oregon Canyonville-Grants Pass zone (m) +<6802> +proj=tmerc +lat_0=42.5 +lon_0=-123.3333333333333 +k=1.00007 +x_0=40000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Oregon Canyonville-Grants Pass zone (ft) +<6803> +proj=tmerc +lat_0=42.5 +lon_0=-123.3333333333333 +k=1.00007 +x_0=39999.99999984 +y_0=0 +ellps=GRS80 +units=ft +no_defs <> +# NAD83(CORS96) / Oregon Columbia River East zone (m) +<6804> +proj=lcc +lat_1=45.66666666666666 +lat_0=45.66666666666666 +lon_0=-120.5 +k_0=1.000008 +x_0=150000 +y_0=30000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(CORS96) / Oregon Columbia River East zone (ft) +<6805> +proj=lcc +lat_1=45.66666666666666 +lat_0=45.66666666666666 +lon_0=-120.5 +k_0=1.000008 +x_0=150000.00001464 +y_0=30000.00001512 +ellps=GRS80 +units=ft +no_defs <> +# NAD83(2011) / Oregon Columbia River East zone (m) +<6806> +proj=lcc +lat_1=45.66666666666666 +lat_0=45.66666666666666 +lon_0=-120.5 +k_0=1.000008 +x_0=150000 +y_0=30000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Oregon Columbia River East zone (ft) +<6807> +proj=lcc +lat_1=45.66666666666666 +lat_0=45.66666666666666 +lon_0=-120.5 +k_0=1.000008 +x_0=150000.00001464 +y_0=30000.00001512 +ellps=GRS80 +units=ft +no_defs <> +# NAD83(CORS96) / Oregon Columbia River West zone (m) +<6808> +proj=omerc +lat_0=45.91666666666666 +lonc=-123 +alpha=295 +k=1 +x_0=7000000 +y_0=-3000000 +no_uoff +gamma=295 +ellps=GRS80 +units=m +no_defs <> +# NAD83(CORS96) / Oregon Columbia River West zone (ft) +<6809> +proj=omerc +lat_0=45.91666666666666 +lonc=-123 +alpha=295 +k=1 +x_0=7000000.00000248 +y_0=-2999999.999988 +no_uoff +gamma=295 +ellps=GRS80 +units=ft +no_defs <> +# NAD83(2011) / Oregon Columbia River West zone (m) +<6810> +proj=omerc +lat_0=45.91666666666666 +lonc=-123 +alpha=295 +k=1 +x_0=7000000 +y_0=-3000000 +no_uoff +gamma=295 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Oregon Columbia River West zone (ft) +<6811> +proj=omerc +lat_0=45.91666666666666 +lonc=-123 +alpha=295 +k=1 +x_0=7000000.00000248 +y_0=-2999999.999988 +no_uoff +gamma=295 +ellps=GRS80 +units=ft +no_defs <> +# NAD83(CORS96) / Oregon Cottage Grove-Canyonville zone (m) +<6812> +proj=tmerc +lat_0=42.83333333333334 +lon_0=-123.3333333333333 +k=1.000023 +x_0=50000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(CORS96) / Oregon Cottage Grove-Canyonville zone (ft) +<6813> +proj=tmerc +lat_0=42.83333333333334 +lon_0=-123.3333333333333 +k=1.000023 +x_0=50000.00001504 +y_0=0 +ellps=GRS80 +units=ft +no_defs <> +# NAD83(2011) / Oregon Cottage Grove-Canyonville zone (m) +<6814> +proj=tmerc +lat_0=42.83333333333334 +lon_0=-123.3333333333333 +k=1.000023 +x_0=50000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Oregon Cottage Grove-Canyonville zone (ft) +<6815> +proj=tmerc +lat_0=42.83333333333334 +lon_0=-123.3333333333333 +k=1.000023 +x_0=50000.00001504 +y_0=0 +ellps=GRS80 +units=ft +no_defs <> +# NAD83(CORS96) / Oregon Dufur-Madras zone (m) +<6816> +proj=tmerc +lat_0=44.5 +lon_0=-121 +k=1.00011 +x_0=80000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(CORS96) / Oregon Dufur-Madras zone (ft) +<6817> +proj=tmerc +lat_0=44.5 +lon_0=-121 +k=1.00011 +x_0=79999.99999968 +y_0=0 +ellps=GRS80 +units=ft +no_defs <> +# NAD83(2011) / Oregon Dufur-Madras zone (m) +<6818> +proj=tmerc +lat_0=44.5 +lon_0=-121 +k=1.00011 +x_0=80000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Oregon Dufur-Madras zone (ft) +<6819> +proj=tmerc +lat_0=44.5 +lon_0=-121 +k=1.00011 +x_0=79999.99999968 +y_0=0 +ellps=GRS80 +units=ft +no_defs <> +# NAD83(CORS96) / Oregon Eugene zone (m) +<6820> +proj=tmerc +lat_0=43.75 +lon_0=-123.1666666666667 +k=1.000015 +x_0=50000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(CORS96) / Oregon Eugene zone (ft) +<6821> +proj=tmerc +lat_0=43.75 +lon_0=-123.1666666666667 +k=1.000015 +x_0=50000.00001504 +y_0=0 +ellps=GRS80 +units=ft +no_defs <> +# NAD83(2011) / Oregon Eugene zone (m) +<6822> +proj=tmerc +lat_0=43.75 +lon_0=-123.1666666666667 +k=1.000015 +x_0=50000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Oregon Eugene zone (ft) +<6823> +proj=tmerc +lat_0=43.75 +lon_0=-123.1666666666667 +k=1.000015 +x_0=50000.00001504 +y_0=0 +ellps=GRS80 +units=ft +no_defs <> +# NAD83(CORS96) / Oregon Grants Pass-Ashland zone (m) +<6824> +proj=tmerc +lat_0=41.75 +lon_0=-123.3333333333333 +k=1.000043 +x_0=50000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(CORS96) / Oregon Grants Pass-Ashland zone (ft) +<6825> +proj=tmerc +lat_0=41.75 +lon_0=-123.3333333333333 +k=1.000043 +x_0=50000.00001504 +y_0=0 +ellps=GRS80 +units=ft +no_defs <> +# NAD83(2011) / Oregon Grants Pass-Ashland zone (m) +<6826> +proj=tmerc +lat_0=41.75 +lon_0=-123.3333333333333 +k=1.000043 +x_0=50000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Oregon Grants Pass-Ashland zone (ft) +<6827> +proj=tmerc +lat_0=41.75 +lon_0=-123.3333333333333 +k=1.000043 +x_0=50000.00001504 +y_0=0 +ellps=GRS80 +units=ft +no_defs <> +# NAD83(CORS96) / Oregon Gresham-Warm Springs zone (m) +<6828> +proj=tmerc +lat_0=45 +lon_0=-122.3333333333333 +k=1.00005 +x_0=10000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(CORS96) / Oregon Gresham-Warm Springs zone (ft) +<6829> +proj=tmerc +lat_0=45 +lon_0=-122.3333333333333 +k=1.00005 +x_0=10000.0000152 +y_0=0 +ellps=GRS80 +units=ft +no_defs <> +# NAD83(2011) / Oregon Gresham-Warm Springs zone (m) +<6830> +proj=tmerc +lat_0=45 +lon_0=-122.3333333333333 +k=1.00005 +x_0=10000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Oregon Gresham-Warm Springs zone (ft) +<6831> +proj=tmerc +lat_0=45 +lon_0=-122.3333333333333 +k=1.00005 +x_0=10000.0000152 +y_0=0 +ellps=GRS80 +units=ft +no_defs <> +# NAD83(CORS96) / Oregon La Grande zone (m) +<6832> +proj=tmerc +lat_0=45 +lon_0=-118 +k=1.00013 +x_0=40000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(CORS96) / Oregon La Grande zone (ft) +<6833> +proj=tmerc +lat_0=45 +lon_0=-118 +k=1.00013 +x_0=39999.99999984 +y_0=0 +ellps=GRS80 +units=ft +no_defs <> +# NAD83(2011) / Oregon La Grande zone (m) +<6834> +proj=tmerc +lat_0=45 +lon_0=-118 +k=1.00013 +x_0=40000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Oregon La Grande zone (ft) +<6835> +proj=tmerc +lat_0=45 +lon_0=-118 +k=1.00013 +x_0=39999.99999984 +y_0=0 +ellps=GRS80 +units=ft +no_defs <> +# NAD83(CORS96) / Oregon Ontario zone (m) +<6836> +proj=tmerc +lat_0=43.25 +lon_0=-117 +k=1.0001 +x_0=80000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(CORS96) / Oregon Ontario zone (ft) +<6837> +proj=tmerc +lat_0=43.25 +lon_0=-117 +k=1.0001 +x_0=79999.99999968 +y_0=0 +ellps=GRS80 +units=ft +no_defs <> +# NAD83(2011) / Oregon Ontario zone (m) +<6838> +proj=tmerc +lat_0=43.25 +lon_0=-117 +k=1.0001 +x_0=80000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Oregon Ontario zone (ft) +<6839> +proj=tmerc +lat_0=43.25 +lon_0=-117 +k=1.0001 +x_0=79999.99999968 +y_0=0 +ellps=GRS80 +units=ft +no_defs <> +# NAD83(CORS96) / Oregon Coast zone (m) +<6840> +proj=omerc +lat_0=44.75 +lonc=-124.05 +alpha=5 +k=1 +x_0=-300000 +y_0=-4600000 +no_uoff +gamma=5 +ellps=GRS80 +units=m +no_defs <> +# NAD83(CORS96) / Oregon Coast zone (ft) +<6841> +proj=omerc +lat_0=44.75 +lonc=-124.05 +alpha=5 +k=1 +x_0=-299999.9999988 +y_0=-4600000.00001208 +no_uoff +gamma=5 +ellps=GRS80 +units=ft +no_defs <> +# NAD83(2011) / Oregon Coast zone (m) +<6842> +proj=omerc +lat_0=44.75 +lonc=-124.05 +alpha=5 +k=1 +x_0=-300000 +y_0=-4600000 +no_uoff +gamma=5 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Oregon Coast zone (ft) +<6843> +proj=omerc +lat_0=44.75 +lonc=-124.05 +alpha=5 +k=1 +x_0=-299999.9999988 +y_0=-4600000.00001208 +no_uoff +gamma=5 +ellps=GRS80 +units=ft +no_defs <> +# NAD83(CORS96) / Oregon Pendleton zone (m) +<6844> +proj=tmerc +lat_0=45.25 +lon_0=-119.1666666666667 +k=1.000045 +x_0=60000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(CORS96) / Oregon Pendleton zone (ft) +<6845> +proj=tmerc +lat_0=45.25 +lon_0=-119.1666666666667 +k=1.000045 +x_0=59999.99999976 +y_0=0 +ellps=GRS80 +units=ft +no_defs <> +# NAD83(2011) / Oregon Pendleton zone (m) +<6846> +proj=tmerc +lat_0=45.25 +lon_0=-119.1666666666667 +k=1.000045 +x_0=60000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Oregon Pendleton zone (ft) +<6847> +proj=tmerc +lat_0=45.25 +lon_0=-119.1666666666667 +k=1.000045 +x_0=59999.99999976 +y_0=0 +ellps=GRS80 +units=ft +no_defs <> +# NAD83(CORS96) / Oregon Pendleton-La Grande zone (m) +<6848> +proj=tmerc +lat_0=45.08333333333334 +lon_0=-118.3333333333333 +k=1.000175 +x_0=30000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(CORS96) / Oregon Pendleton-La Grande zone (ft) +<6849> +proj=tmerc +lat_0=45.08333333333334 +lon_0=-118.3333333333333 +k=1.000175 +x_0=30000.00001512 +y_0=0 +ellps=GRS80 +units=ft +no_defs <> +# NAD83(2011) / Oregon Pendleton-La Grande zone (m) +<6850> +proj=tmerc +lat_0=45.08333333333334 +lon_0=-118.3333333333333 +k=1.000175 +x_0=30000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Oregon Pendleton-La Grande zone (ft) +<6851> +proj=tmerc +lat_0=45.08333333333334 +lon_0=-118.3333333333333 +k=1.000175 +x_0=30000.00001512 +y_0=0 +ellps=GRS80 +units=ft +no_defs <> +# NAD83(CORS96) / Oregon Portland zone (m) +<6852> +proj=lcc +lat_1=45.5 +lat_0=45.5 +lon_0=-122.75 +k_0=1.000002 +x_0=100000 +y_0=50000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(CORS96) / Oregon Portland zone (ft) +<6853> +proj=lcc +lat_1=45.5 +lat_0=45.5 +lon_0=-122.75 +k_0=1.000002 +x_0=99999.99999960001 +y_0=50000.00001504 +ellps=GRS80 +units=ft +no_defs <> +# NAD83(2011) / Oregon Portland zone (m) +<6854> +proj=lcc +lat_1=45.5 +lat_0=45.5 +lon_0=-122.75 +k_0=1.000002 +x_0=100000 +y_0=50000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Oregon Portland zone (ft) +<6855> +proj=lcc +lat_1=45.5 +lat_0=45.5 +lon_0=-122.75 +k_0=1.000002 +x_0=99999.99999960001 +y_0=50000.00001504 +ellps=GRS80 +units=ft +no_defs <> +# NAD83(CORS96) / Oregon Salem zone (m) +<6856> +proj=tmerc +lat_0=44.33333333333334 +lon_0=-123.0833333333333 +k=1.00001 +x_0=50000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(CORS96) / Oregon Salem zone (ft) +<6857> +proj=tmerc +lat_0=44.33333333333334 +lon_0=-123.0833333333333 +k=1.00001 +x_0=50000.00001504 +y_0=0 +ellps=GRS80 +units=ft +no_defs <> +# NAD83(2011) / Oregon Salem zone (m) +<6858> +proj=tmerc +lat_0=44.33333333333334 +lon_0=-123.0833333333333 +k=1.00001 +x_0=50000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Oregon Salem zone (ft) +<6859> +proj=tmerc +lat_0=44.33333333333334 +lon_0=-123.0833333333333 +k=1.00001 +x_0=50000.00001504 +y_0=0 +ellps=GRS80 +units=ft +no_defs <> +# NAD83(CORS96) / Oregon Santiam Pass zone (m) +<6860> +proj=tmerc +lat_0=44.08333333333334 +lon_0=-122.5 +k=1.000155 +x_0=0 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(CORS96) / Oregon Santiam Pass zone (ft) +<6861> +proj=tmerc +lat_0=44.08333333333334 +lon_0=-122.5 +k=1.000155 +x_0=0 +y_0=0 +ellps=GRS80 +units=ft +no_defs <> +# NAD83(2011) / Oregon Santiam Pass zone (m) +<6862> +proj=tmerc +lat_0=44.08333333333334 +lon_0=-122.5 +k=1.000155 +x_0=0 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Oregon Santiam Pass (ft) +<6863> +proj=tmerc +lat_0=44.08333333333334 +lon_0=-122.5 +k=1.000155 +x_0=0 +y_0=0 +ellps=GRS80 +units=ft +no_defs <> +# NAD83(CORS96) / Oregon LCC (m) +<6867> +proj=lcc +lat_1=43 +lat_2=45.5 +lat_0=41.75 +lon_0=-120.5 +x_0=400000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(CORS96) / Oregon GIC Lambert (ft) +<6868> +proj=lcc +lat_1=43 +lat_2=45.5 +lat_0=41.75 +lon_0=-120.5 +x_0=399999.9999984 +y_0=0 +ellps=GRS80 +units=ft +no_defs <> +# ETRS89 / Albania TM 2010 +<6870> +proj=tmerc +lat_0=0 +lon_0=20 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# RDN2008 / Italy zone (N-E) +<6875> +proj=tmerc +lat_0=0 +lon_0=12 +k=0.9985000000000001 +x_0=7000000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# RDN2008 / Zone 12 (N-E) +<6876> +proj=tmerc +lat_0=0 +lon_0=12 +k=1 +x_0=3000000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(2011) / Wisconsin Central +<6879> +proj=lcc +lat_1=45.5 +lat_2=44.25 +lat_0=43.83333333333334 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Nebraska (ftUS) +<6880> +proj=lcc +lat_1=43 +lat_2=40 +lat_0=39.83333333333334 +lon_0=-100 +x_0=500000.00001016 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(CORS96) / Oregon North +<6884> +proj=lcc +lat_1=46 +lat_2=44.33333333333334 +lat_0=43.66666666666666 +lon_0=-120.5 +x_0=2500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(CORS96) / Oregon North (ft) +<6885> +proj=lcc +lat_1=46 +lat_2=44.33333333333334 +lat_0=43.66666666666666 +lon_0=-120.5 +x_0=2500000.0001424 +y_0=0 +ellps=GRS80 +units=ft +no_defs <> +# NAD83(CORS96) / Oregon South +<6886> +proj=lcc +lat_1=44 +lat_2=42.33333333333334 +lat_0=41.66666666666666 +lon_0=-120.5 +x_0=1500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(CORS96) / Oregon South (ft) +<6887> +proj=lcc +lat_1=44 +lat_2=42.33333333333334 +lat_0=41.66666666666666 +lon_0=-120.5 +x_0=1500000.0001464 +y_0=0 +ellps=GRS80 +units=ft +no_defs <> +# South East Island 1943 / UTM zone 40N +<6915> +proj=utm +zone=40 +ellps=clrk80 +towgs84=-43.685,-179.785,-267.721,0,0,0,0 +units=m +no_defs <> +# NAD83 / Kansas LCC +<6922> +proj=lcc +lat_1=39.5 +lat_2=37.5 +lat_0=36 +lon_0=-98.25 +x_0=400000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Kansas LCC (ftUS) +<6923> +proj=lcc +lat_1=39.5 +lat_2=37.5 +lat_0=36 +lon_0=-98.25 +x_0=399999.99998984 +y_0=0 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83(2011) / Kansas LCC +<6924> +proj=lcc +lat_1=39.5 +lat_2=37.5 +lat_0=36 +lon_0=-98.25 +x_0=400000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / Kansas LCC (ftUS) +<6925> +proj=lcc +lat_1=39.5 +lat_2=37.5 +lat_0=36 +lon_0=-98.25 +x_0=399999.99998984 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> +# WGS 84 / NSIDC EASE-Grid 2.0 North +<6931> +proj=laea +lat_0=90 +lon_0=0 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / NSIDC EASE-Grid 2.0 South +<6932> +proj=laea +lat_0=-90 +lon_0=0 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / NSIDC EASE-Grid 2.0 Global +<6933> +proj=cea +lon_0=0 +lat_ts=30 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# VN-2000 / TM-3 zone 481 +<6956> +proj=tmerc +lat_0=0 +lon_0=102 +k=0.9999 +x_0=0 +y_0=500000 +ellps=WGS84 +towgs84=-191.90441429,-39.30318279,-111.45032835,0.00928836,-0.01975479,0.00427372,0.252906278 +units=m +no_defs <> +# VN-2000 / TM-3 zone 482 +<6957> +proj=tmerc +lat_0=0 +lon_0=105 +k=0.9999 +x_0=0 +y_0=500000 +ellps=WGS84 +towgs84=-191.90441429,-39.30318279,-111.45032835,0.00928836,-0.01975479,0.00427372,0.252906278 +units=m +no_defs <> +# VN-2000 / TM-3 zone 491 +<6958> +proj=tmerc +lat_0=0 +lon_0=108 +k=0.9999 +x_0=0 +y_0=500000 +ellps=WGS84 +towgs84=-191.90441429,-39.30318279,-111.45032835,0.00928836,-0.01975479,0.00427372,0.252906278 +units=m +no_defs <> +# VN-2000 / TM-3 Da Nang zone +<6959> +proj=tmerc +lat_0=0 +lon_0=107.75 +k=0.9999 +x_0=0 +y_0=500000 +ellps=WGS84 +towgs84=-191.90441429,-39.30318279,-111.45032835,0.00928836,-0.01975479,0.00427372,0.252906278 +units=m +no_defs <> +# ETRS89 / Albania LCC 2010 +<6962> +proj=lcc +lat_1=39 +lat_2=43 +lat_0=41 +lon_0=20 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD27 / Michigan North +# Unable to translate coordinate system EPSG:6966 into PROJ.4 format. +# +# Israeli Grid 05 +<6984> +proj=tmerc +lat_0=31.73439361111111 +lon_0=35.20451694444445 +k=1.0000067 +x_0=219529.584 +y_0=626907.39 +ellps=GRS80 +units=m +no_defs <> +# Israeli Grid 05/12 +<6991> +proj=tmerc +lat_0=31.73439361111111 +lon_0=35.20451694444445 +k=1.0000067 +x_0=219529.584 +y_0=626907.39 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / San Francisco CS13 (deprecated) +<6996> +proj=tmerc +lat_0=37.75 +lon_0=-122.45 +k=1.000007 +x_0=48000 +y_0=24000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / San Francisco CS13 (ftUS) (deprecated) +<6997> +proj=tmerc +lat_0=37.75 +lon_0=-122.45 +k=1.000007 +x_0=48000 +y_0=24000 +ellps=GRS80 +units=us-ft +no_defs <> +# Nahrwan 1934 / UTM zone 37N +<7005> +proj=utm +zone=37 +ellps=clrk80 +towgs84=-242.2,-144.9,370.3,0,0,0,0 +units=m +no_defs <> +# Nahrwan 1934 / UTM zone 38N +<7006> +proj=utm +zone=38 +ellps=clrk80 +towgs84=-242.2,-144.9,370.3,0,0,0,0 +units=m +no_defs <> +# Nahrwan 1934 / UTM zone 39N +<7007> +proj=utm +zone=39 +ellps=clrk80 +towgs84=-242.2,-144.9,370.3,0,0,0,0 +units=m +no_defs <> +# NAD83(2011) / IaRCS zone 1 +<7057> +proj=lcc +lat_1=43.2 +lat_0=43.2 +lon_0=-95.25 +k_0=1.000052 +x_0=3505207.010414021 +y_0=2926085.852171705 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / IaRCS zone 2 +<7058> +proj=lcc +lat_1=43.16666666666666 +lat_0=43.16666666666666 +lon_0=-92.75 +k_0=1.000043 +x_0=3810007.62001524 +y_0=2987045.974091948 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / IaRCS zone 3 +<7059> +proj=tmerc +lat_0=40.25 +lon_0=-91.2 +k=1.000035 +x_0=4114808.229616459 +y_0=2529845.05969012 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / IaRCS zone 4 +<7060> +proj=lcc +lat_1=42.53333333333333 +lat_0=42.53333333333333 +lon_0=-94.83333333333333 +k_0=1.000045 +x_0=4419608.839217679 +y_0=2621285.242570485 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / IaRCS zone 5 +<7061> +proj=lcc +lat_1=42.65 +lat_0=42.65 +lon_0=-92.25 +k_0=1.000032 +x_0=4724409.448818898 +y_0=2712725.425450851 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / IaRCS zone 6 +<7062> +proj=tmerc +lat_0=40.25 +lon_0=-95.73333333333333 +k=1.000039 +x_0=5029210.058420117 +y_0=2011684.023368047 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / IaRCS zone 7 +<7063> +proj=tmerc +lat_0=40.25 +lon_0=-94.63333333333334 +k=1.000045 +x_0=5334010.668021336 +y_0=2072644.145288291 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / IaRCS zone 8 +<7064> +proj=tmerc +lat_0=40.25 +lon_0=-93.71666666666667 +k=1.000033 +x_0=5638811.277622555 +y_0=2133604.267208535 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / IaRCS zone 9 +<7065> +proj=tmerc +lat_0=40.25 +lon_0=-92.81666666666666 +k=1.000027 +x_0=5943611.887223775 +y_0=2194564.389128779 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / IaRCS zone 10 +<7066> +proj=lcc +lat_1=41.83333333333334 +lat_0=41.83333333333334 +lon_0=-91.66666666666667 +k_0=1.00002 +x_0=6248412.496824994 +y_0=2438404.876809754 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / IaRCS zone 11 +<7067> +proj=tmerc +lat_0=40.25 +lon_0=-90.53333333333333 +k=1.000027 +x_0=6553213.106426213 +y_0=2316484.632969266 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / IaRCS zone 12 +<7068> +proj=lcc +lat_1=40.91666666666666 +lat_0=40.91666666666666 +lon_0=-93.75 +k_0=1.000037 +x_0=6858013.716027432 +y_0=1889763.779527559 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / IaRCS zone 13 +<7069> +proj=tmerc +lat_0=40.25 +lon_0=-91.91666666666667 +k=1.00002 +x_0=7162814.325628651 +y_0=1950723.901447803 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / IaRCS zone 14 +<7070> +proj=tmerc +lat_0=40.25 +lon_0=-91.25 +k=1.000018 +x_0=7467614.93522987 +y_0=1889763.779527559 +ellps=GRS80 +units=us-ft +no_defs <> +# RGTAAF07 / UTM zone 37S +<7074> +proj=utm +zone=37 +south +ellps=GRS80 +units=m +no_defs <> +# RGTAAF07 / UTM zone 38S +<7075> +proj=utm +zone=38 +south +ellps=GRS80 +units=m +no_defs <> +# RGTAAF07 / UTM zone 39S +<7076> +proj=utm +zone=39 +south +ellps=GRS80 +units=m +no_defs <> +# RGTAAF07 / UTM zone 40S +<7077> +proj=utm +zone=40 +south +ellps=GRS80 +units=m +no_defs <> +# RGTAAF07 / UTM zone 41S +<7078> +proj=utm +zone=41 +south +ellps=GRS80 +units=m +no_defs <> +# RGTAAF07 / UTM zone 42S +<7079> +proj=utm +zone=42 +south +ellps=GRS80 +units=m +no_defs <> +# RGTAAF07 / UTM zone 43S +<7080> +proj=utm +zone=43 +south +ellps=GRS80 +units=m +no_defs <> +# RGTAAF07 / UTM zone 44S +<7081> +proj=utm +zone=44 +south +ellps=GRS80 +units=m +no_defs <> +# RGTAAF07 / Terre Adelie Polar Stereographic +# Unable to translate coordinate system EPSG:7082 into PROJ.4 format. +# +# NAD83(2011) / RMTCRS St Mary (m) +<7109> +proj=tmerc +lat_0=48.5 +lon_0=-112.5 +k=1.00016 +x_0=150000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / RMTCRS Blackfeet (m) +<7110> +proj=tmerc +lat_0=48 +lon_0=-112.5 +k=1.00019 +x_0=100000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / RMTCRS Milk River (m) +<7111> +proj=lcc +lat_1=48.5 +lat_0=48.5 +lon_0=-111 +k_0=1.000145 +x_0=150000 +y_0=200000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / RMTCRS Fort Belknap (m) +<7112> +proj=lcc +lat_1=48.5 +lat_0=48.5 +lon_0=-108.5 +k_0=1.00012 +x_0=200000 +y_0=150000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / RMTCRS Fort Peck Assiniboine (m) +<7113> +proj=lcc +lat_1=48.33333333333334 +lat_0=48.33333333333334 +lon_0=-105.5 +k_0=1.00012 +x_0=200000 +y_0=100000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / RMTCRS Fort Peck Sioux (m) +<7114> +proj=lcc +lat_1=48.33333333333334 +lat_0=48.33333333333334 +lon_0=-105.5 +k_0=1.00009 +x_0=100000 +y_0=50000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / RMTCRS Crow (m) +<7115> +proj=tmerc +lat_0=44.75 +lon_0=-107.75 +k=1.000148 +x_0=200000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / RMTCRS Bobcat (m) +<7116> +proj=lcc +lat_1=46.25 +lat_0=46.25 +lon_0=-111.25 +k_0=1.000185 +x_0=100000 +y_0=100000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / RMTCRS Billings (m) +<7117> +proj=lcc +lat_1=45.78333333333333 +lat_0=45.78333333333333 +lon_0=-108.4166666666667 +k_0=1.0001515 +x_0=200000 +y_0=50000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / RMTCRS Wind River (m) +<7118> +proj=tmerc +lat_0=42.66666666666666 +lon_0=-108.3333333333333 +k=1.00024 +x_0=100000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / RMTCRS St Mary (ft) +<7119> +proj=tmerc +lat_0=48.5 +lon_0=-112.5 +k=1.00016 +x_0=150000.00001464 +y_0=0 +ellps=GRS80 +units=ft +no_defs <> +# NAD83(2011) / RMTCRS Blackfeet (ft) +<7120> +proj=tmerc +lat_0=48 +lon_0=-112.5 +k=1.00019 +x_0=99999.99999960001 +y_0=0 +ellps=GRS80 +units=ft +no_defs <> +# NAD83(2011) / RMTCRS Milk River (ft) +<7121> +proj=lcc +lat_1=48.5 +lat_0=48.5 +lon_0=-111 +k_0=1.000145 +x_0=150000.00001464 +y_0=199999.9999992 +ellps=GRS80 +units=ft +no_defs <> +# NAD83(2011) / RMTCRS Fort Belknap (ft) +<7122> +proj=lcc +lat_1=48.5 +lat_0=48.5 +lon_0=-108.5 +k_0=1.00012 +x_0=199999.9999992 +y_0=150000.00001464 +ellps=GRS80 +units=ft +no_defs <> +# NAD83(2011) / RMTCRS Fort Peck Assiniboine (ft) +<7123> +proj=lcc +lat_1=48.33333333333334 +lat_0=48.33333333333334 +lon_0=-105.5 +k_0=1.00012 +x_0=199999.9999992 +y_0=99999.99999960001 +ellps=GRS80 +units=ft +no_defs <> +# NAD83(2011) / RMTCRS Fort Peck Sioux (ft) +<7124> +proj=lcc +lat_1=48.33333333333334 +lat_0=48.33333333333334 +lon_0=-105.5 +k_0=1.00009 +x_0=99999.99999960001 +y_0=49999.99971024 +ellps=GRS80 +units=ft +no_defs <> +# NAD83(2011) / RMTCRS Crow (ft) +<7125> +proj=tmerc +lat_0=44.75 +lon_0=-107.75 +k=1.000148 +x_0=199999.9999992 +y_0=0 +ellps=GRS80 +units=ft +no_defs <> +# NAD83(2011) / RMTCRS Bobcat (ft) +<7126> +proj=lcc +lat_1=46.25 +lat_0=46.25 +lon_0=-111.25 +k_0=1.000185 +x_0=99999.99999960001 +y_0=99999.99999960001 +ellps=GRS80 +units=ft +no_defs <> +# NAD83(2011) / RMTCRS Billings (ft) +<7127> +proj=lcc +lat_1=45.78333333333333 +lat_0=45.78333333333333 +lon_0=-108.4166666666667 +k_0=1.0001515 +x_0=199999.9999992 +y_0=50000.00001504 +ellps=GRS80 +units=ft +no_defs <> +# NAD83(2011) / RMTCRS Wind River (ftUS) +<7128> +proj=tmerc +lat_0=42.66666666666666 +lon_0=-108.3333333333333 +k=1.00024 +x_0=99999.99998983997 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / San Francisco CS13 +<7131> +proj=tmerc +lat_0=37.75 +lon_0=-122.45 +k=1.000007 +x_0=48000 +y_0=24000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / San Francisco CS13 (ftUS) +<7132> +proj=tmerc +lat_0=37.75 +lon_0=-122.45 +k=1.000007 +x_0=48000 +y_0=24000 +ellps=GRS80 +units=us-ft +no_defs <> +# Palestine 1923 / Palestine Grid modified +<7142> +proj=tmerc +lat_0=31.73409694444445 +lon_0=35.21208055555556 +k=1 +x_0=170251.555 +y_0=126867.909 +a=6378300.789 +b=6356566.435 +towgs84=-275.7224,94.7824,340.8944,-8.001,-4.42,-11.821,1 +units=m +no_defs <> +# NAD83(2011) / InGCS Adams (m) +<7257> +proj=tmerc +lat_0=40.55 +lon_0=-84.95 +k=1.000034 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / InGCS Adams (ftUS) +<7258> +proj=tmerc +lat_0=40.55 +lon_0=-84.95 +k=1.000034 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / InGCS Allen (m) +<7259> +proj=tmerc +lat_0=40.9 +lon_0=-85.05 +k=1.000031 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / InGCS Allen (ftUS) +<7260> +proj=tmerc +lat_0=40.9 +lon_0=-85.05 +k=1.000031 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / InGCS Bartholomew (m) +<7261> +proj=tmerc +lat_0=39 +lon_0=-85.84999999999999 +k=1.000026 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / InGCS Bartholomew (ftUS) +<7262> +proj=tmerc +lat_0=39 +lon_0=-85.84999999999999 +k=1.000026 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / InGCS Benton (m) +<7263> +proj=tmerc +lat_0=40.45 +lon_0=-87.3 +k=1.000029 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / InGCS Benton (ftUS) +<7264> +proj=tmerc +lat_0=40.45 +lon_0=-87.3 +k=1.000029 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / InGCS Blackford-Delaware (m) +<7265> +proj=tmerc +lat_0=40.05 +lon_0=-85.40000000000001 +k=1.000038 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / InGCS Blackford-Delaware (ftUS) +<7266> +proj=tmerc +lat_0=40.05 +lon_0=-85.40000000000001 +k=1.000038 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / InGCS Boone-Hendricks (m) +<7267> +proj=tmerc +lat_0=39.6 +lon_0=-86.5 +k=1.000036 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / InGCS Boone-Hendricks (ftUS) +<7268> +proj=tmerc +lat_0=39.6 +lon_0=-86.5 +k=1.000036 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / InGCS Brown (m) +<7269> +proj=tmerc +lat_0=39 +lon_0=-86.3 +k=1.00003 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / InGCS Brown (ftUS) +<7270> +proj=tmerc +lat_0=39 +lon_0=-86.3 +k=1.00003 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / InGCS Carroll (m) +<7271> +proj=tmerc +lat_0=40.4 +lon_0=-86.65000000000001 +k=1.000026 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / InGCS Carroll (ftUS) +<7272> +proj=tmerc +lat_0=40.4 +lon_0=-86.65000000000001 +k=1.000026 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / InGCS Cass (m) +<7273> +proj=tmerc +lat_0=40.55 +lon_0=-86.40000000000001 +k=1.000028 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / InGCS Cass (ftUS) +<7274> +proj=tmerc +lat_0=40.55 +lon_0=-86.40000000000001 +k=1.000028 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / InGCS Clark-Floyd-Scott (m) +<7275> +proj=tmerc +lat_0=38.15 +lon_0=-85.59999999999999 +k=1.000021 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / InGCS Clark-Floyd-Scott (ftUS) +<7276> +proj=tmerc +lat_0=38.15 +lon_0=-85.59999999999999 +k=1.000021 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / InGCS Clay (m) +<7277> +proj=tmerc +lat_0=39.15 +lon_0=-87.15000000000001 +k=1.000024 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / InGCS Clay (ftUS) +<7278> +proj=tmerc +lat_0=39.15 +lon_0=-87.15000000000001 +k=1.000024 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / InGCS Clinton (m) +<7279> +proj=tmerc +lat_0=40.15 +lon_0=-86.59999999999999 +k=1.000032 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / InGCS Clinton (ftUS) +<7280> +proj=tmerc +lat_0=40.15 +lon_0=-86.59999999999999 +k=1.000032 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / InGCS Crawford-Lawrence-Orange (m) +<7281> +proj=tmerc +lat_0=38.1 +lon_0=-86.5 +k=1.000025 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / InGCS Crawford-Lawrence-Orange (ftUS) +<7282> +proj=tmerc +lat_0=38.1 +lon_0=-86.5 +k=1.000025 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / InGCS Daviess-Greene (m) +<7283> +proj=tmerc +lat_0=38.45 +lon_0=-87.09999999999999 +k=1.000018 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / InGCS Daviess-Greene (ftUS) +<7284> +proj=tmerc +lat_0=38.45 +lon_0=-87.09999999999999 +k=1.000018 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / InGCS Dearborn-Ohio-Switzerland (m) +<7285> +proj=tmerc +lat_0=38.65 +lon_0=-84.90000000000001 +k=1.000029 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / InGCS Dearborn-Ohio-Switzerland (ftUS) +<7286> +proj=tmerc +lat_0=38.65 +lon_0=-84.90000000000001 +k=1.000029 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / InGCS Decatur-Rush (m) +<7287> +proj=tmerc +lat_0=39.1 +lon_0=-85.65000000000001 +k=1.000036 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / InGCS Decatur-Rush (ftUS) +<7288> +proj=tmerc +lat_0=39.1 +lon_0=-85.65000000000001 +k=1.000036 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / InGCS DeKalb (m) +<7289> +proj=tmerc +lat_0=41.25 +lon_0=-84.95 +k=1.000036 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / InGCS DeKalb (ftUS) +<7290> +proj=tmerc +lat_0=41.25 +lon_0=-84.95 +k=1.000036 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / InGCS Dubois-Martin (m) +<7291> +proj=tmerc +lat_0=38.2 +lon_0=-86.95 +k=1.00002 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / InGCS Dubois-Martin (ftUS) +<7292> +proj=tmerc +lat_0=38.2 +lon_0=-86.95 +k=1.00002 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / InGCS Elkhart-Kosciusko-Wabash (m) +<7293> +proj=tmerc +lat_0=40.65 +lon_0=-85.84999999999999 +k=1.000033 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / InGCS Elkhart-Kosciusko-Wabash (ftUS) +<7294> +proj=tmerc +lat_0=40.65 +lon_0=-85.84999999999999 +k=1.000033 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / InGCS Fayette-Franklin-Union (m) +<7295> +proj=tmerc +lat_0=39.25 +lon_0=-85.05 +k=1.000038 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / InGCS Fayette-Franklin-Union (ftUS) +<7296> +proj=tmerc +lat_0=39.25 +lon_0=-85.05 +k=1.000038 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / InGCS Fountain-Warren (m) +<7297> +proj=tmerc +lat_0=39.95 +lon_0=-87.3 +k=1.000025 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / InGCS Fountain-Warren (ftUS) +<7298> +proj=tmerc +lat_0=39.95 +lon_0=-87.3 +k=1.000025 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / InGCS Fulton-Marshall-St. Joseph (m) +<7299> +proj=tmerc +lat_0=40.9 +lon_0=-86.3 +k=1.000031 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / InGCS Fulton-Marshall-St. Joseph (ftUS) +<7300> +proj=tmerc +lat_0=40.9 +lon_0=-86.3 +k=1.000031 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / InGCS Gibson (m) +<7301> +proj=tmerc +lat_0=38.15 +lon_0=-87.65000000000001 +k=1.000013 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / InGCS Gibson (ftUS) +<7302> +proj=tmerc +lat_0=38.15 +lon_0=-87.65000000000001 +k=1.000013 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / InGCS Grant (m) +<7303> +proj=tmerc +lat_0=40.35 +lon_0=-85.7 +k=1.000034 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / InGCS Grant (ftUS) +<7304> +proj=tmerc +lat_0=40.35 +lon_0=-85.7 +k=1.000034 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / InGCS Hamilton-Tipton (m) +<7305> +proj=tmerc +lat_0=39.9 +lon_0=-86 +k=1.000034 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / InGCS Hamilton-Tipton (ftUS) +<7306> +proj=tmerc +lat_0=39.9 +lon_0=-86 +k=1.000034 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / InGCS Hancock-Madison (m) +<7307> +proj=tmerc +lat_0=39.65 +lon_0=-85.8 +k=1.000036 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / InGCS Hancock-Madison (ftUS) +<7308> +proj=tmerc +lat_0=39.65 +lon_0=-85.8 +k=1.000036 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / InGCS Harrison-Washington (m) +<7309> +proj=tmerc +lat_0=37.95 +lon_0=-86.15000000000001 +k=1.000027 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / InGCS Harrison-Washington (ftUS) +<7310> +proj=tmerc +lat_0=37.95 +lon_0=-86.15000000000001 +k=1.000027 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / InGCS Henry (m) +<7311> +proj=tmerc +lat_0=39.75 +lon_0=-85.45 +k=1.000043 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / InGCS Henry (ftUS) +<7312> +proj=tmerc +lat_0=39.75 +lon_0=-85.45 +k=1.000043 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / InGCS Howard-Miami (m) +<7313> +proj=tmerc +lat_0=40.35 +lon_0=-86.15000000000001 +k=1.000031 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / InGCS Howard-Miami (ftUS) +<7314> +proj=tmerc +lat_0=40.35 +lon_0=-86.15000000000001 +k=1.000031 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / InGCS Huntington-Whitley (m) +<7315> +proj=tmerc +lat_0=40.65 +lon_0=-85.5 +k=1.000034 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / InGCS Huntington-Whitley (ftUS) +<7316> +proj=tmerc +lat_0=40.65 +lon_0=-85.5 +k=1.000034 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / InGCS Jackson (m) +<7317> +proj=tmerc +lat_0=38.7 +lon_0=-85.95 +k=1.000022 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / InGCS Jackson (ftUS) +<7318> +proj=tmerc +lat_0=38.7 +lon_0=-85.95 +k=1.000022 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / InGCS Jasper-Porter (m) +<7319> +proj=tmerc +lat_0=40.7 +lon_0=-87.09999999999999 +k=1.000027 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / InGCS Jasper-Porter (ftUS) +<7320> +proj=tmerc +lat_0=40.7 +lon_0=-87.09999999999999 +k=1.000027 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / InGCS Jay (m) +<7321> +proj=tmerc +lat_0=40.3 +lon_0=-85 +k=1.000038 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / InGCS Jay (ftUS) +<7322> +proj=tmerc +lat_0=40.3 +lon_0=-85 +k=1.000038 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / InGCS Jefferson (m) +<7323> +proj=tmerc +lat_0=38.55 +lon_0=-85.34999999999999 +k=1.000028 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / InGCS Jefferson (ftUS) +<7324> +proj=tmerc +lat_0=38.55 +lon_0=-85.34999999999999 +k=1.000028 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / InGCS Jennings (m) +<7325> +proj=tmerc +lat_0=38.8 +lon_0=-85.8 +k=1.000025 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / InGCS Jennings (ftUS) +<7326> +proj=tmerc +lat_0=38.8 +lon_0=-85.8 +k=1.000025 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / InGCS Johnson-Marion (m) +<7327> +proj=tmerc +lat_0=39.3 +lon_0=-86.15000000000001 +k=1.000031 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / InGCS Johnson-Marion (ftUS) +<7328> +proj=tmerc +lat_0=39.3 +lon_0=-86.15000000000001 +k=1.000031 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / InGCS Knox (m) +<7329> +proj=tmerc +lat_0=38.4 +lon_0=-87.45 +k=1.000015 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / InGCS Knox (ftUS) +<7330> +proj=tmerc +lat_0=38.4 +lon_0=-87.45 +k=1.000015 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / InGCS LaGrange-Noble (m) +<7331> +proj=tmerc +lat_0=41.25 +lon_0=-85.45 +k=1.000037 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / InGCS LaGrange-Noble (ftUS) +<7332> +proj=tmerc +lat_0=41.25 +lon_0=-85.45 +k=1.000037 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / InGCS Lake-Newton (m) +<7333> +proj=tmerc +lat_0=40.7 +lon_0=-87.40000000000001 +k=1.000026 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / InGCS Lake-Newton (ftUS) +<7334> +proj=tmerc +lat_0=40.7 +lon_0=-87.40000000000001 +k=1.000026 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / InGCS LaPorte-Pulaski-Starke (m) +<7335> +proj=tmerc +lat_0=40.9 +lon_0=-86.75 +k=1.000027 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / InGCS LaPorte-Pulaski-Starke (ftUS) +<7336> +proj=tmerc +lat_0=40.9 +lon_0=-86.75 +k=1.000027 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / InGCS Monroe-Morgan (m) +<7337> +proj=tmerc +lat_0=38.95 +lon_0=-86.5 +k=1.000028 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / InGCS Monroe-Morgan (ftUS) +<7338> +proj=tmerc +lat_0=38.95 +lon_0=-86.5 +k=1.000028 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / InGCS Montgomery-Putnam (m) +<7339> +proj=tmerc +lat_0=39.45 +lon_0=-86.95 +k=1.000031 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / InGCS Montgomery-Putnam (ftUS) +<7340> +proj=tmerc +lat_0=39.45 +lon_0=-86.95 +k=1.000031 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / InGCS Owen (m) +<7341> +proj=tmerc +lat_0=39.15 +lon_0=-86.90000000000001 +k=1.000026 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / InGCS Owen (ftUS) +<7342> +proj=tmerc +lat_0=39.15 +lon_0=-86.90000000000001 +k=1.000026 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / InGCS Parke-Vermillion (m) +<7343> +proj=tmerc +lat_0=39.6 +lon_0=-87.34999999999999 +k=1.000022 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / InGCS Parke-Vermillion (ftUS) +<7344> +proj=tmerc +lat_0=39.6 +lon_0=-87.34999999999999 +k=1.000022 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / InGCS Perry (m) +<7345> +proj=tmerc +lat_0=37.8 +lon_0=-86.7 +k=1.00002 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / InGCS Perry (ftUS) +<7346> +proj=tmerc +lat_0=37.8 +lon_0=-86.7 +k=1.00002 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / InGCS Pike-Warrick (m) +<7347> +proj=tmerc +lat_0=37.85 +lon_0=-87.3 +k=1.000015 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / InGCS Pike-Warrick (ftUS) +<7348> +proj=tmerc +lat_0=37.85 +lon_0=-87.3 +k=1.000015 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / InGCS Posey (m) +<7349> +proj=tmerc +lat_0=37.75 +lon_0=-87.95 +k=1.000013 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / InGCS Posey (ftUS) +<7350> +proj=tmerc +lat_0=37.75 +lon_0=-87.95 +k=1.000013 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / InGCS Randolph-Wayne (m) +<7351> +proj=tmerc +lat_0=39.7 +lon_0=-85.05 +k=1.000044 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / InGCS Randolph-Wayne (ftUS) +<7352> +proj=tmerc +lat_0=39.7 +lon_0=-85.05 +k=1.000044 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / InGCS Ripley (m) +<7353> +proj=tmerc +lat_0=38.9 +lon_0=-85.3 +k=1.000038 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / InGCS Ripley (ftUS) +<7354> +proj=tmerc +lat_0=38.9 +lon_0=-85.3 +k=1.000038 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / InGCS Shelby (m) +<7355> +proj=tmerc +lat_0=39.3 +lon_0=-85.90000000000001 +k=1.00003 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / InGCS Shelby (ftUS) +<7356> +proj=tmerc +lat_0=39.3 +lon_0=-85.90000000000001 +k=1.00003 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / InGCS Spencer (m) +<7357> +proj=tmerc +lat_0=37.75 +lon_0=-87.05 +k=1.000014 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / InGCS Spencer (ftUS) +<7358> +proj=tmerc +lat_0=37.75 +lon_0=-87.05 +k=1.000014 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / InGCS Steuben (m) +<7359> +proj=tmerc +lat_0=41.5 +lon_0=-85 +k=1.000041 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / InGCS Steuben (ftUS) +<7360> +proj=tmerc +lat_0=41.5 +lon_0=-85 +k=1.000041 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / InGCS Sullivan (m) +<7361> +proj=tmerc +lat_0=38.9 +lon_0=-87.5 +k=1.000017 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / InGCS Sullivan (ftUS) +<7362> +proj=tmerc +lat_0=38.9 +lon_0=-87.5 +k=1.000017 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / InGCS Tippecanoe-White (m) +<7363> +proj=tmerc +lat_0=40.2 +lon_0=-86.90000000000001 +k=1.000026 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / InGCS Tippecanoe-White (ftUS) +<7364> +proj=tmerc +lat_0=40.2 +lon_0=-86.90000000000001 +k=1.000026 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / InGCS Vanderburgh (m) +<7365> +proj=tmerc +lat_0=37.8 +lon_0=-87.55 +k=1.000015 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / InGCS Vanderburgh (ftUS) +<7366> +proj=tmerc +lat_0=37.8 +lon_0=-87.55 +k=1.000015 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / InGCS Vigo (m) +<7367> +proj=tmerc +lat_0=39.25 +lon_0=-87.45 +k=1.00002 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / InGCS Vigo (ftUS) +<7368> +proj=tmerc +lat_0=39.25 +lon_0=-87.45 +k=1.00002 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / InGCS Wells (m) +<7369> +proj=tmerc +lat_0=40.55 +lon_0=-85.25 +k=1.000034 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / InGCS Wells (ftUS) +<7370> +proj=tmerc +lat_0=40.55 +lon_0=-85.25 +k=1.000034 +x_0=240000 +y_0=36000 +ellps=GRS80 +units=us-ft +no_defs <> +# ONGD14 / UTM zone 39N +<7374> +proj=utm +zone=39 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ONGD14 / UTM zone 40N +<7375> +proj=utm +zone=40 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ONGD14 / UTM zone 41N +<7376> +proj=utm +zone=41 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(2011) / WISCRS Adams and Juneau (m) +<7528> +proj=tmerc +lat_0=43.36666666666667 +lon_0=-90 +k=1.0000365285 +x_0=147218.6942 +y_0=0.0037 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / WISCRS Ashland (m) +<7529> +proj=tmerc +lat_0=45.70611111111111 +lon_0=-90.62222222222222 +k=1.0000495683 +x_0=172821.9461 +y_0=0.0017 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / WISCRS Barron (m) +<7530> +proj=tmerc +lat_0=45.13333333333333 +lon_0=-91.84999999999999 +k=1.0000486665 +x_0=93150 +y_0=0.0029 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / WISCRS Bayfield (m) +<7531> +proj=lcc +lat_1=46.66964837722222 +lat_0=46.66964837722222 +lon_0=-91.15277777777779 +k_0=1.0000331195 +x_0=228600.4575 +y_0=148551.4837 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / WISCRS Brown (m) +<7532> +proj=tmerc +lat_0=43 +lon_0=-88 +k=1.00002 +x_0=31600 +y_0=4600 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / WISCRS Buffalo (m) +<7533> +proj=tmerc +lat_0=43.48138888888889 +lon_0=-91.79722222222222 +k=1.0000382778 +x_0=175260.3502 +y_0=0.0048 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / WISCRS Burnett (m) +<7534> +proj=lcc +lat_1=45.89871486583333 +lat_0=45.89871486583333 +lon_0=-92.45777777777778 +k_0=1.0000383841 +x_0=64008.1276 +y_0=59445.9043 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / WISCRS Calumet, Fond du Lac, Outagamie and Winnebago (m) +<7535> +proj=tmerc +lat_0=42.71944444444445 +lon_0=-88.5 +k=1.0000286569 +x_0=244754.8893 +y_0=0.0049 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / WISCRS Chippewa (m) +<7536> +proj=lcc +lat_1=44.97785689861112 +lat_0=44.97785689861112 +lon_0=-91.29444444444444 +k_0=1.0000391127 +x_0=60045.72 +y_0=44091.4346 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / WISCRS Clark (m) +<7537> +proj=tmerc +lat_0=43.6 +lon_0=-90.70833333333334 +k=1.0000463003 +x_0=199949.1989 +y_0=0.0086 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / WISCRS Columbia (m) +<7538> +proj=lcc +lat_1=43.46254664583333 +lat_0=43.46254664583333 +lon_0=-89.39444444444445 +k_0=1.00003498 +x_0=169164.3381 +y_0=111569.6134 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / WISCRS Crawford (m) +<7539> +proj=lcc +lat_1=43.200055605 +lat_0=43.200055605 +lon_0=-90.9388888888889 +k_0=1.0000349151 +x_0=113690.6274 +y_0=53703.1201 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / WISCRS Dane (m) +<7540> +proj=lcc +lat_1=43.0695160375 +lat_0=43.0695160375 +lon_0=-89.42222222222223 +k_0=1.0000384786 +x_0=247193.2944 +y_0=146591.9896 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / WISCRS Dodge and Jefferson (m) +<7541> +proj=tmerc +lat_0=41.47222222222222 +lon_0=-88.77500000000001 +k=1.0000346418 +x_0=263347.7263 +y_0=0.0076 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / WISCRS Door (m) +<7542> +proj=tmerc +lat_0=44.4 +lon_0=-87.27222222222223 +k=1.0000187521 +x_0=158801.1176 +y_0=0.0023 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / WISCRS Douglas (m) +<7543> +proj=tmerc +lat_0=45.88333333333333 +lon_0=-91.91666666666667 +k=1.0000385418 +x_0=59131.3183 +y_0=0.0041 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / WISCRS Dunn (m) +<7544> +proj=tmerc +lat_0=44.40833333333333 +lon_0=-91.89444444444445 +k=1.0000410324 +x_0=51816.104 +y_0=0.003 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / WISCRS Eau Claire (m) +<7545> +proj=lcc +lat_1=44.87228112638889 +lat_0=44.87228112638889 +lon_0=-91.28888888888889 +k_0=1.000035079 +x_0=120091.4402 +y_0=91687.92389999999 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / WISCRS Florence (m) +<7546> +proj=tmerc +lat_0=45.43888888888888 +lon_0=-88.14166666666668 +k=1.0000552095 +x_0=133502.6683 +y_0=0.0063 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / WISCRS Forest (m) +<7547> +proj=tmerc +lat_0=44.00555555555555 +lon_0=-88.63333333333334 +k=1.0000673004 +x_0=275844.5533 +y_0=0.0157 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / WISCRS Grant (m) +<7548> +proj=tmerc +lat_0=41.41111111111111 +lon_0=-90.8 +k=1.0000349452 +x_0=242316.4841 +y_0=0.01 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / WISCRS Green and Lafayette (m) +<7549> +proj=lcc +lat_1=42.63756227694444 +lat_0=42.63756227694444 +lon_0=-89.83888888888889 +k_0=1.0000390487 +x_0=170078.7403 +y_0=45830.2947 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / WISCRS Green Lake and Marquette (m) +<7550> +proj=lcc +lat_1=43.80700011777778 +lat_0=43.80700011777778 +lon_0=-89.24166666666667 +k_0=1.0000344057 +x_0=150876.3018 +y_0=79170.7795 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / WISCRS Iowa (m) +<7551> +proj=tmerc +lat_0=42.53888888888888 +lon_0=-90.16111111111111 +k=1.0000394961 +x_0=113081.0261 +y_0=0.0045 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / WISCRS Iron (m) +<7552> +proj=tmerc +lat_0=45.43333333333333 +lon_0=-90.25555555555556 +k=1.0000677153 +x_0=220980.4419 +y_0=0.008500000000000001 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / WISCRS Jackson (m) +<7553> +proj=tmerc +lat_0=44.25333512777778 +lon_0=-90.84429651944444 +k=1.0000353 +x_0=27000 +y_0=25000 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / WISCRS Kenosha, Milwaukee, Ozaukee and Racine (m) +<7554> +proj=tmerc +lat_0=42.21666666666667 +lon_0=-87.89444444444445 +k=1.0000260649 +x_0=185928.3728 +y_0=0.0009 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / WISCRS Kewaunee, Manitowoc and Sheboygan (m) +<7555> +proj=tmerc +lat_0=43.26666666666667 +lon_0=-87.55 +k=1.0000233704 +x_0=79857.7614 +y_0=0.0012 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / WISCRS La Crosse (m) +<7556> +proj=tmerc +lat_0=43.45111111111111 +lon_0=-91.31666666666666 +k=1.0000319985 +x_0=130454.6598 +y_0=0.0033 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / WISCRS Langlade (m) +<7557> +proj=lcc +lat_1=45.15423710527778 +lat_0=45.15423710527778 +lon_0=-89.03333333333333 +k_0=1.0000627024 +x_0=198425.197 +y_0=105279.7829 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / WISCRS Lincoln (m) +<7558> +proj=tmerc +lat_0=44.84444444444445 +lon_0=-89.73333333333333 +k=1.0000599003 +x_0=116129.0323 +y_0=0.0058 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / WISCRS Marathon (m) +<7559> +proj=lcc +lat_1=44.90090442361111 +lat_0=44.90090442361111 +lon_0=-89.77 +k_0=1.000053289 +x_0=74676.1493 +y_0=55049.2669 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / WISCRS Marinette (m) +<7560> +proj=tmerc +lat_0=44.69166666666666 +lon_0=-87.71111111111111 +k=1.0000234982 +x_0=238658.8794 +y_0=0.0032 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / WISCRS Menominee (m) +<7561> +proj=tmerc +lat_0=44.71666666666667 +lon_0=-88.41666666666667 +k=1.0000362499 +x_0=105461.0121 +y_0=0.0029 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / WISCRS Monroe (m) +<7562> +proj=lcc +lat_1=44.00007392861111 +lat_0=44.00007392861111 +lon_0=-90.64166666666668 +k_0=1.0000434122 +x_0=204521.209 +y_0=121923.9861 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / WISCRS Oconto (m) +<7563> +proj=tmerc +lat_0=44.39722222222222 +lon_0=-87.90833333333335 +k=1.0000236869 +x_0=182880.3676 +y_0=0.0033 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / WISCRS Oneida (m) +<7564> +proj=lcc +lat_1=45.70422377027778 +lat_0=45.70422377027778 +lon_0=-89.54444444444444 +k_0=1.0000686968 +x_0=70104.1401 +y_0=57588.0346 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / WISCRS Pepin and Pierce (m) +<7565> +proj=lcc +lat_1=44.63614887194444 +lat_0=44.63614887194444 +lon_0=-92.22777777777777 +k_0=1.0000362977 +x_0=167640.3354 +y_0=86033.0876 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / WISCRS Polk (m) +<7566> +proj=tmerc +lat_0=44.66111111111111 +lon_0=-92.63333333333334 +k=1.0000433849 +x_0=141732.2823 +y_0=0.0059 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / WISCRS Portage (m) +<7567> +proj=lcc +lat_1=44.41682397527777 +lat_0=44.41682397527777 +lon_0=-89.5 +k_0=1.000039936 +x_0=56388.1128 +y_0=50022.1874 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / WISCRS Price (m) +<7568> +proj=tmerc +lat_0=44.55555555555555 +lon_0=-90.48888888888889 +k=1.0000649554 +x_0=227990.8546 +y_0=0.0109 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / WISCRS Richland (m) +<7569> +proj=lcc +lat_1=43.3223129275 +lat_0=43.3223129275 +lon_0=-90.43055555555556 +k_0=1.0000375653 +x_0=202387.6048 +y_0=134255.4253 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / WISCRS Rock (m) +<7570> +proj=tmerc +lat_0=41.94444444444444 +lon_0=-89.07222222222222 +k=1.0000337311 +x_0=146304.2926 +y_0=0.0068 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / WISCRS Rusk (m) +<7571> +proj=tmerc +lat_0=43.91944444444444 +lon_0=-91.06666666666666 +k=1.0000495976 +x_0=250546.1013 +y_0=0.0234 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / WISCRS Sauk (m) +<7572> +proj=tmerc +lat_0=42.81944444444445 +lon_0=-89.90000000000001 +k=1.0000373868 +x_0=185623.5716 +y_0=0.0051 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / WISCRS Sawyer (m) +<7573> +proj=lcc +lat_1=45.90009913138888 +lat_0=45.90009913138888 +lon_0=-91.11666666666666 +k_0=1.0000573461 +x_0=216713.2336 +y_0=120734.1631 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / WISCRS Shawano (m) +<7574> +proj=tmerc +lat_0=44.03611111111111 +lon_0=-88.60555555555555 +k=1.000032144 +x_0=262433.3253 +y_0=0.009599999999999999 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / WISCRS St. Croix (m) +<7575> +proj=tmerc +lat_0=44.03611111111111 +lon_0=-92.63333333333334 +k=1.0000381803 +x_0=165506.7302 +y_0=0.0103 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / WISCRS Taylor (m) +<7576> +proj=lcc +lat_1=45.17782208583333 +lat_0=45.17782208583333 +lon_0=-90.48333333333333 +k_0=1.0000597566 +x_0=187147.5744 +y_0=107746.7522 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / WISCRS Trempealeau (m) +<7577> +proj=tmerc +lat_0=43.16111111111111 +lon_0=-91.36666666666666 +k=1.0000361538 +x_0=256946.9138 +y_0=0.0041 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / WISCRS Vernon (m) +<7578> +proj=lcc +lat_1=43.57503293972223 +lat_0=43.57503293972223 +lon_0=-90.78333333333333 +k_0=1.0000408158 +x_0=222504.4451 +y_0=47532.0602 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / WISCRS Vilas (m) +<7579> +proj=lcc +lat_1=46.07784409055556 +lat_0=46.07784409055556 +lon_0=-89.48888888888889 +k_0=1.0000730142 +x_0=134417.0689 +y_0=50337.1092 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / WISCRS Walworth (m) +<7580> +proj=lcc +lat_1=42.66946209694444 +lat_0=42.66946209694444 +lon_0=-88.54166666666667 +k_0=1.0000367192 +x_0=232562.8651 +y_0=111088.2224 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / WISCRS Washburn (m) +<7581> +proj=lcc +lat_1=45.96121983333334 +lat_0=45.96121983333334 +lon_0=-91.78333333333333 +k_0=1.0000475376 +x_0=234086.8682 +y_0=188358.6058 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / WISCRS Washington (m) +<7582> +proj=tmerc +lat_0=42.91805555555555 +lon_0=-88.06388888888888 +k=1.00003738 +x_0=120091.4415 +y_0=0.003 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / WISCRS Waukesha (m) +<7583> +proj=tmerc +lat_0=42.56944444444445 +lon_0=-88.22499999999999 +k=1.0000346179 +x_0=208788.418 +y_0=0.0034 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / WISCRS Waupaca (m) +<7584> +proj=tmerc +lat_0=43.42027777777778 +lon_0=-88.81666666666666 +k=1.0000333645 +x_0=185013.9709 +y_0=0.007 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / WISCRS Waushara (m) +<7585> +proj=lcc +lat_1=44.11394404583334 +lat_0=44.11394404583334 +lon_0=-89.24166666666667 +k_0=1.0000392096 +x_0=120091.4402 +y_0=45069.7587 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / WISCRS Wood (m) +<7586> +proj=lcc +lat_1=44.36259546944444 +lat_0=44.36259546944444 +lon_0=-90 +k_0=1.0000421209 +x_0=208483.6173 +y_0=134589.754 +ellps=GRS80 +units=m +no_defs <> +# NAD83(2011) / WISCRS Adams and Juneau (ftUS) +<7587> +proj=tmerc +lat_0=43.36666666666667 +lon_0=-90 +k=1.0000365285 +x_0=147218.6941325883 +y_0=0.00365760731521463 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / WISCRS Ashland (ftUS) +<7588> +proj=tmerc +lat_0=45.70611111111111 +lon_0=-90.62222222222222 +k=1.0000495683 +x_0=172821.945948692 +y_0=0.001828803657607315 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / WISCRS Barron (ftUS) +<7589> +proj=tmerc +lat_0=45.13333333333333 +lon_0=-91.84999999999999 +k=1.0000486665 +x_0=93150 +y_0=0.003048006096012192 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / WISCRS Bayfield (ftUS) +<7590> +proj=lcc +lat_1=46.66964837722222 +lat_0=46.66964837722222 +lon_0=-91.15277777777779 +k_0=1.0000331195 +x_0=228600.4575057151 +y_0=148551.4835661671 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / WISCRS Brown (ftUS) +<7591> +proj=tmerc +lat_0=43 +lon_0=-88 +k=1.00002 +x_0=31599.99989839979 +y_0=4599.999898399797 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / WISCRS Buffalo (ftUS) +<7592> +proj=tmerc +lat_0=43.48138888888889 +lon_0=-91.79722222222222 +k=1.0000382778 +x_0=175260.3502159004 +y_0=0.004876809753619507 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / WISCRS Burnett (ftUS) +<7593> +proj=lcc +lat_1=45.89871486583333 +lat_0=45.89871486583333 +lon_0=-92.45777777777778 +k_0=1.0000383841 +x_0=64008.12771145543 +y_0=59445.90419100838 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / WISCRS Calumet, Fond du Lac, Outagamie and Winnebago (ftUS) +<7594> +proj=tmerc +lat_0=42.71944444444445 +lon_0=-88.5 +k=1.0000286569 +x_0=244754.8892049784 +y_0=0.004876809753619507 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / WISCRS Chippewa (ftUS) +<7595> +proj=lcc +lat_1=44.97785689861112 +lat_0=44.97785689861112 +lon_0=-91.29444444444444 +k_0=1.0000391127 +x_0=60045.72009144018 +y_0=44091.43449326898 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / WISCRS Clark (ftUS) +<7596> +proj=tmerc +lat_0=43.6 +lon_0=-90.70833333333334 +k=1.0000463003 +x_0=199949.198983998 +y_0=0.008534417068834137 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / WISCRS Columbia (ftUS) +<7597> +proj=lcc +lat_1=43.46254664583333 +lat_0=43.46254664583333 +lon_0=-89.39444444444445 +k_0=1.00003498 +x_0=169164.338023876 +y_0=111569.613512827 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / WISCRS Crawford (ftUS) +<7598> +proj=lcc +lat_1=43.200055605 +lat_0=43.200055605 +lon_0=-90.9388888888889 +k_0=1.0000349151 +x_0=113690.6273812548 +y_0=53703.12024384048 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / WISCRS Dane (ftUS) +<7599> +proj=lcc +lat_1=43.0695160375 +lat_0=43.0695160375 +lon_0=-89.42222222222223 +k_0=1.0000384786 +x_0=247193.2943865888 +y_0=146591.9896367793 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / WISCRS Dodge and Jefferson (ftUS) +<7600> +proj=tmerc +lat_0=41.47222222222222 +lon_0=-88.77500000000001 +k=1.0000346418 +x_0=263347.7263906528 +y_0=0.00762001524003048 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / WISCRS Door (ftUS) +<7601> +proj=tmerc +lat_0=44.4 +lon_0=-87.27222222222223 +k=1.0000187521 +x_0=158801.1176022352 +y_0=0.002438404876809754 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / WISCRS Douglas (ftUS) +<7602> +proj=tmerc +lat_0=45.88333333333333 +lon_0=-91.91666666666667 +k=1.0000385418 +x_0=59131.31826263652 +y_0=0.003962407924815849 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / WISCRS Dunn (ftUS) +<7603> +proj=tmerc +lat_0=44.40833333333333 +lon_0=-91.89444444444445 +k=1.0000410324 +x_0=51816.10393700787 +y_0=0.003048006096012192 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / WISCRS Eau Claire (ftUS) +<7604> +proj=lcc +lat_1=44.87228112638889 +lat_0=44.87228112638889 +lon_0=-91.28888888888889 +k_0=1.000035079 +x_0=120091.4401828804 +y_0=91687.92390144781 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / WISCRS Florence (ftUS) +<7605> +proj=tmerc +lat_0=45.43888888888888 +lon_0=-88.14166666666668 +k=1.0000552095 +x_0=133502.6682245364 +y_0=0.006400812801625603 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / WISCRS Forest (ftUS) +<7606> +proj=tmerc +lat_0=44.00555555555555 +lon_0=-88.63333333333334 +k=1.0000673004 +x_0=275844.5532131065 +y_0=0.0158496316992634 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / WISCRS Grant (ftUS) +<7607> +proj=tmerc +lat_0=41.41111111111111 +lon_0=-90.8 +k=1.0000349452 +x_0=242316.484023368 +y_0=0.01005842011684023 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / WISCRS Green and Lafayette (ftUS) +<7608> +proj=lcc +lat_1=42.63756227694444 +lat_0=42.63756227694444 +lon_0=-89.83888888888889 +k_0=1.0000390487 +x_0=170078.7401574803 +y_0=45830.29484378968 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / WISCRS Green Lake and Marquette (ftUS) +<7609> +proj=lcc +lat_1=43.80700011777778 +lat_0=43.80700011777778 +lon_0=-89.24166666666667 +k_0=1.0000344057 +x_0=150876.3017526035 +y_0=79170.77937515875 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / WISCRS Iowa (ftUS) +<7610> +proj=tmerc +lat_0=42.53888888888888 +lon_0=-90.16111111111111 +k=1.0000394961 +x_0=113081.0261620523 +y_0=0.004572009144018288 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / WISCRS Iron (ftUS) +<7611> +proj=tmerc +lat_0=45.43333333333333 +lon_0=-90.25555555555556 +k=1.0000677153 +x_0=220980.4419608839 +y_0=0.008534417068834137 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / WISCRS Jackson (ftUS) +<7612> +proj=tmerc +lat_0=44.25333512777778 +lon_0=-90.84429651944444 +k=1.0000353 +x_0=27000 +y_0=24999.99989839979 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / WISCRS Kenosha, Milwaukee, Ozaukee and Racine (ftUS) +<7613> +proj=tmerc +lat_0=42.21666666666667 +lon_0=-87.89444444444445 +k=1.0000260649 +x_0=185928.3727711455 +y_0=0.0009144018288036576 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / WISCRS Kewaunee, Manitowoc and Sheboygan (ftUS) +<7614> +proj=tmerc +lat_0=43.26666666666667 +lon_0=-87.55 +k=1.0000233704 +x_0=79857.76154432308 +y_0=0.001219202438404877 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / WISCRS La Crosse (ftUS) +<7615> +proj=tmerc +lat_0=43.45111111111111 +lon_0=-91.31666666666666 +k=1.0000319985 +x_0=130454.6596901194 +y_0=0.003352806705613411 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / WISCRS Langlade (ftUS) +<7616> +proj=lcc +lat_1=45.15423710527778 +lat_0=45.15423710527778 +lon_0=-89.03333333333333 +k_0=1.0000627024 +x_0=198425.1968503937 +y_0=105279.7828803657 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / WISCRS Lincoln (ftUS) +<7617> +proj=tmerc +lat_0=44.84444444444445 +lon_0=-89.73333333333333 +k=1.0000599003 +x_0=116129.0322580645 +y_0=0.005791211582423164 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / WISCRS Marathon (ftUS) +<7618> +proj=lcc +lat_1=44.90090442361111 +lat_0=44.90090442361111 +lon_0=-89.77 +k_0=1.000053289 +x_0=74676.1493522987 +y_0=55049.26695453391 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / WISCRS Marinette (ftUS) +<7619> +proj=tmerc +lat_0=44.69166666666666 +lon_0=-87.71111111111111 +k=1.0000234982 +x_0=238658.8794513589 +y_0=0.003048006096012192 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / WISCRS Menominee (ftUS) +<7620> +proj=tmerc +lat_0=44.71666666666667 +lon_0=-88.41666666666667 +k=1.0000362499 +x_0=105461.0121412243 +y_0=0.003048006096012192 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / WISCRS Monroe (ftUS) +<7621> +proj=lcc +lat_1=44.00007392861111 +lat_0=44.00007392861111 +lon_0=-90.64166666666668 +k_0=1.0000434122 +x_0=204521.2090424181 +y_0=121923.9861823724 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / WISCRS Oconto (ftUS) +<7622> +proj=tmerc +lat_0=44.39722222222222 +lon_0=-87.90833333333335 +k=1.0000236869 +x_0=182880.3675895352 +y_0=0.003352806705613411 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / WISCRS Oneida (ftUS) +<7623> +proj=lcc +lat_1=45.70422377027778 +lat_0=45.70422377027778 +lon_0=-89.54444444444444 +k_0=1.0000686968 +x_0=70104.14020828041 +y_0=57588.03474726949 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / WISCRS Pepin and Pierce (ftUS) +<7624> +proj=lcc +lat_1=44.63614887194444 +lat_0=44.63614887194444 +lon_0=-92.22777777777777 +k_0=1.0000362977 +x_0=167640.3352806706 +y_0=86033.08773177546 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / WISCRS Polk (ftUS) +<7625> +proj=tmerc +lat_0=44.66111111111111 +lon_0=-92.63333333333334 +k=1.0000433849 +x_0=141732.2822453645 +y_0=0.005791211582423164 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / WISCRS Portage (ftUS) +<7626> +proj=lcc +lat_1=44.41682397527777 +lat_0=44.41682397527777 +lon_0=-89.5 +k_0=1.000039936 +x_0=56388.11277622555 +y_0=50022.1874523749 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / WISCRS Price (ftUS) +<7627> +proj=tmerc +lat_0=44.55555555555555 +lon_0=-90.48888888888889 +k=1.0000649554 +x_0=227990.8544577089 +y_0=0.01097282194564389 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / WISCRS Richland (ftUS) +<7628> +proj=lcc +lat_1=43.3223129275 +lat_0=43.3223129275 +lon_0=-90.43055555555556 +k_0=1.0000375653 +x_0=202387.6047752095 +y_0=134255.4254508509 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / WISCRS Rock (ftUS) +<7629> +proj=tmerc +lat_0=41.94444444444444 +lon_0=-89.07222222222222 +k=1.0000337311 +x_0=146304.2926085852 +y_0=0.006705613411226822 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / WISCRS Rusk (ftUS) +<7630> +proj=tmerc +lat_0=43.91944444444444 +lon_0=-91.06666666666666 +k=1.0000495976 +x_0=250546.1013970028 +y_0=0.02346964693929388 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / WISCRS Sauk (ftUS) +<7631> +proj=tmerc +lat_0=42.81944444444445 +lon_0=-89.90000000000001 +k=1.0000373868 +x_0=185623.5715519431 +y_0=0.005181610363220727 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / WISCRS Sawyer (ftUS) +<7632> +proj=lcc +lat_1=45.90009913138888 +lat_0=45.90009913138888 +lon_0=-91.11666666666666 +k_0=1.0000573461 +x_0=216713.2337312675 +y_0=120734.1631699263 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / WISCRS Shawano (ftUS) +<7633> +proj=tmerc +lat_0=44.03611111111111 +lon_0=-88.60555555555555 +k=1.000032144 +x_0=262433.3251714504 +y_0=0.009448818897637795 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / WISCRS St. Croix (ftUS) +<7634> +proj=tmerc +lat_0=44.03611111111111 +lon_0=-92.63333333333334 +k=1.0000381803 +x_0=165506.7300990602 +y_0=0.01036322072644145 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / WISCRS Taylor (ftUS) +<7635> +proj=lcc +lat_1=45.17782208583333 +lat_0=45.17782208583333 +lon_0=-90.48333333333333 +k_0=1.0000597566 +x_0=187147.5742951486 +y_0=107746.7521463043 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / WISCRS Trempealeau (ftUS) +<7636> +proj=tmerc +lat_0=43.16111111111111 +lon_0=-91.36666666666666 +k=1.0000361538 +x_0=256946.9138938278 +y_0=0.003962407924815849 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / WISCRS Vernon (ftUS) +<7637> +proj=lcc +lat_1=43.57503293972223 +lat_0=43.57503293972223 +lon_0=-90.78333333333333 +k_0=1.0000408158 +x_0=222504.44500889 +y_0=47532.0603505207 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / WISCRS Vilas (ftUS) +<7638> +proj=lcc +lat_1=46.07784409055556 +lat_0=46.07784409055556 +lon_0=-89.48888888888889 +k_0=1.0000730142 +x_0=134417.0688341377 +y_0=50337.10927101854 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / WISCRS Walworth (ftUS) +<7639> +proj=lcc +lat_1=42.66946209694444 +lat_0=42.66946209694444 +lon_0=-88.54166666666667 +k_0=1.0000367192 +x_0=232562.8651257302 +y_0=111088.2224028448 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / WISCRS Washburn (ftUS) +<7640> +proj=lcc +lat_1=45.96121983333334 +lat_0=45.96121983333334 +lon_0=-91.78333333333333 +k_0=1.0000475376 +x_0=234086.8681737363 +y_0=188358.6059436119 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / WISCRS Washington (ftUS) +<7641> +proj=tmerc +lat_0=42.91805555555555 +lon_0=-88.06388888888888 +k=1.00003738 +x_0=120091.4414020828 +y_0=0.003048006096012192 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / WISCRS Waukesha (ftUS) +<7642> +proj=tmerc +lat_0=42.56944444444445 +lon_0=-88.22499999999999 +k=1.0000346179 +x_0=208788.4178816358 +y_0=0.003352806705613411 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / WISCRS Waupaca (ftUS) +<7643> +proj=tmerc +lat_0=43.42027777777778 +lon_0=-88.81666666666666 +k=1.0000333645 +x_0=185013.9709423419 +y_0=0.007010414020828041 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / WISCRS Waushara (ftUS) +<7644> +proj=lcc +lat_1=44.11394404583334 +lat_0=44.11394404583334 +lon_0=-89.24166666666667 +k_0=1.0000392096 +x_0=120091.4401828804 +y_0=45069.7588011176 +ellps=GRS80 +units=us-ft +no_defs <> +# NAD83(2011) / WISCRS Wood (ftUS) +<7645> +proj=lcc +lat_1=44.36259546944444 +lat_0=44.36259546944444 +lon_0=-90 +k_0=1.0000421209 +x_0=208483.6172720346 +y_0=134589.7539243078 +ellps=GRS80 +units=us-ft +no_defs <> +# Kyrg-06 / zone 1 +<7692> +proj=tmerc +lat_0=0 +lon_0=68.51666666666667 +k=1 +x_0=1300000 +y_0=14743.5 +ellps=GRS80 +units=m +no_defs <> +# Kyrg-06 / zone 2 +<7693> +proj=tmerc +lat_0=0 +lon_0=71.51666666666667 +k=1 +x_0=2300000 +y_0=14743.5 +ellps=GRS80 +units=m +no_defs <> +# Kyrg-06 / zone 3 +<7694> +proj=tmerc +lat_0=0 +lon_0=74.51666666666667 +k=1 +x_0=3300000 +y_0=14743.5 +ellps=GRS80 +units=m +no_defs <> +# Kyrg-06 / zone 4 +<7695> +proj=tmerc +lat_0=0 +lon_0=77.51666666666667 +k=1 +x_0=4300000 +y_0=14743.5 +ellps=GRS80 +units=m +no_defs <> +# Kyrg-06 / zone 5 +<7696> +proj=tmerc +lat_0=0 +lon_0=80.51666666666667 +k=1 +x_0=5300000 +y_0=14743.5 +ellps=GRS80 +units=m +no_defs <> +# WGS 84 / India NSF LCC +<7755> +proj=lcc +lat_1=12.472955 +lat_2=35.17280444444444 +lat_0=24 +lon_0=80 +x_0=4000000 +y_0=4000000 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / Andhra Pradesh +<7756> +proj=lcc +lat_1=13.75 +lat_2=18.75 +lat_0=16.25543298 +lon_0=80.875 +x_0=1000000 +y_0=1000000 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / Arunachal Pradesh +<7757> +proj=lcc +lat_1=27 +lat_2=29 +lat_0=28.00157897 +lon_0=94.5 +x_0=1000000 +y_0=1000000 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / Assam +<7758> +proj=lcc +lat_1=24.66666666666667 +lat_2=27.33333333333333 +lat_0=26.00257703 +lon_0=92.75 +x_0=1000000 +y_0=1000000 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / Bihar +<7759> +proj=lcc +lat_1=24.625 +lat_2=27.125 +lat_0=25.87725247 +lon_0=85.875 +x_0=1000000 +y_0=1000000 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / Delhi +<7760> +proj=lcc +lat_1=28.375 +lat_2=28.875 +lat_0=28.62510126 +lon_0=77 +x_0=1000000 +y_0=1000000 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / Gujarat +<7761> +proj=lcc +lat_1=20.79166666666667 +lat_2=23.95833333333333 +lat_0=22.37807121 +lon_0=71.375 +x_0=1000000 +y_0=1000000 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / Haryana +<7762> +proj=lcc +lat_1=28.08333333333333 +lat_2=30.41666666666667 +lat_0=29.25226266 +lon_0=76 +x_0=1000000 +y_0=1000000 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / Himachal Pradesh +<7763> +proj=lcc +lat_1=30.75 +lat_2=32.75 +lat_0=31.75183497 +lon_0=77.375 +x_0=1000000 +y_0=1000000 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / Jammu and Kashmir +<7764> +proj=lcc +lat_1=33.08333333333334 +lat_2=36.41666666666666 +lat_0=34.75570874 +lon_0=76.5 +x_0=1000000 +y_0=1000000 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / Jharkhand +<7765> +proj=lcc +lat_1=22.54166666666667 +lat_2=24.70833333333333 +lat_0=23.62652682 +lon_0=85.625 +x_0=1000000 +y_0=1000000 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / Madhya Pradesh +<7766> +proj=lcc +lat_1=22 +lat_2=26 +lat_0=24.00529821 +lon_0=78.375 +x_0=1000000 +y_0=1000000 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / Maharashtra +<7767> +proj=lcc +lat_1=16.625 +lat_2=21.125 +lat_0=18.88015774 +lon_0=76.75 +x_0=1000000 +y_0=1000000 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / Manipur +<7768> +proj=lcc +lat_1=24.08333333333333 +lat_2=25.41666666666667 +lat_0=24.75060911 +lon_0=94 +x_0=1000000 +y_0=1000000 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / Meghalaya +<7769> +proj=lcc +lat_1=25.20833333333333 +lat_2=26.04166666666667 +lat_0=25.62524747 +lon_0=91.375 +x_0=1000000 +y_0=1000000 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / Nagaland +<7770> +proj=lcc +lat_1=25.375 +lat_2=26.875 +lat_0=26.12581974 +lon_0=94.375 +x_0=1000000 +y_0=1000000 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / India Northeast +<7771> +proj=lcc +lat_1=23.04166666666667 +lat_2=28.20833333333333 +lat_0=25.63452135 +lon_0=93.5 +x_0=1000000 +y_0=1000000 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / Orissa +<7772> +proj=lcc +lat_1=18.58333333333333 +lat_2=21.91666666666667 +lat_0=20.25305174 +lon_0=84.375 +x_0=1000000 +y_0=1000000 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / Punjab +<7773> +proj=lcc +lat_1=30 +lat_2=32 +lat_0=31.00178226 +lon_0=75.375 +x_0=1000000 +y_0=1000000 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / Rajasthan +<7774> +proj=lcc +lat_1=24.29166666666667 +lat_2=29.45833333333333 +lat_0=26.88505546 +lon_0=73.875 +x_0=1000000 +y_0=1000000 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / Uttar Pradesh +<7775> +proj=lcc +lat_1=24.875 +lat_2=29.375 +lat_0=27.13270823 +lon_0=80.875 +x_0=1000000 +y_0=1000000 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / Uttaranchal +<7776> +proj=lcc +lat_1=29 +lat_2=31 +lat_0=30.0017132 +lon_0=79.375 +x_0=1000000 +y_0=1000000 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / Andaman and Nicobar +<7777> +proj=tmerc +lat_0=10.25 +lon_0=93.25 +k=0.9999428 +x_0=1000000 +y_0=1000000 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / Chhattisgarh +<7778> +proj=tmerc +lat_0=21 +lon_0=82.25 +k=0.9998332 +x_0=1000000 +y_0=1000000 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / Goa +<7779> +proj=tmerc +lat_0=15.375 +lon_0=74 +k=0.9999913 +x_0=1000000 +y_0=1000000 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / Karnataka +<7780> +proj=tmerc +lat_0=15.125 +lon_0=76.375 +k=0.9998011999999999 +x_0=1000000 +y_0=1000000 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / Kerala +<7781> +proj=tmerc +lat_0=10.5 +lon_0=76 +k=0.9999177 +x_0=1000000 +y_0=1000000 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / Lakshadweep +<7782> +proj=tmerc +lat_0=10 +lon_0=73.125 +k=0.9999536 +x_0=1000000 +y_0=1000000 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / Mizoram +<7783> +proj=tmerc +lat_0=23.125 +lon_0=92.75 +k=0.9999821 +x_0=1000000 +y_0=1000000 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / Sikkim +<7784> +proj=tmerc +lat_0=27.625 +lon_0=88.5 +k=0.9999926 +x_0=1000000 +y_0=1000000 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / Tamil Nadu +<7785> +proj=tmerc +lat_0=10.875 +lon_0=78.375 +k=0.9997942 +x_0=1000000 +y_0=1000000 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / Tripura +<7786> +proj=tmerc +lat_0=23.75 +lon_0=91.75 +k=0.9999822 +x_0=1000000 +y_0=1000000 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / West Bengal +<7787> +proj=tmerc +lat_0=24.375 +lon_0=87.875 +k=0.9998584 +x_0=1000000 +y_0=1000000 +datum=WGS84 +units=m +no_defs <> +# RDN2008 / UTM zone 32N +<7791> +proj=utm +zone=32 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# RDN2008 / UTM zone 33N +<7792> +proj=utm +zone=33 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# RDN2008 / UTM zone 34N +<7793> +proj=utm +zone=34 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# RDN2008 / Italy zone (E-N) +<7794> +proj=tmerc +lat_0=0 +lon_0=12 +k=0.9985000000000001 +x_0=7000000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# RDN2008 / Zone 12 (E-N) +<7795> +proj=tmerc +lat_0=0 +lon_0=12 +k=1 +x_0=3000000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# BGS2005 / UTM zone 34N (N-E) +<7799> +proj=utm +zone=34 +ellps=GRS80 +units=m +no_defs <> +# BGS2005 / UTM zone 35N (N-E) +<7800> +proj=utm +zone=35 +ellps=GRS80 +units=m +no_defs <> +# BGS2005 / CCS2005 +<7801> +proj=lcc +lat_1=42 +lat_2=43.33333333333334 +lat_0=42.66787568333333 +lon_0=25.5 +x_0=500000 +y_0=4725824.3591 +ellps=GRS80 +units=m +no_defs <> +# BGS2005 / UTM zone 34N +<7803> +proj=utm +zone=34 +ellps=GRS80 +units=m +no_defs <> +# BGS2005 / UTM zone 35N +<7804> +proj=utm +zone=34 +ellps=GRS80 +units=m +no_defs <> +# BGS2005 / UTM zone 36N +<7805> +proj=utm +zone=36 +ellps=GRS80 +units=m +no_defs <> +# Pulkovo 1942 / CS63 zone X1 +<7825> +proj=tmerc +lat_0=0.08333333333333333 +lon_0=23.5 +k=1 +x_0=1300000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / CS63 zone X2 +<7826> +proj=tmerc +lat_0=0.08333333333333333 +lon_0=26.5 +k=1 +x_0=2300000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / CS63 zone X3 +<7827> +proj=tmerc +lat_0=0.08333333333333333 +lon_0=29.5 +k=1 +x_0=3300000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / CS63 zone X4 +<7828> +proj=tmerc +lat_0=0.08333333333333333 +lon_0=32.5 +k=1 +x_0=4300000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / CS63 zone X5 +<7829> +proj=tmerc +lat_0=0.08333333333333333 +lon_0=35.5 +k=1 +x_0=5300000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / CS63 zone X6 +<7830> +proj=tmerc +lat_0=0.08333333333333333 +lon_0=38.5 +k=1 +x_0=6300000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / CS63 zone X7 +<7831> +proj=tmerc +lat_0=0.08333333333333333 +lon_0=41.5 +k=1 +x_0=7300000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# GDA2020 / GA LCC +<7845> +proj=lcc +lat_1=-18 +lat_2=-36 +lat_0=0 +lon_0=134 +x_0=0 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# GDA2020 / MGA zone 46 +<7846> +proj=utm +zone=46 +south +ellps=GRS80 +units=m +no_defs <> +# GDA2020 / MGA zone 47 +<7847> +proj=utm +zone=47 +south +ellps=GRS80 +units=m +no_defs <> +# GDA2020 / MGA zone 48 +<7848> +proj=utm +zone=48 +south +ellps=GRS80 +units=m +no_defs <> +# GDA2020 / MGA zone 49 +<7849> +proj=utm +zone=49 +south +ellps=GRS80 +units=m +no_defs <> +# GDA2020 / MGA zone 50 +<7850> +proj=utm +zone=50 +south +ellps=GRS80 +units=m +no_defs <> +# GDA2020 / MGA zone 51 +<7851> +proj=utm +zone=51 +south +ellps=GRS80 +units=m +no_defs <> +# GDA2020 / MGA zone 52 +<7852> +proj=utm +zone=52 +south +ellps=GRS80 +units=m +no_defs <> +# GDA2020 / MGA zone 53 +<7853> +proj=utm +zone=53 +south +ellps=GRS80 +units=m +no_defs <> +# GDA2020 / MGA zone 54 +<7854> +proj=utm +zone=54 +south +ellps=GRS80 +units=m +no_defs <> +# GDA2020 / MGA zone 55 +<7855> +proj=utm +zone=55 +south +ellps=GRS80 +units=m +no_defs <> +# GDA2020 / MGA zone 56 +<7856> +proj=utm +zone=56 +south +ellps=GRS80 +units=m +no_defs <> +# GDA2020 / MGA zone 57 +<7857> +proj=utm +zone=57 +south +ellps=GRS80 +units=m +no_defs <> +# GDA2020 / MGA zone 58 +<7858> +proj=utm +zone=58 +south +ellps=GRS80 +units=m +no_defs <> +# GDA2020 / MGA zone 59 +<7859> +proj=utm +zone=59 +south +ellps=GRS80 +units=m +no_defs <> +# Astro DOS 71 / SHLG71 +<7877> +proj=tmerc +lat_0=-15.96666666666667 +lon_0=-5.716666666666667 +k=1 +x_0=300000 +y_0=2000000 +ellps=intl +towgs84=-320,550,-494,0,0,0,0 +units=m +no_defs <> +# Astro DOS 71 / UTM zone 30S +<7878> +proj=utm +zone=30 +south +ellps=intl +towgs84=-320,550,-494,0,0,0,0 +units=m +no_defs <> +# St. Helena Tritan / SHLG(Tritan) +<7882> +proj=tmerc +lat_0=-15.96666666666667 +lon_0=-5.716666666666667 +k=1 +x_0=299483.737 +y_0=2000527.879 +ellps=WGS84 +towgs84=-0.077,0.079,0.086,0,0,0,0 +units=m +no_defs <> +# St. Helena Tritan / UTM zone 30S +<7883> +proj=utm +zone=30 +south +ellps=WGS84 +towgs84=-0.077,0.079,0.086,0,0,0,0 +units=m +no_defs <> +# SHMG2015 +<7887> +proj=utm +zone=30 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# GDA2020 / Vicgrid +<7899> +proj=lcc +lat_1=-36 +lat_2=-38 +lat_0=-37 +lon_0=145 +x_0=2500000 +y_0=2500000 +ellps=GRS80 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger zone 4 +<20004> +proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=4500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger zone 5 +<20005> +proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=5500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger zone 6 +<20006> +proj=tmerc +lat_0=0 +lon_0=33 +k=1 +x_0=6500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger zone 7 +<20007> +proj=tmerc +lat_0=0 +lon_0=39 +k=1 +x_0=7500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger zone 8 +<20008> +proj=tmerc +lat_0=0 +lon_0=45 +k=1 +x_0=8500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger zone 9 +<20009> +proj=tmerc +lat_0=0 +lon_0=51 +k=1 +x_0=9500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger zone 10 +<20010> +proj=tmerc +lat_0=0 +lon_0=57 +k=1 +x_0=10500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger zone 11 +<20011> +proj=tmerc +lat_0=0 +lon_0=63 +k=1 +x_0=11500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger zone 12 +<20012> +proj=tmerc +lat_0=0 +lon_0=69 +k=1 +x_0=12500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger zone 13 +<20013> +proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=13500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger zone 14 +<20014> +proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=14500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger zone 15 +<20015> +proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=15500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger zone 16 +<20016> +proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=16500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger zone 17 +<20017> +proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=17500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger zone 18 +<20018> +proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=18500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger zone 19 +<20019> +proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=19500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger zone 20 +<20020> +proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=20500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger zone 21 +<20021> +proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=21500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger zone 22 +<20022> +proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=22500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger zone 23 +<20023> +proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=23500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger zone 24 +<20024> +proj=tmerc +lat_0=0 +lon_0=141 +k=1 +x_0=24500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger zone 25 +<20025> +proj=tmerc +lat_0=0 +lon_0=147 +k=1 +x_0=25500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger zone 26 +<20026> +proj=tmerc +lat_0=0 +lon_0=153 +k=1 +x_0=26500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger zone 27 +<20027> +proj=tmerc +lat_0=0 +lon_0=159 +k=1 +x_0=27500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger zone 28 +<20028> +proj=tmerc +lat_0=0 +lon_0=165 +k=1 +x_0=28500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger zone 29 +<20029> +proj=tmerc +lat_0=0 +lon_0=171 +k=1 +x_0=29500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger zone 30 +<20030> +proj=tmerc +lat_0=0 +lon_0=177 +k=1 +x_0=30500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger zone 31 +<20031> +proj=tmerc +lat_0=0 +lon_0=-177 +k=1 +x_0=31500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger zone 32 +<20032> +proj=tmerc +lat_0=0 +lon_0=-171 +k=1 +x_0=32500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger 4N (deprecated) +<20064> +proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger 5N (deprecated) +<20065> +proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger 6N (deprecated) +<20066> +proj=tmerc +lat_0=0 +lon_0=33 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger 7N (deprecated) +<20067> +proj=tmerc +lat_0=0 +lon_0=39 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger 8N (deprecated) +<20068> +proj=tmerc +lat_0=0 +lon_0=45 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger 9N (deprecated) +<20069> +proj=tmerc +lat_0=0 +lon_0=51 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger 10N (deprecated) +<20070> +proj=tmerc +lat_0=0 +lon_0=57 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger 11N (deprecated) +<20071> +proj=tmerc +lat_0=0 +lon_0=63 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger 12N (deprecated) +<20072> +proj=tmerc +lat_0=0 +lon_0=69 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger 13N (deprecated) +<20073> +proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger 14N (deprecated) +<20074> +proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger 15N (deprecated) +<20075> +proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger 16N (deprecated) +<20076> +proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger 17N (deprecated) +<20077> +proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger 18N (deprecated) +<20078> +proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger 19N (deprecated) +<20079> +proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger 20N (deprecated) +<20080> +proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger 21N (deprecated) +<20081> +proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger 22N (deprecated) +<20082> +proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger 23N (deprecated) +<20083> +proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger 24N (deprecated) +<20084> +proj=tmerc +lat_0=0 +lon_0=141 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger 25N (deprecated) +<20085> +proj=tmerc +lat_0=0 +lon_0=147 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger 26N (deprecated) +<20086> +proj=tmerc +lat_0=0 +lon_0=153 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger 27N (deprecated) +<20087> +proj=tmerc +lat_0=0 +lon_0=159 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger 28N (deprecated) +<20088> +proj=tmerc +lat_0=0 +lon_0=165 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger 29N (deprecated) +<20089> +proj=tmerc +lat_0=0 +lon_0=171 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger 30N (deprecated) +<20090> +proj=tmerc +lat_0=0 +lon_0=177 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger 31N (deprecated) +<20091> +proj=tmerc +lat_0=0 +lon_0=-177 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger 32N (deprecated) +<20092> +proj=tmerc +lat_0=0 +lon_0=-171 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs <> +# Adindan / UTM zone 35N +<20135> +proj=utm +zone=35 +ellps=clrk80 +towgs84=-166,-15,204,0,0,0,0 +units=m +no_defs <> +# Adindan / UTM zone 36N +<20136> +proj=utm +zone=36 +ellps=clrk80 +towgs84=-166,-15,204,0,0,0,0 +units=m +no_defs <> +# Adindan / UTM zone 37N +<20137> +proj=utm +zone=37 +ellps=clrk80 +towgs84=-166,-15,204,0,0,0,0 +units=m +no_defs <> +# Adindan / UTM zone 38N +<20138> +proj=utm +zone=38 +ellps=clrk80 +towgs84=-166,-15,204,0,0,0,0 +units=m +no_defs <> +# AGD66 / AMG zone 48 (deprecated) +<20248> +proj=utm +zone=48 +south +ellps=aust_SA +towgs84=-117.808,-51.536,137.784,0.303,0.446,0.234,-0.29 +units=m +no_defs <> +# AGD66 / AMG zone 49 +<20249> +proj=utm +zone=49 +south +ellps=aust_SA +towgs84=-117.808,-51.536,137.784,0.303,0.446,0.234,-0.29 +units=m +no_defs <> +# AGD66 / AMG zone 50 +<20250> +proj=utm +zone=50 +south +ellps=aust_SA +towgs84=-117.808,-51.536,137.784,0.303,0.446,0.234,-0.29 +units=m +no_defs <> +# AGD66 / AMG zone 51 +<20251> +proj=utm +zone=51 +south +ellps=aust_SA +towgs84=-117.808,-51.536,137.784,0.303,0.446,0.234,-0.29 +units=m +no_defs <> +# AGD66 / AMG zone 52 +<20252> +proj=utm +zone=52 +south +ellps=aust_SA +towgs84=-117.808,-51.536,137.784,0.303,0.446,0.234,-0.29 +units=m +no_defs <> +# AGD66 / AMG zone 53 +<20253> +proj=utm +zone=53 +south +ellps=aust_SA +towgs84=-117.808,-51.536,137.784,0.303,0.446,0.234,-0.29 +units=m +no_defs <> +# AGD66 / AMG zone 54 +<20254> +proj=utm +zone=54 +south +ellps=aust_SA +towgs84=-117.808,-51.536,137.784,0.303,0.446,0.234,-0.29 +units=m +no_defs <> +# AGD66 / AMG zone 55 +<20255> +proj=utm +zone=55 +south +ellps=aust_SA +towgs84=-117.808,-51.536,137.784,0.303,0.446,0.234,-0.29 +units=m +no_defs <> +# AGD66 / AMG zone 56 +<20256> +proj=utm +zone=56 +south +ellps=aust_SA +towgs84=-117.808,-51.536,137.784,0.303,0.446,0.234,-0.29 +units=m +no_defs <> +# AGD66 / AMG zone 57 +<20257> +proj=utm +zone=57 +south +ellps=aust_SA +towgs84=-117.808,-51.536,137.784,0.303,0.446,0.234,-0.29 +units=m +no_defs <> +# AGD66 / AMG zone 58 +<20258> +proj=utm +zone=58 +south +ellps=aust_SA +towgs84=-117.808,-51.536,137.784,0.303,0.446,0.234,-0.29 +units=m +no_defs <> +# AGD84 / AMG zone 48 (deprecated) +<20348> +proj=utm +zone=48 +south +ellps=aust_SA +towgs84=-134,-48,149,0,0,0,0 +units=m +no_defs <> +# AGD84 / AMG zone 49 +<20349> +proj=utm +zone=49 +south +ellps=aust_SA +towgs84=-134,-48,149,0,0,0,0 +units=m +no_defs <> +# AGD84 / AMG zone 50 +<20350> +proj=utm +zone=50 +south +ellps=aust_SA +towgs84=-134,-48,149,0,0,0,0 +units=m +no_defs <> +# AGD84 / AMG zone 51 +<20351> +proj=utm +zone=51 +south +ellps=aust_SA +towgs84=-134,-48,149,0,0,0,0 +units=m +no_defs <> +# AGD84 / AMG zone 52 +<20352> +proj=utm +zone=52 +south +ellps=aust_SA +towgs84=-134,-48,149,0,0,0,0 +units=m +no_defs <> +# AGD84 / AMG zone 53 +<20353> +proj=utm +zone=53 +south +ellps=aust_SA +towgs84=-134,-48,149,0,0,0,0 +units=m +no_defs <> +# AGD84 / AMG zone 54 +<20354> +proj=utm +zone=54 +south +ellps=aust_SA +towgs84=-134,-48,149,0,0,0,0 +units=m +no_defs <> +# AGD84 / AMG zone 55 +<20355> +proj=utm +zone=55 +south +ellps=aust_SA +towgs84=-134,-48,149,0,0,0,0 +units=m +no_defs <> +# AGD84 / AMG zone 56 +<20356> +proj=utm +zone=56 +south +ellps=aust_SA +towgs84=-134,-48,149,0,0,0,0 +units=m +no_defs <> +# AGD84 / AMG zone 57 (deprecated) +<20357> +proj=utm +zone=57 +south +ellps=aust_SA +towgs84=-134,-48,149,0,0,0,0 +units=m +no_defs <> +# AGD84 / AMG zone 58 (deprecated) +<20358> +proj=utm +zone=58 +south +ellps=aust_SA +towgs84=-134,-48,149,0,0,0,0 +units=m +no_defs <> +# Ain el Abd / UTM zone 36N +<20436> +proj=utm +zone=36 +ellps=intl +towgs84=-143,-236,7,0,0,0,0 +units=m +no_defs <> +# Ain el Abd / UTM zone 37N +<20437> +proj=utm +zone=37 +ellps=intl +towgs84=-143,-236,7,0,0,0,0 +units=m +no_defs <> +# Ain el Abd / UTM zone 38N +<20438> +proj=utm +zone=38 +ellps=intl +towgs84=-143,-236,7,0,0,0,0 +units=m +no_defs <> +# Ain el Abd / UTM zone 39N +<20439> +proj=utm +zone=39 +ellps=intl +towgs84=-143,-236,7,0,0,0,0 +units=m +no_defs <> +# Ain el Abd / UTM zone 40N +<20440> +proj=utm +zone=40 +ellps=intl +towgs84=-143,-236,7,0,0,0,0 +units=m +no_defs <> +# Ain el Abd / Bahrain Grid +<20499> +proj=utm +zone=39 +ellps=intl +towgs84=-143,-236,7,0,0,0,0 +units=m +no_defs <> +# Afgooye / UTM zone 38N +<20538> +proj=utm +zone=38 +ellps=krass +towgs84=-43,-163,45,0,0,0,0 +units=m +no_defs <> +# Afgooye / UTM zone 39N +<20539> +proj=utm +zone=39 +ellps=krass +towgs84=-43,-163,45,0,0,0,0 +units=m +no_defs <> +# Lisbon (Lisbon) / Portuguese National Grid +<20790> +proj=tmerc +lat_0=39.66666666666666 +lon_0=1 +k=1 +x_0=200000 +y_0=300000 +ellps=intl +towgs84=-304.046,-60.576,103.64,0,0,0,0 +pm=lisbon +units=m +no_defs <> +# Lisbon (Lisbon) / Portuguese Grid +<20791> +proj=tmerc +lat_0=39.66666666666666 +lon_0=1 +k=1 +x_0=0 +y_0=0 +ellps=intl +towgs84=-304.046,-60.576,103.64,0,0,0,0 +pm=lisbon +units=m +no_defs <> +# Aratu / UTM zone 22S +<20822> +proj=utm +zone=22 +south +ellps=intl +towgs84=-151.99,287.04,-147.45,0,0,0,0 +units=m +no_defs <> +# Aratu / UTM zone 23S +<20823> +proj=utm +zone=23 +south +ellps=intl +towgs84=-151.99,287.04,-147.45,0,0,0,0 +units=m +no_defs <> +# Aratu / UTM zone 24S +<20824> +proj=utm +zone=24 +south +ellps=intl +towgs84=-151.99,287.04,-147.45,0,0,0,0 +units=m +no_defs <> +# Arc 1950 / UTM zone 34S +<20934> +proj=utm +zone=34 +south +a=6378249.145 +b=6356514.966398753 +towgs84=-143,-90,-294,0,0,0,0 +units=m +no_defs <> +# Arc 1950 / UTM zone 35S +<20935> +proj=utm +zone=35 +south +a=6378249.145 +b=6356514.966398753 +towgs84=-143,-90,-294,0,0,0,0 +units=m +no_defs <> +# Arc 1950 / UTM zone 36S +<20936> +proj=utm +zone=36 +south +a=6378249.145 +b=6356514.966398753 +towgs84=-143,-90,-294,0,0,0,0 +units=m +no_defs <> +# Arc 1960 / UTM zone 35S +<21035> +proj=utm +zone=35 +south +ellps=clrk80 +towgs84=-160,-6,-302,0,0,0,0 +units=m +no_defs <> +# Arc 1960 / UTM zone 36S +<21036> +proj=utm +zone=36 +south +ellps=clrk80 +towgs84=-160,-6,-302,0,0,0,0 +units=m +no_defs <> +# Arc 1960 / UTM zone 37S +<21037> +proj=utm +zone=37 +south +ellps=clrk80 +towgs84=-160,-6,-302,0,0,0,0 +units=m +no_defs <> +# Arc 1960 / UTM zone 35N +<21095> +proj=utm +zone=35 +ellps=clrk80 +towgs84=-160,-6,-302,0,0,0,0 +units=m +no_defs <> +# Arc 1960 / UTM zone 36N +<21096> +proj=utm +zone=36 +ellps=clrk80 +towgs84=-160,-6,-302,0,0,0,0 +units=m +no_defs <> +# Arc 1960 / UTM zone 37N +<21097> +proj=utm +zone=37 +ellps=clrk80 +towgs84=-160,-6,-302,0,0,0,0 +units=m +no_defs <> +# Batavia (Jakarta) / NEIEZ (deprecated) +<21100> +proj=merc +lon_0=110 +k=0.997 +x_0=3900000 +y_0=900000 +ellps=bessel +towgs84=-377,681,-50,0,0,0,0 +pm=jakarta +units=m +no_defs <> +# Batavia / UTM zone 48S +<21148> +proj=utm +zone=48 +south +ellps=bessel +towgs84=-377,681,-50,0,0,0,0 +units=m +no_defs <> +# Batavia / UTM zone 49S +<21149> +proj=utm +zone=49 +south +ellps=bessel +towgs84=-377,681,-50,0,0,0,0 +units=m +no_defs <> +# Batavia / UTM zone 50S +<21150> +proj=utm +zone=50 +south +ellps=bessel +towgs84=-377,681,-50,0,0,0,0 +units=m +no_defs <> +# Barbados 1938 / British West Indies Grid +<21291> +proj=tmerc +lat_0=0 +lon_0=-62 +k=0.9995000000000001 +x_0=400000 +y_0=0 +ellps=clrk80 +towgs84=31.95,300.99,419.19,0,0,0,0 +units=m +no_defs <> +# Barbados 1938 / Barbados National Grid +<21292> +proj=tmerc +lat_0=13.17638888888889 +lon_0=-59.55972222222222 +k=0.9999986 +x_0=30000 +y_0=75000 +ellps=clrk80 +towgs84=31.95,300.99,419.19,0,0,0,0 +units=m +no_defs <> +# Beijing 1954 / Gauss-Kruger zone 13 +<21413> +proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=13500000 +y_0=0 +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +units=m +no_defs <> +# Beijing 1954 / Gauss-Kruger zone 14 +<21414> +proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=14500000 +y_0=0 +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +units=m +no_defs <> +# Beijing 1954 / Gauss-Kruger zone 15 +<21415> +proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=15500000 +y_0=0 +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +units=m +no_defs <> +# Beijing 1954 / Gauss-Kruger zone 16 +<21416> +proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=16500000 +y_0=0 +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +units=m +no_defs <> +# Beijing 1954 / Gauss-Kruger zone 17 +<21417> +proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=17500000 +y_0=0 +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +units=m +no_defs <> +# Beijing 1954 / Gauss-Kruger zone 18 +<21418> +proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=18500000 +y_0=0 +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +units=m +no_defs <> +# Beijing 1954 / Gauss-Kruger zone 19 +<21419> +proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=19500000 +y_0=0 +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +units=m +no_defs <> +# Beijing 1954 / Gauss-Kruger zone 20 +<21420> +proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=20500000 +y_0=0 +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +units=m +no_defs <> +# Beijing 1954 / Gauss-Kruger zone 21 +<21421> +proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=21500000 +y_0=0 +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +units=m +no_defs <> +# Beijing 1954 / Gauss-Kruger zone 22 +<21422> +proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=22500000 +y_0=0 +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +units=m +no_defs <> +# Beijing 1954 / Gauss-Kruger zone 23 +<21423> +proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=23500000 +y_0=0 +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +units=m +no_defs <> +# Beijing 1954 / Gauss-Kruger CM 75E +<21453> +proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +units=m +no_defs <> +# Beijing 1954 / Gauss-Kruger CM 81E +<21454> +proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +units=m +no_defs <> +# Beijing 1954 / Gauss-Kruger CM 87E +<21455> +proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +units=m +no_defs <> +# Beijing 1954 / Gauss-Kruger CM 93E +<21456> +proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +units=m +no_defs <> +# Beijing 1954 / Gauss-Kruger CM 99E +<21457> +proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +units=m +no_defs <> +# Beijing 1954 / Gauss-Kruger CM 105E +<21458> +proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +units=m +no_defs <> +# Beijing 1954 / Gauss-Kruger CM 111E +<21459> +proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +units=m +no_defs <> +# Beijing 1954 / Gauss-Kruger CM 117E +<21460> +proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +units=m +no_defs <> +# Beijing 1954 / Gauss-Kruger CM 123E +<21461> +proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +units=m +no_defs <> +# Beijing 1954 / Gauss-Kruger CM 129E +<21462> +proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +units=m +no_defs <> +# Beijing 1954 / Gauss-Kruger CM 135E +<21463> +proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +units=m +no_defs <> +# Beijing 1954 / Gauss-Kruger 13N (deprecated) +<21473> +proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +units=m +no_defs <> +# Beijing 1954 / Gauss-Kruger 14N (deprecated) +<21474> +proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +units=m +no_defs <> +# Beijing 1954 / Gauss-Kruger 15N (deprecated) +<21475> +proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +units=m +no_defs <> +# Beijing 1954 / Gauss-Kruger 16N (deprecated) +<21476> +proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +units=m +no_defs <> +# Beijing 1954 / Gauss-Kruger 17N (deprecated) +<21477> +proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +units=m +no_defs <> +# Beijing 1954 / Gauss-Kruger 18N (deprecated) +<21478> +proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +units=m +no_defs <> +# Beijing 1954 / Gauss-Kruger 19N (deprecated) +<21479> +proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +units=m +no_defs <> +# Beijing 1954 / Gauss-Kruger 20N (deprecated) +<21480> +proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +units=m +no_defs <> +# Beijing 1954 / Gauss-Kruger 21N (deprecated) +<21481> +proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +units=m +no_defs <> +# Beijing 1954 / Gauss-Kruger 22N (deprecated) +<21482> +proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +units=m +no_defs <> +# Beijing 1954 / Gauss-Kruger 23N (deprecated) +<21483> +proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +units=m +no_defs <> +# Belge 1950 (Brussels) / Belge Lambert 50 +<21500> +proj=lcc +lat_1=49.83333333333334 +lat_2=51.16666666666666 +lat_0=90 +lon_0=0 +x_0=150000 +y_0=5400000 +ellps=intl +pm=brussels +units=m +no_defs <> +# Bern 1898 (Bern) / LV03C +<21780> +proj=somerc +lat_0=46.95240555555556 +lon_0=0 +k_0=1 +x_0=0 +y_0=0 +ellps=bessel +towgs84=674.374,15.056,405.346,0,0,0,0 +pm=bern +units=m +no_defs <> +# CH1903 / LV03 +<21781> +proj=somerc +lat_0=46.95240555555556 +lon_0=7.439583333333333 +k_0=1 +x_0=600000 +y_0=200000 +ellps=bessel +towgs84=674.374,15.056,405.346,0,0,0,0 +units=m +no_defs <> +# CH1903 / LV03C-G +<21782> +proj=somerc +lat_0=46.95240555555556 +lon_0=7.439583333333333 +k_0=1 +x_0=0 +y_0=0 +ellps=bessel +towgs84=674.374,15.056,405.346,0,0,0,0 +units=m +no_defs <> +# Bogota 1975 / UTM zone 17N (deprecated) +<21817> +proj=utm +zone=17 +ellps=intl +towgs84=307,304,-318,0,0,0,0 +units=m +no_defs <> +# Bogota 1975 / UTM zone 18N +<21818> +proj=utm +zone=18 +ellps=intl +towgs84=307,304,-318,0,0,0,0 +units=m +no_defs <> +# Bogota 1975 / Colombia West zone (deprecated) +<21891> +proj=tmerc +lat_0=4.599047222222222 +lon_0=-77.08091666666667 +k=1 +x_0=1000000 +y_0=1000000 +ellps=intl +towgs84=307,304,-318,0,0,0,0 +units=m +no_defs <> +# Bogota 1975 / Colombia Bogota zone (deprecated) +<21892> +proj=tmerc +lat_0=4.599047222222222 +lon_0=-74.08091666666667 +k=1 +x_0=1000000 +y_0=1000000 +ellps=intl +towgs84=307,304,-318,0,0,0,0 +units=m +no_defs <> +# Bogota 1975 / Colombia East Central zone (deprecated) +<21893> +proj=tmerc +lat_0=4.599047222222222 +lon_0=-71.08091666666667 +k=1 +x_0=1000000 +y_0=1000000 +ellps=intl +towgs84=307,304,-318,0,0,0,0 +units=m +no_defs <> +# Bogota 1975 / Colombia East (deprecated) +<21894> +proj=tmerc +lat_0=4.599047222222222 +lon_0=-68.08091666666667 +k=1 +x_0=1000000 +y_0=1000000 +ellps=intl +towgs84=307,304,-318,0,0,0,0 +units=m +no_defs <> +# Bogota 1975 / Colombia West zone +<21896> +proj=tmerc +lat_0=4.599047222222222 +lon_0=-77.08091666666667 +k=1 +x_0=1000000 +y_0=1000000 +ellps=intl +towgs84=307,304,-318,0,0,0,0 +units=m +no_defs <> +# Bogota 1975 / Colombia Bogota zone +<21897> +proj=tmerc +lat_0=4.599047222222222 +lon_0=-74.08091666666667 +k=1 +x_0=1000000 +y_0=1000000 +ellps=intl +towgs84=307,304,-318,0,0,0,0 +units=m +no_defs <> +# Bogota 1975 / Colombia East Central zone +<21898> +proj=tmerc +lat_0=4.599047222222222 +lon_0=-71.08091666666667 +k=1 +x_0=1000000 +y_0=1000000 +ellps=intl +towgs84=307,304,-318,0,0,0,0 +units=m +no_defs <> +# Bogota 1975 / Colombia East +<21899> +proj=tmerc +lat_0=4.599047222222222 +lon_0=-68.08091666666667 +k=1 +x_0=1000000 +y_0=1000000 +ellps=intl +towgs84=307,304,-318,0,0,0,0 +units=m +no_defs <> +# Camacupa / UTM zone 32S +<22032> +proj=utm +zone=32 +south +ellps=clrk80 +towgs84=-50.9,-347.6,-231,0,0,0,0 +units=m +no_defs <> +# Camacupa / UTM zone 33S +<22033> +proj=utm +zone=33 +south +ellps=clrk80 +towgs84=-50.9,-347.6,-231,0,0,0,0 +units=m +no_defs <> +# Camacupa / TM 11.30 SE +<22091> +proj=tmerc +lat_0=0 +lon_0=11.5 +k=0.9996 +x_0=500000 +y_0=10000000 +ellps=clrk80 +towgs84=-50.9,-347.6,-231,0,0,0,0 +units=m +no_defs <> +# Camacupa / TM 12 SE +<22092> +proj=tmerc +lat_0=0 +lon_0=12 +k=0.9996 +x_0=500000 +y_0=10000000 +ellps=clrk80 +towgs84=-50.9,-347.6,-231,0,0,0,0 +units=m +no_defs <> +# POSGAR 98 / Argentina 1 +<22171> +proj=tmerc +lat_0=-90 +lon_0=-72 +k=1 +x_0=1500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# POSGAR 98 / Argentina 2 +<22172> +proj=tmerc +lat_0=-90 +lon_0=-69 +k=1 +x_0=2500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# POSGAR 98 / Argentina 3 +<22173> +proj=tmerc +lat_0=-90 +lon_0=-66 +k=1 +x_0=3500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# POSGAR 98 / Argentina 4 +<22174> +proj=tmerc +lat_0=-90 +lon_0=-63 +k=1 +x_0=4500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# POSGAR 98 / Argentina 5 +<22175> +proj=tmerc +lat_0=-90 +lon_0=-60 +k=1 +x_0=5500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# POSGAR 98 / Argentina 6 +<22176> +proj=tmerc +lat_0=-90 +lon_0=-57 +k=1 +x_0=6500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# POSGAR 98 / Argentina 7 +<22177> +proj=tmerc +lat_0=-90 +lon_0=-54 +k=1 +x_0=7500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# POSGAR 94 / Argentina 1 +<22181> +proj=tmerc +lat_0=-90 +lon_0=-72 +k=1 +x_0=1500000 +y_0=0 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# POSGAR 94 / Argentina 2 +<22182> +proj=tmerc +lat_0=-90 +lon_0=-69 +k=1 +x_0=2500000 +y_0=0 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# POSGAR 94 / Argentina 3 +<22183> +proj=tmerc +lat_0=-90 +lon_0=-66 +k=1 +x_0=3500000 +y_0=0 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# POSGAR 94 / Argentina 4 +<22184> +proj=tmerc +lat_0=-90 +lon_0=-63 +k=1 +x_0=4500000 +y_0=0 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# POSGAR 94 / Argentina 5 +<22185> +proj=tmerc +lat_0=-90 +lon_0=-60 +k=1 +x_0=5500000 +y_0=0 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# POSGAR 94 / Argentina 6 +<22186> +proj=tmerc +lat_0=-90 +lon_0=-57 +k=1 +x_0=6500000 +y_0=0 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# POSGAR 94 / Argentina 7 +<22187> +proj=tmerc +lat_0=-90 +lon_0=-54 +k=1 +x_0=7500000 +y_0=0 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Campo Inchauspe / Argentina 1 +<22191> +proj=tmerc +lat_0=-90 +lon_0=-72 +k=1 +x_0=1500000 +y_0=0 +ellps=intl +towgs84=-148,136,90,0,0,0,0 +units=m +no_defs <> +# Campo Inchauspe / Argentina 2 +<22192> +proj=tmerc +lat_0=-90 +lon_0=-69 +k=1 +x_0=2500000 +y_0=0 +ellps=intl +towgs84=-148,136,90,0,0,0,0 +units=m +no_defs <> +# Campo Inchauspe / Argentina 3 +<22193> +proj=tmerc +lat_0=-90 +lon_0=-66 +k=1 +x_0=3500000 +y_0=0 +ellps=intl +towgs84=-148,136,90,0,0,0,0 +units=m +no_defs <> +# Campo Inchauspe / Argentina 4 +<22194> +proj=tmerc +lat_0=-90 +lon_0=-63 +k=1 +x_0=4500000 +y_0=0 +ellps=intl +towgs84=-148,136,90,0,0,0,0 +units=m +no_defs <> +# Campo Inchauspe / Argentina 5 +<22195> +proj=tmerc +lat_0=-90 +lon_0=-60 +k=1 +x_0=5500000 +y_0=0 +ellps=intl +towgs84=-148,136,90,0,0,0,0 +units=m +no_defs <> +# Campo Inchauspe / Argentina 6 +<22196> +proj=tmerc +lat_0=-90 +lon_0=-57 +k=1 +x_0=6500000 +y_0=0 +ellps=intl +towgs84=-148,136,90,0,0,0,0 +units=m +no_defs <> +# Campo Inchauspe / Argentina 7 +<22197> +proj=tmerc +lat_0=-90 +lon_0=-54 +k=1 +x_0=7500000 +y_0=0 +ellps=intl +towgs84=-148,136,90,0,0,0,0 +units=m +no_defs <> +# Cape / UTM zone 34S +<22234> +proj=utm +zone=34 +south +a=6378249.145 +b=6356514.966398753 +towgs84=-136,-108,-292,0,0,0,0 +units=m +no_defs <> +# Cape / UTM zone 35S +<22235> +proj=utm +zone=35 +south +a=6378249.145 +b=6356514.966398753 +towgs84=-136,-108,-292,0,0,0,0 +units=m +no_defs <> +# Cape / UTM zone 36S (deprecated) +<22236> +proj=utm +zone=36 +south +a=6378249.145 +b=6356514.966398753 +towgs84=-136,-108,-292,0,0,0,0 +units=m +no_defs <> +# Cape / Lo15 +<22275> +proj=tmerc +lat_0=0 +lon_0=15 +k=1 +x_0=0 +y_0=0 +axis=wsu +a=6378249.145 +b=6356514.966398753 +towgs84=-136,-108,-292,0,0,0,0 +units=m +no_defs <> +# Cape / Lo17 +<22277> +proj=tmerc +lat_0=0 +lon_0=17 +k=1 +x_0=0 +y_0=0 +axis=wsu +a=6378249.145 +b=6356514.966398753 +towgs84=-136,-108,-292,0,0,0,0 +units=m +no_defs <> +# Cape / Lo19 +<22279> +proj=tmerc +lat_0=0 +lon_0=19 +k=1 +x_0=0 +y_0=0 +axis=wsu +a=6378249.145 +b=6356514.966398753 +towgs84=-136,-108,-292,0,0,0,0 +units=m +no_defs <> +# Cape / Lo21 +<22281> +proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=0 +y_0=0 +axis=wsu +a=6378249.145 +b=6356514.966398753 +towgs84=-136,-108,-292,0,0,0,0 +units=m +no_defs <> +# Cape / Lo23 +<22283> +proj=tmerc +lat_0=0 +lon_0=23 +k=1 +x_0=0 +y_0=0 +axis=wsu +a=6378249.145 +b=6356514.966398753 +towgs84=-136,-108,-292,0,0,0,0 +units=m +no_defs <> +# Cape / Lo25 +<22285> +proj=tmerc +lat_0=0 +lon_0=25 +k=1 +x_0=0 +y_0=0 +axis=wsu +a=6378249.145 +b=6356514.966398753 +towgs84=-136,-108,-292,0,0,0,0 +units=m +no_defs <> +# Cape / Lo27 +<22287> +proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=0 +y_0=0 +axis=wsu +a=6378249.145 +b=6356514.966398753 +towgs84=-136,-108,-292,0,0,0,0 +units=m +no_defs <> +# Cape / Lo29 +<22289> +proj=tmerc +lat_0=0 +lon_0=29 +k=1 +x_0=0 +y_0=0 +axis=wsu +a=6378249.145 +b=6356514.966398753 +towgs84=-136,-108,-292,0,0,0,0 +units=m +no_defs <> +# Cape / Lo31 +<22291> +proj=tmerc +lat_0=0 +lon_0=31 +k=1 +x_0=0 +y_0=0 +axis=wsu +a=6378249.145 +b=6356514.966398753 +towgs84=-136,-108,-292,0,0,0,0 +units=m +no_defs <> +# Cape / Lo33 +<22293> +proj=tmerc +lat_0=0 +lon_0=33 +k=1 +x_0=0 +y_0=0 +axis=wsu +a=6378249.145 +b=6356514.966398753 +towgs84=-136,-108,-292,0,0,0,0 +units=m +no_defs <> +# Carthage (Paris) / Tunisia Mining Grid +# Unable to translate coordinate system EPSG:22300 into PROJ.4 format. +# +# Carthage / UTM zone 32N +<22332> +proj=utm +zone=32 +datum=carthage +units=m +no_defs <> +# Carthage / Nord Tunisie +<22391> +proj=lcc +lat_1=36 +lat_0=36 +lon_0=9.9 +k_0=0.999625544 +x_0=500000 +y_0=300000 +datum=carthage +units=m +no_defs <> +# Carthage / Sud Tunisie +<22392> +proj=lcc +lat_1=33.3 +lat_0=33.3 +lon_0=9.9 +k_0=0.999625769 +x_0=500000 +y_0=300000 +datum=carthage +units=m +no_defs <> +# Corrego Alegre 1970-72 / UTM zone 21S +<22521> +proj=utm +zone=21 +south +ellps=intl +towgs84=-205.57,168.77,-4.12,0,0,0,0 +units=m +no_defs <> +# Corrego Alegre 1970-72 / UTM zone 22S +<22522> +proj=utm +zone=22 +south +ellps=intl +towgs84=-205.57,168.77,-4.12,0,0,0,0 +units=m +no_defs <> +# Corrego Alegre 1970-72 / UTM zone 23S +<22523> +proj=utm +zone=23 +south +ellps=intl +towgs84=-205.57,168.77,-4.12,0,0,0,0 +units=m +no_defs <> +# Corrego Alegre 1970-72 / UTM zone 24S +<22524> +proj=utm +zone=24 +south +ellps=intl +towgs84=-205.57,168.77,-4.12,0,0,0,0 +units=m +no_defs <> +# Corrego Alegre 1970-72 / UTM zone 25S +<22525> +proj=utm +zone=25 +south +ellps=intl +towgs84=-205.57,168.77,-4.12,0,0,0,0 +units=m +no_defs <> +# Deir ez Zor / Levant Zone +<22700> +proj=lcc +lat_1=34.65 +lat_0=34.65 +lon_0=37.35 +k_0=0.9996256 +x_0=300000 +y_0=300000 +a=6378249.2 +b=6356515 +towgs84=-190.421,8.532,238.69,0,0,0,0 +units=m +no_defs <> +# Deir ez Zor / Syria Lambert +<22770> +proj=lcc +lat_1=34.65 +lat_0=34.65 +lon_0=37.35 +k_0=0.9996256 +x_0=300000 +y_0=300000 +a=6378249.2 +b=6356515 +towgs84=-190.421,8.532,238.69,0,0,0,0 +units=m +no_defs <> +# Deir ez Zor / Levant Stereographic +<22780> +proj=sterea +lat_0=34.2 +lon_0=39.15 +k=0.9995341 +x_0=0 +y_0=0 +a=6378249.2 +b=6356515 +towgs84=-190.421,8.532,238.69,0,0,0,0 +units=m +no_defs <> +# Douala / UTM zone 32N (deprecated) +<22832> +proj=utm +zone=32 +a=6378249.2 +b=6356515 +units=m +no_defs <> +# Egypt 1907 / Blue Belt +<22991> +proj=tmerc +lat_0=30 +lon_0=35 +k=1 +x_0=300000 +y_0=1100000 +ellps=helmert +towgs84=-130,110,-13,0,0,0,0 +units=m +no_defs <> +# Egypt 1907 / Red Belt +<22992> +proj=tmerc +lat_0=30 +lon_0=31 +k=1 +x_0=615000 +y_0=810000 +ellps=helmert +towgs84=-130,110,-13,0,0,0,0 +units=m +no_defs <> +# Egypt 1907 / Purple Belt +<22993> +proj=tmerc +lat_0=30 +lon_0=27 +k=1 +x_0=700000 +y_0=200000 +ellps=helmert +towgs84=-130,110,-13,0,0,0,0 +units=m +no_defs <> +# Egypt 1907 / Extended Purple Belt +<22994> +proj=tmerc +lat_0=30 +lon_0=27 +k=1 +x_0=700000 +y_0=1200000 +ellps=helmert +towgs84=-130,110,-13,0,0,0,0 +units=m +no_defs <> +# ED50 / UTM zone 28N +<23028> +proj=utm +zone=28 +ellps=intl +towgs84=-87,-98,-121,0,0,0,0 +units=m +no_defs <> +# ED50 / UTM zone 29N +<23029> +proj=utm +zone=29 +ellps=intl +towgs84=-87,-98,-121,0,0,0,0 +units=m +no_defs <> +# ED50 / UTM zone 30N +<23030> +proj=utm +zone=30 +ellps=intl +towgs84=-87,-98,-121,0,0,0,0 +units=m +no_defs <> +# ED50 / UTM zone 31N +<23031> +proj=utm +zone=31 +ellps=intl +towgs84=-87,-98,-121,0,0,0,0 +units=m +no_defs <> +# ED50 / UTM zone 32N +<23032> +proj=utm +zone=32 +ellps=intl +towgs84=-87,-98,-121,0,0,0,0 +units=m +no_defs <> +# ED50 / UTM zone 33N +<23033> +proj=utm +zone=33 +ellps=intl +towgs84=-87,-98,-121,0,0,0,0 +units=m +no_defs <> +# ED50 / UTM zone 34N +<23034> +proj=utm +zone=34 +ellps=intl +towgs84=-87,-98,-121,0,0,0,0 +units=m +no_defs <> +# ED50 / UTM zone 35N +<23035> +proj=utm +zone=35 +ellps=intl +towgs84=-87,-98,-121,0,0,0,0 +units=m +no_defs <> +# ED50 / UTM zone 36N +<23036> +proj=utm +zone=36 +ellps=intl +towgs84=-87,-98,-121,0,0,0,0 +units=m +no_defs <> +# ED50 / UTM zone 37N +<23037> +proj=utm +zone=37 +ellps=intl +towgs84=-87,-98,-121,0,0,0,0 +units=m +no_defs <> +# ED50 / UTM zone 38N +<23038> +proj=utm +zone=38 +ellps=intl +towgs84=-87,-98,-121,0,0,0,0 +units=m +no_defs <> +# ED50 / TM 0 N +<23090> +proj=tmerc +lat_0=0 +lon_0=0 +k=0.9996 +x_0=500000 +y_0=0 +ellps=intl +towgs84=-87,-98,-121,0,0,0,0 +units=m +no_defs <> +# ED50 / TM 5 NE +<23095> +proj=tmerc +lat_0=0 +lon_0=5 +k=0.9996 +x_0=500000 +y_0=0 +ellps=intl +towgs84=-87,-98,-121,0,0,0,0 +units=m +no_defs <> +# Fahud / UTM zone 39N +<23239> +proj=utm +zone=39 +ellps=clrk80 +towgs84=-333.102,-11.02,230.69,0,0,0.554,0.219 +units=m +no_defs <> +# Fahud / UTM zone 40N +<23240> +proj=utm +zone=40 +ellps=clrk80 +towgs84=-333.102,-11.02,230.69,0,0,0.554,0.219 +units=m +no_defs <> +# Garoua / UTM zone 33N (deprecated) +<23433> +proj=utm +zone=33 +a=6378249.2 +b=6356515 +units=m +no_defs <> +# HD72 / EOV +<23700> +proj=somerc +lat_0=47.14439372222222 +lon_0=19.04857177777778 +k_0=0.99993 +x_0=650000 +y_0=200000 +ellps=GRS67 +towgs84=52.17,-71.82,-14.9,0,0,0,0 +units=m +no_defs <> +# DGN95 / Indonesia TM-3 zone 46.2 +<23830> +proj=tmerc +lat_0=0 +lon_0=94.5 +k=0.9999 +x_0=200000 +y_0=1500000 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# DGN95 / Indonesia TM-3 zone 47.1 +<23831> +proj=tmerc +lat_0=0 +lon_0=97.5 +k=0.9999 +x_0=200000 +y_0=1500000 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# DGN95 / Indonesia TM-3 zone 47.2 +<23832> +proj=tmerc +lat_0=0 +lon_0=100.5 +k=0.9999 +x_0=200000 +y_0=1500000 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# DGN95 / Indonesia TM-3 zone 48.1 +<23833> +proj=tmerc +lat_0=0 +lon_0=103.5 +k=0.9999 +x_0=200000 +y_0=1500000 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# DGN95 / Indonesia TM-3 zone 48.2 +<23834> +proj=tmerc +lat_0=0 +lon_0=106.5 +k=0.9999 +x_0=200000 +y_0=1500000 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# DGN95 / Indonesia TM-3 zone 49.1 +<23835> +proj=tmerc +lat_0=0 +lon_0=109.5 +k=0.9999 +x_0=200000 +y_0=1500000 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# DGN95 / Indonesia TM-3 zone 49.2 +<23836> +proj=tmerc +lat_0=0 +lon_0=112.5 +k=0.9999 +x_0=200000 +y_0=1500000 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# DGN95 / Indonesia TM-3 zone 50.1 +<23837> +proj=tmerc +lat_0=0 +lon_0=115.5 +k=0.9999 +x_0=200000 +y_0=1500000 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# DGN95 / Indonesia TM-3 zone 50.2 +<23838> +proj=tmerc +lat_0=0 +lon_0=118.5 +k=0.9999 +x_0=200000 +y_0=1500000 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# DGN95 / Indonesia TM-3 zone 51.1 +<23839> +proj=tmerc +lat_0=0 +lon_0=121.5 +k=0.9999 +x_0=200000 +y_0=1500000 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# DGN95 / Indonesia TM-3 zone 51.2 +<23840> +proj=tmerc +lat_0=0 +lon_0=124.5 +k=0.9999 +x_0=200000 +y_0=1500000 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# DGN95 / Indonesia TM-3 zone 52.1 +<23841> +proj=tmerc +lat_0=0 +lon_0=127.5 +k=0.9999 +x_0=200000 +y_0=1500000 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# DGN95 / Indonesia TM-3 zone 52.2 +<23842> +proj=tmerc +lat_0=0 +lon_0=130.5 +k=0.9999 +x_0=200000 +y_0=1500000 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# DGN95 / Indonesia TM-3 zone 53.1 +<23843> +proj=tmerc +lat_0=0 +lon_0=133.5 +k=0.9999 +x_0=200000 +y_0=1500000 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# DGN95 / Indonesia TM-3 zone 53.2 +<23844> +proj=tmerc +lat_0=0 +lon_0=136.5 +k=0.9999 +x_0=200000 +y_0=1500000 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# DGN95 / Indonesia TM-3 zone 54.1 +<23845> +proj=tmerc +lat_0=0 +lon_0=139.5 +k=0.9999 +x_0=200000 +y_0=1500000 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ID74 / UTM zone 46N +<23846> +proj=utm +zone=46 +a=6378160 +b=6356774.50408554 +towgs84=-24,-15,5,0,0,0,0 +units=m +no_defs <> +# ID74 / UTM zone 47N +<23847> +proj=utm +zone=47 +a=6378160 +b=6356774.50408554 +towgs84=-24,-15,5,0,0,0,0 +units=m +no_defs <> +# ID74 / UTM zone 48N +<23848> +proj=utm +zone=48 +a=6378160 +b=6356774.50408554 +towgs84=-24,-15,5,0,0,0,0 +units=m +no_defs <> +# ID74 / UTM zone 49N +<23849> +proj=utm +zone=49 +a=6378160 +b=6356774.50408554 +towgs84=-24,-15,5,0,0,0,0 +units=m +no_defs <> +# ID74 / UTM zone 50N +<23850> +proj=utm +zone=50 +a=6378160 +b=6356774.50408554 +towgs84=-24,-15,5,0,0,0,0 +units=m +no_defs <> +# ID74 / UTM zone 51N +<23851> +proj=utm +zone=51 +a=6378160 +b=6356774.50408554 +towgs84=-24,-15,5,0,0,0,0 +units=m +no_defs <> +# ID74 / UTM zone 52N +<23852> +proj=utm +zone=52 +a=6378160 +b=6356774.50408554 +towgs84=-24,-15,5,0,0,0,0 +units=m +no_defs <> +# ID74 / UTM zone 53N (deprecated) +<23853> +proj=utm +zone=53 +a=6378160 +b=6356774.50408554 +towgs84=-24,-15,5,0,0,0,0 +units=m +no_defs <> +# DGN95 / UTM zone 46N +<23866> +proj=utm +zone=46 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# DGN95 / UTM zone 47N +<23867> +proj=utm +zone=47 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# DGN95 / UTM zone 48N +<23868> +proj=utm +zone=48 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# DGN95 / UTM zone 49N +<23869> +proj=utm +zone=49 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# DGN95 / UTM zone 50N +<23870> +proj=utm +zone=50 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# DGN95 / UTM zone 51N +<23871> +proj=utm +zone=51 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# DGN95 / UTM zone 52N +<23872> +proj=utm +zone=52 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# DGN95 / UTM zone 47S +<23877> +proj=utm +zone=47 +south +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# DGN95 / UTM zone 48S +<23878> +proj=utm +zone=48 +south +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# DGN95 / UTM zone 49S +<23879> +proj=utm +zone=49 +south +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# DGN95 / UTM zone 50S +<23880> +proj=utm +zone=50 +south +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# DGN95 / UTM zone 51S +<23881> +proj=utm +zone=51 +south +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# DGN95 / UTM zone 52S +<23882> +proj=utm +zone=52 +south +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# DGN95 / UTM zone 53S +<23883> +proj=utm +zone=53 +south +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# DGN95 / UTM zone 54S +<23884> +proj=utm +zone=54 +south +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ID74 / UTM zone 46S (deprecated) +<23886> +proj=utm +zone=46 +south +a=6378160 +b=6356774.50408554 +towgs84=-24,-15,5,0,0,0,0 +units=m +no_defs <> +# ID74 / UTM zone 47S +<23887> +proj=utm +zone=47 +south +a=6378160 +b=6356774.50408554 +towgs84=-24,-15,5,0,0,0,0 +units=m +no_defs <> +# ID74 / UTM zone 48S +<23888> +proj=utm +zone=48 +south +a=6378160 +b=6356774.50408554 +towgs84=-24,-15,5,0,0,0,0 +units=m +no_defs <> +# ID74 / UTM zone 49S +<23889> +proj=utm +zone=49 +south +a=6378160 +b=6356774.50408554 +towgs84=-24,-15,5,0,0,0,0 +units=m +no_defs <> +# ID74 / UTM zone 50S +<23890> +proj=utm +zone=50 +south +a=6378160 +b=6356774.50408554 +towgs84=-24,-15,5,0,0,0,0 +units=m +no_defs <> +# ID74 / UTM zone 51S +<23891> +proj=utm +zone=51 +south +a=6378160 +b=6356774.50408554 +towgs84=-24,-15,5,0,0,0,0 +units=m +no_defs <> +# ID74 / UTM zone 52S +<23892> +proj=utm +zone=52 +south +a=6378160 +b=6356774.50408554 +towgs84=-24,-15,5,0,0,0,0 +units=m +no_defs <> +# ID74 / UTM zone 53S +<23893> +proj=utm +zone=53 +south +a=6378160 +b=6356774.50408554 +towgs84=-24,-15,5,0,0,0,0 +units=m +no_defs <> +# ID74 / UTM zone 54S +<23894> +proj=utm +zone=54 +south +a=6378160 +b=6356774.50408554 +towgs84=-24,-15,5,0,0,0,0 +units=m +no_defs <> +# Indian 1954 / UTM zone 46N +<23946> +proj=utm +zone=46 +a=6377276.345 +b=6356075.41314024 +towgs84=217,823,299,0,0,0,0 +units=m +no_defs <> +# Indian 1954 / UTM zone 47N +<23947> +proj=utm +zone=47 +a=6377276.345 +b=6356075.41314024 +towgs84=217,823,299,0,0,0,0 +units=m +no_defs <> +# Indian 1954 / UTM zone 48N +<23948> +proj=utm +zone=48 +a=6377276.345 +b=6356075.41314024 +towgs84=217,823,299,0,0,0,0 +units=m +no_defs <> +# Indian 1975 / UTM zone 47N +<24047> +proj=utm +zone=47 +a=6377276.345 +b=6356075.41314024 +towgs84=210,814,289,0,0,0,0 +units=m +no_defs <> +# Indian 1975 / UTM zone 48N +<24048> +proj=utm +zone=48 +a=6377276.345 +b=6356075.41314024 +towgs84=210,814,289,0,0,0,0 +units=m +no_defs <> +# Jamaica 1875 / Jamaica (Old Grid) +<24100> +proj=lcc +lat_1=18 +lat_0=18 +lon_0=-77 +k_0=1 +x_0=167638.49597 +y_0=121918.90616 +a=6378249.144808011 +b=6356514.966204134 +to_meter=0.3047972654 +no_defs <> +# JAD69 / Jamaica National Grid +<24200> +proj=lcc +lat_1=18 +lat_0=18 +lon_0=-77 +k_0=1 +x_0=250000 +y_0=150000 +ellps=clrk66 +towgs84=70,207,389.5,0,0,0,0 +units=m +no_defs <> +# Kalianpur 1937 / UTM zone 45N +<24305> +proj=utm +zone=45 +a=6377276.345 +b=6356075.41314024 +towgs84=214,804,268,0,0,0,0 +units=m +no_defs <> +# Kalianpur 1937 / UTM zone 46N +<24306> +proj=utm +zone=46 +a=6377276.345 +b=6356075.41314024 +towgs84=214,804,268,0,0,0,0 +units=m +no_defs <> +# Kalianpur 1962 / UTM zone 41N +<24311> +proj=utm +zone=41 +a=6377301.243 +b=6356100.230165384 +towgs84=283,682,231,0,0,0,0 +units=m +no_defs <> +# Kalianpur 1962 / UTM zone 42N +<24312> +proj=utm +zone=42 +a=6377301.243 +b=6356100.230165384 +towgs84=283,682,231,0,0,0,0 +units=m +no_defs <> +# Kalianpur 1962 / UTM zone 43N +<24313> +proj=utm +zone=43 +a=6377301.243 +b=6356100.230165384 +towgs84=283,682,231,0,0,0,0 +units=m +no_defs <> +# Kalianpur 1975 / UTM zone 42N +<24342> +proj=utm +zone=42 +a=6377299.151 +b=6356098.145120132 +towgs84=295,736,257,0,0,0,0 +units=m +no_defs <> +# Kalianpur 1975 / UTM zone 43N +<24343> +proj=utm +zone=43 +a=6377299.151 +b=6356098.145120132 +towgs84=295,736,257,0,0,0,0 +units=m +no_defs <> +# Kalianpur 1975 / UTM zone 44N +<24344> +proj=utm +zone=44 +a=6377299.151 +b=6356098.145120132 +towgs84=295,736,257,0,0,0,0 +units=m +no_defs <> +# Kalianpur 1975 / UTM zone 45N +<24345> +proj=utm +zone=45 +a=6377299.151 +b=6356098.145120132 +towgs84=295,736,257,0,0,0,0 +units=m +no_defs <> +# Kalianpur 1975 / UTM zone 46N +<24346> +proj=utm +zone=46 +a=6377299.151 +b=6356098.145120132 +towgs84=295,736,257,0,0,0,0 +units=m +no_defs <> +# Kalianpur 1975 / UTM zone 47N +<24347> +proj=utm +zone=47 +a=6377299.151 +b=6356098.145120132 +towgs84=295,736,257,0,0,0,0 +units=m +no_defs <> +# Kalianpur 1880 / India zone 0 +<24370> +proj=lcc +lat_1=39.5 +lat_0=39.5 +lon_0=68 +k_0=0.99846154 +x_0=2153865.73916853 +y_0=2368292.194628102 +a=6377299.36559538 +b=6356098.359005156 +to_meter=0.9143985307444408 +no_defs <> +# Kalianpur 1880 / India zone I +<24371> +proj=lcc +lat_1=32.5 +lat_0=32.5 +lon_0=68 +k_0=0.99878641 +x_0=2743195.592233322 +y_0=914398.5307444407 +a=6377299.36559538 +b=6356098.359005156 +to_meter=0.9143985307444408 +no_defs <> +# Kalianpur 1880 / India zone IIa +<24372> +proj=lcc +lat_1=26 +lat_0=26 +lon_0=74 +k_0=0.99878641 +x_0=2743195.592233322 +y_0=914398.5307444407 +a=6377299.36559538 +b=6356098.359005156 +to_meter=0.9143985307444408 +no_defs <> +# Kalianpur 1880 / India zone IIIa +<24373> +proj=lcc +lat_1=19 +lat_0=19 +lon_0=80 +k_0=0.99878641 +x_0=2743195.592233322 +y_0=914398.5307444407 +a=6377299.36559538 +b=6356098.359005156 +to_meter=0.9143985307444408 +no_defs <> +# Kalianpur 1880 / India zone IVa +<24374> +proj=lcc +lat_1=12 +lat_0=12 +lon_0=80 +k_0=0.99878641 +x_0=2743195.592233322 +y_0=914398.5307444407 +a=6377299.36559538 +b=6356098.359005156 +to_meter=0.9143985307444408 +no_defs <> +# Kalianpur 1937 / India zone IIb +<24375> +proj=lcc +lat_1=26 +lat_0=26 +lon_0=90 +k_0=0.99878641 +x_0=2743185.69 +y_0=914395.23 +a=6377276.345 +b=6356075.41314024 +towgs84=214,804,268,0,0,0,0 +units=m +no_defs <> +# Kalianpur 1962 / India zone I +<24376> +proj=lcc +lat_1=32.5 +lat_0=32.5 +lon_0=68 +k_0=0.99878641 +x_0=2743196.4 +y_0=914398.8 +a=6377301.243 +b=6356100.230165384 +towgs84=283,682,231,0,0,0,0 +units=m +no_defs <> +# Kalianpur 1962 / India zone IIa +<24377> +proj=lcc +lat_1=26 +lat_0=26 +lon_0=74 +k_0=0.99878641 +x_0=2743196.4 +y_0=914398.8 +a=6377301.243 +b=6356100.230165384 +towgs84=283,682,231,0,0,0,0 +units=m +no_defs <> +# Kalianpur 1975 / India zone I +<24378> +proj=lcc +lat_1=32.5 +lat_0=32.5 +lon_0=68 +k_0=0.99878641 +x_0=2743195.5 +y_0=914398.5 +a=6377299.151 +b=6356098.145120132 +towgs84=295,736,257,0,0,0,0 +units=m +no_defs <> +# Kalianpur 1975 / India zone IIa +<24379> +proj=lcc +lat_1=26 +lat_0=26 +lon_0=74 +k_0=0.99878641 +x_0=2743195.5 +y_0=914398.5 +a=6377299.151 +b=6356098.145120132 +towgs84=295,736,257,0,0,0,0 +units=m +no_defs <> +# Kalianpur 1975 / India zone IIb +<24380> +proj=lcc +lat_1=26 +lat_0=26 +lon_0=90 +k_0=0.99878641 +x_0=2743195.5 +y_0=914398.5 +a=6377299.151 +b=6356098.145120132 +towgs84=295,736,257,0,0,0,0 +units=m +no_defs <> +# Kalianpur 1975 / India zone IIIa +<24381> +proj=lcc +lat_1=19 +lat_0=19 +lon_0=80 +k_0=0.99878641 +x_0=2743195.5 +y_0=914398.5 +a=6377299.151 +b=6356098.145120132 +towgs84=295,736,257,0,0,0,0 +units=m +no_defs <> +# Kalianpur 1880 / India zone IIb +<24382> +proj=lcc +lat_1=26 +lat_0=26 +lon_0=90 +k_0=0.99878641 +x_0=2743195.592233322 +y_0=914398.5307444407 +a=6377299.36559538 +b=6356098.359005156 +to_meter=0.9143985307444408 +no_defs <> +# Kalianpur 1975 / India zone IVa +<24383> +proj=lcc +lat_1=12 +lat_0=12 +lon_0=80 +k_0=0.99878641 +x_0=2743195.5 +y_0=914398.5 +a=6377299.151 +b=6356098.145120132 +towgs84=295,736,257,0,0,0,0 +units=m +no_defs <> +# Kertau 1968 / Singapore Grid +<24500> +proj=cass +lat_0=1.287646666666667 +lon_0=103.8530022222222 +x_0=30000 +y_0=30000 +a=6377304.063 +b=6356103.038993155 +towgs84=-11,851,5,0,0,0,0 +units=m +no_defs <> +# Kertau 1968 / UTM zone 47N +<24547> +proj=utm +zone=47 +a=6377304.063 +b=6356103.038993155 +towgs84=-11,851,5,0,0,0,0 +units=m +no_defs <> +# Kertau 1968 / UTM zone 48N +<24548> +proj=utm +zone=48 +a=6377304.063 +b=6356103.038993155 +towgs84=-11,851,5,0,0,0,0 +units=m +no_defs <> +# Kertau / R.S.O. Malaya (ch) (deprecated) +<24571> +proj=omerc +lat_0=4 +lonc=102.25 +alpha=323.0257905 +k=0.99984 +x_0=804671.2997750348 +y_0=0 +no_uoff +gamma=323.1301023611111 +a=6377304.063 +b=6356103.038993155 +towgs84=-11,851,5,0,0,0,0 +to_meter=20.11678249437587 +no_defs <> +# KOC Lambert +<24600> +proj=lcc +lat_1=32.5 +lat_0=32.5 +lon_0=45 +k_0=0.9987864078000001 +x_0=1500000 +y_0=1166200 +ellps=clrk80 +towgs84=-294.7,-200.1,525.5,0,0,0,0 +units=m +no_defs <> +# La Canoa / UTM zone 18N +<24718> +proj=utm +zone=18 +ellps=intl +towgs84=-273.5,110.6,-357.9,0,0,0,0 +units=m +no_defs <> +# La Canoa / UTM zone 19N +<24719> +proj=utm +zone=19 +ellps=intl +towgs84=-273.5,110.6,-357.9,0,0,0,0 +units=m +no_defs <> +# La Canoa / UTM zone 20N +<24720> +proj=utm +zone=20 +ellps=intl +towgs84=-273.5,110.6,-357.9,0,0,0,0 +units=m +no_defs <> +# PSAD56 / UTM zone 17N +<24817> +proj=utm +zone=17 +ellps=intl +towgs84=-288,175,-376,0,0,0,0 +units=m +no_defs <> +# PSAD56 / UTM zone 18N +<24818> +proj=utm +zone=18 +ellps=intl +towgs84=-288,175,-376,0,0,0,0 +units=m +no_defs <> +# PSAD56 / UTM zone 19N +<24819> +proj=utm +zone=19 +ellps=intl +towgs84=-288,175,-376,0,0,0,0 +units=m +no_defs <> +# PSAD56 / UTM zone 20N +<24820> +proj=utm +zone=20 +ellps=intl +towgs84=-288,175,-376,0,0,0,0 +units=m +no_defs <> +# PSAD56 / UTM zone 21N +<24821> +proj=utm +zone=21 +ellps=intl +towgs84=-288,175,-376,0,0,0,0 +units=m +no_defs <> +# PSAD56 / UTM zone 17S +<24877> +proj=utm +zone=17 +south +ellps=intl +towgs84=-288,175,-376,0,0,0,0 +units=m +no_defs <> +# PSAD56 / UTM zone 18S +<24878> +proj=utm +zone=18 +south +ellps=intl +towgs84=-288,175,-376,0,0,0,0 +units=m +no_defs <> +# PSAD56 / UTM zone 19S +<24879> +proj=utm +zone=19 +south +ellps=intl +towgs84=-288,175,-376,0,0,0,0 +units=m +no_defs <> +# PSAD56 / UTM zone 20S +<24880> +proj=utm +zone=20 +south +ellps=intl +towgs84=-288,175,-376,0,0,0,0 +units=m +no_defs <> +# PSAD56 / UTM zone 21S +<24881> +proj=utm +zone=21 +south +ellps=intl +towgs84=-288,175,-376,0,0,0,0 +units=m +no_defs <> +# PSAD56 / UTM zone 22S +<24882> +proj=utm +zone=22 +south +ellps=intl +towgs84=-288,175,-376,0,0,0,0 +units=m +no_defs <> +# PSAD56 / Peru west zone +<24891> +proj=tmerc +lat_0=-6 +lon_0=-80.5 +k=0.99983008 +x_0=222000 +y_0=1426834.743 +ellps=intl +towgs84=-288,175,-376,0,0,0,0 +units=m +no_defs <> +# PSAD56 / Peru central zone +<24892> +proj=tmerc +lat_0=-9.5 +lon_0=-76 +k=0.99932994 +x_0=720000 +y_0=1039979.159 +ellps=intl +towgs84=-288,175,-376,0,0,0,0 +units=m +no_defs <> +# PSAD56 / Peru east zone +<24893> +proj=tmerc +lat_0=-9.5 +lon_0=-70.5 +k=0.99952992 +x_0=1324000 +y_0=1040084.558 +ellps=intl +towgs84=-288,175,-376,0,0,0,0 +units=m +no_defs <> +# Leigon / Ghana Metre Grid +<25000> +proj=tmerc +lat_0=4.666666666666667 +lon_0=-1 +k=0.99975 +x_0=274319.51 +y_0=0 +ellps=clrk80 +towgs84=-130,29,364,0,0,0,0 +units=m +no_defs <> +# Lome / UTM zone 31N +<25231> +proj=utm +zone=31 +a=6378249.2 +b=6356515 +units=m +no_defs <> +# Luzon 1911 / Philippines zone I +<25391> +proj=tmerc +lat_0=0 +lon_0=117 +k=0.99995 +x_0=500000 +y_0=0 +ellps=clrk66 +towgs84=-133,-77,-51,0,0,0,0 +units=m +no_defs <> +# Luzon 1911 / Philippines zone II +<25392> +proj=tmerc +lat_0=0 +lon_0=119 +k=0.99995 +x_0=500000 +y_0=0 +ellps=clrk66 +towgs84=-133,-77,-51,0,0,0,0 +units=m +no_defs <> +# Luzon 1911 / Philippines zone III +<25393> +proj=tmerc +lat_0=0 +lon_0=121 +k=0.99995 +x_0=500000 +y_0=0 +ellps=clrk66 +towgs84=-133,-77,-51,0,0,0,0 +units=m +no_defs <> +# Luzon 1911 / Philippines zone IV +<25394> +proj=tmerc +lat_0=0 +lon_0=123 +k=0.99995 +x_0=500000 +y_0=0 +ellps=clrk66 +towgs84=-133,-77,-51,0,0,0,0 +units=m +no_defs <> +# Luzon 1911 / Philippines zone V +<25395> +proj=tmerc +lat_0=0 +lon_0=125 +k=0.99995 +x_0=500000 +y_0=0 +ellps=clrk66 +towgs84=-133,-77,-51,0,0,0,0 +units=m +no_defs <> +# Makassar (Jakarta) / NEIEZ (deprecated) +<25700> +proj=merc +lon_0=110 +k=0.997 +x_0=3900000 +y_0=900000 +ellps=bessel +towgs84=-587.8,519.75,145.76,0,0,0,0 +pm=jakarta +units=m +no_defs <> +# ETRS89 / UTM zone 28N +<25828> +proj=utm +zone=28 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / UTM zone 29N +<25829> +proj=utm +zone=29 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / UTM zone 30N +<25830> +proj=utm +zone=30 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / UTM zone 31N +<25831> +proj=utm +zone=31 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / UTM zone 32N +<25832> +proj=utm +zone=32 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / UTM zone 33N +<25833> +proj=utm +zone=33 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / UTM zone 34N +<25834> +proj=utm +zone=34 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / UTM zone 35N +<25835> +proj=utm +zone=35 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / UTM zone 36N +<25836> +proj=utm +zone=36 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / UTM zone 37N +<25837> +proj=utm +zone=37 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / UTM zone 38N (deprecated) +<25838> +proj=utm +zone=38 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / TM Baltic93 +<25884> +proj=tmerc +lat_0=0 +lon_0=24 +k=0.9996 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Malongo 1987 / UTM zone 32S +<25932> +proj=utm +zone=32 +south +ellps=intl +towgs84=-254.1,-5.36,-100.29,0,0,0,0 +units=m +no_defs <> +# Merchich / Nord Maroc +<26191> +proj=lcc +lat_1=33.3 +lat_0=33.3 +lon_0=-5.4 +k_0=0.999625769 +x_0=500000 +y_0=300000 +a=6378249.2 +b=6356515 +towgs84=31,146,47,0,0,0,0 +units=m +no_defs <> +# Merchich / Sud Maroc +<26192> +proj=lcc +lat_1=29.7 +lat_0=29.7 +lon_0=-5.4 +k_0=0.9996155960000001 +x_0=500000 +y_0=300000 +a=6378249.2 +b=6356515 +towgs84=31,146,47,0,0,0,0 +units=m +no_defs <> +# Merchich / Sahara (deprecated) +<26193> +proj=lcc +lat_1=26.1 +lat_0=26.1 +lon_0=-5.4 +k_0=0.9996 +x_0=1200000 +y_0=400000 +a=6378249.2 +b=6356515 +towgs84=31,146,47,0,0,0,0 +units=m +no_defs <> +# Merchich / Sahara Nord +<26194> +proj=lcc +lat_1=26.1 +lat_0=26.1 +lon_0=-5.4 +k_0=0.999616304 +x_0=1200000 +y_0=400000 +a=6378249.2 +b=6356515 +towgs84=31,146,47,0,0,0,0 +units=m +no_defs <> +# Merchich / Sahara Sud +<26195> +proj=lcc +lat_1=22.5 +lat_0=22.5 +lon_0=-5.4 +k_0=0.999616437 +x_0=1500000 +y_0=400000 +a=6378249.2 +b=6356515 +towgs84=31,146,47,0,0,0,0 +units=m +no_defs <> +# Massawa / UTM zone 37N +<26237> +proj=utm +zone=37 +ellps=bessel +towgs84=639,405,60,0,0,0,0 +units=m +no_defs <> +# Minna / UTM zone 31N +<26331> +proj=utm +zone=31 +ellps=clrk80 +towgs84=-92,-93,122,0,0,0,0 +units=m +no_defs <> +# Minna / UTM zone 32N +<26332> +proj=utm +zone=32 +ellps=clrk80 +towgs84=-92,-93,122,0,0,0,0 +units=m +no_defs <> +# Minna / Nigeria West Belt +<26391> +proj=tmerc +lat_0=4 +lon_0=4.5 +k=0.99975 +x_0=230738.26 +y_0=0 +ellps=clrk80 +towgs84=-92,-93,122,0,0,0,0 +units=m +no_defs <> +# Minna / Nigeria Mid Belt +<26392> +proj=tmerc +lat_0=4 +lon_0=8.5 +k=0.99975 +x_0=670553.98 +y_0=0 +ellps=clrk80 +towgs84=-92,-93,122,0,0,0,0 +units=m +no_defs <> +# Minna / Nigeria East Belt +<26393> +proj=tmerc +lat_0=4 +lon_0=12.5 +k=0.99975 +x_0=1110369.7 +y_0=0 +ellps=clrk80 +towgs84=-92,-93,122,0,0,0,0 +units=m +no_defs <> +# Mhast / UTM zone 32S (deprecated) +<26432> +proj=utm +zone=32 +south +ellps=intl +towgs84=-252.95,-4.11,-96.38,0,0,0,0 +units=m +no_defs <> +# Monte Mario (Rome) / Italy zone 1 (deprecated) +<26591> +proj=tmerc +lat_0=0 +lon_0=-3.45233333333333 +k=0.9996 +x_0=1500000 +y_0=0 +ellps=intl +towgs84=-104.1,-49.1,-9.9,0.971,-2.917,0.714,-11.68 +pm=rome +units=m +no_defs <> +# Monte Mario (Rome) / Italy zone 2 (deprecated) +<26592> +proj=tmerc +lat_0=0 +lon_0=2.54766666666666 +k=0.9996 +x_0=2520000 +y_0=0 +ellps=intl +towgs84=-104.1,-49.1,-9.9,0.971,-2.917,0.714,-11.68 +pm=rome +units=m +no_defs <> +# M'poraloko / UTM zone 32N +<26632> +proj=utm +zone=32 +a=6378249.2 +b=6356515 +towgs84=-74,-130,42,0,0,0,0 +units=m +no_defs <> +# M'poraloko / UTM zone 32S +<26692> +proj=utm +zone=32 +south +a=6378249.2 +b=6356515 +towgs84=-74,-130,42,0,0,0,0 +units=m +no_defs <> +# NAD27 / UTM zone 1N +<26701> +proj=utm +zone=1 +datum=NAD27 +units=m +no_defs <> +# NAD27 / UTM zone 2N +<26702> +proj=utm +zone=2 +datum=NAD27 +units=m +no_defs <> +# NAD27 / UTM zone 3N +<26703> +proj=utm +zone=3 +datum=NAD27 +units=m +no_defs <> +# NAD27 / UTM zone 4N +<26704> +proj=utm +zone=4 +datum=NAD27 +units=m +no_defs <> +# NAD27 / UTM zone 5N +<26705> +proj=utm +zone=5 +datum=NAD27 +units=m +no_defs <> +# NAD27 / UTM zone 6N +<26706> +proj=utm +zone=6 +datum=NAD27 +units=m +no_defs <> +# NAD27 / UTM zone 7N +<26707> +proj=utm +zone=7 +datum=NAD27 +units=m +no_defs <> +# NAD27 / UTM zone 8N +<26708> +proj=utm +zone=8 +datum=NAD27 +units=m +no_defs <> +# NAD27 / UTM zone 9N +<26709> +proj=utm +zone=9 +datum=NAD27 +units=m +no_defs <> +# NAD27 / UTM zone 10N +<26710> +proj=utm +zone=10 +datum=NAD27 +units=m +no_defs <> +# NAD27 / UTM zone 11N +<26711> +proj=utm +zone=11 +datum=NAD27 +units=m +no_defs <> +# NAD27 / UTM zone 12N +<26712> +proj=utm +zone=12 +datum=NAD27 +units=m +no_defs <> +# NAD27 / UTM zone 13N +<26713> +proj=utm +zone=13 +datum=NAD27 +units=m +no_defs <> +# NAD27 / UTM zone 14N +<26714> +proj=utm +zone=14 +datum=NAD27 +units=m +no_defs <> +# NAD27 / UTM zone 15N +<26715> +proj=utm +zone=15 +datum=NAD27 +units=m +no_defs <> +# NAD27 / UTM zone 16N +<26716> +proj=utm +zone=16 +datum=NAD27 +units=m +no_defs <> +# NAD27 / UTM zone 17N +<26717> +proj=utm +zone=17 +datum=NAD27 +units=m +no_defs <> +# NAD27 / UTM zone 18N +<26718> +proj=utm +zone=18 +datum=NAD27 +units=m +no_defs <> +# NAD27 / UTM zone 19N +<26719> +proj=utm +zone=19 +datum=NAD27 +units=m +no_defs <> +# NAD27 / UTM zone 20N +<26720> +proj=utm +zone=20 +datum=NAD27 +units=m +no_defs <> +# NAD27 / UTM zone 21N +<26721> +proj=utm +zone=21 +datum=NAD27 +units=m +no_defs <> +# NAD27 / UTM zone 22N +<26722> +proj=utm +zone=22 +datum=NAD27 +units=m +no_defs <> +# NAD27 / Alabama East +<26729> +proj=tmerc +lat_0=30.5 +lon_0=-85.83333333333333 +k=0.99996 +x_0=152400.3048006096 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Alabama West +<26730> +proj=tmerc +lat_0=30 +lon_0=-87.5 +k=0.999933333 +x_0=152400.3048006096 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Alaska zone 1 +<26731> +proj=omerc +lat_0=57 +lonc=-133.6666666666667 +alpha=323.1301023611111 +k=0.9999 +x_0=5000000.001016002 +y_0=-5000000.001016002 +no_uoff +gamma=323.1301023611111 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Alaska zone 2 +<26732> +proj=tmerc +lat_0=54 +lon_0=-142 +k=0.9999 +x_0=152400.3048006096 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Alaska zone 3 +<26733> +proj=tmerc +lat_0=54 +lon_0=-146 +k=0.9999 +x_0=152400.3048006096 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Alaska zone 4 +<26734> +proj=tmerc +lat_0=54 +lon_0=-150 +k=0.9999 +x_0=152400.3048006096 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Alaska zone 5 +<26735> +proj=tmerc +lat_0=54 +lon_0=-154 +k=0.9999 +x_0=152400.3048006096 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Alaska zone 6 +<26736> +proj=tmerc +lat_0=54 +lon_0=-158 +k=0.9999 +x_0=152400.3048006096 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Alaska zone 7 +<26737> +proj=tmerc +lat_0=54 +lon_0=-162 +k=0.9999 +x_0=213360.4267208534 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Alaska zone 8 +<26738> +proj=tmerc +lat_0=54 +lon_0=-166 +k=0.9999 +x_0=152400.3048006096 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Alaska zone 9 +<26739> +proj=tmerc +lat_0=54 +lon_0=-170 +k=0.9999 +x_0=182880.3657607315 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Alaska zone 10 +<26740> +proj=lcc +lat_1=53.83333333333334 +lat_2=51.83333333333334 +lat_0=51 +lon_0=-176 +x_0=914401.8288036576 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / California zone I +<26741> +proj=lcc +lat_1=41.66666666666666 +lat_2=40 +lat_0=39.33333333333334 +lon_0=-122 +x_0=609601.2192024384 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / California zone II +<26742> +proj=lcc +lat_1=39.83333333333334 +lat_2=38.33333333333334 +lat_0=37.66666666666666 +lon_0=-122 +x_0=609601.2192024384 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / California zone III +<26743> +proj=lcc +lat_1=38.43333333333333 +lat_2=37.06666666666667 +lat_0=36.5 +lon_0=-120.5 +x_0=609601.2192024384 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / California zone IV +<26744> +proj=lcc +lat_1=37.25 +lat_2=36 +lat_0=35.33333333333334 +lon_0=-119 +x_0=609601.2192024384 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / California zone V +<26745> +proj=lcc +lat_1=35.46666666666667 +lat_2=34.03333333333333 +lat_0=33.5 +lon_0=-118 +x_0=609601.2192024384 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / California zone VI +<26746> +proj=lcc +lat_1=33.88333333333333 +lat_2=32.78333333333333 +lat_0=32.16666666666666 +lon_0=-116.25 +x_0=609601.2192024384 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / California zone VII (deprecated) +<26747> +proj=lcc +lat_1=34.41666666666666 +lat_2=33.86666666666667 +lat_0=34.13333333333333 +lon_0=-118.3333333333333 +x_0=1276106.450596901 +y_0=127079.524511049 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Arizona East +<26748> +proj=tmerc +lat_0=31 +lon_0=-110.1666666666667 +k=0.9999 +x_0=152400.3048006096 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Arizona Central +<26749> +proj=tmerc +lat_0=31 +lon_0=-111.9166666666667 +k=0.9999 +x_0=152400.3048006096 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Arizona West +<26750> +proj=tmerc +lat_0=31 +lon_0=-113.75 +k=0.999933333 +x_0=152400.3048006096 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Arkansas North +<26751> +proj=lcc +lat_1=36.23333333333333 +lat_2=34.93333333333333 +lat_0=34.33333333333334 +lon_0=-92 +x_0=609601.2192024384 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Arkansas South +<26752> +proj=lcc +lat_1=34.76666666666667 +lat_2=33.3 +lat_0=32.66666666666666 +lon_0=-92 +x_0=609601.2192024384 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Colorado North +<26753> +proj=lcc +lat_1=39.71666666666667 +lat_2=40.78333333333333 +lat_0=39.33333333333334 +lon_0=-105.5 +x_0=609601.2192024384 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Colorado Central +<26754> +proj=lcc +lat_1=39.75 +lat_2=38.45 +lat_0=37.83333333333334 +lon_0=-105.5 +x_0=609601.2192024384 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Colorado South +<26755> +proj=lcc +lat_1=38.43333333333333 +lat_2=37.23333333333333 +lat_0=36.66666666666666 +lon_0=-105.5 +x_0=609601.2192024384 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Connecticut +<26756> +proj=lcc +lat_1=41.86666666666667 +lat_2=41.2 +lat_0=40.83333333333334 +lon_0=-72.75 +x_0=182880.3657607315 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Delaware +<26757> +proj=tmerc +lat_0=38 +lon_0=-75.41666666666667 +k=0.999995 +x_0=152400.3048006096 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Florida East +<26758> +proj=tmerc +lat_0=24.33333333333333 +lon_0=-81 +k=0.999941177 +x_0=152400.3048006096 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Florida West +<26759> +proj=tmerc +lat_0=24.33333333333333 +lon_0=-82 +k=0.999941177 +x_0=152400.3048006096 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Florida North +<26760> +proj=lcc +lat_1=30.75 +lat_2=29.58333333333333 +lat_0=29 +lon_0=-84.5 +x_0=609601.2192024384 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Georgia East +<26766> +proj=tmerc +lat_0=30 +lon_0=-82.16666666666667 +k=0.9999 +x_0=152400.3048006096 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Georgia West +<26767> +proj=tmerc +lat_0=30 +lon_0=-84.16666666666667 +k=0.9999 +x_0=152400.3048006096 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Idaho East +<26768> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-112.1666666666667 +k=0.9999473679999999 +x_0=152400.3048006096 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Idaho Central +<26769> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-114 +k=0.9999473679999999 +x_0=152400.3048006096 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Idaho West +<26770> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-115.75 +k=0.999933333 +x_0=152400.3048006096 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Illinois East +<26771> +proj=tmerc +lat_0=36.66666666666666 +lon_0=-88.33333333333333 +k=0.9999749999999999 +x_0=152400.3048006096 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Illinois West +<26772> +proj=tmerc +lat_0=36.66666666666666 +lon_0=-90.16666666666667 +k=0.999941177 +x_0=152400.3048006096 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Indiana East +<26773> +proj=tmerc +lat_0=37.5 +lon_0=-85.66666666666667 +k=0.999966667 +x_0=152400.3048006096 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Indiana West +<26774> +proj=tmerc +lat_0=37.5 +lon_0=-87.08333333333333 +k=0.999966667 +x_0=152400.3048006096 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Iowa North +<26775> +proj=lcc +lat_1=43.26666666666667 +lat_2=42.06666666666667 +lat_0=41.5 +lon_0=-93.5 +x_0=609601.2192024384 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Iowa South +<26776> +proj=lcc +lat_1=41.78333333333333 +lat_2=40.61666666666667 +lat_0=40 +lon_0=-93.5 +x_0=609601.2192024384 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Kansas North +<26777> +proj=lcc +lat_1=39.78333333333333 +lat_2=38.71666666666667 +lat_0=38.33333333333334 +lon_0=-98 +x_0=609601.2192024384 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Kansas South +<26778> +proj=lcc +lat_1=38.56666666666667 +lat_2=37.26666666666667 +lat_0=36.66666666666666 +lon_0=-98.5 +x_0=609601.2192024384 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Kentucky North +<26779> +proj=lcc +lat_1=37.96666666666667 +lat_2=38.96666666666667 +lat_0=37.5 +lon_0=-84.25 +x_0=609601.2192024384 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Kentucky South +<26780> +proj=lcc +lat_1=36.73333333333333 +lat_2=37.93333333333333 +lat_0=36.33333333333334 +lon_0=-85.75 +x_0=609601.2192024384 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Louisiana North +<26781> +proj=lcc +lat_1=31.16666666666667 +lat_2=32.66666666666666 +lat_0=30.66666666666667 +lon_0=-92.5 +x_0=609601.2192024384 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Louisiana South +<26782> +proj=lcc +lat_1=29.3 +lat_2=30.7 +lat_0=28.66666666666667 +lon_0=-91.33333333333333 +x_0=609601.2192024384 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Maine East +<26783> +proj=tmerc +lat_0=43.83333333333334 +lon_0=-68.5 +k=0.9999 +x_0=152400.3048006096 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Maine West +<26784> +proj=tmerc +lat_0=42.83333333333334 +lon_0=-70.16666666666667 +k=0.999966667 +x_0=152400.3048006096 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Maryland +<26785> +proj=lcc +lat_1=38.3 +lat_2=39.45 +lat_0=37.83333333333334 +lon_0=-77 +x_0=243840.4876809754 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Massachusetts Mainland +<26786> +proj=lcc +lat_1=41.71666666666667 +lat_2=42.68333333333333 +lat_0=41 +lon_0=-71.5 +x_0=182880.3657607315 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Massachusetts Island +<26787> +proj=lcc +lat_1=41.28333333333333 +lat_2=41.48333333333333 +lat_0=41 +lon_0=-70.5 +x_0=60960.12192024384 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Minnesota North +<26791> +proj=lcc +lat_1=47.03333333333333 +lat_2=48.63333333333333 +lat_0=46.5 +lon_0=-93.09999999999999 +x_0=609601.2192024384 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Minnesota Central +<26792> +proj=lcc +lat_1=45.61666666666667 +lat_2=47.05 +lat_0=45 +lon_0=-94.25 +x_0=609601.2192024384 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Minnesota South +<26793> +proj=lcc +lat_1=43.78333333333333 +lat_2=45.21666666666667 +lat_0=43 +lon_0=-94 +x_0=609601.2192024384 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Mississippi East +<26794> +proj=tmerc +lat_0=29.66666666666667 +lon_0=-88.83333333333333 +k=0.99996 +x_0=152400.3048006096 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Mississippi West +<26795> +proj=tmerc +lat_0=30.5 +lon_0=-90.33333333333333 +k=0.999941177 +x_0=152400.3048006096 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Missouri East +<26796> +proj=tmerc +lat_0=35.83333333333334 +lon_0=-90.5 +k=0.999933333 +x_0=152400.3048006096 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Missouri Central +<26797> +proj=tmerc +lat_0=35.83333333333334 +lon_0=-92.5 +k=0.999933333 +x_0=152400.3048006096 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Missouri West +<26798> +proj=tmerc +lat_0=36.16666666666666 +lon_0=-94.5 +k=0.999941177 +x_0=152400.3048006096 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / California zone VII +<26799> +proj=lcc +lat_1=34.41666666666666 +lat_2=33.86666666666667 +lat_0=34.13333333333333 +lon_0=-118.3333333333333 +x_0=1276106.450596901 +y_0=1268253.006858014 +datum=NAD27 +units=us-ft +no_defs <> +# NAD Michigan / Michigan East (deprecated) +<26801> +proj=tmerc +lat_0=41.5 +lon_0=-83.66666666666667 +k=0.999942857 +x_0=152400.3048006096 +y_0=0 +a=6378450.047548896 +b=6356826.621488444 +units=us-ft +no_defs <> +# NAD Michigan / Michigan Old Central (deprecated) +<26802> +proj=tmerc +lat_0=41.5 +lon_0=-85.75 +k=0.999909091 +x_0=152400.3048006096 +y_0=0 +a=6378450.047548896 +b=6356826.621488444 +units=us-ft +no_defs <> +# NAD Michigan / Michigan West (deprecated) +<26803> +proj=tmerc +lat_0=41.5 +lon_0=-88.75 +k=0.999909091 +x_0=152400.3048006096 +y_0=0 +a=6378450.047548896 +b=6356826.621488444 +units=us-ft +no_defs <> +# NAD Michigan / Michigan North (deprecated) +<26811> +proj=lcc +lat_1=45.48333333333333 +lat_2=47.08333333333334 +lat_0=44.78333333333333 +lon_0=-87 +x_0=609601.2192024384 +y_0=0 +a=6378450.047548896 +b=6356826.621488444 +units=us-ft +no_defs <> +# NAD Michigan / Michigan Central (deprecated) +<26812> +proj=lcc +lat_1=44.18333333333333 +lat_2=45.7 +lat_0=43.31666666666667 +lon_0=-84.33333333333333 +x_0=609601.2192024384 +y_0=0 +a=6378450.047548896 +b=6356826.621488444 +units=us-ft +no_defs <> +# NAD Michigan / Michigan South (deprecated) +<26813> +proj=lcc +lat_1=42.1 +lat_2=43.66666666666666 +lat_0=41.5 +lon_0=-84.33333333333333 +x_0=609601.2192024384 +y_0=0 +a=6378450.047548896 +b=6356826.621488444 +units=us-ft +no_defs <> +# NAD83 / Maine East (ftUS) (deprecated) +<26814> +proj=tmerc +lat_0=43.66666666666666 +lon_0=-68.5 +k=0.9999 +x_0=300000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Maine West (ftUS) (deprecated) +<26815> +proj=tmerc +lat_0=42.83333333333334 +lon_0=-70.16666666666667 +k=0.999966667 +x_0=900000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Minnesota North (ftUS) (deprecated) +<26819> +proj=lcc +lat_1=48.63333333333333 +lat_2=47.03333333333333 +lat_0=46.5 +lon_0=-93.09999999999999 +x_0=800000.0000101601 +y_0=99999.99998984 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Minnesota Central (ftUS) (deprecated) +<26820> +proj=lcc +lat_1=47.05 +lat_2=45.61666666666667 +lat_0=45 +lon_0=-94.25 +x_0=800000.0000101601 +y_0=99999.99998984 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Minnesota South (ftUS) (deprecated) +<26821> +proj=lcc +lat_1=45.21666666666667 +lat_2=43.78333333333333 +lat_0=43 +lon_0=-94 +x_0=800000.0000101601 +y_0=99999.99998984 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Nebraska (ftUS) (deprecated) +<26822> +proj=lcc +lat_1=43 +lat_2=40 +lat_0=39.83333333333334 +lon_0=-100 +x_0=500000.0000101601 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / West Virginia North (ftUS) (deprecated) +<26823> +proj=lcc +lat_1=40.25 +lat_2=39 +lat_0=38.5 +lon_0=-79.5 +x_0=1968500 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / West Virginia South (ftUS) (deprecated) +<26824> +proj=lcc +lat_1=38.88333333333333 +lat_2=37.48333333333333 +lat_0=37 +lon_0=-81 +x_0=1968500 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83(HARN) / Maine East (ftUS) (deprecated) +<26825> +proj=tmerc +lat_0=43.66666666666666 +lon_0=-68.5 +k=0.9999 +x_0=300000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Maine West (ftUS) (deprecated) +<26826> +proj=tmerc +lat_0=42.83333333333334 +lon_0=-70.16666666666667 +k=0.999966667 +x_0=900000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Minnesota North (ftUS) (deprecated) +<26830> +proj=lcc +lat_1=48.63333333333333 +lat_2=47.03333333333333 +lat_0=46.5 +lon_0=-93.09999999999999 +x_0=800000.0000101601 +y_0=99999.99998984 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Minnesota Central (ftUS) (deprecated) +<26831> +proj=lcc +lat_1=47.05 +lat_2=45.61666666666667 +lat_0=45 +lon_0=-94.25 +x_0=800000.0000101601 +y_0=99999.99998984 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Minnesota South (ftUS) (deprecated) +<26832> +proj=lcc +lat_1=45.21666666666667 +lat_2=43.78333333333333 +lat_0=43 +lon_0=-94 +x_0=800000.0000101601 +y_0=99999.99998984 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Nebraska (ftUS) (deprecated) +<26833> +proj=lcc +lat_1=43 +lat_2=40 +lat_0=39.83333333333334 +lon_0=-100 +x_0=500000.0000101601 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / West Virginia North (ftUS) (deprecated) +<26834> +proj=lcc +lat_1=40.25 +lat_2=39 +lat_0=38.5 +lon_0=-79.5 +x_0=1968500 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / West Virginia South (ftUS) (deprecated) +<26835> +proj=lcc +lat_1=38.88333333333333 +lat_2=37.48333333333333 +lat_0=37 +lon_0=-81 +x_0=1968500 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Maine East (ftUS) (deprecated) +<26836> +proj=tmerc +lat_0=43.66666666666666 +lon_0=-68.5 +k=0.9999 +x_0=300000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Maine West (ftUS) (deprecated) +<26837> +proj=tmerc +lat_0=42.83333333333334 +lon_0=-70.16666666666667 +k=0.999966667 +x_0=900000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Minnesota North (ftUS) (deprecated) +<26841> +proj=lcc +lat_1=48.63333333333333 +lat_2=47.03333333333333 +lat_0=46.5 +lon_0=-93.09999999999999 +x_0=800000.0000101601 +y_0=99999.99998984 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Minnesota Central (ftUS) (deprecated) +<26842> +proj=lcc +lat_1=47.05 +lat_2=45.61666666666667 +lat_0=45 +lon_0=-94.25 +x_0=800000.0000101601 +y_0=99999.99998984 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Minnesota South (ftUS) (deprecated) +<26843> +proj=lcc +lat_1=45.21666666666667 +lat_2=43.78333333333333 +lat_0=43 +lon_0=-94 +x_0=800000.0000101601 +y_0=99999.99998984 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / Nebraska (ftUS) (deprecated) +<26844> +proj=lcc +lat_1=43 +lat_2=40 +lat_0=39.83333333333334 +lon_0=-100 +x_0=500000.0000101601 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / West Virginia North (ftUS) (deprecated) +<26845> +proj=lcc +lat_1=40.25 +lat_2=39 +lat_0=38.5 +lon_0=-79.5 +x_0=1968500 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(NSRS2007) / West Virginia South (ftUS) (deprecated) +<26846> +proj=lcc +lat_1=38.88333333333333 +lat_2=37.48333333333333 +lat_0=37 +lon_0=-81 +x_0=1968500 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83 / Maine East (ftUS) +<26847> +proj=tmerc +lat_0=43.66666666666666 +lon_0=-68.5 +k=0.9999 +x_0=300000.0000000001 +y_0=0 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / Maine West (ftUS) +<26848> +proj=tmerc +lat_0=42.83333333333334 +lon_0=-70.16666666666667 +k=0.999966667 +x_0=900000 +y_0=0 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / Minnesota North (ftUS) +<26849> +proj=lcc +lat_1=48.63333333333333 +lat_2=47.03333333333333 +lat_0=46.5 +lon_0=-93.09999999999999 +x_0=800000.0000101599 +y_0=99999.99998983997 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / Minnesota Central (ftUS) +<26850> +proj=lcc +lat_1=47.05 +lat_2=45.61666666666667 +lat_0=45 +lon_0=-94.25 +x_0=800000.0000101599 +y_0=99999.99998983997 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / Minnesota South (ftUS) +<26851> +proj=lcc +lat_1=45.21666666666667 +lat_2=43.78333333333333 +lat_0=43 +lon_0=-94 +x_0=800000.0000101599 +y_0=99999.99998983997 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / Nebraska (ftUS) +<26852> +proj=lcc +lat_1=43 +lat_2=40 +lat_0=39.83333333333334 +lon_0=-100 +x_0=500000.00001016 +y_0=0 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / West Virginia North (ftUS) +<26853> +proj=lcc +lat_1=40.25 +lat_2=39 +lat_0=38.5 +lon_0=-79.5 +x_0=600000 +y_0=0 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / West Virginia South (ftUS) +<26854> +proj=lcc +lat_1=38.88333333333333 +lat_2=37.48333333333333 +lat_0=37 +lon_0=-81 +x_0=600000 +y_0=0 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83(HARN) / Maine East (ftUS) +<26855> +proj=tmerc +lat_0=43.66666666666666 +lon_0=-68.5 +k=0.9999 +x_0=300000.0000000001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(HARN) / Maine West (ftUS) +<26856> +proj=tmerc +lat_0=42.83333333333334 +lon_0=-70.16666666666667 +k=0.999966667 +x_0=900000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(HARN) / Minnesota North (ftUS) +<26857> +proj=lcc +lat_1=48.63333333333333 +lat_2=47.03333333333333 +lat_0=46.5 +lon_0=-93.09999999999999 +x_0=800000.0000101599 +y_0=99999.99998983997 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(HARN) / Minnesota Central (ftUS) +<26858> +proj=lcc +lat_1=47.05 +lat_2=45.61666666666667 +lat_0=45 +lon_0=-94.25 +x_0=800000.0000101599 +y_0=99999.99998983997 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(HARN) / Minnesota South (ftUS) +<26859> +proj=lcc +lat_1=45.21666666666667 +lat_2=43.78333333333333 +lat_0=43 +lon_0=-94 +x_0=800000.0000101599 +y_0=99999.99998983997 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(HARN) / Nebraska (ftUS) +<26860> +proj=lcc +lat_1=43 +lat_2=40 +lat_0=39.83333333333334 +lon_0=-100 +x_0=500000.00001016 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(HARN) / West Virginia North (ftUS) +<26861> +proj=lcc +lat_1=40.25 +lat_2=39 +lat_0=38.5 +lon_0=-79.5 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(HARN) / West Virginia South (ftUS) +<26862> +proj=lcc +lat_1=38.88333333333333 +lat_2=37.48333333333333 +lat_0=37 +lon_0=-81 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / Maine East (ftUS) +<26863> +proj=tmerc +lat_0=43.66666666666666 +lon_0=-68.5 +k=0.9999 +x_0=300000.0000000001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / Maine West (ftUS) +<26864> +proj=tmerc +lat_0=42.83333333333334 +lon_0=-70.16666666666667 +k=0.999966667 +x_0=900000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / Minnesota North (ftUS) +<26865> +proj=lcc +lat_1=48.63333333333333 +lat_2=47.03333333333333 +lat_0=46.5 +lon_0=-93.09999999999999 +x_0=800000.0000101599 +y_0=99999.99998983997 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / Minnesota Central (ftUS) +<26866> +proj=lcc +lat_1=47.05 +lat_2=45.61666666666667 +lat_0=45 +lon_0=-94.25 +x_0=800000.0000101599 +y_0=99999.99998983997 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / Minnesota South (ftUS) +<26867> +proj=lcc +lat_1=45.21666666666667 +lat_2=43.78333333333333 +lat_0=43 +lon_0=-94 +x_0=800000.0000101599 +y_0=99999.99998983997 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / Nebraska (ftUS) +<26868> +proj=lcc +lat_1=43 +lat_2=40 +lat_0=39.83333333333334 +lon_0=-100 +x_0=500000.00001016 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / West Virginia North (ftUS) +<26869> +proj=lcc +lat_1=40.25 +lat_2=39 +lat_0=38.5 +lon_0=-79.5 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(NSRS2007) / West Virginia South (ftUS) +<26870> +proj=lcc +lat_1=38.88333333333333 +lat_2=37.48333333333333 +lat_0=37 +lon_0=-81 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> +# NAD83(CSRS) / MTM zone 11 +<26891> +proj=tmerc +lat_0=0 +lon_0=-82.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS) / MTM zone 12 +<26892> +proj=tmerc +lat_0=0 +lon_0=-81 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS) / MTM zone 13 +<26893> +proj=tmerc +lat_0=0 +lon_0=-84 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS) / MTM zone 14 +<26894> +proj=tmerc +lat_0=0 +lon_0=-87 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS) / MTM zone 15 +<26895> +proj=tmerc +lat_0=0 +lon_0=-90 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS) / MTM zone 16 +<26896> +proj=tmerc +lat_0=0 +lon_0=-93 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS) / MTM zone 17 +<26897> +proj=tmerc +lat_0=0 +lon_0=-96 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS) / MTM zone 1 +<26898> +proj=tmerc +lat_0=0 +lon_0=-53 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS) / MTM zone 2 +<26899> +proj=tmerc +lat_0=0 +lon_0=-56 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83 / UTM zone 1N +<26901> +proj=utm +zone=1 +datum=NAD83 +units=m +no_defs <> +# NAD83 / UTM zone 2N +<26902> +proj=utm +zone=2 +datum=NAD83 +units=m +no_defs <> +# NAD83 / UTM zone 3N +<26903> +proj=utm +zone=3 +datum=NAD83 +units=m +no_defs <> +# NAD83 / UTM zone 4N +<26904> +proj=utm +zone=4 +datum=NAD83 +units=m +no_defs <> +# NAD83 / UTM zone 5N +<26905> +proj=utm +zone=5 +datum=NAD83 +units=m +no_defs <> +# NAD83 / UTM zone 6N +<26906> +proj=utm +zone=6 +datum=NAD83 +units=m +no_defs <> +# NAD83 / UTM zone 7N +<26907> +proj=utm +zone=7 +datum=NAD83 +units=m +no_defs <> +# NAD83 / UTM zone 8N +<26908> +proj=utm +zone=8 +datum=NAD83 +units=m +no_defs <> +# NAD83 / UTM zone 9N +<26909> +proj=utm +zone=9 +datum=NAD83 +units=m +no_defs <> +# NAD83 / UTM zone 10N +<26910> +proj=utm +zone=10 +datum=NAD83 +units=m +no_defs <> +# NAD83 / UTM zone 11N +<26911> +proj=utm +zone=11 +datum=NAD83 +units=m +no_defs <> +# NAD83 / UTM zone 12N +<26912> +proj=utm +zone=12 +datum=NAD83 +units=m +no_defs <> +# NAD83 / UTM zone 13N +<26913> +proj=utm +zone=13 +datum=NAD83 +units=m +no_defs <> +# NAD83 / UTM zone 14N +<26914> +proj=utm +zone=14 +datum=NAD83 +units=m +no_defs <> +# NAD83 / UTM zone 15N +<26915> +proj=utm +zone=15 +datum=NAD83 +units=m +no_defs <> +# NAD83 / UTM zone 16N +<26916> +proj=utm +zone=16 +datum=NAD83 +units=m +no_defs <> +# NAD83 / UTM zone 17N +<26917> +proj=utm +zone=17 +datum=NAD83 +units=m +no_defs <> +# NAD83 / UTM zone 18N +<26918> +proj=utm +zone=18 +datum=NAD83 +units=m +no_defs <> +# NAD83 / UTM zone 19N +<26919> +proj=utm +zone=19 +datum=NAD83 +units=m +no_defs <> +# NAD83 / UTM zone 20N +<26920> +proj=utm +zone=20 +datum=NAD83 +units=m +no_defs <> +# NAD83 / UTM zone 21N +<26921> +proj=utm +zone=21 +datum=NAD83 +units=m +no_defs <> +# NAD83 / UTM zone 22N +<26922> +proj=utm +zone=22 +datum=NAD83 +units=m +no_defs <> +# NAD83 / UTM zone 23N +<26923> +proj=utm +zone=23 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Alabama East +<26929> +proj=tmerc +lat_0=30.5 +lon_0=-85.83333333333333 +k=0.99996 +x_0=200000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Alabama West +<26930> +proj=tmerc +lat_0=30 +lon_0=-87.5 +k=0.999933333 +x_0=600000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Alaska zone 1 +<26931> +proj=omerc +lat_0=57 +lonc=-133.6666666666667 +alpha=323.1301023611111 +k=0.9999 +x_0=5000000 +y_0=-5000000 +no_uoff +gamma=323.1301023611111 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Alaska zone 2 +<26932> +proj=tmerc +lat_0=54 +lon_0=-142 +k=0.9999 +x_0=500000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Alaska zone 3 +<26933> +proj=tmerc +lat_0=54 +lon_0=-146 +k=0.9999 +x_0=500000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Alaska zone 4 +<26934> +proj=tmerc +lat_0=54 +lon_0=-150 +k=0.9999 +x_0=500000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Alaska zone 5 +<26935> +proj=tmerc +lat_0=54 +lon_0=-154 +k=0.9999 +x_0=500000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Alaska zone 6 +<26936> +proj=tmerc +lat_0=54 +lon_0=-158 +k=0.9999 +x_0=500000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Alaska zone 7 +<26937> +proj=tmerc +lat_0=54 +lon_0=-162 +k=0.9999 +x_0=500000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Alaska zone 8 +<26938> +proj=tmerc +lat_0=54 +lon_0=-166 +k=0.9999 +x_0=500000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Alaska zone 9 +<26939> +proj=tmerc +lat_0=54 +lon_0=-170 +k=0.9999 +x_0=500000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Alaska zone 10 +<26940> +proj=lcc +lat_1=53.83333333333334 +lat_2=51.83333333333334 +lat_0=51 +lon_0=-176 +x_0=1000000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / California zone 1 +<26941> +proj=lcc +lat_1=41.66666666666666 +lat_2=40 +lat_0=39.33333333333334 +lon_0=-122 +x_0=2000000 +y_0=500000 +datum=NAD83 +units=m +no_defs <> +# NAD83 / California zone 2 +<26942> +proj=lcc +lat_1=39.83333333333334 +lat_2=38.33333333333334 +lat_0=37.66666666666666 +lon_0=-122 +x_0=2000000 +y_0=500000 +datum=NAD83 +units=m +no_defs <> +# NAD83 / California zone 3 +<26943> +proj=lcc +lat_1=38.43333333333333 +lat_2=37.06666666666667 +lat_0=36.5 +lon_0=-120.5 +x_0=2000000 +y_0=500000 +datum=NAD83 +units=m +no_defs <> +# NAD83 / California zone 4 +<26944> +proj=lcc +lat_1=37.25 +lat_2=36 +lat_0=35.33333333333334 +lon_0=-119 +x_0=2000000 +y_0=500000 +datum=NAD83 +units=m +no_defs <> +# NAD83 / California zone 5 +<26945> +proj=lcc +lat_1=35.46666666666667 +lat_2=34.03333333333333 +lat_0=33.5 +lon_0=-118 +x_0=2000000 +y_0=500000 +datum=NAD83 +units=m +no_defs <> +# NAD83 / California zone 6 +<26946> +proj=lcc +lat_1=33.88333333333333 +lat_2=32.78333333333333 +lat_0=32.16666666666666 +lon_0=-116.25 +x_0=2000000 +y_0=500000 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Arizona East +<26948> +proj=tmerc +lat_0=31 +lon_0=-110.1666666666667 +k=0.9999 +x_0=213360 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Arizona Central +<26949> +proj=tmerc +lat_0=31 +lon_0=-111.9166666666667 +k=0.9999 +x_0=213360 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Arizona West +<26950> +proj=tmerc +lat_0=31 +lon_0=-113.75 +k=0.999933333 +x_0=213360 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Arkansas North +<26951> +proj=lcc +lat_1=36.23333333333333 +lat_2=34.93333333333333 +lat_0=34.33333333333334 +lon_0=-92 +x_0=400000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Arkansas South +<26952> +proj=lcc +lat_1=34.76666666666667 +lat_2=33.3 +lat_0=32.66666666666666 +lon_0=-92 +x_0=400000 +y_0=400000 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Colorado North +<26953> +proj=lcc +lat_1=40.78333333333333 +lat_2=39.71666666666667 +lat_0=39.33333333333334 +lon_0=-105.5 +x_0=914401.8289 +y_0=304800.6096 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Colorado Central +<26954> +proj=lcc +lat_1=39.75 +lat_2=38.45 +lat_0=37.83333333333334 +lon_0=-105.5 +x_0=914401.8289 +y_0=304800.6096 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Colorado South +<26955> +proj=lcc +lat_1=38.43333333333333 +lat_2=37.23333333333333 +lat_0=36.66666666666666 +lon_0=-105.5 +x_0=914401.8289 +y_0=304800.6096 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Connecticut +<26956> +proj=lcc +lat_1=41.86666666666667 +lat_2=41.2 +lat_0=40.83333333333334 +lon_0=-72.75 +x_0=304800.6096 +y_0=152400.3048 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Delaware +<26957> +proj=tmerc +lat_0=38 +lon_0=-75.41666666666667 +k=0.999995 +x_0=200000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Florida East +<26958> +proj=tmerc +lat_0=24.33333333333333 +lon_0=-81 +k=0.999941177 +x_0=200000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Florida West +<26959> +proj=tmerc +lat_0=24.33333333333333 +lon_0=-82 +k=0.999941177 +x_0=200000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Florida North +<26960> +proj=lcc +lat_1=30.75 +lat_2=29.58333333333333 +lat_0=29 +lon_0=-84.5 +x_0=600000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Hawaii zone 1 +<26961> +proj=tmerc +lat_0=18.83333333333333 +lon_0=-155.5 +k=0.999966667 +x_0=500000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Hawaii zone 2 +<26962> +proj=tmerc +lat_0=20.33333333333333 +lon_0=-156.6666666666667 +k=0.999966667 +x_0=500000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Hawaii zone 3 +<26963> +proj=tmerc +lat_0=21.16666666666667 +lon_0=-158 +k=0.99999 +x_0=500000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Hawaii zone 4 +<26964> +proj=tmerc +lat_0=21.83333333333333 +lon_0=-159.5 +k=0.99999 +x_0=500000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Hawaii zone 5 +<26965> +proj=tmerc +lat_0=21.66666666666667 +lon_0=-160.1666666666667 +k=1 +x_0=500000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Georgia East +<26966> +proj=tmerc +lat_0=30 +lon_0=-82.16666666666667 +k=0.9999 +x_0=200000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Georgia West +<26967> +proj=tmerc +lat_0=30 +lon_0=-84.16666666666667 +k=0.9999 +x_0=700000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Idaho East +<26968> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-112.1666666666667 +k=0.9999473679999999 +x_0=200000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Idaho Central +<26969> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-114 +k=0.9999473679999999 +x_0=500000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Idaho West +<26970> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-115.75 +k=0.999933333 +x_0=800000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Illinois East +<26971> +proj=tmerc +lat_0=36.66666666666666 +lon_0=-88.33333333333333 +k=0.9999749999999999 +x_0=300000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Illinois West +<26972> +proj=tmerc +lat_0=36.66666666666666 +lon_0=-90.16666666666667 +k=0.999941177 +x_0=700000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Indiana East +<26973> +proj=tmerc +lat_0=37.5 +lon_0=-85.66666666666667 +k=0.999966667 +x_0=100000 +y_0=250000 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Indiana West +<26974> +proj=tmerc +lat_0=37.5 +lon_0=-87.08333333333333 +k=0.999966667 +x_0=900000 +y_0=250000 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Iowa North +<26975> +proj=lcc +lat_1=43.26666666666667 +lat_2=42.06666666666667 +lat_0=41.5 +lon_0=-93.5 +x_0=1500000 +y_0=1000000 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Iowa South +<26976> +proj=lcc +lat_1=41.78333333333333 +lat_2=40.61666666666667 +lat_0=40 +lon_0=-93.5 +x_0=500000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Kansas North +<26977> +proj=lcc +lat_1=39.78333333333333 +lat_2=38.71666666666667 +lat_0=38.33333333333334 +lon_0=-98 +x_0=400000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Kansas South +<26978> +proj=lcc +lat_1=38.56666666666667 +lat_2=37.26666666666667 +lat_0=36.66666666666666 +lon_0=-98.5 +x_0=400000 +y_0=400000 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Kentucky North (deprecated) +<26979> +proj=lcc +lat_1=37.96666666666667 +lat_2=37.96666666666667 +lat_0=37.5 +lon_0=-84.25 +x_0=500000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Kentucky South +<26980> +proj=lcc +lat_1=37.93333333333333 +lat_2=36.73333333333333 +lat_0=36.33333333333334 +lon_0=-85.75 +x_0=500000 +y_0=500000 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Louisiana North +<26981> +proj=lcc +lat_1=32.66666666666666 +lat_2=31.16666666666667 +lat_0=30.5 +lon_0=-92.5 +x_0=1000000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Louisiana South +<26982> +proj=lcc +lat_1=30.7 +lat_2=29.3 +lat_0=28.5 +lon_0=-91.33333333333333 +x_0=1000000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Maine East +<26983> +proj=tmerc +lat_0=43.66666666666666 +lon_0=-68.5 +k=0.9999 +x_0=300000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Maine West +<26984> +proj=tmerc +lat_0=42.83333333333334 +lon_0=-70.16666666666667 +k=0.999966667 +x_0=900000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Maryland +<26985> +proj=lcc +lat_1=39.45 +lat_2=38.3 +lat_0=37.66666666666666 +lon_0=-77 +x_0=400000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Massachusetts Mainland +<26986> +proj=lcc +lat_1=42.68333333333333 +lat_2=41.71666666666667 +lat_0=41 +lon_0=-71.5 +x_0=200000 +y_0=750000 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Massachusetts Island +<26987> +proj=lcc +lat_1=41.48333333333333 +lat_2=41.28333333333333 +lat_0=41 +lon_0=-70.5 +x_0=500000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Michigan North +<26988> +proj=lcc +lat_1=47.08333333333334 +lat_2=45.48333333333333 +lat_0=44.78333333333333 +lon_0=-87 +x_0=8000000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Michigan Central +<26989> +proj=lcc +lat_1=45.7 +lat_2=44.18333333333333 +lat_0=43.31666666666667 +lon_0=-84.36666666666666 +x_0=6000000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Michigan South +<26990> +proj=lcc +lat_1=43.66666666666666 +lat_2=42.1 +lat_0=41.5 +lon_0=-84.36666666666666 +x_0=4000000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Minnesota North +<26991> +proj=lcc +lat_1=48.63333333333333 +lat_2=47.03333333333333 +lat_0=46.5 +lon_0=-93.09999999999999 +x_0=800000 +y_0=100000 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Minnesota Central +<26992> +proj=lcc +lat_1=47.05 +lat_2=45.61666666666667 +lat_0=45 +lon_0=-94.25 +x_0=800000 +y_0=100000 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Minnesota South +<26993> +proj=lcc +lat_1=45.21666666666667 +lat_2=43.78333333333333 +lat_0=43 +lon_0=-94 +x_0=800000 +y_0=100000 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Mississippi East +<26994> +proj=tmerc +lat_0=29.5 +lon_0=-88.83333333333333 +k=0.99995 +x_0=300000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Mississippi West +<26995> +proj=tmerc +lat_0=29.5 +lon_0=-90.33333333333333 +k=0.99995 +x_0=700000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Missouri East +<26996> +proj=tmerc +lat_0=35.83333333333334 +lon_0=-90.5 +k=0.999933333 +x_0=250000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Missouri Central +<26997> +proj=tmerc +lat_0=35.83333333333334 +lon_0=-92.5 +k=0.999933333 +x_0=500000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Missouri West +<26998> +proj=tmerc +lat_0=36.16666666666666 +lon_0=-94.5 +k=0.999941177 +x_0=850000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# Nahrwan 1967 / UTM zone 37N (deprecated) +<27037> +proj=utm +zone=37 +ellps=clrk80 +towgs84=-249,-156,381,0,0,0,0 +units=m +no_defs <> +# Nahrwan 1967 / UTM zone 38N (deprecated) +<27038> +proj=utm +zone=38 +ellps=clrk80 +towgs84=-249,-156,381,0,0,0,0 +units=m +no_defs <> +# Nahrwan 1967 / UTM zone 39N +<27039> +proj=utm +zone=39 +ellps=clrk80 +towgs84=-249,-156,381,0,0,0,0 +units=m +no_defs <> +# Nahrwan 1967 / UTM zone 40N +<27040> +proj=utm +zone=40 +ellps=clrk80 +towgs84=-249,-156,381,0,0,0,0 +units=m +no_defs <> +# Naparima 1972 / UTM zone 20N +<27120> +proj=utm +zone=20 +ellps=intl +towgs84=-10,375,165,0,0,0,0 +units=m +no_defs <> +# NZGD49 / New Zealand Map Grid +<27200> +proj=nzmg +lat_0=-41 +lon_0=173 +x_0=2510000 +y_0=6023150 +datum=nzgd49 +units=m +no_defs <> +# NZGD49 / Mount Eden Circuit +<27205> +proj=tmerc +lat_0=-36.87986527777778 +lon_0=174.7643393611111 +k=0.9999 +x_0=300000 +y_0=700000 +datum=nzgd49 +units=m +no_defs <> +# NZGD49 / Bay of Plenty Circuit +<27206> +proj=tmerc +lat_0=-37.76124980555556 +lon_0=176.46619725 +k=1 +x_0=300000 +y_0=700000 +datum=nzgd49 +units=m +no_defs <> +# NZGD49 / Poverty Bay Circuit +<27207> +proj=tmerc +lat_0=-38.62470277777778 +lon_0=177.8856362777778 +k=1 +x_0=300000 +y_0=700000 +datum=nzgd49 +units=m +no_defs <> +# NZGD49 / Hawkes Bay Circuit +<27208> +proj=tmerc +lat_0=-39.65092930555556 +lon_0=176.6736805277778 +k=1 +x_0=300000 +y_0=700000 +datum=nzgd49 +units=m +no_defs <> +# NZGD49 / Taranaki Circuit +<27209> +proj=tmerc +lat_0=-39.13575830555556 +lon_0=174.22801175 +k=1 +x_0=300000 +y_0=700000 +datum=nzgd49 +units=m +no_defs <> +# NZGD49 / Tuhirangi Circuit +<27210> +proj=tmerc +lat_0=-39.51247038888889 +lon_0=175.6400368055556 +k=1 +x_0=300000 +y_0=700000 +datum=nzgd49 +units=m +no_defs <> +# NZGD49 / Wanganui Circuit +<27211> +proj=tmerc +lat_0=-40.24194713888889 +lon_0=175.4880996111111 +k=1 +x_0=300000 +y_0=700000 +datum=nzgd49 +units=m +no_defs <> +# NZGD49 / Wairarapa Circuit +<27212> +proj=tmerc +lat_0=-40.92553263888889 +lon_0=175.6473496666667 +k=1 +x_0=300000 +y_0=700000 +datum=nzgd49 +units=m +no_defs <> +# NZGD49 / Wellington Circuit +<27213> +proj=tmerc +lat_0=-41.30131963888888 +lon_0=174.7766231111111 +k=1 +x_0=300000 +y_0=700000 +datum=nzgd49 +units=m +no_defs <> +# NZGD49 / Collingwood Circuit +<27214> +proj=tmerc +lat_0=-40.71475905555556 +lon_0=172.6720465 +k=1 +x_0=300000 +y_0=700000 +datum=nzgd49 +units=m +no_defs <> +# NZGD49 / Nelson Circuit +<27215> +proj=tmerc +lat_0=-41.27454472222222 +lon_0=173.2993168055555 +k=1 +x_0=300000 +y_0=700000 +datum=nzgd49 +units=m +no_defs <> +# NZGD49 / Karamea Circuit +<27216> +proj=tmerc +lat_0=-41.28991152777778 +lon_0=172.1090281944444 +k=1 +x_0=300000 +y_0=700000 +datum=nzgd49 +units=m +no_defs <> +# NZGD49 / Buller Circuit +<27217> +proj=tmerc +lat_0=-41.81080286111111 +lon_0=171.5812600555556 +k=1 +x_0=300000 +y_0=700000 +datum=nzgd49 +units=m +no_defs <> +# NZGD49 / Grey Circuit +<27218> +proj=tmerc +lat_0=-42.33369427777778 +lon_0=171.5497713055556 +k=1 +x_0=300000 +y_0=700000 +datum=nzgd49 +units=m +no_defs <> +# NZGD49 / Amuri Circuit +<27219> +proj=tmerc +lat_0=-42.68911658333333 +lon_0=173.0101333888889 +k=1 +x_0=300000 +y_0=700000 +datum=nzgd49 +units=m +no_defs <> +# NZGD49 / Marlborough Circuit +<27220> +proj=tmerc +lat_0=-41.54448666666666 +lon_0=173.8020741111111 +k=1 +x_0=300000 +y_0=700000 +datum=nzgd49 +units=m +no_defs <> +# NZGD49 / Hokitika Circuit +<27221> +proj=tmerc +lat_0=-42.88632236111111 +lon_0=170.9799935 +k=1 +x_0=300000 +y_0=700000 +datum=nzgd49 +units=m +no_defs <> +# NZGD49 / Okarito Circuit +<27222> +proj=tmerc +lat_0=-43.11012813888889 +lon_0=170.2609258333333 +k=1 +x_0=300000 +y_0=700000 +datum=nzgd49 +units=m +no_defs <> +# NZGD49 / Jacksons Bay Circuit +<27223> +proj=tmerc +lat_0=-43.97780288888889 +lon_0=168.606267 +k=1 +x_0=300000 +y_0=700000 +datum=nzgd49 +units=m +no_defs <> +# NZGD49 / Mount Pleasant Circuit +<27224> +proj=tmerc +lat_0=-43.59063758333333 +lon_0=172.7271935833333 +k=1 +x_0=300000 +y_0=700000 +datum=nzgd49 +units=m +no_defs <> +# NZGD49 / Gawler Circuit +<27225> +proj=tmerc +lat_0=-43.74871155555556 +lon_0=171.3607484722222 +k=1 +x_0=300000 +y_0=700000 +datum=nzgd49 +units=m +no_defs <> +# NZGD49 / Timaru Circuit +<27226> +proj=tmerc +lat_0=-44.40222036111111 +lon_0=171.0572508333333 +k=1 +x_0=300000 +y_0=700000 +datum=nzgd49 +units=m +no_defs <> +# NZGD49 / Lindis Peak Circuit +<27227> +proj=tmerc +lat_0=-44.73526797222222 +lon_0=169.4677550833333 +k=1 +x_0=300000 +y_0=700000 +datum=nzgd49 +units=m +no_defs <> +# NZGD49 / Mount Nicholas Circuit +<27228> +proj=tmerc +lat_0=-45.13290258333333 +lon_0=168.3986411944444 +k=1 +x_0=300000 +y_0=700000 +datum=nzgd49 +units=m +no_defs <> +# NZGD49 / Mount York Circuit +<27229> +proj=tmerc +lat_0=-45.56372616666666 +lon_0=167.7388617777778 +k=1 +x_0=300000 +y_0=700000 +datum=nzgd49 +units=m +no_defs <> +# NZGD49 / Observation Point Circuit +<27230> +proj=tmerc +lat_0=-45.81619661111111 +lon_0=170.6285951666667 +k=1 +x_0=300000 +y_0=700000 +datum=nzgd49 +units=m +no_defs <> +# NZGD49 / North Taieri Circuit +<27231> +proj=tmerc +lat_0=-45.86151336111111 +lon_0=170.2825891111111 +k=0.99996 +x_0=300000 +y_0=700000 +datum=nzgd49 +units=m +no_defs <> +# NZGD49 / Bluff Circuit +<27232> +proj=tmerc +lat_0=-46.60000961111111 +lon_0=168.342872 +k=1 +x_0=300002.66 +y_0=699999.58 +datum=nzgd49 +units=m +no_defs <> +# NZGD49 / UTM zone 58S +<27258> +proj=utm +zone=58 +south +datum=nzgd49 +units=m +no_defs <> +# NZGD49 / UTM zone 59S +<27259> +proj=utm +zone=59 +south +datum=nzgd49 +units=m +no_defs <> +# NZGD49 / UTM zone 60S +<27260> +proj=utm +zone=60 +south +datum=nzgd49 +units=m +no_defs <> +# NZGD49 / North Island Grid +<27291> +proj=tmerc +lat_0=-39 +lon_0=175.5 +k=1 +x_0=274319.5243848086 +y_0=365759.3658464114 +datum=nzgd49 +to_meter=0.9143984146160287 +no_defs <> +# NZGD49 / South Island Grid +<27292> +proj=tmerc +lat_0=-44 +lon_0=171.5 +k=1 +x_0=457199.2073080143 +y_0=457199.2073080143 +datum=nzgd49 +to_meter=0.9143984146160287 +no_defs <> +# NGO 1948 (Oslo) / NGO zone I +<27391> +proj=tmerc +lat_0=58 +lon_0=-4.666666666666667 +k=1 +x_0=0 +y_0=0 +a=6377492.018 +b=6356173.508712696 +towgs84=278.3,93,474.5,7.889,0.05,-6.61,6.21 +pm=oslo +units=m +no_defs <> +# NGO 1948 (Oslo) / NGO zone II +<27392> +proj=tmerc +lat_0=58 +lon_0=-2.333333333333333 +k=1 +x_0=0 +y_0=0 +a=6377492.018 +b=6356173.508712696 +towgs84=278.3,93,474.5,7.889,0.05,-6.61,6.21 +pm=oslo +units=m +no_defs <> +# NGO 1948 (Oslo) / NGO zone III +<27393> +proj=tmerc +lat_0=58 +lon_0=0 +k=1 +x_0=0 +y_0=0 +a=6377492.018 +b=6356173.508712696 +towgs84=278.3,93,474.5,7.889,0.05,-6.61,6.21 +pm=oslo +units=m +no_defs <> +# NGO 1948 (Oslo) / NGO zone IV +<27394> +proj=tmerc +lat_0=58 +lon_0=2.5 +k=1 +x_0=0 +y_0=0 +a=6377492.018 +b=6356173.508712696 +towgs84=278.3,93,474.5,7.889,0.05,-6.61,6.21 +pm=oslo +units=m +no_defs <> +# NGO 1948 (Oslo) / NGO zone V +<27395> +proj=tmerc +lat_0=58 +lon_0=6.166666666666667 +k=1 +x_0=0 +y_0=0 +a=6377492.018 +b=6356173.508712696 +towgs84=278.3,93,474.5,7.889,0.05,-6.61,6.21 +pm=oslo +units=m +no_defs <> +# NGO 1948 (Oslo) / NGO zone VI +<27396> +proj=tmerc +lat_0=58 +lon_0=10.16666666666667 +k=1 +x_0=0 +y_0=0 +a=6377492.018 +b=6356173.508712696 +towgs84=278.3,93,474.5,7.889,0.05,-6.61,6.21 +pm=oslo +units=m +no_defs <> +# NGO 1948 (Oslo) / NGO zone VII +<27397> +proj=tmerc +lat_0=58 +lon_0=14.16666666666667 +k=1 +x_0=0 +y_0=0 +a=6377492.018 +b=6356173.508712696 +towgs84=278.3,93,474.5,7.889,0.05,-6.61,6.21 +pm=oslo +units=m +no_defs <> +# NGO 1948 (Oslo) / NGO zone VIII +<27398> +proj=tmerc +lat_0=58 +lon_0=18.33333333333333 +k=1 +x_0=0 +y_0=0 +a=6377492.018 +b=6356173.508712696 +towgs84=278.3,93,474.5,7.889,0.05,-6.61,6.21 +pm=oslo +units=m +no_defs <> +# Datum 73 / UTM zone 29N +<27429> +proj=utm +zone=29 +ellps=intl +towgs84=-223.237,110.193,36.649,0,0,0,0 +units=m +no_defs <> +# Datum 73 / Modified Portuguese Grid (deprecated) +<27492> +proj=tmerc +lat_0=39.66666666666666 +lon_0=-8.131906111111112 +k=1 +x_0=180.598 +y_0=-86.98999999999999 +ellps=intl +towgs84=-223.237,110.193,36.649,0,0,0,0 +units=m +no_defs <> +# Datum 73 / Modified Portuguese Grid +<27493> +proj=tmerc +lat_0=39.66666666666666 +lon_0=-8.131906111111112 +k=1 +x_0=180.598 +y_0=-86.98999999999999 +ellps=intl +towgs84=-223.237,110.193,36.649,0,0,0,0 +units=m +no_defs <> +# ATF (Paris) / Nord de Guerre +<27500> +proj=lcc +lat_1=49.50000000000001 +lat_0=49.50000000000001 +lon_0=5.399999999999999 +k_0=0.99950908 +x_0=500000 +y_0=300000 +a=6376523 +b=6355862.933255573 +pm=2.337208333333333 +units=m +no_defs <> +# NTF (Paris) / Lambert Nord France +<27561> +proj=lcc +lat_1=49.50000000000001 +lat_0=49.50000000000001 +lon_0=0 +k_0=0.999877341 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs <> +# NTF (Paris) / Lambert Centre France +<27562> +proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=0 +k_0=0.99987742 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs <> +# NTF (Paris) / Lambert Sud France +<27563> +proj=lcc +lat_1=44.10000000000001 +lat_0=44.10000000000001 +lon_0=0 +k_0=0.999877499 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs <> +# NTF (Paris) / Lambert Corse +<27564> +proj=lcc +lat_1=42.16500000000001 +lat_0=42.16500000000001 +lon_0=0 +k_0=0.99994471 +x_0=234.358 +y_0=185861.369 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs <> +# NTF (Paris) / Lambert zone I +<27571> +proj=lcc +lat_1=49.50000000000001 +lat_0=49.50000000000001 +lon_0=0 +k_0=0.999877341 +x_0=600000 +y_0=1200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs <> +# NTF (Paris) / Lambert zone II +<27572> +proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=0 +k_0=0.99987742 +x_0=600000 +y_0=2200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs <> +# NTF (Paris) / Lambert zone III +<27573> +proj=lcc +lat_1=44.10000000000001 +lat_0=44.10000000000001 +lon_0=0 +k_0=0.999877499 +x_0=600000 +y_0=3200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs <> +# NTF (Paris) / Lambert zone IV +<27574> +proj=lcc +lat_1=42.16500000000001 +lat_0=42.16500000000001 +lon_0=0 +k_0=0.99994471 +x_0=234.358 +y_0=4185861.369 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs <> +# NTF (Paris) / France I (deprecated) +<27581> +proj=lcc +lat_1=49.50000000000001 +lat_0=49.50000000000001 +lon_0=0 +k_0=0.999877341 +x_0=600000 +y_0=1200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs <> +# NTF (Paris) / France II (deprecated) +<27582> +proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=0 +k_0=0.99987742 +x_0=600000 +y_0=2200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs <> +# NTF (Paris) / France III (deprecated) +<27583> +proj=lcc +lat_1=44.10000000000001 +lat_0=44.10000000000001 +lon_0=0 +k_0=0.999877499 +x_0=600000 +y_0=3200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs <> +# NTF (Paris) / France IV (deprecated) +<27584> +proj=lcc +lat_1=42.16500000000001 +lat_0=42.16500000000001 +lon_0=0 +k_0=0.99994471 +x_0=234.358 +y_0=4185861.369 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs <> +# NTF (Paris) / Nord France (deprecated) +<27591> +proj=lcc +lat_1=49.50000000000001 +lat_0=49.50000000000001 +lon_0=0 +k_0=0.999877341 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs <> +# NTF (Paris) / Centre France (deprecated) +<27592> +proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=0 +k_0=0.99987742 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs <> +# NTF (Paris) / Sud France (deprecated) +<27593> +proj=lcc +lat_1=44.10000000000001 +lat_0=44.10000000000001 +lon_0=0 +k_0=0.999877499 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs <> +# NTF (Paris) / Corse (deprecated) +<27594> +proj=lcc +lat_1=42.16500000000001 +lat_0=42.16500000000001 +lon_0=0 +k_0=0.99994471 +x_0=234.358 +y_0=185861.369 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs <> +# OSGB 1936 / British National Grid +<27700> +proj=tmerc +lat_0=49 +lon_0=-2 +k=0.9996012717 +x_0=400000 +y_0=-100000 +datum=OSGB36 +units=m +no_defs <> +# Palestine 1923 / Palestine Grid +<28191> +proj=cass +lat_0=31.73409694444445 +lon_0=35.21208055555556 +x_0=170251.555 +y_0=126867.909 +a=6378300.789 +b=6356566.435 +towgs84=-275.7224,94.7824,340.8944,-8.001,-4.42,-11.821,1 +units=m +no_defs <> +# Palestine 1923 / Palestine Belt +<28192> +proj=tmerc +lat_0=31.73409694444445 +lon_0=35.21208055555556 +k=1 +x_0=170251.555 +y_0=1126867.909 +a=6378300.789 +b=6356566.435 +towgs84=-275.7224,94.7824,340.8944,-8.001,-4.42,-11.821,1 +units=m +no_defs <> +# Palestine 1923 / Israeli CS Grid +<28193> +proj=cass +lat_0=31.73409694444445 +lon_0=35.21208055555556 +x_0=170251.555 +y_0=1126867.909 +a=6378300.789 +b=6356566.435 +towgs84=-275.7224,94.7824,340.8944,-8.001,-4.42,-11.821,1 +units=m +no_defs <> +# Pointe Noire / UTM zone 32S +<28232> +proj=utm +zone=32 +south +a=6378249.2 +b=6356515 +towgs84=-148,51,-291,0,0,0,0 +units=m +no_defs <> +# GDA94 / MGA zone 48 +<28348> +proj=utm +zone=48 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# GDA94 / MGA zone 49 +<28349> +proj=utm +zone=49 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# GDA94 / MGA zone 50 +<28350> +proj=utm +zone=50 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# GDA94 / MGA zone 51 +<28351> +proj=utm +zone=51 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# GDA94 / MGA zone 52 +<28352> +proj=utm +zone=52 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# GDA94 / MGA zone 53 +<28353> +proj=utm +zone=53 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# GDA94 / MGA zone 54 +<28354> +proj=utm +zone=54 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# GDA94 / MGA zone 55 +<28355> +proj=utm +zone=55 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# GDA94 / MGA zone 56 +<28356> +proj=utm +zone=56 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# GDA94 / MGA zone 57 +<28357> +proj=utm +zone=57 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# GDA94 / MGA zone 58 +<28358> +proj=utm +zone=58 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger zone 2 (deprecated) +<28402> +proj=tmerc +lat_0=0 +lon_0=9 +k=1 +x_0=2500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger zone 3 (deprecated) +<28403> +proj=tmerc +lat_0=0 +lon_0=15 +k=1 +x_0=3500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger zone 4 +<28404> +proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=4500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger zone 5 +<28405> +proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=5500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger zone 6 +<28406> +proj=tmerc +lat_0=0 +lon_0=33 +k=1 +x_0=6500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger zone 7 +<28407> +proj=tmerc +lat_0=0 +lon_0=39 +k=1 +x_0=7500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger zone 8 +<28408> +proj=tmerc +lat_0=0 +lon_0=45 +k=1 +x_0=8500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger zone 9 +<28409> +proj=tmerc +lat_0=0 +lon_0=51 +k=1 +x_0=9500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger zone 10 +<28410> +proj=tmerc +lat_0=0 +lon_0=57 +k=1 +x_0=10500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger zone 11 +<28411> +proj=tmerc +lat_0=0 +lon_0=63 +k=1 +x_0=11500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger zone 12 +<28412> +proj=tmerc +lat_0=0 +lon_0=69 +k=1 +x_0=12500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger zone 13 +<28413> +proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=13500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger zone 14 +<28414> +proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=14500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger zone 15 +<28415> +proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=15500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger zone 16 +<28416> +proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=16500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger zone 17 +<28417> +proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=17500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger zone 18 +<28418> +proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=18500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger zone 19 +<28419> +proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=19500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger zone 20 +<28420> +proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=20500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger zone 21 +<28421> +proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=21500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger zone 22 +<28422> +proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=22500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger zone 23 +<28423> +proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=23500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger zone 24 +<28424> +proj=tmerc +lat_0=0 +lon_0=141 +k=1 +x_0=24500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger zone 25 +<28425> +proj=tmerc +lat_0=0 +lon_0=147 +k=1 +x_0=25500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger zone 26 +<28426> +proj=tmerc +lat_0=0 +lon_0=153 +k=1 +x_0=26500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger zone 27 +<28427> +proj=tmerc +lat_0=0 +lon_0=159 +k=1 +x_0=27500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger zone 28 +<28428> +proj=tmerc +lat_0=0 +lon_0=165 +k=1 +x_0=28500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger zone 29 +<28429> +proj=tmerc +lat_0=0 +lon_0=171 +k=1 +x_0=29500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger zone 30 +<28430> +proj=tmerc +lat_0=0 +lon_0=177 +k=1 +x_0=30500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger zone 31 +<28431> +proj=tmerc +lat_0=0 +lon_0=-177 +k=1 +x_0=31500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger zone 32 +<28432> +proj=tmerc +lat_0=0 +lon_0=-171 +k=1 +x_0=32500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger 2N (deprecated) +<28462> +proj=tmerc +lat_0=0 +lon_0=9 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger 3N (deprecated) +<28463> +proj=tmerc +lat_0=0 +lon_0=15 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger 4N (deprecated) +<28464> +proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger 5N (deprecated) +<28465> +proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger 6N (deprecated) +<28466> +proj=tmerc +lat_0=0 +lon_0=33 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger 7N (deprecated) +<28467> +proj=tmerc +lat_0=0 +lon_0=39 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger 8N (deprecated) +<28468> +proj=tmerc +lat_0=0 +lon_0=45 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger 9N (deprecated) +<28469> +proj=tmerc +lat_0=0 +lon_0=51 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger 10N (deprecated) +<28470> +proj=tmerc +lat_0=0 +lon_0=57 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger 11N (deprecated) +<28471> +proj=tmerc +lat_0=0 +lon_0=63 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger 12N (deprecated) +<28472> +proj=tmerc +lat_0=0 +lon_0=69 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger 13N (deprecated) +<28473> +proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger 14N (deprecated) +<28474> +proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger 15N (deprecated) +<28475> +proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger 16N (deprecated) +<28476> +proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger 17N (deprecated) +<28477> +proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger 18N (deprecated) +<28478> +proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger 19N (deprecated) +<28479> +proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger 20N (deprecated) +<28480> +proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger 21N (deprecated) +<28481> +proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger 22N (deprecated) +<28482> +proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger 23N (deprecated) +<28483> +proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger 24N (deprecated) +<28484> +proj=tmerc +lat_0=0 +lon_0=141 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger 25N (deprecated) +<28485> +proj=tmerc +lat_0=0 +lon_0=147 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger 26N (deprecated) +<28486> +proj=tmerc +lat_0=0 +lon_0=153 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger 27N (deprecated) +<28487> +proj=tmerc +lat_0=0 +lon_0=159 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger 28N (deprecated) +<28488> +proj=tmerc +lat_0=0 +lon_0=165 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger 29N (deprecated) +<28489> +proj=tmerc +lat_0=0 +lon_0=171 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger 30N (deprecated) +<28490> +proj=tmerc +lat_0=0 +lon_0=177 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger 31N (deprecated) +<28491> +proj=tmerc +lat_0=0 +lon_0=-177 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger 32N (deprecated) +<28492> +proj=tmerc +lat_0=0 +lon_0=-171 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs <> +# Qatar 1974 / Qatar National Grid +<28600> +proj=tmerc +lat_0=24.45 +lon_0=51.21666666666667 +k=0.99999 +x_0=200000 +y_0=300000 +ellps=intl +towgs84=-128.16,-282.42,21.93,0,0,0,0 +units=m +no_defs <> +# Amersfoort / RD Old +<28991> +proj=sterea +lat_0=52.15616055555555 +lon_0=5.38763888888889 +k=0.9999079 +x_0=0 +y_0=0 +ellps=bessel +towgs84=565.2369,50.0087,465.658,-0.406857,0.350733,-1.87035,4.0812 +units=m +no_defs <> +# Amersfoort / RD New +<28992> +proj=sterea +lat_0=52.15616055555555 +lon_0=5.38763888888889 +k=0.9999079 +x_0=155000 +y_0=463000 +ellps=bessel +towgs84=565.2369,50.0087,465.658,-0.406857,0.350733,-1.87035,4.0812 +units=m +no_defs <> +# SAD69 / Brazil Polyconic (deprecated) +<29100> +proj=poly +lat_0=0 +lon_0=-54 +x_0=5000000 +y_0=10000000 +ellps=GRS67 +towgs84=-57,1,-41,0,0,0,0 +units=m +no_defs <> +# SAD69 / Brazil Polyconic +<29101> +proj=poly +lat_0=0 +lon_0=-54 +x_0=5000000 +y_0=10000000 +ellps=aust_SA +towgs84=-66.87,4.37,-38.52,0,0,0,0 +units=m +no_defs <> +# SAD69 / UTM zone 18N (deprecated) +<29118> +proj=utm +zone=18 +ellps=GRS67 +towgs84=-57,1,-41,0,0,0,0 +units=m +no_defs <> +# SAD69 / UTM zone 19N (deprecated) +<29119> +proj=utm +zone=19 +ellps=GRS67 +towgs84=-57,1,-41,0,0,0,0 +units=m +no_defs <> +# SAD69 / UTM zone 20N (deprecated) +<29120> +proj=utm +zone=20 +ellps=GRS67 +towgs84=-57,1,-41,0,0,0,0 +units=m +no_defs <> +# SAD69 / UTM zone 21N (deprecated) +<29121> +proj=utm +zone=21 +ellps=GRS67 +towgs84=-57,1,-41,0,0,0,0 +units=m +no_defs <> +# SAD69 / UTM zone 22N (deprecated) +<29122> +proj=utm +zone=22 +ellps=GRS67 +towgs84=-57,1,-41,0,0,0,0 +units=m +no_defs <> +# SAD69 / UTM zone 18N +<29168> +proj=utm +zone=18 +ellps=aust_SA +towgs84=-66.87,4.37,-38.52,0,0,0,0 +units=m +no_defs <> +# SAD69 / UTM zone 19N +<29169> +proj=utm +zone=19 +ellps=aust_SA +towgs84=-66.87,4.37,-38.52,0,0,0,0 +units=m +no_defs <> +# SAD69 / UTM zone 20N +<29170> +proj=utm +zone=20 +ellps=aust_SA +towgs84=-66.87,4.37,-38.52,0,0,0,0 +units=m +no_defs <> +# SAD69 / UTM zone 21N +<29171> +proj=utm +zone=21 +ellps=aust_SA +towgs84=-66.87,4.37,-38.52,0,0,0,0 +units=m +no_defs <> +# SAD69 / UTM zone 22N +<29172> +proj=utm +zone=22 +ellps=aust_SA +towgs84=-66.87,4.37,-38.52,0,0,0,0 +units=m +no_defs <> +# SAD69 / UTM zone 17S (deprecated) +<29177> +proj=utm +zone=17 +south +ellps=GRS67 +towgs84=-57,1,-41,0,0,0,0 +units=m +no_defs <> +# SAD69 / UTM zone 18S (deprecated) +<29178> +proj=utm +zone=18 +south +ellps=GRS67 +towgs84=-57,1,-41,0,0,0,0 +units=m +no_defs <> +# SAD69 / UTM zone 19S (deprecated) +<29179> +proj=utm +zone=19 +south +ellps=GRS67 +towgs84=-57,1,-41,0,0,0,0 +units=m +no_defs <> +# SAD69 / UTM zone 20S (deprecated) +<29180> +proj=utm +zone=20 +south +ellps=GRS67 +towgs84=-57,1,-41,0,0,0,0 +units=m +no_defs <> +# SAD69 / UTM zone 21S (deprecated) +<29181> +proj=utm +zone=21 +south +ellps=GRS67 +towgs84=-57,1,-41,0,0,0,0 +units=m +no_defs <> +# SAD69 / UTM zone 22S (deprecated) +<29182> +proj=utm +zone=22 +south +ellps=GRS67 +towgs84=-57,1,-41,0,0,0,0 +units=m +no_defs <> +# SAD69 / UTM zone 23S (deprecated) +<29183> +proj=utm +zone=23 +south +ellps=GRS67 +towgs84=-57,1,-41,0,0,0,0 +units=m +no_defs <> +# SAD69 / UTM zone 24S (deprecated) +<29184> +proj=utm +zone=24 +south +ellps=GRS67 +towgs84=-57,1,-41,0,0,0,0 +units=m +no_defs <> +# SAD69 / UTM zone 25S (deprecated) +<29185> +proj=utm +zone=25 +south +ellps=GRS67 +towgs84=-57,1,-41,0,0,0,0 +units=m +no_defs <> +# SAD69 / UTM zone 17S +<29187> +proj=utm +zone=17 +south +ellps=aust_SA +towgs84=-66.87,4.37,-38.52,0,0,0,0 +units=m +no_defs <> +# SAD69 / UTM zone 18S +<29188> +proj=utm +zone=18 +south +ellps=aust_SA +towgs84=-66.87,4.37,-38.52,0,0,0,0 +units=m +no_defs <> +# SAD69 / UTM zone 19S +<29189> +proj=utm +zone=19 +south +ellps=aust_SA +towgs84=-66.87,4.37,-38.52,0,0,0,0 +units=m +no_defs <> +# SAD69 / UTM zone 20S +<29190> +proj=utm +zone=20 +south +ellps=aust_SA +towgs84=-66.87,4.37,-38.52,0,0,0,0 +units=m +no_defs <> +# SAD69 / UTM zone 21S +<29191> +proj=utm +zone=21 +south +ellps=aust_SA +towgs84=-66.87,4.37,-38.52,0,0,0,0 +units=m +no_defs <> +# SAD69 / UTM zone 22S +<29192> +proj=utm +zone=22 +south +ellps=aust_SA +towgs84=-66.87,4.37,-38.52,0,0,0,0 +units=m +no_defs <> +# SAD69 / UTM zone 23S +<29193> +proj=utm +zone=23 +south +ellps=aust_SA +towgs84=-66.87,4.37,-38.52,0,0,0,0 +units=m +no_defs <> +# SAD69 / UTM zone 24S +<29194> +proj=utm +zone=24 +south +ellps=aust_SA +towgs84=-66.87,4.37,-38.52,0,0,0,0 +units=m +no_defs <> +# SAD69 / UTM zone 25S +<29195> +proj=utm +zone=25 +south +ellps=aust_SA +towgs84=-66.87,4.37,-38.52,0,0,0,0 +units=m +no_defs <> +# Sapper Hill 1943 / UTM zone 20S +<29220> +proj=utm +zone=20 +south +ellps=intl +towgs84=-355,21,72,0,0,0,0 +units=m +no_defs <> +# Sapper Hill 1943 / UTM zone 21S +<29221> +proj=utm +zone=21 +south +ellps=intl +towgs84=-355,21,72,0,0,0,0 +units=m +no_defs <> +# Schwarzeck / UTM zone 33S +<29333> +proj=utm +zone=33 +south +ellps=bess_nam +towgs84=616,97,-251,0,0,0,0 +units=m +no_defs <> +# Schwarzeck / Lo22/11 +<29371> +proj=tmerc +lat_0=-22 +lon_0=11 +k=1 +x_0=0 +y_0=0 +axis=wsu +ellps=bess_nam +towgs84=616,97,-251,0,0,0,0 +to_meter=1.0000135965 +no_defs <> +# Schwarzeck / Lo22/13 +<29373> +proj=tmerc +lat_0=-22 +lon_0=13 +k=1 +x_0=0 +y_0=0 +axis=wsu +ellps=bess_nam +towgs84=616,97,-251,0,0,0,0 +to_meter=1.0000135965 +no_defs <> +# Schwarzeck / Lo22/15 +<29375> +proj=tmerc +lat_0=-22 +lon_0=15 +k=1 +x_0=0 +y_0=0 +axis=wsu +ellps=bess_nam +towgs84=616,97,-251,0,0,0,0 +to_meter=1.0000135965 +no_defs <> +# Schwarzeck / Lo22/17 +<29377> +proj=tmerc +lat_0=-22 +lon_0=17 +k=1 +x_0=0 +y_0=0 +axis=wsu +ellps=bess_nam +towgs84=616,97,-251,0,0,0,0 +to_meter=1.0000135965 +no_defs <> +# Schwarzeck / Lo22/19 +<29379> +proj=tmerc +lat_0=-22 +lon_0=19 +k=1 +x_0=0 +y_0=0 +axis=wsu +ellps=bess_nam +towgs84=616,97,-251,0,0,0,0 +to_meter=1.0000135965 +no_defs <> +# Schwarzeck / Lo22/21 +<29381> +proj=tmerc +lat_0=-22 +lon_0=21 +k=1 +x_0=0 +y_0=0 +axis=wsu +ellps=bess_nam +towgs84=616,97,-251,0,0,0,0 +to_meter=1.0000135965 +no_defs <> +# Schwarzeck / Lo22/23 +<29383> +proj=tmerc +lat_0=-22 +lon_0=23 +k=1 +x_0=0 +y_0=0 +axis=wsu +ellps=bess_nam +towgs84=616,97,-251,0,0,0,0 +to_meter=1.0000135965 +no_defs <> +# Schwarzeck / Lo22/25 +<29385> +proj=tmerc +lat_0=-22 +lon_0=25 +k=1 +x_0=0 +y_0=0 +axis=wsu +ellps=bess_nam +towgs84=616,97,-251,0,0,0,0 +to_meter=1.0000135965 +no_defs <> +# Sudan / UTM zone 35N (deprecated) +<29635> +proj=utm +zone=35 +a=6378249.2 +b=6356515 +units=m +no_defs <> +# Sudan / UTM zone 36N (deprecated) +<29636> +proj=utm +zone=36 +a=6378249.2 +b=6356515 +units=m +no_defs <> +# Tananarive (Paris) / Laborde Grid (deprecated) +<29700> +proj=omerc +lat_0=-18.9 +lonc=44.10000000000001 +alpha=18.9 +k=0.9995000000000001 +x_0=400000 +y_0=800000 +gamma=18.9 +ellps=intl +towgs84=-189,-242,-91,0,0,0,0 +pm=paris +units=m +no_defs <> +# Tananarive (Paris) / Laborde Grid +# Unable to translate coordinate system EPSG:29701 into PROJ.4 format. +# +# Tananarive (Paris) / Laborde Grid approximation +<29702> +proj=omerc +lat_0=-18.9 +lonc=44.10000000000001 +alpha=18.9 +k=0.9995000000000001 +x_0=400000 +y_0=800000 +gamma=18.9 +ellps=intl +towgs84=-189,-242,-91,0,0,0,0 +pm=paris +units=m +no_defs <> +# Tananarive / UTM zone 38S +<29738> +proj=utm +zone=38 +south +ellps=intl +towgs84=-189,-242,-91,0,0,0,0 +units=m +no_defs <> +# Tananarive / UTM zone 39S +<29739> +proj=utm +zone=39 +south +ellps=intl +towgs84=-189,-242,-91,0,0,0,0 +units=m +no_defs <> +# Timbalai 1948 / UTM zone 49N +<29849> +proj=utm +zone=49 +ellps=evrstSS +towgs84=-679,669,-48,0,0,0,0 +units=m +no_defs <> +# Timbalai 1948 / UTM zone 50N +<29850> +proj=utm +zone=50 +ellps=evrstSS +towgs84=-679,669,-48,0,0,0,0 +units=m +no_defs <> +# Timbalai 1948 / RSO Borneo (ch) +<29871> +proj=omerc +lat_0=4 +lonc=115 +alpha=53.31582047222222 +k=0.99984 +x_0=590476.8714630401 +y_0=442857.653094361 +gamma=53.13010236111111 +ellps=evrstSS +towgs84=-679,669,-48,0,0,0,0 +to_meter=20.11676512155263 +no_defs <> +# Timbalai 1948 / RSO Borneo (ftSe) +<29872> +proj=omerc +lat_0=4 +lonc=115 +alpha=53.31582047222222 +k=0.99984 +x_0=590476.8727431979 +y_0=442857.6545573985 +gamma=53.13010236111111 +ellps=evrstSS +towgs84=-679,669,-48,0,0,0,0 +to_meter=0.3047994715386762 +no_defs <> +# Timbalai 1948 / RSO Borneo (m) +<29873> +proj=omerc +lat_0=4 +lonc=115 +alpha=53.31582047222222 +k=0.99984 +x_0=590476.87 +y_0=442857.65 +gamma=53.13010236111111 +ellps=evrstSS +towgs84=-679,669,-48,0,0,0,0 +units=m +no_defs <> +# TM65 / Irish National Grid (deprecated) +<29900> +proj=tmerc +lat_0=53.5 +lon_0=-8 +k=1.000035 +x_0=200000 +y_0=250000 +datum=ire65 +units=m +no_defs <> +# OSNI 1952 / Irish National Grid +<29901> +proj=tmerc +lat_0=53.5 +lon_0=-8 +k=1 +x_0=200000 +y_0=250000 +ellps=airy +towgs84=482.5,-130.6,564.6,-1.042,-0.214,-0.631,8.15 +units=m +no_defs <> +# TM65 / Irish Grid +<29902> +proj=tmerc +lat_0=53.5 +lon_0=-8 +k=1.000035 +x_0=200000 +y_0=250000 +datum=ire65 +units=m +no_defs <> +# TM75 / Irish Grid +<29903> +proj=tmerc +lat_0=53.5 +lon_0=-8 +k=1.000035 +x_0=200000 +y_0=250000 +ellps=mod_airy +towgs84=482.5,-130.6,564.6,-1.042,-0.214,-0.631,8.15 +units=m +no_defs <> +# Tokyo / Japan Plane Rectangular CS I +<30161> +proj=tmerc +lat_0=33 +lon_0=129.5 +k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +towgs84=-146.414,507.337,680.507,0,0,0,0 +units=m +no_defs <> +# Tokyo / Japan Plane Rectangular CS II +<30162> +proj=tmerc +lat_0=33 +lon_0=131 +k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +towgs84=-146.414,507.337,680.507,0,0,0,0 +units=m +no_defs <> +# Tokyo / Japan Plane Rectangular CS III +<30163> +proj=tmerc +lat_0=36 +lon_0=132.1666666666667 +k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +towgs84=-146.414,507.337,680.507,0,0,0,0 +units=m +no_defs <> +# Tokyo / Japan Plane Rectangular CS IV +<30164> +proj=tmerc +lat_0=33 +lon_0=133.5 +k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +towgs84=-146.414,507.337,680.507,0,0,0,0 +units=m +no_defs <> +# Tokyo / Japan Plane Rectangular CS V +<30165> +proj=tmerc +lat_0=36 +lon_0=134.3333333333333 +k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +towgs84=-146.414,507.337,680.507,0,0,0,0 +units=m +no_defs <> +# Tokyo / Japan Plane Rectangular CS VI +<30166> +proj=tmerc +lat_0=36 +lon_0=136 +k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +towgs84=-146.414,507.337,680.507,0,0,0,0 +units=m +no_defs <> +# Tokyo / Japan Plane Rectangular CS VII +<30167> +proj=tmerc +lat_0=36 +lon_0=137.1666666666667 +k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +towgs84=-146.414,507.337,680.507,0,0,0,0 +units=m +no_defs <> +# Tokyo / Japan Plane Rectangular CS VIII +<30168> +proj=tmerc +lat_0=36 +lon_0=138.5 +k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +towgs84=-146.414,507.337,680.507,0,0,0,0 +units=m +no_defs <> +# Tokyo / Japan Plane Rectangular CS IX +<30169> +proj=tmerc +lat_0=36 +lon_0=139.8333333333333 +k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +towgs84=-146.414,507.337,680.507,0,0,0,0 +units=m +no_defs <> +# Tokyo / Japan Plane Rectangular CS X +<30170> +proj=tmerc +lat_0=40 +lon_0=140.8333333333333 +k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +towgs84=-146.414,507.337,680.507,0,0,0,0 +units=m +no_defs <> +# Tokyo / Japan Plane Rectangular CS XI +<30171> +proj=tmerc +lat_0=44 +lon_0=140.25 +k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +towgs84=-146.414,507.337,680.507,0,0,0,0 +units=m +no_defs <> +# Tokyo / Japan Plane Rectangular CS XII +<30172> +proj=tmerc +lat_0=44 +lon_0=142.25 +k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +towgs84=-146.414,507.337,680.507,0,0,0,0 +units=m +no_defs <> +# Tokyo / Japan Plane Rectangular CS XIII +<30173> +proj=tmerc +lat_0=44 +lon_0=144.25 +k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +towgs84=-146.414,507.337,680.507,0,0,0,0 +units=m +no_defs <> +# Tokyo / Japan Plane Rectangular CS XIV +<30174> +proj=tmerc +lat_0=26 +lon_0=142 +k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +towgs84=-146.414,507.337,680.507,0,0,0,0 +units=m +no_defs <> +# Tokyo / Japan Plane Rectangular CS XV +<30175> +proj=tmerc +lat_0=26 +lon_0=127.5 +k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +towgs84=-146.414,507.337,680.507,0,0,0,0 +units=m +no_defs <> +# Tokyo / Japan Plane Rectangular CS XVI +<30176> +proj=tmerc +lat_0=26 +lon_0=124 +k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +towgs84=-146.414,507.337,680.507,0,0,0,0 +units=m +no_defs <> +# Tokyo / Japan Plane Rectangular CS XVII +<30177> +proj=tmerc +lat_0=26 +lon_0=131 +k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +towgs84=-146.414,507.337,680.507,0,0,0,0 +units=m +no_defs <> +# Tokyo / Japan Plane Rectangular CS XVIII +<30178> +proj=tmerc +lat_0=20 +lon_0=136 +k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +towgs84=-146.414,507.337,680.507,0,0,0,0 +units=m +no_defs <> +# Tokyo / Japan Plane Rectangular CS XIX +<30179> +proj=tmerc +lat_0=26 +lon_0=154 +k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +towgs84=-146.414,507.337,680.507,0,0,0,0 +units=m +no_defs <> +# Trinidad 1903 / Trinidad Grid +<30200> +proj=cass +lat_0=10.44166666666667 +lon_0=-61.33333333333334 +x_0=86501.46392051999 +y_0=65379.0134283 +a=6378293.645208759 +b=6356617.987679838 +towgs84=-61.702,284.488,472.052,0,0,0,0 +to_meter=0.201166195164 +no_defs <> +# TC(1948) / UTM zone 39N +<30339> +proj=utm +zone=39 +ellps=helmert +units=m +no_defs <> +# TC(1948) / UTM zone 40N +<30340> +proj=utm +zone=40 +ellps=helmert +units=m +no_defs <> +# Voirol 1875 / Nord Algerie (ancienne) +<30491> +proj=lcc +lat_1=36 +lat_0=36 +lon_0=2.7 +k_0=0.999625544 +x_0=500000 +y_0=300000 +a=6378249.2 +b=6356515 +towgs84=-73,-247,227,0,0,0,0 +units=m +no_defs <> +# Voirol 1875 / Sud Algerie (ancienne) +<30492> +proj=lcc +lat_1=33.3 +lat_0=33.3 +lon_0=2.7 +k_0=0.999625769 +x_0=500000 +y_0=300000 +a=6378249.2 +b=6356515 +towgs84=-73,-247,227,0,0,0,0 +units=m +no_defs <> +# Voirol 1879 / Nord Algerie (ancienne) +<30493> +proj=lcc +lat_1=36 +lat_0=36 +lon_0=2.7 +k_0=0.999625544 +x_0=500000 +y_0=300000 +a=6378249.2 +b=6356515 +units=m +no_defs <> +# Voirol 1879 / Sud Algerie (ancienne) +<30494> +proj=lcc +lat_1=33.3 +lat_0=33.3 +lon_0=2.7 +k_0=0.999625769 +x_0=500000 +y_0=300000 +a=6378249.2 +b=6356515 +units=m +no_defs <> +# Nord Sahara 1959 / UTM zone 29N +<30729> +proj=utm +zone=29 +ellps=clrk80 +towgs84=-209.3622,-87.8162,404.6198,0.0046,3.4784,0.5805,-1.4547 +units=m +no_defs <> +# Nord Sahara 1959 / UTM zone 30N +<30730> +proj=utm +zone=30 +ellps=clrk80 +towgs84=-209.3622,-87.8162,404.6198,0.0046,3.4784,0.5805,-1.4547 +units=m +no_defs <> +# Nord Sahara 1959 / UTM zone 31N +<30731> +proj=utm +zone=31 +ellps=clrk80 +towgs84=-209.3622,-87.8162,404.6198,0.0046,3.4784,0.5805,-1.4547 +units=m +no_defs <> +# Nord Sahara 1959 / UTM zone 32N +<30732> +proj=utm +zone=32 +ellps=clrk80 +towgs84=-209.3622,-87.8162,404.6198,0.0046,3.4784,0.5805,-1.4547 +units=m +no_defs <> +# Nord Sahara 1959 / Nord Algerie +<30791> +proj=lcc +lat_1=36 +lat_0=36 +lon_0=2.7 +k_0=0.999625544 +x_0=500135 +y_0=300090 +ellps=clrk80 +towgs84=-209.3622,-87.8162,404.6198,0.0046,3.4784,0.5805,-1.4547 +units=m +no_defs <> +# Nord Sahara 1959 / Sud Algerie +<30792> +proj=lcc +lat_1=33.3 +lat_0=33.3 +lon_0=2.7 +k_0=0.999625769 +x_0=500135 +y_0=300090 +ellps=clrk80 +towgs84=-209.3622,-87.8162,404.6198,0.0046,3.4784,0.5805,-1.4547 +units=m +no_defs <> +# RT38 2.5 gon W (deprecated) +<30800> +proj=tmerc +lat_0=0 +lon_0=15.80827777777778 +k=1 +x_0=1500000 +y_0=0 +ellps=bessel +units=m +no_defs <> +# Yoff / UTM zone 28N +<31028> +proj=utm +zone=28 +a=6378249.2 +b=6356515 +towgs84=-30,190,89,0,0,0,0 +units=m +no_defs <> +# Zanderij / UTM zone 21N +<31121> +proj=utm +zone=21 +ellps=intl +towgs84=-265,120,-358,0,0,0,0 +units=m +no_defs <> +# Zanderij / TM 54 NW +<31154> +proj=tmerc +lat_0=0 +lon_0=-54 +k=0.9996 +x_0=500000 +y_0=0 +ellps=intl +towgs84=-265,120,-358,0,0,0,0 +units=m +no_defs <> +# Zanderij / Suriname Old TM +<31170> +proj=tmerc +lat_0=0 +lon_0=-55.68333333333333 +k=0.9996 +x_0=500000 +y_0=0 +ellps=intl +towgs84=-265,120,-358,0,0,0,0 +units=m +no_defs <> +# Zanderij / Suriname TM +<31171> +proj=tmerc +lat_0=0 +lon_0=-55.68333333333333 +k=0.9999 +x_0=500000 +y_0=0 +ellps=intl +towgs84=-265,120,-358,0,0,0,0 +units=m +no_defs <> +# MGI (Ferro) / Austria GK West Zone +<31251> +proj=tmerc +lat_0=0 +lon_0=28 +k=1 +x_0=0 +y_0=-5000000 +ellps=bessel +towgs84=577.326,90.129,463.919,5.137,1.474,5.297,2.4232 +pm=ferro +units=m +no_defs <> +# MGI (Ferro) / Austria GK Central Zone +<31252> +proj=tmerc +lat_0=0 +lon_0=31 +k=1 +x_0=0 +y_0=-5000000 +ellps=bessel +towgs84=577.326,90.129,463.919,5.137,1.474,5.297,2.4232 +pm=ferro +units=m +no_defs <> +# MGI (Ferro) / Austria GK East Zone +<31253> +proj=tmerc +lat_0=0 +lon_0=34 +k=1 +x_0=0 +y_0=-5000000 +ellps=bessel +towgs84=577.326,90.129,463.919,5.137,1.474,5.297,2.4232 +pm=ferro +units=m +no_defs <> +# MGI / Austria GK West +<31254> +proj=tmerc +lat_0=0 +lon_0=10.33333333333333 +k=1 +x_0=0 +y_0=-5000000 +datum=hermannskogel +units=m +no_defs <> +# MGI / Austria GK Central +<31255> +proj=tmerc +lat_0=0 +lon_0=13.33333333333333 +k=1 +x_0=0 +y_0=-5000000 +datum=hermannskogel +units=m +no_defs <> +# MGI / Austria GK East +<31256> +proj=tmerc +lat_0=0 +lon_0=16.33333333333333 +k=1 +x_0=0 +y_0=-5000000 +datum=hermannskogel +units=m +no_defs <> +# MGI / Austria GK M28 +<31257> +proj=tmerc +lat_0=0 +lon_0=10.33333333333333 +k=1 +x_0=150000 +y_0=-5000000 +datum=hermannskogel +units=m +no_defs <> +# MGI / Austria GK M31 +<31258> +proj=tmerc +lat_0=0 +lon_0=13.33333333333333 +k=1 +x_0=450000 +y_0=-5000000 +datum=hermannskogel +units=m +no_defs <> +# MGI / Austria GK M34 +<31259> +proj=tmerc +lat_0=0 +lon_0=16.33333333333333 +k=1 +x_0=750000 +y_0=-5000000 +datum=hermannskogel +units=m +no_defs <> +# MGI / 3-degree Gauss zone 5 (deprecated) +<31265> +proj=tmerc +lat_0=0 +lon_0=15 +k=1 +x_0=5500000 +y_0=0 +datum=hermannskogel +units=m +no_defs <> +# MGI / 3-degree Gauss zone 6 (deprecated) +<31266> +proj=tmerc +lat_0=0 +lon_0=18 +k=1 +x_0=6500000 +y_0=0 +datum=hermannskogel +units=m +no_defs <> +# MGI / 3-degree Gauss zone 7 (deprecated) +<31267> +proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=7500000 +y_0=0 +datum=hermannskogel +units=m +no_defs <> +# MGI / 3-degree Gauss zone 8 (deprecated) +<31268> +proj=tmerc +lat_0=0 +lon_0=24 +k=1 +x_0=8500000 +y_0=0 +datum=hermannskogel +units=m +no_defs <> +# MGI / Balkans zone 5 (deprecated) +<31275> +proj=tmerc +lat_0=0 +lon_0=15 +k=0.9999 +x_0=5500000 +y_0=0 +datum=hermannskogel +units=m +no_defs <> +# MGI / Balkans zone 6 (deprecated) +<31276> +proj=tmerc +lat_0=0 +lon_0=18 +k=0.9999 +x_0=6500000 +y_0=0 +datum=hermannskogel +units=m +no_defs <> +# MGI / Balkans zone 7 (deprecated) +<31277> +proj=tmerc +lat_0=0 +lon_0=21 +k=0.9999 +x_0=7500000 +y_0=0 +datum=hermannskogel +units=m +no_defs <> +# MGI / Balkans zone 8 (deprecated) +<31278> +proj=tmerc +lat_0=0 +lon_0=21 +k=0.9999 +x_0=7500000 +y_0=0 +datum=hermannskogel +units=m +no_defs <> +# MGI / Balkans zone 8 (deprecated) +<31279> +proj=tmerc +lat_0=0 +lon_0=24 +k=0.9999 +x_0=8500000 +y_0=0 +datum=hermannskogel +units=m +no_defs <> +# MGI (Ferro) / Austria West Zone +<31281> +proj=tmerc +lat_0=0 +lon_0=28 +k=1 +x_0=0 +y_0=0 +ellps=bessel +towgs84=682,-203,480,0,0,0,0 +pm=ferro +units=m +no_defs <> +# MGI (Ferro) / Austria Central Zone +<31282> +proj=tmerc +lat_0=0 +lon_0=31 +k=1 +x_0=0 +y_0=0 +ellps=bessel +towgs84=682,-203,480,0,0,0,0 +pm=ferro +units=m +no_defs <> +# MGI (Ferro) / Austria East Zone +<31283> +proj=tmerc +lat_0=0 +lon_0=34 +k=1 +x_0=0 +y_0=0 +ellps=bessel +towgs84=682,-203,480,0,0,0,0 +pm=ferro +units=m +no_defs <> +# MGI / Austria M28 +<31284> +proj=tmerc +lat_0=0 +lon_0=10.33333333333333 +k=1 +x_0=150000 +y_0=0 +datum=hermannskogel +units=m +no_defs <> +# MGI / Austria M31 +<31285> +proj=tmerc +lat_0=0 +lon_0=13.33333333333333 +k=1 +x_0=450000 +y_0=0 +datum=hermannskogel +units=m +no_defs <> +# MGI / Austria M34 +<31286> +proj=tmerc +lat_0=0 +lon_0=16.33333333333333 +k=1 +x_0=750000 +y_0=0 +datum=hermannskogel +units=m +no_defs <> +# MGI / Austria Lambert +<31287> +proj=lcc +lat_1=49 +lat_2=46 +lat_0=47.5 +lon_0=13.33333333333333 +x_0=400000 +y_0=400000 +datum=hermannskogel +units=m +no_defs <> +# MGI (Ferro) / M28 +<31288> +proj=tmerc +lat_0=0 +lon_0=28 +k=1 +x_0=150000 +y_0=0 +ellps=bessel +towgs84=682,-203,480,0,0,0,0 +pm=ferro +units=m +no_defs <> +# MGI (Ferro) / M31 +<31289> +proj=tmerc +lat_0=0 +lon_0=31 +k=1 +x_0=450000 +y_0=0 +ellps=bessel +towgs84=682,-203,480,0,0,0,0 +pm=ferro +units=m +no_defs <> +# MGI (Ferro) / M34 +<31290> +proj=tmerc +lat_0=0 +lon_0=34 +k=1 +x_0=750000 +y_0=0 +ellps=bessel +towgs84=682,-203,480,0,0,0,0 +pm=ferro +units=m +no_defs <> +# MGI (Ferro) / Austria West Zone (deprecated) +<31291> +proj=tmerc +lat_0=0 +lon_0=28 +k=1 +x_0=0 +y_0=0 +ellps=bessel +towgs84=682,-203,480,0,0,0,0 +pm=ferro +units=m +no_defs <> +# MGI (Ferro) / Austria Central Zone (deprecated) +<31292> +proj=tmerc +lat_0=0 +lon_0=31 +k=1 +x_0=0 +y_0=0 +ellps=bessel +towgs84=682,-203,480,0,0,0,0 +pm=ferro +units=m +no_defs <> +# MGI (Ferro) / Austria East Zone (deprecated) +<31293> +proj=tmerc +lat_0=0 +lon_0=34 +k=1 +x_0=0 +y_0=0 +ellps=bessel +towgs84=682,-203,480,0,0,0,0 +pm=ferro +units=m +no_defs <> +# MGI / M28 (deprecated) +<31294> +proj=tmerc +lat_0=0 +lon_0=10.33333333333333 +k=1 +x_0=150000 +y_0=0 +datum=hermannskogel +units=m +no_defs <> +# MGI / M31 (deprecated) +<31295> +proj=tmerc +lat_0=0 +lon_0=13.33333333333333 +k=1 +x_0=450000 +y_0=0 +datum=hermannskogel +units=m +no_defs <> +# MGI / M34 (deprecated) +<31296> +proj=tmerc +lat_0=0 +lon_0=16.33333333333333 +k=1 +x_0=750000 +y_0=0 +datum=hermannskogel +units=m +no_defs <> +# MGI / Austria Lambert (deprecated) +<31297> +proj=lcc +lat_1=49 +lat_2=46 +lat_0=47.5 +lon_0=13.33333333333333 +x_0=400000 +y_0=400000 +datum=hermannskogel +units=m +no_defs <> +# Belge 1972 / Belge Lambert 72 +<31300> +proj=lcc +lat_1=49.83333333333334 +lat_2=51.16666666666666 +lat_0=90 +lon_0=4.356939722222222 +x_0=150000.01256 +y_0=5400088.4378 +ellps=intl +towgs84=-106.8686,52.2978,-103.7239,0.3366,-0.457,1.8422,-1.2747 +units=m +no_defs <> +# Belge 1972 / Belgian Lambert 72 +<31370> +proj=lcc +lat_1=51.16666723333333 +lat_2=49.8333339 +lat_0=90 +lon_0=4.367486666666666 +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 <> +# DHDN / 3-degree Gauss zone 1 (deprecated) +<31461> +proj=tmerc +lat_0=0 +lon_0=3 +k=1 +x_0=1500000 +y_0=0 +datum=potsdam +units=m +no_defs <> +# DHDN / 3-degree Gauss zone 2 (deprecated) +<31462> +proj=tmerc +lat_0=0 +lon_0=6 +k=1 +x_0=2500000 +y_0=0 +datum=potsdam +units=m +no_defs <> +# DHDN / 3-degree Gauss zone 3 (deprecated) +<31463> +proj=tmerc +lat_0=0 +lon_0=9 +k=1 +x_0=3500000 +y_0=0 +datum=potsdam +units=m +no_defs <> +# DHDN / 3-degree Gauss zone 4 (deprecated) +<31464> +proj=tmerc +lat_0=0 +lon_0=12 +k=1 +x_0=4500000 +y_0=0 +datum=potsdam +units=m +no_defs <> +# DHDN / 3-degree Gauss zone 5 (deprecated) +<31465> +proj=tmerc +lat_0=0 +lon_0=15 +k=1 +x_0=5500000 +y_0=0 +datum=potsdam +units=m +no_defs <> +# DHDN / 3-degree Gauss-Kruger zone 2 +<31466> +proj=tmerc +lat_0=0 +lon_0=6 +k=1 +x_0=2500000 +y_0=0 +datum=potsdam +units=m +no_defs <> +# DHDN / 3-degree Gauss-Kruger zone 3 +<31467> +proj=tmerc +lat_0=0 +lon_0=9 +k=1 +x_0=3500000 +y_0=0 +datum=potsdam +units=m +no_defs <> +# DHDN / 3-degree Gauss-Kruger zone 4 +<31468> +proj=tmerc +lat_0=0 +lon_0=12 +k=1 +x_0=4500000 +y_0=0 +datum=potsdam +units=m +no_defs <> +# DHDN / 3-degree Gauss-Kruger zone 5 +<31469> +proj=tmerc +lat_0=0 +lon_0=15 +k=1 +x_0=5500000 +y_0=0 +datum=potsdam +units=m +no_defs <> +# Conakry 1905 / UTM zone 28N +<31528> +proj=utm +zone=28 +a=6378249.2 +b=6356515 +towgs84=-23,259,-9,0,0,0,0 +units=m +no_defs <> +# Conakry 1905 / UTM zone 29N +<31529> +proj=utm +zone=29 +a=6378249.2 +b=6356515 +towgs84=-23,259,-9,0,0,0,0 +units=m +no_defs <> +# Dealul Piscului 1930 / Stereo 33 +<31600> +proj=sterea +lat_0=45.9 +lon_0=25.39246588888889 +k=0.9996667 +x_0=500000 +y_0=500000 +ellps=intl +towgs84=103.25,-100.4,-307.19,0,0,0,0 +units=m +no_defs <> +# Dealul Piscului 1970/ Stereo 70 (deprecated) +<31700> +proj=sterea +lat_0=46 +lon_0=25 +k=0.99975 +x_0=500000 +y_0=500000 +ellps=krass +towgs84=28,-121,-77,0,0,0,0 +units=m +no_defs <> +# NGN / UTM zone 38N +<31838> +proj=utm +zone=38 +ellps=WGS84 +towgs84=-3.2,-5.7,2.8,0,0,0,0 +units=m +no_defs <> +# NGN / UTM zone 39N +<31839> +proj=utm +zone=39 +ellps=WGS84 +towgs84=-3.2,-5.7,2.8,0,0,0,0 +units=m +no_defs <> +# KUDAMS / KTM (deprecated) +<31900> +proj=tmerc +lat_0=0 +lon_0=48 +k=0.9996 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=-20.8,11.3,2.4,0,0,0,0 +units=m +no_defs <> +# KUDAMS / KTM +<31901> +proj=tmerc +lat_0=0 +lon_0=48 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=-20.8,11.3,2.4,0,0,0,0 +units=m +no_defs <> +# SIRGAS 2000 / UTM zone 11N +<31965> +proj=utm +zone=11 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# SIRGAS 2000 / UTM zone 12N +<31966> +proj=utm +zone=12 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# SIRGAS 2000 / UTM zone 13N +<31967> +proj=utm +zone=13 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# SIRGAS 2000 / UTM zone 14N +<31968> +proj=utm +zone=14 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# SIRGAS 2000 / UTM zone 15N +<31969> +proj=utm +zone=15 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# SIRGAS 2000 / UTM zone 16N +<31970> +proj=utm +zone=16 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# SIRGAS 2000 / UTM zone 17N +<31971> +proj=utm +zone=17 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# SIRGAS 2000 / UTM zone 18N +<31972> +proj=utm +zone=18 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# SIRGAS 2000 / UTM zone 19N +<31973> +proj=utm +zone=19 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# SIRGAS 2000 / UTM zone 20N +<31974> +proj=utm +zone=20 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# SIRGAS 2000 / UTM zone 21N +<31975> +proj=utm +zone=21 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# SIRGAS 2000 / UTM zone 22N +<31976> +proj=utm +zone=22 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# SIRGAS 2000 / UTM zone 17S +<31977> +proj=utm +zone=17 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# SIRGAS 2000 / UTM zone 18S +<31978> +proj=utm +zone=18 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# SIRGAS 2000 / UTM zone 19S +<31979> +proj=utm +zone=19 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# SIRGAS 2000 / UTM zone 20S +<31980> +proj=utm +zone=20 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# SIRGAS 2000 / UTM zone 21S +<31981> +proj=utm +zone=21 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# SIRGAS 2000 / UTM zone 22S +<31982> +proj=utm +zone=22 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# SIRGAS 2000 / UTM zone 23S +<31983> +proj=utm +zone=23 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# SIRGAS 2000 / UTM zone 24S +<31984> +proj=utm +zone=24 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# SIRGAS 2000 / UTM zone 25S +<31985> +proj=utm +zone=25 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# SIRGAS 1995 / UTM zone 17N +<31986> +proj=utm +zone=17 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# SIRGAS 1995 / UTM zone 18N +<31987> +proj=utm +zone=18 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# SIRGAS 1995 / UTM zone 19N +<31988> +proj=utm +zone=19 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# SIRGAS 1995 / UTM zone 20N +<31989> +proj=utm +zone=20 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# SIRGAS 1995 / UTM zone 21N +<31990> +proj=utm +zone=21 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# SIRGAS 1995 / UTM zone 22N +<31991> +proj=utm +zone=22 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# SIRGAS 1995 / UTM zone 17S +<31992> +proj=utm +zone=17 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# SIRGAS 1995 / UTM zone 18S +<31993> +proj=utm +zone=18 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# SIRGAS 1995 / UTM zone 19S +<31994> +proj=utm +zone=19 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# SIRGAS 1995 / UTM zone 20S +<31995> +proj=utm +zone=20 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# SIRGAS 1995 / UTM zone 21S +<31996> +proj=utm +zone=21 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# SIRGAS 1995 / UTM zone 22S +<31997> +proj=utm +zone=22 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# SIRGAS 1995 / UTM zone 23S +<31998> +proj=utm +zone=23 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# SIRGAS 1995 / UTM zone 24S +<31999> +proj=utm +zone=24 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# SIRGAS 1995 / UTM zone 25S +<32000> +proj=utm +zone=25 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD27 / Montana North +<32001> +proj=lcc +lat_1=48.71666666666667 +lat_2=47.85 +lat_0=47 +lon_0=-109.5 +x_0=609601.2192024384 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Montana Central +<32002> +proj=lcc +lat_1=47.88333333333333 +lat_2=46.45 +lat_0=45.83333333333334 +lon_0=-109.5 +x_0=609601.2192024384 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Montana South +<32003> +proj=lcc +lat_1=46.4 +lat_2=44.86666666666667 +lat_0=44 +lon_0=-109.5 +x_0=609601.2192024384 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Nebraska North +<32005> +proj=lcc +lat_1=41.85 +lat_2=42.81666666666667 +lat_0=41.33333333333334 +lon_0=-100 +x_0=609601.2192024384 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Nebraska South +<32006> +proj=lcc +lat_1=40.28333333333333 +lat_2=41.71666666666667 +lat_0=39.66666666666666 +lon_0=-99.5 +x_0=609601.2192024384 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Nevada East +<32007> +proj=tmerc +lat_0=34.75 +lon_0=-115.5833333333333 +k=0.9999 +x_0=152400.3048006096 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Nevada Central +<32008> +proj=tmerc +lat_0=34.75 +lon_0=-116.6666666666667 +k=0.9999 +x_0=152400.3048006096 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Nevada West +<32009> +proj=tmerc +lat_0=34.75 +lon_0=-118.5833333333333 +k=0.9999 +x_0=152400.3048006096 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / New Hampshire +<32010> +proj=tmerc +lat_0=42.5 +lon_0=-71.66666666666667 +k=0.999966667 +x_0=152400.3048006096 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / New Jersey +<32011> +proj=tmerc +lat_0=38.83333333333334 +lon_0=-74.66666666666667 +k=0.9999749999999999 +x_0=609601.2192024384 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / New Mexico East +<32012> +proj=tmerc +lat_0=31 +lon_0=-104.3333333333333 +k=0.999909091 +x_0=152400.3048006096 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / New Mexico Central +<32013> +proj=tmerc +lat_0=31 +lon_0=-106.25 +k=0.9999 +x_0=152400.3048006096 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / New Mexico West +<32014> +proj=tmerc +lat_0=31 +lon_0=-107.8333333333333 +k=0.999916667 +x_0=152400.3048006096 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / New York East +<32015> +proj=tmerc +lat_0=40 +lon_0=-74.33333333333333 +k=0.999966667 +x_0=152400.3048006096 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / New York Central +<32016> +proj=tmerc +lat_0=40 +lon_0=-76.58333333333333 +k=0.9999375 +x_0=152400.3048006096 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / New York West +<32017> +proj=tmerc +lat_0=40 +lon_0=-78.58333333333333 +k=0.9999375 +x_0=152400.3048006096 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / New York Long Island (deprecated) +<32018> +proj=lcc +lat_1=41.03333333333333 +lat_2=40.66666666666666 +lat_0=40.5 +lon_0=-74 +x_0=304800.6096012192 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / North Carolina +<32019> +proj=lcc +lat_1=34.33333333333334 +lat_2=36.16666666666666 +lat_0=33.75 +lon_0=-79 +x_0=609601.2192024384 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / North Dakota North +<32020> +proj=lcc +lat_1=47.43333333333333 +lat_2=48.73333333333333 +lat_0=47 +lon_0=-100.5 +x_0=609601.2192024384 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / North Dakota South +<32021> +proj=lcc +lat_1=46.18333333333333 +lat_2=47.48333333333333 +lat_0=45.66666666666666 +lon_0=-100.5 +x_0=609601.2192024384 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Ohio North +<32022> +proj=lcc +lat_1=40.43333333333333 +lat_2=41.7 +lat_0=39.66666666666666 +lon_0=-82.5 +x_0=609601.2192024384 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Ohio South +<32023> +proj=lcc +lat_1=38.73333333333333 +lat_2=40.03333333333333 +lat_0=38 +lon_0=-82.5 +x_0=609601.2192024384 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Oklahoma North +<32024> +proj=lcc +lat_1=35.56666666666667 +lat_2=36.76666666666667 +lat_0=35 +lon_0=-98 +x_0=609601.2192024384 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Oklahoma South +<32025> +proj=lcc +lat_1=33.93333333333333 +lat_2=35.23333333333333 +lat_0=33.33333333333334 +lon_0=-98 +x_0=609601.2192024384 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Oregon North +<32026> +proj=lcc +lat_1=44.33333333333334 +lat_2=46 +lat_0=43.66666666666666 +lon_0=-120.5 +x_0=609601.2192024384 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Oregon South +<32027> +proj=lcc +lat_1=42.33333333333334 +lat_2=44 +lat_0=41.66666666666666 +lon_0=-120.5 +x_0=609601.2192024384 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Pennsylvania North +<32028> +proj=lcc +lat_1=40.88333333333333 +lat_2=41.95 +lat_0=40.16666666666666 +lon_0=-77.75 +x_0=609601.2192024384 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Pennsylvania South (deprecated) +<32029> +proj=lcc +lat_1=39.93333333333333 +lat_2=40.8 +lat_0=39.33333333333334 +lon_0=-77.75 +x_0=609601.2192024384 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Rhode Island +<32030> +proj=tmerc +lat_0=41.08333333333334 +lon_0=-71.5 +k=0.9999938 +x_0=152400.3048006096 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / South Carolina North +<32031> +proj=lcc +lat_1=33.76666666666667 +lat_2=34.96666666666667 +lat_0=33 +lon_0=-81 +x_0=609601.2192024384 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / South Carolina South +<32033> +proj=lcc +lat_1=32.33333333333334 +lat_2=33.66666666666666 +lat_0=31.83333333333333 +lon_0=-81 +x_0=609601.2192024384 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / South Dakota North +<32034> +proj=lcc +lat_1=44.41666666666666 +lat_2=45.68333333333333 +lat_0=43.83333333333334 +lon_0=-100 +x_0=609601.2192024384 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / South Dakota South +<32035> +proj=lcc +lat_1=42.83333333333334 +lat_2=44.4 +lat_0=42.33333333333334 +lon_0=-100.3333333333333 +x_0=609601.2192024384 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Tennessee (deprecated) +<32036> +proj=lcc +lat_1=35.25 +lat_2=36.41666666666666 +lat_0=34.66666666666666 +lon_0=-86 +x_0=30480.06096012192 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Texas North +<32037> +proj=lcc +lat_1=34.65 +lat_2=36.18333333333333 +lat_0=34 +lon_0=-101.5 +x_0=609601.2192024384 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Texas North Central +<32038> +proj=lcc +lat_1=32.13333333333333 +lat_2=33.96666666666667 +lat_0=31.66666666666667 +lon_0=-97.5 +x_0=609601.2192024384 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Texas Central +<32039> +proj=lcc +lat_1=30.11666666666667 +lat_2=31.88333333333333 +lat_0=29.66666666666667 +lon_0=-100.3333333333333 +x_0=609601.2192024384 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Texas South Central +<32040> +proj=lcc +lat_1=28.38333333333333 +lat_2=30.28333333333333 +lat_0=27.83333333333333 +lon_0=-99 +x_0=609601.2192024384 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Texas South +<32041> +proj=lcc +lat_1=26.16666666666667 +lat_2=27.83333333333333 +lat_0=25.66666666666667 +lon_0=-98.5 +x_0=609601.2192024384 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Utah North +<32042> +proj=lcc +lat_1=40.71666666666667 +lat_2=41.78333333333333 +lat_0=40.33333333333334 +lon_0=-111.5 +x_0=609601.2192024384 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Utah Central +<32043> +proj=lcc +lat_1=39.01666666666667 +lat_2=40.65 +lat_0=38.33333333333334 +lon_0=-111.5 +x_0=609601.2192024384 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Utah South +<32044> +proj=lcc +lat_1=37.21666666666667 +lat_2=38.35 +lat_0=36.66666666666666 +lon_0=-111.5 +x_0=609601.2192024384 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Vermont +<32045> +proj=tmerc +lat_0=42.5 +lon_0=-72.5 +k=0.999964286 +x_0=152400.3048006096 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Virginia North +<32046> +proj=lcc +lat_1=38.03333333333333 +lat_2=39.2 +lat_0=37.66666666666666 +lon_0=-78.5 +x_0=609601.2192024384 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Virginia South +<32047> +proj=lcc +lat_1=36.76666666666667 +lat_2=37.96666666666667 +lat_0=36.33333333333334 +lon_0=-78.5 +x_0=609601.2192024384 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Washington North +<32048> +proj=lcc +lat_1=47.5 +lat_2=48.73333333333333 +lat_0=47 +lon_0=-120.8333333333333 +x_0=609601.2192024384 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Washington South +<32049> +proj=lcc +lat_1=45.83333333333334 +lat_2=47.33333333333334 +lat_0=45.33333333333334 +lon_0=-120.5 +x_0=609601.2192024384 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / West Virginia North +<32050> +proj=lcc +lat_1=39 +lat_2=40.25 +lat_0=38.5 +lon_0=-79.5 +x_0=609601.2192024384 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / West Virginia South +<32051> +proj=lcc +lat_1=37.48333333333333 +lat_2=38.88333333333333 +lat_0=37 +lon_0=-81 +x_0=609601.2192024384 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Wisconsin North +<32052> +proj=lcc +lat_1=45.56666666666667 +lat_2=46.76666666666667 +lat_0=45.16666666666666 +lon_0=-90 +x_0=609601.2192024384 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Wisconsin Central +<32053> +proj=lcc +lat_1=44.25 +lat_2=45.5 +lat_0=43.83333333333334 +lon_0=-90 +x_0=609601.2192024384 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Wisconsin South +<32054> +proj=lcc +lat_1=42.73333333333333 +lat_2=44.06666666666667 +lat_0=42 +lon_0=-90 +x_0=609601.2192024384 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Wyoming East +<32055> +proj=tmerc +lat_0=40.66666666666666 +lon_0=-105.1666666666667 +k=0.999941177 +x_0=152400.3048006096 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Wyoming East Central +<32056> +proj=tmerc +lat_0=40.66666666666666 +lon_0=-107.3333333333333 +k=0.999941177 +x_0=152400.3048006096 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Wyoming West Central +<32057> +proj=tmerc +lat_0=40.66666666666666 +lon_0=-108.75 +k=0.999941177 +x_0=152400.3048006096 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Wyoming West +<32058> +proj=tmerc +lat_0=40.66666666666666 +lon_0=-110.0833333333333 +k=0.999941177 +x_0=152400.3048006096 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / Guatemala Norte (deprecated) +<32061> +proj=lcc +lat_1=16.81666666666667 +lat_0=16.81666666666667 +lon_0=-90.33333333333333 +k_0=0.99992226 +x_0=500000 +y_0=292209.579 +datum=NAD27 +units=m +no_defs <> +# NAD27 / Guatemala Sur (deprecated) +<32062> +proj=lcc +lat_1=14.9 +lat_0=14.9 +lon_0=-90.33333333333333 +k_0=0.99989906 +x_0=500000 +y_0=325992.681 +datum=NAD27 +units=m +no_defs <> +# NAD27 / BLM 14N (ftUS) +<32064> +proj=tmerc +lat_0=0 +lon_0=-99 +k=0.9996 +x_0=500000.001016002 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / BLM 15N (ftUS) +<32065> +proj=tmerc +lat_0=0 +lon_0=-93 +k=0.9996 +x_0=500000.001016002 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / BLM 16N (ftUS) +<32066> +proj=tmerc +lat_0=0 +lon_0=-87 +k=0.9996 +x_0=500000.001016002 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / BLM 17N (ftUS) +<32067> +proj=tmerc +lat_0=0 +lon_0=-81 +k=0.9996 +x_0=500000.001016002 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / BLM 14N (feet) (deprecated) +<32074> +proj=tmerc +lat_0=0 +lon_0=-99 +k=0.9996 +x_0=500000.001016002 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / BLM 15N (feet) (deprecated) +<32075> +proj=tmerc +lat_0=0 +lon_0=-93 +k=0.9996 +x_0=500000.001016002 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / BLM 16N (feet) (deprecated) +<32076> +proj=tmerc +lat_0=0 +lon_0=-87 +k=0.9996 +x_0=500000.001016002 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / BLM 17N (feet) (deprecated) +<32077> +proj=tmerc +lat_0=0 +lon_0=-81 +k=0.9996 +x_0=500000.001016002 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD27 / MTM zone 1 +<32081> +proj=tmerc +lat_0=0 +lon_0=-53 +k=0.9999 +x_0=304800 +y_0=0 +datum=NAD27 +units=m +no_defs <> +# NAD27 / MTM zone 2 +<32082> +proj=tmerc +lat_0=0 +lon_0=-56 +k=0.9999 +x_0=304800 +y_0=0 +datum=NAD27 +units=m +no_defs <> +# NAD27 / MTM zone 3 +<32083> +proj=tmerc +lat_0=0 +lon_0=-58.5 +k=0.9999 +x_0=304800 +y_0=0 +datum=NAD27 +units=m +no_defs <> +# NAD27 / MTM zone 4 +<32084> +proj=tmerc +lat_0=0 +lon_0=-61.5 +k=0.9999 +x_0=304800 +y_0=0 +datum=NAD27 +units=m +no_defs <> +# NAD27 / MTM zone 5 +<32085> +proj=tmerc +lat_0=0 +lon_0=-64.5 +k=0.9999 +x_0=304800 +y_0=0 +datum=NAD27 +units=m +no_defs <> +# NAD27 / MTM zone 6 +<32086> +proj=tmerc +lat_0=0 +lon_0=-67.5 +k=0.9999 +x_0=304800 +y_0=0 +datum=NAD27 +units=m +no_defs <> +# NAD27 / Quebec Lambert +<32098> +proj=lcc +lat_1=60 +lat_2=46 +lat_0=44 +lon_0=-68.5 +x_0=0 +y_0=0 +datum=NAD27 +units=m +no_defs <> +# NAD27 / Louisiana Offshore +<32099> +proj=lcc +lat_1=27.83333333333333 +lat_2=26.16666666666667 +lat_0=25.66666666666667 +lon_0=-91.33333333333333 +x_0=609601.2192024384 +y_0=0 +datum=NAD27 +units=us-ft +no_defs <> +# NAD83 / Montana +<32100> +proj=lcc +lat_1=49 +lat_2=45 +lat_0=44.25 +lon_0=-109.5 +x_0=600000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Nebraska +<32104> +proj=lcc +lat_1=43 +lat_2=40 +lat_0=39.83333333333334 +lon_0=-100 +x_0=500000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Nevada East +<32107> +proj=tmerc +lat_0=34.75 +lon_0=-115.5833333333333 +k=0.9999 +x_0=200000 +y_0=8000000 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Nevada Central +<32108> +proj=tmerc +lat_0=34.75 +lon_0=-116.6666666666667 +k=0.9999 +x_0=500000 +y_0=6000000 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Nevada West +<32109> +proj=tmerc +lat_0=34.75 +lon_0=-118.5833333333333 +k=0.9999 +x_0=800000 +y_0=4000000 +datum=NAD83 +units=m +no_defs <> +# NAD83 / New Hampshire +<32110> +proj=tmerc +lat_0=42.5 +lon_0=-71.66666666666667 +k=0.999966667 +x_0=300000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / New Jersey +<32111> +proj=tmerc +lat_0=38.83333333333334 +lon_0=-74.5 +k=0.9999 +x_0=150000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / New Mexico East +<32112> +proj=tmerc +lat_0=31 +lon_0=-104.3333333333333 +k=0.999909091 +x_0=165000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / New Mexico Central +<32113> +proj=tmerc +lat_0=31 +lon_0=-106.25 +k=0.9999 +x_0=500000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / New Mexico West +<32114> +proj=tmerc +lat_0=31 +lon_0=-107.8333333333333 +k=0.999916667 +x_0=830000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / New York East +<32115> +proj=tmerc +lat_0=38.83333333333334 +lon_0=-74.5 +k=0.9999 +x_0=150000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / New York Central +<32116> +proj=tmerc +lat_0=40 +lon_0=-76.58333333333333 +k=0.9999375 +x_0=250000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / New York West +<32117> +proj=tmerc +lat_0=40 +lon_0=-78.58333333333333 +k=0.9999375 +x_0=350000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / New York Long Island +<32118> +proj=lcc +lat_1=41.03333333333333 +lat_2=40.66666666666666 +lat_0=40.16666666666666 +lon_0=-74 +x_0=300000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / North Carolina +<32119> +proj=lcc +lat_1=36.16666666666666 +lat_2=34.33333333333334 +lat_0=33.75 +lon_0=-79 +x_0=609601.22 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / North Dakota North +<32120> +proj=lcc +lat_1=48.73333333333333 +lat_2=47.43333333333333 +lat_0=47 +lon_0=-100.5 +x_0=600000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / North Dakota South +<32121> +proj=lcc +lat_1=47.48333333333333 +lat_2=46.18333333333333 +lat_0=45.66666666666666 +lon_0=-100.5 +x_0=600000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Ohio North +<32122> +proj=lcc +lat_1=41.7 +lat_2=40.43333333333333 +lat_0=39.66666666666666 +lon_0=-82.5 +x_0=600000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Ohio South +<32123> +proj=lcc +lat_1=40.03333333333333 +lat_2=38.73333333333333 +lat_0=38 +lon_0=-82.5 +x_0=600000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Oklahoma North +<32124> +proj=lcc +lat_1=36.76666666666667 +lat_2=35.56666666666667 +lat_0=35 +lon_0=-98 +x_0=600000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Oklahoma South +<32125> +proj=lcc +lat_1=35.23333333333333 +lat_2=33.93333333333333 +lat_0=33.33333333333334 +lon_0=-98 +x_0=600000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Oregon North +<32126> +proj=lcc +lat_1=46 +lat_2=44.33333333333334 +lat_0=43.66666666666666 +lon_0=-120.5 +x_0=2500000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Oregon South +<32127> +proj=lcc +lat_1=44 +lat_2=42.33333333333334 +lat_0=41.66666666666666 +lon_0=-120.5 +x_0=1500000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Pennsylvania North +<32128> +proj=lcc +lat_1=41.95 +lat_2=40.88333333333333 +lat_0=40.16666666666666 +lon_0=-77.75 +x_0=600000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Pennsylvania South +<32129> +proj=lcc +lat_1=40.96666666666667 +lat_2=39.93333333333333 +lat_0=39.33333333333334 +lon_0=-77.75 +x_0=600000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Rhode Island +<32130> +proj=tmerc +lat_0=41.08333333333334 +lon_0=-71.5 +k=0.99999375 +x_0=100000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / South Carolina +<32133> +proj=lcc +lat_1=34.83333333333334 +lat_2=32.5 +lat_0=31.83333333333333 +lon_0=-81 +x_0=609600 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / South Dakota North +<32134> +proj=lcc +lat_1=45.68333333333333 +lat_2=44.41666666666666 +lat_0=43.83333333333334 +lon_0=-100 +x_0=600000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / South Dakota South +<32135> +proj=lcc +lat_1=44.4 +lat_2=42.83333333333334 +lat_0=42.33333333333334 +lon_0=-100.3333333333333 +x_0=600000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Tennessee +<32136> +proj=lcc +lat_1=36.41666666666666 +lat_2=35.25 +lat_0=34.33333333333334 +lon_0=-86 +x_0=600000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Texas North +<32137> +proj=lcc +lat_1=36.18333333333333 +lat_2=34.65 +lat_0=34 +lon_0=-101.5 +x_0=200000 +y_0=1000000 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Texas North Central +<32138> +proj=lcc +lat_1=33.96666666666667 +lat_2=32.13333333333333 +lat_0=31.66666666666667 +lon_0=-98.5 +x_0=600000 +y_0=2000000 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Texas Central +<32139> +proj=lcc +lat_1=31.88333333333333 +lat_2=30.11666666666667 +lat_0=29.66666666666667 +lon_0=-100.3333333333333 +x_0=700000 +y_0=3000000 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Texas South Central +<32140> +proj=lcc +lat_1=30.28333333333333 +lat_2=28.38333333333333 +lat_0=27.83333333333333 +lon_0=-99 +x_0=600000 +y_0=4000000 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Texas South +<32141> +proj=lcc +lat_1=27.83333333333333 +lat_2=26.16666666666667 +lat_0=25.66666666666667 +lon_0=-98.5 +x_0=300000 +y_0=5000000 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Utah North +<32142> +proj=lcc +lat_1=41.78333333333333 +lat_2=40.71666666666667 +lat_0=40.33333333333334 +lon_0=-111.5 +x_0=500000 +y_0=1000000 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Utah Central +<32143> +proj=lcc +lat_1=40.65 +lat_2=39.01666666666667 +lat_0=38.33333333333334 +lon_0=-111.5 +x_0=500000 +y_0=2000000 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Utah South +<32144> +proj=lcc +lat_1=38.35 +lat_2=37.21666666666667 +lat_0=36.66666666666666 +lon_0=-111.5 +x_0=500000 +y_0=3000000 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Vermont +<32145> +proj=tmerc +lat_0=42.5 +lon_0=-72.5 +k=0.999964286 +x_0=500000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Virginia North +<32146> +proj=lcc +lat_1=39.2 +lat_2=38.03333333333333 +lat_0=37.66666666666666 +lon_0=-78.5 +x_0=3500000 +y_0=2000000 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Virginia South +<32147> +proj=lcc +lat_1=37.96666666666667 +lat_2=36.76666666666667 +lat_0=36.33333333333334 +lon_0=-78.5 +x_0=3500000 +y_0=1000000 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Washington North +<32148> +proj=lcc +lat_1=48.73333333333333 +lat_2=47.5 +lat_0=47 +lon_0=-120.8333333333333 +x_0=500000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Washington South +<32149> +proj=lcc +lat_1=47.33333333333334 +lat_2=45.83333333333334 +lat_0=45.33333333333334 +lon_0=-120.5 +x_0=500000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / West Virginia North +<32150> +proj=lcc +lat_1=40.25 +lat_2=39 +lat_0=38.5 +lon_0=-79.5 +x_0=600000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / West Virginia South +<32151> +proj=lcc +lat_1=38.88333333333333 +lat_2=37.48333333333333 +lat_0=37 +lon_0=-81 +x_0=600000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Wisconsin North +<32152> +proj=lcc +lat_1=46.76666666666667 +lat_2=45.56666666666667 +lat_0=45.16666666666666 +lon_0=-90 +x_0=600000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Wisconsin Central +<32153> +proj=lcc +lat_1=45.5 +lat_2=44.25 +lat_0=43.83333333333334 +lon_0=-90 +x_0=600000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Wisconsin South +<32154> +proj=lcc +lat_1=44.06666666666667 +lat_2=42.73333333333333 +lat_0=42 +lon_0=-90 +x_0=600000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Wyoming East +<32155> +proj=tmerc +lat_0=40.5 +lon_0=-105.1666666666667 +k=0.9999375 +x_0=200000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Wyoming East Central +<32156> +proj=tmerc +lat_0=40.5 +lon_0=-107.3333333333333 +k=0.9999375 +x_0=400000 +y_0=100000 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Wyoming West Central +<32157> +proj=tmerc +lat_0=40.5 +lon_0=-108.75 +k=0.9999375 +x_0=600000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Wyoming West +<32158> +proj=tmerc +lat_0=40.5 +lon_0=-110.0833333333333 +k=0.9999375 +x_0=800000 +y_0=100000 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Puerto Rico & Virgin Is. +<32161> +proj=lcc +lat_1=18.43333333333333 +lat_2=18.03333333333333 +lat_0=17.83333333333333 +lon_0=-66.43333333333334 +x_0=200000 +y_0=200000 +datum=NAD83 +units=m +no_defs <> +# NAD83 / BLM 14N (ftUS) +<32164> +proj=tmerc +lat_0=0 +lon_0=-99 +k=0.9996 +x_0=500000.001016002 +y_0=0 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / BLM 15N (ftUS) +<32165> +proj=tmerc +lat_0=0 +lon_0=-93 +k=0.9996 +x_0=500000.001016002 +y_0=0 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / BLM 16N (ftUS) +<32166> +proj=tmerc +lat_0=0 +lon_0=-87 +k=0.9996 +x_0=500000.001016002 +y_0=0 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / BLM 17N (ftUS) +<32167> +proj=tmerc +lat_0=0 +lon_0=-81 +k=0.9996 +x_0=500000.001016002 +y_0=0 +datum=NAD83 +units=us-ft +no_defs <> +# NAD83 / SCoPQ zone 2 (deprecated) +<32180> +proj=tmerc +lat_0=0 +lon_0=-55.5 +k=0.9999 +x_0=304800 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / MTM zone 1 +<32181> +proj=tmerc +lat_0=0 +lon_0=-53 +k=0.9999 +x_0=304800 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / MTM zone 2 +<32182> +proj=tmerc +lat_0=0 +lon_0=-56 +k=0.9999 +x_0=304800 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / MTM zone 3 +<32183> +proj=tmerc +lat_0=0 +lon_0=-58.5 +k=0.9999 +x_0=304800 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / MTM zone 4 +<32184> +proj=tmerc +lat_0=0 +lon_0=-61.5 +k=0.9999 +x_0=304800 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / MTM zone 5 +<32185> +proj=tmerc +lat_0=0 +lon_0=-64.5 +k=0.9999 +x_0=304800 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / MTM zone 6 +<32186> +proj=tmerc +lat_0=0 +lon_0=-67.5 +k=0.9999 +x_0=304800 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / MTM zone 7 +<32187> +proj=tmerc +lat_0=0 +lon_0=-70.5 +k=0.9999 +x_0=304800 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / MTM zone 8 +<32188> +proj=tmerc +lat_0=0 +lon_0=-73.5 +k=0.9999 +x_0=304800 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / MTM zone 9 +<32189> +proj=tmerc +lat_0=0 +lon_0=-76.5 +k=0.9999 +x_0=304800 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / MTM zone 10 +<32190> +proj=tmerc +lat_0=0 +lon_0=-79.5 +k=0.9999 +x_0=304800 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / MTM zone 11 +<32191> +proj=tmerc +lat_0=0 +lon_0=-82.5 +k=0.9999 +x_0=304800 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / MTM zone 12 +<32192> +proj=tmerc +lat_0=0 +lon_0=-81 +k=0.9999 +x_0=304800 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / MTM zone 13 +<32193> +proj=tmerc +lat_0=0 +lon_0=-84 +k=0.9999 +x_0=304800 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / MTM zone 14 +<32194> +proj=tmerc +lat_0=0 +lon_0=-87 +k=0.9999 +x_0=304800 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / MTM zone 15 +<32195> +proj=tmerc +lat_0=0 +lon_0=-90 +k=0.9999 +x_0=304800 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / MTM zone 16 +<32196> +proj=tmerc +lat_0=0 +lon_0=-93 +k=0.9999 +x_0=304800 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / MTM zone 17 +<32197> +proj=tmerc +lat_0=0 +lon_0=-96 +k=0.9999 +x_0=304800 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Quebec Lambert +<32198> +proj=lcc +lat_1=60 +lat_2=46 +lat_0=44 +lon_0=-68.5 +x_0=0 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Louisiana Offshore +<32199> +proj=lcc +lat_1=27.83333333333333 +lat_2=26.16666666666667 +lat_0=25.5 +lon_0=-91.33333333333333 +x_0=1000000 +y_0=0 +datum=NAD83 +units=m +no_defs <> +# WGS 72 / UTM zone 1N +<32201> +proj=utm +zone=1 +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 2N +<32202> +proj=utm +zone=2 +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 3N +<32203> +proj=utm +zone=3 +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 4N +<32204> +proj=utm +zone=4 +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 5N +<32205> +proj=utm +zone=5 +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 6N +<32206> +proj=utm +zone=6 +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 7N +<32207> +proj=utm +zone=7 +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 8N +<32208> +proj=utm +zone=8 +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 9N +<32209> +proj=utm +zone=9 +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 10N +<32210> +proj=utm +zone=10 +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 11N +<32211> +proj=utm +zone=11 +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 12N +<32212> +proj=utm +zone=12 +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 13N +<32213> +proj=utm +zone=13 +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 14N +<32214> +proj=utm +zone=14 +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 15N +<32215> +proj=utm +zone=15 +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 16N +<32216> +proj=utm +zone=16 +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 17N +<32217> +proj=utm +zone=17 +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 18N +<32218> +proj=utm +zone=18 +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 19N +<32219> +proj=utm +zone=19 +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 20N +<32220> +proj=utm +zone=20 +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 21N +<32221> +proj=utm +zone=21 +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 22N +<32222> +proj=utm +zone=22 +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 23N +<32223> +proj=utm +zone=23 +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 24N +<32224> +proj=utm +zone=24 +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 25N +<32225> +proj=utm +zone=25 +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 26N +<32226> +proj=utm +zone=26 +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 27N +<32227> +proj=utm +zone=27 +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 28N +<32228> +proj=utm +zone=28 +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 29N +<32229> +proj=utm +zone=29 +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 30N +<32230> +proj=utm +zone=30 +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 31N +<32231> +proj=utm +zone=31 +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 32N +<32232> +proj=utm +zone=32 +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 33N +<32233> +proj=utm +zone=33 +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 34N +<32234> +proj=utm +zone=34 +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 35N +<32235> +proj=utm +zone=35 +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 36N +<32236> +proj=utm +zone=36 +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 37N +<32237> +proj=utm +zone=37 +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 38N +<32238> +proj=utm +zone=38 +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 39N +<32239> +proj=utm +zone=39 +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 40N +<32240> +proj=utm +zone=40 +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 41N +<32241> +proj=utm +zone=41 +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 42N +<32242> +proj=utm +zone=42 +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 43N +<32243> +proj=utm +zone=43 +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 44N +<32244> +proj=utm +zone=44 +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 45N +<32245> +proj=utm +zone=45 +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 46N +<32246> +proj=utm +zone=46 +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 47N +<32247> +proj=utm +zone=47 +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 48N +<32248> +proj=utm +zone=48 +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 49N +<32249> +proj=utm +zone=49 +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 50N +<32250> +proj=utm +zone=50 +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 51N +<32251> +proj=utm +zone=51 +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 52N +<32252> +proj=utm +zone=52 +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 53N +<32253> +proj=utm +zone=53 +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 54N +<32254> +proj=utm +zone=54 +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 55N +<32255> +proj=utm +zone=55 +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 56N +<32256> +proj=utm +zone=56 +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 57N +<32257> +proj=utm +zone=57 +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 58N +<32258> +proj=utm +zone=58 +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 59N +<32259> +proj=utm +zone=59 +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 60N +<32260> +proj=utm +zone=60 +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 1S +<32301> +proj=utm +zone=1 +south +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 2S +<32302> +proj=utm +zone=2 +south +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 3S +<32303> +proj=utm +zone=3 +south +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 4S +<32304> +proj=utm +zone=4 +south +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 5S +<32305> +proj=utm +zone=5 +south +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 6S +<32306> +proj=utm +zone=6 +south +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 7S +<32307> +proj=utm +zone=7 +south +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 8S +<32308> +proj=utm +zone=8 +south +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 9S +<32309> +proj=utm +zone=9 +south +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 10S +<32310> +proj=utm +zone=10 +south +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 11S +<32311> +proj=utm +zone=11 +south +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 12S +<32312> +proj=utm +zone=12 +south +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 13S +<32313> +proj=utm +zone=13 +south +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 14S +<32314> +proj=utm +zone=14 +south +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 15S +<32315> +proj=utm +zone=15 +south +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 16S +<32316> +proj=utm +zone=16 +south +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 17S +<32317> +proj=utm +zone=17 +south +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 18S +<32318> +proj=utm +zone=18 +south +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 19S +<32319> +proj=utm +zone=19 +south +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 20S +<32320> +proj=utm +zone=20 +south +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 21S +<32321> +proj=utm +zone=21 +south +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 22S +<32322> +proj=utm +zone=22 +south +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 23S +<32323> +proj=utm +zone=23 +south +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 24S +<32324> +proj=utm +zone=24 +south +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 25S +<32325> +proj=utm +zone=25 +south +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 26S +<32326> +proj=utm +zone=26 +south +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 27S +<32327> +proj=utm +zone=27 +south +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 28S +<32328> +proj=utm +zone=28 +south +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 29S +<32329> +proj=utm +zone=29 +south +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 30S +<32330> +proj=utm +zone=30 +south +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 31S +<32331> +proj=utm +zone=31 +south +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 32S +<32332> +proj=utm +zone=32 +south +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 33S +<32333> +proj=utm +zone=33 +south +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 34S +<32334> +proj=utm +zone=34 +south +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 35S +<32335> +proj=utm +zone=35 +south +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 36S +<32336> +proj=utm +zone=36 +south +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 37S +<32337> +proj=utm +zone=37 +south +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 38S +<32338> +proj=utm +zone=38 +south +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 39S +<32339> +proj=utm +zone=39 +south +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 40S +<32340> +proj=utm +zone=40 +south +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 41S +<32341> +proj=utm +zone=41 +south +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 42S +<32342> +proj=utm +zone=42 +south +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 43S +<32343> +proj=utm +zone=43 +south +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 44S +<32344> +proj=utm +zone=44 +south +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 45S +<32345> +proj=utm +zone=45 +south +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 46S +<32346> +proj=utm +zone=46 +south +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 47S +<32347> +proj=utm +zone=47 +south +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 48S +<32348> +proj=utm +zone=48 +south +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 49S +<32349> +proj=utm +zone=49 +south +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 50S +<32350> +proj=utm +zone=50 +south +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 51S +<32351> +proj=utm +zone=51 +south +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 52S +<32352> +proj=utm +zone=52 +south +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 53S +<32353> +proj=utm +zone=53 +south +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 54S +<32354> +proj=utm +zone=54 +south +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 55S +<32355> +proj=utm +zone=55 +south +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 56S +<32356> +proj=utm +zone=56 +south +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 57S +<32357> +proj=utm +zone=57 +south +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 58S +<32358> +proj=utm +zone=58 +south +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 59S +<32359> +proj=utm +zone=59 +south +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72 / UTM zone 60S +<32360> +proj=utm +zone=60 +south +ellps=WGS72 +towgs84=0,0,4.5,0,0,0.554,0.2263 +units=m +no_defs <> +# WGS 72BE / UTM zone 1N +<32401> +proj=utm +zone=1 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 2N +<32402> +proj=utm +zone=2 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 3N +<32403> +proj=utm +zone=3 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 4N +<32404> +proj=utm +zone=4 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 5N +<32405> +proj=utm +zone=5 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 6N +<32406> +proj=utm +zone=6 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 7N +<32407> +proj=utm +zone=7 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 8N +<32408> +proj=utm +zone=8 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 9N +<32409> +proj=utm +zone=9 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 10N +<32410> +proj=utm +zone=10 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 11N +<32411> +proj=utm +zone=11 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 12N +<32412> +proj=utm +zone=12 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 13N +<32413> +proj=utm +zone=13 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 14N +<32414> +proj=utm +zone=14 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 15N +<32415> +proj=utm +zone=15 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 16N +<32416> +proj=utm +zone=16 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 17N +<32417> +proj=utm +zone=17 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 18N +<32418> +proj=utm +zone=18 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 19N +<32419> +proj=utm +zone=19 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 20N +<32420> +proj=utm +zone=20 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 21N +<32421> +proj=utm +zone=21 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 22N +<32422> +proj=utm +zone=22 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 23N +<32423> +proj=utm +zone=23 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 24N +<32424> +proj=utm +zone=24 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 25N +<32425> +proj=utm +zone=25 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 26N +<32426> +proj=utm +zone=26 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 27N +<32427> +proj=utm +zone=27 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 28N +<32428> +proj=utm +zone=28 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 29N +<32429> +proj=utm +zone=29 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 30N +<32430> +proj=utm +zone=30 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 31N +<32431> +proj=utm +zone=31 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 32N +<32432> +proj=utm +zone=32 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 33N +<32433> +proj=utm +zone=33 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 34N +<32434> +proj=utm +zone=34 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 35N +<32435> +proj=utm +zone=35 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 36N +<32436> +proj=utm +zone=36 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 37N +<32437> +proj=utm +zone=37 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 38N +<32438> +proj=utm +zone=38 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 39N +<32439> +proj=utm +zone=39 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 40N +<32440> +proj=utm +zone=40 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 41N +<32441> +proj=utm +zone=41 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 42N +<32442> +proj=utm +zone=42 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 43N +<32443> +proj=utm +zone=43 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 44N +<32444> +proj=utm +zone=44 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 45N +<32445> +proj=utm +zone=45 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 46N +<32446> +proj=utm +zone=46 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 47N +<32447> +proj=utm +zone=47 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 48N +<32448> +proj=utm +zone=48 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 49N +<32449> +proj=utm +zone=49 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 50N +<32450> +proj=utm +zone=50 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 51N +<32451> +proj=utm +zone=51 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 52N +<32452> +proj=utm +zone=52 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 53N +<32453> +proj=utm +zone=53 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 54N +<32454> +proj=utm +zone=54 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 55N +<32455> +proj=utm +zone=55 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 56N +<32456> +proj=utm +zone=56 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 57N +<32457> +proj=utm +zone=57 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 58N +<32458> +proj=utm +zone=58 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 59N +<32459> +proj=utm +zone=59 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 60N +<32460> +proj=utm +zone=60 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 1S +<32501> +proj=utm +zone=1 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 2S +<32502> +proj=utm +zone=2 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 3S +<32503> +proj=utm +zone=3 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 4S +<32504> +proj=utm +zone=4 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 5S +<32505> +proj=utm +zone=5 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 6S +<32506> +proj=utm +zone=6 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 7S +<32507> +proj=utm +zone=7 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 8S +<32508> +proj=utm +zone=8 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 9S +<32509> +proj=utm +zone=9 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 10S +<32510> +proj=utm +zone=10 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 11S +<32511> +proj=utm +zone=11 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 12S +<32512> +proj=utm +zone=12 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 13S +<32513> +proj=utm +zone=13 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 14S +<32514> +proj=utm +zone=14 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 15S +<32515> +proj=utm +zone=15 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 16S +<32516> +proj=utm +zone=16 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 17S +<32517> +proj=utm +zone=17 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 18S +<32518> +proj=utm +zone=18 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 19S +<32519> +proj=utm +zone=19 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 20S +<32520> +proj=utm +zone=20 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 21S +<32521> +proj=utm +zone=21 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 22S +<32522> +proj=utm +zone=22 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 23S +<32523> +proj=utm +zone=23 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 24S +<32524> +proj=utm +zone=24 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 25S +<32525> +proj=utm +zone=25 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 26S +<32526> +proj=utm +zone=26 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 27S +<32527> +proj=utm +zone=27 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 28S +<32528> +proj=utm +zone=28 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 29S +<32529> +proj=utm +zone=29 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 30S +<32530> +proj=utm +zone=30 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 31S +<32531> +proj=utm +zone=31 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 32S +<32532> +proj=utm +zone=32 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 33S +<32533> +proj=utm +zone=33 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 34S +<32534> +proj=utm +zone=34 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 35S +<32535> +proj=utm +zone=35 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 36S +<32536> +proj=utm +zone=36 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 37S +<32537> +proj=utm +zone=37 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 38S +<32538> +proj=utm +zone=38 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 39S +<32539> +proj=utm +zone=39 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 40S +<32540> +proj=utm +zone=40 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 41S +<32541> +proj=utm +zone=41 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 42S +<32542> +proj=utm +zone=42 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 43S +<32543> +proj=utm +zone=43 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 44S +<32544> +proj=utm +zone=44 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 45S +<32545> +proj=utm +zone=45 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 46S +<32546> +proj=utm +zone=46 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 47S +<32547> +proj=utm +zone=47 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 48S +<32548> +proj=utm +zone=48 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 49S +<32549> +proj=utm +zone=49 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 50S +<32550> +proj=utm +zone=50 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 51S +<32551> +proj=utm +zone=51 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 52S +<32552> +proj=utm +zone=52 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 53S +<32553> +proj=utm +zone=53 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 54S +<32554> +proj=utm +zone=54 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 55S +<32555> +proj=utm +zone=55 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 56S +<32556> +proj=utm +zone=56 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 57S +<32557> +proj=utm +zone=57 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 58S +<32558> +proj=utm +zone=58 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 59S +<32559> +proj=utm +zone=59 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 60S +<32560> +proj=utm +zone=60 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 84 / UTM grid system (northern hemisphere) +# Unable to translate coordinate system EPSG:32600 into PROJ.4 format. +# +# WGS 84 / UTM zone 1N +<32601> +proj=utm +zone=1 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 2N +<32602> +proj=utm +zone=2 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 3N +<32603> +proj=utm +zone=3 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 4N +<32604> +proj=utm +zone=4 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 5N +<32605> +proj=utm +zone=5 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 6N +<32606> +proj=utm +zone=6 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 7N +<32607> +proj=utm +zone=7 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 8N +<32608> +proj=utm +zone=8 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 9N +<32609> +proj=utm +zone=9 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 10N +<32610> +proj=utm +zone=10 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 11N +<32611> +proj=utm +zone=11 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 12N +<32612> +proj=utm +zone=12 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 13N +<32613> +proj=utm +zone=13 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 14N +<32614> +proj=utm +zone=14 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 15N +<32615> +proj=utm +zone=15 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 16N +<32616> +proj=utm +zone=16 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 17N +<32617> +proj=utm +zone=17 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 18N +<32618> +proj=utm +zone=18 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 19N +<32619> +proj=utm +zone=19 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 20N +<32620> +proj=utm +zone=20 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 21N +<32621> +proj=utm +zone=21 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 22N +<32622> +proj=utm +zone=22 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 23N +<32623> +proj=utm +zone=23 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 24N +<32624> +proj=utm +zone=24 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 25N +<32625> +proj=utm +zone=25 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 26N +<32626> +proj=utm +zone=26 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 27N +<32627> +proj=utm +zone=27 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 28N +<32628> +proj=utm +zone=28 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 29N +<32629> +proj=utm +zone=29 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 30N +<32630> +proj=utm +zone=30 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 31N +<32631> +proj=utm +zone=31 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 32N +<32632> +proj=utm +zone=32 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 33N +<32633> +proj=utm +zone=33 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 34N +<32634> +proj=utm +zone=34 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 35N +<32635> +proj=utm +zone=35 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 36N +<32636> +proj=utm +zone=36 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 37N +<32637> +proj=utm +zone=37 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 38N +<32638> +proj=utm +zone=38 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 39N +<32639> +proj=utm +zone=39 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 40N +<32640> +proj=utm +zone=40 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 41N +<32641> +proj=utm +zone=41 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 42N +<32642> +proj=utm +zone=42 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 43N +<32643> +proj=utm +zone=43 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 44N +<32644> +proj=utm +zone=44 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 45N +<32645> +proj=utm +zone=45 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 46N +<32646> +proj=utm +zone=46 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 47N +<32647> +proj=utm +zone=47 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 48N +<32648> +proj=utm +zone=48 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 49N +<32649> +proj=utm +zone=49 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 50N +<32650> +proj=utm +zone=50 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 51N +<32651> +proj=utm +zone=51 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 52N +<32652> +proj=utm +zone=52 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 53N +<32653> +proj=utm +zone=53 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 54N +<32654> +proj=utm +zone=54 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 55N +<32655> +proj=utm +zone=55 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 56N +<32656> +proj=utm +zone=56 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 57N +<32657> +proj=utm +zone=57 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 58N +<32658> +proj=utm +zone=58 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 59N +<32659> +proj=utm +zone=59 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 60N +<32660> +proj=utm +zone=60 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UPS North (N,E) +<32661> +proj=stere +lat_0=90 +lat_ts=90 +lon_0=0 +k=0.994 +x_0=2000000 +y_0=2000000 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / Plate Carree (deprecated) +<32662> +proj=eqc +lat_ts=0 +lat_0=0 +lon_0=0 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / World Equidistant Cylindrical (deprecated) +<32663> +proj=eqc +lat_ts=0 +lat_0=0 +lon_0=0 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / BLM 14N (ftUS) +<32664> +proj=tmerc +lat_0=0 +lon_0=-99 +k=0.9996 +x_0=500000.001016002 +y_0=0 +datum=WGS84 +units=us-ft +no_defs <> +# WGS 84 / BLM 15N (ftUS) +<32665> +proj=tmerc +lat_0=0 +lon_0=-93 +k=0.9996 +x_0=500000.001016002 +y_0=0 +datum=WGS84 +units=us-ft +no_defs <> +# WGS 84 / BLM 16N (ftUS) +<32666> +proj=tmerc +lat_0=0 +lon_0=-87 +k=0.9996 +x_0=500000.001016002 +y_0=0 +datum=WGS84 +units=us-ft +no_defs <> +# WGS 84 / BLM 17N (ftUS) +<32667> +proj=tmerc +lat_0=0 +lon_0=-81 +k=0.9996 +x_0=500000.001016002 +y_0=0 +datum=WGS84 +units=us-ft +no_defs <> +# WGS 84 / UTM grid system (southern hemisphere) +# Unable to translate coordinate system EPSG:32700 into PROJ.4 format. +# +# WGS 84 / UTM zone 1S +<32701> +proj=utm +zone=1 +south +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 2S +<32702> +proj=utm +zone=2 +south +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 3S +<32703> +proj=utm +zone=3 +south +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 4S +<32704> +proj=utm +zone=4 +south +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 5S +<32705> +proj=utm +zone=5 +south +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 6S +<32706> +proj=utm +zone=6 +south +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 7S +<32707> +proj=utm +zone=7 +south +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 8S +<32708> +proj=utm +zone=8 +south +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 9S +<32709> +proj=utm +zone=9 +south +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 10S +<32710> +proj=utm +zone=10 +south +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 11S +<32711> +proj=utm +zone=11 +south +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 12S +<32712> +proj=utm +zone=12 +south +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 13S +<32713> +proj=utm +zone=13 +south +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 14S +<32714> +proj=utm +zone=14 +south +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 15S +<32715> +proj=utm +zone=15 +south +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 16S +<32716> +proj=utm +zone=16 +south +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 17S +<32717> +proj=utm +zone=17 +south +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 18S +<32718> +proj=utm +zone=18 +south +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 19S +<32719> +proj=utm +zone=19 +south +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 20S +<32720> +proj=utm +zone=20 +south +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 21S +<32721> +proj=utm +zone=21 +south +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 22S +<32722> +proj=utm +zone=22 +south +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 23S +<32723> +proj=utm +zone=23 +south +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 24S +<32724> +proj=utm +zone=24 +south +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 25S +<32725> +proj=utm +zone=25 +south +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 26S +<32726> +proj=utm +zone=26 +south +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 27S +<32727> +proj=utm +zone=27 +south +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 28S +<32728> +proj=utm +zone=28 +south +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 29S +<32729> +proj=utm +zone=29 +south +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 30S +<32730> +proj=utm +zone=30 +south +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 31S +<32731> +proj=utm +zone=31 +south +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 32S +<32732> +proj=utm +zone=32 +south +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 33S +<32733> +proj=utm +zone=33 +south +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 34S +<32734> +proj=utm +zone=34 +south +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 35S +<32735> +proj=utm +zone=35 +south +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 36S +<32736> +proj=utm +zone=36 +south +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 37S +<32737> +proj=utm +zone=37 +south +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 38S +<32738> +proj=utm +zone=38 +south +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 39S +<32739> +proj=utm +zone=39 +south +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 40S +<32740> +proj=utm +zone=40 +south +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 41S +<32741> +proj=utm +zone=41 +south +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 42S +<32742> +proj=utm +zone=42 +south +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 43S +<32743> +proj=utm +zone=43 +south +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 44S +<32744> +proj=utm +zone=44 +south +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 45S +<32745> +proj=utm +zone=45 +south +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 46S +<32746> +proj=utm +zone=46 +south +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 47S +<32747> +proj=utm +zone=47 +south +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 48S +<32748> +proj=utm +zone=48 +south +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 49S +<32749> +proj=utm +zone=49 +south +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 50S +<32750> +proj=utm +zone=50 +south +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 51S +<32751> +proj=utm +zone=51 +south +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 52S +<32752> +proj=utm +zone=52 +south +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 53S +<32753> +proj=utm +zone=53 +south +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 54S +<32754> +proj=utm +zone=54 +south +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 55S +<32755> +proj=utm +zone=55 +south +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 56S +<32756> +proj=utm +zone=56 +south +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 57S +<32757> +proj=utm +zone=57 +south +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 58S +<32758> +proj=utm +zone=58 +south +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 59S +<32759> +proj=utm +zone=59 +south +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 60S +<32760> +proj=utm +zone=60 +south +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UPS South (N,E) +<32761> +proj=stere +lat_0=-90 +lat_ts=-90 +lon_0=0 +k=0.994 +x_0=2000000 +y_0=2000000 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / TM 36 SE +<32766> +proj=tmerc +lat_0=0 +lon_0=36 +k=0.9996 +x_0=500000 +y_0=10000000 +datum=WGS84 +units=m +no_defs <> +# TWD97 +<3822> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# IGRS +<3887> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# MOLDREF99 +<4000> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# RGRDC 2005 +<4039> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# SREF98 +<4073> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# REGCAN95 +<4079> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# WGS 84 (geocentric) +<4328> +proj=geocent +datum=WGS84 +units=m +no_defs <> +# ITRF88 (geocentric) +<4330> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# ITRF89 (geocentric) +<4331> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# ITRF90 (geocentric) +<4332> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# ITRF91 (geocentric) +<4333> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# ITRF92 (geocentric) +<4334> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# ITRF93 (geocentric) +<4335> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# ITRF94 (geocentric) +<4336> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# ITRF96 (geocentric) +<4337> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# ITRF97 (geocentric) +<4338> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# Australian Antarctic (geocentric) +<4340> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# EST97 (geocentric) +<4342> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# CHTRF95 (geocentric) +<4344> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# ETRS89 (geocentric) +<4346> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# GDA94 (geocentric) +<4348> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# Hartebeesthoek94 (geocentric) +<4350> +proj=geocent +ellps=WGS84 +units=m +no_defs <> +# IRENET95 (geocentric) +<4352> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# JGD2000 (geocentric) +<4354> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# LKS94 (ETRS89) (geocentric) +<4356> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# Moznet (geocentric) +<4358> +proj=geocent +ellps=WGS84 +units=m +no_defs <> +# NAD83(CSRS) (geocentric) +<4360> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# NAD83(HARN) (geocentric) +<4362> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# NZGD2000 (geocentric) +<4364> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# POSGAR 98 (geocentric) +<4366> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# REGVEN (geocentric) +<4368> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# RGF93 (geocentric) +<4370> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# RGFG95 (geocentric) +<4372> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# RGR92 (geocentric) +<4374> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# SIRGAS (geocentric) +<4376> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# SWEREF99 (geocentric) +<4378> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# Yemen NGN96 (geocentric) +<4380> +proj=geocent +ellps=WGS84 +units=m +no_defs <> +# RGNC 1991 (geocentric) +<4382> +proj=geocent +ellps=intl +units=m +no_defs <> +# RRAF 1991 (geocentric) +<4384> +proj=geocent +ellps=WGS84 +units=m +no_defs <> +# ITRF2000 (geocentric) +<4385> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# ISN93 (geocentric) +<4387> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# LKS92 (geocentric) +<4389> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# RGSPM06 +<4465> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# RGM04 +<4468> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# Cadastre 1997 +<4473> +proj=geocent +ellps=intl +units=m +no_defs <> +# China Geodetic Coordinate System 2000 +<4479> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# Mexico ITRF92 +<4481> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# RRAF 1991 +<4556> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# Slovenia 1996 +<4882> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# RSRGD2000 +<4884> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# BDA2000 +<4886> +proj=geocent +ellps=WGS84 +units=m +no_defs <> +# HTRS96 +<4888> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# WGS 66 +<4890> +proj=geocent +ellps=WGS66 +units=m +no_defs <> +# NAD83(NSRS2007) +<4892> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# JAD2001 +<4894> +proj=geocent +ellps=WGS84 +units=m +no_defs <> +# ITRF2005 +<4896> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# DGN95 +<4897> +proj=geocent +ellps=WGS84 +units=m +no_defs <> +# LGD2006 +<4899> +proj=geocent +ellps=intl +units=m +no_defs <> +# RGNC91-93 +<4906> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# GR96 +<4908> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# ITRF88 +<4910> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# ITRF89 +<4911> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# ITRF90 +<4912> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# ITRF91 +<4913> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# ITRF92 +<4914> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# ITRF93 +<4915> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# ITRF94 +<4916> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# ITRF96 +<4917> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# ITRF97 +<4918> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# ITRF2000 +<4919> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# GDM2000 +<4920> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# PZ-90 +<4922> +proj=geocent +a=6378136 +b=6356751.361745712 +units=m +no_defs <> +# Mauritania 1999 +<4924> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# Korea 2000 +<4926> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# POSGAR 94 +<4928> +proj=geocent +ellps=WGS84 +units=m +no_defs <> +# Australian Antarctic +<4930> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# CHTRF95 +<4932> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# EST97 +<4934> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# ETRS89 +<4936> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# GDA94 +<4938> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# Hartebeesthoek94 +<4940> +proj=geocent +ellps=WGS84 +units=m +no_defs <> +# IRENET95 +<4942> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# ISN93 +<4944> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# JGD2000 +<4946> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# LKS92 +<4948> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# LKS94 +<4950> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# Moznet +<4952> +proj=geocent +ellps=WGS84 +units=m +no_defs <> +# NAD83(CSRS) +<4954> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# NAD83(HARN) +<4956> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# NZGD2000 +<4958> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# POSGAR 98 +<4960> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# REGVEN +<4962> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# RGF93 +<4964> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# RGFG95 +<4966> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# RGNC 1991 +<4968> +proj=geocent +ellps=intl +units=m +no_defs <> +# RGR92 +<4970> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# RRAF 1991 +<4972> +proj=geocent +ellps=WGS84 +units=m +no_defs <> +# SIRGAS 1995 +<4974> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# SWEREF99 +<4976> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# WGS 84 +<4978> +proj=geocent +datum=WGS84 +units=m +no_defs <> +# Yemen NGN96 +<4980> +proj=geocent +ellps=WGS84 +units=m +no_defs <> +# IGM95 +<4982> +proj=geocent +ellps=WGS84 +units=m +no_defs <> +# WGS 72 +<4984> +proj=geocent +ellps=WGS72 +units=m +no_defs <> +# WGS 72BE +<4986> +proj=geocent +ellps=WGS72 +units=m +no_defs <> +# SIRGAS 2000 +<4988> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# Lao 1993 +<4990> +proj=geocent +ellps=krass +units=m +no_defs <> +# Lao 1997 +<4992> +proj=geocent +ellps=krass +units=m +no_defs <> +# PRS92 +<4994> +proj=geocent +ellps=clrk66 +units=m +no_defs <> +# MAGNA-SIRGAS +<4996> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# RGPF +<4998> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# PTRA08 +<5011> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# GDBD2009 +<5244> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# TUREF +<5250> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# DRUKREF 03 +<5262> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# ISN2004 +<5322> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# ITRF2008 +<5332> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# POSGAR 2007 +<5341> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# MARGEN +<5352> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# SIRGAS-Chile +<5358> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# CR05 +<5363> +proj=geocent +ellps=WGS84 +units=m +no_defs <> +# MACARIO SOLIS +<5368> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# Peru96 +<5369> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# SIRGAS-ROU98 +<5379> +proj=geocent +ellps=WGS84 +units=m +no_defs <> +# SIRGAS_ES2007.8 +<5391> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# RGAF09 +<5487> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# PNG94 +<5544> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# UCS-2000 +<5558> +proj=geocent +ellps=krass +units=m +no_defs <> +# FEH2010 +<5591> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# DB_REF +<5828> +proj=geocent +ellps=bessel +units=m +no_defs <> +# TGD2005 +<5884> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# CIGD11 +<6133> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# CGRS93 +<6309> +proj=geocent +ellps=WGS84 +units=m +no_defs <> +# NAD83(2011) +<6317> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# NAD83(PA11) +<6320> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# NAD83(MA11) +<6323> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# Mexico ITRF2008 +<6363> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# JGD2011 +<6666> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# RDN2008 +<6704> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# NAD83(CORS96) +<6781> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# IGS08 +<6934> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# IGD05 +<6978> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# IG05 Intermediate CRS +<6981> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# IGD05/12 +<6985> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# IG05/12 Intermediate CRS +<6988> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# RGTAAF07 +<7071> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# IGD05 +<7134> +proj=geocent +ellps=WGS84 +units=m +no_defs <> +# IGD05/12 +<7137> +proj=geocent +ellps=WGS84 +units=m +no_defs <> +# ONGD14 +<7371> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# WGS 84 (G730) +<7656> +proj=geocent +ellps=WGS84 +units=m +no_defs <> +# WGS 84 (G873) +<7658> +proj=geocent +ellps=WGS84 +units=m +no_defs <> +# WGS 84 (G1150) +<7660> +proj=geocent +ellps=WGS84 +units=m +no_defs <> +# WGS 84 (G1674) +<7662> +proj=geocent +ellps=WGS84 +units=m +no_defs <> +# WGS 84 (G1762) +<7664> +proj=geocent +ellps=WGS84 +units=m +no_defs <> +# PZ-90.02 +<7677> +proj=geocent +a=6378136 +b=6356751.361745712 +units=m +no_defs <> +# PZ-90.11 +<7679> +proj=geocent +a=6378136 +b=6356751.361745712 +units=m +no_defs <> +# GSK-2011 +<7681> +proj=geocent +a=6378136.5 +b=6356751.757955603 +units=m +no_defs <> +# Kyrg-06 +<7684> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# ITRF2014 +<7789> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# BGS2005 +<7796> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# WGS 84 (Transit) +<7815> +proj=geocent +ellps=WGS84 +units=m +no_defs <> +# GDA2020 +<7842> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# St. Helena Tritan +<7879> +proj=geocent +ellps=WGS84 +units=m +no_defs <> +# SHGD2015 +<7884> +proj=geocent +ellps=GRS80 +units=m +no_defs <> +# KKJ / Finland Uniform Coordinate System + N60 height +<3901> +proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=3500000 +y_0=0 +ellps=intl +towgs84=-96.062,-82.428,-121.753,4.801,0.345,-1.376,1.496 +units=m +vunits=m +no_defs <> +# ETRS89 / TM35FIN(N,E) + N60 height +<3902> +proj=utm +zone=35 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# ETRS89 / TM35FIN(N,E) + N2000 height +<3903> +proj=utm +zone=35 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# ETRS89 / DKTM1 + DVR90 height +<4097> +proj=tmerc +lat_0=0 +lon_0=9 +k=0.99998 +x_0=200000 +y_0=-5000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# ETRS89 / DKTM2 + DVR90 height +<4098> +proj=tmerc +lat_0=0 +lon_0=10 +k=0.99998 +x_0=400000 +y_0=-5000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# ETRS89 / DKTM3 + DVR90 height +<4099> +proj=tmerc +lat_0=0 +lon_0=11.75 +k=0.99998 +x_0=600000 +y_0=-5000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# ETRS89 / DKTM4 + DVR90 height +<4100> +proj=tmerc +lat_0=0 +lon_0=15 +k=1 +x_0=800000 +y_0=-5000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# ETRS89 / Faroe TM + FVR09 height +<5318> +proj=tmerc +lat_0=0 +lon_0=-7 +k=0.999997 +x_0=200000 +y_0=-6000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# NAD83 + NAVD88 height +<5498> +proj=longlat +datum=NAD83 +geoidgrids=g2012a_conus.gtx,g2012a_alaska.gtx,g2012a_guam.gtx,g2012a_hawaii.gtx,g2012a_puertorico.gtx,g2012a_samoa.gtx +vunits=m +no_defs <> +# NAD83(HARN) + NAVD88 height +<5499> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +geoidgrids=g2012a_conus.gtx,g2012a_alaska.gtx,g2012a_guam.gtx,g2012a_hawaii.gtx,g2012a_puertorico.gtx,g2012a_samoa.gtx +vunits=m +no_defs <> +# NAD83(NSRS2007) + NAVD88 height +<5500> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +geoidgrids=g2012a_conus.gtx,g2012a_alaska.gtx,g2012a_guam.gtx,g2012a_hawaii.gtx,g2012a_puertorico.gtx,g2012a_samoa.gtx +vunits=m +no_defs <> +# ETRS89 / UTM zone 31N + DHHN92 height +<5554> +proj=utm +zone=31 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# ETRS89 / UTM zone 32N + DHHN92 height +<5555> +proj=utm +zone=32 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# ETRS89 / UTM zone 33N + DHHN92 height +<5556> +proj=utm +zone=33 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# FEH2010 / Fehmarnbelt TM + FCSVR10 height +<5598> +proj=tmerc +lat_0=0 +lon_0=11.33333333333333 +k=1 +x_0=1000000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# SWEREF99 + RH2000 height +<5628> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +vunits=m +no_defs <> +# RGF93 / Lambert-93 + NGF-IGN69 height +<5698> +proj=lcc +lat_1=49 +lat_2=44 +lat_0=46.5 +lon_0=3 +x_0=700000 +y_0=6600000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# RGF93 / Lambert-93 + NGF-IGN78 height +<5699> +proj=lcc +lat_1=49 +lat_2=44 +lat_0=46.5 +lon_0=3 +x_0=700000 +y_0=6600000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# NTF (Paris) / Lambert zone I + NGF-IGN69 height +<5707> +proj=lcc +lat_1=49.50000000000001 +lat_0=49.50000000000001 +lon_0=0 +k_0=0.999877341 +x_0=600000 +y_0=1200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +vunits=m +no_defs <> +# NTF (Paris) / Lambert zone IV + NGF-IGN78 height +<5708> +proj=lcc +lat_1=42.16500000000001 +lat_0=42.16500000000001 +lon_0=0 +k_0=0.99994471 +x_0=234.358 +y_0=4185861.369 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +vunits=m +no_defs <> +# DB_REF / 3-degree Gauss-Kruger zone 2 (E-N) + DHHN92 height +<5832> +proj=tmerc +lat_0=0 +lon_0=6 +k=1 +x_0=2500000 +y_0=0 +ellps=bessel +units=m +vunits=m +no_defs <> +# DB_REF / 3-degree Gauss-Kruger zone 3 (E-N) + DHHN92 height +<5833> +proj=tmerc +lat_0=0 +lon_0=9 +k=1 +x_0=3500000 +y_0=0 +ellps=bessel +units=m +vunits=m +no_defs <> +# DB_REF / 3-degree Gauss-Kruger zone 4 (E-N) + DHHN92 height +<5834> +proj=tmerc +lat_0=0 +lon_0=12 +k=1 +x_0=4500000 +y_0=0 +ellps=bessel +units=m +vunits=m +no_defs <> +# DB_REF / 3-degree Gauss-Kruger zone 5 (E-N) + DHHN92 height +<5835> +proj=tmerc +lat_0=0 +lon_0=15 +k=1 +x_0=5500000 +y_0=0 +ellps=bessel +units=m +vunits=m +no_defs <> +# SWEREF99 TM + RH2000 height +<5845> +proj=utm +zone=33 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# SWEREF99 12 00 + RH2000 height +<5846> +proj=tmerc +lat_0=0 +lon_0=12 +k=1 +x_0=150000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# SWEREF99 13 30 + RH2000 height +<5847> +proj=tmerc +lat_0=0 +lon_0=13.5 +k=1 +x_0=150000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# SWEREF99 15 00 + RH2000 height +<5848> +proj=tmerc +lat_0=0 +lon_0=15 +k=1 +x_0=150000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# SWEREF99 16 30 + RH2000 height +<5849> +proj=tmerc +lat_0=0 +lon_0=16.5 +k=1 +x_0=150000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# SWEREF99 18 00 + RH2000 height +<5850> +proj=tmerc +lat_0=0 +lon_0=18 +k=1 +x_0=150000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# SWEREF99 14 15 + RH2000 height +<5851> +proj=tmerc +lat_0=0 +lon_0=14.25 +k=1 +x_0=150000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# SWEREF99 15 45 + RH2000 height +<5852> +proj=tmerc +lat_0=0 +lon_0=15.75 +k=1 +x_0=150000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# SWEREF99 17 15 + RH2000 height +<5853> +proj=tmerc +lat_0=0 +lon_0=17.25 +k=1 +x_0=150000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# SWEREF99 18 45 + RH2000 height +<5854> +proj=tmerc +lat_0=0 +lon_0=18.75 +k=1 +x_0=150000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# SWEREF99 20 15 + RH2000 height +<5855> +proj=tmerc +lat_0=0 +lon_0=20.25 +k=1 +x_0=150000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# SWEREF99 21 45 + RH2000 height +<5856> +proj=tmerc +lat_0=0 +lon_0=21.75 +k=1 +x_0=150000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# SWEREF99 23 15 + RH2000 height +<5857> +proj=tmerc +lat_0=0 +lon_0=23.25 +k=1 +x_0=150000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# ETRS89 + NN2000 height +<5942> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +vunits=m +no_defs <> +# ETRS89 / NTM zone 5 + NN2000 height +<5945> +proj=tmerc +lat_0=58 +lon_0=5.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# ETRS89 / NTM zone 6 + NN2000 height +<5946> +proj=tmerc +lat_0=58 +lon_0=6.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# ETRS89 / NTM zone 7 + NN2000 height +<5947> +proj=tmerc +lat_0=58 +lon_0=7.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# ETRS89 / NTM zone 8 + NN2000 height +<5948> +proj=tmerc +lat_0=58 +lon_0=8.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# ETRS89 / NTM zone 9 + NN2000 height +<5949> +proj=tmerc +lat_0=58 +lon_0=9.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# ETRS89 / NTM zone 10 + NN2000 height +<5950> +proj=tmerc +lat_0=58 +lon_0=10.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# ETRS89 / NTM zone 11 + NN2000 height +<5951> +proj=tmerc +lat_0=58 +lon_0=11.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# ETRS89 / NTM zone 12 + NN2000 height +<5952> +proj=tmerc +lat_0=58 +lon_0=12.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# ETRS89 / NTM zone 13 + NN2000 height +<5953> +proj=tmerc +lat_0=58 +lon_0=13.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# ETRS89 / NTM zone 14 + NN2000 height +<5954> +proj=tmerc +lat_0=58 +lon_0=14.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# ETRS89 / NTM zone 15 + NN2000 height +<5955> +proj=tmerc +lat_0=58 +lon_0=15.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# ETRS89 / NTM zone 16 + NN2000 height +<5956> +proj=tmerc +lat_0=58 +lon_0=16.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# ETRS89 / NTM zone 17 + NN2000 height +<5957> +proj=tmerc +lat_0=58 +lon_0=17.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# ETRS89 / NTM zone 18 + NN2000 height +<5958> +proj=tmerc +lat_0=58 +lon_0=18.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# ETRS89 / NTM zone 19 + NN2000 height +<5959> +proj=tmerc +lat_0=58 +lon_0=19.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# ETRS89 / NTM zone 20 + NN2000 height +<5960> +proj=tmerc +lat_0=58 +lon_0=20.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# ETRS89 / NTM zone 21 + NN2000 height +<5961> +proj=tmerc +lat_0=58 +lon_0=21.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# ETRS89 / NTM zone 22 + NN2000 height +<5962> +proj=tmerc +lat_0=58 +lon_0=22.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# ETRS89 / NTM zone 23 + NN2000 height +<5963> +proj=tmerc +lat_0=58 +lon_0=23.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# ETRS89 / NTM zone 24 + NN2000 height +<5964> +proj=tmerc +lat_0=58 +lon_0=24.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# ETRS89 / NTM zone 25 + NN2000 height +<5965> +proj=tmerc +lat_0=58 +lon_0=25.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# ETRS89 / NTM zone 26 + NN2000 height +<5966> +proj=tmerc +lat_0=58 +lon_0=26.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# ETRS89 / NTM zone 27 + NN2000 height +<5967> +proj=tmerc +lat_0=58 +lon_0=27.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# ETRS89 / NTM zone 28 + NN2000 height +<5968> +proj=tmerc +lat_0=58 +lon_0=28.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# ETRS89 / NTM zone 29 + NN2000 height +<5969> +proj=tmerc +lat_0=58 +lon_0=29.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# ETRS89 / NTM zone 30 + NN2000 height +<5970> +proj=tmerc +lat_0=58 +lon_0=30.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# ETRS89 / UTM zone 31 + NN2000 height +<5971> +proj=utm +zone=31 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# ETRS89 / UTM zone 32 + NN2000 height +<5972> +proj=utm +zone=32 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# ETRS89 / UTM zone 33 + NN2000 height +<5973> +proj=utm +zone=33 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# ETRS89 / UTM zone 34 + NN2000 height +<5974> +proj=utm +zone=34 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# ETRS89 / UTM zone 35 + NN2000 height +<5975> +proj=utm +zone=35 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# ETRS89 / UTM zone 36 + NN2000 height +<5976> +proj=utm +zone=36 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# ETRS89 + NN54 height +<6144> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +vunits=m +no_defs <> +# ETRS89 / NTM zone 5 + NN54 height +<6145> +proj=tmerc +lat_0=58 +lon_0=5.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# ETRS89 / NTM zone 6 + NN54 height +<6146> +proj=tmerc +lat_0=58 +lon_0=6.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# ETRS89 / NTM zone 7 + NN54 height +<6147> +proj=tmerc +lat_0=58 +lon_0=7.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# ETRS89 / NTM zone 8 + NN54 height +<6148> +proj=tmerc +lat_0=58 +lon_0=8.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# ETRS89 / NTM zone 9 + NN54 height +<6149> +proj=tmerc +lat_0=58 +lon_0=9.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# ETRS89 / NTM zone 10 + NN54 height +<6150> +proj=tmerc +lat_0=58 +lon_0=10.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# ETRS89 / NTM zone 11 + NN54 height +<6151> +proj=tmerc +lat_0=58 +lon_0=11.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# ETRS89 / NTM zone 12 + NN54 height +<6152> +proj=tmerc +lat_0=58 +lon_0=12.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# ETRS89 / NTM zone 13 + NN54 height +<6153> +proj=tmerc +lat_0=58 +lon_0=13.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# ETRS89 / NTM zone 14 + NN54 height +<6154> +proj=tmerc +lat_0=58 +lon_0=14.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# ETRS89 / NTM zone 15 + NN54 height +<6155> +proj=tmerc +lat_0=58 +lon_0=15.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# ETRS89 / NTM zone 16 + NN54 height +<6156> +proj=tmerc +lat_0=58 +lon_0=16.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# ETRS89 / NTM zone 17 + NN54 height +<6157> +proj=tmerc +lat_0=58 +lon_0=17.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# ETRS89 / NTM zone 18 + NN54 height +<6158> +proj=tmerc +lat_0=58 +lon_0=18.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# ETRS89 / NTM zone 19 + NN54 height +<6159> +proj=tmerc +lat_0=58 +lon_0=19.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# ETRS89 / NTM zone 20 + NN54 height +<6160> +proj=tmerc +lat_0=58 +lon_0=20.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# ETRS89 / NTM zone 21 + NN54 height +<6161> +proj=tmerc +lat_0=58 +lon_0=21.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# ETRS89 / NTM zone 22 + NN54 height +<6162> +proj=tmerc +lat_0=58 +lon_0=22.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# ETRS89 / NTM zone 23 + NN54 height +<6163> +proj=tmerc +lat_0=58 +lon_0=23.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# ETRS89 / NTM zone 24 + NN54 height +<6164> +proj=tmerc +lat_0=58 +lon_0=24.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# ETRS89 / NTM zone 25 + NN54 height +<6165> +proj=tmerc +lat_0=58 +lon_0=25.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# ETRS89 / NTM zone 26 + NN54 height +<6166> +proj=tmerc +lat_0=58 +lon_0=26.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# ETRS89 / NTM zone 27 + NN54 height +<6167> +proj=tmerc +lat_0=58 +lon_0=27.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# ETRS89 / NTM zone 28 + NN54 height +<6168> +proj=tmerc +lat_0=58 +lon_0=28.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# ETRS89 / NTM zone 29 + NN54 height +<6169> +proj=tmerc +lat_0=58 +lon_0=29.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# ETRS89 / NTM zone 30 + NN54 height +<6170> +proj=tmerc +lat_0=58 +lon_0=30.5 +k=1 +x_0=100000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# ETRS89 / UTM zone 31 + NN54 height +<6171> +proj=utm +zone=31 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# ETRS89 / UTM zone 32 + NN54 height +<6172> +proj=utm +zone=32 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# ETRS89 / UTM zone 33 + NN54 height +<6173> +proj=utm +zone=33 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# ETRS89 / UTM zone 34 + NN54 height +<6174> +proj=utm +zone=34 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# ETRS89 / UTM zone 35 + NN54 height +<6175> +proj=utm +zone=35 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# ETRS89 / UTM zone 36 + NN54 height +<6176> +proj=utm +zone=36 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# Belge 1972 / Belgian Lambert 72 + Ostend height +<6190> +proj=lcc +lat_1=51.16666723333333 +lat_2=49.8333339 +lat_0=90 +lon_0=4.367486666666666 +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 +vunits=m +no_defs <> +# NAD83(2011) + NAVD88 height +<6349> +proj=longlat +ellps=GRS80 +geoidgrids=g2012a_conus.gtx,g2012a_alaska.gtx,g2012a_guam.gtx,g2012a_hawaii.gtx,g2012a_puertorico.gtx,g2012a_samoa.gtx +vunits=m +no_defs <> +# NAD83(CSRS) + CGVD2013 height +<6649> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +vunits=m +no_defs <> +# NAD83(CSRS) / UTM zone 7N + CGVD2013 height +<6650> +proj=utm +zone=7 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# NAD83(CSRS) / UTM zone 8N + CGVD2013 height +<6651> +proj=utm +zone=8 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# NAD83(CSRS) / UTM zone 9N + CGVD2013 height +<6652> +proj=utm +zone=9 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# NAD83(CSRS) / UTM zone 10N + CGVD2013 height +<6653> +proj=utm +zone=10 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# NAD83(CSRS) / UTM zone 11N + CGVD2013 height +<6654> +proj=utm +zone=11 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# NAD83(CSRS) / UTM zone 12N + CGVD2013 height +<6655> +proj=utm +zone=12 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# NAD83(CSRS) / UTM zone 13N + CGVD2013 height +<6656> +proj=utm +zone=13 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# NAD83(CSRS) / UTM zone 14N + CGVD2013 height +<6657> +proj=utm +zone=14 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# NAD83(CSRS) / UTM zone 15N + CGVD2013 height +<6658> +proj=utm +zone=15 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# NAD83(CSRS) / UTM zone 16N + CGVD2013 height +<6659> +proj=utm +zone=16 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# NAD83(CSRS) / UTM zone 17N + CGVD2013 height +<6660> +proj=utm +zone=17 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# NAD83(CSRS) / UTM zone 18N + CGVD2013 height +<6661> +proj=utm +zone=18 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# NAD83(CSRS) / UTM zone 19N + CGVD2013 height +<6662> +proj=utm +zone=19 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# NAD83(CSRS) / UTM zone 20N + CGVD2013 height +<6663> +proj=utm +zone=20 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# NAD83(CSRS) / UTM zone 21N + CGVD2013 height +<6664> +proj=utm +zone=21 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# NAD83(CSRS) / UTM zone 22N + CGVD2013 height +<6665> +proj=utm +zone=22 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# JGD2000 + JGD2000 (vertical) height +<6696> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +vunits=m +no_defs <> +# JGD2011 + JGD2011 (vertical) height +<6697> +proj=longlat +ellps=GRS80 +vunits=m +no_defs <> +# Tokyo + JSLD72 height +<6700> +proj=longlat +ellps=bessel +towgs84=-146.414,507.337,680.507,0,0,0,0 +vunits=m +no_defs <> +# WGS 84 / Pseudo-Mercator + EGM2008 geoid height +<6871> +proj=merc +lon_0=0 +k=1 +x_0=0 +y_0=0 +datum=WGS84 +units=m +geoidgrids=egm08_25.gtx +vunits=m +no_defs <> +# WGS 84 / World Mercator + EGM2008 height +<6893> +proj=merc +lon_0=0 +k=1 +x_0=0 +y_0=0 +datum=WGS84 +units=m +geoidgrids=egm08_25.gtx +vunits=m +no_defs <> +# SVY21 + SHD height +<6917> +proj=longlat +ellps=WGS84 +vunits=m +no_defs <> +# SVY21 / Singapore TM + SHD height +<6927> +proj=tmerc +lat_0=1.366666666666667 +lon_0=103.8333333333333 +k=1 +x_0=28001.642 +y_0=38744.572 +ellps=WGS84 +units=m +vunits=m +no_defs <> +# NTF (Paris) + NGF IGN69 height +<7400> +proj=longlat +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +vunits=m +no_defs <> +# NTF (Paris) / France II + NGF Lallemand +<7401> +proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=0 +k_0=0.99987742 +x_0=600000 +y_0=2200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +vunits=m +no_defs <> +# NTF (Paris) / France II + NGF IGN69 +<7402> +proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=0 +k_0=0.99987742 +x_0=600000 +y_0=2200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +vunits=m +no_defs <> +# NTF (Paris) / France III + NGF IGN69 +<7403> +proj=lcc +lat_1=44.10000000000001 +lat_0=44.10000000000001 +lon_0=0 +k_0=0.999877499 +x_0=600000 +y_0=3200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +vunits=m +no_defs <> +# RT90 + RH70 height +<7404> +proj=longlat +ellps=bessel +towgs84=414.1,41.3,603.1,-0.855,2.141,-7.023,0 +vunits=m +no_defs <> +# OSGB 1936 / British National Grid + ODN height +<7405> +proj=tmerc +lat_0=49 +lon_0=-2 +k=0.9996012717 +x_0=400000 +y_0=-100000 +datum=OSGB36 +units=m +vunits=m +no_defs <> +# NAD27 + NGVD29 height +<7406> +proj=longlat +datum=NAD27 +vunits=us-ft +no_defs <> +# NAD27 / Texas North + NGVD29 height +<7407> +proj=lcc +lat_1=34.65 +lat_2=36.18333333333333 +lat_0=34 +lon_0=-101.5 +x_0=609601.2192024384 +y_0=0 +datum=NAD27 +units=us-ft +vunits=us-ft +no_defs <> +# RD/NAP +<7408> +proj=longlat +ellps=bessel +towgs84=565.2369,50.0087,465.658,-0.406857,0.350733,-1.87035,4.0812 +vunits=m +no_defs <> +# ETRS89 + EVRF2000 height +<7409> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +vunits=m +no_defs <> +# PSHD93 +<7410> +proj=longlat +ellps=clrk80 +towgs84=-180.624,-225.516,173.919,-0.81,-1.898,8.336,16.71006 +vunits=m +no_defs <> +# NTF (Paris) / Lambert zone II + NGF Lallemand height +<7411> +proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=0 +k_0=0.99987742 +x_0=600000 +y_0=2200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +vunits=m +no_defs <> +# NTF (Paris) / Lambert zone II + NGF IGN69 +<7412> +proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=0 +k_0=0.99987742 +x_0=600000 +y_0=2200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +vunits=m +no_defs <> +# NTF (Paris) / Lambert zone III + NGF IGN69 +<7413> +proj=lcc +lat_1=44.10000000000001 +lat_0=44.10000000000001 +lon_0=0 +k_0=0.999877499 +x_0=600000 +y_0=3200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +vunits=m +no_defs <> +# Tokyo + JSLD69 height +<7414> +proj=longlat +ellps=bessel +towgs84=-146.414,507.337,680.507,0,0,0,0 +vunits=m +no_defs <> +# Amersfoort / RD New + NAP height +<7415> +proj=sterea +lat_0=52.15616055555555 +lon_0=5.38763888888889 +k=0.9999079 +x_0=155000 +y_0=463000 +ellps=bessel +towgs84=565.2369,50.0087,465.658,-0.406857,0.350733,-1.87035,4.0812 +units=m +vunits=m +no_defs <> +# ETRS89 / UTM zone 32N + DVR90 height +<7416> +proj=utm +zone=32 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# ETRS89 / UTM zone 33N + DVR90 height +<7417> +proj=utm +zone=33 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# ETRS89 / Kp2000 Jutland + DVR90 height +<7418> +proj=tmerc +lat_0=0 +lon_0=9.5 +k=0.99995 +x_0=200000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# ETRS89 / Kp2000 Zealand + DVR90 height +<7419> +proj=tmerc +lat_0=0 +lon_0=12 +k=0.99995 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# ETRS89 / Kp2000 Bornholm + DVR90 height +<7420> +proj=tmerc +lat_0=0 +lon_0=15 +k=1 +x_0=900000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> +# NTF (Paris) / Lambert zone II + NGF-IGN69 height +<7421> +proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=0 +k_0=0.99987742 +x_0=600000 +y_0=2200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +vunits=m +no_defs <> +# NTF (Paris) / Lambert zone III + NGF-IGN69 height +<7422> +proj=lcc +lat_1=44.10000000000001 +lat_0=44.10000000000001 +lon_0=0 +k_0=0.999877499 +x_0=600000 +y_0=3200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +vunits=m +no_defs <> +# ETRS89 + EVRF2007 height +<7423> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +vunits=m +no_defs <> +# Astro DOS 71 / UTM zone 30S + Jamestown 1971 height +<7954> +proj=utm +zone=30 +south +ellps=intl +towgs84=-320,550,-494,0,0,0,0 +units=m +vunits=m +no_defs <> +# St. Helena Tritan / UTM zone 30S + Tritan 2011 height +<7955> +proj=utm +zone=30 +south +ellps=WGS84 +towgs84=-0.077,0.079,0.086,0,0,0,0 +units=m +vunits=m +no_defs <> +# SHMG2015 + SHVD2015 height +<7956> +proj=utm +zone=30 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs <> diff --git a/www/assets/esri b/www/assets/esri new file mode 100644 index 000000000..b59fa2166 --- /dev/null +++ b/www/assets/esri @@ -0,0 +1,5937 @@ +# Anguilla 1957 / British West Indies Grid +<2000> +proj=tmerc +lat_0=0 +lon_0=-62 +k=0.999500 +x_0=400000 +y_0=0 +ellps=clrk80 +units=m +no_defs <> +# Antigua 1943 / British West Indies Grid +<2001> +proj=tmerc +lat_0=0 +lon_0=-62 +k=0.999500 +x_0=400000 +y_0=0 +ellps=clrk80 +towgs84=-255,-15,71,0,0,0,0 +units=m +no_defs <> +# Dominica 1945 / British West Indies Grid +<2002> +proj=tmerc +lat_0=0 +lon_0=-62 +k=0.999500 +x_0=400000 +y_0=0 +ellps=clrk80 +towgs84=725,685,536,0,0,0,0 +units=m +no_defs <> +# Grenada 1953 / British West Indies Grid +<2003> +proj=tmerc +lat_0=0 +lon_0=-62 +k=0.999500 +x_0=400000 +y_0=0 +ellps=clrk80 +towgs84=72,213.7,93,0,0,0,0 +units=m +no_defs <> +# Montserrat 58 / British West Indies Grid +<2004> +proj=tmerc +lat_0=0 +lon_0=-62 +k=0.999500 +x_0=400000 +y_0=0 +ellps=clrk80 +towgs84=174,359,365,0,0,0,0 +units=m +no_defs <> +# St Kitts 1955 / British West Indies Grid +<2005> +proj=tmerc +lat_0=0 +lon_0=-62 +k=0.999500 +x_0=400000 +y_0=0 +ellps=clrk80 +towgs84=9,183,236,0,0,0,0 +units=m +no_defs <> +# St Lucia 1955 / British West Indies Grid +<2006> +proj=tmerc +lat_0=0 +lon_0=-62 +k=0.999500 +x_0=400000 +y_0=0 +ellps=clrk80 +towgs84=-149,128,296,0,0,0,0 +units=m +no_defs <> +# St Vincent 45 / British West Indies Grid +<2007> +proj=tmerc +lat_0=0 +lon_0=-62 +k=0.999500 +x_0=400000 +y_0=0 +ellps=clrk80 +units=m +no_defs <> +# NAD27(CGQ77) / SCoPQ zone 2 +<2008> +proj=tmerc +lat_0=0 +lon_0=-55.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m +no_defs <> +# NAD27(CGQ77) / SCoPQ zone 3 +<2009> +proj=tmerc +lat_0=0 +lon_0=-58.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m +no_defs <> +# NAD27(CGQ77) / SCoPQ zone 4 +<2010> +proj=tmerc +lat_0=0 +lon_0=-61.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m +no_defs <> +# NAD27(CGQ77) / SCoPQ zone 5 +<2011> +proj=tmerc +lat_0=0 +lon_0=-64.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m +no_defs <> +# NAD27(CGQ77) / SCoPQ zone 6 +<2012> +proj=tmerc +lat_0=0 +lon_0=-67.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m +no_defs <> +# NAD27(CGQ77) / SCoPQ zone 7 +<2013> +proj=tmerc +lat_0=0 +lon_0=-70.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m +no_defs <> +# NAD27(CGQ77) / SCoPQ zone 8 +<2014> +proj=tmerc +lat_0=0 +lon_0=-73.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m +no_defs <> +# NAD27(CGQ77) / SCoPQ zone 9 +<2015> +proj=tmerc +lat_0=0 +lon_0=-76.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m +no_defs <> +# NAD27(CGQ77) / SCoPQ zone 10 +<2016> +proj=tmerc +lat_0=0 +lon_0=-79.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m +no_defs <> +# NAD27(76) / MTM zone 8 +<2017> +proj=tmerc +lat_0=0 +lon_0=-73.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m +no_defs <> +# NAD27(76) / MTM zone 9 +<2018> +proj=tmerc +lat_0=0 +lon_0=-76.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m +no_defs <> +# NAD27(76) / MTM zone 10 +<2019> +proj=tmerc +lat_0=0 +lon_0=-79.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m +no_defs <> +# NAD27(76) / MTM zone 11 +<2020> +proj=tmerc +lat_0=0 +lon_0=-82.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m +no_defs <> +# NAD27(76) / MTM zone 12 +<2021> +proj=tmerc +lat_0=0 +lon_0=-81 +k=0.999900 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m +no_defs <> +# NAD27(76) / MTM zone 13 +<2022> +proj=tmerc +lat_0=0 +lon_0=-84 +k=0.999900 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m +no_defs <> +# NAD27(76) / MTM zone 14 +<2023> +proj=tmerc +lat_0=0 +lon_0=-87 +k=0.999900 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m +no_defs <> +# NAD27(76) / MTM zone 15 +<2024> +proj=tmerc +lat_0=0 +lon_0=-90 +k=0.999900 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m +no_defs <> +# NAD27(76) / MTM zone 16 +<2025> +proj=tmerc +lat_0=0 +lon_0=-93 +k=0.999900 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m +no_defs <> +# NAD27(76) / MTM zone 17 +<2026> +proj=tmerc +lat_0=0 +lon_0=-96 +k=0.999900 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m +no_defs <> +# NAD27(76) / UTM zone 15N +<2027> +proj=utm +zone=15 +ellps=clrk66 +units=m +no_defs <> +# NAD27(76) / UTM zone 16N +<2028> +proj=utm +zone=16 +ellps=clrk66 +units=m +no_defs <> +# NAD27(76) / UTM zone 17N +<2029> +proj=utm +zone=17 +ellps=clrk66 +units=m +no_defs <> +# NAD27(76) / UTM zone 18N +<2030> +proj=utm +zone=18 +ellps=clrk66 +units=m +no_defs <> +# NAD27(CGQ77) / UTM zone 17N +<2031> +proj=utm +zone=17 +ellps=clrk66 +units=m +no_defs <> +# NAD27(CGQ77) / UTM zone 18N +<2032> +proj=utm +zone=18 +ellps=clrk66 +units=m +no_defs <> +# NAD27(CGQ77) / UTM zone 19N +<2033> +proj=utm +zone=19 +ellps=clrk66 +units=m +no_defs <> +# NAD27(CGQ77) / UTM zone 20N +<2034> +proj=utm +zone=20 +ellps=clrk66 +units=m +no_defs <> +# NAD27(CGQ77) / UTM zone 21N +<2035> +proj=utm +zone=21 +ellps=clrk66 +units=m +no_defs <> +# NAD83(CSRS98) / New Brunswick Stereo +<2036> +proj=stere +lat_0=46.5 +lon_0=-66.5 +k=0.999912 +x_0=2500000 +y_0=7500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS98) / UTM zone 19N +<2037> +proj=utm +zone=19 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS98) / UTM zone 20N +<2038> +proj=utm +zone=20 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Israel / Israeli TM Grid +<2039> +proj=tmerc +lat_0=31.73439361111111 +lon_0=35.20451694444445 +k=1.000007 +x_0=219529.584 +y_0=626907.39 +ellps=GRS80 +units=m +no_defs <> +# Locodjo 1965 / UTM zone 30N +<2040> +proj=utm +zone=30 +ellps=clrk80 +towgs84=-125,53,467,0,0,0,0 +units=m +no_defs <> +# Abidjan 1987 / UTM zone 30N +<2041> +proj=utm +zone=30 +ellps=clrk80 +towgs84=-124.76,53,466.79,0,0,0,0 +units=m +no_defs <> +# Locodjo 1965 / UTM zone 29N +<2042> +proj=utm +zone=29 +ellps=clrk80 +towgs84=-125,53,467,0,0,0,0 +units=m +no_defs <> +# Abidjan 1987 / UTM zone 29N +<2043> +proj=utm +zone=29 +ellps=clrk80 +towgs84=-124.76,53,466.79,0,0,0,0 +units=m +no_defs <> +# Hanoi 1972 / Gauss-Kruger zone 18 +<2044> +proj=tmerc +lat_0=0 +lon_0=105 +k=1.000000 +x_0=18500000 +y_0=0 +ellps=krass +towgs84=-17.51,-108.32,-62.39,0,0,0,0 +units=m +no_defs <> +# Hanoi 1972 / Gauss-Kruger zone 19 +<2045> +proj=tmerc +lat_0=0 +lon_0=111 +k=1.000000 +x_0=19500000 +y_0=0 +ellps=krass +towgs84=-17.51,-108.32,-62.39,0,0,0,0 +units=m +no_defs <> +# Hartebeesthoek94 / Lo15 +# Hartebeesthoek94 / Lo17 +# Hartebeesthoek94 / Lo19 +# Hartebeesthoek94 / Lo21 +# Hartebeesthoek94 / Lo23 +# Hartebeesthoek94 / Lo25 +# Hartebeesthoek94 / Lo27 +# Hartebeesthoek94 / Lo29 +# Hartebeesthoek94 / Lo31 +# Hartebeesthoek94 / Lo33 +# CH1903+ / LV95 +<2056> +proj=omerc +lat_0=46.95240555555556 +lonc=7.439583333333333 +alpha=90 +k=1 +x_0=2600000 +y_0=1200000 +ellps=bessel +towgs84=674.374,15.056,405.346,0,0,0,0 +units=m +no_defs <> +# Rassadiran / Nakhl e Taqi +<2057> +proj=omerc +lat_0=27.51882880555555 +lonc=52.60353916666667 +alpha=0.5716611944444444 +k=0.999895934 +x_0=658377.437 +y_0=3044969.194 +ellps=intl +towgs84=-133.63,-157.5,-158.62,0,0,0,0 +units=m +no_defs <> +# ED50(ED77) / UTM zone 38N +<2058> +proj=utm +zone=38 +ellps=intl +units=m +no_defs <> +# ED50(ED77) / UTM zone 39N +<2059> +proj=utm +zone=39 +ellps=intl +units=m +no_defs <> +# ED50(ED77) / UTM zone 40N +<2060> +proj=utm +zone=40 +ellps=intl +units=m +no_defs <> +# ED50(ED77) / UTM zone 41N +<2061> +proj=utm +zone=41 +ellps=intl +units=m +no_defs <> +# Madrid 1870 (Madrid) / Spain +<2062> +proj=lcc +lat_1=40 +lat_0=40 +lon_0=-3.687938888888889 +k_0=0.9988085293 +x_0=600000 +y_0=600000 +a=6378298.3 +b=6356657.142669562 +pm=madrid +units=m +no_defs <> +# Dabola 1981 / UTM zone 28N +<2063> +proj=utm +zone=28 +a=6378249.2 +b=6356515 +towgs84=-23,259,-9,0,0,0,0 +units=m +no_defs <> +# Dabola 1981 / UTM zone 29N +<2064> +proj=utm +zone=29 +a=6378249.2 +b=6356515 +towgs84=-23,259,-9,0,0,0,0 +units=m +no_defs <> +# S-JTSK (Ferro) / Krovak +<2065> +proj=krovak +lat_0=49.5 +lon_0=24.83333333333333 +alpha=30.28813972222222 +k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +pm=ferro +units=m +no_defs <> +# Mount Dillon / Tobago Grid +<2066> +proj=cass +lat_0=11.25217861111111 +lon_0=-60.68600888888889 +x_0=37718.66154375 +y_0=36209.915082 +a=6378293.63683822 +b=6356617.979337744 +to_meter=0.2011661949 +no_defs <> +# Naparima 1955 / UTM zone 20N +<2067> +proj=utm +zone=20 +ellps=intl +units=m +no_defs <> +# ELD79 / Libya zone 5 +<2068> +proj=tmerc +lat_0=0 +lon_0=9 +k=0.999900 +x_0=200000 +y_0=0 +ellps=intl +units=m +no_defs <> +# ELD79 / Libya zone 6 +<2069> +proj=tmerc +lat_0=0 +lon_0=11 +k=0.999900 +x_0=200000 +y_0=0 +ellps=intl +units=m +no_defs <> +# ELD79 / Libya zone 7 +<2070> +proj=tmerc +lat_0=0 +lon_0=13 +k=0.999900 +x_0=200000 +y_0=0 +ellps=intl +units=m +no_defs <> +# ELD79 / Libya zone 8 +<2071> +proj=tmerc +lat_0=0 +lon_0=15 +k=0.999900 +x_0=200000 +y_0=0 +ellps=intl +units=m +no_defs <> +# ELD79 / Libya zone 9 +<2072> +proj=tmerc +lat_0=0 +lon_0=17 +k=0.999900 +x_0=200000 +y_0=0 +ellps=intl +units=m +no_defs <> +# ELD79 / Libya zone 10 +<2073> +proj=tmerc +lat_0=0 +lon_0=19 +k=0.999900 +x_0=200000 +y_0=0 +ellps=intl +units=m +no_defs <> +# ELD79 / Libya zone 11 +<2074> +proj=tmerc +lat_0=0 +lon_0=21 +k=0.999900 +x_0=200000 +y_0=0 +ellps=intl +units=m +no_defs <> +# ELD79 / Libya zone 12 +<2075> +proj=tmerc +lat_0=0 +lon_0=23 +k=0.999900 +x_0=200000 +y_0=0 +ellps=intl +units=m +no_defs <> +# ELD79 / Libya zone 13 +<2076> +proj=tmerc +lat_0=0 +lon_0=25 +k=0.999900 +x_0=200000 +y_0=0 +ellps=intl +units=m +no_defs <> +# ELD79 / UTM zone 32N +<2077> +proj=utm +zone=32 +ellps=intl +units=m +no_defs <> +# ELD79 / UTM zone 33N +<2078> +proj=utm +zone=33 +ellps=intl +units=m +no_defs <> +# ELD79 / UTM zone 34N +<2079> +proj=utm +zone=34 +ellps=intl +units=m +no_defs <> +# ELD79 / UTM zone 35N +<2080> +proj=utm +zone=35 +ellps=intl +units=m +no_defs <> +# Chos Malal 1914 / Argentina zone 2 +<2081> +proj=tmerc +lat_0=-90 +lon_0=-69 +k=1.000000 +x_0=2500000 +y_0=0 +ellps=intl +units=m +no_defs <> +# Pampa del Castillo / Argentina zone 2 +<2082> +proj=tmerc +lat_0=-90 +lon_0=-69 +k=1.000000 +x_0=2500000 +y_0=0 +ellps=intl +units=m +no_defs <> +# Hito XVIII 1963 / Argentina zone 2 +<2083> +proj=tmerc +lat_0=-90 +lon_0=-69 +k=1.000000 +x_0=2500000 +y_0=0 +ellps=intl +towgs84=18.38,192.45,96.82,0.056,-0.142,-0.2,-0.0013 +units=m +no_defs <> +# Hito XVIII 1963 / UTM zone 19S +<2084> +proj=utm +zone=19 +south +ellps=intl +towgs84=18.38,192.45,96.82,0.056,-0.142,-0.2,-0.0013 +units=m +no_defs <> +# NAD27 / Cuba Norte +<2085> +proj=lcc +lat_1=22.35 +lat_0=22.35 +lon_0=-81 +k_0=0.99993602 +x_0=500000 +y_0=280296.016 +ellps=clrk66 +datum=NAD27 +units=m +no_defs <> +# NAD27 / Cuba Sur +<2086> +proj=lcc +lat_1=20.71666666666667 +lat_0=20.71666666666667 +lon_0=-76.83333333333333 +k_0=0.99994848 +x_0=500000 +y_0=229126.939 +ellps=clrk66 +datum=NAD27 +units=m +no_defs <> +# ELD79 / TM 12 NE +<2087> +proj=tmerc +lat_0=0 +lon_0=12 +k=0.999600 +x_0=500000 +y_0=0 +ellps=intl +units=m +no_defs <> +# Carthage / TM 11 NE +<2088> +proj=tmerc +lat_0=0 +lon_0=11 +k=0.999600 +x_0=500000 +y_0=0 +a=6378249.2 +b=6356515 +units=m +no_defs <> +# Yemen NGN96 / UTM zone 38N +<2089> +proj=utm +zone=38 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Yemen NGN96 / UTM zone 39N +<2090> +proj=utm +zone=39 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# South Yemen / Gauss Kruger zone 8 +<2091> +proj=tmerc +lat_0=0 +lon_0=45 +k=1.000000 +x_0=8500000 +y_0=0 +ellps=krass +towgs84=-76,-138,67,0,0,0,0 +units=m +no_defs <> +# South Yemen / Gauss Kruger zone 9 +<2092> +proj=tmerc +lat_0=0 +lon_0=51 +k=1.000000 +x_0=9500000 +y_0=0 +ellps=krass +towgs84=-76,-138,67,0,0,0,0 +units=m +no_defs <> +# Hanoi 1972 / GK 106 NE +<2093> +proj=tmerc +lat_0=0 +lon_0=106 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +towgs84=-17.51,-108.32,-62.39,0,0,0,0 +units=m +no_defs <> +# WGS 72BE / TM 106 NE +<2094> +proj=tmerc +lat_0=0 +lon_0=106 +k=0.999600 +x_0=500000 +y_0=0 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# Bissau / UTM zone 28N +<2095> +proj=utm +zone=28 +ellps=intl +towgs84=-173,253,27,0,0,0,0 +units=m +no_defs <> +# Korean 1985 / Korea East Belt +<2096> +proj=tmerc +lat_0=38 +lon_0=129 +k=1.000000 +x_0=200000 +y_0=500000 +ellps=bessel +units=m +no_defs <> +# Korean 1985 / Korea Central Belt +<2097> +proj=tmerc +lat_0=38 +lon_0=127 +k=1.000000 +x_0=200000 +y_0=500000 +ellps=bessel +units=m +no_defs <> +# Korean 1985 / Korea West Belt +<2098> +proj=tmerc +lat_0=38 +lon_0=125 +k=1.000000 +x_0=200000 +y_0=500000 +ellps=bessel +units=m +no_defs <> +# Qatar 1948 / Qatar Grid +<2099> +proj=cass +lat_0=25.38236111111111 +lon_0=50.76138888888889 +x_0=100000 +y_0=100000 +ellps=helmert +units=m +no_defs <> +# GGRS87 / Greek Grid +<2100> +proj=tmerc +lat_0=0 +lon_0=24 +k=0.999600 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=-199.87,74.79,246.62,0,0,0,0 +units=m +no_defs <> +# Lake / Maracaibo Grid M1 +<2101> +proj=lcc +lat_1=10.16666666666667 +lat_0=10.16666666666667 +lon_0=-71.60561777777777 +k_0=1 +x_0=0 +y_0=-52684.972 +ellps=intl +units=m +no_defs <> +# Lake / Maracaibo Grid +<2102> +proj=lcc +lat_1=10.16666666666667 +lat_0=10.16666666666667 +lon_0=-71.60561777777777 +k_0=1 +x_0=200000 +y_0=147315.028 +ellps=intl +units=m +no_defs <> +# Lake / Maracaibo Grid M3 +<2103> +proj=lcc +lat_1=10.16666666666667 +lat_0=10.16666666666667 +lon_0=-71.60561777777777 +k_0=1 +x_0=500000 +y_0=447315.028 +ellps=intl +units=m +no_defs <> +# Lake / Maracaibo La Rosa Grid +<2104> +proj=lcc +lat_1=10.16666666666667 +lat_0=10.16666666666667 +lon_0=-71.60561777777777 +k_0=1 +x_0=-17044 +y_0=-23139.97 +ellps=intl +units=m +no_defs <> +# NZGD2000 / Mount Eden Circuit 2000 +<2105> +proj=tmerc +lat_0=-36.87972222222222 +lon_0=174.7641666666667 +k=0.999900 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NZGD2000 / Bay of Plenty Circuit 2000 +<2106> +proj=tmerc +lat_0=-37.76111111111111 +lon_0=176.4661111111111 +k=1.000000 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NZGD2000 / Poverty Bay Circuit 2000 +<2107> +proj=tmerc +lat_0=-38.62444444444444 +lon_0=177.8855555555556 +k=1.000000 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NZGD2000 / Hawkes Bay Circuit 2000 +<2108> +proj=tmerc +lat_0=-39.65083333333333 +lon_0=176.6736111111111 +k=1.000000 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NZGD2000 / Taranaki Circuit 2000 +<2109> +proj=tmerc +lat_0=-39.13555555555556 +lon_0=174.2277777777778 +k=1.000000 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NZGD2000 / Tuhirangi Circuit 2000 +<2110> +proj=tmerc +lat_0=-39.51222222222222 +lon_0=175.64 +k=1.000000 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NZGD2000 / Wanganui Circuit 2000 +<2111> +proj=tmerc +lat_0=-40.24194444444444 +lon_0=175.4880555555555 +k=1.000000 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NZGD2000 / Wairarapa Circuit 2000 +<2112> +proj=tmerc +lat_0=-40.92527777777777 +lon_0=175.6472222222222 +k=1.000000 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NZGD2000 / Wellington Circuit 2000 +<2113> +proj=tmerc +lat_0=-41.3011111111111 +lon_0=174.7763888888889 +k=1.000000 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NZGD2000 / Collingwood Circuit 2000 +<2114> +proj=tmerc +lat_0=-40.71472222222223 +lon_0=172.6719444444444 +k=1.000000 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NZGD2000 / Nelson Circuit 2000 +<2115> +proj=tmerc +lat_0=-41.27444444444444 +lon_0=173.2991666666667 +k=1.000000 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NZGD2000 / Karamea Circuit 2000 +<2116> +proj=tmerc +lat_0=-41.28972222222222 +lon_0=172.1088888888889 +k=1.000000 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NZGD2000 / Buller Circuit 2000 +<2117> +proj=tmerc +lat_0=-41.81055555555555 +lon_0=171.5811111111111 +k=1.000000 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NZGD2000 / Grey Circuit 2000 +<2118> +proj=tmerc +lat_0=-42.33361111111111 +lon_0=171.5497222222222 +k=1.000000 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NZGD2000 / Amuri Circuit 2000 +<2119> +proj=tmerc +lat_0=-42.68888888888888 +lon_0=173.01 +k=1.000000 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NZGD2000 / Marlborough Circuit 2000 +<2120> +proj=tmerc +lat_0=-41.54444444444444 +lon_0=173.8019444444444 +k=1.000000 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NZGD2000 / Hokitika Circuit 2000 +<2121> +proj=tmerc +lat_0=-42.88611111111111 +lon_0=170.9797222222222 +k=1.000000 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NZGD2000 / Okarito Circuit 2000 +<2122> +proj=tmerc +lat_0=-43.11 +lon_0=170.2608333333333 +k=1.000000 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NZGD2000 / Jacksons Bay Circuit 2000 +<2123> +proj=tmerc +lat_0=-43.97777777777778 +lon_0=168.6061111111111 +k=1.000000 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NZGD2000 / Mount Pleasant Circuit 2000 +<2124> +proj=tmerc +lat_0=-43.59055555555556 +lon_0=172.7269444444445 +k=1.000000 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NZGD2000 / Gawler Circuit 2000 +<2125> +proj=tmerc +lat_0=-43.74861111111111 +lon_0=171.3605555555555 +k=1.000000 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NZGD2000 / Timaru Circuit 2000 +<2126> +proj=tmerc +lat_0=-44.40194444444445 +lon_0=171.0572222222222 +k=1.000000 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NZGD2000 / Lindis Peak Circuit 2000 +<2127> +proj=tmerc +lat_0=-44.735 +lon_0=169.4675 +k=1.000000 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NZGD2000 / Mount Nicholas Circuit 2000 +<2128> +proj=tmerc +lat_0=-45.13277777777778 +lon_0=168.3986111111111 +k=1.000000 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NZGD2000 / Mount York Circuit 2000 +<2129> +proj=tmerc +lat_0=-45.56361111111111 +lon_0=167.7386111111111 +k=1.000000 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NZGD2000 / Observation Point Circuit 2000 +<2130> +proj=tmerc +lat_0=-45.81611111111111 +lon_0=170.6283333333333 +k=1.000000 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NZGD2000 / North Taieri Circuit 2000 +<2131> +proj=tmerc +lat_0=-45.86138888888889 +lon_0=170.2825 +k=0.999960 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NZGD2000 / Bluff Circuit 2000 +<2132> +proj=tmerc +lat_0=-46.6 +lon_0=168.3427777777778 +k=1.000000 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NZGD2000 / UTM zone 58S +<2133> +proj=utm +zone=58 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NZGD2000 / UTM zone 59S +<2134> +proj=utm +zone=59 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NZGD2000 / UTM zone 60S +<2135> +proj=utm +zone=60 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Accra / Ghana National Grid +<2136> +proj=tmerc +lat_0=4.666666666666667 +lon_0=-1 +k=0.999750 +x_0=274319.7391633579 +y_0=0 +a=6378300 +b=6356751.689189189 +towgs84=-199,32,322,0,0,0,0 +to_meter=0.3047997101815088 +no_defs <> +# Accra / TM 1 NW +<2137> +proj=tmerc +lat_0=0 +lon_0=-1 +k=0.999600 +x_0=500000 +y_0=0 +a=6378300 +b=6356751.689189189 +towgs84=-199,32,322,0,0,0,0 +units=m +no_defs <> +# NAD27(CGQ77) / Quebec Lambert +<2138> +proj=lcc +lat_1=60 +lat_2=46 +lat_0=44 +lon_0=-68.5 +x_0=0 +y_0=0 +ellps=clrk66 +units=m +no_defs <> +# NAD83(CSRS98) / SCoPQ zone 2 +<2139> +proj=tmerc +lat_0=0 +lon_0=-55.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS98) / MTM zone 3 +<2140> +proj=tmerc +lat_0=0 +lon_0=-58.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS98) / MTM zone 4 +<2141> +proj=tmerc +lat_0=0 +lon_0=-61.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS98) / MTM zone 5 +<2142> +proj=tmerc +lat_0=0 +lon_0=-64.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS98) / MTM zone 6 +<2143> +proj=tmerc +lat_0=0 +lon_0=-67.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS98) / MTM zone 7 +<2144> +proj=tmerc +lat_0=0 +lon_0=-70.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS98) / MTM zone 8 +<2145> +proj=tmerc +lat_0=0 +lon_0=-73.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS98) / MTM zone 9 +<2146> +proj=tmerc +lat_0=0 +lon_0=-76.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS98) / MTM zone 10 +<2147> +proj=tmerc +lat_0=0 +lon_0=-79.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS98) / UTM zone 21N +<2148> +proj=utm +zone=21 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS98) / UTM zone 18N +<2149> +proj=utm +zone=18 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS98) / UTM zone 17N +<2150> +proj=utm +zone=17 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS98) / UTM zone 13N +<2151> +proj=utm +zone=13 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS98) / UTM zone 12N +<2152> +proj=utm +zone=12 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS98) / UTM zone 11N +<2153> +proj=utm +zone=11 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# RGF93 / Lambert-93 +<2154> +proj=lcc +lat_1=49 +lat_2=44 +lat_0=46.5 +lon_0=3 +x_0=700000 +y_0=6600000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# American Samoa 1962 / American Samoa Lambert +<2155> +proj=lcc +lat_1=-14.26666666666667 +lat_0=-14.26666666666667 +lon_0=170 +k_0=1 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +towgs84=-115,118,426,0,0,0,0 +to_meter=0.3048006096012192 +no_defs <> +# NAD83(HARN) / UTM zone 59S +<2156> +proj=utm +zone=59 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# IRENET95 / Irish Transverse Mercator +<2157> +proj=tmerc +lat_0=53.5 +lon_0=-8 +k=0.999820 +x_0=600000 +y_0=750000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# IRENET95 / UTM zone 29N +<2158> +proj=utm +zone=29 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Sierra Leone 1924 / New Colony Grid +<2159> +proj=tmerc +lat_0=6.666666666666667 +lon_0=-12 +k=1.000000 +x_0=152399.8550907544 +y_0=0 +a=6378300 +b=6356751.689189189 +to_meter=0.3047997101815088 +no_defs <> +# Sierra Leone 1924 / New War Office Grid +<2160> +proj=tmerc +lat_0=6.666666666666667 +lon_0=-12 +k=1.000000 +x_0=243839.7681452071 +y_0=182879.8261089053 +a=6378300 +b=6356751.689189189 +to_meter=0.3047997101815088 +no_defs <> +# Sierra Leone 1968 / UTM zone 28N +<2161> +proj=utm +zone=28 +ellps=clrk80 +towgs84=-88,4,101,0,0,0,0 +units=m +no_defs <> +# Sierra Leone 1968 / UTM zone 29N +<2162> +proj=utm +zone=29 +ellps=clrk80 +towgs84=-88,4,101,0,0,0,0 +units=m +no_defs <> +# US National Atlas Equal Area +<2163> +proj=laea +lat_0=45 +lon_0=-100 +x_0=0 +y_0=0 +a=6370997 +b=6370997 +units=m +no_defs <> +# Locodjo 1965 / TM 5 NW +<2164> +proj=tmerc +lat_0=0 +lon_0=-5 +k=0.999600 +x_0=500000 +y_0=0 +ellps=clrk80 +towgs84=-125,53,467,0,0,0,0 +units=m +no_defs <> +# Abidjan 1987 / TM 5 NW +<2165> +proj=tmerc +lat_0=0 +lon_0=-5 +k=0.999600 +x_0=500000 +y_0=0 +ellps=clrk80 +towgs84=-124.76,53,466.79,0,0,0,0 +units=m +no_defs <> +# Pulkovo 1942(83) / Gauss Kruger zone 3 +<2166> +proj=tmerc +lat_0=0 +lon_0=9 +k=1.000000 +x_0=3500000 +y_0=0 +ellps=krass +towgs84=24,-123,-94,0.02,-0.25,-0.13,1.1 +units=m +no_defs <> +# Pulkovo 1942(83) / Gauss Kruger zone 4 +<2167> +proj=tmerc +lat_0=0 +lon_0=12 +k=1.000000 +x_0=4500000 +y_0=0 +ellps=krass +towgs84=24,-123,-94,0.02,-0.25,-0.13,1.1 +units=m +no_defs <> +# Pulkovo 1942(83) / Gauss Kruger zone 5 +<2168> +proj=tmerc +lat_0=0 +lon_0=15 +k=1.000000 +x_0=5500000 +y_0=0 +ellps=krass +towgs84=24,-123,-94,0.02,-0.25,-0.13,1.1 +units=m +no_defs <> +# Luxembourg 1930 / Gauss +<2169> +proj=tmerc +lat_0=49.83333333333334 +lon_0=6.166666666666667 +k=1.000000 +x_0=80000 +y_0=100000 +ellps=intl +towgs84=-193,13.7,-39.3,-0.41,-2.933,2.688,0.43 +units=m +no_defs <> +# MGI / Slovenia Grid +<2170> +proj=tmerc +lat_0=0 +lon_0=15 +k=0.999900 +x_0=500000 +y_0=0 +ellps=bessel +units=m +no_defs <> +# Pulkovo 1942(58) / Poland zone I +<2171> +proj=stere +lat_0=50.625 +lon_0=21.08333333333333 +k=0.999800 +x_0=4637000 +y_0=5647000 +ellps=krass +towgs84=33.4,-146.6,-76.3,-0.359,-0.053,0.844,-0.84 +units=m +no_defs <> +# Pulkovo 1942(58) / Poland zone II +<2172> +proj=stere +lat_0=53.00194444444445 +lon_0=21.50277777777778 +k=0.999800 +x_0=4603000 +y_0=5806000 +ellps=krass +towgs84=33.4,-146.6,-76.3,-0.359,-0.053,0.844,-0.84 +units=m +no_defs <> +# Pulkovo 1942(58) / Poland zone III +<2173> +proj=stere +lat_0=53.58333333333334 +lon_0=17.00833333333333 +k=0.999800 +x_0=3501000 +y_0=5999000 +ellps=krass +towgs84=33.4,-146.6,-76.3,-0.359,-0.053,0.844,-0.84 +units=m +no_defs <> +# Pulkovo 1942(58) / Poland zone IV +<2174> +proj=stere +lat_0=51.67083333333333 +lon_0=16.67222222222222 +k=0.999800 +x_0=3703000 +y_0=5627000 +ellps=krass +towgs84=33.4,-146.6,-76.3,-0.359,-0.053,0.844,-0.84 +units=m +no_defs <> +# Pulkovo 1942(58) / Poland zone V +<2175> +proj=tmerc +lat_0=0 +lon_0=18.95833333333333 +k=0.999983 +x_0=237000 +y_0=-4700000 +ellps=krass +towgs84=33.4,-146.6,-76.3,-0.359,-0.053,0.844,-0.84 +units=m +no_defs <> +# ETRS89 / Poland CS2000 zone 5 +<2176> +proj=tmerc +lat_0=0 +lon_0=15 +k=0.999923 +x_0=5500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# ETRS89 / Poland CS2000 zone 6 +<2177> +proj=tmerc +lat_0=0 +lon_0=18 +k=0.999923 +x_0=6500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# ETRS89 / Poland CS2000 zone 7 +<2178> +proj=tmerc +lat_0=0 +lon_0=21 +k=0.999923 +x_0=7500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# ETRS89 / Poland CS2000 zone 8 +<2179> +proj=tmerc +lat_0=0 +lon_0=24 +k=0.999923 +x_0=8500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# ETRS89 / Poland CS92 +<2180> +proj=tmerc +lat_0=0 +lon_0=19 +k=0.999300 +x_0=500000 +y_0=-5300000 +ellps=GRS80 +units=m +no_defs <> +# Azores Occidental 1939 / UTM zone 25N +<2188> +proj=utm +zone=25 +ellps=intl +units=m +no_defs <> +# Azores Central 1948 / UTM zone 26N +<2189> +proj=utm +zone=26 +ellps=intl +units=m +no_defs <> +# Azores Oriental 1940 / UTM zone 26N +<2190> +proj=utm +zone=26 +ellps=intl +units=m +no_defs <> +# Madeira 1936 / UTM zone 28N +<2191> +proj=utm +zone=28 +ellps=intl +units=m +no_defs <> +# ED50 / France EuroLambert +<2192> +proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=2.337229166666667 +k_0=0.99987742 +x_0=600000 +y_0=2200000 +ellps=intl +units=m +no_defs <> +# NZGD2000 / New Zealand Transverse Mercator +<2193> +proj=tmerc +lat_0=0 +lon_0=173 +k=0.999600 +x_0=1600000 +y_0=10000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# American Samoa 1962 / American Samoa Lambert +<2194> +proj=lcc +lat_1=-14.26666666666667 +lat_0=-14.26666666666667 +lon_0=-170 +k_0=1 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +towgs84=-115,118,426,0,0,0,0 +to_meter=0.3048006096012192 +no_defs <> +# NAD83(HARN) / UTM zone 2S +<2195> +proj=utm +zone=2 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ETRS89 / Kp2000 Jutland +<2196> +proj=tmerc +lat_0=0 +lon_0=9.5 +k=0.999950 +x_0=200000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# ETRS89 / Kp2000 Zealand +<2197> +proj=tmerc +lat_0=0 +lon_0=12 +k=0.999950 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# ETRS89 / Kp2000 Bornholm +<2198> +proj=tmerc +lat_0=0 +lon_0=15 +k=1.000000 +x_0=900000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# Albanian 1987 / Gauss Kruger zone 4 +<2199> +proj=tmerc +lat_0=0 +lon_0=21 +k=1.000000 +x_0=4500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# ATS77 / New Brunswick Stereographic (ATS77) +<2200> +proj=stere +lat_0=46.5 +lon_0=-66.5 +k=0.999912 +x_0=300000 +y_0=800000 +a=6378135 +b=6356750.304921594 +units=m +no_defs <> +# REGVEN / UTM zone 18N +<2201> +proj=utm +zone=18 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# REGVEN / UTM zone 19N +<2202> +proj=utm +zone=19 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# REGVEN / UTM zone 20N +<2203> +proj=utm +zone=20 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD27 / Tennessee +<2204> +proj=lcc +lat_1=35.25 +lat_2=36.41666666666666 +lat_0=34.66666666666666 +lon_0=-86 +x_0=609601.2192024384 +y_0=30480.06096012192 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD83 / Kentucky North +<2205> +proj=lcc +lat_1=37.96666666666667 +lat_2=38.96666666666667 +lat_0=37.5 +lon_0=-84.25 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# ED50 / 3-degree Gauss-Kruger zone 9 +<2206> +proj=tmerc +lat_0=0 +lon_0=27 +k=1.000000 +x_0=9500000 +y_0=0 +ellps=intl +units=m +no_defs <> +# ED50 / 3-degree Gauss-Kruger zone 10 +<2207> +proj=tmerc +lat_0=0 +lon_0=30 +k=1.000000 +x_0=10500000 +y_0=0 +ellps=intl +units=m +no_defs <> +# ED50 / 3-degree Gauss-Kruger zone 11 +<2208> +proj=tmerc +lat_0=0 +lon_0=33 +k=1.000000 +x_0=11500000 +y_0=0 +ellps=intl +units=m +no_defs <> +# ED50 / 3-degree Gauss-Kruger zone 12 +<2209> +proj=tmerc +lat_0=0 +lon_0=36 +k=1.000000 +x_0=12500000 +y_0=0 +ellps=intl +units=m +no_defs <> +# ED50 / 3-degree Gauss-Kruger zone 13 +<2210> +proj=tmerc +lat_0=0 +lon_0=39 +k=1.000000 +x_0=13500000 +y_0=0 +ellps=intl +units=m +no_defs <> +# ED50 / 3-degree Gauss-Kruger zone 14 +<2211> +proj=tmerc +lat_0=0 +lon_0=42 +k=1.000000 +x_0=14500000 +y_0=0 +ellps=intl +units=m +no_defs <> +# ED50 / 3-degree Gauss-Kruger zone 15 +<2212> +proj=tmerc +lat_0=0 +lon_0=45 +k=1.000000 +x_0=15500000 +y_0=0 +ellps=intl +units=m +no_defs <> +# ETRS89 / TM 30 NE +<2213> +proj=tmerc +lat_0=0 +lon_0=30 +k=0.999600 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# Douala 1948 / AOF west +<2214> +proj=tmerc +lat_0=0 +lon_0=10.5 +k=0.999000 +x_0=1000000 +y_0=1000000 +ellps=intl +units=m +no_defs <> +# Manoca 1962 / UTM zone 32N +<2215> +proj=utm +zone=32 +a=6378249.2 +b=6356515 +towgs84=-70.9,-151.8,-41.4,0,0,0,0 +units=m +no_defs <> +# Qornoq 1927 / UTM zone 22N +<2216> +proj=utm +zone=22 +ellps=intl +units=m +no_defs <> +# Qornoq 1927 / UTM zone 23N +<2217> +proj=utm +zone=23 +ellps=intl +units=m +no_defs <> +# ATS77 / UTM zone 19N +<2219> +proj=utm +zone=19 +a=6378135 +b=6356750.304921594 +units=m +no_defs <> +# ATS77 / UTM zone 20N +<2220> +proj=utm +zone=20 +a=6378135 +b=6356750.304921594 +units=m +no_defs <> +# NAD83 / Arizona East (ft) +<2222> +proj=tmerc +lat_0=31 +lon_0=-110.1666666666667 +k=0.999900 +x_0=213360 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048 +no_defs <> +# NAD83 / Arizona Central (ft) +<2223> +proj=tmerc +lat_0=31 +lon_0=-111.9166666666667 +k=0.999900 +x_0=213360 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048 +no_defs <> +# NAD83 / Arizona West (ft) +<2224> +proj=tmerc +lat_0=31 +lon_0=-113.75 +k=0.999933 +x_0=213360 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048 +no_defs <> +# NAD83 / California zone 1 (ftUS) +<2225> +proj=lcc +lat_1=41.66666666666666 +lat_2=40 +lat_0=39.33333333333334 +lon_0=-122 +x_0=2000000.0001016 +y_0=500000.0001016001 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD83 / California zone 2 (ftUS) +<2226> +proj=lcc +lat_1=39.83333333333334 +lat_2=38.33333333333334 +lat_0=37.66666666666666 +lon_0=-122 +x_0=2000000.0001016 +y_0=500000.0001016001 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD83 / California zone 3 (ftUS) +<2227> +proj=lcc +lat_1=38.43333333333333 +lat_2=37.06666666666667 +lat_0=36.5 +lon_0=-120.5 +x_0=2000000.0001016 +y_0=500000.0001016001 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD83 / California zone 4 (ftUS) +<2228> +proj=lcc +lat_1=37.25 +lat_2=36 +lat_0=35.33333333333334 +lon_0=-119 +x_0=2000000.0001016 +y_0=500000.0001016001 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD83 / California zone 5 (ftUS) +<2229> +proj=lcc +lat_1=35.46666666666667 +lat_2=34.03333333333333 +lat_0=33.5 +lon_0=-118 +x_0=2000000.0001016 +y_0=500000.0001016001 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD83 / California zone 6 (ftUS) +<2230> +proj=lcc +lat_1=33.88333333333333 +lat_2=32.78333333333333 +lat_0=32.16666666666666 +lon_0=-116.25 +x_0=2000000.0001016 +y_0=500000.0001016001 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD83 / Colorado North (ftUS) +<2231> +proj=lcc +lat_1=40.78333333333333 +lat_2=39.71666666666667 +lat_0=39.33333333333334 +lon_0=-105.5 +x_0=914401.8288036576 +y_0=304800.6096012192 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD83 / Colorado Central (ftUS) +<2232> +proj=lcc +lat_1=39.75 +lat_2=38.45 +lat_0=37.83333333333334 +lon_0=-105.5 +x_0=914401.8288036576 +y_0=304800.6096012192 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD83 / Colorado South (ftUS) +<2233> +proj=lcc +lat_1=38.43333333333333 +lat_2=37.23333333333333 +lat_0=36.66666666666666 +lon_0=-105.5 +x_0=914401.8288036576 +y_0=304800.6096012192 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD83 / Connecticut (ftUS) +<2234> +proj=lcc +lat_1=41.86666666666667 +lat_2=41.2 +lat_0=40.83333333333334 +lon_0=-72.75 +x_0=304800.6096012192 +y_0=152400.3048006096 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD83 / Delaware (ftUS) +<2235> +proj=tmerc +lat_0=38 +lon_0=-75.41666666666667 +k=0.999995 +x_0=200000.0001016002 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD83 / Florida East (ftUS) +<2236> +proj=tmerc +lat_0=24.33333333333333 +lon_0=-81 +k=0.999941 +x_0=200000.0001016002 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD83 / Florida West (ftUS) +<2237> +proj=tmerc +lat_0=24.33333333333333 +lon_0=-82 +k=0.999941 +x_0=200000.0001016002 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD83 / Florida North (ftUS) +<2238> +proj=lcc +lat_1=30.75 +lat_2=29.58333333333333 +lat_0=29 +lon_0=-84.5 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD83 / Georgia East (ftUS) +<2239> +proj=tmerc +lat_0=30 +lon_0=-82.16666666666667 +k=0.999900 +x_0=200000.0001016002 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD83 / Georgia West (ftUS) +<2240> +proj=tmerc +lat_0=30 +lon_0=-84.16666666666667 +k=0.999900 +x_0=699999.9998983998 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD83 / Idaho East (ftUS) +<2241> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-112.1666666666667 +k=0.999947 +x_0=200000.0001016002 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD83 / Idaho Central (ftUS) +<2242> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-114 +k=0.999947 +x_0=500000.0001016001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD83 / Idaho West (ftUS) +<2243> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-115.75 +k=0.999933 +x_0=800000.0001016001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD83 / Indiana East (ftUS) +<2244> +proj=tmerc +lat_0=37.5 +lon_0=-85.66666666666667 +k=0.999967 +x_0=99999.99989839978 +y_0=249364.9987299975 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD83 / Indiana West (ftUS) +<2245> +proj=tmerc +lat_0=37.5 +lon_0=-87.08333333333333 +k=0.999967 +x_0=900000 +y_0=249364.9987299975 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD83 / Kentucky North (ftUS) +<2246> +proj=lcc +lat_1=37.96666666666667 +lat_2=38.96666666666667 +lat_0=37.5 +lon_0=-84.25 +x_0=500000.0001016001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD83 / Kentucky South (ftUS) +<2247> +proj=lcc +lat_1=37.93333333333333 +lat_2=36.73333333333333 +lat_0=36.33333333333334 +lon_0=-85.75 +x_0=500000.0001016001 +y_0=500000.0001016001 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD83 / Maryland (ftUS) +<2248> +proj=lcc +lat_1=39.45 +lat_2=38.3 +lat_0=37.66666666666666 +lon_0=-77 +x_0=399999.9998983998 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD83 / Massachusetts Mainland (ftUS) +<2249> +proj=lcc +lat_1=42.68333333333333 +lat_2=41.71666666666667 +lat_0=41 +lon_0=-71.5 +x_0=200000.0001016002 +y_0=750000 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD83 / Massachusetts Island (ftUS) +<2250> +proj=lcc +lat_1=41.48333333333333 +lat_2=41.28333333333333 +lat_0=41 +lon_0=-70.5 +x_0=500000.0001016001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD83 / Michigan North (ft) +<2251> +proj=lcc +lat_1=47.08333333333334 +lat_2=45.48333333333333 +lat_0=44.78333333333333 +lon_0=-87 +x_0=7999999.999968001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048 +no_defs <> +# NAD83 / Michigan Central (ft) +<2252> +proj=lcc +lat_1=45.7 +lat_2=44.18333333333333 +lat_0=43.31666666666667 +lon_0=-84.36666666666666 +x_0=5999999.999976001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048 +no_defs <> +# NAD83 / Michigan South (ft) +<2253> +proj=lcc +lat_1=43.66666666666666 +lat_2=42.1 +lat_0=41.5 +lon_0=-84.36666666666666 +x_0=3999999.999984 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048 +no_defs <> +# NAD83 / Mississippi East (ftUS) +<2254> +proj=tmerc +lat_0=29.5 +lon_0=-88.83333333333333 +k=0.999950 +x_0=300000.0000000001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD83 / Mississippi West (ftUS) +<2255> +proj=tmerc +lat_0=29.5 +lon_0=-90.33333333333333 +k=0.999950 +x_0=699999.9998983998 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD83 / Montana (ft) +<2256> +proj=lcc +lat_1=49 +lat_2=45 +lat_0=44.25 +lon_0=-109.5 +x_0=599999.9999976 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048 +no_defs <> +# NAD83 / New Mexico East (ftUS) +<2257> +proj=tmerc +lat_0=31 +lon_0=-104.3333333333333 +k=0.999909 +x_0=165000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD83 / New Mexico Central (ftUS) +<2258> +proj=tmerc +lat_0=31 +lon_0=-106.25 +k=0.999900 +x_0=500000.0001016001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD83 / New Mexico West (ftUS) +<2259> +proj=tmerc +lat_0=31 +lon_0=-107.8333333333333 +k=0.999917 +x_0=830000.0001016001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD83 / New York East (ftUS) +<2260> +proj=tmerc +lat_0=38.83333333333334 +lon_0=-74.5 +k=0.999900 +x_0=150000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD83 / New York Central (ftUS) +<2261> +proj=tmerc +lat_0=40 +lon_0=-76.58333333333333 +k=0.999938 +x_0=249999.9998983998 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD83 / New York West (ftUS) +<2262> +proj=tmerc +lat_0=40 +lon_0=-78.58333333333333 +k=0.999938 +x_0=350000.0001016001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD83 / New York Long Island (ftUS) +<2263> +proj=lcc +lat_1=41.03333333333333 +lat_2=40.66666666666666 +lat_0=40.16666666666666 +lon_0=-74 +x_0=300000.0000000001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD83 / North Carolina (ftUS) +<2264> +proj=lcc +lat_1=36.16666666666666 +lat_2=34.33333333333334 +lat_0=33.75 +lon_0=-79 +x_0=609601.2192024384 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD83 / North Dakota North (ft) +<2265> +proj=lcc +lat_1=48.73333333333333 +lat_2=47.43333333333333 +lat_0=47 +lon_0=-100.5 +x_0=599999.9999976 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048 +no_defs <> +# NAD83 / North Dakota South (ft) +<2266> +proj=lcc +lat_1=47.48333333333333 +lat_2=46.18333333333333 +lat_0=45.66666666666666 +lon_0=-100.5 +x_0=599999.9999976 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048 +no_defs <> +# NAD83 / Oklahoma North (ftUS) +<2267> +proj=lcc +lat_1=36.76666666666667 +lat_2=35.56666666666667 +lat_0=35 +lon_0=-98 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD83 / Oklahoma South (ftUS) +<2268> +proj=lcc +lat_1=35.23333333333333 +lat_2=33.93333333333333 +lat_0=33.33333333333334 +lon_0=-98 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD83 / Oregon North (ft) +<2269> +proj=lcc +lat_1=46 +lat_2=44.33333333333334 +lat_0=43.66666666666666 +lon_0=-120.5 +x_0=2500000.0001424 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048 +no_defs <> +# NAD83 / Oregon South (ft) +<2270> +proj=lcc +lat_1=44 +lat_2=42.33333333333334 +lat_0=41.66666666666666 +lon_0=-120.5 +x_0=1500000.0001464 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048 +no_defs <> +# NAD83 / Pennsylvania North (ftUS) +<2271> +proj=lcc +lat_1=41.95 +lat_2=40.88333333333333 +lat_0=40.16666666666666 +lon_0=-77.75 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD83 / Pennsylvania South (ftUS) +<2272> +proj=lcc +lat_1=40.96666666666667 +lat_2=39.93333333333333 +lat_0=39.33333333333334 +lon_0=-77.75 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD83 / South Carolina (ft) +<2273> +proj=lcc +lat_1=34.83333333333334 +lat_2=32.5 +lat_0=31.83333333333333 +lon_0=-81 +x_0=609600 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048 +no_defs <> +# NAD83 / Tennessee (ftUS) +<2274> +proj=lcc +lat_1=36.41666666666666 +lat_2=35.25 +lat_0=34.33333333333334 +lon_0=-86 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD83 / Texas North (ftUS) +<2275> +proj=lcc +lat_1=36.18333333333333 +lat_2=34.65 +lat_0=34 +lon_0=-101.5 +x_0=200000.0001016002 +y_0=999999.9998983998 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD83 / Texas North Central (ftUS) +<2276> +proj=lcc +lat_1=33.96666666666667 +lat_2=32.13333333333333 +lat_0=31.66666666666667 +lon_0=-98.5 +x_0=600000 +y_0=2000000.0001016 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD83 / Texas Central (ftUS) +<2277> +proj=lcc +lat_1=31.88333333333333 +lat_2=30.11666666666667 +lat_0=29.66666666666667 +lon_0=-100.3333333333333 +x_0=699999.9998983998 +y_0=3000000 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD83 / Texas South Central (ftUS) +<2278> +proj=lcc +lat_1=30.28333333333333 +lat_2=28.38333333333333 +lat_0=27.83333333333333 +lon_0=-99 +x_0=600000 +y_0=3999999.9998984 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD83 / Texas South (ftUS) +<2279> +proj=lcc +lat_1=27.83333333333333 +lat_2=26.16666666666667 +lat_0=25.66666666666667 +lon_0=-98.5 +x_0=300000.0000000001 +y_0=5000000.0001016 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD83 / Utah North (ft) +<2280> +proj=lcc +lat_1=41.78333333333333 +lat_2=40.71666666666667 +lat_0=40.33333333333334 +lon_0=-111.5 +x_0=500000.0001504 +y_0=999999.9999960001 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048 +no_defs <> +# NAD83 / Utah Central (ft) +<2281> +proj=lcc +lat_1=40.65 +lat_2=39.01666666666667 +lat_0=38.33333333333334 +lon_0=-111.5 +x_0=500000.0001504 +y_0=1999999.999992 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048 +no_defs <> +# NAD83 / Utah South (ft) +<2282> +proj=lcc +lat_1=38.35 +lat_2=37.21666666666667 +lat_0=36.66666666666666 +lon_0=-111.5 +x_0=500000.0001504 +y_0=2999999.999988 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048 +no_defs <> +# NAD83 / Virginia North (ftUS) +<2283> +proj=lcc +lat_1=39.2 +lat_2=38.03333333333333 +lat_0=37.66666666666666 +lon_0=-78.5 +x_0=3500000.0001016 +y_0=2000000.0001016 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD83 / Virginia South (ftUS) +<2284> +proj=lcc +lat_1=37.96666666666667 +lat_2=36.76666666666667 +lat_0=36.33333333333334 +lon_0=-78.5 +x_0=3500000.0001016 +y_0=999999.9998983998 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD83 / Washington North (ftUS) +<2285> +proj=lcc +lat_1=48.73333333333333 +lat_2=47.5 +lat_0=47 +lon_0=-120.8333333333333 +x_0=500000.0001016001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD83 / Washington South (ftUS) +<2286> +proj=lcc +lat_1=47.33333333333334 +lat_2=45.83333333333334 +lat_0=45.33333333333334 +lon_0=-120.5 +x_0=500000.0001016001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD83 / Wisconsin North (ftUS) +<2287> +proj=lcc +lat_1=46.76666666666667 +lat_2=45.56666666666667 +lat_0=45.16666666666666 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD83 / Wisconsin Central (ftUS) +<2288> +proj=lcc +lat_1=45.5 +lat_2=44.25 +lat_0=43.83333333333334 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD83 / Wisconsin South (ftUS) +<2289> +proj=lcc +lat_1=44.06666666666667 +lat_2=42.73333333333333 +lat_0=42 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# ATS77 / Prince Edward Isl. Stereographic (ATS77) +<2290> +proj=stere +lat_0=47.25 +lon_0=-63 +k=0.999912 +x_0=700000 +y_0=400000 +a=6378135 +b=6356750.304921594 +units=m +no_defs <> +# NAD83(CSRS98) / Prince Edward Isl. Stereographic (NAD83) +<2291> +proj=stere +lat_0=47.25 +lon_0=-63 +k=0.999912 +x_0=400000 +y_0=800000 +a=6378135 +b=6356750.304921594 +units=m +no_defs <> +# NAD83(CSRS98) / Prince Edward Isl. Stereographic (NAD83) +<2292> +proj=stere +lat_0=47.25 +lon_0=-63 +k=0.999912 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# ATS77 / MTM Nova Scotia zone 4 +<2294> +proj=tmerc +lat_0=0 +lon_0=-61.5 +k=0.999900 +x_0=4500000 +y_0=0 +a=6378135 +b=6356750.304921594 +units=m +no_defs <> +# ATS77 / MTM Nova Scotia zone 5 +<2295> +proj=tmerc +lat_0=0 +lon_0=-64.5 +k=0.999900 +x_0=5500000 +y_0=0 +a=6378135 +b=6356750.304921594 +units=m +no_defs <> +# Batavia / TM 109 SE +<2308> +proj=tmerc +lat_0=0 +lon_0=109 +k=0.999600 +x_0=500000 +y_0=10000000 +ellps=bessel +units=m +no_defs <> +# WGS 84 / TM 116 SE +<2309> +proj=tmerc +lat_0=0 +lon_0=116 +k=0.999600 +x_0=500000 +y_0=10000000 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / TM 132 SE +<2310> +proj=tmerc +lat_0=0 +lon_0=132 +k=0.999600 +x_0=500000 +y_0=10000000 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / TM 6 NE +<2311> +proj=tmerc +lat_0=0 +lon_0=6 +k=0.999600 +x_0=500000 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# Garoua / UTM zone 33N +<2312> +proj=utm +zone=33 +ellps=clrk80 +units=m +no_defs <> +# Kousseri / UTM zone 33N +<2313> +proj=utm +zone=33 +ellps=clrk80 +units=m +no_defs <> +# Trinidad 1903 / Trinidad Grid (ftCla) +<2314> +proj=cass +lat_0=10.44166666666667 +lon_0=-61.33333333333334 +x_0=86501.46380699999 +y_0=65379.01334249999 +a=6378293.63683822 +b=6356617.979337744 +towgs84=-61.702,284.488,472.052,0,0,0,0 +to_meter=0.304797265 +no_defs <> +# Campo Inchauspe / UTM zone 19S +<2315> +proj=utm +zone=19 +south +ellps=intl +units=m +no_defs <> +# Campo Inchauspe / UTM zone 20S +<2316> +proj=utm +zone=20 +south +ellps=intl +units=m +no_defs <> +# PSAD56 / ICN Regional +<2317> +proj=lcc +lat_1=9 +lat_2=3 +lat_0=6 +lon_0=-66 +x_0=1000000 +y_0=1000000 +ellps=intl +units=m +no_defs <> +# Ain el Abd / Aramco Lambert +<2318> +proj=lcc +lat_1=17 +lat_2=33 +lat_0=25.08951 +lon_0=48 +x_0=0 +y_0=0 +ellps=intl +units=m +no_defs <> +# ED50 / TM27 +<2319> +proj=tmerc +lat_0=0 +lon_0=27 +k=1.000000 +x_0=500000 +y_0=0 +ellps=intl +units=m +no_defs <> +# ED50 / TM30 +<2320> +proj=tmerc +lat_0=0 +lon_0=30 +k=1.000000 +x_0=500000 +y_0=0 +ellps=intl +units=m +no_defs <> +# ED50 / TM33 +<2321> +proj=tmerc +lat_0=0 +lon_0=33 +k=1.000000 +x_0=500000 +y_0=0 +ellps=intl +units=m +no_defs <> +# ED50 / TM36 +<2322> +proj=tmerc +lat_0=0 +lon_0=36 +k=1.000000 +x_0=500000 +y_0=0 +ellps=intl +units=m +no_defs <> +# ED50 / TM39 +<2323> +proj=tmerc +lat_0=0 +lon_0=39 +k=1.000000 +x_0=500000 +y_0=0 +ellps=intl +units=m +no_defs <> +# ED50 / TM42 +<2324> +proj=tmerc +lat_0=0 +lon_0=42 +k=1.000000 +x_0=500000 +y_0=0 +ellps=intl +units=m +no_defs <> +# ED50 / TM45 +<2325> +proj=tmerc +lat_0=0 +lon_0=45 +k=1.000000 +x_0=500000 +y_0=0 +ellps=intl +units=m +no_defs <> +# Hong Kong 1980 Grid System +<2326> +proj=tmerc +lat_0=22.31213333333334 +lon_0=114.1785555555556 +k=1.000000 +x_0=836694.05 +y_0=819069.8 +ellps=intl +towgs84=-162.619,-276.959,-161.764,0.067753,-2.24365,-1.15883,-1.09425 +units=m +no_defs <> +# Xian 1980 / Gauss-Kruger zone 13 +<2327> +proj=tmerc +lat_0=0 +lon_0=75 +k=1.000000 +x_0=13500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / Gauss-Kruger zone 14 +<2328> +proj=tmerc +lat_0=0 +lon_0=81 +k=1.000000 +x_0=14500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / Gauss-Kruger zone 15 +<2329> +proj=tmerc +lat_0=0 +lon_0=87 +k=1.000000 +x_0=15500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / Gauss-Kruger zone 16 +<2330> +proj=tmerc +lat_0=0 +lon_0=93 +k=1.000000 +x_0=16500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / Gauss-Kruger zone 17 +<2331> +proj=tmerc +lat_0=0 +lon_0=99 +k=1.000000 +x_0=17500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / Gauss-Kruger zone 18 +<2332> +proj=tmerc +lat_0=0 +lon_0=105 +k=1.000000 +x_0=18500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / Gauss-Kruger zone 19 +<2333> +proj=tmerc +lat_0=0 +lon_0=111 +k=1.000000 +x_0=19500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / Gauss-Kruger zone 20 +<2334> +proj=tmerc +lat_0=0 +lon_0=117 +k=1.000000 +x_0=20500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / Gauss-Kruger zone 21 +<2335> +proj=tmerc +lat_0=0 +lon_0=123 +k=1.000000 +x_0=21500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / Gauss-Kruger zone 22 +<2336> +proj=tmerc +lat_0=0 +lon_0=129 +k=1.000000 +x_0=22500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / Gauss-Kruger zone 23 +<2337> +proj=tmerc +lat_0=0 +lon_0=135 +k=1.000000 +x_0=23500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / Gauss-Kruger CM 75E +<2338> +proj=tmerc +lat_0=0 +lon_0=75 +k=1.000000 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / Gauss-Kruger CM 81E +<2339> +proj=tmerc +lat_0=0 +lon_0=81 +k=1.000000 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / Gauss-Kruger CM 87E +<2340> +proj=tmerc +lat_0=0 +lon_0=87 +k=1.000000 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / Gauss-Kruger CM 93E +<2341> +proj=tmerc +lat_0=0 +lon_0=93 +k=1.000000 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / Gauss-Kruger CM 99E +<2342> +proj=tmerc +lat_0=0 +lon_0=99 +k=1.000000 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / Gauss-Kruger CM 105E +<2343> +proj=tmerc +lat_0=0 +lon_0=105 +k=1.000000 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / Gauss-Kruger CM 111E +<2344> +proj=tmerc +lat_0=0 +lon_0=111 +k=1.000000 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / Gauss-Kruger CM 117E +<2345> +proj=tmerc +lat_0=0 +lon_0=117 +k=1.000000 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / Gauss-Kruger CM 123E +<2346> +proj=tmerc +lat_0=0 +lon_0=123 +k=1.000000 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / Gauss-Kruger CM 129E +<2347> +proj=tmerc +lat_0=0 +lon_0=129 +k=1.000000 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / Gauss-Kruger CM 135E +<2348> +proj=tmerc +lat_0=0 +lon_0=135 +k=1.000000 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger zone 25 +<2349> +proj=tmerc +lat_0=0 +lon_0=75 +k=1.000000 +x_0=25500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger zone 26 +<2350> +proj=tmerc +lat_0=0 +lon_0=78 +k=1.000000 +x_0=26500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger zone 27 +<2351> +proj=tmerc +lat_0=0 +lon_0=81 +k=1.000000 +x_0=27500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger zone 28 +<2352> +proj=tmerc +lat_0=0 +lon_0=84 +k=1.000000 +x_0=28500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger zone 29 +<2353> +proj=tmerc +lat_0=0 +lon_0=87 +k=1.000000 +x_0=29500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger zone 30 +<2354> +proj=tmerc +lat_0=0 +lon_0=90 +k=1.000000 +x_0=30500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger zone 31 +<2355> +proj=tmerc +lat_0=0 +lon_0=93 +k=1.000000 +x_0=31500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger zone 32 +<2356> +proj=tmerc +lat_0=0 +lon_0=96 +k=1.000000 +x_0=32500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger zone 33 +<2357> +proj=tmerc +lat_0=0 +lon_0=99 +k=1.000000 +x_0=33500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger zone 34 +<2358> +proj=tmerc +lat_0=0 +lon_0=102 +k=1.000000 +x_0=34500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger zone 35 +<2359> +proj=tmerc +lat_0=0 +lon_0=105 +k=1.000000 +x_0=35500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger zone 36 +<2360> +proj=tmerc +lat_0=0 +lon_0=108 +k=1.000000 +x_0=36500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger zone 37 +<2361> +proj=tmerc +lat_0=0 +lon_0=111 +k=1.000000 +x_0=37500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger zone 38 +<2362> +proj=tmerc +lat_0=0 +lon_0=114 +k=1.000000 +x_0=38500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger zone 39 +<2363> +proj=tmerc +lat_0=0 +lon_0=117 +k=1.000000 +x_0=39500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger zone 40 +<2364> +proj=tmerc +lat_0=0 +lon_0=120 +k=1.000000 +x_0=40500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger zone 41 +<2365> +proj=tmerc +lat_0=0 +lon_0=123 +k=1.000000 +x_0=41500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger zone 42 +<2366> +proj=tmerc +lat_0=0 +lon_0=126 +k=1.000000 +x_0=42500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger zone 43 +<2367> +proj=tmerc +lat_0=0 +lon_0=129 +k=1.000000 +x_0=43500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger zone 44 +<2368> +proj=tmerc +lat_0=0 +lon_0=132 +k=1.000000 +x_0=44500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger zone 45 +<2369> +proj=tmerc +lat_0=0 +lon_0=135 +k=1.000000 +x_0=45500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger CM 75E +<2370> +proj=tmerc +lat_0=0 +lon_0=75 +k=1.000000 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger CM 78E +<2371> +proj=tmerc +lat_0=0 +lon_0=78 +k=1.000000 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger CM 81E +<2372> +proj=tmerc +lat_0=0 +lon_0=81 +k=1.000000 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger CM 84E +<2373> +proj=tmerc +lat_0=0 +lon_0=84 +k=1.000000 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger CM 87E +<2374> +proj=tmerc +lat_0=0 +lon_0=87 +k=1.000000 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger CM 90E +<2375> +proj=tmerc +lat_0=0 +lon_0=90 +k=1.000000 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger CM 93E +<2376> +proj=tmerc +lat_0=0 +lon_0=93 +k=1.000000 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger CM 96E +<2377> +proj=tmerc +lat_0=0 +lon_0=96 +k=1.000000 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger CM 99E +<2378> +proj=tmerc +lat_0=0 +lon_0=99 +k=1.000000 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger CM 102E +<2379> +proj=tmerc +lat_0=0 +lon_0=102 +k=1.000000 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger CM 105E +<2380> +proj=tmerc +lat_0=0 +lon_0=105 +k=1.000000 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger CM 108E +<2381> +proj=tmerc +lat_0=0 +lon_0=108 +k=1.000000 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger CM 111E +<2382> +proj=tmerc +lat_0=0 +lon_0=111 +k=1.000000 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger CM 114E +<2383> +proj=tmerc +lat_0=0 +lon_0=114 +k=1.000000 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger CM 117E +<2384> +proj=tmerc +lat_0=0 +lon_0=117 +k=1.000000 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger CM 120E +<2385> +proj=tmerc +lat_0=0 +lon_0=120 +k=1.000000 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger CM 123E +<2386> +proj=tmerc +lat_0=0 +lon_0=123 +k=1.000000 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger CM 126E +<2387> +proj=tmerc +lat_0=0 +lon_0=126 +k=1.000000 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger CM 129E +<2388> +proj=tmerc +lat_0=0 +lon_0=129 +k=1.000000 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger CM 132E +<2389> +proj=tmerc +lat_0=0 +lon_0=132 +k=1.000000 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# Xian 1980 / 3-degree Gauss-Kruger CM 135E +<2390> +proj=tmerc +lat_0=0 +lon_0=135 +k=1.000000 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> +# KKJ / Finland zone 1 +<2391> +proj=tmerc +lat_0=0 +lon_0=21 +k=1.000000 +x_0=1500000 +y_0=0 +ellps=intl +towgs84=-90.7,-106.1,-119.2,4.09,0.218,-1.05,1.37 +units=m +no_defs <> +# KKJ / Finland zone 2 +<2392> +proj=tmerc +lat_0=0 +lon_0=24 +k=1.000000 +x_0=2500000 +y_0=0 +ellps=intl +towgs84=-90.7,-106.1,-119.2,4.09,0.218,-1.05,1.37 +units=m +no_defs <> +# KKJ / Finland Uniform Coordinate System +<2393> +proj=tmerc +lat_0=0 +lon_0=27 +k=1.000000 +x_0=3500000 +y_0=0 +ellps=intl +towgs84=-90.7,-106.1,-119.2,4.09,0.218,-1.05,1.37 +units=m +no_defs <> +# KKJ / Finland zone 4 +<2394> +proj=tmerc +lat_0=0 +lon_0=30 +k=1.000000 +x_0=4500000 +y_0=0 +ellps=intl +towgs84=-90.7,-106.1,-119.2,4.09,0.218,-1.05,1.37 +units=m +no_defs <> +# South Yemen / Gauss-Kruger zone 8 +<2395> +proj=tmerc +lat_0=0 +lon_0=45 +k=1.000000 +x_0=8500000 +y_0=0 +ellps=krass +towgs84=-76,-138,67,0,0,0,0 +units=m +no_defs <> +# South Yemen / Gauss-Kruger zone 9 +<2396> +proj=tmerc +lat_0=0 +lon_0=51 +k=1.000000 +x_0=9500000 +y_0=0 +ellps=krass +towgs84=-76,-138,67,0,0,0,0 +units=m +no_defs <> +# Pulkovo 1942(83) / Gauss-Kruger zone 3 +<2397> +proj=tmerc +lat_0=0 +lon_0=9 +k=1.000000 +x_0=3500000 +y_0=0 +ellps=krass +towgs84=24,-123,-94,0.02,-0.25,-0.13,1.1 +units=m +no_defs <> +# Pulkovo 1942(83) / Gauss-Kruger zone 4 +<2398> +proj=tmerc +lat_0=0 +lon_0=12 +k=1.000000 +x_0=4500000 +y_0=0 +ellps=krass +towgs84=24,-123,-94,0.02,-0.25,-0.13,1.1 +units=m +no_defs <> +# Pulkovo 1942(83) / Gauss-Kruger zone 5 +<2399> +proj=tmerc +lat_0=0 +lon_0=15 +k=1.000000 +x_0=5500000 +y_0=0 +ellps=krass +towgs84=24,-123,-94,0.02,-0.25,-0.13,1.1 +units=m +no_defs <> +# RT90 2.5 gon W +<2400> +proj=tmerc +lat_0=0 +lon_0=15.80827777777778 +k=1.000000 +x_0=1500000 +y_0=0 +ellps=bessel +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger zone 25 +<2401> +proj=tmerc +lat_0=0 +lon_0=75 +k=1.000000 +x_0=25500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger zone 26 +<2402> +proj=tmerc +lat_0=0 +lon_0=78 +k=1.000000 +x_0=26500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger zone 27 +<2403> +proj=tmerc +lat_0=0 +lon_0=81 +k=1.000000 +x_0=27500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger zone 28 +<2404> +proj=tmerc +lat_0=0 +lon_0=84 +k=1.000000 +x_0=28500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger zone 29 +<2405> +proj=tmerc +lat_0=0 +lon_0=87 +k=1.000000 +x_0=29500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger zone 30 +<2406> +proj=tmerc +lat_0=0 +lon_0=90 +k=1.000000 +x_0=30500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger zone 31 +<2407> +proj=tmerc +lat_0=0 +lon_0=93 +k=1.000000 +x_0=31500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger zone 32 +<2408> +proj=tmerc +lat_0=0 +lon_0=96 +k=1.000000 +x_0=32500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger zone 33 +<2409> +proj=tmerc +lat_0=0 +lon_0=99 +k=1.000000 +x_0=33500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger zone 34 +<2410> +proj=tmerc +lat_0=0 +lon_0=102 +k=1.000000 +x_0=34500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger zone 35 +<2411> +proj=tmerc +lat_0=0 +lon_0=105 +k=1.000000 +x_0=35500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger zone 36 +<2412> +proj=tmerc +lat_0=0 +lon_0=108 +k=1.000000 +x_0=36500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger zone 37 +<2413> +proj=tmerc +lat_0=0 +lon_0=111 +k=1.000000 +x_0=37500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger zone 38 +<2414> +proj=tmerc +lat_0=0 +lon_0=114 +k=1.000000 +x_0=38500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger zone 39 +<2415> +proj=tmerc +lat_0=0 +lon_0=117 +k=1.000000 +x_0=39500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger zone 40 +<2416> +proj=tmerc +lat_0=0 +lon_0=120 +k=1.000000 +x_0=40500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger zone 41 +<2417> +proj=tmerc +lat_0=0 +lon_0=123 +k=1.000000 +x_0=41500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger zone 42 +<2418> +proj=tmerc +lat_0=0 +lon_0=126 +k=1.000000 +x_0=42500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger zone 43 +<2419> +proj=tmerc +lat_0=0 +lon_0=129 +k=1.000000 +x_0=43500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger zone 44 +<2420> +proj=tmerc +lat_0=0 +lon_0=132 +k=1.000000 +x_0=44500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger zone 45 +<2421> +proj=tmerc +lat_0=0 +lon_0=135 +k=1.000000 +x_0=45500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger CM 75E +<2422> +proj=tmerc +lat_0=0 +lon_0=75 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger CM 78E +<2423> +proj=tmerc +lat_0=0 +lon_0=78 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger CM 81E +<2424> +proj=tmerc +lat_0=0 +lon_0=81 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger CM 84E +<2425> +proj=tmerc +lat_0=0 +lon_0=84 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger CM 87E +<2426> +proj=tmerc +lat_0=0 +lon_0=87 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger CM 90E +<2427> +proj=tmerc +lat_0=0 +lon_0=90 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger CM 93E +<2428> +proj=tmerc +lat_0=0 +lon_0=93 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger CM 96E +<2429> +proj=tmerc +lat_0=0 +lon_0=96 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger CM 99E +<2430> +proj=tmerc +lat_0=0 +lon_0=99 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger CM 102E +<2431> +proj=tmerc +lat_0=0 +lon_0=102 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger CM 105E +<2432> +proj=tmerc +lat_0=0 +lon_0=105 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger CM 108E +<2433> +proj=tmerc +lat_0=0 +lon_0=108 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger CM 111E +<2434> +proj=tmerc +lat_0=0 +lon_0=111 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger CM 114E +<2435> +proj=tmerc +lat_0=0 +lon_0=114 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger CM 117E +<2436> +proj=tmerc +lat_0=0 +lon_0=117 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger CM 120E +<2437> +proj=tmerc +lat_0=0 +lon_0=120 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger CM 123E +<2438> +proj=tmerc +lat_0=0 +lon_0=123 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger CM 126E +<2439> +proj=tmerc +lat_0=0 +lon_0=126 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger CM 129E +<2440> +proj=tmerc +lat_0=0 +lon_0=129 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger CM 132E +<2441> +proj=tmerc +lat_0=0 +lon_0=132 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Beijing 1954 / 3-degree Gauss-Kruger CM 135E +<2442> +proj=tmerc +lat_0=0 +lon_0=135 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# JGD2000 / Japan Plane Rectangular CS I +<2443> +proj=tmerc +lat_0=33 +lon_0=129.5 +k=0.999900 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# JGD2000 / Japan Plane Rectangular CS II +<2444> +proj=tmerc +lat_0=33 +lon_0=131 +k=0.999900 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# JGD2000 / Japan Plane Rectangular CS III +<2445> +proj=tmerc +lat_0=36 +lon_0=132.1666666666667 +k=0.999900 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# JGD2000 / Japan Plane Rectangular CS IV +<2446> +proj=tmerc +lat_0=33 +lon_0=133.5 +k=0.999900 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# JGD2000 / Japan Plane Rectangular CS V +<2447> +proj=tmerc +lat_0=36 +lon_0=134.3333333333333 +k=0.999900 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# JGD2000 / Japan Plane Rectangular CS VI +<2448> +proj=tmerc +lat_0=36 +lon_0=136 +k=0.999900 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# JGD2000 / Japan Plane Rectangular CS VII +<2449> +proj=tmerc +lat_0=36 +lon_0=137.1666666666667 +k=0.999900 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# JGD2000 / Japan Plane Rectangular CS VIII +<2450> +proj=tmerc +lat_0=36 +lon_0=138.5 +k=0.999900 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# JGD2000 / Japan Plane Rectangular CS IX +<2451> +proj=tmerc +lat_0=36 +lon_0=139.8333333333333 +k=0.999900 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# JGD2000 / Japan Plane Rectangular CS X +<2452> +proj=tmerc +lat_0=40 +lon_0=140.8333333333333 +k=0.999900 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# JGD2000 / Japan Plane Rectangular CS XI +<2453> +proj=tmerc +lat_0=44 +lon_0=140.25 +k=0.999900 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# JGD2000 / Japan Plane Rectangular CS XII +<2454> +proj=tmerc +lat_0=44 +lon_0=142.25 +k=0.999900 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# JGD2000 / Japan Plane Rectangular CS XIII +<2455> +proj=tmerc +lat_0=44 +lon_0=144.25 +k=0.999900 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# JGD2000 / Japan Plane Rectangular CS XIV +<2456> +proj=tmerc +lat_0=26 +lon_0=142 +k=0.999900 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# JGD2000 / Japan Plane Rectangular CS XV +<2457> +proj=tmerc +lat_0=26 +lon_0=127.5 +k=0.999900 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# JGD2000 / Japan Plane Rectangular CS XVI +<2458> +proj=tmerc +lat_0=26 +lon_0=124 +k=0.999900 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# JGD2000 / Japan Plane Rectangular CS XVII +<2459> +proj=tmerc +lat_0=26 +lon_0=131 +k=0.999900 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# JGD2000 / Japan Plane Rectangular CS XVIII +<2460> +proj=tmerc +lat_0=20 +lon_0=136 +k=0.999900 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# JGD2000 / Japan Plane Rectangular CS XIX +<2461> +proj=tmerc +lat_0=26 +lon_0=154 +k=0.999900 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Albanian 1987 / Gauss-Kruger zone 4 +<2462> +proj=tmerc +lat_0=0 +lon_0=21 +k=1.000000 +x_0=4500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger CM 21E +<2463> +proj=tmerc +lat_0=0 +lon_0=21 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger CM 27E +<2464> +proj=tmerc +lat_0=0 +lon_0=27 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger CM 33E +<2465> +proj=tmerc +lat_0=0 +lon_0=33 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger CM 39E +<2466> +proj=tmerc +lat_0=0 +lon_0=39 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger CM 45E +<2467> +proj=tmerc +lat_0=0 +lon_0=45 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger CM 51E +<2468> +proj=tmerc +lat_0=0 +lon_0=51 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger CM 57E +<2469> +proj=tmerc +lat_0=0 +lon_0=57 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger CM 63E +<2470> +proj=tmerc +lat_0=0 +lon_0=63 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger CM 69E +<2471> +proj=tmerc +lat_0=0 +lon_0=69 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger CM 75E +<2472> +proj=tmerc +lat_0=0 +lon_0=75 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger CM 81E +<2473> +proj=tmerc +lat_0=0 +lon_0=81 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger CM 87E +<2474> +proj=tmerc +lat_0=0 +lon_0=87 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger CM 93E +<2475> +proj=tmerc +lat_0=0 +lon_0=93 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger CM 99E +<2476> +proj=tmerc +lat_0=0 +lon_0=99 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger CM 105E +<2477> +proj=tmerc +lat_0=0 +lon_0=105 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger CM 111E +<2478> +proj=tmerc +lat_0=0 +lon_0=111 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger CM 117E +<2479> +proj=tmerc +lat_0=0 +lon_0=117 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger CM 123E +<2480> +proj=tmerc +lat_0=0 +lon_0=123 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger CM 129E +<2481> +proj=tmerc +lat_0=0 +lon_0=129 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger CM 135E +<2482> +proj=tmerc +lat_0=0 +lon_0=135 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger CM 141E +<2483> +proj=tmerc +lat_0=0 +lon_0=141 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger CM 147E +<2484> +proj=tmerc +lat_0=0 +lon_0=147 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger CM 153E +<2485> +proj=tmerc +lat_0=0 +lon_0=153 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger CM 159E +<2486> +proj=tmerc +lat_0=0 +lon_0=159 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger CM 165E +<2487> +proj=tmerc +lat_0=0 +lon_0=165 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger CM 171E +<2488> +proj=tmerc +lat_0=0 +lon_0=171 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger CM 177E +<2489> +proj=tmerc +lat_0=0 +lon_0=177 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger CM 177W +<2490> +proj=tmerc +lat_0=0 +lon_0=-177 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger CM 171W +<2491> +proj=tmerc +lat_0=0 +lon_0=-171 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger CM 9E +<2492> +proj=tmerc +lat_0=0 +lon_0=9 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger CM 15E +<2493> +proj=tmerc +lat_0=0 +lon_0=15 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger CM 21E +<2494> +proj=tmerc +lat_0=0 +lon_0=21 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger CM 27E +<2495> +proj=tmerc +lat_0=0 +lon_0=27 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger CM 33E +<2496> +proj=tmerc +lat_0=0 +lon_0=33 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger CM 39E +<2497> +proj=tmerc +lat_0=0 +lon_0=39 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger CM 45E +<2498> +proj=tmerc +lat_0=0 +lon_0=45 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger CM 51E +<2499> +proj=tmerc +lat_0=0 +lon_0=51 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger CM 57E +<2500> +proj=tmerc +lat_0=0 +lon_0=57 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger CM 63E +<2501> +proj=tmerc +lat_0=0 +lon_0=63 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger CM 69E +<2502> +proj=tmerc +lat_0=0 +lon_0=69 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger CM 75E +<2503> +proj=tmerc +lat_0=0 +lon_0=75 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger CM 81E +<2504> +proj=tmerc +lat_0=0 +lon_0=81 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger CM 87E +<2505> +proj=tmerc +lat_0=0 +lon_0=87 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger CM 93E +<2506> +proj=tmerc +lat_0=0 +lon_0=93 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger CM 99E +<2507> +proj=tmerc +lat_0=0 +lon_0=99 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger CM 105E +<2508> +proj=tmerc +lat_0=0 +lon_0=105 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger CM 111E +<2509> +proj=tmerc +lat_0=0 +lon_0=111 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger CM 117E +<2510> +proj=tmerc +lat_0=0 +lon_0=117 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger CM 123E +<2511> +proj=tmerc +lat_0=0 +lon_0=123 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger CM 129E +<2512> +proj=tmerc +lat_0=0 +lon_0=129 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger CM 135E +<2513> +proj=tmerc +lat_0=0 +lon_0=135 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger CM 141E +<2514> +proj=tmerc +lat_0=0 +lon_0=141 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger CM 147E +<2515> +proj=tmerc +lat_0=0 +lon_0=147 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger CM 153E +<2516> +proj=tmerc +lat_0=0 +lon_0=153 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger CM 159E +<2517> +proj=tmerc +lat_0=0 +lon_0=159 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger CM 165E +<2518> +proj=tmerc +lat_0=0 +lon_0=165 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger CM 171E +<2519> +proj=tmerc +lat_0=0 +lon_0=171 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger CM 177E +<2520> +proj=tmerc +lat_0=0 +lon_0=177 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger CM 177W +<2521> +proj=tmerc +lat_0=0 +lon_0=-177 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger CM 171W +<2522> +proj=tmerc +lat_0=0 +lon_0=-171 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 7 +<2523> +proj=tmerc +lat_0=0 +lon_0=21 +k=1.000000 +x_0=7500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 8 +<2524> +proj=tmerc +lat_0=0 +lon_0=24 +k=1.000000 +x_0=8500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 9 +<2525> +proj=tmerc +lat_0=0 +lon_0=27 +k=1.000000 +x_0=9500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 10 +<2526> +proj=tmerc +lat_0=0 +lon_0=30 +k=1.000000 +x_0=10500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 11 +<2527> +proj=tmerc +lat_0=0 +lon_0=33 +k=1.000000 +x_0=11500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 12 +<2528> +proj=tmerc +lat_0=0 +lon_0=36 +k=1.000000 +x_0=12500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 13 +<2529> +proj=tmerc +lat_0=0 +lon_0=39 +k=1.000000 +x_0=13500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 14 +<2530> +proj=tmerc +lat_0=0 +lon_0=42 +k=1.000000 +x_0=14500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 15 +<2531> +proj=tmerc +lat_0=0 +lon_0=45 +k=1.000000 +x_0=15500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 16 +<2532> +proj=tmerc +lat_0=0 +lon_0=48 +k=1.000000 +x_0=16500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 17 +<2533> +proj=tmerc +lat_0=0 +lon_0=51 +k=1.000000 +x_0=17500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 18 +<2534> +proj=tmerc +lat_0=0 +lon_0=54 +k=1.000000 +x_0=18500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 19 +<2535> +proj=tmerc +lat_0=0 +lon_0=57 +k=1.000000 +x_0=19500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 20 +<2536> +proj=tmerc +lat_0=0 +lon_0=60 +k=1.000000 +x_0=20500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 21 +<2537> +proj=tmerc +lat_0=0 +lon_0=63 +k=1.000000 +x_0=21500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 22 +<2538> +proj=tmerc +lat_0=0 +lon_0=66 +k=1.000000 +x_0=22500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 23 +<2539> +proj=tmerc +lat_0=0 +lon_0=69 +k=1.000000 +x_0=23500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 24 +<2540> +proj=tmerc +lat_0=0 +lon_0=72 +k=1.000000 +x_0=24500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 25 +<2541> +proj=tmerc +lat_0=0 +lon_0=75 +k=1.000000 +x_0=25500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 26 +<2542> +proj=tmerc +lat_0=0 +lon_0=78 +k=1.000000 +x_0=26500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 27 +<2543> +proj=tmerc +lat_0=0 +lon_0=81 +k=1.000000 +x_0=27500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 28 +<2544> +proj=tmerc +lat_0=0 +lon_0=84 +k=1.000000 +x_0=28500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 29 +<2545> +proj=tmerc +lat_0=0 +lon_0=87 +k=1.000000 +x_0=29500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 30 +<2546> +proj=tmerc +lat_0=0 +lon_0=90 +k=1.000000 +x_0=30500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 31 +<2547> +proj=tmerc +lat_0=0 +lon_0=93 +k=1.000000 +x_0=31500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 32 +<2548> +proj=tmerc +lat_0=0 +lon_0=96 +k=1.000000 +x_0=32500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 33 +<2549> +proj=tmerc +lat_0=0 +lon_0=99 +k=1.000000 +x_0=33500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Samboja / UTM zone 50S +<2550> +proj=utm +zone=50 +south +ellps=bessel +towgs84=-404.78,685.68,45.47,0,0,0,0 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 34 +<2551> +proj=tmerc +lat_0=0 +lon_0=102 +k=1.000000 +x_0=34500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 35 +<2552> +proj=tmerc +lat_0=0 +lon_0=105 +k=1.000000 +x_0=35500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 36 +<2553> +proj=tmerc +lat_0=0 +lon_0=108 +k=1.000000 +x_0=36500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 37 +<2554> +proj=tmerc +lat_0=0 +lon_0=111 +k=1.000000 +x_0=37500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 38 +<2555> +proj=tmerc +lat_0=0 +lon_0=114 +k=1.000000 +x_0=38500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 39 +<2556> +proj=tmerc +lat_0=0 +lon_0=117 +k=1.000000 +x_0=39500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 40 +<2557> +proj=tmerc +lat_0=0 +lon_0=120 +k=1.000000 +x_0=40500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 41 +<2558> +proj=tmerc +lat_0=0 +lon_0=123 +k=1.000000 +x_0=41500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 42 +<2559> +proj=tmerc +lat_0=0 +lon_0=126 +k=1.000000 +x_0=42500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 43 +<2560> +proj=tmerc +lat_0=0 +lon_0=129 +k=1.000000 +x_0=43500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 44 +<2561> +proj=tmerc +lat_0=0 +lon_0=132 +k=1.000000 +x_0=44500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 45 +<2562> +proj=tmerc +lat_0=0 +lon_0=135 +k=1.000000 +x_0=45500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 46 +<2563> +proj=tmerc +lat_0=0 +lon_0=138 +k=1.000000 +x_0=46500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 47 +<2564> +proj=tmerc +lat_0=0 +lon_0=141 +k=1.000000 +x_0=47500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 48 +<2565> +proj=tmerc +lat_0=0 +lon_0=144 +k=1.000000 +x_0=48500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 49 +<2566> +proj=tmerc +lat_0=0 +lon_0=147 +k=1.000000 +x_0=49500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 50 +<2567> +proj=tmerc +lat_0=0 +lon_0=150 +k=1.000000 +x_0=50500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 51 +<2568> +proj=tmerc +lat_0=0 +lon_0=153 +k=1.000000 +x_0=51500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 52 +<2569> +proj=tmerc +lat_0=0 +lon_0=156 +k=1.000000 +x_0=52500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 53 +<2570> +proj=tmerc +lat_0=0 +lon_0=159 +k=1.000000 +x_0=53500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 54 +<2571> +proj=tmerc +lat_0=0 +lon_0=162 +k=1.000000 +x_0=54500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 55 +<2572> +proj=tmerc +lat_0=0 +lon_0=165 +k=1.000000 +x_0=55500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 56 +<2573> +proj=tmerc +lat_0=0 +lon_0=168 +k=1.000000 +x_0=56500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 57 +<2574> +proj=tmerc +lat_0=0 +lon_0=171 +k=1.000000 +x_0=57500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 58 +<2575> +proj=tmerc +lat_0=0 +lon_0=174 +k=1.000000 +x_0=58500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 59 +<2576> +proj=tmerc +lat_0=0 +lon_0=177 +k=1.000000 +x_0=59500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 60 +<2577> +proj=tmerc +lat_0=0 +lon_0=180 +k=1.000000 +x_0=60000000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 61 +<2578> +proj=tmerc +lat_0=0 +lon_0=-177 +k=1.000000 +x_0=61500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 62 +<2579> +proj=tmerc +lat_0=0 +lon_0=-174 +k=1.000000 +x_0=62500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 63 +<2580> +proj=tmerc +lat_0=0 +lon_0=-171 +k=1.000000 +x_0=63500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger zone 64 +<2581> +proj=tmerc +lat_0=0 +lon_0=-168 +k=1.000000 +x_0=64500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 21E +<2582> +proj=tmerc +lat_0=0 +lon_0=21 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 24E +<2583> +proj=tmerc +lat_0=0 +lon_0=24 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 27E +<2584> +proj=tmerc +lat_0=0 +lon_0=27 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 30E +<2585> +proj=tmerc +lat_0=0 +lon_0=30 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 33E +<2586> +proj=tmerc +lat_0=0 +lon_0=33 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 36E +<2587> +proj=tmerc +lat_0=0 +lon_0=36 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 39E +<2588> +proj=tmerc +lat_0=0 +lon_0=39 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 42E +<2589> +proj=tmerc +lat_0=0 +lon_0=42 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 45E +<2590> +proj=tmerc +lat_0=0 +lon_0=45 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 48E +<2591> +proj=tmerc +lat_0=0 +lon_0=48 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 51E +<2592> +proj=tmerc +lat_0=0 +lon_0=51 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 54E +<2593> +proj=tmerc +lat_0=0 +lon_0=54 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 57E +<2594> +proj=tmerc +lat_0=0 +lon_0=57 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 60E +<2595> +proj=tmerc +lat_0=0 +lon_0=60 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 63E +<2596> +proj=tmerc +lat_0=0 +lon_0=63 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 66E +<2597> +proj=tmerc +lat_0=0 +lon_0=66 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 69E +<2598> +proj=tmerc +lat_0=0 +lon_0=69 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 72E +<2599> +proj=tmerc +lat_0=0 +lon_0=72 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Lietuvos Koordinoei Sistema 1994 +<2600> +proj=tmerc +lat_0=0 +lon_0=24 +k=0.999800 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 75E +<2601> +proj=tmerc +lat_0=0 +lon_0=75 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 78E +<2602> +proj=tmerc +lat_0=0 +lon_0=78 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 81E +<2603> +proj=tmerc +lat_0=0 +lon_0=81 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 84E +<2604> +proj=tmerc +lat_0=0 +lon_0=84 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 87E +<2605> +proj=tmerc +lat_0=0 +lon_0=87 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 90E +<2606> +proj=tmerc +lat_0=0 +lon_0=90 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 93E +<2607> +proj=tmerc +lat_0=0 +lon_0=93 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 96E +<2608> +proj=tmerc +lat_0=0 +lon_0=96 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 99E +<2609> +proj=tmerc +lat_0=0 +lon_0=99 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 102E +<2610> +proj=tmerc +lat_0=0 +lon_0=102 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 105E +<2611> +proj=tmerc +lat_0=0 +lon_0=105 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 108E +<2612> +proj=tmerc +lat_0=0 +lon_0=108 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 111E +<2613> +proj=tmerc +lat_0=0 +lon_0=111 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 114E +<2614> +proj=tmerc +lat_0=0 +lon_0=114 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 117E +<2615> +proj=tmerc +lat_0=0 +lon_0=117 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 120E +<2616> +proj=tmerc +lat_0=0 +lon_0=120 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 123E +<2617> +proj=tmerc +lat_0=0 +lon_0=123 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 126E +<2618> +proj=tmerc +lat_0=0 +lon_0=126 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 129E +<2619> +proj=tmerc +lat_0=0 +lon_0=129 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 132E +<2620> +proj=tmerc +lat_0=0 +lon_0=132 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 135E +<2621> +proj=tmerc +lat_0=0 +lon_0=135 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 138E +<2622> +proj=tmerc +lat_0=0 +lon_0=138 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 141E +<2623> +proj=tmerc +lat_0=0 +lon_0=141 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 144E +<2624> +proj=tmerc +lat_0=0 +lon_0=144 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 147E +<2625> +proj=tmerc +lat_0=0 +lon_0=147 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 150E +<2626> +proj=tmerc +lat_0=0 +lon_0=150 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 153E +<2627> +proj=tmerc +lat_0=0 +lon_0=153 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 156E +<2628> +proj=tmerc +lat_0=0 +lon_0=156 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 159E +<2629> +proj=tmerc +lat_0=0 +lon_0=159 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 162E +<2630> +proj=tmerc +lat_0=0 +lon_0=162 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 165E +<2631> +proj=tmerc +lat_0=0 +lon_0=165 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 168E +<2632> +proj=tmerc +lat_0=0 +lon_0=168 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 171E +<2633> +proj=tmerc +lat_0=0 +lon_0=171 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 174E +<2634> +proj=tmerc +lat_0=0 +lon_0=174 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 177E +<2635> +proj=tmerc +lat_0=0 +lon_0=177 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 180E +<2636> +proj=tmerc +lat_0=0 +lon_0=180 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 177W +<2637> +proj=tmerc +lat_0=0 +lon_0=-177 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 174W +<2638> +proj=tmerc +lat_0=0 +lon_0=-174 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 171W +<2639> +proj=tmerc +lat_0=0 +lon_0=-171 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / 3-degree Gauss-Kruger CM 168W +<2640> +proj=tmerc +lat_0=0 +lon_0=-168 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 7 +<2641> +proj=tmerc +lat_0=0 +lon_0=21 +k=1.000000 +x_0=7500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 8 +<2642> +proj=tmerc +lat_0=0 +lon_0=24 +k=1.000000 +x_0=8500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 9 +<2643> +proj=tmerc +lat_0=0 +lon_0=27 +k=1.000000 +x_0=9500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 10 +<2644> +proj=tmerc +lat_0=0 +lon_0=30 +k=1.000000 +x_0=10500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 11 +<2645> +proj=tmerc +lat_0=0 +lon_0=33 +k=1.000000 +x_0=11500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 12 +<2646> +proj=tmerc +lat_0=0 +lon_0=36 +k=1.000000 +x_0=12500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 13 +<2647> +proj=tmerc +lat_0=0 +lon_0=39 +k=1.000000 +x_0=13500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 14 +<2648> +proj=tmerc +lat_0=0 +lon_0=42 +k=1.000000 +x_0=14500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 15 +<2649> +proj=tmerc +lat_0=0 +lon_0=45 +k=1.000000 +x_0=15500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 16 +<2650> +proj=tmerc +lat_0=0 +lon_0=48 +k=1.000000 +x_0=16500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 17 +<2651> +proj=tmerc +lat_0=0 +lon_0=51 +k=1.000000 +x_0=17500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 18 +<2652> +proj=tmerc +lat_0=0 +lon_0=54 +k=1.000000 +x_0=18500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 19 +<2653> +proj=tmerc +lat_0=0 +lon_0=57 +k=1.000000 +x_0=19500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 20 +<2654> +proj=tmerc +lat_0=0 +lon_0=60 +k=1.000000 +x_0=20500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 21 +<2655> +proj=tmerc +lat_0=0 +lon_0=63 +k=1.000000 +x_0=21500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 22 +<2656> +proj=tmerc +lat_0=0 +lon_0=66 +k=1.000000 +x_0=22500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 23 +<2657> +proj=tmerc +lat_0=0 +lon_0=69 +k=1.000000 +x_0=23500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 24 +<2658> +proj=tmerc +lat_0=0 +lon_0=72 +k=1.000000 +x_0=24500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 25 +<2659> +proj=tmerc +lat_0=0 +lon_0=75 +k=1.000000 +x_0=25500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 26 +<2660> +proj=tmerc +lat_0=0 +lon_0=78 +k=1.000000 +x_0=26500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 27 +<2661> +proj=tmerc +lat_0=0 +lon_0=81 +k=1.000000 +x_0=27500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 28 +<2662> +proj=tmerc +lat_0=0 +lon_0=84 +k=1.000000 +x_0=28500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 29 +<2663> +proj=tmerc +lat_0=0 +lon_0=87 +k=1.000000 +x_0=29500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 30 +<2664> +proj=tmerc +lat_0=0 +lon_0=90 +k=1.000000 +x_0=30500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 31 +<2665> +proj=tmerc +lat_0=0 +lon_0=93 +k=1.000000 +x_0=31500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 32 +<2666> +proj=tmerc +lat_0=0 +lon_0=96 +k=1.000000 +x_0=32500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 33 +<2667> +proj=tmerc +lat_0=0 +lon_0=99 +k=1.000000 +x_0=33500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 34 +<2668> +proj=tmerc +lat_0=0 +lon_0=102 +k=1.000000 +x_0=34500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 35 +<2669> +proj=tmerc +lat_0=0 +lon_0=105 +k=1.000000 +x_0=35500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 36 +<2670> +proj=tmerc +lat_0=0 +lon_0=108 +k=1.000000 +x_0=36500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 37 +<2671> +proj=tmerc +lat_0=0 +lon_0=111 +k=1.000000 +x_0=37500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 38 +<2672> +proj=tmerc +lat_0=0 +lon_0=114 +k=1.000000 +x_0=38500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 39 +<2673> +proj=tmerc +lat_0=0 +lon_0=117 +k=1.000000 +x_0=39500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 40 +<2674> +proj=tmerc +lat_0=0 +lon_0=120 +k=1.000000 +x_0=40500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 41 +<2675> +proj=tmerc +lat_0=0 +lon_0=123 +k=1.000000 +x_0=41500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 42 +<2676> +proj=tmerc +lat_0=0 +lon_0=126 +k=1.000000 +x_0=42500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 43 +<2677> +proj=tmerc +lat_0=0 +lon_0=129 +k=1.000000 +x_0=43500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 44 +<2678> +proj=tmerc +lat_0=0 +lon_0=132 +k=1.000000 +x_0=44500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 45 +<2679> +proj=tmerc +lat_0=0 +lon_0=135 +k=1.000000 +x_0=45500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 46 +<2680> +proj=tmerc +lat_0=0 +lon_0=138 +k=1.000000 +x_0=46500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 47 +<2681> +proj=tmerc +lat_0=0 +lon_0=141 +k=1.000000 +x_0=47500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 48 +<2682> +proj=tmerc +lat_0=0 +lon_0=144 +k=1.000000 +x_0=48500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 49 +<2683> +proj=tmerc +lat_0=0 +lon_0=147 +k=1.000000 +x_0=49500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 50 +<2684> +proj=tmerc +lat_0=0 +lon_0=150 +k=1.000000 +x_0=50500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 51 +<2685> +proj=tmerc +lat_0=0 +lon_0=153 +k=1.000000 +x_0=51500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 52 +<2686> +proj=tmerc +lat_0=0 +lon_0=156 +k=1.000000 +x_0=52500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 53 +<2687> +proj=tmerc +lat_0=0 +lon_0=159 +k=1.000000 +x_0=53500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 54 +<2688> +proj=tmerc +lat_0=0 +lon_0=162 +k=1.000000 +x_0=54500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 55 +<2689> +proj=tmerc +lat_0=0 +lon_0=165 +k=1.000000 +x_0=55500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 56 +<2690> +proj=tmerc +lat_0=0 +lon_0=168 +k=1.000000 +x_0=56500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 57 +<2691> +proj=tmerc +lat_0=0 +lon_0=171 +k=1.000000 +x_0=57500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 58 +<2692> +proj=tmerc +lat_0=0 +lon_0=174 +k=1.000000 +x_0=58500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 59 +<2693> +proj=tmerc +lat_0=0 +lon_0=177 +k=1.000000 +x_0=59500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 60 +<2694> +proj=tmerc +lat_0=0 +lon_0=180 +k=1.000000 +x_0=60000000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 61 +<2695> +proj=tmerc +lat_0=0 +lon_0=-177 +k=1.000000 +x_0=61500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 62 +<2696> +proj=tmerc +lat_0=0 +lon_0=-174 +k=1.000000 +x_0=62500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 63 +<2697> +proj=tmerc +lat_0=0 +lon_0=-171 +k=1.000000 +x_0=63500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger zone 64 +<2698> +proj=tmerc +lat_0=0 +lon_0=-168 +k=1.000000 +x_0=64500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 21E +<2699> +proj=tmerc +lat_0=0 +lon_0=21 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 24E +<2700> +proj=tmerc +lat_0=0 +lon_0=24 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 27E +<2701> +proj=tmerc +lat_0=0 +lon_0=27 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 30E +<2702> +proj=tmerc +lat_0=0 +lon_0=30 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 33E +<2703> +proj=tmerc +lat_0=0 +lon_0=33 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 36E +<2704> +proj=tmerc +lat_0=0 +lon_0=36 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 39E +<2705> +proj=tmerc +lat_0=0 +lon_0=39 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 42E +<2706> +proj=tmerc +lat_0=0 +lon_0=42 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 45E +<2707> +proj=tmerc +lat_0=0 +lon_0=45 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 48E +<2708> +proj=tmerc +lat_0=0 +lon_0=48 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 51E +<2709> +proj=tmerc +lat_0=0 +lon_0=51 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 54E +<2710> +proj=tmerc +lat_0=0 +lon_0=54 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 57E +<2711> +proj=tmerc +lat_0=0 +lon_0=57 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 60E +<2712> +proj=tmerc +lat_0=0 +lon_0=60 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 63E +<2713> +proj=tmerc +lat_0=0 +lon_0=63 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 66E +<2714> +proj=tmerc +lat_0=0 +lon_0=66 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 69E +<2715> +proj=tmerc +lat_0=0 +lon_0=69 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 72E +<2716> +proj=tmerc +lat_0=0 +lon_0=72 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 75E +<2717> +proj=tmerc +lat_0=0 +lon_0=75 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 78E +<2718> +proj=tmerc +lat_0=0 +lon_0=78 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 81E +<2719> +proj=tmerc +lat_0=0 +lon_0=81 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 84E +<2720> +proj=tmerc +lat_0=0 +lon_0=84 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 87E +<2721> +proj=tmerc +lat_0=0 +lon_0=87 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 90E +<2722> +proj=tmerc +lat_0=0 +lon_0=90 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 93E +<2723> +proj=tmerc +lat_0=0 +lon_0=93 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 96E +<2724> +proj=tmerc +lat_0=0 +lon_0=96 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 99E +<2725> +proj=tmerc +lat_0=0 +lon_0=99 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 102E +<2726> +proj=tmerc +lat_0=0 +lon_0=102 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 105E +<2727> +proj=tmerc +lat_0=0 +lon_0=105 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 108E +<2728> +proj=tmerc +lat_0=0 +lon_0=108 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 111E +<2729> +proj=tmerc +lat_0=0 +lon_0=111 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 114E +<2730> +proj=tmerc +lat_0=0 +lon_0=114 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 117E +<2731> +proj=tmerc +lat_0=0 +lon_0=117 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 120E +<2732> +proj=tmerc +lat_0=0 +lon_0=120 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 123E +<2733> +proj=tmerc +lat_0=0 +lon_0=123 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 126E +<2734> +proj=tmerc +lat_0=0 +lon_0=126 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 129E +<2735> +proj=tmerc +lat_0=0 +lon_0=129 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Tete / UTM zone 36S +<2736> +proj=utm +zone=36 +south +ellps=clrk66 +units=m +no_defs <> +# Tete / UTM zone 37S +<2737> +proj=utm +zone=37 +south +ellps=clrk66 +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 132E +<2738> +proj=tmerc +lat_0=0 +lon_0=132 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 135E +<2739> +proj=tmerc +lat_0=0 +lon_0=135 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 138E +<2740> +proj=tmerc +lat_0=0 +lon_0=138 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 141E +<2741> +proj=tmerc +lat_0=0 +lon_0=141 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 144E +<2742> +proj=tmerc +lat_0=0 +lon_0=144 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 147E +<2743> +proj=tmerc +lat_0=0 +lon_0=147 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 150E +<2744> +proj=tmerc +lat_0=0 +lon_0=150 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 153E +<2745> +proj=tmerc +lat_0=0 +lon_0=153 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 156E +<2746> +proj=tmerc +lat_0=0 +lon_0=156 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 159E +<2747> +proj=tmerc +lat_0=0 +lon_0=159 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 162E +<2748> +proj=tmerc +lat_0=0 +lon_0=162 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 165E +<2749> +proj=tmerc +lat_0=0 +lon_0=165 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 168E +<2750> +proj=tmerc +lat_0=0 +lon_0=168 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 171E +<2751> +proj=tmerc +lat_0=0 +lon_0=171 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 174E +<2752> +proj=tmerc +lat_0=0 +lon_0=174 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 177E +<2753> +proj=tmerc +lat_0=0 +lon_0=177 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 180E +<2754> +proj=tmerc +lat_0=0 +lon_0=180 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 177W +<2755> +proj=tmerc +lat_0=0 +lon_0=-177 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 174W +<2756> +proj=tmerc +lat_0=0 +lon_0=-174 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 171W +<2757> +proj=tmerc +lat_0=0 +lon_0=-171 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / 3-degree Gauss-Kruger CM 168W +<2758> +proj=tmerc +lat_0=0 +lon_0=-168 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# NAD83(HARN) / Alabama East +<2759> +proj=tmerc +lat_0=30.5 +lon_0=-85.83333333333333 +k=0.999960 +x_0=200000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Alabama West +<2760> +proj=tmerc +lat_0=30 +lon_0=-87.5 +k=0.999933 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Arizona East +<2761> +proj=tmerc +lat_0=31 +lon_0=-110.1666666666667 +k=0.999900 +x_0=213360 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Arizona Central +<2762> +proj=tmerc +lat_0=31 +lon_0=-111.9166666666667 +k=0.999900 +x_0=213360 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Arizona West +<2763> +proj=tmerc +lat_0=31 +lon_0=-113.75 +k=0.999933 +x_0=213360 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Arkansas North +<2764> +proj=lcc +lat_1=36.23333333333333 +lat_2=34.93333333333333 +lat_0=34.33333333333334 +lon_0=-92 +x_0=400000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Arkansas South +<2765> +proj=lcc +lat_1=34.76666666666667 +lat_2=33.3 +lat_0=32.66666666666666 +lon_0=-92 +x_0=400000 +y_0=400000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / California zone 1 +<2766> +proj=lcc +lat_1=41.66666666666666 +lat_2=40 +lat_0=39.33333333333334 +lon_0=-122 +x_0=2000000 +y_0=500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / California zone 2 +<2767> +proj=lcc +lat_1=39.83333333333334 +lat_2=38.33333333333334 +lat_0=37.66666666666666 +lon_0=-122 +x_0=2000000 +y_0=500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / California zone 3 +<2768> +proj=lcc +lat_1=38.43333333333333 +lat_2=37.06666666666667 +lat_0=36.5 +lon_0=-120.5 +x_0=2000000 +y_0=500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / California zone 4 +<2769> +proj=lcc +lat_1=37.25 +lat_2=36 +lat_0=35.33333333333334 +lon_0=-119 +x_0=2000000 +y_0=500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / California zone 5 +<2770> +proj=lcc +lat_1=35.46666666666667 +lat_2=34.03333333333333 +lat_0=33.5 +lon_0=-118 +x_0=2000000 +y_0=500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / California zone 6 +<2771> +proj=lcc +lat_1=33.88333333333333 +lat_2=32.78333333333333 +lat_0=32.16666666666666 +lon_0=-116.25 +x_0=2000000 +y_0=500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Colorado North +<2772> +proj=lcc +lat_1=40.78333333333333 +lat_2=39.71666666666667 +lat_0=39.33333333333334 +lon_0=-105.5 +x_0=914401.8289 +y_0=304800.6096 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Colorado Central +<2773> +proj=lcc +lat_1=39.75 +lat_2=38.45 +lat_0=37.83333333333334 +lon_0=-105.5 +x_0=914401.8289 +y_0=304800.6096 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Colorado South +<2774> +proj=lcc +lat_1=38.43333333333333 +lat_2=37.23333333333333 +lat_0=36.66666666666666 +lon_0=-105.5 +x_0=914401.8289 +y_0=304800.6096 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Connecticut +<2775> +proj=lcc +lat_1=41.86666666666667 +lat_2=41.2 +lat_0=40.83333333333334 +lon_0=-72.75 +x_0=304800.6096 +y_0=152400.3048 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Delaware +<2776> +proj=tmerc +lat_0=38 +lon_0=-75.41666666666667 +k=0.999995 +x_0=200000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Florida East +<2777> +proj=tmerc +lat_0=24.33333333333333 +lon_0=-81 +k=0.999941 +x_0=200000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Florida West +<2778> +proj=tmerc +lat_0=24.33333333333333 +lon_0=-82 +k=0.999941 +x_0=200000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Florida North +<2779> +proj=lcc +lat_1=30.75 +lat_2=29.58333333333333 +lat_0=29 +lon_0=-84.5 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Georgia East +<2780> +proj=tmerc +lat_0=30 +lon_0=-82.16666666666667 +k=0.999900 +x_0=200000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Georgia West +<2781> +proj=tmerc +lat_0=30 +lon_0=-84.16666666666667 +k=0.999900 +x_0=700000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Hawaii zone 1 +<2782> +proj=tmerc +lat_0=18.83333333333333 +lon_0=-155.5 +k=0.999967 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Hawaii zone 2 +<2783> +proj=tmerc +lat_0=20.33333333333333 +lon_0=-156.6666666666667 +k=0.999967 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Hawaii zone 3 +<2784> +proj=tmerc +lat_0=21.16666666666667 +lon_0=-158 +k=0.999990 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Hawaii zone 4 +<2785> +proj=tmerc +lat_0=21.83333333333333 +lon_0=-159.5 +k=0.999990 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Hawaii zone 5 +<2786> +proj=tmerc +lat_0=21.66666666666667 +lon_0=-160.1666666666667 +k=1.000000 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Idaho East +<2787> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-112.1666666666667 +k=0.999947 +x_0=200000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Idaho Central +<2788> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-114 +k=0.999947 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Idaho West +<2789> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-115.75 +k=0.999933 +x_0=800000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Illinois East +<2790> +proj=tmerc +lat_0=36.66666666666666 +lon_0=-88.33333333333333 +k=0.999975 +x_0=300000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Illinois West +<2791> +proj=tmerc +lat_0=36.66666666666666 +lon_0=-90.16666666666667 +k=0.999941 +x_0=700000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Indiana East +<2792> +proj=tmerc +lat_0=37.5 +lon_0=-85.66666666666667 +k=0.999967 +x_0=100000 +y_0=250000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Indiana West +<2793> +proj=tmerc +lat_0=37.5 +lon_0=-87.08333333333333 +k=0.999967 +x_0=900000 +y_0=250000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Iowa North +<2794> +proj=lcc +lat_1=43.26666666666667 +lat_2=42.06666666666667 +lat_0=41.5 +lon_0=-93.5 +x_0=1500000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Iowa South +<2795> +proj=lcc +lat_1=41.78333333333333 +lat_2=40.61666666666667 +lat_0=40 +lon_0=-93.5 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Kansas North +<2796> +proj=lcc +lat_1=39.78333333333333 +lat_2=38.71666666666667 +lat_0=38.33333333333334 +lon_0=-98 +x_0=400000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Kansas South +<2797> +proj=lcc +lat_1=38.56666666666667 +lat_2=37.26666666666667 +lat_0=36.66666666666666 +lon_0=-98.5 +x_0=400000 +y_0=400000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Kentucky North +<2798> +proj=lcc +lat_1=37.96666666666667 +lat_2=38.96666666666667 +lat_0=37.5 +lon_0=-84.25 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Kentucky South +<2799> +proj=lcc +lat_1=37.93333333333333 +lat_2=36.73333333333333 +lat_0=36.33333333333334 +lon_0=-85.75 +x_0=500000 +y_0=500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Louisiana North +<2800> +proj=lcc +lat_1=32.66666666666666 +lat_2=31.16666666666667 +lat_0=30.5 +lon_0=-92.5 +x_0=1000000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Louisiana South +<2801> +proj=lcc +lat_1=30.7 +lat_2=29.3 +lat_0=28.5 +lon_0=-91.33333333333333 +x_0=1000000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Maine East +<2802> +proj=tmerc +lat_0=43.66666666666666 +lon_0=-68.5 +k=0.999900 +x_0=300000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Maine West +<2803> +proj=tmerc +lat_0=42.83333333333334 +lon_0=-70.16666666666667 +k=0.999967 +x_0=900000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Maryland +<2804> +proj=lcc +lat_1=39.45 +lat_2=38.3 +lat_0=37.66666666666666 +lon_0=-77 +x_0=400000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Massachusetts Mainland +<2805> +proj=lcc +lat_1=42.68333333333333 +lat_2=41.71666666666667 +lat_0=41 +lon_0=-71.5 +x_0=200000 +y_0=750000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Massachusetts Island +<2806> +proj=lcc +lat_1=41.48333333333333 +lat_2=41.28333333333333 +lat_0=41 +lon_0=-70.5 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Michigan North +<2807> +proj=lcc +lat_1=47.08333333333334 +lat_2=45.48333333333333 +lat_0=44.78333333333333 +lon_0=-87 +x_0=8000000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Michigan Central +<2808> +proj=lcc +lat_1=45.7 +lat_2=44.18333333333333 +lat_0=43.31666666666667 +lon_0=-84.36666666666666 +x_0=6000000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Michigan South +<2809> +proj=lcc +lat_1=43.66666666666666 +lat_2=42.1 +lat_0=41.5 +lon_0=-84.36666666666666 +x_0=4000000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Minnesota North +<2810> +proj=lcc +lat_1=48.63333333333333 +lat_2=47.03333333333333 +lat_0=46.5 +lon_0=-93.09999999999999 +x_0=800000 +y_0=100000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Minnesota Central +<2811> +proj=lcc +lat_1=47.05 +lat_2=45.61666666666667 +lat_0=45 +lon_0=-94.25 +x_0=800000 +y_0=100000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Minnesota South +<2812> +proj=lcc +lat_1=45.21666666666667 +lat_2=43.78333333333333 +lat_0=43 +lon_0=-94 +x_0=800000 +y_0=100000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Mississippi East +<2813> +proj=tmerc +lat_0=29.5 +lon_0=-88.83333333333333 +k=0.999950 +x_0=300000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Mississippi West +<2814> +proj=tmerc +lat_0=29.5 +lon_0=-90.33333333333333 +k=0.999950 +x_0=700000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Missouri East +<2815> +proj=tmerc +lat_0=35.83333333333334 +lon_0=-90.5 +k=0.999933 +x_0=250000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Missouri Central +<2816> +proj=tmerc +lat_0=35.83333333333334 +lon_0=-92.5 +k=0.999933 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Missouri West +<2817> +proj=tmerc +lat_0=36.16666666666666 +lon_0=-94.5 +k=0.999941 +x_0=850000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Montana +<2818> +proj=lcc +lat_1=49 +lat_2=45 +lat_0=44.25 +lon_0=-109.5 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Nebraska +<2819> +proj=lcc +lat_1=43 +lat_2=40 +lat_0=39.83333333333334 +lon_0=-100 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Nevada East +<2820> +proj=tmerc +lat_0=34.75 +lon_0=-115.5833333333333 +k=0.999900 +x_0=200000 +y_0=8000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Nevada Central +<2821> +proj=tmerc +lat_0=34.75 +lon_0=-116.6666666666667 +k=0.999900 +x_0=500000 +y_0=6000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Nevada West +<2822> +proj=tmerc +lat_0=34.75 +lon_0=-118.5833333333333 +k=0.999900 +x_0=800000 +y_0=4000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / New Hampshire +<2823> +proj=tmerc +lat_0=42.5 +lon_0=-71.66666666666667 +k=0.999967 +x_0=300000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / New Jersey +<2824> +proj=tmerc +lat_0=38.83333333333334 +lon_0=-74.5 +k=0.999900 +x_0=150000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / New Mexico East +<2825> +proj=tmerc +lat_0=31 +lon_0=-104.3333333333333 +k=0.999909 +x_0=165000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / New Mexico Central +<2826> +proj=tmerc +lat_0=31 +lon_0=-106.25 +k=0.999900 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / New Mexico West +<2827> +proj=tmerc +lat_0=31 +lon_0=-107.8333333333333 +k=0.999917 +x_0=830000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / New York East +<2828> +proj=tmerc +lat_0=38.83333333333334 +lon_0=-74.5 +k=0.999900 +x_0=150000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / New York Central +<2829> +proj=tmerc +lat_0=40 +lon_0=-76.58333333333333 +k=0.999938 +x_0=250000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / New York West +<2830> +proj=tmerc +lat_0=40 +lon_0=-78.58333333333333 +k=0.999938 +x_0=350000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / New York Long Island +<2831> +proj=lcc +lat_1=41.03333333333333 +lat_2=40.66666666666666 +lat_0=40.16666666666666 +lon_0=-74 +x_0=300000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / North Dakota North +<2832> +proj=lcc +lat_1=48.73333333333333 +lat_2=47.43333333333333 +lat_0=47 +lon_0=-100.5 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / North Dakota South +<2833> +proj=lcc +lat_1=47.48333333333333 +lat_2=46.18333333333333 +lat_0=45.66666666666666 +lon_0=-100.5 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Ohio North +<2834> +proj=lcc +lat_1=41.7 +lat_2=40.43333333333333 +lat_0=39.66666666666666 +lon_0=-82.5 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Ohio South +<2835> +proj=lcc +lat_1=40.03333333333333 +lat_2=38.73333333333333 +lat_0=38 +lon_0=-82.5 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Oklahoma North +<2836> +proj=lcc +lat_1=36.76666666666667 +lat_2=35.56666666666667 +lat_0=35 +lon_0=-98 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Oklahoma South +<2837> +proj=lcc +lat_1=35.23333333333333 +lat_2=33.93333333333333 +lat_0=33.33333333333334 +lon_0=-98 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Oregon North +<2838> +proj=lcc +lat_1=46 +lat_2=44.33333333333334 +lat_0=43.66666666666666 +lon_0=-120.5 +x_0=2500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Oregon South +<2839> +proj=lcc +lat_1=44 +lat_2=42.33333333333334 +lat_0=41.66666666666666 +lon_0=-120.5 +x_0=1500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Rhode Island +<2840> +proj=tmerc +lat_0=41.08333333333334 +lon_0=-71.5 +k=0.999994 +x_0=100000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / South Dakota North +<2841> +proj=lcc +lat_1=45.68333333333333 +lat_2=44.41666666666666 +lat_0=43.83333333333334 +lon_0=-100 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / South Dakota South +<2842> +proj=lcc +lat_1=44.4 +lat_2=42.83333333333334 +lat_0=42.33333333333334 +lon_0=-100.3333333333333 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Tennessee +<2843> +proj=lcc +lat_1=36.41666666666666 +lat_2=35.25 +lat_0=34.33333333333334 +lon_0=-86 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Texas North +<2844> +proj=lcc +lat_1=36.18333333333333 +lat_2=34.65 +lat_0=34 +lon_0=-101.5 +x_0=200000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Texas North Central +<2845> +proj=lcc +lat_1=33.96666666666667 +lat_2=32.13333333333333 +lat_0=31.66666666666667 +lon_0=-98.5 +x_0=600000 +y_0=2000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Texas Central +<2846> +proj=lcc +lat_1=31.88333333333333 +lat_2=30.11666666666667 +lat_0=29.66666666666667 +lon_0=-100.3333333333333 +x_0=700000 +y_0=3000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Texas South Central +<2847> +proj=lcc +lat_1=30.28333333333333 +lat_2=28.38333333333333 +lat_0=27.83333333333333 +lon_0=-99 +x_0=600000 +y_0=4000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Texas South +<2848> +proj=lcc +lat_1=27.83333333333333 +lat_2=26.16666666666667 +lat_0=25.66666666666667 +lon_0=-98.5 +x_0=300000 +y_0=5000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Utah North +<2849> +proj=lcc +lat_1=41.78333333333333 +lat_2=40.71666666666667 +lat_0=40.33333333333334 +lon_0=-111.5 +x_0=500000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Utah Central +<2850> +proj=lcc +lat_1=40.65 +lat_2=39.01666666666667 +lat_0=38.33333333333334 +lon_0=-111.5 +x_0=500000 +y_0=2000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Utah South +<2851> +proj=lcc +lat_1=38.35 +lat_2=37.21666666666667 +lat_0=36.66666666666666 +lon_0=-111.5 +x_0=500000 +y_0=3000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Vermont +<2852> +proj=tmerc +lat_0=42.5 +lon_0=-72.5 +k=0.999964 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Virginia North +<2853> +proj=lcc +lat_1=39.2 +lat_2=38.03333333333333 +lat_0=37.66666666666666 +lon_0=-78.5 +x_0=3500000 +y_0=2000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Virginia South +<2854> +proj=lcc +lat_1=37.96666666666667 +lat_2=36.76666666666667 +lat_0=36.33333333333334 +lon_0=-78.5 +x_0=3500000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Washington North +<2855> +proj=lcc +lat_1=48.73333333333333 +lat_2=47.5 +lat_0=47 +lon_0=-120.8333333333333 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Washington South +<2856> +proj=lcc +lat_1=47.33333333333334 +lat_2=45.83333333333334 +lat_0=45.33333333333334 +lon_0=-120.5 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / West Virginia North +<2857> +proj=lcc +lat_1=40.25 +lat_2=39 +lat_0=38.5 +lon_0=-79.5 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / West Virginia South +<2858> +proj=lcc +lat_1=38.88333333333333 +lat_2=37.48333333333333 +lat_0=37 +lon_0=-81 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Wisconsin North +<2859> +proj=lcc +lat_1=46.76666666666667 +lat_2=45.56666666666667 +lat_0=45.16666666666666 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Wisconsin Central +<2860> +proj=lcc +lat_1=45.5 +lat_2=44.25 +lat_0=43.83333333333334 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Wisconsin South +<2861> +proj=lcc +lat_1=44.06666666666667 +lat_2=42.73333333333333 +lat_0=42 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Wyoming East +<2862> +proj=tmerc +lat_0=40.5 +lon_0=-105.1666666666667 +k=0.999938 +x_0=200000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Wyoming East Central +<2863> +proj=tmerc +lat_0=40.5 +lon_0=-107.3333333333333 +k=0.999938 +x_0=400000 +y_0=100000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Wyoming West Central +<2864> +proj=tmerc +lat_0=40.5 +lon_0=-108.75 +k=0.999938 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Wyoming West +<2865> +proj=tmerc +lat_0=40.5 +lon_0=-110.0833333333333 +k=0.999938 +x_0=800000 +y_0=100000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Puerto Rico & Virgin Is. +<2866> +proj=lcc +lat_1=18.43333333333333 +lat_2=18.03333333333333 +lat_0=17.83333333333333 +lon_0=-66.43333333333334 +x_0=200000 +y_0=200000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(HARN) / Arizona East (ft) +<2867> +proj=tmerc +lat_0=31 +lon_0=-110.1666666666667 +k=0.999900 +x_0=213360 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048 +no_defs <> +# NAD83(HARN) / Arizona Central (ft) +<2868> +proj=tmerc +lat_0=31 +lon_0=-111.9166666666667 +k=0.999900 +x_0=213360 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048 +no_defs <> +# NAD83(HARN) / Arizona West (ft) +<2869> +proj=tmerc +lat_0=31 +lon_0=-113.75 +k=0.999933 +x_0=213360 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048 +no_defs <> +# NAD83(HARN) / California zone 1 (ftUS) +<2870> +proj=lcc +lat_1=41.66666666666666 +lat_2=40 +lat_0=39.33333333333334 +lon_0=-122 +x_0=2000000.0001016 +y_0=500000.0001016001 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs <> +# NAD83(HARN) / California zone 2 (ftUS) +<2871> +proj=lcc +lat_1=39.83333333333334 +lat_2=38.33333333333334 +lat_0=37.66666666666666 +lon_0=-122 +x_0=2000000.0001016 +y_0=500000.0001016001 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs <> +# NAD83(HARN) / California zone 3 (ftUS) +<2872> +proj=lcc +lat_1=38.43333333333333 +lat_2=37.06666666666667 +lat_0=36.5 +lon_0=-120.5 +x_0=2000000.0001016 +y_0=500000.0001016001 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs <> +# NAD83(HARN) / California zone 4 (ftUS) +<2873> +proj=lcc +lat_1=37.25 +lat_2=36 +lat_0=35.33333333333334 +lon_0=-119 +x_0=2000000.0001016 +y_0=500000.0001016001 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs <> +# NAD83(HARN) / California zone 5 (ftUS) +<2874> +proj=lcc +lat_1=35.46666666666667 +lat_2=34.03333333333333 +lat_0=33.5 +lon_0=-118 +x_0=2000000.0001016 +y_0=500000.0001016001 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs <> +# NAD83(HARN) / California zone 6 (ftUS) +<2875> +proj=lcc +lat_1=33.88333333333333 +lat_2=32.78333333333333 +lat_0=32.16666666666666 +lon_0=-116.25 +x_0=2000000.0001016 +y_0=500000.0001016001 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs <> +# NAD83(HARN) / Colorado North (ftUS) +<2876> +proj=lcc +lat_1=40.78333333333333 +lat_2=39.71666666666667 +lat_0=39.33333333333334 +lon_0=-105.5 +x_0=914401.8288036576 +y_0=304800.6096012192 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs <> +# NAD83(HARN) / Colorado Central (ftUS) +<2877> +proj=lcc +lat_1=39.75 +lat_2=38.45 +lat_0=37.83333333333334 +lon_0=-105.5 +x_0=914401.8288036576 +y_0=304800.6096012192 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs <> +# NAD83(HARN) / Colorado South (ftUS) +<2878> +proj=lcc +lat_1=38.43333333333333 +lat_2=37.23333333333333 +lat_0=36.66666666666666 +lon_0=-105.5 +x_0=914401.8288036576 +y_0=304800.6096012192 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs <> +# NAD83(HARN) / Connecticut (ftUS) +<2879> +proj=lcc +lat_1=41.86666666666667 +lat_2=41.2 +lat_0=40.83333333333334 +lon_0=-72.75 +x_0=304800.6096012192 +y_0=152400.3048006096 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs <> +# NAD83(HARN) / Delaware (ftUS) +<2880> +proj=tmerc +lat_0=38 +lon_0=-75.41666666666667 +k=0.999995 +x_0=200000.0001016002 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs <> +# NAD83(HARN) / Florida East (ftUS) +<2881> +proj=tmerc +lat_0=24.33333333333333 +lon_0=-81 +k=0.999941 +x_0=200000.0001016002 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs <> +# NAD83(HARN) / Florida West (ftUS) +<2882> +proj=tmerc +lat_0=24.33333333333333 +lon_0=-82 +k=0.999941 +x_0=200000.0001016002 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs <> +# NAD83(HARN) / Florida North (ftUS) +<2883> +proj=lcc +lat_1=30.75 +lat_2=29.58333333333333 +lat_0=29 +lon_0=-84.5 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs <> +# NAD83(HARN) / Georgia East (ftUS) +<2884> +proj=tmerc +lat_0=30 +lon_0=-82.16666666666667 +k=0.999900 +x_0=200000.0001016002 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs <> +# NAD83(HARN) / Georgia West (ftUS) +<2885> +proj=tmerc +lat_0=30 +lon_0=-84.16666666666667 +k=0.999900 +x_0=699999.9998983998 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs <> +# NAD83(HARN) / Idaho East (ftUS) +<2886> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-112.1666666666667 +k=0.999947 +x_0=200000.0001016002 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs <> +# NAD83(HARN) / Idaho Central (ftUS) +<2887> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-114 +k=0.999947 +x_0=500000.0001016001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs <> +# NAD83(HARN) / Idaho West (ftUS) +<2888> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-115.75 +k=0.999933 +x_0=800000.0001016001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs <> +# NAD83(HARN) / Indiana East (ftUS) +<2889> +proj=tmerc +lat_0=37.5 +lon_0=-85.66666666666667 +k=0.999967 +x_0=99999.99989839978 +y_0=249364.9987299975 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs <> +# NAD83(HARN) / Indiana West (ftUS) +<2890> +proj=tmerc +lat_0=37.5 +lon_0=-87.08333333333333 +k=0.999967 +x_0=900000 +y_0=249364.9987299975 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs <> +# NAD83(HARN) / Kentucky North (ftUS) +<2891> +proj=lcc +lat_1=37.96666666666667 +lat_2=38.96666666666667 +lat_0=37.5 +lon_0=-84.25 +x_0=500000.0001016001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs <> +# NAD83(HARN) / Kentucky South (ftUS) +<2892> +proj=lcc +lat_1=37.93333333333333 +lat_2=36.73333333333333 +lat_0=36.33333333333334 +lon_0=-85.75 +x_0=500000.0001016001 +y_0=500000.0001016001 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs <> +# NAD83(HARN) / Maryland (ftUS) +<2893> +proj=lcc +lat_1=39.45 +lat_2=38.3 +lat_0=37.66666666666666 +lon_0=-77 +x_0=399999.9998983998 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs <> +# NAD83(HARN) / Massachusetts Mainland (ftUS) +<2894> +proj=lcc +lat_1=42.68333333333333 +lat_2=41.71666666666667 +lat_0=41 +lon_0=-71.5 +x_0=200000.0001016002 +y_0=750000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs <> +# NAD83(HARN) / Massachusetts Island (ftUS) +<2895> +proj=lcc +lat_1=41.48333333333333 +lat_2=41.28333333333333 +lat_0=41 +lon_0=-70.5 +x_0=500000.0001016001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs <> +# NAD83(HARN) / Michigan North (ft) +<2896> +proj=lcc +lat_1=47.08333333333334 +lat_2=45.48333333333333 +lat_0=44.78333333333333 +lon_0=-87 +x_0=7999999.999968001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048 +no_defs <> +# NAD83(HARN) / Michigan Central (ft) +<2897> +proj=lcc +lat_1=45.7 +lat_2=44.18333333333333 +lat_0=43.31666666666667 +lon_0=-84.36666666666666 +x_0=5999999.999976001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048 +no_defs <> +# NAD83(HARN) / Michigan South (ft) +<2898> +proj=lcc +lat_1=43.66666666666666 +lat_2=42.1 +lat_0=41.5 +lon_0=-84.36666666666666 +x_0=3999999.999984 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048 +no_defs <> +# NAD83(HARN) / Mississippi East (ftUS) +<2899> +proj=tmerc +lat_0=29.5 +lon_0=-88.83333333333333 +k=0.999950 +x_0=300000.0000000001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs <> +# NAD83(HARN) / Mississippi West (ftUS) +<2900> +proj=tmerc +lat_0=29.5 +lon_0=-90.33333333333333 +k=0.999950 +x_0=699999.9998983998 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs <> +# NAD83(HARN) / Montana (ft) +<2901> +proj=lcc +lat_1=49 +lat_2=45 +lat_0=44.25 +lon_0=-109.5 +x_0=599999.9999976 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048 +no_defs <> +# NAD83(HARN) / New Mexico East (ftUS) +<2902> +proj=tmerc +lat_0=31 +lon_0=-104.3333333333333 +k=0.999909 +x_0=165000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs <> +# NAD83(HARN) / New Mexico Central (ftUS) +<2903> +proj=tmerc +lat_0=31 +lon_0=-106.25 +k=0.999900 +x_0=500000.0001016001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs <> +# NAD83(HARN) / New Mexico West (ftUS) +<2904> +proj=tmerc +lat_0=31 +lon_0=-107.8333333333333 +k=0.999917 +x_0=830000.0001016001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs <> +# NAD83(HARN) / New York East (ftUS) +<2905> +proj=tmerc +lat_0=38.83333333333334 +lon_0=-74.5 +k=0.999900 +x_0=150000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs <> +# NAD83(HARN) / New York Central (ftUS) +<2906> +proj=tmerc +lat_0=40 +lon_0=-76.58333333333333 +k=0.999938 +x_0=249999.9998983998 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs <> +# NAD83(HARN) / New York West (ftUS) +<2907> +proj=tmerc +lat_0=40 +lon_0=-78.58333333333333 +k=0.999938 +x_0=350000.0001016001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs <> +# NAD83(HARN) / New York Long Island (ftUS) +<2908> +proj=lcc +lat_1=41.03333333333333 +lat_2=40.66666666666666 +lat_0=40.16666666666666 +lon_0=-74 +x_0=300000.0000000001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs <> +# NAD83(HARN) / North Dakota North (ft) +<2909> +proj=lcc +lat_1=48.73333333333333 +lat_2=47.43333333333333 +lat_0=47 +lon_0=-100.5 +x_0=599999.9999976 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048 +no_defs <> +# NAD83(HARN) / North Dakota South (ft) +<2910> +proj=lcc +lat_1=47.48333333333333 +lat_2=46.18333333333333 +lat_0=45.66666666666666 +lon_0=-100.5 +x_0=599999.9999976 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048 +no_defs <> +# NAD83(HARN) / Oklahoma North (ftUS) +<2911> +proj=lcc +lat_1=36.76666666666667 +lat_2=35.56666666666667 +lat_0=35 +lon_0=-98 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs <> +# NAD83(HARN) / Oklahoma South (ftUS) +<2912> +proj=lcc +lat_1=35.23333333333333 +lat_2=33.93333333333333 +lat_0=33.33333333333334 +lon_0=-98 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs <> +# NAD83(HARN) / Oregon North (ft) +<2913> +proj=lcc +lat_1=46 +lat_2=44.33333333333334 +lat_0=43.66666666666666 +lon_0=-120.5 +x_0=2500000.0001424 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048 +no_defs <> +# NAD83(HARN) / Oregon South (ft) +<2914> +proj=lcc +lat_1=44 +lat_2=42.33333333333334 +lat_0=41.66666666666666 +lon_0=-120.5 +x_0=1500000.0001464 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048 +no_defs <> +# NAD83(HARN) / Tennessee (ftUS) +<2915> +proj=lcc +lat_1=36.41666666666666 +lat_2=35.25 +lat_0=34.33333333333334 +lon_0=-86 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs <> +# NAD83(HARN) / Texas North (ftUS) +<2916> +proj=lcc +lat_1=36.18333333333333 +lat_2=34.65 +lat_0=34 +lon_0=-101.5 +x_0=200000.0001016002 +y_0=999999.9998983998 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs <> +# NAD83(HARN) / Texas North Central (ftUS) +<2917> +proj=lcc +lat_1=33.96666666666667 +lat_2=32.13333333333333 +lat_0=31.66666666666667 +lon_0=-98.5 +x_0=600000 +y_0=2000000.0001016 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs <> +# NAD83(HARN) / Texas Central (ftUS) +<2918> +proj=lcc +lat_1=31.88333333333333 +lat_2=30.11666666666667 +lat_0=29.66666666666667 +lon_0=-100.3333333333333 +x_0=699999.9998983998 +y_0=3000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs <> +# NAD83(HARN) / Texas South Central (ftUS) +<2919> +proj=lcc +lat_1=30.28333333333333 +lat_2=28.38333333333333 +lat_0=27.83333333333333 +lon_0=-99 +x_0=600000 +y_0=3999999.9998984 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs <> +# NAD83(HARN) / Texas South (ftUS) +<2920> +proj=lcc +lat_1=27.83333333333333 +lat_2=26.16666666666667 +lat_0=25.66666666666667 +lon_0=-98.5 +x_0=300000.0000000001 +y_0=5000000.0001016 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs <> +# NAD83(HARN) / Utah North (ft) +<2921> +proj=lcc +lat_1=41.78333333333333 +lat_2=40.71666666666667 +lat_0=40.33333333333334 +lon_0=-111.5 +x_0=500000.0001504 +y_0=999999.9999960001 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048 +no_defs <> +# NAD83(HARN) / Utah Central (ft) +<2922> +proj=lcc +lat_1=40.65 +lat_2=39.01666666666667 +lat_0=38.33333333333334 +lon_0=-111.5 +x_0=500000.0001504 +y_0=1999999.999992 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048 +no_defs <> +# NAD83(HARN) / Utah South (ft) +<2923> +proj=lcc +lat_1=38.35 +lat_2=37.21666666666667 +lat_0=36.66666666666666 +lon_0=-111.5 +x_0=500000.0001504 +y_0=2999999.999988 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048 +no_defs <> +# NAD83(HARN) / Virginia North (ftUS) +<2924> +proj=lcc +lat_1=39.2 +lat_2=38.03333333333333 +lat_0=37.66666666666666 +lon_0=-78.5 +x_0=3500000.0001016 +y_0=2000000.0001016 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs <> +# NAD83(HARN) / Virginia South (ftUS) +<2925> +proj=lcc +lat_1=37.96666666666667 +lat_2=36.76666666666667 +lat_0=36.33333333333334 +lon_0=-78.5 +x_0=3500000.0001016 +y_0=999999.9998983998 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs <> +# NAD83(HARN) / Washington North (ftUS) +<2926> +proj=lcc +lat_1=48.73333333333333 +lat_2=47.5 +lat_0=47 +lon_0=-120.8333333333333 +x_0=500000.0001016001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs <> +# NAD83(HARN) / Washington South (ftUS) +<2927> +proj=lcc +lat_1=47.33333333333334 +lat_2=45.83333333333334 +lat_0=45.33333333333334 +lon_0=-120.5 +x_0=500000.0001016001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs <> +# NAD83(HARN) / Wisconsin North (ftUS) +<2928> +proj=lcc +lat_1=46.76666666666667 +lat_2=45.56666666666667 +lat_0=45.16666666666666 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs <> +# NAD83(HARN) / Wisconsin Central (ftUS) +<2929> +proj=lcc +lat_1=45.5 +lat_2=44.25 +lat_0=43.83333333333334 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs <> +# NAD83(HARN) / Wisconsin South (ftUS) +<2930> +proj=lcc +lat_1=44.06666666666667 +lat_2=42.73333333333333 +lat_0=42 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs <> +# Beduaram / TM 13 NE +<2931> +proj=tmerc +lat_0=0 +lon_0=13 +k=0.999600 +x_0=500000.0000000001 +y_0=0 +a=6378249.2 +b=6356515 +to_meter=0.3048006096012192 +no_defs <> +# QND95 / Qatar National Grid +<2932> +proj=tmerc +lat_0=24.45 +lon_0=51.21666666666667 +k=0.999990 +x_0=200000 +y_0=300000 +ellps=intl +towgs84=-119.425,-303.659,-11.0006,1.1643,0.174458,1.09626,3.65706 +units=m +no_defs <> +# Segara / UTM zone 50S +<2933> +proj=utm +zone=50 +south +ellps=bessel +towgs84=-404.78,685.68,45.47,0,0,0,0 +units=m +no_defs <> +# Segara (Jakarta) / NEIEZ +<2934> +proj=merc +lat_ts=0 +lon_0=216.8077194444444 +k=0.997000 +x_0=3900000 +y_0=900000 +ellps=bessel +pm=jakarta +units=m +no_defs <> +# Pulkovo 1942 / CS63 zone A1 +<2935> +proj=tmerc +lat_0=0.1166666666666667 +lon_0=41.53333333333333 +k=1.000000 +x_0=1300000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / CS63 zone A2 +<2936> +proj=tmerc +lat_0=0.1166666666666667 +lon_0=44.53333333333333 +k=1.000000 +x_0=2300000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / CS63 zone A3 +<2937> +proj=tmerc +lat_0=0.1166666666666667 +lon_0=47.53333333333333 +k=1.000000 +x_0=3300000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / CS63 zone A4 +<2938> +proj=tmerc +lat_0=0.1166666666666667 +lon_0=50.53333333333333 +k=1.000000 +x_0=4300000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / CS63 zone K2 +<2939> +proj=tmerc +lat_0=0.1333333333333333 +lon_0=50.76666666666667 +k=1.000000 +x_0=2300000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / CS63 zone K3 +<2940> +proj=tmerc +lat_0=0.1333333333333333 +lon_0=53.76666666666667 +k=1.000000 +x_0=3300000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / CS63 zone K4 +<2941> +proj=tmerc +lat_0=0.1333333333333333 +lon_0=56.76666666666667 +k=1.000000 +x_0=4300000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Porto Santo / UTM zone 28N +<2942> +proj=utm +zone=28 +ellps=intl +units=m +no_defs <> +# Selvagem Grande / UTM zone 28N +<2943> +proj=utm +zone=28 +ellps=intl +units=m +no_defs <> +# NAD83(CSRS) / SCoPQ zone 2 +<2944> +proj=tmerc +lat_0=0 +lon_0=-55.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS) / MTM zone 3 +<2945> +proj=tmerc +lat_0=0 +lon_0=-58.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS) / MTM zone 4 +<2946> +proj=tmerc +lat_0=0 +lon_0=-61.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS) / MTM zone 5 +<2947> +proj=tmerc +lat_0=0 +lon_0=-64.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS) / MTM zone 6 +<2948> +proj=tmerc +lat_0=0 +lon_0=-67.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS) / MTM zone 7 +<2949> +proj=tmerc +lat_0=0 +lon_0=-70.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS) / MTM zone 8 +<2950> +proj=tmerc +lat_0=0 +lon_0=-73.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS) / MTM zone 9 +<2951> +proj=tmerc +lat_0=0 +lon_0=-76.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS) / MTM zone 10 +<2952> +proj=tmerc +lat_0=0 +lon_0=-79.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS) / New Brunswick Stereo +<2953> +proj=stere +lat_0=46.5 +lon_0=-66.5 +k=0.999912 +x_0=2500000 +y_0=7500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS) / Prince Edward Isl. Stereographic (NAD83) +<2954> +proj=stere +lat_0=47.25 +lon_0=-63 +k=0.999912 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS) / UTM zone 11N +<2955> +proj=utm +zone=11 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS) / UTM zone 12N +<2956> +proj=utm +zone=12 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS) / UTM zone 13N +<2957> +proj=utm +zone=13 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS) / UTM zone 17N +<2958> +proj=utm +zone=17 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS) / UTM zone 18N +<2959> +proj=utm +zone=18 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS) / UTM zone 19N +<2960> +proj=utm +zone=19 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS) / UTM zone 20N +<2961> +proj=utm +zone=20 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD83(CSRS) / UTM zone 21N +<2962> +proj=utm +zone=21 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Moznet / UTM zone 36S +<3036> +proj=utm +zone=36 +south +ellps=WGS84 +towgs84=0,0,0,-0,-0,-0,0 +units=m +no_defs <> +# Moznet / UTM zone 37S +<3037> +proj=utm +zone=37 +south +ellps=WGS84 +towgs84=0,0,0,-0,-0,-0,0 +units=m +no_defs <> +# Indian 1960 / UTM zone 48N +<3148> +proj=utm +zone=48 +a=6377276.345 +b=6356075.413140239 +units=m +no_defs <> +# Indian 1960 / UTM zone 49N +<3149> +proj=utm +zone=49 +a=6377276.345 +b=6356075.413140239 +units=m +no_defs <> +# Indian 1960 / TM 106 NE +<3176> +proj=tmerc +lat_0=0 +lon_0=106 +k=0.999600 +x_0=500000 +y_0=0 +a=6377276.345 +b=6356075.413140239 +units=m +no_defs <> +# FD58 / Iraq zone +<3200> +proj=lcc +lat_1=32.5 +lat_0=32.5 +lon_0=45 +k_0=0.9987864078000001 +x_0=1500000 +y_0=1166200 +ellps=clrk80 +units=m +no_defs <> +# Estonian Coordinate System of 1992 +<3300> +proj=lcc +lat_1=59.33333333333334 +lat_2=58 +lat_0=57.51755393055556 +lon_0=24 +x_0=500000 +y_0=6375000 +ellps=GRS80 +towgs84=0.055,-0.541,-0.185,0.0183,-0.0003,-0.007,-0.014 +units=m +no_defs <> +# Estonian Coordinate System of 1997 +<3301> +proj=lcc +lat_1=59.33333333333334 +lat_2=58 +lat_0=57.51755393055556 +lon_0=24 +x_0=500000 +y_0=6375000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# PSD93 / UTM zone 39N +<3439> +proj=utm +zone=39 +ellps=clrk80 +units=m +no_defs <> +# PSD93 / UTM zone 40N +<3440> +proj=utm +zone=40 +ellps=clrk80 +units=m +no_defs <> +# Old Hawaiian / Hawaii zone 1 +<3561> +proj=tmerc +lat_0=18.83333333333333 +lon_0=-155.5 +k=0.999967 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +to_meter=0.3048006096012192 +no_defs <> +# Old Hawaiian / Hawaii zone 2 +<3562> +proj=tmerc +lat_0=20.33333333333333 +lon_0=-156.6666666666667 +k=0.999967 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +to_meter=0.3048006096012192 +no_defs <> +# Old Hawaiian / Hawaii zone 3 +<3563> +proj=tmerc +lat_0=21.16666666666667 +lon_0=-158 +k=0.999990 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +to_meter=0.3048006096012192 +no_defs <> +# Old Hawaiian / Hawaii zone 4 +<3564> +proj=tmerc +lat_0=21.83333333333333 +lon_0=-159.5 +k=0.999990 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +to_meter=0.3048006096012192 +no_defs <> +# Old Hawaiian / Hawaii zone 5 +<3565> +proj=tmerc +lat_0=21.66666666666667 +lon_0=-160.1666666666667 +k=1.000000 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +to_meter=0.3048006096012192 +no_defs <> +# Puerto Rico / UTM zone 20N +<3920> +proj=utm +zone=20 +ellps=clrk66 +units=m +no_defs <> +# Puerto Rico State Plane CS of 1927 +<3991> +proj=lcc +lat_1=18.43333333333333 +lat_2=18.03333333333333 +lat_0=17.83333333333333 +lon_0=-66.43333333333334 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +to_meter=0.3048006096012192 +no_defs <> +# Puerto Rico / St. Croix +<3992> +proj=lcc +lat_1=18.43333333333333 +lat_2=18.03333333333333 +lat_0=17.83333333333333 +lon_0=-66.43333333333334 +x_0=152400.3048006096 +y_0=30480.06096012192 +ellps=clrk66 +to_meter=0.3048006096012192 +no_defs <> +# Unknown datum based upon the Airy 1830 ellipsoid +<4001> +proj=longlat +ellps=airy +no_defs <> +# Unknown datum based upon the Airy Modified 1849 ellipsoid +<4002> +proj=longlat +a=6377340.189 +b=6356034.447938534 +no_defs <> +# Unknown datum based upon the Australian National Spheroid +<4003> +proj=longlat +ellps=aust_SA +no_defs <> +# Unknown datum based upon the Bessel 1841 ellipsoid +<4004> +proj=longlat +ellps=bessel +no_defs <> +# Unknown datum based upon the Bessel Modified ellipsoid +<4005> +proj=longlat +a=6377492.018 +b=6356173.508712696 +no_defs <> +# Unknown datum based upon the Bessel Namibia ellipsoid +<4006> +proj=longlat +ellps=bess_nam +no_defs <> +# Unknown datum based upon the Clarke 1858 ellipsoid +<4007> +proj=longlat +a=6378293.63683822 +b=6356617.979337744 +no_defs <> +# Unknown datum based upon the Clarke 1866 ellipsoid +<4008> +proj=longlat +ellps=clrk66 +no_defs <> +# Unknown datum based upon the Clarke 1866 Michigan ellipsoid +<4009> +proj=longlat +a=6378450.047548896 +b=6356826.621488444 +no_defs <> +# Unknown datum based upon the Clarke 1880 (Benoit) ellipsoid +<4010> +proj=longlat +a=6378300.789 +b=6356566.435 +no_defs <> +# Unknown datum based upon the Clarke 1880 (IGN) ellipsoid +<4011> +proj=longlat +a=6378249.2 +b=6356515 +no_defs <> +# Unknown datum based upon the Clarke 1880 (RGS) ellipsoid +<4012> +proj=longlat +ellps=clrk80 +no_defs <> +# Unknown datum based upon the Clarke 1880 (Arc) ellipsoid +<4013> +proj=longlat +a=6378249.145 +b=6356514.966398753 +no_defs <> +# Unknown datum based upon the Clarke 1880 (SGA 1922) ellipsoid +<4014> +proj=longlat +a=6378249.2 +b=6356514.996941779 +no_defs <> +# Unknown datum based upon the Everest 1830 (1937 Adjustment) ellipsoid +<4015> +proj=longlat +a=6377276.345 +b=6356075.413140239 +no_defs <> +# Unknown datum based upon the Everest 1830 (1967 Definition) ellipsoid +<4016> +proj=longlat +ellps=evrstSS +no_defs <> +# Unknown datum based upon the Everest 1830 Modified ellipsoid +<4018> +proj=longlat +a=6377304.063 +b=6356103.038993155 +no_defs <> +# Unknown datum based upon the GRS 1980 ellipsoid +<4019> +proj=longlat +ellps=GRS80 +no_defs <> +# Unknown datum based upon the Helmert 1906 ellipsoid +<4020> +proj=longlat +ellps=helmert +no_defs <> +# Unknown datum based upon the Indonesian National Spheroid +<4021> +proj=longlat +a=6378160 +b=6356774.50408554 +no_defs <> +# Unknown datum based upon the International 1924 ellipsoid +<4022> +proj=longlat +ellps=intl +no_defs <> +# Unknown datum based upon the Krassowsky 1940 ellipsoid +<4024> +proj=longlat +ellps=krass +no_defs <> +# Unknown datum based upon the NWL 9D ellipsoid +<4025> +proj=longlat +ellps=WGS66 +no_defs <> +# Unknown datum based upon the Plessis 1817 ellipsoid +<4027> +proj=longlat +a=6376523 +b=6355862.933255573 +no_defs <> +# Unknown datum based upon the Struve 1860 ellipsoid +<4028> +proj=longlat +a=6378298.3 +b=6356657.142669562 +no_defs <> +# Unknown datum based upon the War Office ellipsoid +<4029> +proj=longlat +a=6378300 +b=6356751.689189189 +no_defs <> +# Unknown datum based upon the WGS 84 ellipsoid +<4030> +proj=longlat +ellps=WGS84 +no_defs <> +# Unknown datum based upon the GEM 10C ellipsoid +<4031> +proj=longlat +ellps=WGS84 +no_defs <> +# Unknown datum based upon the OSU86F ellipsoid +<4032> +proj=longlat +a=6378136.2 +b=6356751.516927429 +no_defs <> +# Unknown datum based upon the OSU91A ellipsoid +<4033> +proj=longlat +a=6378136.3 +b=6356751.616592146 +no_defs <> +# Unknown datum based upon the Clarke 1880 ellipsoid +<4034> +proj=longlat +ellps=clrk80 +no_defs <> +# Unknown datum based upon the Authalic Sphere +<4035> +proj=longlat +a=6371000 +b=6371000 +no_defs <> +# Unknown datum based upon the GRS 1967 ellipsoid +<4036> +proj=longlat +ellps=GRS67 +no_defs <> +# Unknown datum based upon the Average Terrestrial System 1977 ellipsoid +<4041> +proj=longlat +a=6378135 +b=6356750.304921594 +no_defs <> +# Unknown datum based upon the Everest (1830 Definition) ellipsoid +<4042> +proj=longlat +a=6377299.36559538 +b=6356098.357204817 +no_defs <> +# Unknown datum based upon the WGS 72 ellipsoid +<4043> +proj=longlat +ellps=WGS72 +no_defs <> +# Unknown datum based upon the Everest 1830 (1962 Definition) ellipsoid +<4044> +proj=longlat +a=6377301.243 +b=6356100.230165385 +no_defs <> +# Unknown datum based upon the Everest 1830 (1975 Definition) ellipsoid +<4045> +proj=longlat +a=6377299.151 +b=6356098.145120132 +no_defs <> +# Unspecified based upon the GRS 1980 Authalic Sphere +<4047> +proj=longlat +a=6370997 +b=6370997 +no_defs <> +# Greek +<4120> +proj=longlat +ellps=bessel +no_defs <> +# GGRS87 +<4121> +proj=longlat +ellps=GRS80 +towgs84=-199.87,74.79,246.62,0,0,0,0 +no_defs <> +# ATS77 +<4122> +proj=longlat +a=6378135 +b=6356750.304921594 +no_defs <> +# KKJ +<4123> +proj=longlat +ellps=intl +towgs84=-90.7,-106.1,-119.2,4.09,0.218,-1.05,1.37 +no_defs <> +# RT90 +<4124> +proj=longlat +ellps=bessel +no_defs <> +# Samboja +<4125> +proj=longlat +ellps=bessel +towgs84=-404.78,685.68,45.47,0,0,0,0 +no_defs <> +# LKS94 (ETRS89) +<4126> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# Tete +<4127> +proj=longlat +ellps=clrk66 +no_defs <> +# Madzansua +<4128> +proj=longlat +ellps=clrk66 +no_defs <> +# Observatario +<4129> +proj=longlat +ellps=clrk66 +no_defs <> +# Moznet +<4130> +proj=longlat +ellps=WGS84 +towgs84=0,0,0,-0,-0,-0,0 +no_defs <> +# Indian 1960 +<4131> +proj=longlat +a=6377276.345 +b=6356075.413140239 +no_defs <> +# FD58 +<4132> +proj=longlat +ellps=clrk80 +no_defs <> +# EST92 +<4133> +proj=longlat +ellps=GRS80 +towgs84=0.055,-0.541,-0.185,0.0183,-0.0003,-0.007,-0.014 +no_defs <> +# PDO Survey Datum 1993 +<4134> +proj=longlat +ellps=clrk80 +no_defs <> +# Old Hawaiian +<4135> +proj=longlat +ellps=clrk66 +no_defs <> +# St. Lawrence Island +<4136> +proj=longlat +ellps=clrk66 +no_defs <> +# St. Paul Island +<4137> +proj=longlat +ellps=clrk66 +no_defs <> +# St. George Island +<4138> +proj=longlat +ellps=clrk66 +no_defs <> +# Puerto Rico +<4139> +proj=longlat +ellps=clrk66 +no_defs <> +# NAD83(CSRS98) +<4140> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# Israel +<4141> +proj=longlat +ellps=GRS80 +no_defs <> +# Locodjo 1965 +<4142> +proj=longlat +ellps=clrk80 +towgs84=-125,53,467,0,0,0,0 +no_defs <> +# Abidjan 1987 +<4143> +proj=longlat +ellps=clrk80 +towgs84=-124.76,53,466.79,0,0,0,0 +no_defs <> +# Kalianpur 1937 +<4144> +proj=longlat +a=6377276.345 +b=6356075.413140239 +no_defs <> +# Kalianpur 1962 +<4145> +proj=longlat +a=6377301.243 +b=6356100.230165385 +towgs84=283,682,231,0,0,0,0 +no_defs <> +# Kalianpur 1975 +<4146> +proj=longlat +a=6377299.151 +b=6356098.145120132 +towgs84=295,736,257,0,0,0,0 +no_defs <> +# Hanoi 1972 +<4147> +proj=longlat +ellps=krass +towgs84=-17.51,-108.32,-62.39,0,0,0,0 +no_defs <> +# Hartebeesthoek94 +<4148> +proj=longlat +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# CH1903 +<4149> +proj=longlat +ellps=bessel +no_defs <> +# CH1903+ +<4150> +proj=longlat +ellps=bessel +towgs84=674.374,15.056,405.346,0,0,0,0 +no_defs <> +# CHTRF95 +<4151> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# NAD83(HARN) +<4152> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# Rassadiran +<4153> +proj=longlat +ellps=intl +towgs84=-133.63,-157.5,-158.62,0,0,0,0 +no_defs <> +# ED50(ED77) +<4154> +proj=longlat +ellps=intl +no_defs <> +# Dabola 1981 +<4155> +proj=longlat +a=6378249.2 +b=6356515 +towgs84=-83,37,124,0,0,0,0 +no_defs <> +# S-JTSK +<4156> +proj=longlat +ellps=bessel +no_defs <> +# Mount Dillon +<4157> +proj=longlat +a=6378293.63683822 +b=6356617.979337744 +no_defs <> +# Naparima 1955 +<4158> +proj=longlat +ellps=intl +no_defs <> +# ELD79 +<4159> +proj=longlat +ellps=intl +no_defs <> +# Chos Malal 1914 +<4160> +proj=longlat +ellps=intl +no_defs <> +# Pampa del Castillo +<4161> +proj=longlat +ellps=intl +no_defs <> +# Korean 1985 +<4162> +proj=longlat +ellps=bessel +no_defs <> +# Yemen NGN96 +<4163> +proj=longlat +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# South Yemen +<4164> +proj=longlat +ellps=krass +towgs84=-76,-138,67,0,0,0,0 +no_defs <> +# Bissau +<4165> +proj=longlat +ellps=intl +towgs84=-173,253,27,0,0,0,0 +no_defs <> +# Korean 1995 +<4166> +proj=longlat +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# NZGD2000 +<4167> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# Accra +<4168> +proj=longlat +a=6378300 +b=6356751.689189189 +towgs84=-199,32,322,0,0,0,0 +no_defs <> +# American Samoa 1962 +<4169> +proj=longlat +ellps=clrk66 +towgs84=-115,118,426,0,0,0,0 +no_defs <> +# SIRGAS +<4170> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# RGF93 +<4171> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# POSGAR +<4172> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# IRENET95 +<4173> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# Sierra Leone 1924 +<4174> +proj=longlat +a=6378300 +b=6356751.689189189 +no_defs <> +# Sierra Leone 1968 +<4175> +proj=longlat +ellps=clrk80 +towgs84=-88,4,101,0,0,0,0 +no_defs <> +# Australian Antarctic +<4176> +proj=longlat +ellps=GRS80 +no_defs <> +# Pulkovo 1942(83) +<4178> +proj=longlat +ellps=krass +towgs84=24,-123,-94,0.02,-0.25,-0.13,1.1 +no_defs <> +# Pulkovo 1942(58) +<4179> +proj=longlat +ellps=krass +towgs84=33.4,-146.6,-76.3,-0.359,-0.053,0.844,-0.84 +no_defs <> +# EST97 +<4180> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# Luxembourg 1930 +<4181> +proj=longlat +ellps=intl +towgs84=-193,13.7,-39.3,-0.41,-2.933,2.688,0.43 +no_defs <> +# Azores Occidental 1939 +<4182> +proj=longlat +ellps=intl +no_defs <> +# Azores Central 1948 +<4183> +proj=longlat +ellps=intl +no_defs <> +# Azores Oriental 1940 +<4184> +proj=longlat +ellps=intl +no_defs <> +# Madeira 1936 +<4185> +proj=longlat +ellps=intl +no_defs <> +# OSNI 1952 +<4188> +proj=longlat +ellps=airy +no_defs <> +# REGVEN +<4189> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# POSGAR 98 +<4190> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# Albanian 1987 +<4191> +proj=longlat +ellps=krass +no_defs <> +# Douala 1948 +<4192> +proj=longlat +ellps=intl +no_defs <> +# Manoca 1962 +<4193> +proj=longlat +a=6378249.2 +b=6356515 +towgs84=-70.9,-151.8,-41.4,0,0,0,0 +no_defs <> +# Qornoq 1927 +<4194> +proj=longlat +ellps=intl +no_defs <> +# Scoresbysund 1952 +<4195> +proj=longlat +ellps=intl +towgs84=105,326,-102.5,0,0,0.814,-0.6 +no_defs <> +# Ammassalik 1958 +<4196> +proj=longlat +ellps=intl +towgs84=-45,417,-3.5,0,0,0.814,-0.6 +no_defs <> +# Garoua +<4197> +proj=longlat +ellps=clrk80 +no_defs <> +# Kousseri +<4198> +proj=longlat +ellps=clrk80 +no_defs <> +# Egypt 1930 +<4199> +proj=longlat +ellps=intl +no_defs <> +# Pulkovo 1995 +<4200> +proj=longlat +ellps=krass +no_defs <> +# Adindan +<4201> +proj=longlat +ellps=clrk80 +no_defs <> +# AGD66 +<4202> +proj=longlat +ellps=aust_SA +no_defs <> +# AGD84 +<4203> +proj=longlat +ellps=aust_SA +no_defs <> +# Ain el Abd +<4204> +proj=longlat +ellps=intl +no_defs <> +# Afgooye +<4205> +proj=longlat +ellps=krass +towgs84=-43,-163,45,0,0,0,0 +no_defs <> +# Agadez +<4206> +proj=longlat +a=6378249.2 +b=6356515 +no_defs <> +# Lisbon +<4207> +proj=longlat +ellps=intl +no_defs <> +# Aratu +<4208> +proj=longlat +ellps=intl +no_defs <> +# Arc 1950 +<4209> +proj=longlat +a=6378249.145 +b=6356514.966398753 +no_defs <> +# Arc 1960 +<4210> +proj=longlat +ellps=clrk80 +no_defs <> +# Batavia +<4211> +proj=longlat +ellps=bessel +no_defs <> +# Barbados 1938 +<4212> +proj=longlat +ellps=clrk80 +no_defs <> +# Beduaram +<4213> +proj=longlat +a=6378249.2 +b=6356515 +no_defs <> +# Beijing 1954 +<4214> +proj=longlat +ellps=krass +no_defs <> +# Belge 1950 +<4215> +proj=longlat +ellps=intl +no_defs <> +# Bermuda 1957 +<4216> +proj=longlat +ellps=clrk66 +towgs84=-73,213,296,0,0,0,0 +no_defs <> +# Bogota 1975 +<4218> +proj=longlat +ellps=intl +no_defs <> +# Bukit Rimpah +<4219> +proj=longlat +ellps=bessel +towgs84=-384,664,-48,0,0,0,0 +no_defs <> +# Camacupa +<4220> +proj=longlat +ellps=clrk80 +no_defs <> +# Campo Inchauspe +<4221> +proj=longlat +ellps=intl +no_defs <> +# Cape +<4222> +proj=longlat +a=6378249.145 +b=6356514.966398753 +no_defs <> +# Carthage +<4223> +proj=longlat +a=6378249.2 +b=6356515 +no_defs <> +# Chua +<4224> +proj=longlat +ellps=intl +towgs84=-134,229,-29,0,0,0,0 +no_defs <> +# Corrego Alegre +<4225> +proj=longlat +ellps=intl +towgs84=-206,172,-6,0,0,0,0 +no_defs <> +# Cote d'Ivoire +<4226> +proj=longlat +a=6378249.2 +b=6356515 +no_defs <> +# Deir ez Zor +<4227> +proj=longlat +a=6378249.2 +b=6356515 +no_defs <> +# Douala +<4228> +proj=longlat +a=6378249.2 +b=6356515 +no_defs <> +# Egypt 1907 +<4229> +proj=longlat +ellps=helmert +no_defs <> +# ED50 +<4230> +proj=longlat +ellps=intl +no_defs <> +# ED87 +<4231> +proj=longlat +ellps=intl +towgs84=-82.981,-99.719,-110.709,-0.5076,0.1503,0.3898,-0.3143 +no_defs <> +# Fahud +<4232> +proj=longlat +ellps=clrk80 +no_defs <> +# Gandajika 1970 +<4233> +proj=longlat +ellps=intl +no_defs <> +# Garoua +<4234> +proj=longlat +a=6378249.2 +b=6356515 +no_defs <> +# Guyane Francaise +<4235> +proj=longlat +ellps=intl +no_defs <> +# Hu Tzu Shan +<4236> +proj=longlat +ellps=intl +towgs84=-637,-549,-203,0,0,0,0 +no_defs <> +# HD72 +<4237> +proj=longlat +ellps=GRS67 +no_defs <> +# ID74 +<4238> +proj=longlat +a=6378160 +b=6356774.50408554 +no_defs <> +# Indian 1954 +<4239> +proj=longlat +a=6377276.345 +b=6356075.413140239 +towgs84=217,823,299,0,0,0,0 +no_defs <> +# Indian 1975 +<4240> +proj=longlat +a=6377276.345 +b=6356075.413140239 +no_defs <> +# Jamaica 1875 +<4241> +proj=longlat +ellps=clrk80 +no_defs <> +# JAD69 +<4242> +proj=longlat +ellps=clrk66 +no_defs <> +# Kalianpur 1880 +<4243> +proj=longlat +a=6377299.36559538 +b=6356098.357204817 +no_defs <> +# Kandawala +<4244> +proj=longlat +a=6377276.345 +b=6356075.413140239 +towgs84=-97,787,86,0,0,0,0 +no_defs <> +# Kertau +<4245> +proj=longlat +a=6377304.063 +b=6356103.038993155 +towgs84=-11,851,5,0,0,0,0 +no_defs <> +# KOC +<4246> +proj=longlat +ellps=clrk80 +no_defs <> +# La Canoa +<4247> +proj=longlat +ellps=intl +towgs84=-273.5,110.6,-357.9,0,0,0,0 +no_defs <> +# PSAD56 +<4248> +proj=longlat +ellps=intl +no_defs <> +# Lake +<4249> +proj=longlat +ellps=intl +no_defs <> +# Leigon +<4250> +proj=longlat +ellps=clrk80 +towgs84=-130,29,364,0,0,0,0 +no_defs <> +# Liberia 1964 +<4251> +proj=longlat +ellps=clrk80 +towgs84=-90,40,88,0,0,0,0 +no_defs <> +# Lome +<4252> +proj=longlat +a=6378249.2 +b=6356515 +no_defs <> +# Luzon 1911 +<4253> +proj=longlat +ellps=clrk66 +no_defs <> +# Hito XVIII 1963 +<4254> +proj=longlat +ellps=intl +towgs84=18.38,192.45,96.82,0.056,-0.142,-0.2,-0.0013 +no_defs <> +# Herat North +<4255> +proj=longlat +ellps=intl +towgs84=-333,-222,114,0,0,0,0 +no_defs <> +# Mahe 1971 +<4256> +proj=longlat +ellps=clrk80 +towgs84=41,-220,-134,0,0,0,0 +no_defs <> +# Makassar +<4257> +proj=longlat +ellps=bessel +towgs84=-587.8,519.75,145.76,0,0,0,0 +no_defs <> +# ETRS89 +<4258> +proj=longlat +ellps=GRS80 +no_defs <> +# Malongo 1987 +<4259> +proj=longlat +ellps=intl +no_defs <> +# Manoca +<4260> +proj=longlat +ellps=clrk80 +towgs84=-70.9,-151.8,-41.4,0,0,0,0 +no_defs <> +# Merchich +<4261> +proj=longlat +a=6378249.2 +b=6356515 +towgs84=31,146,47,0,0,0,0 +no_defs <> +# Massawa +<4262> +proj=longlat +ellps=bessel +towgs84=639,405,60,0,0,0,0 +no_defs <> +# Minna +<4263> +proj=longlat +ellps=clrk80 +no_defs <> +# Mhast +<4264> +proj=longlat +ellps=intl +towgs84=-252.95,-4.11,-96.38,0,0,0,0 +no_defs <> +# Monte Mario +<4265> +proj=longlat +ellps=intl +no_defs <> +# M'poraloko +<4266> +proj=longlat +a=6378249.2 +b=6356515 +no_defs <> +# NAD27 +<4267> +proj=longlat +ellps=clrk66 +datum=NAD27 +no_defs <> +# NAD27 Michigan +<4268> +proj=longlat +a=6378450.047548896 +b=6356826.621488444 +no_defs <> +# NAD83 +<4269> +proj=longlat +ellps=GRS80 +datum=NAD83 +no_defs <> +# Nahrwan 1967 +<4270> +proj=longlat +ellps=clrk80 +no_defs <> +# Naparima 1972 +<4271> +proj=longlat +ellps=intl +no_defs <> +# NZGD49 +<4272> +proj=longlat +ellps=intl +no_defs <> +# NGO 1948 +<4273> +proj=longlat +a=6377492.018 +b=6356173.508712696 +towgs84=278.3,93,474.5,7.889,0.05,-6.61,6.21 +no_defs <> +# Datum 73 +<4274> +proj=longlat +ellps=intl +no_defs <> +# NTF +<4275> +proj=longlat +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +no_defs <> +# NSWC 9Z-2 +<4276> +proj=longlat +ellps=WGS66 +no_defs <> +# OSGB 1936 +<4277> +proj=longlat +ellps=airy +no_defs <> +# OSGB70 +<4278> +proj=longlat +ellps=airy +no_defs <> +# OS(SN)80 +<4279> +proj=longlat +ellps=airy +no_defs <> +# Padang +<4280> +proj=longlat +ellps=bessel +no_defs <> +# Palestine 1923 +<4281> +proj=longlat +a=6378300.789 +b=6356566.435 +no_defs <> +# Pointe Noire +<4282> +proj=longlat +a=6378249.2 +b=6356515 +no_defs <> +# GDA94 +<4283> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# Pulkovo 1942 +<4284> +proj=longlat +ellps=krass +no_defs <> +# Qatar 1974 +<4285> +proj=longlat +ellps=intl +no_defs <> +# Qatar 1948 +<4286> +proj=longlat +ellps=helmert +no_defs <> +# Qornoq +<4287> +proj=longlat +ellps=intl +towgs84=164,138,-189,0,0,0,0 +no_defs <> +# Loma Quintana +<4288> +proj=longlat +ellps=intl +no_defs <> +# Amersfoort +<4289> +proj=longlat +ellps=bessel +no_defs <> +# SAD69 +<4291> +proj=longlat +ellps=GRS67 +no_defs <> +# Sapper Hill 1943 +<4292> +proj=longlat +ellps=intl +towgs84=-355,21,72,0,0,0,0 +no_defs <> +# Schwarzeck +<4293> +proj=longlat +ellps=bess_nam +no_defs <> +# Segora +<4294> +proj=longlat +ellps=bessel +no_defs <> +# Serindung +<4295> +proj=longlat +ellps=bessel +no_defs <> +# Sudan +<4296> +proj=longlat +a=6378249.2 +b=6356515 +no_defs <> +# Tananarive +<4297> +proj=longlat +ellps=intl +towgs84=-189,-242,-91,0,0,0,0 +no_defs <> +# Timbalai 1948 +<4298> +proj=longlat +ellps=evrstSS +no_defs <> +# TM65 +<4299> +proj=longlat +a=6377340.189 +b=6356034.447938534 +no_defs <> +# TM75 +<4300> +proj=longlat +a=6377340.189 +b=6356034.447938534 +no_defs <> +# Tokyo +<4301> +proj=longlat +ellps=bessel +no_defs <> +# Trinidad 1903 +<4302> +proj=longlat +a=6378293.63683822 +b=6356617.979337744 +towgs84=-61.702,284.488,472.052,0,0,0,0 +no_defs <> +# TC(1948) +<4303> +proj=longlat +ellps=helmert +no_defs <> +# Voirol 1875 +<4304> +proj=longlat +a=6378249.2 +b=6356515 +towgs84=-73,-247,227,0,0,0,0 +no_defs <> +# Bern 1938 +<4306> +proj=longlat +ellps=bessel +no_defs <> +# Nord Sahara 1959 +<4307> +proj=longlat +ellps=clrk80 +no_defs <> +# RT38 +<4308> +proj=longlat +ellps=bessel +no_defs <> +# Yacare +<4309> +proj=longlat +ellps=intl +towgs84=-155,171,37,0,0,0,0 +no_defs <> +# Yoff +<4310> +proj=longlat +a=6378249.2 +b=6356515 +no_defs <> +# Zanderij +<4311> +proj=longlat +ellps=intl +towgs84=-265,120,-358,0,0,0,0 +no_defs <> +# MGI +<4312> +proj=longlat +ellps=bessel +no_defs <> +# Belge 1972 +<4313> +proj=longlat +ellps=intl +no_defs <> +# DHDN +<4314> +proj=longlat +ellps=bessel +no_defs <> +# Conakry 1905 +<4315> +proj=longlat +a=6378249.2 +b=6356515 +towgs84=-23,259,-9,0,0,0,0 +no_defs <> +# Dealul Piscului 1933 +<4316> +proj=longlat +ellps=intl +towgs84=103.25,-100.4,-307.19,0,0,0,0 +no_defs <> +# Dealul Piscului 1970 +<4317> +proj=longlat +ellps=krass +no_defs <> +# NGN +<4318> +proj=longlat +ellps=WGS84 +no_defs <> +# KUDAMS +<4319> +proj=longlat +ellps=GRS80 +no_defs <> +# WGS 72 +<4322> +proj=longlat +ellps=WGS72 +no_defs <> +# WGS 72BE +<4324> +proj=longlat +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +no_defs <> +# WGS 84 +<4326> +proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs <> +# Anguilla 1957 +<4600> +proj=longlat +ellps=clrk80 +no_defs <> +# Antigua 1943 +<4601> +proj=longlat +ellps=clrk80 +towgs84=-255,-15,71,0,0,0,0 +no_defs <> +# Dominica 1945 +<4602> +proj=longlat +ellps=clrk80 +towgs84=725,685,536,0,0,0,0 +no_defs <> +# Grenada 1953 +<4603> +proj=longlat +ellps=clrk80 +towgs84=72,213.7,93,0,0,0,0 +no_defs <> +# Montserrat 1958 +<4604> +proj=longlat +ellps=clrk80 +towgs84=174,359,365,0,0,0,0 +no_defs <> +# St. Kitts 1955 +<4605> +proj=longlat +ellps=clrk80 +towgs84=9,183,236,0,0,0,0 +no_defs <> +# St. Lucia 1955 +<4606> +proj=longlat +ellps=clrk80 +towgs84=-149,128,296,0,0,0,0 +no_defs <> +# St. Vincent 1945 +<4607> +proj=longlat +ellps=clrk80 +no_defs <> +# NAD27(76) +<4608> +proj=longlat +ellps=clrk66 +no_defs <> +# NAD27(CGQ77) +<4609> +proj=longlat +ellps=clrk66 +no_defs <> +# Xian 1980 +<4610> +proj=longlat +a=6378140 +b=6356755.288157528 +no_defs <> +# Hong Kong 1980 +<4611> +proj=longlat +ellps=intl +towgs84=-162.619,-276.959,-161.764,0.067753,-2.24365,-1.15883,-1.09425 +no_defs <> +# JGD2000 +<4612> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# Segara +<4613> +proj=longlat +ellps=bessel +towgs84=-404.78,685.68,45.47,0,0,0,0 +no_defs <> +# QND95 +<4614> +proj=longlat +ellps=intl +towgs84=-119.425,-303.659,-11.0006,1.1643,0.174458,1.09626,3.65706 +no_defs <> +# Porto Santo +<4615> +proj=longlat +ellps=intl +no_defs <> +# Selvagem Grande +<4616> +proj=longlat +ellps=intl +no_defs <> +# NAD83(CSRS) +<4617> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> +# Bern 1898 (Bern) +<4801> +proj=longlat +ellps=bessel +pm=bern +no_defs <> +# Bogota 1975 (Bogota) +<4802> +proj=longlat +ellps=intl +pm=bogota +no_defs <> +# Lisbon (Lisbon) +<4803> +proj=longlat +ellps=intl +pm=lisbon +no_defs <> +# Makassar (Jakarta) +<4804> +proj=longlat +ellps=bessel +towgs84=-587.8,519.75,145.76,0,0,0,0 +pm=jakarta +no_defs <> +# MGI (Ferro) +<4805> +proj=longlat +ellps=bessel +pm=ferro +no_defs <> +# Monte Mario (Rome) +<4806> +proj=longlat +ellps=intl +pm=rome +no_defs <> +# NTF (Paris) +<4807> +proj=longlat +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +no_defs <> +# Padang (Jakarta) +<4808> +proj=longlat +ellps=bessel +pm=jakarta +no_defs <> +# Belge 1950 (Brussels) +<4809> +proj=longlat +ellps=intl +pm=brussels +no_defs <> +# Tananarive (Paris) +<4810> +proj=longlat +ellps=intl +towgs84=-189,-242,-91,0,0,0,0 +pm=paris +no_defs <> +# Voirol 1875 (Paris) +<4811> +proj=longlat +a=6378249.2 +b=6356515 +towgs84=-73,-247,227,0,0,0,0 +pm=paris +no_defs <> +# Batavia (Jakarta) +<4813> +proj=longlat +ellps=bessel +pm=jakarta +no_defs <> +# RT38 (Stockholm) +<4814> +proj=longlat +ellps=bessel +pm=stockholm +no_defs <> +# Greek (Athens) +<4815> +proj=longlat +ellps=bessel +pm=athens +no_defs <> +# Carthage (Paris) +<4816> +proj=longlat +a=6378249.2 +b=6356515 +pm=paris +no_defs <> +# NGO 1948 (Oslo) +<4817> +proj=longlat +a=6377492.018 +b=6356173.508712696 +towgs84=278.3,93,474.5,7.889,0.05,-6.61,6.21 +pm=oslo +no_defs <> +# S-JTSK (Ferro) +<4818> +proj=longlat +ellps=bessel +pm=ferro +no_defs <> +# Nord Sahara 1959 (Paris) +<4819> +proj=longlat +ellps=clrk80 +pm=paris +no_defs <> +# Segara (Jakarta) +<4820> +proj=longlat +ellps=bessel +pm=jakarta +no_defs <> +# ATF (Paris) +<4901> +proj=longlat +a=6376523 +b=6355862.933255573 +pm=paris +no_defs <> +# NDG (Paris) +<4902> +proj=longlat +a=6376523 +b=6355862.933255573 +pm=paris +no_defs <> +# Madrid 1870 (Madrid) +<4903> +proj=longlat +a=6378298.3 +b=6356657.142669562 +pm=madrid +no_defs <> +# Lisbon 1890 (Lisbon) +<4904> +proj=longlat +ellps=bessel +pm=lisbon +no_defs <> +# Pulkovo 1995 / Gauss-Kruger zone 4 +<20004> +proj=tmerc +lat_0=0 +lon_0=21 +k=1.000000 +x_0=4500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger zone 5 +<20005> +proj=tmerc +lat_0=0 +lon_0=27 +k=1.000000 +x_0=5500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger zone 6 +<20006> +proj=tmerc +lat_0=0 +lon_0=33 +k=1.000000 +x_0=6500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger zone 7 +<20007> +proj=tmerc +lat_0=0 +lon_0=39 +k=1.000000 +x_0=7500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger zone 8 +<20008> +proj=tmerc +lat_0=0 +lon_0=45 +k=1.000000 +x_0=8500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger zone 9 +<20009> +proj=tmerc +lat_0=0 +lon_0=51 +k=1.000000 +x_0=9500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger zone 10 +<20010> +proj=tmerc +lat_0=0 +lon_0=57 +k=1.000000 +x_0=10500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger zone 11 +<20011> +proj=tmerc +lat_0=0 +lon_0=63 +k=1.000000 +x_0=11500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger zone 12 +<20012> +proj=tmerc +lat_0=0 +lon_0=69 +k=1.000000 +x_0=12500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger zone 13 +<20013> +proj=tmerc +lat_0=0 +lon_0=75 +k=1.000000 +x_0=13500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger zone 14 +<20014> +proj=tmerc +lat_0=0 +lon_0=81 +k=1.000000 +x_0=14500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger zone 15 +<20015> +proj=tmerc +lat_0=0 +lon_0=87 +k=1.000000 +x_0=15500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger zone 16 +<20016> +proj=tmerc +lat_0=0 +lon_0=93 +k=1.000000 +x_0=16500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger zone 17 +<20017> +proj=tmerc +lat_0=0 +lon_0=99 +k=1.000000 +x_0=17500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger zone 18 +<20018> +proj=tmerc +lat_0=0 +lon_0=105 +k=1.000000 +x_0=18500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger zone 19 +<20019> +proj=tmerc +lat_0=0 +lon_0=111 +k=1.000000 +x_0=19500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger zone 20 +<20020> +proj=tmerc +lat_0=0 +lon_0=117 +k=1.000000 +x_0=20500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger zone 21 +<20021> +proj=tmerc +lat_0=0 +lon_0=123 +k=1.000000 +x_0=21500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger zone 22 +<20022> +proj=tmerc +lat_0=0 +lon_0=129 +k=1.000000 +x_0=22500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger zone 23 +<20023> +proj=tmerc +lat_0=0 +lon_0=135 +k=1.000000 +x_0=23500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger zone 24 +<20024> +proj=tmerc +lat_0=0 +lon_0=141 +k=1.000000 +x_0=24500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger zone 25 +<20025> +proj=tmerc +lat_0=0 +lon_0=147 +k=1.000000 +x_0=25500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger zone 26 +<20026> +proj=tmerc +lat_0=0 +lon_0=153 +k=1.000000 +x_0=26500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger zone 27 +<20027> +proj=tmerc +lat_0=0 +lon_0=159 +k=1.000000 +x_0=27500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger zone 28 +<20028> +proj=tmerc +lat_0=0 +lon_0=165 +k=1.000000 +x_0=28500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger zone 29 +<20029> +proj=tmerc +lat_0=0 +lon_0=171 +k=1.000000 +x_0=29500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger zone 30 +<20030> +proj=tmerc +lat_0=0 +lon_0=177 +k=1.000000 +x_0=30500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger zone 31 +<20031> +proj=tmerc +lat_0=0 +lon_0=-177 +k=1.000000 +x_0=31500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger zone 32 +<20032> +proj=tmerc +lat_0=0 +lon_0=-171 +k=1.000000 +x_0=32500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger 4N +<20064> +proj=tmerc +lat_0=0 +lon_0=21 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger 5N +<20065> +proj=tmerc +lat_0=0 +lon_0=27 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger 6N +<20066> +proj=tmerc +lat_0=0 +lon_0=33 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger 7N +<20067> +proj=tmerc +lat_0=0 +lon_0=39 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger 8N +<20068> +proj=tmerc +lat_0=0 +lon_0=45 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger 9N +<20069> +proj=tmerc +lat_0=0 +lon_0=51 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger 10N +<20070> +proj=tmerc +lat_0=0 +lon_0=57 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger 11N +<20071> +proj=tmerc +lat_0=0 +lon_0=63 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger 12N +<20072> +proj=tmerc +lat_0=0 +lon_0=69 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger 13N +<20073> +proj=tmerc +lat_0=0 +lon_0=75 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger 14N +<20074> +proj=tmerc +lat_0=0 +lon_0=81 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger 15N +<20075> +proj=tmerc +lat_0=0 +lon_0=87 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger 16N +<20076> +proj=tmerc +lat_0=0 +lon_0=93 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger 17N +<20077> +proj=tmerc +lat_0=0 +lon_0=99 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger 18N +<20078> +proj=tmerc +lat_0=0 +lon_0=105 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger 19N +<20079> +proj=tmerc +lat_0=0 +lon_0=111 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger 20N +<20080> +proj=tmerc +lat_0=0 +lon_0=117 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger 21N +<20081> +proj=tmerc +lat_0=0 +lon_0=123 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger 22N +<20082> +proj=tmerc +lat_0=0 +lon_0=129 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger 23N +<20083> +proj=tmerc +lat_0=0 +lon_0=135 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger 24N +<20084> +proj=tmerc +lat_0=0 +lon_0=141 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger 25N +<20085> +proj=tmerc +lat_0=0 +lon_0=147 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger 26N +<20086> +proj=tmerc +lat_0=0 +lon_0=153 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger 27N +<20087> +proj=tmerc +lat_0=0 +lon_0=159 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger 28N +<20088> +proj=tmerc +lat_0=0 +lon_0=165 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger 29N +<20089> +proj=tmerc +lat_0=0 +lon_0=171 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger 30N +<20090> +proj=tmerc +lat_0=0 +lon_0=177 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger 31N +<20091> +proj=tmerc +lat_0=0 +lon_0=-177 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 / Gauss-Kruger 32N +<20092> +proj=tmerc +lat_0=0 +lon_0=-171 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Adindan / UTM zone 37N +<20137> +proj=utm +zone=37 +ellps=clrk80 +units=m +no_defs <> +# Adindan / UTM zone 38N +<20138> +proj=utm +zone=38 +ellps=clrk80 +units=m +no_defs <> +# AGD66 / AMG zone 48 +<20248> +proj=utm +zone=48 +south +ellps=aust_SA +units=m +no_defs <> +# AGD66 / AMG zone 49 +<20249> +proj=utm +zone=49 +south +ellps=aust_SA +units=m +no_defs <> +# AGD66 / AMG zone 50 +<20250> +proj=utm +zone=50 +south +ellps=aust_SA +units=m +no_defs <> +# AGD66 / AMG zone 51 +<20251> +proj=utm +zone=51 +south +ellps=aust_SA +units=m +no_defs <> +# AGD66 / AMG zone 52 +<20252> +proj=utm +zone=52 +south +ellps=aust_SA +units=m +no_defs <> +# AGD66 / AMG zone 53 +<20253> +proj=utm +zone=53 +south +ellps=aust_SA +units=m +no_defs <> +# AGD66 / AMG zone 54 +<20254> +proj=utm +zone=54 +south +ellps=aust_SA +units=m +no_defs <> +# AGD66 / AMG zone 55 +<20255> +proj=utm +zone=55 +south +ellps=aust_SA +units=m +no_defs <> +# AGD66 / AMG zone 56 +<20256> +proj=utm +zone=56 +south +ellps=aust_SA +units=m +no_defs <> +# AGD66 / AMG zone 57 +<20257> +proj=utm +zone=57 +south +ellps=aust_SA +units=m +no_defs <> +# AGD66 / AMG zone 58 +<20258> +proj=utm +zone=58 +south +ellps=aust_SA +units=m +no_defs <> +# AGD84 / AMG zone 48 +<20348> +proj=utm +zone=48 +south +ellps=aust_SA +units=m +no_defs <> +# AGD84 / AMG zone 49 +<20349> +proj=utm +zone=49 +south +ellps=aust_SA +units=m +no_defs <> +# AGD84 / AMG zone 50 +<20350> +proj=utm +zone=50 +south +ellps=aust_SA +units=m +no_defs <> +# AGD84 / AMG zone 51 +<20351> +proj=utm +zone=51 +south +ellps=aust_SA +units=m +no_defs <> +# AGD84 / AMG zone 52 +<20352> +proj=utm +zone=52 +south +ellps=aust_SA +units=m +no_defs <> +# AGD84 / AMG zone 53 +<20353> +proj=utm +zone=53 +south +ellps=aust_SA +units=m +no_defs <> +# AGD84 / AMG zone 54 +<20354> +proj=utm +zone=54 +south +ellps=aust_SA +units=m +no_defs <> +# AGD84 / AMG zone 55 +<20355> +proj=utm +zone=55 +south +ellps=aust_SA +units=m +no_defs <> +# AGD84 / AMG zone 56 +<20356> +proj=utm +zone=56 +south +ellps=aust_SA +units=m +no_defs <> +# AGD84 / AMG zone 57 +<20357> +proj=utm +zone=57 +south +ellps=aust_SA +units=m +no_defs <> +# AGD84 / AMG zone 58 +<20358> +proj=utm +zone=58 +south +ellps=aust_SA +units=m +no_defs <> +# Ain el Abd / UTM zone 37N +<20437> +proj=utm +zone=37 +ellps=intl +units=m +no_defs <> +# Ain el Abd / UTM zone 38N +<20438> +proj=utm +zone=38 +ellps=intl +units=m +no_defs <> +# Ain el Abd / UTM zone 39N +<20439> +proj=utm +zone=39 +ellps=intl +units=m +no_defs <> +# Ain el Abd / Bahrain Grid +<20499> +proj=utm +zone=39 +ellps=intl +units=m +no_defs <> +# Afgooye / UTM zone 38N +<20538> +proj=utm +zone=38 +ellps=krass +towgs84=-43,-163,45,0,0,0,0 +units=m +no_defs <> +# Afgooye / UTM zone 39N +<20539> +proj=utm +zone=39 +ellps=krass +towgs84=-43,-163,45,0,0,0,0 +units=m +no_defs <> +# Lisbon (Lisbon)/Portuguese National Grid +<20790> +proj=tmerc +lat_0=39.66666666666666 +lon_0=-8.131906111111112 +k=1.000000 +x_0=200000 +y_0=300000 +ellps=intl +pm=lisbon +units=m +no_defs <> +# Lisbon (Lisbon)/Portuguese Grid +<20791> +proj=tmerc +lat_0=39.66666666666666 +lon_0=-8.131906111111112 +k=1.000000 +x_0=0 +y_0=0 +ellps=intl +pm=lisbon +units=m +no_defs <> +# Aratu / UTM zone 22S +<20822> +proj=utm +zone=22 +south +ellps=intl +units=m +no_defs <> +# Aratu / UTM zone 23S +<20823> +proj=utm +zone=23 +south +ellps=intl +units=m +no_defs <> +# Aratu / UTM zone 24S +<20824> +proj=utm +zone=24 +south +ellps=intl +units=m +no_defs <> +# Arc 1950 / UTM zone 34S +<20934> +proj=utm +zone=34 +south +a=6378249.145 +b=6356514.966398753 +units=m +no_defs <> +# Arc 1950 / UTM zone 35S +<20935> +proj=utm +zone=35 +south +a=6378249.145 +b=6356514.966398753 +units=m +no_defs <> +# Arc 1950 / UTM zone 36S +<20936> +proj=utm +zone=36 +south +a=6378249.145 +b=6356514.966398753 +units=m +no_defs <> +# Arc 1960 / UTM zone 35S +<21035> +proj=utm +zone=35 +south +ellps=clrk80 +units=m +no_defs <> +# Arc 1960 / UTM zone 36S +<21036> +proj=utm +zone=36 +south +ellps=clrk80 +units=m +no_defs <> +# Arc 1960 / UTM zone 37S +<21037> +proj=utm +zone=37 +south +ellps=clrk80 +units=m +no_defs <> +# Arc 1960 / UTM zone 35N +<21095> +proj=utm +zone=35 +ellps=clrk80 +units=m +no_defs <> +# Arc 1960 / UTM zone 36N +<21096> +proj=utm +zone=36 +ellps=clrk80 +units=m +no_defs <> +# Arc 1960 / UTM zone 37N +<21097> +proj=utm +zone=37 +ellps=clrk80 +units=m +no_defs <> +# Batavia (Jakarta) / NEIEZ +<21100> +proj=merc +lat_ts=0 +lon_0=216.8077194444444 +k=0.997000 +x_0=3900000 +y_0=900000 +ellps=bessel +pm=jakarta +units=m +no_defs <> +# Batavia / UTM zone 48S +<21148> +proj=utm +zone=48 +south +ellps=bessel +units=m +no_defs <> +# Batavia / UTM zone 49S +<21149> +proj=utm +zone=49 +south +ellps=bessel +units=m +no_defs <> +# Batavia / UTM zone 50S +<21150> +proj=utm +zone=50 +south +ellps=bessel +units=m +no_defs <> +# Barbados 1938 / British West Indies Grid +<21291> +proj=tmerc +lat_0=0 +lon_0=-62 +k=0.999500 +x_0=400000 +y_0=0 +ellps=clrk80 +units=m +no_defs <> +# Barbados 1938 / Barbados National Grid +<21292> +proj=tmerc +lat_0=13.17638888888889 +lon_0=-59.55972222222222 +k=0.999999 +x_0=30000 +y_0=75000 +ellps=clrk80 +units=m +no_defs <> +# Beijing 1954 / Gauss-Kruger zone 13 +<21413> +proj=tmerc +lat_0=0 +lon_0=75 +k=1.000000 +x_0=13500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Beijing 1954 / Gauss-Kruger zone 14 +<21414> +proj=tmerc +lat_0=0 +lon_0=81 +k=1.000000 +x_0=14500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Beijing 1954 / Gauss-Kruger zone 15 +<21415> +proj=tmerc +lat_0=0 +lon_0=87 +k=1.000000 +x_0=15500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Beijing 1954 / Gauss-Kruger zone 16 +<21416> +proj=tmerc +lat_0=0 +lon_0=93 +k=1.000000 +x_0=16500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Beijing 1954 / Gauss-Kruger zone 17 +<21417> +proj=tmerc +lat_0=0 +lon_0=99 +k=1.000000 +x_0=17500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Beijing 1954 / Gauss-Kruger zone 18 +<21418> +proj=tmerc +lat_0=0 +lon_0=105 +k=1.000000 +x_0=18500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Beijing 1954 / Gauss-Kruger zone 19 +<21419> +proj=tmerc +lat_0=0 +lon_0=111 +k=1.000000 +x_0=19500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Beijing 1954 / Gauss-Kruger zone 20 +<21420> +proj=tmerc +lat_0=0 +lon_0=117 +k=1.000000 +x_0=20500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Beijing 1954 / Gauss-Kruger zone 21 +<21421> +proj=tmerc +lat_0=0 +lon_0=123 +k=1.000000 +x_0=21500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Beijing 1954 / Gauss-Kruger zone 22 +<21422> +proj=tmerc +lat_0=0 +lon_0=129 +k=1.000000 +x_0=22500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Beijing 1954 / Gauss-Kruger zone 23 +<21423> +proj=tmerc +lat_0=0 +lon_0=135 +k=1.000000 +x_0=23500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Beijing 1954 / Gauss-Kruger CM 75E +<21453> +proj=tmerc +lat_0=0 +lon_0=75 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Beijing 1954 / Gauss-Kruger CM 81E +<21454> +proj=tmerc +lat_0=0 +lon_0=81 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Beijing 1954 / Gauss-Kruger CM 87E +<21455> +proj=tmerc +lat_0=0 +lon_0=87 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Beijing 1954 / Gauss-Kruger CM 93E +<21456> +proj=tmerc +lat_0=0 +lon_0=93 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Beijing 1954 / Gauss-Kruger CM 99E +<21457> +proj=tmerc +lat_0=0 +lon_0=99 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Beijing 1954 / Gauss-Kruger CM 105E +<21458> +proj=tmerc +lat_0=0 +lon_0=105 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Beijing 1954 / Gauss-Kruger CM 111E +<21459> +proj=tmerc +lat_0=0 +lon_0=111 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Beijing 1954 / Gauss-Kruger CM 117E +<21460> +proj=tmerc +lat_0=0 +lon_0=117 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Beijing 1954 / Gauss-Kruger CM 123E +<21461> +proj=tmerc +lat_0=0 +lon_0=123 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Beijing 1954 / Gauss-Kruger CM 129E +<21462> +proj=tmerc +lat_0=0 +lon_0=129 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Beijing 1954 / Gauss-Kruger CM 135E +<21463> +proj=tmerc +lat_0=0 +lon_0=135 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Beijing 1954 / Gauss-Kruger 13N +<21473> +proj=tmerc +lat_0=0 +lon_0=75 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Beijing 1954 / Gauss-Kruger 14N +<21474> +proj=tmerc +lat_0=0 +lon_0=81 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Beijing 1954 / Gauss-Kruger 15N +<21475> +proj=tmerc +lat_0=0 +lon_0=87 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Beijing 1954 / Gauss-Kruger 16N +<21476> +proj=tmerc +lat_0=0 +lon_0=93 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Beijing 1954 / Gauss-Kruger 17N +<21477> +proj=tmerc +lat_0=0 +lon_0=99 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Beijing 1954 / Gauss-Kruger 18N +<21478> +proj=tmerc +lat_0=0 +lon_0=105 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Beijing 1954 / Gauss-Kruger 19N +<21479> +proj=tmerc +lat_0=0 +lon_0=111 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Beijing 1954 / Gauss-Kruger 20N +<21480> +proj=tmerc +lat_0=0 +lon_0=117 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Beijing 1954 / Gauss-Kruger 21N +<21481> +proj=tmerc +lat_0=0 +lon_0=123 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Beijing 1954 / Gauss-Kruger 22N +<21482> +proj=tmerc +lat_0=0 +lon_0=129 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Beijing 1954 / Gauss-Kruger 23N +<21483> +proj=tmerc +lat_0=0 +lon_0=135 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Belge 1950 (Brussels) / Belge Lambert 50 +<21500> +proj=lcc +lat_1=49.83333333333334 +lat_2=51.16666666666666 +lat_0=90 +lon_0=4.367975 +x_0=150000 +y_0=5400000 +ellps=intl +pm=brussels +units=m +no_defs <> +# Bern 1898 (Bern) / LV03C +<21780> +proj=omerc +lat_0=46.95240555555556 +lonc=7.439583333333333 +alpha=90 +k=1 +x_0=0 +y_0=0 +ellps=bessel +pm=bern +units=m +no_defs <> +# CH1903 / LV03 +<21781> +proj=omerc +lat_0=46.95240555555556 +lonc=7.439583333333333 +alpha=90 +k=1 +x_0=600000 +y_0=200000 +ellps=bessel +units=m +no_defs <> +# Bogota 1975 / UTM zone 17N +<21817> +proj=utm +zone=17 +ellps=intl +units=m +no_defs <> +# Bogota 1975 / UTM zone 18N +<21818> +proj=utm +zone=18 +ellps=intl +units=m +no_defs <> +# Bogota 1975 / Colombia West zone +<21891> +proj=tmerc +lat_0=4.599047222222222 +lon_0=-77.08091666666667 +k=1.000000 +x_0=1000000 +y_0=1000000 +ellps=intl +units=m +no_defs <> +# Bogota 1975 / Colombia Bogota zone +<21892> +proj=tmerc +lat_0=4.599047222222222 +lon_0=-74.08091666666667 +k=1.000000 +x_0=1000000 +y_0=1000000 +ellps=intl +units=m +no_defs <> +# Bogota 1975 / Colombia East Central zone +<21893> +proj=tmerc +lat_0=4.599047222222222 +lon_0=-71.08091666666667 +k=1.000000 +x_0=1000000 +y_0=1000000 +ellps=intl +units=m +no_defs <> +# Bogota 1975 / Colombia East +<21894> +proj=tmerc +lat_0=4.599047222222222 +lon_0=-68.08091666666667 +k=1.000000 +x_0=1000000 +y_0=1000000 +ellps=intl +units=m +no_defs <> +# Camacupa / UTM zone 32S +<22032> +proj=utm +zone=32 +south +ellps=clrk80 +units=m +no_defs <> +# Camacupa / UTM zone 33S +<22033> +proj=utm +zone=33 +south +ellps=clrk80 +units=m +no_defs <> +# Camacupa / TM 11.30 SE +<22091> +proj=tmerc +lat_0=0 +lon_0=11.5 +k=0.999600 +x_0=500000 +y_0=10000000 +ellps=clrk80 +units=m +no_defs <> +# Camacupa / TM 12 SE +<22092> +proj=tmerc +lat_0=0 +lon_0=12 +k=0.999600 +x_0=500000 +y_0=10000000 +ellps=clrk80 +units=m +no_defs <> +# Campo Inchauspe / Argentina 1 +<22191> +proj=tmerc +lat_0=-90 +lon_0=-72 +k=1.000000 +x_0=1500000 +y_0=0 +ellps=intl +units=m +no_defs <> +# Campo Inchauspe / Argentina 2 +<22192> +proj=tmerc +lat_0=-90 +lon_0=-69 +k=1.000000 +x_0=2500000 +y_0=0 +ellps=intl +units=m +no_defs <> +# Campo Inchauspe / Argentina 3 +<22193> +proj=tmerc +lat_0=-90 +lon_0=-66 +k=1.000000 +x_0=3500000 +y_0=0 +ellps=intl +units=m +no_defs <> +# Campo Inchauspe / Argentina 4 +<22194> +proj=tmerc +lat_0=-90 +lon_0=-63 +k=1.000000 +x_0=4500000 +y_0=0 +ellps=intl +units=m +no_defs <> +# Campo Inchauspe / Argentina 5 +<22195> +proj=tmerc +lat_0=-90 +lon_0=-60 +k=1.000000 +x_0=5500000 +y_0=0 +ellps=intl +units=m +no_defs <> +# Campo Inchauspe / Argentina 6 +<22196> +proj=tmerc +lat_0=-90 +lon_0=-57 +k=1.000000 +x_0=6500000 +y_0=0 +ellps=intl +units=m +no_defs <> +# Campo Inchauspe / Argentina 7 +<22197> +proj=tmerc +lat_0=-90 +lon_0=-54 +k=1.000000 +x_0=7500000 +y_0=0 +ellps=intl +units=m +no_defs <> +# Cape / UTM zone 34S +<22234> +proj=utm +zone=34 +south +a=6378249.145 +b=6356514.966398753 +units=m +no_defs <> +# Cape / UTM zone 35S +<22235> +proj=utm +zone=35 +south +a=6378249.145 +b=6356514.966398753 +units=m +no_defs <> +# Cape / UTM zone 36S +<22236> +proj=utm +zone=36 +south +a=6378249.145 +b=6356514.966398753 +units=m +no_defs <> +# South African Coordinate System zone 15 +# South African Coordinate System zone 17 +# South African Coordinate System zone 19 +# South African Coordinate System zone 21 +# South African Coordinate System zone 23 +# South African Coordinate System zone 25 +# South African Coordinate System zone 27 +# South African Coordinate System zone 29 +# South African Coordinate System zone 31 +# South African Coordinate System zone 33 +# Carthage (Paris) / Tunisia Mining Grid +# Carthage / UTM zone 32N +<22332> +proj=utm +zone=32 +a=6378249.2 +b=6356515 +units=m +no_defs <> +# Carthage / Nord Tunisie +<22391> +proj=lcc +lat_1=36 +lat_0=36 +lon_0=9.9 +k_0=0.999625544 +x_0=500000 +y_0=300000 +a=6378249.2 +b=6356515 +units=m +no_defs <> +# Carthage / Sud Tunisie +<22392> +proj=lcc +lat_1=33.3 +lat_0=33.3 +lon_0=9.9 +k_0=0.999625769 +x_0=500000 +y_0=300000 +a=6378249.2 +b=6356515 +units=m +no_defs <> +# Corrego Alegre / UTM zone 23S +<22523> +proj=utm +zone=23 +south +ellps=intl +towgs84=-206,172,-6,0,0,0,0 +units=m +no_defs <> +# Corrego Alegre / UTM zone 24S +<22524> +proj=utm +zone=24 +south +ellps=intl +towgs84=-206,172,-6,0,0,0,0 +units=m +no_defs <> +# Deir ez Zor / Levant Zone +<22700> +proj=lcc +lat_1=34.65 +lat_0=34.65 +lon_0=37.35 +k_0=0.9996256 +x_0=300000 +y_0=300000 +a=6378249.2 +b=6356515 +units=m +no_defs <> +# Deir ez Zor / Syria Lambert +<22770> +proj=lcc +lat_1=34.65 +lat_0=34.65 +lon_0=37.35 +k_0=0.9996256 +x_0=300000 +y_0=300000 +a=6378249.2 +b=6356515 +units=m +no_defs <> +# Deir ez Zor / Levant Stereographic +<22780> +proj=stere +lat_0=34.2 +lon_0=39.15 +k=0.999534 +x_0=0 +y_0=0 +a=6378249.2 +b=6356515 +units=m +no_defs <> +# Douala / UTM zone 32N +<22832> +proj=utm +zone=32 +a=6378249.2 +b=6356515 +units=m +no_defs <> +# Egypt 1907 / Blue Belt +<22991> +proj=tmerc +lat_0=30 +lon_0=35 +k=1.000000 +x_0=300000 +y_0=1100000 +ellps=helmert +units=m +no_defs <> +# Egypt 1907 / Red Belt +<22992> +proj=tmerc +lat_0=30 +lon_0=31 +k=1.000000 +x_0=615000 +y_0=810000 +ellps=helmert +units=m +no_defs <> +# Egypt 1907 / Purple Belt +<22993> +proj=tmerc +lat_0=30 +lon_0=27 +k=1.000000 +x_0=700000 +y_0=200000 +ellps=helmert +units=m +no_defs <> +# Egypt 1907 / Extended Purple Belt +<22994> +proj=tmerc +lat_0=30 +lon_0=27 +k=1.000000 +x_0=700000 +y_0=1200000 +ellps=helmert +units=m +no_defs <> +# ED50 / UTM zone 28N +<23028> +proj=utm +zone=28 +ellps=intl +units=m +no_defs <> +# ED50 / UTM zone 29N +<23029> +proj=utm +zone=29 +ellps=intl +units=m +no_defs <> +# ED50 / UTM zone 30N +<23030> +proj=utm +zone=30 +ellps=intl +units=m +no_defs <> +# ED50 / UTM zone 31N +<23031> +proj=utm +zone=31 +ellps=intl +units=m +no_defs <> +# ED50 / UTM zone 32N +<23032> +proj=utm +zone=32 +ellps=intl +units=m +no_defs <> +# ED50 / UTM zone 33N +<23033> +proj=utm +zone=33 +ellps=intl +units=m +no_defs <> +# ED50 / UTM zone 34N +<23034> +proj=utm +zone=34 +ellps=intl +units=m +no_defs <> +# ED50 / UTM zone 35N +<23035> +proj=utm +zone=35 +ellps=intl +units=m +no_defs <> +# ED50 / UTM zone 36N +<23036> +proj=utm +zone=36 +ellps=intl +units=m +no_defs <> +# ED50 / UTM zone 37N +<23037> +proj=utm +zone=37 +ellps=intl +units=m +no_defs <> +# ED50 / UTM zone 38N +<23038> +proj=utm +zone=38 +ellps=intl +units=m +no_defs <> +# ED50 / TM 0 N +<23090> +proj=tmerc +lat_0=0 +lon_0=0 +k=0.999600 +x_0=500000 +y_0=0 +ellps=intl +units=m +no_defs <> +# ED50 / TM 5 NE +<23095> +proj=tmerc +lat_0=0 +lon_0=5 +k=0.999600 +x_0=500000 +y_0=0 +ellps=intl +units=m +no_defs <> +# Fahud / UTM zone 39N +<23239> +proj=utm +zone=39 +ellps=clrk80 +units=m +no_defs <> +# Fahud / UTM zone 40N +<23240> +proj=utm +zone=40 +ellps=clrk80 +units=m +no_defs <> +# Garoua / UTM zone 33N +<23433> +proj=utm +zone=33 +a=6378249.2 +b=6356515 +units=m +no_defs <> +# HD72 / EOV +<23700> +proj=omerc +lat_0=47.14439372222222 +lonc=19.04857177777778 +alpha=90 +k=0.99993 +x_0=650000 +y_0=200000 +ellps=GRS67 +units=m +no_defs <> +# ID74 / UTM zone 46N +<23846> +proj=utm +zone=46 +a=6378160 +b=6356774.50408554 +units=m +no_defs <> +# ID74 / UTM zone 47N +<23847> +proj=utm +zone=47 +a=6378160 +b=6356774.50408554 +units=m +no_defs <> +# ID74 / UTM zone 48N +<23848> +proj=utm +zone=48 +a=6378160 +b=6356774.50408554 +units=m +no_defs <> +# ID74 / UTM zone 49N +<23849> +proj=utm +zone=49 +a=6378160 +b=6356774.50408554 +units=m +no_defs <> +# ID74 / UTM zone 50N +<23850> +proj=utm +zone=50 +a=6378160 +b=6356774.50408554 +units=m +no_defs <> +# ID74 / UTM zone 51N +<23851> +proj=utm +zone=51 +a=6378160 +b=6356774.50408554 +units=m +no_defs <> +# ID74 / UTM zone 52N +<23852> +proj=utm +zone=52 +a=6378160 +b=6356774.50408554 +units=m +no_defs <> +# ID74 / UTM zone 53N +<23853> +proj=utm +zone=53 +a=6378160 +b=6356774.50408554 +units=m +no_defs <> +# ID74 / UTM zone 46S +<23886> +proj=utm +zone=46 +south +a=6378160 +b=6356774.50408554 +units=m +no_defs <> +# ID74 / UTM zone 47S +<23887> +proj=utm +zone=47 +south +a=6378160 +b=6356774.50408554 +units=m +no_defs <> +# ID74 / UTM zone 48S +<23888> +proj=utm +zone=48 +south +a=6378160 +b=6356774.50408554 +units=m +no_defs <> +# ID74 / UTM zone 49S +<23889> +proj=utm +zone=49 +south +a=6378160 +b=6356774.50408554 +units=m +no_defs <> +# ID74 / UTM zone 50S +<23890> +proj=utm +zone=50 +south +a=6378160 +b=6356774.50408554 +units=m +no_defs <> +# ID74 / UTM zone 51S +<23891> +proj=utm +zone=51 +south +a=6378160 +b=6356774.50408554 +units=m +no_defs <> +# ID74 / UTM zone 52S +<23892> +proj=utm +zone=52 +south +a=6378160 +b=6356774.50408554 +units=m +no_defs <> +# ID74 / UTM zone 53S +<23893> +proj=utm +zone=53 +south +a=6378160 +b=6356774.50408554 +units=m +no_defs <> +# ID74 / UTM zone 54S +<23894> +proj=utm +zone=54 +south +a=6378160 +b=6356774.50408554 +units=m +no_defs <> +# Indian 1954 / UTM zone 46N +<23946> +proj=utm +zone=46 +a=6377276.345 +b=6356075.413140239 +towgs84=217,823,299,0,0,0,0 +units=m +no_defs <> +# Indian 1954 / UTM zone 47N +<23947> +proj=utm +zone=47 +a=6377276.345 +b=6356075.413140239 +towgs84=217,823,299,0,0,0,0 +units=m +no_defs <> +# Indian 1954 / UTM zone 48N +<23948> +proj=utm +zone=48 +a=6377276.345 +b=6356075.413140239 +towgs84=217,823,299,0,0,0,0 +units=m +no_defs <> +# Indian 1975 / UTM zone 47N +<24047> +proj=utm +zone=47 +a=6377276.345 +b=6356075.413140239 +units=m +no_defs <> +# Indian 1975 / UTM zone 48N +<24048> +proj=utm +zone=48 +a=6377276.345 +b=6356075.413140239 +units=m +no_defs <> +# Jamaica 1875 / Jamaica (Old Grid) +<24100> +proj=lcc +lat_1=18 +lat_0=18 +lon_0=-77 +k_0=1 +x_0=167638.49575 +y_0=121918.906 +ellps=clrk80 +to_meter=0.304797265 +no_defs <> +# JAD69 / Jamaica National Grid +<24200> +proj=lcc +lat_1=18 +lat_0=18 +lon_0=-77 +k_0=1 +x_0=250000 +y_0=150000 +ellps=clrk66 +units=m +no_defs <> +# Kalianpur 1937 / UTM zone 45N +<24305> +proj=utm +zone=45 +a=6377276.345 +b=6356075.413140239 +units=m +no_defs <> +# Kalianpur 1937 / UTM zone 46N +<24306> +proj=utm +zone=46 +a=6377276.345 +b=6356075.413140239 +units=m +no_defs <> +# Kalianpur 1962 / UTM zone 41N +<24311> +proj=utm +zone=41 +a=6377301.243 +b=6356100.230165385 +towgs84=283,682,231,0,0,0,0 +units=m +no_defs <> +# Kalianpur 1962 / UTM zone 42N +<24312> +proj=utm +zone=42 +a=6377301.243 +b=6356100.230165385 +towgs84=283,682,231,0,0,0,0 +units=m +no_defs <> +# Kalianpur 1962 / UTM zone 43N +<24313> +proj=utm +zone=43 +a=6377301.243 +b=6356100.230165385 +towgs84=283,682,231,0,0,0,0 +units=m +no_defs <> +# Kalianpur 1975 / UTM zone 42N +<24342> +proj=utm +zone=42 +a=6377299.151 +b=6356098.145120132 +towgs84=295,736,257,0,0,0,0 +units=m +no_defs <> +# Kalianpur 1975 / UTM zone 43N +<24343> +proj=utm +zone=43 +a=6377299.151 +b=6356098.145120132 +towgs84=295,736,257,0,0,0,0 +units=m +no_defs <> +# Kalianpur 1975 / UTM zone 44N +<24344> +proj=utm +zone=44 +a=6377299.151 +b=6356098.145120132 +towgs84=295,736,257,0,0,0,0 +units=m +no_defs <> +# Kalianpur 1975 / UTM zone 45N +<24345> +proj=utm +zone=45 +a=6377299.151 +b=6356098.145120132 +towgs84=295,736,257,0,0,0,0 +units=m +no_defs <> +# Kalianpur 1975 / UTM zone 46N +<24346> +proj=utm +zone=46 +a=6377299.151 +b=6356098.145120132 +towgs84=295,736,257,0,0,0,0 +units=m +no_defs <> +# Kalianpur 1975 / UTM zone 47N +<24347> +proj=utm +zone=47 +a=6377299.151 +b=6356098.145120132 +towgs84=295,736,257,0,0,0,0 +units=m +no_defs <> +# Kalianpur 1880 / India zone 0 +<24370> +proj=lcc +lat_1=39.5 +lat_0=39.5 +lon_0=68 +k_0=0.99846154 +x_0=2153865.73916853 +y_0=2368292.194628102 +a=6377299.36559538 +b=6356098.357204817 +to_meter=0.9143985307444408 +no_defs <> +# Kalianpur 1880 / India zone I +<24371> +proj=lcc +lat_1=32.5 +lat_0=32.5 +lon_0=68 +k_0=0.99878641 +x_0=2743195.592233322 +y_0=914398.5307444407 +a=6377299.36559538 +b=6356098.357204817 +to_meter=0.9143985307444408 +no_defs <> +# Kalianpur 1880 / India zone IIa +<24372> +proj=lcc +lat_1=26 +lat_0=26 +lon_0=74 +k_0=0.99878641 +x_0=2743195.592233322 +y_0=914398.5307444407 +a=6377299.36559538 +b=6356098.357204817 +to_meter=0.9143985307444408 +no_defs <> +# Kalianpur 1880 / India zone III +<24373> +proj=lcc +lat_1=19 +lat_0=19 +lon_0=80 +k_0=0.99878641 +x_0=2743195.592233322 +y_0=914398.5307444407 +a=6377299.36559538 +b=6356098.357204817 +to_meter=0.9143985307444408 +no_defs <> +# Kalianpur 1880 / India zone IV +<24374> +proj=lcc +lat_1=12 +lat_0=12 +lon_0=80 +k_0=0.99878641 +x_0=2743195.592233322 +y_0=914398.5307444407 +a=6377299.36559538 +b=6356098.357204817 +to_meter=0.9143985307444408 +no_defs <> +# Kalianpur 1937 / India zone IIb +<24375> +proj=lcc +lat_1=26 +lat_0=26 +lon_0=90 +k_0=0.99878641 +x_0=2743185.69 +y_0=914395.23 +a=6377276.345 +b=6356075.413140239 +units=m +no_defs <> +# Kalianpur 1962 / India zone I +<24376> +proj=lcc +lat_1=32.5 +lat_0=32.5 +lon_0=68 +k_0=0.99878641 +x_0=2743196.4 +y_0=914398.8 +a=6377301.243 +b=6356100.230165385 +towgs84=283,682,231,0,0,0,0 +units=m +no_defs <> +# Kalianpur 1962 / India zone IIa +<24377> +proj=lcc +lat_1=26 +lat_0=26 +lon_0=74 +k_0=0.99878641 +x_0=2743196.4 +y_0=914398.8 +a=6377301.243 +b=6356100.230165385 +towgs84=283,682,231,0,0,0,0 +units=m +no_defs <> +# Kalianpur 1975 / India zone I +<24378> +proj=lcc +lat_1=32.5 +lat_0=32.5 +lon_0=68 +k_0=0.99878641 +x_0=2743195.5 +y_0=914398.5 +a=6377299.151 +b=6356098.145120132 +towgs84=295,736,257,0,0,0,0 +units=m +no_defs <> +# Kalianpur 1975 / India zone IIa +<24379> +proj=lcc +lat_1=26 +lat_0=26 +lon_0=74 +k_0=0.99878641 +x_0=2743195.5 +y_0=914398.5 +a=6377299.151 +b=6356098.145120132 +towgs84=295,736,257,0,0,0,0 +units=m +no_defs <> +# Kalianpur 1975 / India zone IIb +<24380> +proj=lcc +lat_1=26 +lat_0=26 +lon_0=90 +k_0=0.99878641 +x_0=2743195.5 +y_0=914398.5 +a=6377299.151 +b=6356098.145120132 +towgs84=295,736,257,0,0,0,0 +units=m +no_defs <> +# Kalianpur 1975 / India zone III +<24381> +proj=lcc +lat_1=19 +lat_0=19 +lon_0=80 +k_0=0.99878641 +x_0=2743195.5 +y_0=914398.5 +a=6377299.151 +b=6356098.145120132 +towgs84=295,736,257,0,0,0,0 +units=m +no_defs <> +# Kalianpur 1880 / India zone IIb +<24382> +proj=lcc +lat_1=26 +lat_0=26 +lon_0=90 +k_0=0.99878641 +x_0=2743195.592233322 +y_0=914398.5307444407 +a=6377299.36559538 +b=6356098.357204817 +to_meter=0.9143985307444408 +no_defs <> +# Kalianpur 1975 / India zone IV +<24383> +proj=lcc +lat_1=12 +lat_0=12 +lon_0=80 +k_0=0.99878641 +x_0=2743195.5 +y_0=914398.5 +a=6377299.151 +b=6356098.145120132 +towgs84=295,736,257,0,0,0,0 +units=m +no_defs <> +# Kertau / Singapore Grid +<24500> +proj=cass +lat_0=1.287646666666667 +lon_0=103.8530022222222 +x_0=30000 +y_0=30000 +a=6377304.063 +b=6356103.038993155 +towgs84=-11,851,5,0,0,0,0 +units=m +no_defs <> +# Kertau / UTM zone 47N +<24547> +proj=utm +zone=47 +a=6377304.063 +b=6356103.038993155 +towgs84=-11,851,5,0,0,0,0 +units=m +no_defs <> +# Kertau / UTM zone 48N +<24548> +proj=utm +zone=48 +a=6377304.063 +b=6356103.038993155 +towgs84=-11,851,5,0,0,0,0 +units=m +no_defs <> +# Kertau / R.S.O. Malaya (ch) +<24571> +proj=omerc +lat_0=4 +lonc=102.25 +alpha=323.0257905 +k=0.99984 +x_0=804671.2997750348 +y_0=0 +a=6377304.063 +b=6356103.038993155 +towgs84=-11,851,5,0,0,0,0 +to_meter=20.11678249437587 +no_defs <> +# KOC Lambert +<24600> +proj=lcc +lat_1=32.5 +lat_0=32.5 +lon_0=45 +k_0=0.9987864078000001 +x_0=1500000 +y_0=1166200 +ellps=clrk80 +units=m +no_defs <> +# La Canoa / UTM zone 18N +<24718> +proj=utm +zone=18 +ellps=intl +towgs84=-273.5,110.6,-357.9,0,0,0,0 +units=m +no_defs <> +# La Canoa / UTM zone 19N +<24719> +proj=utm +zone=19 +ellps=intl +towgs84=-273.5,110.6,-357.9,0,0,0,0 +units=m +no_defs <> +# La Canoa / UTM zone 20N +<24720> +proj=utm +zone=20 +ellps=intl +towgs84=-273.5,110.6,-357.9,0,0,0,0 +units=m +no_defs <> +# PSAD56 / UTM zone 18N +<24818> +proj=utm +zone=18 +ellps=intl +units=m +no_defs <> +# PSAD56 / UTM zone 19N +<24819> +proj=utm +zone=19 +ellps=intl +units=m +no_defs <> +# PSAD56 / UTM zone 20N +<24820> +proj=utm +zone=20 +ellps=intl +units=m +no_defs <> +# PSAD56 / UTM zone 21N +<24821> +proj=utm +zone=21 +ellps=intl +units=m +no_defs <> +# PSAD56 / UTM zone 17S +<24877> +proj=utm +zone=17 +south +ellps=intl +units=m +no_defs <> +# PSAD56 / UTM zone 18S +<24878> +proj=utm +zone=18 +south +ellps=intl +units=m +no_defs <> +# PSAD56 / UTM zone 19S +<24879> +proj=utm +zone=19 +south +ellps=intl +units=m +no_defs <> +# PSAD56 / UTM zone 20S +<24880> +proj=utm +zone=20 +south +ellps=intl +units=m +no_defs <> +# PSAD56 / UTM zone 22S +<24882> +proj=utm +zone=22 +south +ellps=intl +units=m +no_defs <> +# PSAD56 / Peru west zone +<24891> +proj=tmerc +lat_0=-6 +lon_0=-80.5 +k=0.999830 +x_0=222000 +y_0=1426834.743 +ellps=intl +units=m +no_defs <> +# PSAD56 / Peru central zone +<24892> +proj=tmerc +lat_0=-9.5 +lon_0=-76 +k=0.999330 +x_0=720000 +y_0=1039979.159 +ellps=intl +units=m +no_defs <> +# PSAD56 / Peru east zone +<24893> +proj=tmerc +lat_0=-9.5 +lon_0=-70.5 +k=0.999530 +x_0=1324000 +y_0=1040084.558 +ellps=intl +units=m +no_defs <> +# Leigon / Ghana Metre Grid +<25000> +proj=tmerc +lat_0=4.666666666666667 +lon_0=-1 +k=0.999750 +x_0=274319.51 +y_0=0 +ellps=clrk80 +towgs84=-130,29,364,0,0,0,0 +units=m +no_defs <> +# Lome / UTM zone 31N +<25231> +proj=utm +zone=31 +a=6378249.2 +b=6356515 +units=m +no_defs <> +# Luzon 1911 / Philippines zone I +<25391> +proj=tmerc +lat_0=0 +lon_0=117 +k=0.999950 +x_0=500000 +y_0=0 +ellps=clrk66 +units=m +no_defs <> +# Luzon 1911 / Philippines zone II +<25392> +proj=tmerc +lat_0=0 +lon_0=119 +k=0.999950 +x_0=500000 +y_0=0 +ellps=clrk66 +units=m +no_defs <> +# Luzon 1911 / Philippines zone III +<25393> +proj=tmerc +lat_0=0 +lon_0=121 +k=0.999950 +x_0=500000 +y_0=0 +ellps=clrk66 +units=m +no_defs <> +# Luzon 1911 / Philippines zone IV +<25394> +proj=tmerc +lat_0=0 +lon_0=123 +k=0.999950 +x_0=500000 +y_0=0 +ellps=clrk66 +units=m +no_defs <> +# Luzon 1911 / Philippines zone V +<25395> +proj=tmerc +lat_0=0 +lon_0=125 +k=0.999950 +x_0=500000 +y_0=0 +ellps=clrk66 +units=m +no_defs <> +# Makassar (Jakarta) / NEIEZ +<25700> +proj=merc +lat_ts=0 +lon_0=216.8077194444444 +k=0.997000 +x_0=3900000 +y_0=900000 +ellps=bessel +towgs84=-587.8,519.75,145.76,0,0,0,0 +pm=jakarta +units=m +no_defs <> +# ETRS89 / UTM zone 28N +<25828> +proj=utm +zone=28 +ellps=GRS80 +units=m +no_defs <> +# ETRS89 / UTM zone 29N +<25829> +proj=utm +zone=29 +ellps=GRS80 +units=m +no_defs <> +# ETRS89 / UTM zone 30N +<25830> +proj=utm +zone=30 +ellps=GRS80 +units=m +no_defs <> +# ETRS89 / UTM zone 31N +<25831> +proj=utm +zone=31 +ellps=GRS80 +units=m +no_defs <> +# ETRS89 / UTM zone 32N +<25832> +proj=utm +zone=32 +ellps=GRS80 +units=m +no_defs <> +# ETRS89 / UTM zone 33N +<25833> +proj=utm +zone=33 +ellps=GRS80 +units=m +no_defs <> +# ETRS89 / UTM zone 34N +<25834> +proj=utm +zone=34 +ellps=GRS80 +units=m +no_defs <> +# ETRS89 / UTM zone 35N +<25835> +proj=utm +zone=35 +ellps=GRS80 +units=m +no_defs <> +# ETRS89 / UTM zone 36N +<25836> +proj=utm +zone=36 +ellps=GRS80 +units=m +no_defs <> +# ETRS89 / UTM zone 37N +<25837> +proj=utm +zone=37 +ellps=GRS80 +units=m +no_defs <> +# ETRS89 / UTM zone 38N +<25838> +proj=utm +zone=38 +ellps=GRS80 +units=m +no_defs <> +# ETRS89 / TM Baltic93 +<25884> +proj=tmerc +lat_0=0 +lon_0=24 +k=0.999600 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# Malongo 1987 / UTM zone 32S +<25932> +proj=utm +zone=32 +south +ellps=intl +units=m +no_defs <> +# Merchich / Nord Maroc +<26191> +proj=lcc +lat_1=33.3 +lat_0=33.3 +lon_0=-5.4 +k_0=0.999625769 +x_0=500000 +y_0=300000 +a=6378249.2 +b=6356515 +towgs84=31,146,47,0,0,0,0 +units=m +no_defs <> +# Merchich / Sud Maroc +<26192> +proj=lcc +lat_1=29.7 +lat_0=29.7 +lon_0=-5.4 +k_0=0.9996155960000001 +x_0=500000 +y_0=300000 +a=6378249.2 +b=6356515 +towgs84=31,146,47,0,0,0,0 +units=m +no_defs <> +# Merchich / Sahara +<26193> +proj=lcc +lat_1=26.1 +lat_0=26.1 +lon_0=-5.4 +k_0=0.9996 +x_0=1200000 +y_0=400000 +a=6378249.2 +b=6356515 +towgs84=31,146,47,0,0,0,0 +units=m +no_defs <> +# Massawa / UTM zone 37N +<26237> +proj=utm +zone=37 +ellps=bessel +towgs84=639,405,60,0,0,0,0 +units=m +no_defs <> +# Minna / UTM zone 31N +<26331> +proj=utm +zone=31 +ellps=clrk80 +units=m +no_defs <> +# Minna / UTM zone 32N +<26332> +proj=utm +zone=32 +ellps=clrk80 +units=m +no_defs <> +# Minna / Nigeria West Belt +<26391> +proj=tmerc +lat_0=4 +lon_0=4.5 +k=0.999750 +x_0=230738.26 +y_0=0 +ellps=clrk80 +units=m +no_defs <> +# Minna / Nigeria Mid Belt +<26392> +proj=tmerc +lat_0=4 +lon_0=8.5 +k=0.999750 +x_0=670553.98 +y_0=0 +ellps=clrk80 +units=m +no_defs <> +# Minna / Nigeria East Belt +<26393> +proj=tmerc +lat_0=4 +lon_0=12.5 +k=0.999750 +x_0=1110369.7 +y_0=0 +ellps=clrk80 +units=m +no_defs <> +# Mhast / UTM zone 32S +<26432> +proj=utm +zone=32 +south +ellps=intl +towgs84=-252.95,-4.11,-96.38,0,0,0,0 +units=m +no_defs <> +# Monte Mario (Rome) / Italy zone 1 +<26591> +proj=tmerc +lat_0=0 +lon_0=21.45233333333333 +k=0.999600 +x_0=1500000 +y_0=0 +ellps=intl +pm=rome +units=m +no_defs <> +# Monte Mario (Rome) / Italy zone 2 +<26592> +proj=tmerc +lat_0=0 +lon_0=27.45233333333333 +k=0.999600 +x_0=2520000 +y_0=0 +ellps=intl +pm=rome +units=m +no_defs <> +# M'poraloko / UTM zone 32N +<26632> +proj=utm +zone=32 +a=6378249.2 +b=6356515 +units=m +no_defs <> +# M'poraloko / UTM zone 32S +<26692> +proj=utm +zone=32 +south +a=6378249.2 +b=6356515 +units=m +no_defs <> +# NAD27 / UTM zone 3N +<26703> +proj=utm +zone=3 +ellps=clrk66 +datum=NAD27 +units=m +no_defs <> +# NAD27 / UTM zone 4N +<26704> +proj=utm +zone=4 +ellps=clrk66 +datum=NAD27 +units=m +no_defs <> +# NAD27 / UTM zone 5N +<26705> +proj=utm +zone=5 +ellps=clrk66 +datum=NAD27 +units=m +no_defs <> +# NAD27 / UTM zone 6N +<26706> +proj=utm +zone=6 +ellps=clrk66 +datum=NAD27 +units=m +no_defs <> +# NAD27 / UTM zone 7N +<26707> +proj=utm +zone=7 +ellps=clrk66 +datum=NAD27 +units=m +no_defs <> +# NAD27 / UTM zone 8N +<26708> +proj=utm +zone=8 +ellps=clrk66 +datum=NAD27 +units=m +no_defs <> +# NAD27 / UTM zone 9N +<26709> +proj=utm +zone=9 +ellps=clrk66 +datum=NAD27 +units=m +no_defs <> +# NAD27 / UTM zone 10N +<26710> +proj=utm +zone=10 +ellps=clrk66 +datum=NAD27 +units=m +no_defs <> +# NAD27 / UTM zone 11N +<26711> +proj=utm +zone=11 +ellps=clrk66 +datum=NAD27 +units=m +no_defs <> +# NAD27 / UTM zone 12N +<26712> +proj=utm +zone=12 +ellps=clrk66 +datum=NAD27 +units=m +no_defs <> +# NAD27 / UTM zone 13N +<26713> +proj=utm +zone=13 +ellps=clrk66 +datum=NAD27 +units=m +no_defs <> +# NAD27 / UTM zone 14N +<26714> +proj=utm +zone=14 +ellps=clrk66 +datum=NAD27 +units=m +no_defs <> +# NAD27 / UTM zone 15N +<26715> +proj=utm +zone=15 +ellps=clrk66 +datum=NAD27 +units=m +no_defs <> +# NAD27 / UTM zone 16N +<26716> +proj=utm +zone=16 +ellps=clrk66 +datum=NAD27 +units=m +no_defs <> +# NAD27 / UTM zone 17N +<26717> +proj=utm +zone=17 +ellps=clrk66 +datum=NAD27 +units=m +no_defs <> +# NAD27 / UTM zone 18N +<26718> +proj=utm +zone=18 +ellps=clrk66 +datum=NAD27 +units=m +no_defs <> +# NAD27 / UTM zone 19N +<26719> +proj=utm +zone=19 +ellps=clrk66 +datum=NAD27 +units=m +no_defs <> +# NAD27 / UTM zone 20N +<26720> +proj=utm +zone=20 +ellps=clrk66 +datum=NAD27 +units=m +no_defs <> +# NAD27 / UTM zone 21N +<26721> +proj=utm +zone=21 +ellps=clrk66 +datum=NAD27 +units=m +no_defs <> +# NAD27 / UTM zone 22N +<26722> +proj=utm +zone=22 +ellps=clrk66 +datum=NAD27 +units=m +no_defs <> +# NAD27 / Alabama East +<26729> +proj=tmerc +lat_0=30.5 +lon_0=-85.83333333333333 +k=0.999960 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Alabama West +<26730> +proj=tmerc +lat_0=30 +lon_0=-87.5 +k=0.999933 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Alaska zone 1 +<26731> +proj=omerc +lat_0=57 +lonc=-133.6666666666667 +alpha=323.1301023611111 +k=0.9999 +x_0=5000000.001016002 +y_0=-5000000.001016002 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Alaska zone 2 +<26732> +proj=tmerc +lat_0=54 +lon_0=-142 +k=0.999900 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Alaska zone 3 +<26733> +proj=tmerc +lat_0=54 +lon_0=-146 +k=0.999900 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Alaska zone 4 +<26734> +proj=tmerc +lat_0=54 +lon_0=-150 +k=0.999900 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Alaska zone 5 +<26735> +proj=tmerc +lat_0=54 +lon_0=-154 +k=0.999900 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Alaska zone 6 +<26736> +proj=tmerc +lat_0=54 +lon_0=-158 +k=0.999900 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Alaska zone 7 +<26737> +proj=tmerc +lat_0=54 +lon_0=-162 +k=0.999900 +x_0=213360.4267208534 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Alaska zone 8 +<26738> +proj=tmerc +lat_0=54 +lon_0=-166 +k=0.999900 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Alaska zone 9 +<26739> +proj=tmerc +lat_0=54 +lon_0=-170 +k=0.999900 +x_0=182880.3657607315 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Alaska zone 10 +<26740> +proj=lcc +lat_1=53.83333333333334 +lat_2=51.83333333333334 +lat_0=51 +lon_0=-176 +x_0=914401.8288036576 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / California zone I +<26741> +proj=lcc +lat_1=41.66666666666666 +lat_2=40 +lat_0=39.33333333333334 +lon_0=-122 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / California zone II +<26742> +proj=lcc +lat_1=39.83333333333334 +lat_2=38.33333333333334 +lat_0=37.66666666666666 +lon_0=-122 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / California zone III +<26743> +proj=lcc +lat_1=38.43333333333333 +lat_2=37.06666666666667 +lat_0=36.5 +lon_0=-120.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / California zone IV +<26744> +proj=lcc +lat_1=37.25 +lat_2=36 +lat_0=35.33333333333334 +lon_0=-119 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / California zone V +<26745> +proj=lcc +lat_1=35.46666666666667 +lat_2=34.03333333333333 +lat_0=33.5 +lon_0=-118 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / California zone VI +<26746> +proj=lcc +lat_1=33.88333333333333 +lat_2=32.78333333333333 +lat_0=32.16666666666666 +lon_0=-116.25 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / California zone VII +<26747> +proj=lcc +lat_1=34.41666666666666 +lat_2=33.86666666666667 +lat_0=34.13333333333333 +lon_0=-118.3333333333333 +x_0=1276106.450596901 +y_0=127079.524511049 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Arizona East +<26748> +proj=tmerc +lat_0=31 +lon_0=-110.1666666666667 +k=0.999900 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Arizona Central +<26749> +proj=tmerc +lat_0=31 +lon_0=-111.9166666666667 +k=0.999900 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Arizona West +<26750> +proj=tmerc +lat_0=31 +lon_0=-113.75 +k=0.999933 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Arkansas North +<26751> +proj=lcc +lat_1=36.23333333333333 +lat_2=34.93333333333333 +lat_0=34.33333333333334 +lon_0=-92 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Arkansas South +<26752> +proj=lcc +lat_1=34.76666666666667 +lat_2=33.3 +lat_0=32.66666666666666 +lon_0=-92 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Colorado North +<26753> +proj=lcc +lat_1=39.71666666666667 +lat_2=40.78333333333333 +lat_0=39.33333333333334 +lon_0=-105.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Colorado Central +<26754> +proj=lcc +lat_1=39.75 +lat_2=38.45 +lat_0=37.83333333333334 +lon_0=-105.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Colorado South +<26755> +proj=lcc +lat_1=38.43333333333333 +lat_2=37.23333333333333 +lat_0=36.66666666666666 +lon_0=-105.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Connecticut +<26756> +proj=lcc +lat_1=41.86666666666667 +lat_2=41.2 +lat_0=40.83333333333334 +lon_0=-72.75 +x_0=182880.3657607315 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Delaware +<26757> +proj=tmerc +lat_0=38 +lon_0=-75.41666666666667 +k=0.999995 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Florida East +<26758> +proj=tmerc +lat_0=24.33333333333333 +lon_0=-81 +k=0.999941 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Florida West +<26759> +proj=tmerc +lat_0=24.33333333333333 +lon_0=-82 +k=0.999941 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Florida North +<26760> +proj=lcc +lat_1=30.75 +lat_2=29.58333333333333 +lat_0=29 +lon_0=-84.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Georgia East +<26766> +proj=tmerc +lat_0=30 +lon_0=-82.16666666666667 +k=0.999900 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Georgia West +<26767> +proj=tmerc +lat_0=30 +lon_0=-84.16666666666667 +k=0.999900 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Idaho East +<26768> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-112.1666666666667 +k=0.999947 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Idaho Central +<26769> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-114 +k=0.999947 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Idaho West +<26770> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-115.75 +k=0.999933 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Illinois East +<26771> +proj=tmerc +lat_0=36.66666666666666 +lon_0=-88.33333333333333 +k=0.999975 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Illinois West +<26772> +proj=tmerc +lat_0=36.66666666666666 +lon_0=-90.16666666666667 +k=0.999941 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Indiana East +<26773> +proj=tmerc +lat_0=37.5 +lon_0=-85.66666666666667 +k=0.999967 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Indiana West +<26774> +proj=tmerc +lat_0=37.5 +lon_0=-87.08333333333333 +k=0.999967 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Iowa North +<26775> +proj=lcc +lat_1=43.26666666666667 +lat_2=42.06666666666667 +lat_0=41.5 +lon_0=-93.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Iowa South +<26776> +proj=lcc +lat_1=41.78333333333333 +lat_2=40.61666666666667 +lat_0=40 +lon_0=-93.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Kansas North +<26777> +proj=lcc +lat_1=39.78333333333333 +lat_2=38.71666666666667 +lat_0=38.33333333333334 +lon_0=-98 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Kansas South +<26778> +proj=lcc +lat_1=38.56666666666667 +lat_2=37.26666666666667 +lat_0=36.66666666666666 +lon_0=-98.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Kentucky North +<26779> +proj=lcc +lat_1=37.96666666666667 +lat_2=38.96666666666667 +lat_0=37.5 +lon_0=-84.25 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Kentucky South +<26780> +proj=lcc +lat_1=36.73333333333333 +lat_2=37.93333333333333 +lat_0=36.33333333333334 +lon_0=-85.75 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Louisiana North +<26781> +proj=lcc +lat_1=31.16666666666667 +lat_2=32.66666666666666 +lat_0=30.66666666666667 +lon_0=-92.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Louisiana South +<26782> +proj=lcc +lat_1=29.3 +lat_2=30.7 +lat_0=28.66666666666667 +lon_0=-91.33333333333333 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Maine East +<26783> +proj=tmerc +lat_0=43.83333333333334 +lon_0=-68.5 +k=0.999900 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Maine West +<26784> +proj=tmerc +lat_0=42.83333333333334 +lon_0=-70.16666666666667 +k=0.999967 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Maryland +<26785> +proj=lcc +lat_1=38.3 +lat_2=39.45 +lat_0=37.83333333333334 +lon_0=-77 +x_0=243840.4876809754 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Massachusetts Mainland +<26786> +proj=lcc +lat_1=41.71666666666667 +lat_2=42.68333333333333 +lat_0=41 +lon_0=-71.5 +x_0=182880.3657607315 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Massachusetts Island +<26787> +proj=lcc +lat_1=41.28333333333333 +lat_2=41.48333333333333 +lat_0=41 +lon_0=-70.5 +x_0=60960.12192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Minnesota North +<26791> +proj=lcc +lat_1=47.03333333333333 +lat_2=48.63333333333333 +lat_0=46.5 +lon_0=-93.09999999999999 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Minnesota Central +<26792> +proj=lcc +lat_1=45.61666666666667 +lat_2=47.05 +lat_0=45 +lon_0=-94.25 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Minnesota South +<26793> +proj=lcc +lat_1=43.78333333333333 +lat_2=45.21666666666667 +lat_0=43 +lon_0=-94 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Mississippi East +<26794> +proj=tmerc +lat_0=29.66666666666667 +lon_0=-88.83333333333333 +k=0.999960 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Mississippi West +<26795> +proj=tmerc +lat_0=30.5 +lon_0=-90.33333333333333 +k=0.999941 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Missouri East +<26796> +proj=tmerc +lat_0=35.83333333333334 +lon_0=-90.5 +k=0.999933 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Missouri Central +<26797> +proj=tmerc +lat_0=35.83333333333334 +lon_0=-92.5 +k=0.999933 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Missouri West +<26798> +proj=tmerc +lat_0=36.16666666666666 +lon_0=-94.5 +k=0.999941 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD Michigan / Michigan East +<26801> +proj=tmerc +lat_0=41.5 +lon_0=-83.66666666666667 +k=0.999943 +x_0=152400.3048006096 +y_0=0 +a=6378450.047548896 +b=6356826.621488444 +to_meter=0.3048006096012192 +no_defs <> +# NAD Michigan / Michigan Old Central +<26802> +proj=tmerc +lat_0=41.5 +lon_0=-85.75 +k=0.999909 +x_0=152400.3048006096 +y_0=0 +a=6378450.047548896 +b=6356826.621488444 +to_meter=0.3048006096012192 +no_defs <> +# NAD Michigan / Michigan West +<26803> +proj=tmerc +lat_0=41.5 +lon_0=-88.75 +k=0.999909 +x_0=152400.3048006096 +y_0=0 +a=6378450.047548896 +b=6356826.621488444 +to_meter=0.3048006096012192 +no_defs <> +# NAD Michigan / Michigan North +<26811> +proj=lcc +lat_1=45.48333333333333 +lat_2=47.08333333333334 +lat_0=44.78333333333333 +lon_0=-87 +x_0=609601.2192024384 +y_0=0 +a=6378450.047548896 +b=6356826.621488444 +to_meter=0.3048006096012192 +no_defs <> +# NAD Michigan / Michigan Central +<26812> +proj=lcc +lat_1=44.18333333333333 +lat_2=45.7 +lat_0=43.31666666666667 +lon_0=-84.33333333333333 +x_0=609601.2192024384 +y_0=0 +a=6378450.047548896 +b=6356826.621488444 +to_meter=0.3048006096012192 +no_defs <> +# NAD Michigan / Michigan South +<26813> +proj=lcc +lat_1=42.1 +lat_2=43.66666666666666 +lat_0=41.5 +lon_0=-84.33333333333333 +x_0=609601.2192024384 +y_0=0 +a=6378450.047548896 +b=6356826.621488444 +to_meter=0.3048006096012192 +no_defs <> +# NAD83 / UTM zone 3N +<26903> +proj=utm +zone=3 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / UTM zone 4N +<26904> +proj=utm +zone=4 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / UTM zone 5N +<26905> +proj=utm +zone=5 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / UTM zone 6N +<26906> +proj=utm +zone=6 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / UTM zone 7N +<26907> +proj=utm +zone=7 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / UTM zone 8N +<26908> +proj=utm +zone=8 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / UTM zone 9N +<26909> +proj=utm +zone=9 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / UTM zone 10N +<26910> +proj=utm +zone=10 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / UTM zone 11N +<26911> +proj=utm +zone=11 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / UTM zone 12N +<26912> +proj=utm +zone=12 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / UTM zone 13N +<26913> +proj=utm +zone=13 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / UTM zone 14N +<26914> +proj=utm +zone=14 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / UTM zone 15N +<26915> +proj=utm +zone=15 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / UTM zone 16N +<26916> +proj=utm +zone=16 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / UTM zone 17N +<26917> +proj=utm +zone=17 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / UTM zone 18N +<26918> +proj=utm +zone=18 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / UTM zone 19N +<26919> +proj=utm +zone=19 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / UTM zone 20N +<26920> +proj=utm +zone=20 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / UTM zone 21N +<26921> +proj=utm +zone=21 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / UTM zone 22N +<26922> +proj=utm +zone=22 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / UTM zone 23N +<26923> +proj=utm +zone=23 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Alabama East +<26929> +proj=tmerc +lat_0=30.5 +lon_0=-85.83333333333333 +k=0.999960 +x_0=200000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Alabama West +<26930> +proj=tmerc +lat_0=30 +lon_0=-87.5 +k=0.999933 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Alaska zone 1 +<26931> +proj=omerc +lat_0=57 +lonc=-133.6666666666667 +alpha=323.1301023611111 +k=0.9999 +x_0=5000000 +y_0=-5000000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Alaska zone 2 +<26932> +proj=tmerc +lat_0=54 +lon_0=-142 +k=0.999900 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Alaska zone 3 +<26933> +proj=tmerc +lat_0=54 +lon_0=-146 +k=0.999900 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Alaska zone 4 +<26934> +proj=tmerc +lat_0=54 +lon_0=-150 +k=0.999900 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Alaska zone 5 +<26935> +proj=tmerc +lat_0=54 +lon_0=-154 +k=0.999900 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Alaska zone 6 +<26936> +proj=tmerc +lat_0=54 +lon_0=-158 +k=0.999900 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Alaska zone 7 +<26937> +proj=tmerc +lat_0=54 +lon_0=-162 +k=0.999900 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Alaska zone 8 +<26938> +proj=tmerc +lat_0=54 +lon_0=-166 +k=0.999900 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Alaska zone 9 +<26939> +proj=tmerc +lat_0=54 +lon_0=-170 +k=0.999900 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Alaska zone 10 +<26940> +proj=lcc +lat_1=53.83333333333334 +lat_2=51.83333333333334 +lat_0=51 +lon_0=-176 +x_0=1000000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / California zone 1 +<26941> +proj=lcc +lat_1=41.66666666666666 +lat_2=40 +lat_0=39.33333333333334 +lon_0=-122 +x_0=2000000 +y_0=500000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / California zone 2 +<26942> +proj=lcc +lat_1=39.83333333333334 +lat_2=38.33333333333334 +lat_0=37.66666666666666 +lon_0=-122 +x_0=2000000 +y_0=500000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / California zone 3 +<26943> +proj=lcc +lat_1=38.43333333333333 +lat_2=37.06666666666667 +lat_0=36.5 +lon_0=-120.5 +x_0=2000000 +y_0=500000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / California zone 4 +<26944> +proj=lcc +lat_1=37.25 +lat_2=36 +lat_0=35.33333333333334 +lon_0=-119 +x_0=2000000 +y_0=500000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / California zone 5 +<26945> +proj=lcc +lat_1=35.46666666666667 +lat_2=34.03333333333333 +lat_0=33.5 +lon_0=-118 +x_0=2000000 +y_0=500000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / California zone 6 +<26946> +proj=lcc +lat_1=33.88333333333333 +lat_2=32.78333333333333 +lat_0=32.16666666666666 +lon_0=-116.25 +x_0=2000000 +y_0=500000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Arizona East +<26948> +proj=tmerc +lat_0=31 +lon_0=-110.1666666666667 +k=0.999900 +x_0=213360 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Arizona Central +<26949> +proj=tmerc +lat_0=31 +lon_0=-111.9166666666667 +k=0.999900 +x_0=213360 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Arizona West +<26950> +proj=tmerc +lat_0=31 +lon_0=-113.75 +k=0.999933 +x_0=213360 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Arkansas North +<26951> +proj=lcc +lat_1=36.23333333333333 +lat_2=34.93333333333333 +lat_0=34.33333333333334 +lon_0=-92 +x_0=400000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Arkansas South +<26952> +proj=lcc +lat_1=34.76666666666667 +lat_2=33.3 +lat_0=32.66666666666666 +lon_0=-92 +x_0=400000 +y_0=400000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Colorado North +<26953> +proj=lcc +lat_1=40.78333333333333 +lat_2=39.71666666666667 +lat_0=39.33333333333334 +lon_0=-105.5 +x_0=914401.8289 +y_0=304800.6096 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Colorado Central +<26954> +proj=lcc +lat_1=39.75 +lat_2=38.45 +lat_0=37.83333333333334 +lon_0=-105.5 +x_0=914401.8289 +y_0=304800.6096 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Colorado South +<26955> +proj=lcc +lat_1=38.43333333333333 +lat_2=37.23333333333333 +lat_0=36.66666666666666 +lon_0=-105.5 +x_0=914401.8289 +y_0=304800.6096 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Connecticut +<26956> +proj=lcc +lat_1=41.86666666666667 +lat_2=41.2 +lat_0=40.83333333333334 +lon_0=-72.75 +x_0=304800.6096 +y_0=152400.3048 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Delaware +<26957> +proj=tmerc +lat_0=38 +lon_0=-75.41666666666667 +k=0.999995 +x_0=200000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Florida East +<26958> +proj=tmerc +lat_0=24.33333333333333 +lon_0=-81 +k=0.999941 +x_0=200000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Florida West +<26959> +proj=tmerc +lat_0=24.33333333333333 +lon_0=-82 +k=0.999941 +x_0=200000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Florida North +<26960> +proj=lcc +lat_1=30.75 +lat_2=29.58333333333333 +lat_0=29 +lon_0=-84.5 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Hawaii zone 1 +<26961> +proj=tmerc +lat_0=18.83333333333333 +lon_0=-155.5 +k=0.999967 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Hawaii zone 2 +<26962> +proj=tmerc +lat_0=20.33333333333333 +lon_0=-156.6666666666667 +k=0.999967 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Hawaii zone 3 +<26963> +proj=tmerc +lat_0=21.16666666666667 +lon_0=-158 +k=0.999990 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Hawaii zone 4 +<26964> +proj=tmerc +lat_0=21.83333333333333 +lon_0=-159.5 +k=0.999990 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Hawaii zone 5 +<26965> +proj=tmerc +lat_0=21.66666666666667 +lon_0=-160.1666666666667 +k=1.000000 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Georgia East +<26966> +proj=tmerc +lat_0=30 +lon_0=-82.16666666666667 +k=0.999900 +x_0=200000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Georgia West +<26967> +proj=tmerc +lat_0=30 +lon_0=-84.16666666666667 +k=0.999900 +x_0=700000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Idaho East +<26968> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-112.1666666666667 +k=0.999947 +x_0=200000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Idaho Central +<26969> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-114 +k=0.999947 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Idaho West +<26970> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-115.75 +k=0.999933 +x_0=800000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Illinois East +<26971> +proj=tmerc +lat_0=36.66666666666666 +lon_0=-88.33333333333333 +k=0.999975 +x_0=300000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Illinois West +<26972> +proj=tmerc +lat_0=36.66666666666666 +lon_0=-90.16666666666667 +k=0.999941 +x_0=700000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Indiana East +<26973> +proj=tmerc +lat_0=37.5 +lon_0=-85.66666666666667 +k=0.999967 +x_0=100000 +y_0=250000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Indiana West +<26974> +proj=tmerc +lat_0=37.5 +lon_0=-87.08333333333333 +k=0.999967 +x_0=900000 +y_0=250000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Iowa North +<26975> +proj=lcc +lat_1=43.26666666666667 +lat_2=42.06666666666667 +lat_0=41.5 +lon_0=-93.5 +x_0=1500000 +y_0=1000000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Iowa South +<26976> +proj=lcc +lat_1=41.78333333333333 +lat_2=40.61666666666667 +lat_0=40 +lon_0=-93.5 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Kansas North +<26977> +proj=lcc +lat_1=39.78333333333333 +lat_2=38.71666666666667 +lat_0=38.33333333333334 +lon_0=-98 +x_0=400000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Kansas South +<26978> +proj=lcc +lat_1=38.56666666666667 +lat_2=37.26666666666667 +lat_0=36.66666666666666 +lon_0=-98.5 +x_0=400000 +y_0=400000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Kentucky North +<26979> +proj=lcc +lat_1=37.96666666666667 +lat_2=37.96666666666667 +lat_0=37.5 +lon_0=-84.25 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Kentucky South +<26980> +proj=lcc +lat_1=37.93333333333333 +lat_2=36.73333333333333 +lat_0=36.33333333333334 +lon_0=-85.75 +x_0=500000 +y_0=500000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Louisiana North +<26981> +proj=lcc +lat_1=32.66666666666666 +lat_2=31.16666666666667 +lat_0=30.5 +lon_0=-92.5 +x_0=1000000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Louisiana South +<26982> +proj=lcc +lat_1=30.7 +lat_2=29.3 +lat_0=28.5 +lon_0=-91.33333333333333 +x_0=1000000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Maine East +<26983> +proj=tmerc +lat_0=43.66666666666666 +lon_0=-68.5 +k=0.999900 +x_0=300000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Maine West +<26984> +proj=tmerc +lat_0=42.83333333333334 +lon_0=-70.16666666666667 +k=0.999967 +x_0=900000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Maryland +<26985> +proj=lcc +lat_1=39.45 +lat_2=38.3 +lat_0=37.66666666666666 +lon_0=-77 +x_0=400000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Massachusetts Mainland +<26986> +proj=lcc +lat_1=42.68333333333333 +lat_2=41.71666666666667 +lat_0=41 +lon_0=-71.5 +x_0=200000 +y_0=750000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Massachusetts Island +<26987> +proj=lcc +lat_1=41.48333333333333 +lat_2=41.28333333333333 +lat_0=41 +lon_0=-70.5 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Michigan North +<26988> +proj=lcc +lat_1=47.08333333333334 +lat_2=45.48333333333333 +lat_0=44.78333333333333 +lon_0=-87 +x_0=8000000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Michigan Central +<26989> +proj=lcc +lat_1=45.7 +lat_2=44.18333333333333 +lat_0=43.31666666666667 +lon_0=-84.36666666666666 +x_0=6000000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Michigan South +<26990> +proj=lcc +lat_1=43.66666666666666 +lat_2=42.1 +lat_0=41.5 +lon_0=-84.36666666666666 +x_0=4000000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Minnesota North +<26991> +proj=lcc +lat_1=48.63333333333333 +lat_2=47.03333333333333 +lat_0=46.5 +lon_0=-93.09999999999999 +x_0=800000 +y_0=100000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Minnesota Central +<26992> +proj=lcc +lat_1=47.05 +lat_2=45.61666666666667 +lat_0=45 +lon_0=-94.25 +x_0=800000 +y_0=100000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Minnesota South +<26993> +proj=lcc +lat_1=45.21666666666667 +lat_2=43.78333333333333 +lat_0=43 +lon_0=-94 +x_0=800000 +y_0=100000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Mississippi East +<26994> +proj=tmerc +lat_0=29.5 +lon_0=-88.83333333333333 +k=0.999950 +x_0=300000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Mississippi West +<26995> +proj=tmerc +lat_0=29.5 +lon_0=-90.33333333333333 +k=0.999950 +x_0=700000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Missouri East +<26996> +proj=tmerc +lat_0=35.83333333333334 +lon_0=-90.5 +k=0.999933 +x_0=250000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Missouri Central +<26997> +proj=tmerc +lat_0=35.83333333333334 +lon_0=-92.5 +k=0.999933 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Missouri West +<26998> +proj=tmerc +lat_0=36.16666666666666 +lon_0=-94.5 +k=0.999941 +x_0=850000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# Nahrwan 1967 / UTM zone 38N +<27038> +proj=utm +zone=38 +ellps=clrk80 +units=m +no_defs <> +# Nahrwan 1967 / UTM zone 39N +<27039> +proj=utm +zone=39 +ellps=clrk80 +units=m +no_defs <> +# Nahrwan 1967 / UTM zone 40N +<27040> +proj=utm +zone=40 +ellps=clrk80 +units=m +no_defs <> +# Naparima 1972 / UTM zone 20N +<27120> +proj=utm +zone=20 +ellps=intl +units=m +no_defs <> +# NZGD49 / New Zealand Map Grid +<27200> +proj=nzmg +lat_0=-41 +lon_0=173 +x_0=2510000 +y_0=6023150 +ellps=intl +units=m +no_defs <> +# NZGD49 / Mount Eden Circuit +<27205> +proj=tmerc +lat_0=-36.87986527777778 +lon_0=174.7643393611111 +k=0.999900 +x_0=300000 +y_0=700000 +ellps=intl +units=m +no_defs <> +# NZGD49 / Bay of Plenty Circuit +<27206> +proj=tmerc +lat_0=-37.76124980555556 +lon_0=176.46619725 +k=1.000000 +x_0=300000 +y_0=700000 +ellps=intl +units=m +no_defs <> +# NZGD49 / Poverty Bay Circuit +<27207> +proj=tmerc +lat_0=-38.62470277777778 +lon_0=177.8856362777778 +k=1.000000 +x_0=300000 +y_0=700000 +ellps=intl +units=m +no_defs <> +# NZGD49 / Hawkes Bay Circuit +<27208> +proj=tmerc +lat_0=-39.65092930555556 +lon_0=176.6736805277778 +k=1.000000 +x_0=300000 +y_0=700000 +ellps=intl +units=m +no_defs <> +# NZGD49 / Taranaki Circuit +<27209> +proj=tmerc +lat_0=-39.13575830555556 +lon_0=174.22801175 +k=1.000000 +x_0=300000 +y_0=700000 +ellps=intl +units=m +no_defs <> +# NZGD49 / Tuhirangi Circuit +<27210> +proj=tmerc +lat_0=-39.51247038888889 +lon_0=175.6400368055556 +k=1.000000 +x_0=300000 +y_0=700000 +ellps=intl +units=m +no_defs <> +# NZGD49 / Wanganui Circuit +<27211> +proj=tmerc +lat_0=-40.24194713888889 +lon_0=175.4880996111111 +k=1.000000 +x_0=300000 +y_0=700000 +ellps=intl +units=m +no_defs <> +# NZGD49 / Wairarapa Circuit +<27212> +proj=tmerc +lat_0=-40.92553263888889 +lon_0=175.6473496666667 +k=1.000000 +x_0=300000 +y_0=700000 +ellps=intl +units=m +no_defs <> +# NZGD49 / Wellington Circuit +<27213> +proj=tmerc +lat_0=-41.30131963888888 +lon_0=174.7766231111111 +k=1.000000 +x_0=300000 +y_0=700000 +ellps=intl +units=m +no_defs <> +# NZGD49 / Collingwood Circuit +<27214> +proj=tmerc +lat_0=-40.71475905555556 +lon_0=172.6720465 +k=1.000000 +x_0=300000 +y_0=700000 +ellps=intl +units=m +no_defs <> +# NZGD49 / Nelson Circuit +<27215> +proj=tmerc +lat_0=-41.27454472222222 +lon_0=173.2993168055555 +k=1.000000 +x_0=300000 +y_0=700000 +ellps=intl +units=m +no_defs <> +# NZGD49 / Karamea Circuit +<27216> +proj=tmerc +lat_0=-41.28991152777778 +lon_0=172.1090281944444 +k=1.000000 +x_0=300000 +y_0=700000 +ellps=intl +units=m +no_defs <> +# NZGD49 / Buller Circuit +<27217> +proj=tmerc +lat_0=-41.81080286111111 +lon_0=171.5812600555556 +k=1.000000 +x_0=300000 +y_0=700000 +ellps=intl +units=m +no_defs <> +# NZGD49 / Grey Circuit +<27218> +proj=tmerc +lat_0=-42.33369427777778 +lon_0=171.5497713055556 +k=1.000000 +x_0=300000 +y_0=700000 +ellps=intl +units=m +no_defs <> +# NZGD49 / Amuri Circuit +<27219> +proj=tmerc +lat_0=-42.68911658333333 +lon_0=173.0101333888889 +k=1.000000 +x_0=300000 +y_0=700000 +ellps=intl +units=m +no_defs <> +# NZGD49 / Marlborough Circuit +<27220> +proj=tmerc +lat_0=-41.54448666666666 +lon_0=173.8020741111111 +k=1.000000 +x_0=300000 +y_0=700000 +ellps=intl +units=m +no_defs <> +# NZGD49 / Hokitika Circuit +<27221> +proj=tmerc +lat_0=-42.88632236111111 +lon_0=170.9799935 +k=1.000000 +x_0=300000 +y_0=700000 +ellps=intl +units=m +no_defs <> +# NZGD49 / Okarito Circuit +<27222> +proj=tmerc +lat_0=-43.11012813888889 +lon_0=170.2609258333333 +k=1.000000 +x_0=300000 +y_0=700000 +ellps=intl +units=m +no_defs <> +# NZGD49 / Jacksons Bay Circuit +<27223> +proj=tmerc +lat_0=-43.97780288888889 +lon_0=168.606267 +k=1.000000 +x_0=300000 +y_0=700000 +ellps=intl +units=m +no_defs <> +# NZGD49 / Mount Pleasant Circuit +<27224> +proj=tmerc +lat_0=-43.59063758333333 +lon_0=172.7271935833333 +k=1.000000 +x_0=300000 +y_0=700000 +ellps=intl +units=m +no_defs <> +# NZGD49 / Gawler Circuit +<27225> +proj=tmerc +lat_0=-43.74871155555556 +lon_0=171.3607484722222 +k=1.000000 +x_0=300000 +y_0=700000 +ellps=intl +units=m +no_defs <> +# NZGD49 / Timaru Circuit +<27226> +proj=tmerc +lat_0=-44.40222036111111 +lon_0=171.0572508333333 +k=1.000000 +x_0=300000 +y_0=700000 +ellps=intl +units=m +no_defs <> +# NZGD49 / Lindis Peak Circuit +<27227> +proj=tmerc +lat_0=-44.73526797222222 +lon_0=169.4677550833333 +k=1.000000 +x_0=300000 +y_0=700000 +ellps=intl +units=m +no_defs <> +# NZGD49 / Mount Nicholas Circuit +<27228> +proj=tmerc +lat_0=-45.13290258333333 +lon_0=168.3986411944444 +k=1.000000 +x_0=300000 +y_0=700000 +ellps=intl +units=m +no_defs <> +# NZGD49 / Mount York Circuit +<27229> +proj=tmerc +lat_0=-45.56372616666666 +lon_0=167.7388617777778 +k=1.000000 +x_0=300000 +y_0=700000 +ellps=intl +units=m +no_defs <> +# NZGD49 / Observation Point Circuit +<27230> +proj=tmerc +lat_0=-45.81619661111111 +lon_0=170.6285951666667 +k=1.000000 +x_0=300000 +y_0=700000 +ellps=intl +units=m +no_defs <> +# NZGD49 / North Taieri Circuit +<27231> +proj=tmerc +lat_0=-45.86151336111111 +lon_0=170.2825891111111 +k=0.999960 +x_0=300000 +y_0=700000 +ellps=intl +units=m +no_defs <> +# NZGD49 / Bluff Circuit +<27232> +proj=tmerc +lat_0=-46.60000961111111 +lon_0=168.342872 +k=1.000000 +x_0=300002.66 +y_0=699999.58 +ellps=intl +units=m +no_defs <> +# NZGD49 / UTM zone 58S +<27258> +proj=utm +zone=58 +south +ellps=intl +units=m +no_defs <> +# NZGD49 / UTM zone 59S +<27259> +proj=utm +zone=59 +south +ellps=intl +units=m +no_defs <> +# NZGD49 / UTM zone 60S +<27260> +proj=utm +zone=60 +south +ellps=intl +units=m +no_defs <> +# NZGD49 / North Island Grid +<27291> +proj=tmerc +lat_0=-39 +lon_0=175.5 +k=1.000000 +x_0=274319.5243848086 +y_0=365759.3658464114 +ellps=intl +to_meter=0.9143984146160287 +no_defs <> +# NZGD49 / South Island Grid +<27292> +proj=tmerc +lat_0=-44 +lon_0=171.5 +k=1.000000 +x_0=457199.2073080143 +y_0=457199.2073080143 +ellps=intl +to_meter=0.9143984146160287 +no_defs <> +# NGO 1948 (Oslo) / NGO zone I +<27391> +proj=tmerc +lat_0=58 +lon_0=6.056250000000003 +k=1.000000 +x_0=0 +y_0=0 +a=6377492.018 +b=6356173.508712696 +towgs84=278.3,93,474.5,7.889,0.05,-6.61,6.21 +pm=oslo +units=m +no_defs <> +# NGO 1948 (Oslo) / NGO zone II +<27392> +proj=tmerc +lat_0=58 +lon_0=8.389583333333336 +k=1.000000 +x_0=0 +y_0=0 +a=6377492.018 +b=6356173.508712696 +towgs84=278.3,93,474.5,7.889,0.05,-6.61,6.21 +pm=oslo +units=m +no_defs <> +# NGO 1948 (Oslo) / NGO zone III +<27393> +proj=tmerc +lat_0=58 +lon_0=10.72291666666667 +k=1.000000 +x_0=0 +y_0=0 +a=6377492.018 +b=6356173.508712696 +towgs84=278.3,93,474.5,7.889,0.05,-6.61,6.21 +pm=oslo +units=m +no_defs <> +# NGO 1948 (Oslo) / NGO zone IV +<27394> +proj=tmerc +lat_0=58 +lon_0=13.22291666666667 +k=1.000000 +x_0=0 +y_0=0 +a=6377492.018 +b=6356173.508712696 +towgs84=278.3,93,474.5,7.889,0.05,-6.61,6.21 +pm=oslo +units=m +no_defs <> +# NGO 1948 (Oslo) / NGO zone V +<27395> +proj=tmerc +lat_0=58 +lon_0=16.88958333333334 +k=1.000000 +x_0=0 +y_0=0 +a=6377492.018 +b=6356173.508712696 +towgs84=278.3,93,474.5,7.889,0.05,-6.61,6.21 +pm=oslo +units=m +no_defs <> +# NGO 1948 (Oslo) / NGO zone VI +<27396> +proj=tmerc +lat_0=58 +lon_0=20.88958333333333 +k=1.000000 +x_0=0 +y_0=0 +a=6377492.018 +b=6356173.508712696 +towgs84=278.3,93,474.5,7.889,0.05,-6.61,6.21 +pm=oslo +units=m +no_defs <> +# NGO 1948 (Oslo) / NGO zone VII +<27397> +proj=tmerc +lat_0=58 +lon_0=24.88958333333333 +k=1.000000 +x_0=0 +y_0=0 +a=6377492.018 +b=6356173.508712696 +towgs84=278.3,93,474.5,7.889,0.05,-6.61,6.21 +pm=oslo +units=m +no_defs <> +# NGO 1948 (Oslo) / NGO zone VIII +<27398> +proj=tmerc +lat_0=58 +lon_0=29.05625 +k=1.000000 +x_0=0 +y_0=0 +a=6377492.018 +b=6356173.508712696 +towgs84=278.3,93,474.5,7.889,0.05,-6.61,6.21 +pm=oslo +units=m +no_defs <> +# Datum 73 / UTM zone 29N +<27429> +proj=utm +zone=29 +ellps=intl +units=m +no_defs <> +# Datum 73 / Modified Portuguese Grid +<27492> +proj=tmerc +lat_0=39.66666666666666 +lon_0=-8.131906111111112 +k=1.000000 +x_0=180.598 +y_0=-86.98999999999999 +ellps=intl +units=m +no_defs <> +# ATF (Paris) / Nord de Guerre +<27500> +proj=lcc +lat_1=49.50000000000001 +lat_0=49.50000000000001 +lon_0=7.737229170000001 +k_0=0.99950908 +x_0=500000 +y_0=300000 +a=6376523 +b=6355862.933255573 +pm=paris +units=m +no_defs <> +# NTF (Paris) / Lambert Nord France +<27561> +proj=lcc +lat_1=49.50000000000001 +lat_0=49.50000000000001 +lon_0=2.33722917 +k_0=0.999877341 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs <> +# NTF (Paris) / Lambert Centre France +<27562> +proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=2.33722917 +k_0=0.99987742 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs <> +# NTF (Paris) / Lambert Sud France +<27563> +proj=lcc +lat_1=44.10000000000001 +lat_0=44.10000000000001 +lon_0=2.33722917 +k_0=0.999877499 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs <> +# NTF (Paris) / Lambert Corse +<27564> +proj=lcc +lat_1=42.16500000000001 +lat_0=42.16500000000001 +lon_0=2.33722917 +k_0=0.99994471 +x_0=234.358 +y_0=185861.369 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs <> +# NTF (Paris) / Lambert zone I +<27571> +proj=lcc +lat_1=49.50000000000001 +lat_0=49.50000000000001 +lon_0=2.33722917 +k_0=0.999877341 +x_0=600000 +y_0=1200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs <> +# NTF (Paris) / Lambert zone II +<27572> +proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=2.33722917 +k_0=0.99987742 +x_0=600000 +y_0=2200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs <> +# NTF (Paris) / Lambert zone III +<27573> +proj=lcc +lat_1=44.10000000000001 +lat_0=44.10000000000001 +lon_0=2.33722917 +k_0=0.999877499 +x_0=600000 +y_0=3200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs <> +# NTF (Paris) / Lambert zone IV +<27574> +proj=lcc +lat_1=42.16500000000001 +lat_0=42.16500000000001 +lon_0=2.33722917 +k_0=0.99994471 +x_0=234.358 +y_0=4185861.369 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs <> +# NTF (Paris) / France I +<27581> +proj=lcc +lat_1=49.50000000000001 +lat_0=49.50000000000001 +lon_0=2.33722917 +k_0=0.999877341 +x_0=600000 +y_0=1200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs <> +# NTF (Paris) / France II +<27582> +proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=2.33722917 +k_0=0.99987742 +x_0=600000 +y_0=2200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs <> +# NTF (Paris) / France III +<27583> +proj=lcc +lat_1=44.10000000000001 +lat_0=44.10000000000001 +lon_0=2.33722917 +k_0=0.999877499 +x_0=600000 +y_0=3200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs <> +# NTF (Paris) / France IV +<27584> +proj=lcc +lat_1=42.16500000000001 +lat_0=42.16500000000001 +lon_0=2.33722917 +k_0=0.99994471 +x_0=234.358 +y_0=4185861.369 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs <> +# NTF (Paris) / Nord France +<27591> +proj=lcc +lat_1=49.50000000000001 +lat_0=49.50000000000001 +lon_0=2.33722917 +k_0=0.999877341 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs <> +# NTF (Paris) / Centre France +<27592> +proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=2.33722917 +k_0=0.99987742 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs <> +# NTF (Paris) / Sud France +<27593> +proj=lcc +lat_1=44.10000000000001 +lat_0=44.10000000000001 +lon_0=2.33722917 +k_0=0.999877499 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs <> +# NTF (Paris) / Corse +<27594> +proj=lcc +lat_1=42.16500000000001 +lat_0=42.16500000000001 +lon_0=2.33722917 +k_0=0.99994471 +x_0=234.358 +y_0=185861.369 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs <> +# OSGB 1936 / British National Grid +<27700> +proj=tmerc +lat_0=49 +lon_0=-2 +k=0.999601 +x_0=400000 +y_0=-100000 +ellps=airy +units=m +no_defs <> +# Palestine 1923 / Palestine Grid +<28191> +proj=cass +lat_0=31.73409694444445 +lon_0=35.21208055555556 +x_0=170251.555 +y_0=126867.909 +a=6378300.789 +b=6356566.435 +units=m +no_defs <> +# Palestine 1923 / Palestine Belt +<28192> +proj=tmerc +lat_0=31.73409694444445 +lon_0=35.21208055555556 +k=1.000000 +x_0=170251.555 +y_0=1126867.909 +a=6378300.789 +b=6356566.435 +units=m +no_defs <> +# Palestine 1923 / Israeli CS Grid +<28193> +proj=cass +lat_0=31.73409694444445 +lon_0=35.21208055555556 +x_0=170251.555 +y_0=1126867.909 +a=6378300.789 +b=6356566.435 +units=m +no_defs <> +# Pointe Noire / UTM zone 32S +<28232> +proj=utm +zone=32 +south +a=6378249.2 +b=6356515 +units=m +no_defs <> +# GDA94 / MGA zone 48 +<28348> +proj=utm +zone=48 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# GDA94 / MGA zone 49 +<28349> +proj=utm +zone=49 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# GDA94 / MGA zone 50 +<28350> +proj=utm +zone=50 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# GDA94 / MGA zone 51 +<28351> +proj=utm +zone=51 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# GDA94 / MGA zone 52 +<28352> +proj=utm +zone=52 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# GDA94 / MGA zone 53 +<28353> +proj=utm +zone=53 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# GDA94 / MGA zone 54 +<28354> +proj=utm +zone=54 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# GDA94 / MGA zone 55 +<28355> +proj=utm +zone=55 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# GDA94 / MGA zone 56 +<28356> +proj=utm +zone=56 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# GDA94 / MGA zone 57 +<28357> +proj=utm +zone=57 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# GDA94 / MGA zone 58 +<28358> +proj=utm +zone=58 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger zone 2 +<28402> +proj=tmerc +lat_0=0 +lon_0=9 +k=1.000000 +x_0=2500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger zone 3 +<28403> +proj=tmerc +lat_0=0 +lon_0=15 +k=1.000000 +x_0=3500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger zone 4 +<28404> +proj=tmerc +lat_0=0 +lon_0=21 +k=1.000000 +x_0=4500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger zone 5 +<28405> +proj=tmerc +lat_0=0 +lon_0=27 +k=1.000000 +x_0=5500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger zone 6 +<28406> +proj=tmerc +lat_0=0 +lon_0=33 +k=1.000000 +x_0=6500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger zone 7 +<28407> +proj=tmerc +lat_0=0 +lon_0=39 +k=1.000000 +x_0=7500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger zone 8 +<28408> +proj=tmerc +lat_0=0 +lon_0=45 +k=1.000000 +x_0=8500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger zone 9 +<28409> +proj=tmerc +lat_0=0 +lon_0=51 +k=1.000000 +x_0=9500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger zone 10 +<28410> +proj=tmerc +lat_0=0 +lon_0=57 +k=1.000000 +x_0=10500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger zone 11 +<28411> +proj=tmerc +lat_0=0 +lon_0=63 +k=1.000000 +x_0=11500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger zone 12 +<28412> +proj=tmerc +lat_0=0 +lon_0=69 +k=1.000000 +x_0=12500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger zone 13 +<28413> +proj=tmerc +lat_0=0 +lon_0=75 +k=1.000000 +x_0=13500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger zone 14 +<28414> +proj=tmerc +lat_0=0 +lon_0=81 +k=1.000000 +x_0=14500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger zone 15 +<28415> +proj=tmerc +lat_0=0 +lon_0=87 +k=1.000000 +x_0=15500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger zone 16 +<28416> +proj=tmerc +lat_0=0 +lon_0=93 +k=1.000000 +x_0=16500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger zone 17 +<28417> +proj=tmerc +lat_0=0 +lon_0=99 +k=1.000000 +x_0=17500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger zone 18 +<28418> +proj=tmerc +lat_0=0 +lon_0=105 +k=1.000000 +x_0=18500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger zone 19 +<28419> +proj=tmerc +lat_0=0 +lon_0=111 +k=1.000000 +x_0=19500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger zone 20 +<28420> +proj=tmerc +lat_0=0 +lon_0=117 +k=1.000000 +x_0=20500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger zone 21 +<28421> +proj=tmerc +lat_0=0 +lon_0=123 +k=1.000000 +x_0=21500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger zone 22 +<28422> +proj=tmerc +lat_0=0 +lon_0=129 +k=1.000000 +x_0=22500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger zone 23 +<28423> +proj=tmerc +lat_0=0 +lon_0=135 +k=1.000000 +x_0=23500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger zone 24 +<28424> +proj=tmerc +lat_0=0 +lon_0=141 +k=1.000000 +x_0=24500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger zone 25 +<28425> +proj=tmerc +lat_0=0 +lon_0=147 +k=1.000000 +x_0=25500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger zone 26 +<28426> +proj=tmerc +lat_0=0 +lon_0=153 +k=1.000000 +x_0=26500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger zone 27 +<28427> +proj=tmerc +lat_0=0 +lon_0=159 +k=1.000000 +x_0=27500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger zone 28 +<28428> +proj=tmerc +lat_0=0 +lon_0=165 +k=1.000000 +x_0=28500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger zone 29 +<28429> +proj=tmerc +lat_0=0 +lon_0=171 +k=1.000000 +x_0=29500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger zone 30 +<28430> +proj=tmerc +lat_0=0 +lon_0=177 +k=1.000000 +x_0=30500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger zone 31 +<28431> +proj=tmerc +lat_0=0 +lon_0=-177 +k=1.000000 +x_0=31500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger zone 32 +<28432> +proj=tmerc +lat_0=0 +lon_0=-171 +k=1.000000 +x_0=32500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger 2N +<28462> +proj=tmerc +lat_0=0 +lon_0=9 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger 3N +<28463> +proj=tmerc +lat_0=0 +lon_0=15 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger 4N +<28464> +proj=tmerc +lat_0=0 +lon_0=21 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger 5N +<28465> +proj=tmerc +lat_0=0 +lon_0=27 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger 6N +<28466> +proj=tmerc +lat_0=0 +lon_0=33 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger 7N +<28467> +proj=tmerc +lat_0=0 +lon_0=39 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger 8N +<28468> +proj=tmerc +lat_0=0 +lon_0=45 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger 9N +<28469> +proj=tmerc +lat_0=0 +lon_0=51 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger 10N +<28470> +proj=tmerc +lat_0=0 +lon_0=57 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger 11N +<28471> +proj=tmerc +lat_0=0 +lon_0=63 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger 12N +<28472> +proj=tmerc +lat_0=0 +lon_0=69 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger 13N +<28473> +proj=tmerc +lat_0=0 +lon_0=75 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger 14N +<28474> +proj=tmerc +lat_0=0 +lon_0=81 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger 15N +<28475> +proj=tmerc +lat_0=0 +lon_0=87 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger 16N +<28476> +proj=tmerc +lat_0=0 +lon_0=93 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger 17N +<28477> +proj=tmerc +lat_0=0 +lon_0=99 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger 18N +<28478> +proj=tmerc +lat_0=0 +lon_0=105 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger 19N +<28479> +proj=tmerc +lat_0=0 +lon_0=111 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger 20N +<28480> +proj=tmerc +lat_0=0 +lon_0=117 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger 21N +<28481> +proj=tmerc +lat_0=0 +lon_0=123 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger 22N +<28482> +proj=tmerc +lat_0=0 +lon_0=129 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger 23N +<28483> +proj=tmerc +lat_0=0 +lon_0=135 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger 24N +<28484> +proj=tmerc +lat_0=0 +lon_0=141 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger 25N +<28485> +proj=tmerc +lat_0=0 +lon_0=147 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger 26N +<28486> +proj=tmerc +lat_0=0 +lon_0=153 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger 27N +<28487> +proj=tmerc +lat_0=0 +lon_0=159 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger 28N +<28488> +proj=tmerc +lat_0=0 +lon_0=165 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger 29N +<28489> +proj=tmerc +lat_0=0 +lon_0=171 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger 30N +<28490> +proj=tmerc +lat_0=0 +lon_0=177 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger 31N +<28491> +proj=tmerc +lat_0=0 +lon_0=-177 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1942 / Gauss-Kruger 32N +<28492> +proj=tmerc +lat_0=0 +lon_0=-171 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Qatar 1974 / Qatar National Grid +<28600> +proj=tmerc +lat_0=24.45 +lon_0=51.21666666666667 +k=0.999990 +x_0=200000 +y_0=300000 +ellps=intl +units=m +no_defs <> +# Amersfoort / RD Old +<28991> +proj=stere +lat_0=52.15616055555555 +lon_0=5.38763888888889 +k=0.999908 +x_0=0 +y_0=0 +ellps=bessel +units=m +no_defs <> +# Amersfoort / RD New +<28992> +proj=stere +lat_0=52.15616055555555 +lon_0=5.38763888888889 +k=0.999908 +x_0=155000 +y_0=463000 +ellps=bessel +units=m +no_defs <> +# SAD69 / Brazil Polyconic +<29100> +proj=poly +lat_0=0 +lon_0=-54 +x_0=5000000 +y_0=10000000 +ellps=GRS67 +units=m +no_defs <> +# SAD69 / UTM zone 18N +<29118> +proj=utm +zone=18 +ellps=GRS67 +units=m +no_defs <> +# SAD69 / UTM zone 19N +<29119> +proj=utm +zone=19 +ellps=GRS67 +units=m +no_defs <> +# SAD69 / UTM zone 20N +<29120> +proj=utm +zone=20 +ellps=GRS67 +units=m +no_defs <> +# SAD69 / UTM zone 21N +<29121> +proj=utm +zone=21 +ellps=GRS67 +units=m +no_defs <> +# SAD69 / UTM zone 22N +<29122> +proj=utm +zone=22 +ellps=GRS67 +units=m +no_defs <> +# SAD69 / UTM zone 17S +<29177> +proj=utm +zone=17 +south +ellps=GRS67 +units=m +no_defs <> +# SAD69 / UTM zone 18S +<29178> +proj=utm +zone=18 +south +ellps=GRS67 +units=m +no_defs <> +# SAD69 / UTM zone 19S +<29179> +proj=utm +zone=19 +south +ellps=GRS67 +units=m +no_defs <> +# SAD69 / UTM zone 20S +<29180> +proj=utm +zone=20 +south +ellps=GRS67 +units=m +no_defs <> +# SAD69 / UTM zone 21S +<29181> +proj=utm +zone=21 +south +ellps=GRS67 +units=m +no_defs <> +# SAD69 / UTM zone 22S +<29182> +proj=utm +zone=22 +south +ellps=GRS67 +units=m +no_defs <> +# SAD69 / UTM zone 23S +<29183> +proj=utm +zone=23 +south +ellps=GRS67 +units=m +no_defs <> +# SAD69 / UTM zone 24S +<29184> +proj=utm +zone=24 +south +ellps=GRS67 +units=m +no_defs <> +# SAD69 / UTM zone 25S +<29185> +proj=utm +zone=25 +south +ellps=GRS67 +units=m +no_defs <> +# Sapper Hill 1943 / UTM zone 20S +<29220> +proj=utm +zone=20 +south +ellps=intl +towgs84=-355,21,72,0,0,0,0 +units=m +no_defs <> +# Sapper Hill 1943 / UTM zone 21S +<29221> +proj=utm +zone=21 +south +ellps=intl +towgs84=-355,21,72,0,0,0,0 +units=m +no_defs <> +# Schwarzeck / UTM zone 33S +<29333> +proj=utm +zone=33 +south +ellps=bess_nam +units=m +no_defs <> +# South West African Coord. System zone 11 +# South West African Coord. System zone 13 +# South West African Coord. System zone 15 +# South West African Coord. System zone 17 +# South West African Coord. System zone 19 +# South West African Coord. System zone 21 +# South West African Coord. System zone 23 +# South West African Coord. System zone 25 +# Sudan / UTM zone 35N +<29635> +proj=utm +zone=35 +a=6378249.2 +b=6356515 +units=m +no_defs <> +# Sudan / UTM zone 36N +<29636> +proj=utm +zone=36 +a=6378249.2 +b=6356515 +units=m +no_defs <> +# Tananarive (Paris) / Laborde Grid +<29700> +proj=omerc +lat_0=-18.9 +lonc=46.43722917000001 +alpha=18.9 +k=0.9995000000000001 +x_0=400000 +y_0=800000 +ellps=intl +towgs84=-189,-242,-91,0,0,0,0 +pm=paris +units=m +no_defs <> +# Tananarive / UTM zone 38S +<29738> +proj=utm +zone=38 +south +ellps=intl +towgs84=-189,-242,-91,0,0,0,0 +units=m +no_defs <> +# Tananarive / UTM zone 39S +<29739> +proj=utm +zone=39 +south +ellps=intl +towgs84=-189,-242,-91,0,0,0,0 +units=m +no_defs <> +# Timbalai 1948 / UTM zone 49N +<29849> +proj=utm +zone=49 +ellps=evrstSS +units=m +no_defs <> +# Timbalai 1948 / UTM zone 50N +<29850> +proj=utm +zone=50 +ellps=evrstSS +units=m +no_defs <> +# Timbalai 1948 / R.S.O. Borneo (ch) +<29871> +proj=omerc +lat_0=4 +lonc=115 +alpha=53.31582047222222 +k=0.99984 +x_0=590476.8714630401 +y_0=442857.653094361 +ellps=evrstSS +to_meter=20.11676512155263 +no_defs <> +# Timbalai 1948 / R.S.O. Borneo (ft) +<29872> +proj=omerc +lat_0=4 +lonc=115 +alpha=53.31582047222222 +k=0.99984 +x_0=590476.8727431979 +y_0=442857.6545573985 +ellps=evrstSS +to_meter=0.3047994715386762 +no_defs <> +# Timbalai 1948 / R.S.O. Borneo (m) +<29873> +proj=omerc +lat_0=4 +lonc=115 +alpha=53.31582047222222 +k=0.99984 +x_0=590476.87 +y_0=442857.65 +ellps=evrstSS +units=m +no_defs <> +# TM65 / Irish National Grid +<29900> +proj=tmerc +lat_0=53.5 +lon_0=-8 +k=1.000035 +x_0=200000 +y_0=250000 +a=6377340.189 +b=6356034.447938534 +units=m +no_defs <> +# OSNI 1952 / Irish National Grid +<29901> +proj=tmerc +lat_0=53.5 +lon_0=-8 +k=1.000000 +x_0=200000 +y_0=250000 +ellps=airy +units=m +no_defs <> +# TM65 / Irish Grid +<29902> +proj=tmerc +lat_0=53.5 +lon_0=-8 +k=1.000035 +x_0=200000 +y_0=250000 +a=6377340.189 +b=6356034.447938534 +units=m +no_defs <> +# TM75 / Irish Grid +<29903> +proj=tmerc +lat_0=53.5 +lon_0=-8 +k=1.000035 +x_0=200000 +y_0=250000 +a=6377340.189 +b=6356034.447938534 +units=m +no_defs <> +# Tokyo / Japan Plane Rectangular CS I +<30161> +proj=tmerc +lat_0=33 +lon_0=129.5 +k=0.999900 +x_0=0 +y_0=0 +ellps=bessel +units=m +no_defs <> +# Tokyo / Japan Plane Rectangular CS II +<30162> +proj=tmerc +lat_0=33 +lon_0=131 +k=0.999900 +x_0=0 +y_0=0 +ellps=bessel +units=m +no_defs <> +# Tokyo / Japan Plane Rectangular CS III +<30163> +proj=tmerc +lat_0=36 +lon_0=132.1666666666667 +k=0.999900 +x_0=0 +y_0=0 +ellps=bessel +units=m +no_defs <> +# Tokyo / Japan Plane Rectangular CS IV +<30164> +proj=tmerc +lat_0=33 +lon_0=133.5 +k=0.999900 +x_0=0 +y_0=0 +ellps=bessel +units=m +no_defs <> +# Tokyo / Japan Plane Rectangular CS V +<30165> +proj=tmerc +lat_0=36 +lon_0=134.3333333333333 +k=0.999900 +x_0=0 +y_0=0 +ellps=bessel +units=m +no_defs <> +# Tokyo / Japan Plane Rectangular CS VI +<30166> +proj=tmerc +lat_0=36 +lon_0=136 +k=0.999900 +x_0=0 +y_0=0 +ellps=bessel +units=m +no_defs <> +# Tokyo / Japan Plane Rectangular CS VII +<30167> +proj=tmerc +lat_0=36 +lon_0=137.1666666666667 +k=0.999900 +x_0=0 +y_0=0 +ellps=bessel +units=m +no_defs <> +# Tokyo / Japan Plane Rectangular CS VIII +<30168> +proj=tmerc +lat_0=36 +lon_0=138.5 +k=0.999900 +x_0=0 +y_0=0 +ellps=bessel +units=m +no_defs <> +# Tokyo / Japan Plane Rectangular CS IX +<30169> +proj=tmerc +lat_0=36 +lon_0=139.8333333333333 +k=0.999900 +x_0=0 +y_0=0 +ellps=bessel +units=m +no_defs <> +# Tokyo / Japan Plane Rectangular CS X +<30170> +proj=tmerc +lat_0=40 +lon_0=140.8333333333333 +k=0.999900 +x_0=0 +y_0=0 +ellps=bessel +units=m +no_defs <> +# Tokyo / Japan Plane Rectangular CS XI +<30171> +proj=tmerc +lat_0=44 +lon_0=140.25 +k=0.999900 +x_0=0 +y_0=0 +ellps=bessel +units=m +no_defs <> +# Tokyo / Japan Plane Rectangular CS XII +<30172> +proj=tmerc +lat_0=44 +lon_0=142.25 +k=0.999900 +x_0=0 +y_0=0 +ellps=bessel +units=m +no_defs <> +# Tokyo / Japan Plane Rectangular CS XIII +<30173> +proj=tmerc +lat_0=44 +lon_0=144.25 +k=0.999900 +x_0=0 +y_0=0 +ellps=bessel +units=m +no_defs <> +# Tokyo / Japan Plane Rectangular CS XIV +<30174> +proj=tmerc +lat_0=26 +lon_0=142 +k=0.999900 +x_0=0 +y_0=0 +ellps=bessel +units=m +no_defs <> +# Tokyo / Japan Plane Rectangular CS XV +<30175> +proj=tmerc +lat_0=26 +lon_0=127.5 +k=0.999900 +x_0=0 +y_0=0 +ellps=bessel +units=m +no_defs <> +# Tokyo / Japan Plane Rectangular CS XVI +<30176> +proj=tmerc +lat_0=26 +lon_0=124 +k=0.999900 +x_0=0 +y_0=0 +ellps=bessel +units=m +no_defs <> +# Tokyo / Japan Plane Rectangular CS XVII +<30177> +proj=tmerc +lat_0=26 +lon_0=131 +k=0.999900 +x_0=0 +y_0=0 +ellps=bessel +units=m +no_defs <> +# Tokyo / Japan Plane Rectangular CS XVIII +<30178> +proj=tmerc +lat_0=20 +lon_0=136 +k=0.999900 +x_0=0 +y_0=0 +ellps=bessel +units=m +no_defs <> +# Tokyo / Japan Plane Rectangular CS XIX +<30179> +proj=tmerc +lat_0=26 +lon_0=154 +k=0.999900 +x_0=0 +y_0=0 +ellps=bessel +units=m +no_defs <> +# Trinidad 1903 / Trinidad Grid +<30200> +proj=cass +lat_0=10.44166666666667 +lon_0=-61.33333333333334 +x_0=86501.46380700001 +y_0=65379.0133425 +a=6378293.63683822 +b=6356617.979337744 +towgs84=-61.702,284.488,472.052,0,0,0,0 +to_meter=0.2011661949 +no_defs <> +# TC(1948) / UTM zone 39N +<30339> +proj=utm +zone=39 +ellps=helmert +units=m +no_defs <> +# TC(1948) / UTM zone 40N +<30340> +proj=utm +zone=40 +ellps=helmert +units=m +no_defs <> +# Voirol 1875 / Nord Algerie (ancienne) +<30491> +proj=lcc +lat_1=36 +lat_0=36 +lon_0=2.7 +k_0=0.999625544 +x_0=500000 +y_0=300000 +a=6378249.2 +b=6356515 +towgs84=-73,-247,227,0,0,0,0 +units=m +no_defs <> +# Voirol 1875 / Sud Algerie (ancienne) +<30492> +proj=lcc +lat_1=33.3 +lat_0=33.3 +lon_0=2.7 +k_0=0.999625769 +x_0=500000 +y_0=300000 +a=6378249.2 +b=6356515 +towgs84=-73,-247,227,0,0,0,0 +units=m +no_defs <> +# Nord Sahara 1959 / UTM zone 29N +<30729> +proj=utm +zone=29 +ellps=clrk80 +units=m +no_defs <> +# Nord Sahara 1959 / UTM zone 30N +<30730> +proj=utm +zone=30 +ellps=clrk80 +units=m +no_defs <> +# Nord Sahara 1959 / UTM zone 31N +<30731> +proj=utm +zone=31 +ellps=clrk80 +units=m +no_defs <> +# Nord Sahara 1959 / UTM zone 32N +<30732> +proj=utm +zone=32 +ellps=clrk80 +units=m +no_defs <> +# Nord Sahara 1959 / Voirol Unifie Nord +<30791> +proj=lcc +lat_1=36 +lat_0=36 +lon_0=2.7 +k_0=0.999625544 +x_0=500135 +y_0=300090 +ellps=clrk80 +units=m +no_defs <> +# Nord Sahara 1959 / Voirol Unifie Sud +<30792> +proj=lcc +lat_1=33.3 +lat_0=33.3 +lon_0=2.7 +k_0=0.999625769 +x_0=500135 +y_0=300090 +ellps=clrk80 +units=m +no_defs <> +# RT38 2.5 gon W +<30800> +proj=tmerc +lat_0=0 +lon_0=15.80827777777778 +k=1.000000 +x_0=1500000 +y_0=0 +ellps=bessel +units=m +no_defs <> +# Yoff / UTM zone 28N +<31028> +proj=utm +zone=28 +a=6378249.2 +b=6356515 +units=m +no_defs <> +# Zanderij / UTM zone 21N +<31121> +proj=utm +zone=21 +ellps=intl +towgs84=-265,120,-358,0,0,0,0 +units=m +no_defs <> +# Zanderij / TM 54 NW +<31154> +proj=tmerc +lat_0=0 +lon_0=-54 +k=0.999600 +x_0=500000 +y_0=0 +ellps=intl +towgs84=-265,120,-358,0,0,0,0 +units=m +no_defs <> +# Zanderij / Suriname Old TM +<31170> +proj=tmerc +lat_0=0 +lon_0=-55.68333333333333 +k=0.999600 +x_0=500000 +y_0=0 +ellps=intl +towgs84=-265,120,-358,0,0,0,0 +units=m +no_defs <> +# Zanderij / Suriname TM +<31171> +proj=tmerc +lat_0=0 +lon_0=-55.68333333333333 +k=0.999900 +x_0=500000 +y_0=0 +ellps=intl +towgs84=-265,120,-358,0,0,0,0 +units=m +no_defs <> +# MGI / 3-degree Gauss zone 5 +<31265> +proj=tmerc +lat_0=0 +lon_0=15 +k=1.000000 +x_0=5500000 +y_0=0 +ellps=bessel +units=m +no_defs <> +# MGI / 3-degree Gauss zone 6 +<31266> +proj=tmerc +lat_0=0 +lon_0=18 +k=1.000000 +x_0=6500000 +y_0=0 +ellps=bessel +units=m +no_defs <> +# MGI / 3-degree Gauss zone 7 +<31267> +proj=tmerc +lat_0=0 +lon_0=21 +k=1.000000 +x_0=7500000 +y_0=0 +ellps=bessel +units=m +no_defs <> +# MGI / 3-degree Gauss zone 8 +<31268> +proj=tmerc +lat_0=0 +lon_0=24 +k=1.000000 +x_0=8500000 +y_0=0 +ellps=bessel +units=m +no_defs <> +# MGI / Balkans zone 5 +<31275> +proj=tmerc +lat_0=0 +lon_0=15 +k=0.999900 +x_0=5500000 +y_0=0 +ellps=bessel +units=m +no_defs <> +# MGI / Balkans zone 6 +<31276> +proj=tmerc +lat_0=0 +lon_0=18 +k=0.999900 +x_0=6500000 +y_0=0 +ellps=bessel +units=m +no_defs <> +# MGI / Balkans zone 7 +<31277> +proj=tmerc +lat_0=0 +lon_0=21 +k=0.999900 +x_0=7500000 +y_0=0 +ellps=bessel +units=m +no_defs <> +# MGI / Balkans zone 8 +<31278> +proj=tmerc +lat_0=0 +lon_0=21 +k=0.999900 +x_0=7500000 +y_0=0 +ellps=bessel +units=m +no_defs <> +# MGI / Balkans zone 8 +<31279> +proj=tmerc +lat_0=0 +lon_0=24 +k=0.999900 +x_0=8500000 +y_0=0 +ellps=bessel +units=m +no_defs <> +# MGI (Ferro) / Austria West Zone +<31281> +proj=tmerc +lat_0=0 +lon_0=10.33333333333333 +k=1.000000 +x_0=0 +y_0=0 +ellps=bessel +pm=ferro +units=m +no_defs <> +# MGI (Ferro) / Austria Central Zone +<31282> +proj=tmerc +lat_0=0 +lon_0=13.33333333333333 +k=1.000000 +x_0=0 +y_0=0 +ellps=bessel +pm=ferro +units=m +no_defs <> +# MGI (Ferro) / Austria East Zone +<31283> +proj=tmerc +lat_0=0 +lon_0=16.33333333333333 +k=1.000000 +x_0=0 +y_0=0 +ellps=bessel +pm=ferro +units=m +no_defs <> +# MGI / M28 +<31284> +proj=tmerc +lat_0=0 +lon_0=10.33333333333333 +k=1.000000 +x_0=150000 +y_0=0 +ellps=bessel +units=m +no_defs <> +# MGI / M31 +<31285> +proj=tmerc +lat_0=0 +lon_0=13.33333333333333 +k=1.000000 +x_0=450000 +y_0=0 +ellps=bessel +units=m +no_defs <> +# MGI / M34 +<31286> +proj=tmerc +lat_0=0 +lon_0=16.33333333333333 +k=1.000000 +x_0=750000 +y_0=0 +ellps=bessel +units=m +no_defs <> +# MGI / Austria Lambert +<31287> +proj=lcc +lat_1=49 +lat_2=46 +lat_0=47.5 +lon_0=13.33333333333333 +x_0=400000 +y_0=400000 +ellps=bessel +units=m +no_defs <> +# MGI (Ferro) / Austria West Zone +<31291> +proj=tmerc +lat_0=0 +lon_0=10.33333333333333 +k=1.000000 +x_0=0 +y_0=0 +ellps=bessel +pm=ferro +units=m +no_defs <> +# MGI (Ferro) / Austria Central Zone +<31292> +proj=tmerc +lat_0=0 +lon_0=13.33333333333333 +k=1.000000 +x_0=0 +y_0=0 +ellps=bessel +pm=ferro +units=m +no_defs <> +# MGI (Ferro) / Austria East Zone +<31293> +proj=tmerc +lat_0=0 +lon_0=16.33333333333333 +k=1.000000 +x_0=0 +y_0=0 +ellps=bessel +pm=ferro +units=m +no_defs <> +# MGI / M28 +<31294> +proj=tmerc +lat_0=0 +lon_0=10.33333333333333 +k=1.000000 +x_0=150000 +y_0=0 +ellps=bessel +units=m +no_defs <> +# MGI / M31 +<31295> +proj=tmerc +lat_0=0 +lon_0=13.33333333333333 +k=1.000000 +x_0=450000 +y_0=0 +ellps=bessel +units=m +no_defs <> +# MGI / M34 +<31296> +proj=tmerc +lat_0=0 +lon_0=16.33333333333333 +k=1.000000 +x_0=750000 +y_0=0 +ellps=bessel +units=m +no_defs <> +# MGI / Austria Lambert +<31297> +proj=lcc +lat_1=49 +lat_2=46 +lat_0=47.5 +lon_0=13.33333333333333 +x_0=400000 +y_0=400000 +ellps=bessel +units=m +no_defs <> +# Belge 1972 / Belge Lambert 72 +<31300> +proj=lcc +lat_1=49.83333333333334 +lat_2=51.16666666666666 +lat_0=90 +lon_0=4.356939722222222 +x_0=150000.01256 +y_0=5400088.4378 +ellps=intl +units=m +no_defs <> +# Belge 1972 / Belgian Lambert 72 +<31370> +proj=lcc +lat_1=51.16666723333333 +lat_2=49.8333339 +lat_0=90 +lon_0=4.367486666666666 +x_0=150000.013 +y_0=5400088.438 +ellps=intl +units=m +no_defs <> +# DHDN / 3-degree Gauss zone 1 +<31461> +proj=tmerc +lat_0=0 +lon_0=3 +k=1.000000 +x_0=1500000 +y_0=0 +ellps=bessel +units=m +no_defs <> +# DHDN / 3-degree Gauss zone 2 +<31462> +proj=tmerc +lat_0=0 +lon_0=6 +k=1.000000 +x_0=2500000 +y_0=0 +ellps=bessel +units=m +no_defs <> +# DHDN / 3-degree Gauss zone 3 +<31463> +proj=tmerc +lat_0=0 +lon_0=9 +k=1.000000 +x_0=3500000 +y_0=0 +ellps=bessel +units=m +no_defs <> +# DHDN / 3-degree Gauss zone 4 +<31464> +proj=tmerc +lat_0=0 +lon_0=12 +k=1.000000 +x_0=4500000 +y_0=0 +ellps=bessel +units=m +no_defs <> +# DHDN / 3-degree Gauss zone 5 +<31465> +proj=tmerc +lat_0=0 +lon_0=15 +k=1.000000 +x_0=5500000 +y_0=0 +ellps=bessel +units=m +no_defs <> +# DHDN / Gauss-Kruger zone 2 +<31466> +proj=tmerc +lat_0=0 +lon_0=6 +k=1.000000 +x_0=2500000 +y_0=0 +ellps=bessel +units=m +no_defs <> +# DHDN / Gauss-Kruger zone 3 +<31467> +proj=tmerc +lat_0=0 +lon_0=9 +k=1.000000 +x_0=3500000 +y_0=0 +ellps=bessel +units=m +no_defs <> +# DHDN / Gauss-Kruger zone 4 +<31468> +proj=tmerc +lat_0=0 +lon_0=12 +k=1.000000 +x_0=4500000 +y_0=0 +ellps=bessel +units=m +no_defs <> +# DHDN / Gauss-Kruger zone 5 +<31469> +proj=tmerc +lat_0=0 +lon_0=15 +k=1.000000 +x_0=5500000 +y_0=0 +ellps=bessel +units=m +no_defs <> +# Conakry 1905 / UTM zone 28N +<31528> +proj=utm +zone=28 +a=6378249.2 +b=6356515 +towgs84=-23,259,-9,0,0,0,0 +units=m +no_defs <> +# Conakry 1905 / UTM zone 29N +<31529> +proj=utm +zone=29 +a=6378249.2 +b=6356515 +towgs84=-23,259,-9,0,0,0,0 +units=m +no_defs <> +# Dealul Piscului 1933/ Stereo 33 +<31600> +proj=stere +lat_0=45.9 +lon_0=25.39246588888889 +k=0.999667 +x_0=500000 +y_0=500000 +ellps=intl +towgs84=103.25,-100.4,-307.19,0,0,0,0 +units=m +no_defs <> +# Dealul Piscului 1970/ Stereo 70 +<31700> +proj=stere +lat_0=46 +lon_0=25 +k=0.999750 +x_0=500000 +y_0=500000 +ellps=krass +units=m +no_defs <> +# NGN / UTM zone 38N +<31838> +proj=utm +zone=38 +ellps=WGS84 +units=m +no_defs <> +# NGN / UTM zone 39N +<31839> +proj=utm +zone=39 +ellps=WGS84 +units=m +no_defs <> +# KUDAMS / KTM +<31900> +proj=tmerc +lat_0=0 +lon_0=48 +k=0.999600 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# SIRGAS / UTM zone 17N +<31986> +proj=utm +zone=17 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# SIRGAS / UTM zone 18N +<31987> +proj=utm +zone=18 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# SIRGAS / UTM zone 19N +<31988> +proj=utm +zone=19 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# SIRGAS / UTM zone 20N +<31989> +proj=utm +zone=20 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# SIRGAS / UTM zone 21N +<31990> +proj=utm +zone=21 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# SIRGAS / UTM zone 22N +<31991> +proj=utm +zone=22 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# SIRGAS / UTM zone 17S +<31992> +proj=utm +zone=17 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# SIRGAS / UTM zone 18S +<31993> +proj=utm +zone=18 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# SIRGAS / UTM zone 19S +<31994> +proj=utm +zone=19 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# SIRGAS / UTM zone 20S +<31995> +proj=utm +zone=20 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# SIRGAS / UTM zone 21S +<31996> +proj=utm +zone=21 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# SIRGAS / UTM zone 22S +<31997> +proj=utm +zone=22 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# SIRGAS / UTM zone 23S +<31998> +proj=utm +zone=23 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# SIRGAS / UTM zone 24S +<31999> +proj=utm +zone=24 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# SIRGAS / UTM zone 25S +<32000> +proj=utm +zone=25 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> +# NAD27 / Montana North +<32001> +proj=lcc +lat_1=48.71666666666667 +lat_2=47.85 +lat_0=47 +lon_0=-109.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Montana Central +<32002> +proj=lcc +lat_1=47.88333333333333 +lat_2=46.45 +lat_0=45.83333333333334 +lon_0=-109.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Montana South +<32003> +proj=lcc +lat_1=46.4 +lat_2=44.86666666666667 +lat_0=44 +lon_0=-109.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Nebraska North +<32005> +proj=lcc +lat_1=41.85 +lat_2=42.81666666666667 +lat_0=41.33333333333334 +lon_0=-100 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Nebraska South +<32006> +proj=lcc +lat_1=40.28333333333333 +lat_2=41.71666666666667 +lat_0=39.66666666666666 +lon_0=-99.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Nevada East +<32007> +proj=tmerc +lat_0=34.75 +lon_0=-115.5833333333333 +k=0.999900 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Nevada Central +<32008> +proj=tmerc +lat_0=34.75 +lon_0=-116.6666666666667 +k=0.999900 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Nevada West +<32009> +proj=tmerc +lat_0=34.75 +lon_0=-118.5833333333333 +k=0.999900 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / New Hampshire +<32010> +proj=tmerc +lat_0=42.5 +lon_0=-71.66666666666667 +k=0.999967 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / New Jersey +<32011> +proj=tmerc +lat_0=38.83333333333334 +lon_0=-74.66666666666667 +k=0.999975 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / New Mexico East +<32012> +proj=tmerc +lat_0=31 +lon_0=-104.3333333333333 +k=0.999909 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / New Mexico Central +<32013> +proj=tmerc +lat_0=31 +lon_0=-106.25 +k=0.999900 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / New Mexico West +<32014> +proj=tmerc +lat_0=31 +lon_0=-107.8333333333333 +k=0.999917 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / New York East +<32015> +proj=tmerc +lat_0=40 +lon_0=-74.33333333333333 +k=0.999967 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / New York Central +<32016> +proj=tmerc +lat_0=40 +lon_0=-76.58333333333333 +k=0.999938 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / New York West +<32017> +proj=tmerc +lat_0=40 +lon_0=-78.58333333333333 +k=0.999938 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / New York Long Island +<32018> +proj=lcc +lat_1=41.03333333333333 +lat_2=40.66666666666666 +lat_0=40.5 +lon_0=-74 +x_0=304800.6096012192 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / North Carolina +<32019> +proj=lcc +lat_1=34.33333333333334 +lat_2=36.16666666666666 +lat_0=33.75 +lon_0=-79 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / North Dakota North +<32020> +proj=lcc +lat_1=47.43333333333333 +lat_2=48.73333333333333 +lat_0=47 +lon_0=-100.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / North Dakota South +<32021> +proj=lcc +lat_1=46.18333333333333 +lat_2=47.48333333333333 +lat_0=45.66666666666666 +lon_0=-100.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Ohio North +<32022> +proj=lcc +lat_1=40.43333333333333 +lat_2=41.7 +lat_0=39.66666666666666 +lon_0=-82.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Ohio South +<32023> +proj=lcc +lat_1=38.73333333333333 +lat_2=40.03333333333333 +lat_0=38 +lon_0=-82.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Oklahoma North +<32024> +proj=lcc +lat_1=35.56666666666667 +lat_2=36.76666666666667 +lat_0=35 +lon_0=-98 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Oklahoma South +<32025> +proj=lcc +lat_1=33.93333333333333 +lat_2=35.23333333333333 +lat_0=33.33333333333334 +lon_0=-98 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Oregon North +<32026> +proj=lcc +lat_1=44.33333333333334 +lat_2=46 +lat_0=43.66666666666666 +lon_0=-120.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Oregon South +<32027> +proj=lcc +lat_1=42.33333333333334 +lat_2=44 +lat_0=41.66666666666666 +lon_0=-120.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Pennsylvania North +<32028> +proj=lcc +lat_1=40.88333333333333 +lat_2=41.95 +lat_0=40.16666666666666 +lon_0=-77.75 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Pennsylvania South +<32029> +proj=lcc +lat_1=39.93333333333333 +lat_2=40.8 +lat_0=39.33333333333334 +lon_0=-77.75 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Rhode Island +<32030> +proj=tmerc +lat_0=41.08333333333334 +lon_0=-71.5 +k=0.999994 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / South Carolina North +<32031> +proj=lcc +lat_1=33.76666666666667 +lat_2=34.96666666666667 +lat_0=33 +lon_0=-81 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / South Carolina South +<32033> +proj=lcc +lat_1=32.33333333333334 +lat_2=33.66666666666666 +lat_0=31.83333333333333 +lon_0=-81 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / South Dakota North +<32034> +proj=lcc +lat_1=44.41666666666666 +lat_2=45.68333333333333 +lat_0=43.83333333333334 +lon_0=-100 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / South Dakota South +<32035> +proj=lcc +lat_1=42.83333333333334 +lat_2=44.4 +lat_0=42.33333333333334 +lon_0=-100.3333333333333 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Tennessee +<32036> +proj=lcc +lat_1=35.25 +lat_2=36.41666666666666 +lat_0=34.66666666666666 +lon_0=-86 +x_0=30480.06096012192 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Texas North +<32037> +proj=lcc +lat_1=34.65 +lat_2=36.18333333333333 +lat_0=34 +lon_0=-101.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Texas North Central +<32038> +proj=lcc +lat_1=32.13333333333333 +lat_2=33.96666666666667 +lat_0=31.66666666666667 +lon_0=-97.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Texas Central +<32039> +proj=lcc +lat_1=30.11666666666667 +lat_2=31.88333333333333 +lat_0=29.66666666666667 +lon_0=-100.3333333333333 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Texas South Central +<32040> +proj=lcc +lat_1=28.38333333333333 +lat_2=30.28333333333333 +lat_0=27.83333333333333 +lon_0=-99 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Texas South +<32041> +proj=lcc +lat_1=26.16666666666667 +lat_2=27.83333333333333 +lat_0=25.66666666666667 +lon_0=-98.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Utah North +<32042> +proj=lcc +lat_1=40.71666666666667 +lat_2=41.78333333333333 +lat_0=40.33333333333334 +lon_0=-111.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Utah Central +<32043> +proj=lcc +lat_1=39.01666666666667 +lat_2=40.65 +lat_0=38.33333333333334 +lon_0=-111.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Utah South +<32044> +proj=lcc +lat_1=37.21666666666667 +lat_2=38.35 +lat_0=36.66666666666666 +lon_0=-111.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Vermont +<32045> +proj=tmerc +lat_0=42.5 +lon_0=-72.5 +k=0.999964 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Virginia North +<32046> +proj=lcc +lat_1=38.03333333333333 +lat_2=39.2 +lat_0=37.66666666666666 +lon_0=-78.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Virginia South +<32047> +proj=lcc +lat_1=36.76666666666667 +lat_2=37.96666666666667 +lat_0=36.33333333333334 +lon_0=-78.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Washington North +<32048> +proj=lcc +lat_1=47.5 +lat_2=48.73333333333333 +lat_0=47 +lon_0=-120.8333333333333 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Washington South +<32049> +proj=lcc +lat_1=45.83333333333334 +lat_2=47.33333333333334 +lat_0=45.33333333333334 +lon_0=-120.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / West Virginia North +<32050> +proj=lcc +lat_1=39 +lat_2=40.25 +lat_0=38.5 +lon_0=-79.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / West Virginia South +<32051> +proj=lcc +lat_1=37.48333333333333 +lat_2=38.88333333333333 +lat_0=37 +lon_0=-81 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Wisconsin North +<32052> +proj=lcc +lat_1=45.56666666666667 +lat_2=46.76666666666667 +lat_0=45.16666666666666 +lon_0=-90 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Wisconsin Central +<32053> +proj=lcc +lat_1=44.25 +lat_2=45.5 +lat_0=43.83333333333334 +lon_0=-90 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Wisconsin South +<32054> +proj=lcc +lat_1=42.73333333333333 +lat_2=44.06666666666667 +lat_0=42 +lon_0=-90 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Wyoming East +<32055> +proj=tmerc +lat_0=40.66666666666666 +lon_0=-105.1666666666667 +k=0.999941 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Wyoming East Central +<32056> +proj=tmerc +lat_0=40.66666666666666 +lon_0=-107.3333333333333 +k=0.999941 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Wyoming West Central +<32057> +proj=tmerc +lat_0=40.66666666666666 +lon_0=-108.75 +k=0.999941 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Wyoming West +<32058> +proj=tmerc +lat_0=40.66666666666666 +lon_0=-110.0833333333333 +k=0.999941 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / Guatemala Norte +<32061> +proj=lcc +lat_1=16.81666666666667 +lat_0=16.81666666666667 +lon_0=-90.33333333333333 +k_0=0.99992226 +x_0=500000 +y_0=292209.579 +ellps=clrk66 +datum=NAD27 +units=m +no_defs <> +# NAD27 / Guatemala Sur +<32062> +proj=lcc +lat_1=14.9 +lat_0=14.9 +lon_0=-90.33333333333333 +k_0=0.99989906 +x_0=500000 +y_0=325992.681 +ellps=clrk66 +datum=NAD27 +units=m +no_defs <> +# NAD27 / BLM 14N (ftUS) +<32064> +proj=tmerc +lat_0=0 +lon_0=-99 +k=0.999600 +x_0=500000.001016002 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / BLM 15N (ftUS) +<32065> +proj=tmerc +lat_0=0 +lon_0=-93 +k=0.999600 +x_0=500000.001016002 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / BLM 16N (ftUS) +<32066> +proj=tmerc +lat_0=0 +lon_0=-87 +k=0.999600 +x_0=500000.001016002 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / BLM 17N (ftUS) +<32067> +proj=tmerc +lat_0=0 +lon_0=-81 +k=0.999600 +x_0=500000.001016002 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / BLM 14N (feet) +<32074> +proj=tmerc +lat_0=0 +lon_0=-99 +k=0.999600 +x_0=500000.001016002 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / BLM 15N (feet) +<32075> +proj=tmerc +lat_0=0 +lon_0=-93 +k=0.999600 +x_0=500000.001016002 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / BLM 16N (feet) +<32076> +proj=tmerc +lat_0=0 +lon_0=-87 +k=0.999600 +x_0=500000.001016002 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / BLM 17N (feet) +<32077> +proj=tmerc +lat_0=0 +lon_0=-81 +k=0.999600 +x_0=500000.001016002 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD27 / MTM zone 1 +<32081> +proj=tmerc +lat_0=0 +lon_0=-53 +k=0.999900 +x_0=304800 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=m +no_defs <> +# NAD27 / MTM zone 2 +<32082> +proj=tmerc +lat_0=0 +lon_0=-56 +k=0.999900 +x_0=304800 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=m +no_defs <> +# NAD27 / MTM zone 3 +<32083> +proj=tmerc +lat_0=0 +lon_0=-58.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=m +no_defs <> +# NAD27 / MTM zone 4 +<32084> +proj=tmerc +lat_0=0 +lon_0=-61.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=m +no_defs <> +# NAD27 / MTM zone 5 +<32085> +proj=tmerc +lat_0=0 +lon_0=-64.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=m +no_defs <> +# NAD27 / MTM zone 6 +<32086> +proj=tmerc +lat_0=0 +lon_0=-67.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=m +no_defs <> +# NAD27 / Quebec Lambert +<32098> +proj=lcc +lat_1=60 +lat_2=46 +lat_0=44 +lon_0=-68.5 +x_0=0 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=m +no_defs <> +# NAD83 / Montana +<32100> +proj=lcc +lat_1=49 +lat_2=45 +lat_0=44.25 +lon_0=-109.5 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Nebraska +<32104> +proj=lcc +lat_1=43 +lat_2=40 +lat_0=39.83333333333334 +lon_0=-100 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Nevada East +<32107> +proj=tmerc +lat_0=34.75 +lon_0=-115.5833333333333 +k=0.999900 +x_0=200000 +y_0=8000000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Nevada Central +<32108> +proj=tmerc +lat_0=34.75 +lon_0=-116.6666666666667 +k=0.999900 +x_0=500000 +y_0=6000000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Nevada West +<32109> +proj=tmerc +lat_0=34.75 +lon_0=-118.5833333333333 +k=0.999900 +x_0=800000 +y_0=4000000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / New Hampshire +<32110> +proj=tmerc +lat_0=42.5 +lon_0=-71.66666666666667 +k=0.999967 +x_0=300000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / New Jersey +<32111> +proj=tmerc +lat_0=38.83333333333334 +lon_0=-74.5 +k=0.999900 +x_0=150000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / New Mexico East +<32112> +proj=tmerc +lat_0=31 +lon_0=-104.3333333333333 +k=0.999909 +x_0=165000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / New Mexico Central +<32113> +proj=tmerc +lat_0=31 +lon_0=-106.25 +k=0.999900 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / New Mexico West +<32114> +proj=tmerc +lat_0=31 +lon_0=-107.8333333333333 +k=0.999917 +x_0=830000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / New York East +<32115> +proj=tmerc +lat_0=38.83333333333334 +lon_0=-74.5 +k=0.999900 +x_0=150000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / New York Central +<32116> +proj=tmerc +lat_0=40 +lon_0=-76.58333333333333 +k=0.999938 +x_0=250000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / New York West +<32117> +proj=tmerc +lat_0=40 +lon_0=-78.58333333333333 +k=0.999938 +x_0=350000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / New York Long Island +<32118> +proj=lcc +lat_1=41.03333333333333 +lat_2=40.66666666666666 +lat_0=40.16666666666666 +lon_0=-74 +x_0=300000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / North Carolina +<32119> +proj=lcc +lat_1=36.16666666666666 +lat_2=34.33333333333334 +lat_0=33.75 +lon_0=-79 +x_0=609601.22 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / North Dakota North +<32120> +proj=lcc +lat_1=48.73333333333333 +lat_2=47.43333333333333 +lat_0=47 +lon_0=-100.5 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / North Dakota South +<32121> +proj=lcc +lat_1=47.48333333333333 +lat_2=46.18333333333333 +lat_0=45.66666666666666 +lon_0=-100.5 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Ohio North +<32122> +proj=lcc +lat_1=41.7 +lat_2=40.43333333333333 +lat_0=39.66666666666666 +lon_0=-82.5 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Ohio South +<32123> +proj=lcc +lat_1=40.03333333333333 +lat_2=38.73333333333333 +lat_0=38 +lon_0=-82.5 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Oklahoma North +<32124> +proj=lcc +lat_1=36.76666666666667 +lat_2=35.56666666666667 +lat_0=35 +lon_0=-98 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Oklahoma South +<32125> +proj=lcc +lat_1=35.23333333333333 +lat_2=33.93333333333333 +lat_0=33.33333333333334 +lon_0=-98 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Oregon North +<32126> +proj=lcc +lat_1=46 +lat_2=44.33333333333334 +lat_0=43.66666666666666 +lon_0=-120.5 +x_0=2500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Oregon South +<32127> +proj=lcc +lat_1=44 +lat_2=42.33333333333334 +lat_0=41.66666666666666 +lon_0=-120.5 +x_0=1500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Pennsylvania North +<32128> +proj=lcc +lat_1=41.95 +lat_2=40.88333333333333 +lat_0=40.16666666666666 +lon_0=-77.75 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Pennsylvania South +<32129> +proj=lcc +lat_1=40.96666666666667 +lat_2=39.93333333333333 +lat_0=39.33333333333334 +lon_0=-77.75 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Rhode Island +<32130> +proj=tmerc +lat_0=41.08333333333334 +lon_0=-71.5 +k=0.999994 +x_0=100000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / South Carolina +<32133> +proj=lcc +lat_1=34.83333333333334 +lat_2=32.5 +lat_0=31.83333333333333 +lon_0=-81 +x_0=609600 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / South Dakota North +<32134> +proj=lcc +lat_1=45.68333333333333 +lat_2=44.41666666666666 +lat_0=43.83333333333334 +lon_0=-100 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / South Dakota South +<32135> +proj=lcc +lat_1=44.4 +lat_2=42.83333333333334 +lat_0=42.33333333333334 +lon_0=-100.3333333333333 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Tennessee +<32136> +proj=lcc +lat_1=36.41666666666666 +lat_2=35.25 +lat_0=34.33333333333334 +lon_0=-86 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Texas North +<32137> +proj=lcc +lat_1=36.18333333333333 +lat_2=34.65 +lat_0=34 +lon_0=-101.5 +x_0=200000 +y_0=1000000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Texas North Central +<32138> +proj=lcc +lat_1=33.96666666666667 +lat_2=32.13333333333333 +lat_0=31.66666666666667 +lon_0=-98.5 +x_0=600000 +y_0=2000000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Texas Central +<32139> +proj=lcc +lat_1=31.88333333333333 +lat_2=30.11666666666667 +lat_0=29.66666666666667 +lon_0=-100.3333333333333 +x_0=700000 +y_0=3000000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Texas South Central +<32140> +proj=lcc +lat_1=30.28333333333333 +lat_2=28.38333333333333 +lat_0=27.83333333333333 +lon_0=-99 +x_0=600000 +y_0=4000000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Texas South +<32141> +proj=lcc +lat_1=27.83333333333333 +lat_2=26.16666666666667 +lat_0=25.66666666666667 +lon_0=-98.5 +x_0=300000 +y_0=5000000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Utah North +<32142> +proj=lcc +lat_1=41.78333333333333 +lat_2=40.71666666666667 +lat_0=40.33333333333334 +lon_0=-111.5 +x_0=500000 +y_0=1000000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Utah Central +<32143> +proj=lcc +lat_1=40.65 +lat_2=39.01666666666667 +lat_0=38.33333333333334 +lon_0=-111.5 +x_0=500000 +y_0=2000000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Utah South +<32144> +proj=lcc +lat_1=38.35 +lat_2=37.21666666666667 +lat_0=36.66666666666666 +lon_0=-111.5 +x_0=500000 +y_0=3000000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Vermont +<32145> +proj=tmerc +lat_0=42.5 +lon_0=-72.5 +k=0.999964 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Virginia North +<32146> +proj=lcc +lat_1=39.2 +lat_2=38.03333333333333 +lat_0=37.66666666666666 +lon_0=-78.5 +x_0=3500000 +y_0=2000000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Virginia South +<32147> +proj=lcc +lat_1=37.96666666666667 +lat_2=36.76666666666667 +lat_0=36.33333333333334 +lon_0=-78.5 +x_0=3500000 +y_0=1000000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Washington North +<32148> +proj=lcc +lat_1=48.73333333333333 +lat_2=47.5 +lat_0=47 +lon_0=-120.8333333333333 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Washington South +<32149> +proj=lcc +lat_1=47.33333333333334 +lat_2=45.83333333333334 +lat_0=45.33333333333334 +lon_0=-120.5 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / West Virginia North +<32150> +proj=lcc +lat_1=40.25 +lat_2=39 +lat_0=38.5 +lon_0=-79.5 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / West Virginia South +<32151> +proj=lcc +lat_1=38.88333333333333 +lat_2=37.48333333333333 +lat_0=37 +lon_0=-81 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Wisconsin North +<32152> +proj=lcc +lat_1=46.76666666666667 +lat_2=45.56666666666667 +lat_0=45.16666666666666 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Wisconsin Central +<32153> +proj=lcc +lat_1=45.5 +lat_2=44.25 +lat_0=43.83333333333334 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Wisconsin South +<32154> +proj=lcc +lat_1=44.06666666666667 +lat_2=42.73333333333333 +lat_0=42 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Wyoming East +<32155> +proj=tmerc +lat_0=40.5 +lon_0=-105.1666666666667 +k=0.999938 +x_0=200000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Wyoming East Central +<32156> +proj=tmerc +lat_0=40.5 +lon_0=-107.3333333333333 +k=0.999938 +x_0=400000 +y_0=100000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Wyoming West Central +<32157> +proj=tmerc +lat_0=40.5 +lon_0=-108.75 +k=0.999938 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Wyoming West +<32158> +proj=tmerc +lat_0=40.5 +lon_0=-110.0833333333333 +k=0.999938 +x_0=800000 +y_0=100000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Puerto Rico & Virgin Is. +<32161> +proj=lcc +lat_1=18.43333333333333 +lat_2=18.03333333333333 +lat_0=17.83333333333333 +lon_0=-66.43333333333334 +x_0=200000 +y_0=200000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / SCoPQ zone 2 +<32180> +proj=tmerc +lat_0=0 +lon_0=-55.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / MTM zone 1 +<32181> +proj=tmerc +lat_0=0 +lon_0=-53 +k=0.999900 +x_0=304800 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / MTM zone 2 +<32182> +proj=tmerc +lat_0=0 +lon_0=-56 +k=0.999900 +x_0=304800 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / MTM zone 3 +<32183> +proj=tmerc +lat_0=0 +lon_0=-58.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / MTM zone 4 +<32184> +proj=tmerc +lat_0=0 +lon_0=-61.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / MTM zone 5 +<32185> +proj=tmerc +lat_0=0 +lon_0=-64.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / MTM zone 6 +<32186> +proj=tmerc +lat_0=0 +lon_0=-67.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / MTM zone 7 +<32187> +proj=tmerc +lat_0=0 +lon_0=-70.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / MTM zone 8 +<32188> +proj=tmerc +lat_0=0 +lon_0=-73.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / MTM zone 9 +<32189> +proj=tmerc +lat_0=0 +lon_0=-76.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / MTM zone 10 +<32190> +proj=tmerc +lat_0=0 +lon_0=-79.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / MTM zone 11 +<32191> +proj=tmerc +lat_0=0 +lon_0=-82.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / MTM zone 12 +<32192> +proj=tmerc +lat_0=0 +lon_0=-81 +k=0.999900 +x_0=304800 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / MTM zone 13 +<32193> +proj=tmerc +lat_0=0 +lon_0=-84 +k=0.999900 +x_0=304800 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / MTM zone 14 +<32194> +proj=tmerc +lat_0=0 +lon_0=-87 +k=0.999900 +x_0=304800 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / MTM zone 15 +<32195> +proj=tmerc +lat_0=0 +lon_0=-90 +k=0.999900 +x_0=304800 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / MTM zone 16 +<32196> +proj=tmerc +lat_0=0 +lon_0=-93 +k=0.999900 +x_0=304800 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / MTM zone 17 +<32197> +proj=tmerc +lat_0=0 +lon_0=-96 +k=0.999900 +x_0=304800 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NAD83 / Quebec Lambert +<32198> +proj=lcc +lat_1=60 +lat_2=46 +lat_0=44 +lon_0=-68.5 +x_0=0 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# WGS 72 / UTM zone 1N +<32201> +proj=utm +zone=1 +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 2N +<32202> +proj=utm +zone=2 +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 3N +<32203> +proj=utm +zone=3 +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 4N +<32204> +proj=utm +zone=4 +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 5N +<32205> +proj=utm +zone=5 +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 6N +<32206> +proj=utm +zone=6 +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 7N +<32207> +proj=utm +zone=7 +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 8N +<32208> +proj=utm +zone=8 +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 9N +<32209> +proj=utm +zone=9 +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 10N +<32210> +proj=utm +zone=10 +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 11N +<32211> +proj=utm +zone=11 +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 12N +<32212> +proj=utm +zone=12 +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 13N +<32213> +proj=utm +zone=13 +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 14N +<32214> +proj=utm +zone=14 +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 15N +<32215> +proj=utm +zone=15 +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 16N +<32216> +proj=utm +zone=16 +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 17N +<32217> +proj=utm +zone=17 +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 18N +<32218> +proj=utm +zone=18 +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 19N +<32219> +proj=utm +zone=19 +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 20N +<32220> +proj=utm +zone=20 +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 21N +<32221> +proj=utm +zone=21 +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 22N +<32222> +proj=utm +zone=22 +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 23N +<32223> +proj=utm +zone=23 +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 24N +<32224> +proj=utm +zone=24 +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 25N +<32225> +proj=utm +zone=25 +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 26N +<32226> +proj=utm +zone=26 +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 27N +<32227> +proj=utm +zone=27 +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 28N +<32228> +proj=utm +zone=28 +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 29N +<32229> +proj=utm +zone=29 +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 30N +<32230> +proj=utm +zone=30 +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 31N +<32231> +proj=utm +zone=31 +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 32N +<32232> +proj=utm +zone=32 +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 33N +<32233> +proj=utm +zone=33 +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 34N +<32234> +proj=utm +zone=34 +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 35N +<32235> +proj=utm +zone=35 +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 36N +<32236> +proj=utm +zone=36 +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 37N +<32237> +proj=utm +zone=37 +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 38N +<32238> +proj=utm +zone=38 +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 39N +<32239> +proj=utm +zone=39 +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 40N +<32240> +proj=utm +zone=40 +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 41N +<32241> +proj=utm +zone=41 +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 42N +<32242> +proj=utm +zone=42 +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 43N +<32243> +proj=utm +zone=43 +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 44N +<32244> +proj=utm +zone=44 +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 45N +<32245> +proj=utm +zone=45 +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 46N +<32246> +proj=utm +zone=46 +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 47N +<32247> +proj=utm +zone=47 +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 48N +<32248> +proj=utm +zone=48 +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 49N +<32249> +proj=utm +zone=49 +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 50N +<32250> +proj=utm +zone=50 +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 51N +<32251> +proj=utm +zone=51 +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 52N +<32252> +proj=utm +zone=52 +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 53N +<32253> +proj=utm +zone=53 +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 54N +<32254> +proj=utm +zone=54 +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 55N +<32255> +proj=utm +zone=55 +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 56N +<32256> +proj=utm +zone=56 +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 57N +<32257> +proj=utm +zone=57 +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 58N +<32258> +proj=utm +zone=58 +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 59N +<32259> +proj=utm +zone=59 +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 60N +<32260> +proj=utm +zone=60 +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 1S +<32301> +proj=utm +zone=1 +south +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 2S +<32302> +proj=utm +zone=2 +south +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 3S +<32303> +proj=utm +zone=3 +south +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 4S +<32304> +proj=utm +zone=4 +south +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 5S +<32305> +proj=utm +zone=5 +south +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 6S +<32306> +proj=utm +zone=6 +south +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 7S +<32307> +proj=utm +zone=7 +south +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 8S +<32308> +proj=utm +zone=8 +south +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 9S +<32309> +proj=utm +zone=9 +south +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 10S +<32310> +proj=utm +zone=10 +south +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 11S +<32311> +proj=utm +zone=11 +south +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 12S +<32312> +proj=utm +zone=12 +south +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 13S +<32313> +proj=utm +zone=13 +south +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 14S +<32314> +proj=utm +zone=14 +south +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 15S +<32315> +proj=utm +zone=15 +south +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 16S +<32316> +proj=utm +zone=16 +south +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 17S +<32317> +proj=utm +zone=17 +south +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 18S +<32318> +proj=utm +zone=18 +south +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 19S +<32319> +proj=utm +zone=19 +south +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 20S +<32320> +proj=utm +zone=20 +south +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 21S +<32321> +proj=utm +zone=21 +south +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 22S +<32322> +proj=utm +zone=22 +south +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 23S +<32323> +proj=utm +zone=23 +south +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 24S +<32324> +proj=utm +zone=24 +south +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 25S +<32325> +proj=utm +zone=25 +south +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 26S +<32326> +proj=utm +zone=26 +south +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 27S +<32327> +proj=utm +zone=27 +south +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 28S +<32328> +proj=utm +zone=28 +south +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 29S +<32329> +proj=utm +zone=29 +south +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 30S +<32330> +proj=utm +zone=30 +south +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 31S +<32331> +proj=utm +zone=31 +south +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 32S +<32332> +proj=utm +zone=32 +south +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 33S +<32333> +proj=utm +zone=33 +south +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 34S +<32334> +proj=utm +zone=34 +south +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 35S +<32335> +proj=utm +zone=35 +south +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 36S +<32336> +proj=utm +zone=36 +south +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 37S +<32337> +proj=utm +zone=37 +south +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 38S +<32338> +proj=utm +zone=38 +south +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 39S +<32339> +proj=utm +zone=39 +south +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 40S +<32340> +proj=utm +zone=40 +south +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 41S +<32341> +proj=utm +zone=41 +south +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 42S +<32342> +proj=utm +zone=42 +south +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 43S +<32343> +proj=utm +zone=43 +south +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 44S +<32344> +proj=utm +zone=44 +south +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 45S +<32345> +proj=utm +zone=45 +south +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 46S +<32346> +proj=utm +zone=46 +south +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 47S +<32347> +proj=utm +zone=47 +south +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 48S +<32348> +proj=utm +zone=48 +south +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 49S +<32349> +proj=utm +zone=49 +south +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 50S +<32350> +proj=utm +zone=50 +south +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 51S +<32351> +proj=utm +zone=51 +south +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 52S +<32352> +proj=utm +zone=52 +south +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 53S +<32353> +proj=utm +zone=53 +south +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 54S +<32354> +proj=utm +zone=54 +south +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 55S +<32355> +proj=utm +zone=55 +south +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 56S +<32356> +proj=utm +zone=56 +south +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 57S +<32357> +proj=utm +zone=57 +south +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 58S +<32358> +proj=utm +zone=58 +south +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 59S +<32359> +proj=utm +zone=59 +south +ellps=WGS72 +units=m +no_defs <> +# WGS 72 / UTM zone 60S +<32360> +proj=utm +zone=60 +south +ellps=WGS72 +units=m +no_defs <> +# WGS 72BE / UTM zone 1N +<32401> +proj=utm +zone=1 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 2N +<32402> +proj=utm +zone=2 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 3N +<32403> +proj=utm +zone=3 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 4N +<32404> +proj=utm +zone=4 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 5N +<32405> +proj=utm +zone=5 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 6N +<32406> +proj=utm +zone=6 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 7N +<32407> +proj=utm +zone=7 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 8N +<32408> +proj=utm +zone=8 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 9N +<32409> +proj=utm +zone=9 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 10N +<32410> +proj=utm +zone=10 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 11N +<32411> +proj=utm +zone=11 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 12N +<32412> +proj=utm +zone=12 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 13N +<32413> +proj=utm +zone=13 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 14N +<32414> +proj=utm +zone=14 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 15N +<32415> +proj=utm +zone=15 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 16N +<32416> +proj=utm +zone=16 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 17N +<32417> +proj=utm +zone=17 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 18N +<32418> +proj=utm +zone=18 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 19N +<32419> +proj=utm +zone=19 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 20N +<32420> +proj=utm +zone=20 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 21N +<32421> +proj=utm +zone=21 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 22N +<32422> +proj=utm +zone=22 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 23N +<32423> +proj=utm +zone=23 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 24N +<32424> +proj=utm +zone=24 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 25N +<32425> +proj=utm +zone=25 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 26N +<32426> +proj=utm +zone=26 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 27N +<32427> +proj=utm +zone=27 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 28N +<32428> +proj=utm +zone=28 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 29N +<32429> +proj=utm +zone=29 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 30N +<32430> +proj=utm +zone=30 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 31N +<32431> +proj=utm +zone=31 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 32N +<32432> +proj=utm +zone=32 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 33N +<32433> +proj=utm +zone=33 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 34N +<32434> +proj=utm +zone=34 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 35N +<32435> +proj=utm +zone=35 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 36N +<32436> +proj=utm +zone=36 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 37N +<32437> +proj=utm +zone=37 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 38N +<32438> +proj=utm +zone=38 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 39N +<32439> +proj=utm +zone=39 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 40N +<32440> +proj=utm +zone=40 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 41N +<32441> +proj=utm +zone=41 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 42N +<32442> +proj=utm +zone=42 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 43N +<32443> +proj=utm +zone=43 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 44N +<32444> +proj=utm +zone=44 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 45N +<32445> +proj=utm +zone=45 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 46N +<32446> +proj=utm +zone=46 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 47N +<32447> +proj=utm +zone=47 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 48N +<32448> +proj=utm +zone=48 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 49N +<32449> +proj=utm +zone=49 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 50N +<32450> +proj=utm +zone=50 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 51N +<32451> +proj=utm +zone=51 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 52N +<32452> +proj=utm +zone=52 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 53N +<32453> +proj=utm +zone=53 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 54N +<32454> +proj=utm +zone=54 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 55N +<32455> +proj=utm +zone=55 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 56N +<32456> +proj=utm +zone=56 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 57N +<32457> +proj=utm +zone=57 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 58N +<32458> +proj=utm +zone=58 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 59N +<32459> +proj=utm +zone=59 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 60N +<32460> +proj=utm +zone=60 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 1S +<32501> +proj=utm +zone=1 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 2S +<32502> +proj=utm +zone=2 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 3S +<32503> +proj=utm +zone=3 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 4S +<32504> +proj=utm +zone=4 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 5S +<32505> +proj=utm +zone=5 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 6S +<32506> +proj=utm +zone=6 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 7S +<32507> +proj=utm +zone=7 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 8S +<32508> +proj=utm +zone=8 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 9S +<32509> +proj=utm +zone=9 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 10S +<32510> +proj=utm +zone=10 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 11S +<32511> +proj=utm +zone=11 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 12S +<32512> +proj=utm +zone=12 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 13S +<32513> +proj=utm +zone=13 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 14S +<32514> +proj=utm +zone=14 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 15S +<32515> +proj=utm +zone=15 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 16S +<32516> +proj=utm +zone=16 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 17S +<32517> +proj=utm +zone=17 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 18S +<32518> +proj=utm +zone=18 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 19S +<32519> +proj=utm +zone=19 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 20S +<32520> +proj=utm +zone=20 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 21S +<32521> +proj=utm +zone=21 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 22S +<32522> +proj=utm +zone=22 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 23S +<32523> +proj=utm +zone=23 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 24S +<32524> +proj=utm +zone=24 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 25S +<32525> +proj=utm +zone=25 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 26S +<32526> +proj=utm +zone=26 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 27S +<32527> +proj=utm +zone=27 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 28S +<32528> +proj=utm +zone=28 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 29S +<32529> +proj=utm +zone=29 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 30S +<32530> +proj=utm +zone=30 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 31S +<32531> +proj=utm +zone=31 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 32S +<32532> +proj=utm +zone=32 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 33S +<32533> +proj=utm +zone=33 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 34S +<32534> +proj=utm +zone=34 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 35S +<32535> +proj=utm +zone=35 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 36S +<32536> +proj=utm +zone=36 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 37S +<32537> +proj=utm +zone=37 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 38S +<32538> +proj=utm +zone=38 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 39S +<32539> +proj=utm +zone=39 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 40S +<32540> +proj=utm +zone=40 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 41S +<32541> +proj=utm +zone=41 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 42S +<32542> +proj=utm +zone=42 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 43S +<32543> +proj=utm +zone=43 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 44S +<32544> +proj=utm +zone=44 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 45S +<32545> +proj=utm +zone=45 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 46S +<32546> +proj=utm +zone=46 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 47S +<32547> +proj=utm +zone=47 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 48S +<32548> +proj=utm +zone=48 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 49S +<32549> +proj=utm +zone=49 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 50S +<32550> +proj=utm +zone=50 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 51S +<32551> +proj=utm +zone=51 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 52S +<32552> +proj=utm +zone=52 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 53S +<32553> +proj=utm +zone=53 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 54S +<32554> +proj=utm +zone=54 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 55S +<32555> +proj=utm +zone=55 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 56S +<32556> +proj=utm +zone=56 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 57S +<32557> +proj=utm +zone=57 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 58S +<32558> +proj=utm +zone=58 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 59S +<32559> +proj=utm +zone=59 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 72BE / UTM zone 60S +<32560> +proj=utm +zone=60 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> +# WGS 84 / UTM zone 1N +<32601> +proj=utm +zone=1 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 2N +<32602> +proj=utm +zone=2 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 3N +<32603> +proj=utm +zone=3 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 4N +<32604> +proj=utm +zone=4 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 5N +<32605> +proj=utm +zone=5 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 6N +<32606> +proj=utm +zone=6 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 7N +<32607> +proj=utm +zone=7 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 8N +<32608> +proj=utm +zone=8 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 9N +<32609> +proj=utm +zone=9 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 10N +<32610> +proj=utm +zone=10 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 11N +<32611> +proj=utm +zone=11 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 12N +<32612> +proj=utm +zone=12 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 13N +<32613> +proj=utm +zone=13 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 14N +<32614> +proj=utm +zone=14 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 15N +<32615> +proj=utm +zone=15 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 16N +<32616> +proj=utm +zone=16 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 17N +<32617> +proj=utm +zone=17 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 18N +<32618> +proj=utm +zone=18 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 19N +<32619> +proj=utm +zone=19 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 20N +<32620> +proj=utm +zone=20 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 21N +<32621> +proj=utm +zone=21 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 22N +<32622> +proj=utm +zone=22 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 23N +<32623> +proj=utm +zone=23 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 24N +<32624> +proj=utm +zone=24 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 25N +<32625> +proj=utm +zone=25 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 26N +<32626> +proj=utm +zone=26 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 27N +<32627> +proj=utm +zone=27 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 28N +<32628> +proj=utm +zone=28 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 29N +<32629> +proj=utm +zone=29 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 30N +<32630> +proj=utm +zone=30 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 31N +<32631> +proj=utm +zone=31 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 32N +<32632> +proj=utm +zone=32 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 33N +<32633> +proj=utm +zone=33 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 34N +<32634> +proj=utm +zone=34 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 35N +<32635> +proj=utm +zone=35 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 36N +<32636> +proj=utm +zone=36 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 37N +<32637> +proj=utm +zone=37 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 38N +<32638> +proj=utm +zone=38 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 39N +<32639> +proj=utm +zone=39 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 40N +<32640> +proj=utm +zone=40 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 41N +<32641> +proj=utm +zone=41 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 42N +<32642> +proj=utm +zone=42 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 43N +<32643> +proj=utm +zone=43 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 44N +<32644> +proj=utm +zone=44 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 45N +<32645> +proj=utm +zone=45 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 46N +<32646> +proj=utm +zone=46 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 47N +<32647> +proj=utm +zone=47 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 48N +<32648> +proj=utm +zone=48 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 49N +<32649> +proj=utm +zone=49 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 50N +<32650> +proj=utm +zone=50 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 51N +<32651> +proj=utm +zone=51 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 52N +<32652> +proj=utm +zone=52 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 53N +<32653> +proj=utm +zone=53 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 54N +<32654> +proj=utm +zone=54 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 55N +<32655> +proj=utm +zone=55 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 56N +<32656> +proj=utm +zone=56 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 57N +<32657> +proj=utm +zone=57 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 58N +<32658> +proj=utm +zone=58 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 59N +<32659> +proj=utm +zone=59 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 60N +<32660> +proj=utm +zone=60 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UPS North +<32661> +proj=stere +lat_0=90 +lat_ts=90 +lon_0=0 +k=0.994 +x_0=2000000 +y_0=2000000 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 1S +<32701> +proj=utm +zone=1 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 2S +<32702> +proj=utm +zone=2 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 3S +<32703> +proj=utm +zone=3 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 4S +<32704> +proj=utm +zone=4 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 5S +<32705> +proj=utm +zone=5 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 6S +<32706> +proj=utm +zone=6 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 7S +<32707> +proj=utm +zone=7 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 8S +<32708> +proj=utm +zone=8 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 9S +<32709> +proj=utm +zone=9 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 10S +<32710> +proj=utm +zone=10 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 11S +<32711> +proj=utm +zone=11 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 12S +<32712> +proj=utm +zone=12 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 13S +<32713> +proj=utm +zone=13 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 14S +<32714> +proj=utm +zone=14 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 15S +<32715> +proj=utm +zone=15 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 16S +<32716> +proj=utm +zone=16 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 17S +<32717> +proj=utm +zone=17 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 18S +<32718> +proj=utm +zone=18 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 19S +<32719> +proj=utm +zone=19 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 20S +<32720> +proj=utm +zone=20 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 21S +<32721> +proj=utm +zone=21 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 22S +<32722> +proj=utm +zone=22 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 23S +<32723> +proj=utm +zone=23 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 24S +<32724> +proj=utm +zone=24 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 25S +<32725> +proj=utm +zone=25 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 26S +<32726> +proj=utm +zone=26 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 27S +<32727> +proj=utm +zone=27 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 28S +<32728> +proj=utm +zone=28 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 29S +<32729> +proj=utm +zone=29 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 30S +<32730> +proj=utm +zone=30 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 31S +<32731> +proj=utm +zone=31 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 32S +<32732> +proj=utm +zone=32 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 33S +<32733> +proj=utm +zone=33 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 34S +<32734> +proj=utm +zone=34 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 35S +<32735> +proj=utm +zone=35 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 36S +<32736> +proj=utm +zone=36 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 37S +<32737> +proj=utm +zone=37 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 38S +<32738> +proj=utm +zone=38 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 39S +<32739> +proj=utm +zone=39 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 40S +<32740> +proj=utm +zone=40 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 41S +<32741> +proj=utm +zone=41 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 42S +<32742> +proj=utm +zone=42 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 43S +<32743> +proj=utm +zone=43 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 44S +<32744> +proj=utm +zone=44 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 45S +<32745> +proj=utm +zone=45 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 46S +<32746> +proj=utm +zone=46 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 47S +<32747> +proj=utm +zone=47 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 48S +<32748> +proj=utm +zone=48 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 49S +<32749> +proj=utm +zone=49 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 50S +<32750> +proj=utm +zone=50 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 51S +<32751> +proj=utm +zone=51 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 52S +<32752> +proj=utm +zone=52 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 53S +<32753> +proj=utm +zone=53 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 54S +<32754> +proj=utm +zone=54 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 55S +<32755> +proj=utm +zone=55 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 56S +<32756> +proj=utm +zone=56 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 57S +<32757> +proj=utm +zone=57 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 58S +<32758> +proj=utm +zone=58 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 59S +<32759> +proj=utm +zone=59 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UTM zone 60S +<32760> +proj=utm +zone=60 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / UPS South +<32761> +proj=stere +lat_0=-90 +lat_ts=-90 +lon_0=0 +k=0.994 +x_0=2000000 +y_0=2000000 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# WGS 84 / TM 36 SE +<32766> +proj=tmerc +lat_0=0 +lon_0=36 +k=0.999600 +x_0=500000 +y_0=10000000 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# Pulkovo 1995 GK Zone 2 +<20002> +proj=tmerc +lat_0=0 +lon_0=9 +k=1.000000 +x_0=2500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 GK Zone 3 +<20003> +proj=tmerc +lat_0=0 +lon_0=15 +k=1.000000 +x_0=3500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 GK Zone 2N +<20062> +proj=tmerc +lat_0=0 +lon_0=9 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# Pulkovo 1995 GK Zone 3N +<20063> +proj=tmerc +lat_0=0 +lon_0=15 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> +# La Canoa UTM Zone 21N +<24721> +proj=utm +zone=21 +ellps=intl +units=m +no_defs <> +# NAD 1927 StatePlane Hawaii 1 FIPS 5101 +<26761> +proj=tmerc +lat_0=18.83333333333333 +lon_0=-155.5 +k=0.999967 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1927 StatePlane Hawaii 2 FIPS 5102 +<26762> +proj=tmerc +lat_0=20.33333333333333 +lon_0=-156.6666666666667 +k=0.999967 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1927 StatePlane Hawaii 3 FIPS 5103 +<26763> +proj=tmerc +lat_0=21.16666666666667 +lon_0=-158 +k=0.999990 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1927 StatePlane Hawaii 4 FIPS 5104 +<26764> +proj=tmerc +lat_0=21.83333333333333 +lon_0=-159.5 +k=0.999990 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1927 StatePlane Hawaii 5 FIPS 5105 +<26765> +proj=tmerc +lat_0=21.66666666666667 +lon_0=-160.1666666666667 +k=1.000000 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1927 StatePlane Michigan North FIPS 2111 +<26788> +proj=lcc +lat_1=45.48333333333333 +lat_2=47.08333333333334 +lat_0=44.78333333333333 +lon_0=-87 +x_0=609601.2192024385 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1927 StatePlane Michigan Central FIPS 2112 +<26789> +proj=lcc +lat_1=44.18333333333333 +lat_2=45.7 +lat_0=43.31666666666667 +lon_0=-84.33333333333333 +x_0=609601.2192024385 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1927 StatePlane Michigan South FIPS 2113 +<26790> +proj=lcc +lat_1=42.1 +lat_2=43.66666666666666 +lat_0=41.5 +lon_0=-84.33333333333333 +x_0=609601.2192024385 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# Nord Algerie +<30591> +proj=lcc +lat_1=36 +lat_0=36 +lon_0=2.7 +k_0=0.999625544 +x_0=500135 +y_0=300090 +ellps=clrk80 +units=m +no_defs <> +# Sud Algerie +<30592> +proj=lcc +lat_1=33.3 +lat_0=33.3 +lon_0=2.7 +k_0=0.999625769 +x_0=500135 +y_0=300090 +ellps=clrk80 +units=m +no_defs <> +# Germany Zone 1 +<31491> +proj=tmerc +lat_0=0 +lon_0=3 +k=1.000000 +x_0=1500000 +y_0=0 +ellps=bessel +units=m +no_defs <> +# Germany Zone 2 +<31492> +proj=tmerc +lat_0=0 +lon_0=6 +k=1.000000 +x_0=2500000 +y_0=0 +ellps=bessel +units=m +no_defs <> +# Germany Zone 3 +<31493> +proj=tmerc +lat_0=0 +lon_0=9 +k=1.000000 +x_0=3500000 +y_0=0 +ellps=bessel +units=m +no_defs <> +# Germany Zone 4 +<31494> +proj=tmerc +lat_0=0 +lon_0=12 +k=1.000000 +x_0=4500000 +y_0=0 +ellps=bessel +units=m +no_defs <> +# Germany Zone 5 +<31495> +proj=tmerc +lat_0=0 +lon_0=15 +k=1.000000 +x_0=5500000 +y_0=0 +ellps=bessel +units=m +no_defs <> +# NAD 1927 StatePlane Puerto Rico FIPS 5201 +<32059> +proj=lcc +lat_1=18.03333333333334 +lat_2=18.43333333333333 +lat_0=17.83333333333333 +lon_0=-66.43333333333334 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1927 StatePlane Virgin Islands St Croix FIPS 5202 +<32060> +proj=lcc +lat_1=18.03333333333334 +lat_2=18.43333333333333 +lat_0=17.83333333333333 +lon_0=-66.43333333333334 +x_0=152400.3048006096 +y_0=30480.06096012193 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# Sphere Plate Carree +<53001> +a=6371000 +b=6371000 +units=m +no_defs <> +# Sphere Equidistant Cylindrical +<53002> +a=6371000 +b=6371000 +units=m +no_defs <> +# Sphere Miller Cylindrical +<53003> +proj=mill +lat_0=0 +lon_0=0 +x_0=0 +y_0=0 +R_A +a=6371000 +b=6371000 +units=m +no_defs <> +# Sphere Mercator +<53004> +proj=merc +lat_ts=0 +lon_0=0 +k=1.000000 +x_0=0 +y_0=0 +a=6371000 +b=6371000 +units=m +no_defs <> +# Sphere Sinusoidal +<53008> +proj=sinu +lon_0=0 +x_0=0 +y_0=0 +a=6371000 +b=6371000 +units=m +no_defs <> +# Sphere Mollweide +<53009> +proj=moll +lon_0=0 +x_0=0 +y_0=0 +a=6371000 +b=6371000 +units=m +no_defs <> +# Sphere Eckert VI +<53010> +proj=eck6 +lon_0=0 +x_0=0 +y_0=0 +a=6371000 +b=6371000 +units=m +no_defs <> +# Sphere Eckert V +<53011> +a=6371000 +b=6371000 +units=m +no_defs <> +# Sphere Eckert IV +<53012> +proj=eck4 +lon_0=0 +x_0=0 +y_0=0 +a=6371000 +b=6371000 +units=m +no_defs <> +# Sphere Eckert III +<53013> +a=6371000 +b=6371000 +units=m +no_defs <> +# Sphere Eckert II +<53014> +a=6371000 +b=6371000 +units=m +no_defs <> +# Sphere Eckert I +<53015> +a=6371000 +b=6371000 +units=m +no_defs <> +# Sphere Gall Stereographic +<53016> +proj=gall +lon_0=0 +x_0=0 +y_0=0 +a=6371000 +b=6371000 +units=m +no_defs <> +# Sphere Behrmann +<53017> +a=6371000 +b=6371000 +units=m +no_defs <> +# Sphere Winkel I +<53018> +a=6371000 +b=6371000 +units=m +no_defs <> +# Sphere Winkel II +<53019> +a=6371000 +b=6371000 +units=m +no_defs <> +# Sphere Polyconic +<53021> +proj=poly +lat_0=0 +lon_0=0 +x_0=0 +y_0=0 +a=6371000 +b=6371000 +units=m +no_defs <> +# Sphere Quartic Authalic +<53022> +a=6371000 +b=6371000 +units=m +no_defs <> +# Sphere Loximuthal +<53023> +a=6371000 +b=6371000 +units=m +no_defs <> +# Sphere Bonne +<53024> +a=6371000 +b=6371000 +units=m +no_defs <> +# Sphere Hotine +<53025> +a=6371000 +b=6371000 +units=m +no_defs <> +# Sphere Stereographic +<53026> +proj=stere +lat_0=0 +lon_0=0 +x_0=0 +y_0=0 +a=6371000 +b=6371000 +units=m +no_defs <> +# Sphere Equidistant Conic +<53027> +proj=eqdc +lat_0=0 +lon_0=0 +lat_1=60 +lat_2=60 +x_0=0 +y_0=0 +a=6371000 +b=6371000 +units=m +no_defs <> +# Sphere Cassini +<53028> +proj=cass +lat_0=0 +lon_0=0 +x_0=0 +y_0=0 +a=6371000 +b=6371000 +units=m +no_defs <> +# Sphere Van der Grinten I +<53029> +proj=vandg +lon_0=0 +x_0=0 +y_0=0 +R_A +a=6371000 +b=6371000 +units=m +no_defs <> +# Sphere Robinson +<53030> +proj=robin +lon_0=0 +x_0=0 +y_0=0 +a=6371000 +b=6371000 +units=m +no_defs <> +# Sphere Two Point Equidistant +<53031> +a=6371000 +b=6371000 +units=m +no_defs <> +# Sphere Azimuthal Equidistant +<53032> +proj=aeqd +lat_0=0 +lon_0=0 +x_0=0 +y_0=0 +a=6371000 +b=6371000 +units=m +no_defs <> +# World Plate Carree +<54001> +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# World Equidistant Cylindrical +<54002> +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# World Miller Cylindrical +<54003> +proj=mill +lat_0=0 +lon_0=0 +x_0=0 +y_0=0 +R_A +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# World Mercator +<54004> +proj=merc +lat_ts=0 +lon_0=0 +k=1.000000 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# World Sinusoidal +<54008> +proj=sinu +lon_0=0 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# World Mollweide +<54009> +proj=moll +lon_0=0 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# World Eckert VI +<54010> +proj=eck6 +lon_0=0 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# World Eckert V +<54011> +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# World Eckert IV +<54012> +proj=eck4 +lon_0=0 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# World Eckert III +<54013> +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# World Eckert II +<54014> +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# World Eckert I +<54015> +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# World Gall Stereographic +<54016> +proj=gall +lon_0=0 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# World Behrmann +<54017> +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# World Winkel I +<54018> +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# World Winkel II +<54019> +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# World Polyconic +<54021> +proj=poly +lat_0=0 +lon_0=0 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# World Quartic Authalic +<54022> +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# World Loximuthal +<54023> +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# World Bonne +<54024> +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# World Hotine +<54025> +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# World Stereographic +<54026> +proj=stere +lat_0=0 +lon_0=0 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# World Equidistant Conic +<54027> +proj=eqdc +lat_0=0 +lon_0=0 +lat_1=60 +lat_2=60 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# World Cassini +<54028> +proj=cass +lat_0=0 +lon_0=0 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# World Van der Grinten I +<54029> +proj=vandg +lon_0=0 +x_0=0 +y_0=0 +R_A +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# World Robinson +<54030> +proj=robin +lon_0=0 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# World Two Point Equidistant +<54031> +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# World Azimuthal Equidistant +<54032> +proj=aeqd +lat_0=0 +lon_0=0 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# NAD 1927 StatePlane Guam FIPS 5400 +<65061> +proj=poly +lat_0=13.47246635277778 +lon_0=-144.7487507055556 +x_0=50000.00000000001 +y_0=50000.00000000001 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Guam FIPS 5400 +<65161> +proj=poly +lat_0=13.47246635277778 +lon_0=-144.7487507055556 +x_0=50000 +y_0=50000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# Canada Albers Equal Area Conic +<102001> +proj=aea +lat_1=50 +lat_2=70 +lat_0=40 +lon_0=-96 +x_0=0 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# Canada Lambert Conformal Conic +<102002> +proj=lcc +lat_1=50 +lat_2=70 +lat_0=40 +lon_0=-96 +x_0=0 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# USA Contiguous Albers Equal Area Conic +<102003> +proj=aea +lat_1=29.5 +lat_2=45.5 +lat_0=37.5 +lon_0=-96 +x_0=0 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# USA Contiguous Lambert Conformal Conic +<102004> +proj=lcc +lat_1=33 +lat_2=45 +lat_0=39 +lon_0=-96 +x_0=0 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# USA Contiguous Equidistant Conic +<102005> +proj=eqdc +lat_0=0 +lon_0=0 +lat_1=33 +lat_2=45 +x_0=0 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# Alaska Albers Equal Area Conic +<102006> +proj=aea +lat_1=55 +lat_2=65 +lat_0=50 +lon_0=-154 +x_0=0 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# Hawaii Albers Equal Area Conic +<102007> +proj=aea +lat_1=8 +lat_2=18 +lat_0=13 +lon_0=-157 +x_0=0 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# North America Albers Equal Area Conic +<102008> +proj=aea +lat_1=20 +lat_2=60 +lat_0=40 +lon_0=-96 +x_0=0 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# North America Lambert Conformal Conic +<102009> +proj=lcc +lat_1=20 +lat_2=60 +lat_0=40 +lon_0=-96 +x_0=0 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# North America Equidistant Conic +<102010> +proj=eqdc +lat_0=0 +lon_0=0 +lat_1=20 +lat_2=60 +x_0=0 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# Africa Sinusoidal +<102011> +proj=sinu +lon_0=0 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# Asia Lambert Conformal Conic +<102012> +proj=lcc +lat_1=30 +lat_2=62 +lat_0=0 +lon_0=105 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# Europe Albers Equal Area Conic +<102013> +proj=aea +lat_1=43 +lat_2=62 +lat_0=30 +lon_0=10 +x_0=0 +y_0=0 +ellps=intl +units=m +no_defs <> +# Europe Lambert Conformal Conic +<102014> +proj=lcc +lat_1=43 +lat_2=62 +lat_0=30 +lon_0=10 +x_0=0 +y_0=0 +ellps=intl +units=m +no_defs <> +# South America Lambert Conformal Conic +<102015> +proj=lcc +lat_1=-5 +lat_2=-42 +lat_0=-32 +lon_0=-60 +x_0=0 +y_0=0 +ellps=aust_SA +units=m +no_defs <> +# North Pole Azimuthal Equidistant +<102016> +proj=aeqd +lat_0=90 +lon_0=0 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# North Pole Lambert Azimuthal Equal Area +<102017> +proj=laea +lat_0=90 +lon_0=0 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# North Pole Stereographic +<102018> +proj=stere +lat_0=90 +lon_0=0 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# South Pole Azimuthal Equidistant +<102019> +proj=aeqd +lat_0=-90 +lon_0=0 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# South Pole Lambert Azimuthal Equal Area +<102020> +proj=laea +lat_0=-90 +lon_0=0 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# South Pole Stereographic +<102021> +proj=stere +lat_0=-90 +lon_0=0 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# Africa Albers Equal Area Conic +<102022> +proj=aea +lat_1=20 +lat_2=-23 +lat_0=0 +lon_0=25 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# Africa Equidistant Conic +<102023> +proj=eqdc +lat_0=0 +lon_0=0 +lat_1=20 +lat_2=-23 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# Africa Lambert Conformal Conic +<102024> +proj=lcc +lat_1=20 +lat_2=-23 +lat_0=0 +lon_0=25 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# Asia North Albers Equal Area Conic +<102025> +proj=aea +lat_1=15 +lat_2=65 +lat_0=30 +lon_0=95 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# Asia North Equidistant Conic +<102026> +proj=eqdc +lat_0=0 +lon_0=0 +lat_1=15 +lat_2=65 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# Asia North Lambert Conformal Conic +<102027> +proj=lcc +lat_1=15 +lat_2=65 +lat_0=30 +lon_0=95 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# Asia South Albers Equal Area Conic +<102028> +proj=aea +lat_1=7 +lat_2=-32 +lat_0=-15 +lon_0=125 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# Asia South Equidistant Conic +<102029> +proj=eqdc +lat_0=0 +lon_0=0 +lat_1=7 +lat_2=-32 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# Asia South Lambert Conformal Conic +<102030> +proj=lcc +lat_1=7 +lat_2=-32 +lat_0=-15 +lon_0=125 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> +# Europe Equidistant Conic +<102031> +proj=eqdc +lat_0=0 +lon_0=0 +lat_1=43 +lat_2=62 +x_0=0 +y_0=0 +ellps=intl +units=m +no_defs <> +# South America Equidistant Conic +<102032> +proj=eqdc +lat_0=0 +lon_0=0 +lat_1=-5 +lat_2=-42 +x_0=0 +y_0=0 +ellps=aust_SA +units=m +no_defs <> +# South America Albers Equal Area Conic +<102033> +proj=aea +lat_1=-5 +lat_2=-42 +lat_0=-32 +lon_0=-60 +x_0=0 +y_0=0 +ellps=aust_SA +units=m +no_defs <> +# S-JTSK Krovak +<102065> +proj=krovak +lat_0=49.5 +lon_0=24.83333333333333 +alpha=30.28813975277778 +k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +units=m +no_defs <> +# S-JTSK Ferro Krovak East North +<102066> +proj=krovak +lat_0=49.5 +lon_0=24.83333333333333 +alpha=30.28813975277778 +k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +pm=-17.66666666666667 +units=m +no_defs <> +# S-JTSK Krovak East North +<102067> +proj=krovak +lat_0=49.5 +lon_0=24.83333333333333 +alpha=30.28813975277778 +k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +units=m +no_defs <> +# Monte Mario Italy 1 +<102091> +proj=tmerc +lat_0=0 +lon_0=9 +k=0.999600 +x_0=1500000 +y_0=0 +ellps=intl +units=m +no_defs <> +# Monte Mario Italy 2 +<102092> +proj=tmerc +lat_0=0 +lon_0=15 +k=0.999600 +x_0=2520000 +y_0=0 +ellps=intl +units=m +no_defs <> +# NGO 1948 Norway Zone 1 +<102101> +proj=tmerc +lat_0=58 +lon_0=6.05625 +k=1.000000 +x_0=0 +y_0=0 +a=6377492.018 +b=6356173.508712696 +units=m +no_defs <> +# NGO 1948 Norway Zone 2 +<102102> +proj=tmerc +lat_0=58 +lon_0=8.389583333333333 +k=1.000000 +x_0=0 +y_0=0 +a=6377492.018 +b=6356173.508712696 +units=m +no_defs <> +# NGO 1948 Norway Zone 3 +<102103> +proj=tmerc +lat_0=58 +lon_0=10.72291666666667 +k=1.000000 +x_0=0 +y_0=0 +a=6377492.018 +b=6356173.508712696 +units=m +no_defs <> +# NGO 1948 Norway Zone 4 +<102104> +proj=tmerc +lat_0=58 +lon_0=13.22291666666667 +k=1.000000 +x_0=0 +y_0=0 +a=6377492.018 +b=6356173.508712696 +units=m +no_defs <> +# NGO 1948 Norway Zone 5 +<102105> +proj=tmerc +lat_0=58 +lon_0=16.88958333333333 +k=1.000000 +x_0=0 +y_0=0 +a=6377492.018 +b=6356173.508712696 +units=m +no_defs <> +# NGO 1948 Norway Zone 6 +<102106> +proj=tmerc +lat_0=58 +lon_0=20.88958333333333 +k=1.000000 +x_0=0 +y_0=0 +a=6377492.018 +b=6356173.508712696 +units=m +no_defs <> +# NGO 1948 Norway Zone 7 +<102107> +proj=tmerc +lat_0=58 +lon_0=24.88958333333333 +k=1.000000 +x_0=0 +y_0=0 +a=6377492.018 +b=6356173.508712696 +units=m +no_defs <> +# NGO 1948 Norway Zone 8 +<102108> +proj=tmerc +lat_0=58 +lon_0=29.05625 +k=1.000000 +x_0=0 +y_0=0 +a=6377492.018 +b=6356173.508712696 +units=m +no_defs <> +# RGF 1993 Lambert 93 +<102110> +proj=lcc +lat_1=44 +lat_2=49 +lat_0=46.5 +lon_0=3 +x_0=700000 +y_0=6600000 +ellps=GRS80 +units=m +no_defs <> +# Old Hawaiian UTM Zone 4N +<102114> +proj=utm +zone=4 +ellps=clrk66 +units=m +no_defs <> +# Old Hawaiian UTM Zone 5N +<102115> +proj=utm +zone=5 +ellps=clrk66 +units=m +no_defs <> +# NAD 1927 Michigan GeoRef Feet US +<102120> +proj=omerc +lat_0=45.30916666666666 +lonc=-86 +alpha=337.255555555556 +k=0.9996 +x_0=2546731.495961392 +y_0=-4354009.816002033 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 Michigan GeoRef Feet US +<102121> +proj=omerc +lat_0=45.30916666666666 +lonc=-86 +alpha=337.255555555556 +k=0.9996 +x_0=2546731.495961392 +y_0=-4354009.816002033 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1927 Michigan GeoRef Meters +<102122> +proj=omerc +lat_0=45.30916666666666 +lonc=-86 +alpha=337.255555555556 +k=0.9996 +x_0=2546731.496 +y_0=-4354009.816 +ellps=clrk66 +datum=NAD27 +units=m +no_defs <> +# NAD 1983 Michigan GeoRef Meters +<102123> +proj=omerc +lat_0=45.30916666666666 +lonc=-86 +alpha=337.255555555556 +k=0.9996 +x_0=2546731.496 +y_0=-4354009.816 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> +# NGO 1948 UTM Zone 32N +<102132> +proj=utm +zone=32 +a=6377492.018 +b=6356173.508712696 +units=m +no_defs <> +# NGO 1948 UTM Zone 33N +<102133> +proj=utm +zone=33 +a=6377492.018 +b=6356173.508712696 +units=m +no_defs <> +# NGO 1948 UTM Zone 34N +<102134> +proj=utm +zone=34 +a=6377492.018 +b=6356173.508712696 +units=m +no_defs <> +# NGO 1948 UTM Zone 35N +<102135> +proj=utm +zone=35 +a=6377492.018 +b=6356173.508712696 +units=m +no_defs <> +# Hong Kong 1980 Grid +<102140> +proj=tmerc +lat_0=22.31213333333334 +lon_0=114.1785555555556 +k=1.000000 +x_0=836694.05 +y_0=819069.8 +ellps=intl +units=m +no_defs <> +# Hong Kong 1980 UTM Zone 49N +<102141> +proj=utm +zone=49 +ellps=intl +units=m +no_defs <> +# Hong Kong 1980 UTM Zone 50N +<102142> +proj=utm +zone=50 +ellps=intl +units=m +no_defs <> +# Tokyo UTM Zone 51N +<102151> +proj=utm +zone=51 +ellps=bessel +units=m +no_defs <> +# Tokyo UTM Zone 52N +<102152> +proj=utm +zone=52 +ellps=bessel +units=m +no_defs <> +# Tokyo UTM Zone 53N +<102153> +proj=utm +zone=53 +ellps=bessel +units=m +no_defs <> +# Tokyo UTM Zone 54N +<102154> +proj=utm +zone=54 +ellps=bessel +units=m +no_defs <> +# Tokyo UTM Zone 55N +<102155> +proj=utm +zone=55 +ellps=bessel +units=m +no_defs <> +# Tokyo UTM Zone 56N +<102156> +proj=utm +zone=56 +ellps=bessel +units=m +no_defs <> +# Datum 73 Hayford Gauss IGeoE +<102160> +proj=tmerc +lat_0=39.66666666666666 +lon_0=-8.131906111111112 +k=1.000000 +x_0=200180.598 +y_0=299913.01 +ellps=intl +units=m +no_defs <> +# Datum 73 Hayford Gauss IPCC +<102161> +proj=tmerc +lat_0=39.66666666666666 +lon_0=-8.131906111111112 +k=1.000000 +x_0=180.598 +y_0=-86.98999999999999 +ellps=intl +units=m +no_defs <> +# Graciosa Base SW 1948 UTM Zone 26N +<102162> +proj=utm +zone=26 +ellps=intl +units=m +no_defs <> +# Lisboa Bessel Bonne +<102163> +ellps=bessel +units=m +no_defs <> +# Lisboa Hayford Gauss IGeoE +<102164> +proj=tmerc +lat_0=39.66666666666666 +lon_0=-8.131906111111112 +k=1.000000 +x_0=200000 +y_0=300000 +ellps=intl +units=m +no_defs <> +# Lisboa Hayford Gauss IPCC +<102165> +proj=tmerc +lat_0=39.66666666666666 +lon_0=-8.131906111111112 +k=1.000000 +x_0=0 +y_0=0 +ellps=intl +units=m +no_defs <> +# Observ Meteorologico 1939 UTM Zone 25N +<102166> +proj=utm +zone=25 +ellps=intl +units=m +no_defs <> +# Porto Santo 1936 UTM Zone 28N +<102167> +proj=utm +zone=28 +ellps=intl +units=m +no_defs <> +# Sao Braz UTM Zone 26N +<102168> +proj=utm +zone=26 +ellps=intl +units=m +no_defs <> +# Selvagem Grande 1938 UTM Zone 28N +<102169> +proj=utm +zone=28 +ellps=intl +units=m +no_defs <> +# Nord Maroc Degree +<102191> +proj=lcc +lat_1=33.3 +lat_0=33.3 +lon_0=-5.4 +k_0=0.999625769 +x_0=500000 +y_0=300000 +a=6378249.2 +b=6356514.999904194 +units=m +no_defs <> +# Sud Maroc Degree +<102192> +proj=lcc +lat_1=29.7 +lat_0=29.7 +lon_0=-5.4 +k_0=0.9996155960000001 +x_0=500000 +y_0=300000 +a=6378249.2 +b=6356514.999904194 +units=m +no_defs <> +# Sahara Degree +<102193> +proj=lcc +lat_1=26.1 +lat_0=26.1 +lon_0=-5.4 +k_0=0.9996 +x_0=1200000 +y_0=400000 +a=6378249.2 +b=6356514.999904194 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Alabama East FIPS 0101 +<102229> +proj=tmerc +lat_0=30.5 +lon_0=-85.83333333333333 +k=0.999960 +x_0=200000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Alabama West FIPS 0102 +<102230> +proj=tmerc +lat_0=30 +lon_0=-87.5 +k=0.999933 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane California I FIPS 0401 +<102241> +proj=lcc +lat_1=40 +lat_2=41.66666666666666 +lat_0=39.33333333333334 +lon_0=-122 +x_0=2000000 +y_0=500000 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane California II FIPS 0402 +<102242> +proj=lcc +lat_1=38.33333333333334 +lat_2=39.83333333333334 +lat_0=37.66666666666666 +lon_0=-122 +x_0=2000000 +y_0=500000 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane California III FIPS 0403 +<102243> +proj=lcc +lat_1=37.06666666666667 +lat_2=38.43333333333333 +lat_0=36.5 +lon_0=-120.5 +x_0=2000000 +y_0=500000 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane California IV FIPS 0404 +<102244> +proj=lcc +lat_1=36 +lat_2=37.25 +lat_0=35.33333333333334 +lon_0=-119 +x_0=2000000 +y_0=500000 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane California V FIPS 0405 +<102245> +proj=lcc +lat_1=34.03333333333333 +lat_2=35.46666666666667 +lat_0=33.5 +lon_0=-118 +x_0=2000000 +y_0=500000 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane California VI FIPS 0406 +<102246> +proj=lcc +lat_1=32.78333333333333 +lat_2=33.88333333333333 +lat_0=32.16666666666666 +lon_0=-116.25 +x_0=2000000 +y_0=500000 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Arizona East FIPS 0201 +<102248> +proj=tmerc +lat_0=31 +lon_0=-110.1666666666667 +k=0.999900 +x_0=213360 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Arizona Central FIPS 0202 +<102249> +proj=tmerc +lat_0=31 +lon_0=-111.9166666666667 +k=0.999900 +x_0=213360 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Arizona West FIPS 0203 +<102250> +proj=tmerc +lat_0=31 +lon_0=-113.75 +k=0.999933 +x_0=213360 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Arkansas North FIPS 0301 +<102251> +proj=lcc +lat_1=34.93333333333333 +lat_2=36.23333333333333 +lat_0=34.33333333333334 +lon_0=-92 +x_0=400000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Arkansas South FIPS 0302 +<102252> +proj=lcc +lat_1=33.3 +lat_2=34.76666666666667 +lat_0=32.66666666666666 +lon_0=-92 +x_0=400000 +y_0=400000 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Colorado North FIPS 0501 +<102253> +proj=lcc +lat_1=39.71666666666667 +lat_2=40.78333333333333 +lat_0=39.33333333333334 +lon_0=-105.5 +x_0=914401.8289 +y_0=304800.6096 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Colorado Central FIPS 0502 +<102254> +proj=lcc +lat_1=38.45 +lat_2=39.75 +lat_0=37.83333333333334 +lon_0=-105.5 +x_0=914401.8289 +y_0=304800.6096 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Colorado South FIPS 0503 +<102255> +proj=lcc +lat_1=37.23333333333333 +lat_2=38.43333333333333 +lat_0=36.66666666666666 +lon_0=-105.5 +x_0=914401.8289 +y_0=304800.6096 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Connecticut FIPS 0600 +<102256> +proj=lcc +lat_1=41.2 +lat_2=41.86666666666667 +lat_0=40.83333333333334 +lon_0=-72.75 +x_0=304800.6096 +y_0=152400.3048 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Delaware FIPS 0700 +<102257> +proj=tmerc +lat_0=38 +lon_0=-75.41666666666667 +k=0.999995 +x_0=200000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Florida East FIPS 0901 +<102258> +proj=tmerc +lat_0=24.33333333333333 +lon_0=-81 +k=0.999941 +x_0=200000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Florida West FIPS 0902 +<102259> +proj=tmerc +lat_0=24.33333333333333 +lon_0=-82 +k=0.999941 +x_0=200000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Florida North FIPS 0903 +<102260> +proj=lcc +lat_1=29.58333333333333 +lat_2=30.75 +lat_0=29 +lon_0=-84.5 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Hawaii 1 FIPS 5101 +<102261> +proj=tmerc +lat_0=18.83333333333333 +lon_0=-155.5 +k=0.999967 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Hawaii 2 FIPS 5102 +<102262> +proj=tmerc +lat_0=20.33333333333333 +lon_0=-156.6666666666667 +k=0.999967 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Hawaii 3 FIPS 5103 +<102263> +proj=tmerc +lat_0=21.16666666666667 +lon_0=-158 +k=0.999990 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Hawaii 4 FIPS 5104 +<102264> +proj=tmerc +lat_0=21.83333333333333 +lon_0=-159.5 +k=0.999990 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Hawaii 5 FIPS 5105 +<102265> +proj=tmerc +lat_0=21.66666666666667 +lon_0=-160.1666666666667 +k=1.000000 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Georgia East FIPS 1001 +<102266> +proj=tmerc +lat_0=30 +lon_0=-82.16666666666667 +k=0.999900 +x_0=200000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Georgia West FIPS 1002 +<102267> +proj=tmerc +lat_0=30 +lon_0=-84.16666666666667 +k=0.999900 +x_0=700000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Idaho East FIPS 1101 +<102268> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-112.1666666666667 +k=0.999947 +x_0=200000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Idaho Central FIPS 1102 +<102269> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-114 +k=0.999947 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Idaho West FIPS 1103 +<102270> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-115.75 +k=0.999933 +x_0=800000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Illinois East FIPS 1201 +<102271> +proj=tmerc +lat_0=36.66666666666666 +lon_0=-88.33333333333333 +k=0.999975 +x_0=300000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Illinois West FIPS 1202 +<102272> +proj=tmerc +lat_0=36.66666666666666 +lon_0=-90.16666666666667 +k=0.999941 +x_0=700000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Indiana East FIPS 1301 +<102273> +proj=tmerc +lat_0=37.5 +lon_0=-85.66666666666667 +k=0.999967 +x_0=100000 +y_0=250000 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Indiana West FIPS 1302 +<102274> +proj=tmerc +lat_0=37.5 +lon_0=-87.08333333333333 +k=0.999967 +x_0=900000 +y_0=250000 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Kansas North FIPS 1501 +<102277> +proj=lcc +lat_1=38.71666666666667 +lat_2=39.78333333333333 +lat_0=38.33333333333334 +lon_0=-98 +x_0=400000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Kansas South FIPS 1502 +<102278> +proj=lcc +lat_1=37.26666666666667 +lat_2=38.56666666666667 +lat_0=36.66666666666666 +lon_0=-98.5 +x_0=400000 +y_0=400000 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Kentucky North FIPS 1601 +<102279> +proj=lcc +lat_1=37.96666666666667 +lat_2=38.96666666666667 +lat_0=37.5 +lon_0=-84.25 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Kentucky South FIPS 1602 +<102280> +proj=lcc +lat_1=36.73333333333333 +lat_2=37.93333333333333 +lat_0=36.33333333333334 +lon_0=-85.75 +x_0=500000 +y_0=500000 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Louisiana North FIPS 1701 +<102281> +proj=lcc +lat_1=31.16666666666667 +lat_2=32.66666666666666 +lat_0=30.5 +lon_0=-92.5 +x_0=1000000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Louisiana South FIPS 1702 +<102282> +proj=lcc +lat_1=29.3 +lat_2=30.7 +lat_0=28.5 +lon_0=-91.33333333333333 +x_0=1000000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Maine East FIPS 1801 +<102283> +proj=tmerc +lat_0=43.66666666666666 +lon_0=-68.5 +k=0.999900 +x_0=300000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Maine West FIPS 1802 +<102284> +proj=tmerc +lat_0=42.83333333333334 +lon_0=-70.16666666666667 +k=0.999967 +x_0=900000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Maryland FIPS 1900 +<102285> +proj=lcc +lat_1=38.3 +lat_2=39.45 +lat_0=37.66666666666666 +lon_0=-77 +x_0=400000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Massachusetts Mainland FIPS 2001 +<102286> +proj=lcc +lat_1=41.71666666666667 +lat_2=42.68333333333333 +lat_0=41 +lon_0=-71.5 +x_0=200000 +y_0=750000 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Massachusetts Island FIPS 2002 +<102287> +proj=lcc +lat_1=41.28333333333333 +lat_2=41.48333333333333 +lat_0=41 +lon_0=-70.5 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Michigan North FIPS 2111 +<102288> +proj=lcc +lat_1=45.48333333333333 +lat_2=47.08333333333334 +lat_0=44.78333333333333 +lon_0=-87 +x_0=8000000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Michigan Central FIPS 2112 +<102289> +proj=lcc +lat_1=44.18333333333333 +lat_2=45.7 +lat_0=43.31666666666667 +lon_0=-84.36666666666666 +x_0=6000000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Michigan South FIPS 2113 +<102290> +proj=lcc +lat_1=42.1 +lat_2=43.66666666666666 +lat_0=41.5 +lon_0=-84.36666666666666 +x_0=4000000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Minnesota North FIPS 2201 +<102291> +proj=lcc +lat_1=47.03333333333333 +lat_2=48.63333333333333 +lat_0=46.5 +lon_0=-93.09999999999999 +x_0=800000 +y_0=100000 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Minnesota Central FIPS 2202 +<102292> +proj=lcc +lat_1=45.61666666666667 +lat_2=47.05 +lat_0=45 +lon_0=-94.25 +x_0=800000 +y_0=100000 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Minnesota South FIPS 2203 +<102293> +proj=lcc +lat_1=43.78333333333333 +lat_2=45.21666666666667 +lat_0=43 +lon_0=-94 +x_0=800000 +y_0=100000 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Mississippi East FIPS 2301 +<102294> +proj=tmerc +lat_0=29.5 +lon_0=-88.83333333333333 +k=0.999950 +x_0=300000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Mississippi West FIPS 2302 +<102295> +proj=tmerc +lat_0=29.5 +lon_0=-90.33333333333333 +k=0.999950 +x_0=700000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Missouri East FIPS 2401 +<102296> +proj=tmerc +lat_0=35.83333333333334 +lon_0=-90.5 +k=0.999933 +x_0=250000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Missouri Central FIPS 2402 +<102297> +proj=tmerc +lat_0=35.83333333333334 +lon_0=-92.5 +k=0.999933 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Missouri West FIPS 2403 +<102298> +proj=tmerc +lat_0=36.16666666666666 +lon_0=-94.5 +k=0.999941 +x_0=850000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Montana FIPS 2500 +<102300> +proj=lcc +lat_1=45 +lat_2=49 +lat_0=44.25 +lon_0=-109.5 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Nebraska FIPS 2600 +<102304> +proj=lcc +lat_1=40 +lat_2=43 +lat_0=39.83333333333334 +lon_0=-100 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Nevada East FIPS 2701 +<102307> +proj=tmerc +lat_0=34.75 +lon_0=-115.5833333333333 +k=0.999900 +x_0=200000 +y_0=8000000 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Nevada Central FIPS 2702 +<102308> +proj=tmerc +lat_0=34.75 +lon_0=-116.6666666666667 +k=0.999900 +x_0=500000 +y_0=6000000 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Nevada West FIPS 2703 +<102309> +proj=tmerc +lat_0=34.75 +lon_0=-118.5833333333333 +k=0.999900 +x_0=800000 +y_0=4000000 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane New Hampshire FIPS 2800 +<102310> +proj=tmerc +lat_0=42.5 +lon_0=-71.66666666666667 +k=0.999967 +x_0=300000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane New Jersey FIPS 2900 +<102311> +proj=tmerc +lat_0=38.83333333333334 +lon_0=-74.5 +k=0.999900 +x_0=150000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane New Mexico East FIPS 3001 +<102312> +proj=tmerc +lat_0=31 +lon_0=-104.3333333333333 +k=0.999909 +x_0=165000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane New Mexico Central FIPS 3002 +<102313> +proj=tmerc +lat_0=31 +lon_0=-106.25 +k=0.999900 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane New Mexico West FIPS 3003 +<102314> +proj=tmerc +lat_0=31 +lon_0=-107.8333333333333 +k=0.999917 +x_0=830000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane New York East FIPS 3101 +<102315> +proj=tmerc +lat_0=38.83333333333334 +lon_0=-74.5 +k=0.999900 +x_0=150000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane New York Central FIPS 3102 +<102316> +proj=tmerc +lat_0=40 +lon_0=-76.58333333333333 +k=0.999938 +x_0=250000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane New York West FIPS 3103 +<102317> +proj=tmerc +lat_0=40 +lon_0=-78.58333333333333 +k=0.999938 +x_0=350000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane New York Long Island FIPS 3104 +<102318> +proj=lcc +lat_1=40.66666666666666 +lat_2=41.03333333333333 +lat_0=40.16666666666666 +lon_0=-74 +x_0=300000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane North Dakota North FIPS 3301 +<102320> +proj=lcc +lat_1=47.43333333333333 +lat_2=48.73333333333333 +lat_0=47 +lon_0=-100.5 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane North Dakota South FIPS 3302 +<102321> +proj=lcc +lat_1=46.18333333333333 +lat_2=47.48333333333333 +lat_0=45.66666666666666 +lon_0=-100.5 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Ohio North FIPS 3401 +<102322> +proj=lcc +lat_1=40.43333333333333 +lat_2=41.7 +lat_0=39.66666666666666 +lon_0=-82.5 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Ohio South FIPS 3402 +<102323> +proj=lcc +lat_1=38.73333333333333 +lat_2=40.03333333333333 +lat_0=38 +lon_0=-82.5 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Oklahoma North FIPS 3501 +<102324> +proj=lcc +lat_1=35.56666666666667 +lat_2=36.76666666666667 +lat_0=35 +lon_0=-98 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Oklahoma South FIPS 3502 +<102325> +proj=lcc +lat_1=33.93333333333333 +lat_2=35.23333333333333 +lat_0=33.33333333333334 +lon_0=-98 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Oregon North FIPS 3601 +<102326> +proj=lcc +lat_1=44.33333333333334 +lat_2=46 +lat_0=43.66666666666666 +lon_0=-120.5 +x_0=2500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Oregon South FIPS 3602 +<102327> +proj=lcc +lat_1=42.33333333333334 +lat_2=44 +lat_0=41.66666666666666 +lon_0=-120.5 +x_0=1500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Rhode Island FIPS 3800 +<102330> +proj=tmerc +lat_0=41.08333333333334 +lon_0=-71.5 +k=0.999994 +x_0=100000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane South Dakota North FIPS 4001 +<102334> +proj=lcc +lat_1=44.41666666666666 +lat_2=45.68333333333333 +lat_0=43.83333333333334 +lon_0=-100 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane South Dakota South FIPS 4002 +<102335> +proj=lcc +lat_1=42.83333333333334 +lat_2=44.4 +lat_0=42.33333333333334 +lon_0=-100.3333333333333 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Tennessee FIPS 4100 +<102336> +proj=lcc +lat_1=35.25 +lat_2=36.41666666666666 +lat_0=34.33333333333334 +lon_0=-86 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Texas North FIPS 4201 +<102337> +proj=lcc +lat_1=34.65 +lat_2=36.18333333333333 +lat_0=34 +lon_0=-101.5 +x_0=200000 +y_0=1000000 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Texas North Central FIPS 4202 +<102338> +proj=lcc +lat_1=32.13333333333333 +lat_2=33.96666666666667 +lat_0=31.66666666666667 +lon_0=-98.5 +x_0=600000 +y_0=2000000 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Texas Central FIPS 4203 +<102339> +proj=lcc +lat_1=30.11666666666667 +lat_2=31.88333333333333 +lat_0=29.66666666666667 +lon_0=-100.3333333333333 +x_0=700000 +y_0=3000000 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Texas South Central FIPS 4204 +<102340> +proj=lcc +lat_1=28.38333333333333 +lat_2=30.28333333333334 +lat_0=27.83333333333333 +lon_0=-99 +x_0=600000 +y_0=4000000 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Texas South FIPS 4205 +<102341> +proj=lcc +lat_1=26.16666666666667 +lat_2=27.83333333333333 +lat_0=25.66666666666667 +lon_0=-98.5 +x_0=300000 +y_0=5000000 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Utah North FIPS 4301 +<102342> +proj=lcc +lat_1=40.71666666666667 +lat_2=41.78333333333333 +lat_0=40.33333333333334 +lon_0=-111.5 +x_0=500000 +y_0=1000000 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Utah Central FIPS 4302 +<102343> +proj=lcc +lat_1=39.01666666666667 +lat_2=40.65 +lat_0=38.33333333333334 +lon_0=-111.5 +x_0=500000 +y_0=2000000 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Utah South FIPS 4303 +<102344> +proj=lcc +lat_1=37.21666666666667 +lat_2=38.35 +lat_0=36.66666666666666 +lon_0=-111.5 +x_0=500000 +y_0=3000000 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Vermont FIPS 4400 +<102345> +proj=tmerc +lat_0=42.5 +lon_0=-72.5 +k=0.999964 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Virginia North FIPS 4501 +<102346> +proj=lcc +lat_1=38.03333333333333 +lat_2=39.2 +lat_0=37.66666666666666 +lon_0=-78.5 +x_0=3500000 +y_0=2000000 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Virginia South FIPS 4502 +<102347> +proj=lcc +lat_1=36.76666666666667 +lat_2=37.96666666666667 +lat_0=36.33333333333334 +lon_0=-78.5 +x_0=3500000 +y_0=1000000 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Washington North FIPS 4601 +<102348> +proj=lcc +lat_1=47.5 +lat_2=48.73333333333333 +lat_0=47 +lon_0=-120.8333333333333 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Washington South FIPS 4602 +<102349> +proj=lcc +lat_1=45.83333333333334 +lat_2=47.33333333333334 +lat_0=45.33333333333334 +lon_0=-120.5 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane West Virginia North FIPS 4701 +<102350> +proj=lcc +lat_1=39 +lat_2=40.25 +lat_0=38.5 +lon_0=-79.5 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane West Virginia South FIPS 4702 +<102351> +proj=lcc +lat_1=37.48333333333333 +lat_2=38.88333333333333 +lat_0=37 +lon_0=-81 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Wisconsin North FIPS 4801 +<102352> +proj=lcc +lat_1=45.56666666666667 +lat_2=46.76666666666667 +lat_0=45.16666666666666 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Wisconsin Central FIPS 4802 +<102353> +proj=lcc +lat_1=44.25 +lat_2=45.5 +lat_0=43.83333333333334 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Wisconsin South FIPS 4803 +<102354> +proj=lcc +lat_1=42.73333333333333 +lat_2=44.06666666666667 +lat_0=42 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Wyoming East FIPS 4901 +<102355> +proj=tmerc +lat_0=40.5 +lon_0=-105.1666666666667 +k=0.999938 +x_0=200000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Wyoming East Central FIPS 4902 +<102356> +proj=tmerc +lat_0=40.5 +lon_0=-107.3333333333333 +k=0.999938 +x_0=400000 +y_0=100000 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Wyoming West Central FIPS 4903 +<102357> +proj=tmerc +lat_0=40.5 +lon_0=-108.75 +k=0.999938 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Wyoming West FIPS 4904 +<102358> +proj=tmerc +lat_0=40.5 +lon_0=-110.0833333333333 +k=0.999938 +x_0=800000 +y_0=100000 +ellps=GRS80 +units=m +no_defs <> +# NAD 1983 HARN StatePlane Puerto Rico Virgin Islands FIPS 5200 +<102361> +proj=lcc +lat_1=18.03333333333334 +lat_2=18.43333333333333 +lat_0=17.83333333333333 +lon_0=-66.43333333333334 +x_0=200000 +y_0=200000 +ellps=GRS80 +units=m +no_defs <> +# Nord Algerie Ancienne Degree +<102491> +proj=lcc +lat_1=36 +lat_0=36 +lon_0=2.7 +k_0=0.999625544 +x_0=500000 +y_0=300000 +a=6378249.2 +b=6356514.999904194 +units=m +no_defs <> +# Sud Algerie Ancienne Degree +<102492> +proj=lcc +lat_1=33.3 +lat_0=33.3 +lon_0=2.7 +k_0=0.999625769 +x_0=500000 +y_0=300000 +a=6378249.2 +b=6356514.999904194 +units=m +no_defs <> +# NTF France I degrees +<102581> +proj=lcc +lat_1=49.5 +lat_0=49.5 +lon_0=2.337229166666667 +k_0=0.999877341 +x_0=600000 +y_0=1200000 +a=6378249.2 +b=6356514.999904194 +units=m +no_defs <> +# NTF France II degrees +<102582> +proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=2.337229166666667 +k_0=0.99987742 +x_0=600000 +y_0=2200000 +a=6378249.2 +b=6356514.999904194 +units=m +no_defs <> +# NTF France III degrees +<102583> +proj=lcc +lat_1=44.1 +lat_0=44.1 +lon_0=2.337229166666667 +k_0=0.999877499 +x_0=600000 +y_0=3200000 +a=6378249.2 +b=6356514.999904194 +units=m +no_defs <> +# NTF France IV degrees +<102584> +proj=lcc +lat_1=42.165 +lat_0=42.165 +lon_0=2.337229166666667 +k_0=0.99994471 +x_0=234.358 +y_0=4185861.369 +a=6378249.2 +b=6356514.999904194 +units=m +no_defs <> +# Nord Algerie Degree +<102591> +proj=lcc +lat_1=36 +lat_0=36 +lon_0=2.7 +k_0=0.999625544 +x_0=500135 +y_0=300090 +ellps=clrk80 +units=m +no_defs <> +# Sud Algerie Degree +<102592> +proj=lcc +lat_1=33.3 +lat_0=33.3 +lon_0=2.7 +k_0=0.999625769 +x_0=500135 +y_0=300090 +ellps=clrk80 +units=m +no_defs <> +# NAD 1983 StatePlane Alabama East FIPS 0101 Feet +<102629> +proj=tmerc +lat_0=30.5 +lon_0=-85.83333333333333 +k=0.999960 +x_0=200000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Alabama West FIPS 0102 Feet +<102630> +proj=tmerc +lat_0=30 +lon_0=-87.5 +k=0.999933 +x_0=600000.0000000001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Alaska 1 FIPS 5001 Feet +<102631> +proj=omerc +lat_0=57 +lonc=-133.6666666666667 +alpha=-36.86989764583333 +k=0.9999 +x_0=4999999.999999999 +y_0=-4999999.999999999 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Alaska 2 FIPS 5002 Feet +<102632> +proj=tmerc +lat_0=54 +lon_0=-142 +k=0.999900 +x_0=500000.0000000002 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Alaska 3 FIPS 5003 Feet +<102633> +proj=tmerc +lat_0=54 +lon_0=-146 +k=0.999900 +x_0=500000.0000000002 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Alaska 4 FIPS 5004 Feet +<102634> +proj=tmerc +lat_0=54 +lon_0=-150 +k=0.999900 +x_0=500000.0000000002 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Alaska 5 FIPS 5005 Feet +<102635> +proj=tmerc +lat_0=54 +lon_0=-154 +k=0.999900 +x_0=500000.0000000002 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Alaska 6 FIPS 5006 Feet +<102636> +proj=tmerc +lat_0=54 +lon_0=-158 +k=0.999900 +x_0=500000.0000000002 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Alaska 7 FIPS 5007 Feet +<102637> +proj=tmerc +lat_0=54 +lon_0=-162 +k=0.999900 +x_0=500000.0000000002 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Alaska 8 FIPS 5008 Feet +<102638> +proj=tmerc +lat_0=54 +lon_0=-166 +k=0.999900 +x_0=500000.0000000002 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Alaska 9 FIPS 5009 Feet +<102639> +proj=tmerc +lat_0=54 +lon_0=-170 +k=0.999900 +x_0=500000.0000000002 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Alaska 10 FIPS 5010 Feet +<102640> +proj=lcc +lat_1=51.83333333333334 +lat_2=53.83333333333334 +lat_0=51 +lon_0=-176 +x_0=1000000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane California I FIPS 0401 Feet +<102641> +proj=lcc +lat_1=40 +lat_2=41.66666666666666 +lat_0=39.33333333333334 +lon_0=-122 +x_0=2000000 +y_0=500000.0000000002 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane California II FIPS 0402 Feet +<102642> +proj=lcc +lat_1=38.33333333333334 +lat_2=39.83333333333334 +lat_0=37.66666666666666 +lon_0=-122 +x_0=2000000 +y_0=500000.0000000002 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane California III FIPS 0403 Feet +<102643> +proj=lcc +lat_1=37.06666666666667 +lat_2=38.43333333333333 +lat_0=36.5 +lon_0=-120.5 +x_0=2000000 +y_0=500000.0000000002 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane California IV FIPS 0404 Feet +<102644> +proj=lcc +lat_1=36 +lat_2=37.25 +lat_0=35.33333333333334 +lon_0=-119 +x_0=2000000 +y_0=500000.0000000002 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane California V FIPS 0405 Feet +<102645> +proj=lcc +lat_1=34.03333333333333 +lat_2=35.46666666666667 +lat_0=33.5 +lon_0=-118 +x_0=2000000 +y_0=500000.0000000002 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane California VI FIPS 0406 Feet +<102646> +proj=lcc +lat_1=32.78333333333333 +lat_2=33.88333333333333 +lat_0=32.16666666666666 +lon_0=-116.25 +x_0=2000000 +y_0=500000.0000000002 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Arizona East FIPS 0201 Feet +<102648> +proj=tmerc +lat_0=31 +lon_0=-110.1666666666667 +k=0.999900 +x_0=213360 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Arizona Central FIPS 0202 Feet +<102649> +proj=tmerc +lat_0=31 +lon_0=-111.9166666666667 +k=0.999900 +x_0=213360 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Arizona West FIPS 0203 Feet +<102650> +proj=tmerc +lat_0=31 +lon_0=-113.75 +k=0.999933 +x_0=213360 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Arkansas North FIPS 0301 Feet +<102651> +proj=lcc +lat_1=34.93333333333333 +lat_2=36.23333333333333 +lat_0=34.33333333333334 +lon_0=-92 +x_0=399999.9999999999 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Arkansas South FIPS 0302 Feet +<102652> +proj=lcc +lat_1=33.3 +lat_2=34.76666666666667 +lat_0=32.66666666666666 +lon_0=-92 +x_0=399999.9999999999 +y_0=399999.9999999999 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Colorado North FIPS 0501 Feet +<102653> +proj=lcc +lat_1=39.71666666666667 +lat_2=40.78333333333333 +lat_0=39.33333333333334 +lon_0=-105.5 +x_0=914401.8289 +y_0=304800.6096 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Colorado Central FIPS 0502 Feet +<102654> +proj=lcc +lat_1=38.45 +lat_2=39.75 +lat_0=37.83333333333334 +lon_0=-105.5 +x_0=914401.8289 +y_0=304800.6096 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Colorado South FIPS 0503 Feet +<102655> +proj=lcc +lat_1=37.23333333333333 +lat_2=38.43333333333333 +lat_0=36.66666666666666 +lon_0=-105.5 +x_0=914401.8289 +y_0=304800.6096 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Connecticut FIPS 0600 Feet +<102656> +proj=lcc +lat_1=41.2 +lat_2=41.86666666666667 +lat_0=40.83333333333334 +lon_0=-72.75 +x_0=304800.6096 +y_0=152400.3048 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Delaware FIPS 0700 Feet +<102657> +proj=tmerc +lat_0=38 +lon_0=-75.41666666666667 +k=0.999995 +x_0=200000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Florida East FIPS 0901 Feet +<102658> +proj=tmerc +lat_0=24.33333333333333 +lon_0=-81 +k=0.999941 +x_0=200000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Florida West FIPS 0902 Feet +<102659> +proj=tmerc +lat_0=24.33333333333333 +lon_0=-82 +k=0.999941 +x_0=200000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Florida North FIPS 0903 Feet +<102660> +proj=lcc +lat_1=29.58333333333333 +lat_2=30.75 +lat_0=29 +lon_0=-84.5 +x_0=600000.0000000001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Hawaii 1 FIPS 5101 Feet +<102661> +proj=tmerc +lat_0=18.83333333333333 +lon_0=-155.5 +k=0.999967 +x_0=500000.0000000002 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Hawaii 2 FIPS 5102 Feet +<102662> +proj=tmerc +lat_0=20.33333333333333 +lon_0=-156.6666666666667 +k=0.999967 +x_0=500000.0000000002 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Hawaii 3 FIPS 5103 Feet +<102663> +proj=tmerc +lat_0=21.16666666666667 +lon_0=-158 +k=0.999990 +x_0=500000.0000000002 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Hawaii 4 FIPS 5104 Feet +<102664> +proj=tmerc +lat_0=21.83333333333333 +lon_0=-159.5 +k=0.999990 +x_0=500000.0000000002 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Hawaii 5 FIPS 5105 Feet +<102665> +proj=tmerc +lat_0=21.66666666666667 +lon_0=-160.1666666666667 +k=1.000000 +x_0=500000.0000000002 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Georgia East FIPS 1001 Feet +<102666> +proj=tmerc +lat_0=30 +lon_0=-82.16666666666667 +k=0.999900 +x_0=200000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Georgia West FIPS 1002 Feet +<102667> +proj=tmerc +lat_0=30 +lon_0=-84.16666666666667 +k=0.999900 +x_0=700000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Idaho East FIPS 1101 Feet +<102668> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-112.1666666666667 +k=0.999947 +x_0=200000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Idaho Central FIPS 1102 Feet +<102669> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-114 +k=0.999947 +x_0=500000.0000000002 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Idaho West FIPS 1103 Feet +<102670> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-115.75 +k=0.999933 +x_0=799999.9999999999 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Illinois East FIPS 1201 Feet +<102671> +proj=tmerc +lat_0=36.66666666666666 +lon_0=-88.33333333333333 +k=0.999975 +x_0=300000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Illinois West FIPS 1202 Feet +<102672> +proj=tmerc +lat_0=36.66666666666666 +lon_0=-90.16666666666667 +k=0.999941 +x_0=700000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Indiana East FIPS 1301 Feet +<102673> +proj=tmerc +lat_0=37.5 +lon_0=-85.66666666666667 +k=0.999967 +x_0=100000 +y_0=250000 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Indiana West FIPS 1302 Feet +<102674> +proj=tmerc +lat_0=37.5 +lon_0=-87.08333333333333 +k=0.999967 +x_0=900000.0000000001 +y_0=250000 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Iowa North FIPS 1401 Feet +<102675> +proj=lcc +lat_1=42.06666666666667 +lat_2=43.26666666666667 +lat_0=41.5 +lon_0=-93.5 +x_0=1500000 +y_0=1000000 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Iowa South FIPS 1402 Feet +<102676> +proj=lcc +lat_1=40.61666666666667 +lat_2=41.78333333333333 +lat_0=40 +lon_0=-93.5 +x_0=500000.0000000002 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Kansas North FIPS 1501 Feet +<102677> +proj=lcc +lat_1=38.71666666666667 +lat_2=39.78333333333333 +lat_0=38.33333333333334 +lon_0=-98 +x_0=399999.9999999999 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Kansas South FIPS 1502 Feet +<102678> +proj=lcc +lat_1=37.26666666666667 +lat_2=38.56666666666667 +lat_0=36.66666666666666 +lon_0=-98.5 +x_0=399999.9999999999 +y_0=399999.9999999999 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Kentucky North FIPS 1601 Feet +<102679> +proj=lcc +lat_1=37.96666666666667 +lat_2=38.96666666666667 +lat_0=37.5 +lon_0=-84.25 +x_0=500000.0000000002 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Kentucky South FIPS 1602 Feet +<102680> +proj=lcc +lat_1=36.73333333333333 +lat_2=37.93333333333333 +lat_0=36.33333333333334 +lon_0=-85.75 +x_0=500000.0000000002 +y_0=500000.0000000002 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Louisiana North FIPS 1701 Feet +<102681> +proj=lcc +lat_1=31.16666666666667 +lat_2=32.66666666666666 +lat_0=30.5 +lon_0=-92.5 +x_0=1000000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Louisiana South FIPS 1702 Feet +<102682> +proj=lcc +lat_1=29.3 +lat_2=30.7 +lat_0=28.5 +lon_0=-91.33333333333333 +x_0=1000000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Maine East FIPS 1801 Feet +<102683> +proj=tmerc +lat_0=43.66666666666666 +lon_0=-68.5 +k=0.999900 +x_0=300000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Maine West FIPS 1802 Feet +<102684> +proj=tmerc +lat_0=42.83333333333334 +lon_0=-70.16666666666667 +k=0.999967 +x_0=900000.0000000001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Maryland FIPS 1900 Feet +<102685> +proj=lcc +lat_1=38.3 +lat_2=39.45 +lat_0=37.66666666666666 +lon_0=-77 +x_0=399999.9999999999 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Massachusetts Mainland FIPS 2001 Feet +<102686> +proj=lcc +lat_1=41.71666666666667 +lat_2=42.68333333333333 +lat_0=41 +lon_0=-71.5 +x_0=200000 +y_0=750000.0000000001 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Massachusetts Island FIPS 2002 Feet +<102687> +proj=lcc +lat_1=41.28333333333333 +lat_2=41.48333333333333 +lat_0=41 +lon_0=-70.5 +x_0=500000.0000000002 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Michigan North FIPS 2111 Feet +<102688> +proj=lcc +lat_1=45.48333333333333 +lat_2=47.08333333333334 +lat_0=44.78333333333333 +lon_0=-87 +x_0=7999999.999999999 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Michigan Central FIPS 2112 Feet +<102689> +proj=lcc +lat_1=44.18333333333333 +lat_2=45.7 +lat_0=43.31666666666667 +lon_0=-84.36666666666666 +x_0=6000000.000000001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Michigan South FIPS 2113 Feet +<102690> +proj=lcc +lat_1=42.1 +lat_2=43.66666666666666 +lat_0=41.5 +lon_0=-84.36666666666666 +x_0=4000000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Minnesota North FIPS 2201 Feet +<102691> +proj=lcc +lat_1=47.03333333333333 +lat_2=48.63333333333333 +lat_0=46.5 +lon_0=-93.09999999999999 +x_0=799999.9999999999 +y_0=100000 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Minnesota Central FIPS 2202 Feet +<102692> +proj=lcc +lat_1=45.61666666666667 +lat_2=47.05 +lat_0=45 +lon_0=-94.25 +x_0=799999.9999999999 +y_0=100000 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Minnesota South FIPS 2203 Feet +<102693> +proj=lcc +lat_1=43.78333333333333 +lat_2=45.21666666666667 +lat_0=43 +lon_0=-94 +x_0=799999.9999999999 +y_0=100000 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Mississippi East FIPS 2301 Feet +<102694> +proj=tmerc +lat_0=29.5 +lon_0=-88.83333333333333 +k=0.999950 +x_0=300000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Mississippi West FIPS 2302 Feet +<102695> +proj=tmerc +lat_0=29.5 +lon_0=-90.33333333333333 +k=0.999950 +x_0=700000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Missouri East FIPS 2401 Feet +<102696> +proj=tmerc +lat_0=35.83333333333334 +lon_0=-90.5 +k=0.999933 +x_0=250000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Missouri Central FIPS 2402 Feet +<102697> +proj=tmerc +lat_0=35.83333333333334 +lon_0=-92.5 +k=0.999933 +x_0=500000.0000000002 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Missouri West FIPS 2403 Feet +<102698> +proj=tmerc +lat_0=36.16666666666666 +lon_0=-94.5 +k=0.999941 +x_0=850000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Montana FIPS 2500 Feet +<102700> +proj=lcc +lat_1=45 +lat_2=49 +lat_0=44.25 +lon_0=-109.5 +x_0=600000.0000000001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Nebraska FIPS 2600 Feet +<102704> +proj=lcc +lat_1=40 +lat_2=43 +lat_0=39.83333333333334 +lon_0=-100 +x_0=500000.0000000002 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Nevada East FIPS 2701 Feet +<102707> +proj=tmerc +lat_0=34.75 +lon_0=-115.5833333333333 +k=0.999900 +x_0=200000 +y_0=7999999.999999999 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Nevada Central FIPS 2702 Feet +<102708> +proj=tmerc +lat_0=34.75 +lon_0=-116.6666666666667 +k=0.999900 +x_0=500000.0000000002 +y_0=6000000.000000001 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Nevada West FIPS 2703 Feet +<102709> +proj=tmerc +lat_0=34.75 +lon_0=-118.5833333333333 +k=0.999900 +x_0=799999.9999999999 +y_0=4000000 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane New Hampshire FIPS 2800 Feet +<102710> +proj=tmerc +lat_0=42.5 +lon_0=-71.66666666666667 +k=0.999967 +x_0=300000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane New Jersey FIPS 2900 Feet +<102711> +proj=tmerc +lat_0=38.83333333333334 +lon_0=-74.5 +k=0.999900 +x_0=150000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane New Mexico East FIPS 3001 Feet +<102712> +proj=tmerc +lat_0=31 +lon_0=-104.3333333333333 +k=0.999909 +x_0=165000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane New Mexico Central FIPS 3002 Feet +<102713> +proj=tmerc +lat_0=31 +lon_0=-106.25 +k=0.999900 +x_0=500000.0000000002 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane New Mexico West FIPS 3003 Feet +<102714> +proj=tmerc +lat_0=31 +lon_0=-107.8333333333333 +k=0.999917 +x_0=829999.9999999999 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane New York East FIPS 3101 Feet +<102715> +proj=tmerc +lat_0=38.83333333333334 +lon_0=-74.5 +k=0.999900 +x_0=150000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane New York Central FIPS 3102 Feet +<102716> +proj=tmerc +lat_0=40 +lon_0=-76.58333333333333 +k=0.999938 +x_0=250000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane New York West FIPS 3103 Feet +<102717> +proj=tmerc +lat_0=40 +lon_0=-78.58333333333333 +k=0.999938 +x_0=350000.0000000001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane New York Long Island FIPS 3104 Feet +<102718> +proj=lcc +lat_1=40.66666666666666 +lat_2=41.03333333333333 +lat_0=40.16666666666666 +lon_0=-74 +x_0=300000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane North Carolina FIPS 3200 Feet +<102719> +proj=lcc +lat_1=34.33333333333334 +lat_2=36.16666666666666 +lat_0=33.75 +lon_0=-79 +x_0=609601.2199999999 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane North Dakota North FIPS 3301 Feet +<102720> +proj=lcc +lat_1=47.43333333333333 +lat_2=48.73333333333333 +lat_0=47 +lon_0=-100.5 +x_0=600000.0000000001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane North Dakota South FIPS 3302 Feet +<102721> +proj=lcc +lat_1=46.18333333333333 +lat_2=47.48333333333333 +lat_0=45.66666666666666 +lon_0=-100.5 +x_0=600000.0000000001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Ohio North FIPS 3401 Feet +<102722> +proj=lcc +lat_1=40.43333333333333 +lat_2=41.7 +lat_0=39.66666666666666 +lon_0=-82.5 +x_0=600000.0000000001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Ohio South FIPS 3402 Feet +<102723> +proj=lcc +lat_1=38.73333333333333 +lat_2=40.03333333333333 +lat_0=38 +lon_0=-82.5 +x_0=600000.0000000001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Oklahoma North FIPS 3501 Feet +<102724> +proj=lcc +lat_1=35.56666666666667 +lat_2=36.76666666666667 +lat_0=35 +lon_0=-98 +x_0=600000.0000000001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Oklahoma South FIPS 3502 Feet +<102725> +proj=lcc +lat_1=33.93333333333333 +lat_2=35.23333333333333 +lat_0=33.33333333333334 +lon_0=-98 +x_0=600000.0000000001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Oregon North FIPS 3601 Feet +<102726> +proj=lcc +lat_1=44.33333333333334 +lat_2=46 +lat_0=43.66666666666666 +lon_0=-120.5 +x_0=2500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Oregon South FIPS 3602 Feet +<102727> +proj=lcc +lat_1=42.33333333333334 +lat_2=44 +lat_0=41.66666666666666 +lon_0=-120.5 +x_0=1500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Pennsylvania North FIPS 3701 Feet +<102728> +proj=lcc +lat_1=40.88333333333333 +lat_2=41.95 +lat_0=40.16666666666666 +lon_0=-77.75 +x_0=600000.0000000001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Pennsylvania South FIPS 3702 Feet +<102729> +proj=lcc +lat_1=39.93333333333333 +lat_2=40.96666666666667 +lat_0=39.33333333333334 +lon_0=-77.75 +x_0=600000.0000000001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Rhode Island FIPS 3800 Feet +<102730> +proj=tmerc +lat_0=41.08333333333334 +lon_0=-71.5 +k=0.999994 +x_0=100000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane South Carolina FIPS 3900 Feet +<102733> +proj=lcc +lat_1=32.5 +lat_2=34.83333333333334 +lat_0=31.83333333333333 +lon_0=-81 +x_0=609600.0000000001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane South Dakota North FIPS 4001 Feet +<102734> +proj=lcc +lat_1=44.41666666666666 +lat_2=45.68333333333333 +lat_0=43.83333333333334 +lon_0=-100 +x_0=600000.0000000001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane South Dakota South FIPS 4002 Feet +<102735> +proj=lcc +lat_1=42.83333333333334 +lat_2=44.4 +lat_0=42.33333333333334 +lon_0=-100.3333333333333 +x_0=600000.0000000001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Tennessee FIPS 4100 Feet +<102736> +proj=lcc +lat_1=35.25 +lat_2=36.41666666666666 +lat_0=34.33333333333334 +lon_0=-86 +x_0=600000.0000000001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Texas North FIPS 4201 Feet +<102737> +proj=lcc +lat_1=34.65 +lat_2=36.18333333333333 +lat_0=34 +lon_0=-101.5 +x_0=200000 +y_0=1000000 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Texas North Central FIPS 4202 Feet +<102738> +proj=lcc +lat_1=32.13333333333333 +lat_2=33.96666666666667 +lat_0=31.66666666666667 +lon_0=-98.5 +x_0=600000.0000000001 +y_0=2000000 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Texas Central FIPS 4203 Feet +<102739> +proj=lcc +lat_1=30.11666666666667 +lat_2=31.88333333333333 +lat_0=29.66666666666667 +lon_0=-100.3333333333333 +x_0=700000 +y_0=3000000 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Texas South Central FIPS 4204 Feet +<102740> +proj=lcc +lat_1=28.38333333333333 +lat_2=30.28333333333334 +lat_0=27.83333333333333 +lon_0=-99 +x_0=600000.0000000001 +y_0=4000000 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Texas South FIPS 4205 Feet +<102741> +proj=lcc +lat_1=26.16666666666667 +lat_2=27.83333333333333 +lat_0=25.66666666666667 +lon_0=-98.5 +x_0=300000 +y_0=4999999.999999999 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Utah North FIPS 4301 Feet +<102742> +proj=lcc +lat_1=40.71666666666667 +lat_2=41.78333333333333 +lat_0=40.33333333333334 +lon_0=-111.5 +x_0=500000.0000000002 +y_0=1000000 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Utah Central FIPS 4302 Feet +<102743> +proj=lcc +lat_1=39.01666666666667 +lat_2=40.65 +lat_0=38.33333333333334 +lon_0=-111.5 +x_0=500000.0000000002 +y_0=2000000 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Utah South FIPS 4303 Feet +<102744> +proj=lcc +lat_1=37.21666666666667 +lat_2=38.35 +lat_0=36.66666666666666 +lon_0=-111.5 +x_0=500000.0000000002 +y_0=3000000 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Vermont FIPS 4400 Feet +<102745> +proj=tmerc +lat_0=42.5 +lon_0=-72.5 +k=0.999964 +x_0=500000.0000000002 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Virginia North FIPS 4501 Feet +<102746> +proj=lcc +lat_1=38.03333333333333 +lat_2=39.2 +lat_0=37.66666666666666 +lon_0=-78.5 +x_0=3499999.999999999 +y_0=2000000 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Virginia South FIPS 4502 Feet +<102747> +proj=lcc +lat_1=36.76666666666667 +lat_2=37.96666666666667 +lat_0=36.33333333333334 +lon_0=-78.5 +x_0=3499999.999999999 +y_0=1000000 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Washington North FIPS 4601 Feet +<102748> +proj=lcc +lat_1=47.5 +lat_2=48.73333333333333 +lat_0=47 +lon_0=-120.8333333333333 +x_0=500000.0000000002 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Washington South FIPS 4602 Feet +<102749> +proj=lcc +lat_1=45.83333333333334 +lat_2=47.33333333333334 +lat_0=45.33333333333334 +lon_0=-120.5 +x_0=500000.0000000002 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane West Virginia North FIPS 4701 Feet +<102750> +proj=lcc +lat_1=39 +lat_2=40.25 +lat_0=38.5 +lon_0=-79.5 +x_0=600000.0000000001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane West Virginia South FIPS 4702 Feet +<102751> +proj=lcc +lat_1=37.48333333333333 +lat_2=38.88333333333333 +lat_0=37 +lon_0=-81 +x_0=600000.0000000001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Wisconsin North FIPS 4801 Feet +<102752> +proj=lcc +lat_1=45.56666666666667 +lat_2=46.76666666666667 +lat_0=45.16666666666666 +lon_0=-90 +x_0=600000.0000000001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Wisconsin Central FIPS 4802 Feet +<102753> +proj=lcc +lat_1=44.25 +lat_2=45.5 +lat_0=43.83333333333334 +lon_0=-90 +x_0=600000.0000000001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Wisconsin South FIPS 4803 Feet +<102754> +proj=lcc +lat_1=42.73333333333333 +lat_2=44.06666666666667 +lat_0=42 +lon_0=-90 +x_0=600000.0000000001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Wyoming East FIPS 4901 Feet +<102755> +proj=tmerc +lat_0=40.5 +lon_0=-105.1666666666667 +k=0.999938 +x_0=200000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Wyoming East Central FIPS 4902 Feet +<102756> +proj=tmerc +lat_0=40.5 +lon_0=-107.3333333333333 +k=0.999938 +x_0=399999.9999999999 +y_0=100000 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Wyoming West Central FIPS 4903 Feet +<102757> +proj=tmerc +lat_0=40.5 +lon_0=-108.75 +k=0.999938 +x_0=600000.0000000001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Wyoming West FIPS 4904 Feet +<102758> +proj=tmerc +lat_0=40.5 +lon_0=-110.0833333333333 +k=0.999938 +x_0=799999.9999999999 +y_0=100000 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Puerto Rico Virgin Islands FIPS 5200 Feet +<102761> +proj=lcc +lat_1=18.03333333333334 +lat_2=18.43333333333333 +lat_0=17.83333333333333 +lon_0=-66.43333333333334 +x_0=200000 +y_0=200000 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# NAD 1983 StatePlane Guam FIPS 5400 Feet +<102766> +proj=poly +lat_0=13.47246635277778 +lon_0=-144.7487507055556 +x_0=49999.99999999999 +y_0=49999.99999999999 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs <> +# Belge Lambert 1972 +<103300> +proj=lcc +lat_1=49.8333339 +lat_2=51.16666733333333 +lat_0=90 +lon_0=4.367486666666666 +x_0=150000.01256 +y_0=5400088.4378 +ellps=intl +units=m +no_defs <> +# GCS International 1967 +<4023> +proj=longlat +ellps=aust_SA +no_defs <> +# GCS Bern 1898 +<4217> +proj=longlat +ellps=bessel +no_defs <> +# GCS Voirol Unifie 1960 +<4305> +proj=longlat +ellps=clrk80 +no_defs <> +# GCS Montserrat 1958 +<4404> +proj=longlat +ellps=clrk80 +no_defs <> +# GCS Voirol Unifie 1960 Paris +<4812> +proj=longlat +ellps=clrk80 +pm=2.337229166666667 +no_defs <> +# GCS WGS 1966 +<37001> +proj=longlat +ellps=WGS66 +no_defs <> +# GCS Fischer 1960 +<37002> +proj=longlat +a=6378166 +b=6356784.283607107 +no_defs <> +# GCS Fischer 1968 +<37003> +proj=longlat +a=6378150 +b=6356768.337244385 +no_defs <> +# GCS Fischer Modified +<37004> +proj=longlat +ellps=fschr60m +no_defs <> +# GCS Hough 1960 +<37005> +proj=longlat +a=6378270 +b=6356794.343434343 +no_defs <> +# GCS Everest Modified 1969 +<37006> +proj=longlat +a=6377295.664 +b=6356094.667915204 +no_defs <> +# GCS Walbeck +<37007> +proj=longlat +a=6376896 +b=6355834.846687363 +no_defs <> +# GCS Sphere ARC INFO +<37008> +proj=longlat +a=6370997 +b=6370997 +no_defs <> +# GCS European 1979 +<37201> +proj=longlat +ellps=intl +no_defs <> +# GCS Everest Bangladesh +<37202> +proj=longlat +a=6377276.345 +b=6356075.413140239 +no_defs <> +# GCS Everest India Nepal +<37203> +proj=longlat +a=6377301.243 +b=6356100.230165385 +no_defs <> +# GCS Hjorsey 1955 +<37204> +proj=longlat +ellps=intl +no_defs <> +# GCS Hong Kong 1963 +<37205> +proj=longlat +ellps=intl +no_defs <> +# GCS Oman +<37206> +proj=longlat +ellps=clrk80 +no_defs <> +# GCS South Asia Singapore +<37207> +proj=longlat +ellps=fschr60m +no_defs <> +# GCS Ayabelle +<37208> +proj=longlat +ellps=clrk80 +no_defs <> +# GCS Point 58 +<37211> +proj=longlat +ellps=clrk80 +no_defs <> +# GCS Beacon E 1945 +<37212> +proj=longlat +ellps=intl +no_defs <> +# GCS Tern Island 1961 +<37213> +proj=longlat +ellps=intl +no_defs <> +# GCS Astro 1952 +<37214> +proj=longlat +ellps=intl +no_defs <> +# GCS Bellevue IGN +<37215> +proj=longlat +ellps=intl +no_defs <> +# GCS Canton 1966 +<37216> +proj=longlat +ellps=intl +no_defs <> +# GCS Chatham Island 1971 +<37217> +proj=longlat +ellps=intl +no_defs <> +# GCS DOS 1968 +<37218> +proj=longlat +ellps=intl +no_defs <> +# GCS Easter Island 1967 +<37219> +proj=longlat +ellps=intl +no_defs <> +# GCS Guam 1963 +<37220> +proj=longlat +ellps=clrk66 +no_defs <> +# GCS GUX 1 +<37221> +proj=longlat +ellps=intl +no_defs <> +# GCS Johnston Island 1961 +<37222> +proj=longlat +ellps=intl +no_defs <> +# GCS Carthage Degree +<37223> +proj=longlat +a=6378249.2 +b=6356514.999904194 +no_defs <> +# GCS Midway 1961 +<37224> +proj=longlat +ellps=intl +no_defs <> +# GCS Pitcairn 1967 +<37226> +proj=longlat +ellps=intl +no_defs <> +# GCS Santo DOS 1965 +<37227> +proj=longlat +ellps=intl +no_defs <> +# GCS Viti Levu 1916 +<37228> +proj=longlat +ellps=clrk80 +no_defs <> +# GCS Wake Eniwetok 1960 +<37229> +proj=longlat +a=6378270 +b=6356794.343434343 +no_defs <> +# GCS Wake Island 1952 +<37230> +proj=longlat +ellps=intl +no_defs <> +# GCS Anna 1 1965 +<37231> +proj=longlat +ellps=aust_SA +no_defs <> +# GCS Gan 1970 +<37232> +proj=longlat +ellps=intl +no_defs <> +# GCS ISTS 073 1969 +<37233> +proj=longlat +ellps=intl +no_defs <> +# GCS Kerguelen Island 1949 +<37234> +proj=longlat +ellps=intl +no_defs <> +# GCS Reunion +<37235> +proj=longlat +ellps=intl +no_defs <> +# GCS Ascension Island 1958 +<37237> +proj=longlat +ellps=intl +no_defs <> +# GCS DOS 71 4 +<37238> +proj=longlat +ellps=intl +no_defs <> +# GCS Cape Canaveral +<37239> +proj=longlat +ellps=clrk66 +no_defs <> +# GCS Fort Thomas 1955 +<37240> +proj=longlat +ellps=clrk80 +no_defs <> +# GCS Graciosa Base SW 1948 +<37241> +proj=longlat +ellps=intl +no_defs <> +# GCS ISTS 061 1968 +<37242> +proj=longlat +ellps=intl +no_defs <> +# GCS LC5 1961 +<37243> +proj=longlat +ellps=clrk66 +no_defs <> +# GCS Observ Meteorologico 1939 +<37245> +proj=longlat +ellps=intl +no_defs <> +# GCS Pico de Las Nieves +<37246> +proj=longlat +ellps=intl +no_defs <> +# GCS Porto Santo 1936 +<37247> +proj=longlat +ellps=intl +no_defs <> +# GCS Sao Braz +<37249> +proj=longlat +ellps=intl +no_defs <> +# GCS Selvagem Grande 1938 +<37250> +proj=longlat +ellps=intl +no_defs <> +# GCS Tristan 1968 +<37251> +proj=longlat +ellps=intl +no_defs <> +# GCS Samoa 1962 +<37252> +proj=longlat +ellps=clrk66 +no_defs <> +# GCS Camp Area +<37253> +proj=longlat +ellps=intl +no_defs <> +# GCS Deception Island +<37254> +proj=longlat +ellps=clrk80 +no_defs <> +# GCS Gunung Segara +<37255> +proj=longlat +ellps=bessel +no_defs <> +# GCS S42 Hungary +<37257> +proj=longlat +ellps=krass +no_defs <> +# GCS Kusaie 1951 +<37259> +proj=longlat +ellps=intl +no_defs <> +# GCS Alaskan Islands +<37260> +proj=longlat +ellps=clrk66 +no_defs <> +# GCS Assumed Geographic 1 +<104000> +proj=longlat +ellps=clrk66 +datum=NAD27 +no_defs <> +# GCS Estonia 1937 +<104101> +proj=longlat +ellps=bessel +no_defs <> +# GCS Hermannskogel +<104102> +proj=longlat +ellps=bessel +no_defs <> +# GCS Sierra Leone 1960 +<104103> +proj=longlat +ellps=clrk80 +no_defs <> +# GCS Hong Kong 1980 +<104104> +proj=longlat +ellps=intl +no_defs <> +# GCS Datum Lisboa Bessel +<104105> +proj=longlat +ellps=bessel +no_defs <> +# GCS Datum Lisboa Hayford +<104106> +proj=longlat +ellps=intl +no_defs <> +# GCS RGF 1993 +<104107> +proj=longlat +ellps=GRS80 +no_defs <> +# GCS NZGD 2000 +<104108> +proj=longlat +ellps=GRS80 +no_defs <> +# GCS Merchich Degree +<104261> +proj=longlat +a=6378249.2 +b=6356514.999904194 +no_defs <> +# GCS Voirol 1875 Degree +<104304> +proj=longlat +a=6378249.2 +b=6356514.999904194 +no_defs <> +# GCS Voirol Unifie 1960 Degree +<104305> +proj=longlat +ellps=clrk80 +no_defs <> diff --git a/www/assets/iosevka-light.woff b/www/assets/iosevka-light.woff new file mode 100644 index 000000000..6d9ca6512 Binary files /dev/null and b/www/assets/iosevka-light.woff differ diff --git a/www/assets/iosevka-light.woff2 b/www/assets/iosevka-light.woff2 new file mode 100644 index 000000000..b754d48e7 Binary files /dev/null and b/www/assets/iosevka-light.woff2 differ diff --git a/www/assets/iosevka-regular.woff b/www/assets/iosevka-regular.woff new file mode 100644 index 000000000..37c1124eb Binary files /dev/null and b/www/assets/iosevka-regular.woff differ diff --git a/www/assets/iosevka-regular.woff2 b/www/assets/iosevka-regular.woff2 new file mode 100644 index 000000000..1012e4104 Binary files /dev/null and b/www/assets/iosevka-regular.woff2 differ diff --git a/www/assets/iosevka-slab-light.woff b/www/assets/iosevka-slab-light.woff new file mode 100644 index 000000000..9c5a9b82d Binary files /dev/null and b/www/assets/iosevka-slab-light.woff differ diff --git a/www/assets/iosevka-slab-light.woff2 b/www/assets/iosevka-slab-light.woff2 new file mode 100644 index 000000000..49f55a285 Binary files /dev/null and b/www/assets/iosevka-slab-light.woff2 differ diff --git a/www/assets/nad27 b/www/assets/nad27 new file mode 100644 index 000000000..6e06900cd --- /dev/null +++ b/www/assets/nad27 @@ -0,0 +1,809 @@ +# SCCSID @(#)nad27 4.1 92/12/20 GIE +# proj +init files for: +# +# State Plane Coordinate Systems, +# North American Datum 1927 + +# 101: alabama east: nad27 +<101> proj=tmerc datum=NAD27 +lon_0=-85d50 lat_0=30d30 k=.99996 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 102: alabama west: nad27 +<102> proj=tmerc datum=NAD27 +lon_0=-87d30 lat_0=30 k=.9999333333333333 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 5010: alaska zone no. 10: nad27 +<5010> proj=lcc datum=NAD27 +lon_0=-176 lat_1=53d50 lat_2=51d50 lat_0=51 +x_0=914401.8288036576 y_0=0 +no_defs <> + +# 5300: american samoa: nad27 +<5300> proj=lcc datum=NAD27 +lon_0=-170 lat_1=-14d16 lat_2=-14d16 lat_0=-14d16 +x_0=152400.3048006096 y_0=95169.31165862332 +no_defs <> + +# 201: arizona east: nad27 +<201> proj=tmerc datum=NAD27 +lon_0=-110d10 lat_0=31 k=.9999 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 202: arizona central: nad27 +<202> proj=tmerc datum=NAD27 +lon_0=-111d55 lat_0=31 k=.9999 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 203: arizona west: nad27 +<203> proj=tmerc datum=NAD27 +lon_0=-113d45 lat_0=31 k=.9999333333333333 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 301: arkansas north: nad27 +<301> proj=lcc datum=NAD27 +lon_0=-92 lat_1=36d14 lat_2=34d56 lat_0=34d20 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 302: arkansas south: nad27 +<302> proj=lcc datum=NAD27 +lon_0=-92 lat_1=34d46 lat_2=33d18 lat_0=32d40 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 401: california i: nad27 +<401> proj=lcc datum=NAD27 +lon_0=-122 lat_1=41d40 lat_2=40 lat_0=39d20 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 402: california ii: nad27 +<402> proj=lcc datum=NAD27 +lon_0=-122 lat_1=39d50 lat_2=38d20 lat_0=37d40 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 403: california iii: nad27 +<403> proj=lcc datum=NAD27 +lon_0=-120d30 lat_1=38d26 lat_2=37d4 lat_0=36d30 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 404: california iv: nad27 +<404> proj=lcc datum=NAD27 +lon_0=-119 lat_1=37d15 lat_2=36 lat_0=35d20 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 405: california v: nad27 +<405> proj=lcc datum=NAD27 +lon_0=-118 lat_1=35d28 lat_2=34d2 lat_0=33d30 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 406: california vi: nad27 +<406> proj=lcc datum=NAD27 +lon_0=-116d15 lat_1=33d53 lat_2=32d47 lat_0=32d10 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 407: california vii: nad27 +<407> proj=lcc datum=NAD27 +lon_0=-118d20 lat_1=34d25 lat_2=33d52 lat_0=34d8 +x_0=1276106.450596901 y_0=1268253.006858014 +no_defs <> + +# 501: colorado north: nad27 +<501> proj=lcc datum=NAD27 +lon_0=-105d30 lat_1=40d47 lat_2=39d43 lat_0=39d20 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 502: colorado central: nad27 +<502> proj=lcc datum=NAD27 +lon_0=-105d30 lat_1=39d45 lat_2=38d27 lat_0=37d50 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 503: colorado south: nad27 +<503> proj=lcc datum=NAD27 +lon_0=-105d30 lat_1=38d26 lat_2=37d14 lat_0=36d40 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 600: connecticut ---: nad27 +<600> proj=lcc datum=NAD27 +lon_0=-72d45 lat_1=41d52 lat_2=41d12 lat_0=40d50 +x_0=182880.3657607315 y_0=0 +no_defs <> + +# 700: delaware ---: nad27 +<700> proj=tmerc datum=NAD27 +lon_0=-75d25 lat_0=38 k=.999995 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 901: florida east: nad27 +<901> proj=tmerc datum=NAD27 +lon_0=-81 lat_0=24d20 k=.9999411764705882 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 902: florida west: nad27 +<902> proj=tmerc datum=NAD27 +lon_0=-82 lat_0=24d20 k=.9999411764705882 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 903: florida north: nad27 +<903> proj=lcc datum=NAD27 +lon_0=-84d30 lat_1=30d45 lat_2=29d35 lat_0=29 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 1001: georgia east: nad27 +<1001> proj=tmerc datum=NAD27 +lon_0=-82d10 lat_0=30 k=.9999 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 1002: georgia west: nad27 +<1002> proj=tmerc datum=NAD27 +lon_0=-84d10 lat_0=30 k=.9999 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 5101: hawaii 1: nad27 +<5101> proj=tmerc datum=NAD27 +lon_0=-155d30 lat_0=18d50 k=.9999666666666667 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 5102: hawaii 2: nad27 +<5102> proj=tmerc datum=NAD27 +lon_0=-156d40 lat_0=20d20 k=.9999666666666667 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 5103: hawaii 3: nad27 +<5103> proj=tmerc datum=NAD27 +lon_0=-158 lat_0=21d10 k=.99999 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 5104: hawaii 4: nad27 +<5104> proj=tmerc datum=NAD27 +lon_0=-159d30 lat_0=21d50 k=.99999 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 5105: hawaii 5: nad27 +<5105> proj=tmerc datum=NAD27 +lon_0=-160d10 lat_0=21d40 k=1 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 1101: idaho east: nad27 +<1101> proj=tmerc datum=NAD27 +lon_0=-112d10 lat_0=41d40 k=.9999473684210526 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 1102: idaho central: nad27 +<1102> proj=tmerc datum=NAD27 +lon_0=-114 lat_0=41d40 k=.9999473684210526 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 1103: idaho west: nad27 +<1103> proj=tmerc datum=NAD27 +lon_0=-115d45 lat_0=41d40 k=.9999333333333333 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 1201: illinois east: nad27 +<1201> proj=tmerc datum=NAD27 +lon_0=-88d20 lat_0=36d40 k=.999975 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 1202: illinois west: nad27 +<1202> proj=tmerc datum=NAD27 +lon_0=-90d10 lat_0=36d40 k=.9999411764705882 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 1301: indiana east: nad27 +<1301> proj=tmerc datum=NAD27 +lon_0=-85d40 lat_0=37d30 k=.9999666666666667 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 1302: indiana west: nad27 +<1302> proj=tmerc datum=NAD27 +lon_0=-87d5 lat_0=37d30 k=.9999666666666667 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 1401: iowa north: nad27 +<1401> proj=lcc datum=NAD27 +lon_0=-93d30 lat_1=43d16 lat_2=42d4 lat_0=41d30 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 1402: iowa south: nad27 +<1402> proj=lcc datum=NAD27 +lon_0=-93d30 lat_1=41d47 lat_2=40d37 lat_0=40 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 1501: kansas north: nad27 +<1501> proj=lcc datum=NAD27 +lon_0=-98 lat_1=39d47 lat_2=38d43 lat_0=38d20 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 1502: kansas south: nad27 +<1502> proj=lcc datum=NAD27 +lon_0=-98d30 lat_1=38d34 lat_2=37d16 lat_0=36d40 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 1601: kentucky north: nad27 +<1601> proj=lcc datum=NAD27 +lon_0=-84d15 lat_1=38d58 lat_2=37d58 lat_0=37d30 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 1602: kentucky south: nad27 +<1602> proj=lcc datum=NAD27 +lon_0=-85d45 lat_1=37d56 lat_2=36d44 lat_0=36d20 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 1701: louisiana north: nad27 +<1701> proj=lcc datum=NAD27 +lon_0=-92d30 lat_1=32d40 lat_2=31d10 lat_0=30d40 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 1702: louisiana south: nad27 +<1702> proj=lcc datum=NAD27 +lon_0=-91d20 lat_1=30d42 lat_2=29d18 lat_0=28d40 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 1703: louisiana offshore: nad27 +<1703> proj=lcc datum=NAD27 +lon_0=-91d20 lat_1=27d50 lat_2=26d10 lat_0=25d40 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 1801: maine east: nad27 +<1801> proj=tmerc datum=NAD27 +lon_0=-68d30 lat_0=43d50 k=.9999 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 1802: maine west: nad27 +<1802> proj=tmerc datum=NAD27 +lon_0=-70d10 lat_0=42d50 k=.9999666666666667 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 1900: maryland ---: nad27 +<1900> proj=lcc datum=NAD27 +lon_0=-77 lat_1=39d27 lat_2=38d18 lat_0=37d50 +x_0=243840.4876809754 y_0=0 +no_defs <> + +# 2001: massachusetts mainland: nad27 +<2001> proj=lcc datum=NAD27 +lon_0=-71d30 lat_1=42d41 lat_2=41d43 lat_0=41 +x_0=182880.3657607315 y_0=0 +no_defs <> + +# 2002: massachusetts island: nad27 +<2002> proj=lcc datum=NAD27 +lon_0=-70d30 lat_1=41d29 lat_2=41d17 lat_0=41 +x_0=60960.12192024384 y_0=0 +no_defs <> + +# 2101: michigan east: nad27 +<2101> proj=tmerc datum=NAD27 +lon_0=-83d40 lat_0=41d30 k=.9999428571428571 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 2102: michigan central/m: nad27 +<2102> proj=tmerc datum=NAD27 +lon_0=-85d45 lat_0=41d30 k=.9999090909090909 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 2103: michigan west: nad27 +<2103> proj=tmerc datum=NAD27 +lon_0=-88d45 lat_0=41d30 k=.9999090909090909 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 2111: michigan north: nad27 +<2111> proj=lcc a=6378450.047 es=.006768657997291094 +lon_0=-87 lat_1=47d5 lat_2=45d29 lat_0=44d47 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 2112: michigan central/l: nad27 +<2112> proj=lcc a=6378450.047 es=.006768657997291094 +lon_0=-84d20 lat_1=45d42 lat_2=44d11 lat_0=43d19 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 2113: michigan south: nad27 +<2113> proj=lcc a=6378450.047 es=.006768657997291094 +lon_0=-84d20 lat_1=43d40 lat_2=42d6 lat_0=41d30 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 2201: minnesota north: nad27 +<2201> proj=lcc datum=NAD27 +lon_0=-93d6 lat_1=48d38 lat_2=47d2 lat_0=46d30 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 2202: minnesota central: nad27 +<2202> proj=lcc datum=NAD27 +lon_0=-94d15 lat_1=47d3 lat_2=45d37 lat_0=45 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 2203: minnesota south: nad27 +<2203> proj=lcc datum=NAD27 +lon_0=-94 lat_1=45d13 lat_2=43d47 lat_0=43 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 2301: mississippi east: nad27 +<2301> proj=tmerc datum=NAD27 +lon_0=-88d50 lat_0=29d40 k=.99996 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 2302: mississippi west: nad27 +<2302> proj=tmerc datum=NAD27 +lon_0=-90d20 lat_0=30d30 k=.9999411764705882 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 2401: missouri east: nad27 +<2401> proj=tmerc datum=NAD27 +lon_0=-90d30 lat_0=35d50 k=.9999333333333333 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 2402: missouri central: nad27 +<2402> proj=tmerc datum=NAD27 +lon_0=-92d30 lat_0=35d50 k=.9999333333333333 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 2403: missouri west: nad27 +<2403> proj=tmerc datum=NAD27 +lon_0=-94d30 lat_0=36d10 k=.9999411764705882 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 2501: montana north: nad27 +<2501> proj=lcc datum=NAD27 +lon_0=-109d30 lat_1=48d43 lat_2=47d51 lat_0=47 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 2502: montana central: nad27 +<2502> proj=lcc datum=NAD27 +lon_0=-109d30 lat_1=47d53 lat_2=46d27 lat_0=45d50 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 2503: montana south: nad27 +<2503> proj=lcc datum=NAD27 +lon_0=-109d30 lat_1=46d24 lat_2=44d52 lat_0=44 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 2601: nebraska north: nad27 +<2601> proj=lcc datum=NAD27 +lon_0=-100 lat_1=42d49 lat_2=41d51 lat_0=41d20 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 2602: nebraska south: nad27 +<2602> proj=lcc datum=NAD27 +lon_0=-99d30 lat_1=41d43 lat_2=40d17 lat_0=39d40 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 2701: nevada east: nad27 +<2701> proj=tmerc datum=NAD27 +lon_0=-115d35 lat_0=34d45 k=.9999 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 2702: nevada central: nad27 +<2702> proj=tmerc datum=NAD27 +lon_0=-116d40 lat_0=34d45 k=.9999 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 2703: nevada west: nad27 +<2703> proj=tmerc datum=NAD27 +lon_0=-118d35 lat_0=34d45 k=.9999 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 2800: new hampshire ---: nad27 +<2800> proj=tmerc datum=NAD27 +lon_0=-71d40 lat_0=42d30 k=.9999666666666667 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 2900: new jersey ---: nad27 +<2900> proj=tmerc datum=NAD27 +lon_0=-74d40 lat_0=38d50 k=.999975 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 3001: new mexico east: nad27 +<3001> proj=tmerc datum=NAD27 +lon_0=-104d20 lat_0=31 k=.9999090909090909 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 3002: new mexico central: nad27 +<3002> proj=tmerc datum=NAD27 +lon_0=-106d15 lat_0=31 k=.9999 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 3003: new mexico west: nad27 +<3003> proj=tmerc datum=NAD27 +lon_0=-107d50 lat_0=31 k=.9999166666666667 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 3101: new york east: nad27 +<3101> proj=tmerc datum=NAD27 +lon_0=-74d20 lat_0=40 k=.9999666666666667 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 3102: new york central: nad27 +<3102> proj=tmerc datum=NAD27 +lon_0=-76d35 lat_0=40 k=.9999375 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 3103: new york west: nad27 +<3103> proj=tmerc datum=NAD27 +lon_0=-78d35 lat_0=40 k=.9999375 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 3104: new york long island: nad27 +<3104> proj=lcc datum=NAD27 +lon_0=-74 lat_1=41d2 lat_2=40d40 lat_0=40d30 +x_0=609601.2192024384 y_0=30480.06096012192 +no_defs <> + +# 3200: north carolina ---: nad27 +<3200> proj=lcc datum=NAD27 +lon_0=-79 lat_1=36d10 lat_2=34d20 lat_0=33d45 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 3301: north dakota north: nad27 +<3301> proj=lcc datum=NAD27 +lon_0=-100d30 lat_1=48d44 lat_2=47d26 lat_0=47 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 3302: north dakota south: nad27 +<3302> proj=lcc datum=NAD27 +lon_0=-100d30 lat_1=47d29 lat_2=46d11 lat_0=45d40 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 3401: ohio north: nad27 +<3401> proj=lcc datum=NAD27 +lon_0=-82d30 lat_1=41d42 lat_2=40d26 lat_0=39d40 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 3402: ohio south: nad27 +<3402> proj=lcc datum=NAD27 +lon_0=-82d30 lat_1=40d2 lat_2=38d44 lat_0=38 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 3501: oklahoma north: nad27 +<3501> proj=lcc datum=NAD27 +lon_0=-98 lat_1=36d46 lat_2=35d34 lat_0=35 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 3502: oklahoma south: nad27 +<3502> proj=lcc datum=NAD27 +lon_0=-98 lat_1=35d14 lat_2=33d56 lat_0=33d20 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 3601: oregon north: nad27 +<3601> proj=lcc datum=NAD27 +lon_0=-120d30 lat_1=46 lat_2=44d20 lat_0=43d40 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 3602: oregon south: nad27 +<3602> proj=lcc datum=NAD27 +lon_0=-120d30 lat_1=44 lat_2=42d20 lat_0=41d40 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 3701: pennsylvania north: nad27 +<3701> proj=lcc datum=NAD27 +lon_0=-77d45 lat_1=41d57 lat_2=40d53 lat_0=40d10 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 3702: pennsylvania south: nad27 +<3702> proj=lcc datum=NAD27 +lon_0=-77d45 lat_1=40d58 lat_2=39d56 lat_0=39d20 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 3800: rhode island ---: nad27 +<3800> proj=tmerc datum=NAD27 +lon_0=-71d30 lat_0=41d5 k=.99999375 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 3901: south carolina north: nad27 +<3901> proj=lcc datum=NAD27 +lon_0=-81 lat_1=34d58 lat_2=33d46 lat_0=33 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 3902: south carolina south: nad27 +<3902> proj=lcc datum=NAD27 +lon_0=-81 lat_1=33d40 lat_2=32d20 lat_0=31d50 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 4001: south dakota north: nad27 +<4001> proj=lcc datum=NAD27 +lon_0=-100 lat_1=45d41 lat_2=44d25 lat_0=43d50 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 4002: south dakota south: nad27 +<4002> proj=lcc datum=NAD27 +lon_0=-100d20 lat_1=44d24 lat_2=42d50 lat_0=42d20 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 4100: tennessee ---: nad27 +<4100> proj=lcc datum=NAD27 +lon_0=-86 lat_1=36d25 lat_2=35d15 lat_0=34d40 +x_0=609601.2192024384 y_0=30480.06096012192 +no_defs <> + +# 4201: texas north: nad27 +<4201> proj=lcc datum=NAD27 +lon_0=-101d30 lat_1=36d11 lat_2=34d39 lat_0=34 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 4202: texas north central: nad27 +<4202> proj=lcc datum=NAD27 +lon_0=-97d30 lat_1=33d58 lat_2=32d8 lat_0=31d40 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 4203: texas central: nad27 +<4203> proj=lcc datum=NAD27 +lon_0=-100d20 lat_1=31d53 lat_2=30d7 lat_0=29d40 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 4204: texas south central: nad27 +<4204> proj=lcc datum=NAD27 +lon_0=-99 lat_1=30d17 lat_2=28d23 lat_0=27d50 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 4205: texas south: nad27 +<4205> proj=lcc datum=NAD27 +lon_0=-98d30 lat_1=27d50 lat_2=26d10 lat_0=25d40 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 4301: utah north: nad27 +<4301> proj=lcc datum=NAD27 +lon_0=-111d30 lat_1=41d47 lat_2=40d43 lat_0=40d20 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 4302: utah central: nad27 +<4302> proj=lcc datum=NAD27 +lon_0=-111d30 lat_1=40d39 lat_2=39d1 lat_0=38d20 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 4303: utah south: nad27 +<4303> proj=lcc datum=NAD27 +lon_0=-111d30 lat_1=38d21 lat_2=37d13 lat_0=36d40 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 4400: vermont ---: nad27 +<4400> proj=tmerc datum=NAD27 +lon_0=-72d30 lat_0=42d30 k=.9999642857142857 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 4501: virginia north: nad27 +<4501> proj=lcc datum=NAD27 +lon_0=-78d30 lat_1=39d12 lat_2=38d2 lat_0=37d40 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 4502: virginia south: nad27 +<4502> proj=lcc datum=NAD27 +lon_0=-78d30 lat_1=37d58 lat_2=36d46 lat_0=36d20 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 4601: washington north: nad27 +<4601> proj=lcc datum=NAD27 +lon_0=-120d50 lat_1=48d44 lat_2=47d30 lat_0=47 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 4602: washington south: nad27 +<4602> proj=lcc datum=NAD27 +lon_0=-120d30 lat_1=47d20 lat_2=45d50 lat_0=45d20 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 4701: west virginia north: nad27 +<4701> proj=lcc datum=NAD27 +lon_0=-79d30 lat_1=40d15 lat_2=39 lat_0=38d30 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 4702: west virginia south: nad27 +<4702> proj=lcc datum=NAD27 +lon_0=-81 lat_1=38d53 lat_2=37d29 lat_0=37 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 4801: wisconsin north: nad27 +<4801> proj=lcc datum=NAD27 +lon_0=-90 lat_1=46d46 lat_2=45d34 lat_0=45d10 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 4802: wisconsin central: nad27 +<4802> proj=lcc datum=NAD27 +lon_0=-90 lat_1=45d30 lat_2=44d15 lat_0=43d50 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 4803: wisconsin south: nad27 +<4803> proj=lcc datum=NAD27 +lon_0=-90 lat_1=44d4 lat_2=42d44 lat_0=42 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 4901: wyoming east: nad27 +<4901> proj=tmerc datum=NAD27 +lon_0=-105d10 lat_0=40d40 k=.9999411764705882 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 4902: wyoming east central: nad27 +<4902> proj=tmerc datum=NAD27 +lon_0=-107d20 lat_0=40d40 k=.9999411764705882 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 4903: wyoming west central: nad27 +<4903> proj=tmerc datum=NAD27 +lon_0=-108d45 lat_0=40d40 k=.9999411764705882 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 4904: wyoming west: nad27 +<4904> proj=tmerc datum=NAD27 +lon_0=-110d5 lat_0=40d40 k=.9999411764705882 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 5001: alaska zone no. 1: nad27 +<5001> proj=omerc datum=NAD27 +k=.9999 lonc=-133d40 lat_0=57 alpha=-36d52'11.6315 +x_0=818585.5672270928 y_0=575219.2451072642 +no_defs <> + +# 5002: alaska zone no. 2: nad27 +<5002> proj=tmerc datum=NAD27 +lon_0=-142 lat_0=54 k=.9999 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 5003: alaska zone no. 3: nad27 +<5003> proj=tmerc datum=NAD27 +lon_0=-146 lat_0=54 k=.9999 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 5004: alaska zone no. 4: nad27 +<5004> proj=tmerc datum=NAD27 +lon_0=-150 lat_0=54 k=.9999 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 5005: alaska zone no. 5: nad27 +<5005> proj=tmerc datum=NAD27 +lon_0=-154 lat_0=54 k=.9999 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 5006: alaska zone no. 6: nad27 +<5006> proj=tmerc datum=NAD27 +lon_0=-158 lat_0=54 k=.9999 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 5007: alaska zone no. 7: nad27 +<5007> proj=tmerc datum=NAD27 +lon_0=-162 lat_0=54 k=.9999 +x_0=213360.4267208534 y_0=0 +no_defs <> + +# 5008: alaska zone no. 8: nad27 +<5008> proj=tmerc datum=NAD27 +lon_0=-166 lat_0=54 k=.9999 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 5009: alaska zone no. 9: nad27 +<5009> proj=tmerc datum=NAD27 +lon_0=-170 lat_0=54 k=.9999 +x_0=182880.3657607315 y_0=0 +no_defs <> + +# 5201: puerto rico and virgin islands: nad27 +<5201> proj=lcc datum=NAD27 +lon_0=-66d26 lat_1=18d26 lat_2=18d2 lat_0=17d50 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 5202: virgin islands st. croix: nad27 +<5202> proj=lcc datum=NAD27 +lon_0=-66d26 lat_1=18d26 lat_2=18d2 lat_0=17d50 +x_0=152400.3048006096 y_0=30480.06096012192 +no_defs <> + +# 5400: guam island: nad27 +<5400> proj=poly datum=NAD27 +x_0=50000 y_0=50000 lon_0=144d44'55.50254 lat_0=13d28'20.87887 +no_defs <> + diff --git a/www/assets/nad83 b/www/assets/nad83 new file mode 100644 index 000000000..e740a4d57 --- /dev/null +++ b/www/assets/nad83 @@ -0,0 +1,744 @@ +# SCCSID @(#)nad83 4.1 92/12/20 GIE +# proj +init files for: +# +# State Plane Coordinate Systems, +# North American Datum 1983 + +# 101: alabama east: nad83 +<101> proj=tmerc datum=NAD83 +lon_0=-85d50 lat_0=30d30 k=.99996 +x_0=200000 y_0=0 +no_defs <> + +# 102: alabama west: nad83 +<102> proj=tmerc datum=NAD83 +lon_0=-87d30 lat_0=30 k=.9999333333333333 +x_0=600000 y_0=0 +no_defs <> + +# 5010: alaska zone no. 10: nad83 +<5010> proj=lcc datum=NAD83 +lon_0=-176 lat_1=53d50 lat_2=51d50 lat_0=51 +x_0=1000000 y_0=0 +no_defs <> + +# 201: arizona east: nad83 +<201> proj=tmerc datum=NAD83 +lon_0=-110d10 lat_0=31 k=.9999 +x_0=213360 y_0=0 +no_defs <> + +# 202: arizona central: nad83 +<202> proj=tmerc datum=NAD83 +lon_0=-111d55 lat_0=31 k=.9999 +x_0=213360 y_0=0 +no_defs <> + +# 203: arizona west: nad83 +<203> proj=tmerc datum=NAD83 +lon_0=-113d45 lat_0=31 k=.9999333333333333 +x_0=213360 y_0=0 +no_defs <> + +# 301: arkansas north: nad83 +<301> proj=lcc datum=NAD83 +lon_0=-92 lat_1=36d14 lat_2=34d56 lat_0=34d20 +x_0=400000 y_0=0 +no_defs <> + +# 302: arkansas south: nad83 +<302> proj=lcc datum=NAD83 +lon_0=-92 lat_1=34d46 lat_2=33d18 lat_0=32d40 +x_0=400000 y_0=400000 +no_defs <> + +# 401: california i: nad83 +<401> proj=lcc datum=NAD83 +lon_0=-122 lat_1=41d40 lat_2=40 lat_0=39d20 +x_0=2000000 y_0=500000 +no_defs <> + +# 402: california ii: nad83 +<402> proj=lcc datum=NAD83 +lon_0=-122 lat_1=39d50 lat_2=38d20 lat_0=37d40 +x_0=2000000 y_0=500000 +no_defs <> + +# 403: california iii: nad83 +<403> proj=lcc datum=NAD83 +lon_0=-120d30 lat_1=38d26 lat_2=37d4 lat_0=36d30 +x_0=2000000 y_0=500000 +no_defs <> + +# 404: california iv: nad83 +<404> proj=lcc datum=NAD83 +lon_0=-119 lat_1=37d15 lat_2=36 lat_0=35d20 +x_0=2000000 y_0=500000 +no_defs <> + +# 405: california v: nad83 +<405> proj=lcc datum=NAD83 +lon_0=-118 lat_1=35d28 lat_2=34d2 lat_0=33d30 +x_0=2000000 y_0=500000 +no_defs <> + +# 406: california vi: nad83 +<406> proj=lcc datum=NAD83 +lon_0=-116d15 lat_1=33d53 lat_2=32d47 lat_0=32d10 +x_0=2000000 y_0=500000 +no_defs <> + +# 501: colorado north: nad83 +<501> proj=lcc datum=NAD83 +lon_0=-105d30 lat_1=40d47 lat_2=39d43 lat_0=39d20 +x_0=914401.8289 y_0=304800.6096 +no_defs <> + +# 502: colorado central: nad83 +<502> proj=lcc datum=NAD83 +lon_0=-105d30 lat_1=39d45 lat_2=38d27 lat_0=37d50 +x_0=914401.8289 y_0=304800.6096 +no_defs <> + +# 503: colorado south: nad83 +<503> proj=lcc datum=NAD83 +lon_0=-105d30 lat_1=38d26 lat_2=37d14 lat_0=36d40 +x_0=914401.8289 y_0=304800.6096 +no_defs <> + +# 600: connecticut ---: nad83 +<600> proj=lcc datum=NAD83 +lon_0=-72d45 lat_1=41d52 lat_2=41d12 lat_0=40d50 +x_0=304800.6096 y_0=152400.3048 +no_defs <> + +# 700: delaware ---: nad83 +<700> proj=tmerc datum=NAD83 +lon_0=-75d25 lat_0=38 k=.999995 +x_0=200000 y_0=0 +no_defs <> + +# 901: florida east: nad83 +<901> proj=tmerc datum=NAD83 +lon_0=-81 lat_0=24d20 k=.9999411764705882 +x_0=200000 y_0=0 +no_defs <> + +# 902: florida west: nad83 +<902> proj=tmerc datum=NAD83 +lon_0=-82 lat_0=24d20 k=.9999411764705882 +x_0=200000 y_0=0 +no_defs <> + +# 903: florida north: nad83 +<903> proj=lcc datum=NAD83 +lon_0=-84d30 lat_1=30d45 lat_2=29d35 lat_0=29 +x_0=600000 y_0=0 +no_defs <> + +# 1001: georgia east: nad83 +<1001> proj=tmerc datum=NAD83 +lon_0=-82d10 lat_0=30 k=.9999 +x_0=200000 y_0=0 +no_defs <> + +# 1002: georgia west: nad83 +<1002> proj=tmerc datum=NAD83 +lon_0=-84d10 lat_0=30 k=.9999 +x_0=700000 y_0=0 +no_defs <> + +# 5101: hawaii 1: nad83 +<5101> proj=tmerc datum=NAD83 +lon_0=-155d30 lat_0=18d50 k=.9999666666666667 +x_0=500000 y_0=0 +no_defs <> + +# 5102: hawaii 2: nad83 +<5102> proj=tmerc datum=NAD83 +lon_0=-156d40 lat_0=20d20 k=.9999666666666667 +x_0=500000 y_0=0 +no_defs <> + +# 5103: hawaii 3: nad83 +<5103> proj=tmerc datum=NAD83 +lon_0=-158 lat_0=21d10 k=.99999 +x_0=500000 y_0=0 +no_defs <> + +# 5104: hawaii 4: nad83 +<5104> proj=tmerc datum=NAD83 +lon_0=-159d30 lat_0=21d50 k=.99999 +x_0=500000 y_0=0 +no_defs <> + +# 5105: hawaii 5: nad83 +<5105> proj=tmerc datum=NAD83 +lon_0=-160d10 lat_0=21d40 k=1 +x_0=500000 y_0=0 +no_defs <> + +# 1101: idaho east: nad83 +<1101> proj=tmerc datum=NAD83 +lon_0=-112d10 lat_0=41d40 k=.9999473684210526 +x_0=200000 y_0=0 +no_defs <> + +# 1102: idaho central: nad83 +<1102> proj=tmerc datum=NAD83 +lon_0=-114 lat_0=41d40 k=.9999473684210526 +x_0=500000 y_0=0 +no_defs <> + +# 1103: idaho west: nad83 +<1103> proj=tmerc datum=NAD83 +lon_0=-115d45 lat_0=41d40 k=.9999333333333333 +x_0=800000 y_0=0 +no_defs <> + +# 1201: illinois east: nad83 +<1201> proj=tmerc datum=NAD83 +lon_0=-88d20 lat_0=36d40 k=.999975 +x_0=300000 y_0=0 +no_defs <> + +# 1202: illinois west: nad83 +<1202> proj=tmerc datum=NAD83 +lon_0=-90d10 lat_0=36d40 k=.9999411764705882 +x_0=700000 y_0=0 +no_defs <> + +# 1301: indiana east: nad83 +<1301> proj=tmerc datum=NAD83 +lon_0=-85d40 lat_0=37d30 k=.9999666666666667 +x_0=100000 y_0=250000 +no_defs <> + +# 1302: indiana west: nad83 +<1302> proj=tmerc datum=NAD83 +lon_0=-87d5 lat_0=37d30 k=.9999666666666667 +x_0=900000 y_0=250000 +no_defs <> + +# 1401: iowa north: nad83 +<1401> proj=lcc datum=NAD83 +lon_0=-93d30 lat_1=43d16 lat_2=42d4 lat_0=41d30 +x_0=1500000 y_0=1000000 +no_defs <> + +# 1402: iowa south: nad83 +<1402> proj=lcc datum=NAD83 +lon_0=-93d30 lat_1=41d47 lat_2=40d37 lat_0=40 +x_0=500000 y_0=0 +no_defs <> + +# 1501: kansas north: nad83 +<1501> proj=lcc datum=NAD83 +lon_0=-98 lat_1=39d47 lat_2=38d43 lat_0=38d20 +x_0=400000 y_0=0 +no_defs <> + +# 1502: kansas south: nad83 +<1502> proj=lcc datum=NAD83 +lon_0=-98d30 lat_1=38d34 lat_2=37d16 lat_0=36d40 +x_0=400000 y_0=400000 +no_defs <> + +# 1601: kentucky north: nad83 +<1601> proj=lcc datum=NAD83 +lon_0=-84d15 lat_1=38d58 lat_2=37d58 lat_0=37d30 +x_0=500000 y_0=0 +no_defs <> + +# 1602: kentucky south: nad83 +<1602> proj=lcc datum=NAD83 +lon_0=-85d45 lat_1=37d56 lat_2=36d44 lat_0=36d20 +x_0=500000 y_0=500000 +no_defs <> + +# 1701: louisiana north: nad83 +<1701> proj=lcc datum=NAD83 +lon_0=-92d30 lat_1=32d40 lat_2=31d10 lat_0=30d30 +x_0=1000000 y_0=0 +no_defs <> + +# 1702: louisiana south: nad83 +<1702> proj=lcc datum=NAD83 +lon_0=-91d20 lat_1=30d42 lat_2=29d18 lat_0=28d30 +x_0=1000000 y_0=0 +no_defs <> + +# 1703: louisiana offshore: nad83 +<1703> proj=lcc datum=NAD83 +lon_0=-91d20 lat_1=27d50 lat_2=26d10 lat_0=25d30 +x_0=1000000 y_0=0 +no_defs <> + +# 1801: maine east: nad83 +<1801> proj=tmerc datum=NAD83 +lon_0=-68d30 lat_0=43d40 k=.9999 +x_0=300000 y_0=0 +no_defs <> + +# 1802: maine west: nad83 +<1802> proj=tmerc datum=NAD83 +lon_0=-70d10 lat_0=42d50 k=.9999666666666667 +x_0=900000 y_0=0 +no_defs <> + +# 1900: maryland ---: nad83 +<1900> proj=lcc datum=NAD83 +lon_0=-77 lat_1=39d27 lat_2=38d18 lat_0=37d40 +x_0=400000 y_0=0 +no_defs <> + +# 2001: massachusetts mainland: nad83 +<2001> proj=lcc datum=NAD83 +lon_0=-71d30 lat_1=42d41 lat_2=41d43 lat_0=41 +x_0=200000 y_0=750000 +no_defs <> + +# 2002: massachusetts island: nad83 +<2002> proj=lcc datum=NAD83 +lon_0=-70d30 lat_1=41d29 lat_2=41d17 lat_0=41 +x_0=500000 y_0=0 +no_defs <> + +# 2111: michigan north: nad83 +<2111> proj=lcc datum=NAD83 +lon_0=-87 lat_1=47d5 lat_2=45d29 lat_0=44d47 +x_0=8000000 y_0=0 +no_defs <> + +# 2112: michigan central/l: nad83 +<2112> proj=lcc datum=NAD83 +lon_0=-84d22 lat_1=45d42 lat_2=44d11 lat_0=43d19 +x_0=6000000 y_0=0 +no_defs <> + +# 2113: michigan south: nad83 +<2113> proj=lcc datum=NAD83 +lon_0=-84d22 lat_1=43d40 lat_2=42d6 lat_0=41d30 +x_0=4000000 y_0=0 +no_defs <> + +# 2201: minnesota north: nad83 +<2201> proj=lcc datum=NAD83 +lon_0=-93d6 lat_1=48d38 lat_2=47d2 lat_0=46d30 +x_0=800000 y_0=100000 +no_defs <> + +# 2202: minnesota central: nad83 +<2202> proj=lcc datum=NAD83 +lon_0=-94d15 lat_1=47d3 lat_2=45d37 lat_0=45 +x_0=800000 y_0=100000 +no_defs <> + +# 2203: minnesota south: nad83 +<2203> proj=lcc datum=NAD83 +lon_0=-94 lat_1=45d13 lat_2=43d47 lat_0=43 +x_0=800000 y_0=100000 +no_defs <> + +# 2301: mississippi east: nad83 +<2301> proj=tmerc datum=NAD83 +lon_0=-88d50 lat_0=29d30 k=.99995 +x_0=300000 y_0=0 +no_defs <> + +# 2302: mississippi west: nad83 +<2302> proj=tmerc datum=NAD83 +lon_0=-90d20 lat_0=29d30 k=.99995 +x_0=700000 y_0=0 +no_defs <> + +# 2401: missouri east: nad83 +<2401> proj=tmerc datum=NAD83 +lon_0=-90d30 lat_0=35d50 k=.9999333333333333 +x_0=250000 y_0=0 +no_defs <> + +# 2402: missouri central: nad83 +<2402> proj=tmerc datum=NAD83 +lon_0=-92d30 lat_0=35d50 k=.9999333333333333 +x_0=500000 y_0=0 +no_defs <> + +# 2403: missouri west: nad83 +<2403> proj=tmerc datum=NAD83 +lon_0=-94d30 lat_0=36d10 k=.9999411764705882 +x_0=850000 y_0=0 +no_defs <> + +# 2500: montana: nad83 +<2500> proj=lcc datum=NAD83 +lon_0=-109d30 lat_1=49 lat_2=45 lat_0=44d15 +x_0=600000 y_0=0 +no_defs <> + +# 2600: nebraska: nad83 +<2600> proj=lcc datum=NAD83 +lon_0=-100 lat_1=43 lat_2=40 lat_0=39d50 +x_0=500000 y_0=0 +no_defs <> + +# 2701: nevada east: nad83 +<2701> proj=tmerc datum=NAD83 +lon_0=-115d35 lat_0=34d45 k=.9999 +x_0=200000 y_0=8000000 +no_defs <> + +# 2702: nevada central: nad83 +<2702> proj=tmerc datum=NAD83 +lon_0=-116d40 lat_0=34d45 k=.9999 +x_0=500000 y_0=6000000 +no_defs <> + +# 2703: nevada west: nad83 +<2703> proj=tmerc datum=NAD83 +lon_0=-118d35 lat_0=34d45 k=.9999 +x_0=800000 y_0=4000000 +no_defs <> + +# 2800: new hampshire ---: nad83 +<2800> proj=tmerc datum=NAD83 +lon_0=-71d40 lat_0=42d30 k=.9999666666666667 +x_0=300000 y_0=0 +no_defs <> + +# 2900: new jersey ---: nad83 +<2900> proj=tmerc datum=NAD83 +lon_0=-74d30 lat_0=38d50 k=.9999 +x_0=150000 y_0=0 +no_defs <> + +# 3001: new mexico east: nad83 +<3001> proj=tmerc datum=NAD83 +lon_0=-104d20 lat_0=31 k=.9999090909090909 +x_0=165000 y_0=0 +no_defs <> + +# 3002: new mexico central: nad83 +<3002> proj=tmerc datum=NAD83 +lon_0=-106d15 lat_0=31 k=.9999 +x_0=500000 y_0=0 +no_defs <> + +# 3003: new mexico west: nad83 +<3003> proj=tmerc datum=NAD83 +lon_0=-107d50 lat_0=31 k=.9999166666666667 +x_0=830000 y_0=0 +no_defs <> + +# 3101: new york east: nad83 +<3101> proj=tmerc datum=NAD83 +lon_0=-74d30 lat_0=38d50 k=.9999 +x_0=150000 y_0=0 +no_defs <> + +# 3102: new york central: nad83 +<3102> proj=tmerc datum=NAD83 +lon_0=-76d35 lat_0=40 k=.9999375 +x_0=250000 y_0=0 +no_defs <> + +# 3103: new york west: nad83 +<3103> proj=tmerc datum=NAD83 +lon_0=-78d35 lat_0=40 k=.9999375 +x_0=350000 y_0=0 +no_defs <> + +# 3104: new york long island: nad83 +<3104> proj=lcc datum=NAD83 +lon_0=-74 lat_1=41d2 lat_2=40d40 lat_0=40d10 +x_0=300000 y_0=0 +no_defs <> + +# 3200: north carolina ---: nad83 +<3200> proj=lcc datum=NAD83 +lon_0=-79 lat_1=36d10 lat_2=34d20 lat_0=33d45 +x_0=609601.22 y_0=0 +no_defs <> + +# 3301: north dakota north: nad83 +<3301> proj=lcc datum=NAD83 +lon_0=-100d30 lat_1=48d44 lat_2=47d26 lat_0=47 +x_0=600000 y_0=0 +no_defs <> + +# 3302: north dakota south: nad83 +<3302> proj=lcc datum=NAD83 +lon_0=-100d30 lat_1=47d29 lat_2=46d11 lat_0=45d40 +x_0=600000 y_0=0 +no_defs <> + +# 3401: ohio north: nad83 +<3401> proj=lcc datum=NAD83 +lon_0=-82d30 lat_1=41d42 lat_2=40d26 lat_0=39d40 +x_0=600000 y_0=0 +no_defs <> + +# 3402: ohio south: nad83 +<3402> proj=lcc datum=NAD83 +lon_0=-82d30 lat_1=40d2 lat_2=38d44 lat_0=38 +x_0=600000 y_0=0 +no_defs <> + +# 3501: oklahoma north: nad83 +<3501> proj=lcc datum=NAD83 +lon_0=-98 lat_1=36d46 lat_2=35d34 lat_0=35 +x_0=600000 y_0=0 +no_defs <> + +# 3502: oklahoma south: nad83 +<3502> proj=lcc datum=NAD83 +lon_0=-98 lat_1=35d14 lat_2=33d56 lat_0=33d20 +x_0=600000 y_0=0 +no_defs <> + +# 3601: oregon north: nad83 +<3601> proj=lcc datum=NAD83 +lon_0=-120d30 lat_1=46 lat_2=44d20 lat_0=43d40 +x_0=2500000 y_0=0 +no_defs <> + +# 3602: oregon south: nad83 +<3602> proj=lcc datum=NAD83 +lon_0=-120d30 lat_1=44 lat_2=42d20 lat_0=41d40 +x_0=1500000 y_0=0 +no_defs <> + +# 3701: pennsylvania north: nad83 +<3701> proj=lcc datum=NAD83 +lon_0=-77d45 lat_1=41d57 lat_2=40d53 lat_0=40d10 +x_0=600000 y_0=0 +no_defs <> + +# 3702: pennsylvania south: nad83 +<3702> proj=lcc datum=NAD83 +lon_0=-77d45 lat_1=40d58 lat_2=39d56 lat_0=39d20 +x_0=600000 y_0=0 +no_defs <> + +# 3800: rhode island ---: nad83 +<3800> proj=tmerc datum=NAD83 +lon_0=-71d30 lat_0=41d5 k=.99999375 +x_0=100000 y_0=0 +no_defs <> + +# 3900: south carolina: nad83 +<3900> proj=lcc datum=NAD83 +lon_0=-81 lat_1=34d50 lat_2=32d30 lat_0=31d50 +x_0=609600 y_0=0 +no_defs <> + +# 4001: south dakota north: nad83 +<4001> proj=lcc datum=NAD83 +lon_0=-100 lat_1=45d41 lat_2=44d25 lat_0=43d50 +x_0=600000 y_0=0 +no_defs <> + +# 4002: south dakota south: nad83 +<4002> proj=lcc datum=NAD83 +lon_0=-100d20 lat_1=44d24 lat_2=42d50 lat_0=42d20 +x_0=600000 y_0=0 +no_defs <> + +# 4100: tennessee ---: nad83 +<4100> proj=lcc datum=NAD83 +lon_0=-86 lat_1=36d25 lat_2=35d15 lat_0=34d20 +x_0=600000 y_0=0 +no_defs <> + +# 4201: texas north: nad83 +<4201> proj=lcc datum=NAD83 +lon_0=-101d30 lat_1=36d11 lat_2=34d39 lat_0=34 +x_0=200000 y_0=1000000 +no_defs <> + +# 4202: texas north central: nad83 +<4202> proj=lcc datum=NAD83 +lon_0=-98d30 lat_1=33d58 lat_2=32d8 lat_0=31d40 +x_0=600000 y_0=2000000 +no_defs <> + +# 4203: texas central: nad83 +<4203> proj=lcc datum=NAD83 +lon_0=-100d20 lat_1=31d53 lat_2=30d7 lat_0=29d40 +x_0=700000 y_0=3000000 +no_defs <> + +# 4204: texas south central: nad83 +<4204> proj=lcc datum=NAD83 +lon_0=-99 lat_1=30d17 lat_2=28d23 lat_0=27d50 +x_0=600000 y_0=4000000 +no_defs <> + +# 4205: texas south: nad83 +<4205> proj=lcc datum=NAD83 +lon_0=-98d30 lat_1=27d50 lat_2=26d10 lat_0=25d40 +x_0=300000 y_0=5000000 +no_defs <> + +# 4301: utah north: nad83 +<4301> proj=lcc datum=NAD83 +lon_0=-111d30 lat_1=41d47 lat_2=40d43 lat_0=40d20 +x_0=500000 y_0=1000000 +no_defs <> + +# 4302: utah central: nad83 +<4302> proj=lcc datum=NAD83 +lon_0=-111d30 lat_1=40d39 lat_2=39d1 lat_0=38d20 +x_0=500000 y_0=2000000 +no_defs <> + +# 4303: utah south: nad83 +<4303> proj=lcc datum=NAD83 +lon_0=-111d30 lat_1=38d21 lat_2=37d13 lat_0=36d40 +x_0=500000 y_0=3000000 +no_defs <> + +# 4400: vermont ---: nad83 +<4400> proj=tmerc datum=NAD83 +lon_0=-72d30 lat_0=42d30 k=.9999642857142857 +x_0=500000 y_0=0 +no_defs <> + +# 4501: virginia north: nad83 +<4501> proj=lcc datum=NAD83 +lon_0=-78d30 lat_1=39d12 lat_2=38d2 lat_0=37d40 +x_0=3500000 y_0=2000000 +no_defs <> + +# 4502: virginia south: nad83 +<4502> proj=lcc datum=NAD83 +lon_0=-78d30 lat_1=37d58 lat_2=36d46 lat_0=36d20 +x_0=3500000 y_0=1000000 +no_defs <> + +# 4601: washington north: nad83 +<4601> proj=lcc datum=NAD83 +lon_0=-120d50 lat_1=48d44 lat_2=47d30 lat_0=47 +x_0=500000 y_0=0 +no_defs <> + +# 4602: washington south: nad83 +<4602> proj=lcc datum=NAD83 +lon_0=-120d30 lat_1=47d20 lat_2=45d50 lat_0=45d20 +x_0=500000 y_0=0 +no_defs <> + +# 4701: west virginia north: nad83 +<4701> proj=lcc datum=NAD83 +lon_0=-79d30 lat_1=40d15 lat_2=39 lat_0=38d30 +x_0=600000 y_0=0 +no_defs <> + +# 4702: west virginia south: nad83 +<4702> proj=lcc datum=NAD83 +lon_0=-81 lat_1=38d53 lat_2=37d29 lat_0=37 +x_0=600000 y_0=0 +no_defs <> + +# 4801: wisconsin north: nad83 +<4801> proj=lcc datum=NAD83 +lon_0=-90 lat_1=46d46 lat_2=45d34 lat_0=45d10 +x_0=600000 y_0=0 +no_defs <> + +# 4802: wisconsin central: nad83 +<4802> proj=lcc datum=NAD83 +lon_0=-90 lat_1=45d30 lat_2=44d15 lat_0=43d50 +x_0=600000 y_0=0 +no_defs <> + +# 4803: wisconsin south: nad83 +<4803> proj=lcc datum=NAD83 +lon_0=-90 lat_1=44d4 lat_2=42d44 lat_0=42 +x_0=600000 y_0=0 +no_defs <> + +# 4901: wyoming east: nad83 +<4901> proj=tmerc datum=NAD83 +lon_0=-105d10 lat_0=40d30 k=.9999375 +x_0=200000 y_0=0 +no_defs <> + +# 4902: wyoming east central: nad83 +<4902> proj=tmerc datum=NAD83 +lon_0=-107d20 lat_0=40d30 k=.9999375 +x_0=400000 y_0=100000 +no_defs <> + +# 4903: wyoming west central: nad83 +<4903> proj=tmerc datum=NAD83 +lon_0=-108d45 lat_0=40d30 k=.9999375 +x_0=600000 y_0=0 +no_defs <> + +# 4904: wyoming west: nad83 +<4904> proj=tmerc datum=NAD83 +lon_0=-110d5 lat_0=40d30 k=.9999375 +x_0=800000 y_0=100000 +no_defs <> + +# 5001: alaska zone no. 1: nad83 +<5001> proj=omerc datum=NAD83 +k=.9999 lonc=-133d40 lat_0=57 alpha=-36d52'11.6315 +x_0=818676.7344011233 y_0=575097.6888751927 +no_defs <> + +# 5002: alaska zone no. 2: nad83 +<5002> proj=tmerc datum=NAD83 +lon_0=-142 lat_0=54 k=.9999 +x_0=500000 y_0=0 +no_defs <> + +# 5003: alaska zone no. 3: nad83 +<5003> proj=tmerc datum=NAD83 +lon_0=-146 lat_0=54 k=.9999 +x_0=500000 y_0=0 +no_defs <> + +# 5004: alaska zone no. 4: nad83 +<5004> proj=tmerc datum=NAD83 +lon_0=-150 lat_0=54 k=.9999 +x_0=500000 y_0=0 +no_defs <> + +# 5005: alaska zone no. 5: nad83 +<5005> proj=tmerc datum=NAD83 +lon_0=-154 lat_0=54 k=.9999 +x_0=500000 y_0=0 +no_defs <> + +# 5006: alaska zone no. 6: nad83 +<5006> proj=tmerc datum=NAD83 +lon_0=-158 lat_0=54 k=.9999 +x_0=500000 y_0=0 +no_defs <> + +# 5007: alaska zone no. 7: nad83 +<5007> proj=tmerc datum=NAD83 +lon_0=-162 lat_0=54 k=.9999 +x_0=500000 y_0=0 +no_defs <> + +# 5008: alaska zone no. 8: nad83 +<5008> proj=tmerc datum=NAD83 +lon_0=-166 lat_0=54 k=.9999 +x_0=500000 y_0=0 +no_defs <> + +# 5009: alaska zone no. 9: nad83 +<5009> proj=tmerc datum=NAD83 +lon_0=-170 lat_0=54 k=.9999 +x_0=500000 y_0=0 +no_defs <> + +# 5200: puerto rico and virgin islands: nad83 +<5200> proj=lcc datum=NAD83 +lon_0=-66d26 lat_1=18d26 lat_2=18d2 lat_0=17d50 +x_0=200000 y_0=200000 +no_defs <> + diff --git a/www/elements.css b/www/elements.css index b64dd0c0b..440226641 100644 --- a/www/elements.css +++ b/www/elements.css @@ -86,7 +86,7 @@ div.tip { } .tip-button:hover { - font-weight: bold; + font-weight: normal; color: #033D6D; } @@ -142,6 +142,7 @@ div.tip { .btn.inline-btn:hover:not(.selected) { background-color: #FFFCDC; + color: black; } .btn { @@ -169,7 +170,7 @@ div.tip { .inline-btn { margin: 0; - border: 1px solid #999; + border: 1px solid #aaa; padding: 1px 4px 3px 3px; } diff --git a/www/images/fork-me-right-graphite@2x.png b/www/images/fork-me-right-graphite@2x.png deleted file mode 100644 index 4e17330b2..000000000 Binary files a/www/images/fork-me-right-graphite@2x.png and /dev/null differ diff --git a/www/index.html b/www/index.html index 34631d848..ad38b8f5d 100644 --- a/www/index.html +++ b/www/index.html @@ -2,7 +2,7 @@ mapshaper - + @@ -12,7 +12,7 @@ type="image/png" href="images/icon.png"> - + -
-