node-srs-0.3.2/0000755000175000017500000000000012204545112011360 5ustar devdevnode-srs-0.3.2/common.gypi0000644000175000017500000000163612204545112013550 0ustar devdev{ 'target_defaults': { 'default_configuration': 'Release', 'configurations': { 'Debug': { 'cflags_cc!': ['-O3', '-Os', '-DNDEBUG'], 'xcode_settings': { 'OTHER_CPLUSPLUSFLAGS!':['-O3', '-Os', '-DNDEBUG'], 'GCC_OPTIMIZATION_LEVEL': '0', 'GCC_GENERATE_DEBUGGING_SYMBOLS': 'YES' } }, 'Release': { 'xcode_settings': { 'GCC_OPTIMIZATION_LEVEL': 's', 'GCC_GENERATE_DEBUGGING_SYMBOLS': 'NO', 'DEAD_CODE_STRIPPING':'YES', 'GCC_INLINES_ARE_PRIVATE_EXTERN':'YES', 'OTHER_LDFLAGS': [ '-s' # warns 'option -s is obsolete and being ignored' but actually works ] }, 'ldflags': [ '-Wl,-s' ] } } } }node-srs-0.3.2/test/0000755000175000017500000000000012204545112012337 5ustar devdevnode-srs-0.3.2/test/shapefile.4326.test.js0000644000175000017500000001244012204545112016211 0ustar devdevvar srs = require('srs'); var fs = require('fs'); var assert = require('assert'); var expected = { srid: 4326, auth: 'EPSG', esri: false, is_geographic: true, valid: true }; describe('WGS84', function() { it('should detect wgs84 proj4 init detection', function() { var parsed = srs.parse('+init=epsg:4326'); assert.ok(parsed.proj4); assert.equal(parsed.proj4, '+proj=longlat +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +no_defs'); assert.equal(parsed.srid, expected.srid); assert.equal(parsed.auth, expected.auth); assert.equal(parsed.esri, expected.esri); assert.equal(parsed.is_geographic, expected.is_geographic); assert.equal(parsed.valid, expected.valid); }); it('should detect wgs84 proj4 literal from gdal trunk detection', function() { // +datum=WGS84 var parsed = srs.parse('+proj=longlat +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +no_defs'); assert.ok(parsed.proj4); assert.equal(parsed.proj4, '+proj=longlat +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +no_defs'); assert.equal(parsed.srid, expected.srid); assert.equal(parsed.auth, expected.auth); assert.equal(parsed.esri, expected.esri); assert.equal(parsed.is_geographic, expected.is_geographic); assert.equal(parsed.valid, expected.valid); }); it('should detect wgs84 proj4 literal +datum will trigger addition to towgs detection', function() { // +datum will trigger addition to towgs var parsed = srs.parse('+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs'); assert.ok(parsed.proj4); assert.equal(parsed.proj4, '+proj=longlat +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +no_defs'); assert.equal(parsed.srid, expected.srid); assert.equal(parsed.auth, expected.auth); assert.equal(parsed.esri, expected.esri); assert.equal(parsed.is_geographic, expected.is_geographic); assert.equal(parsed.valid, expected.valid); }); it('should detect wgs84 wkt detection', function() { var val = 'GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.01745329251994328,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]]'; var parsed = srs.parse(val); assert.equal(parsed.proj4, '+proj=longlat +datum=WGS84 +no_defs'); assert.ok(parsed.proj4); assert.equal(parsed.srid, expected.srid); assert.equal(parsed.auth, expected.auth); assert.equal(parsed.esri, expected.esri); assert.equal(parsed.is_geographic, expected.is_geographic); assert.equal(parsed.valid, expected.valid); }); it('should detect wgs84 epsg detection', function() { var parsed = srs.parse('EPSG:4326'); assert.ok(parsed.proj4); assert.equal(parsed.proj4, '+proj=longlat +datum=WGS84 +no_defs'); assert.equal(parsed.srid, expected.srid); assert.equal(parsed.auth, expected.auth); assert.equal(parsed.esri, expected.esri); assert.equal(parsed.is_geographic, expected.is_geographic); assert.equal(parsed.valid, expected.valid); }); it('should detect wgs84 common name detection', function() { var parsed = srs.parse('WGS84'); assert.ok(parsed.proj4); assert.equal(parsed.proj4, '+proj=longlat +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +no_defs'); assert.equal(parsed.srid, expected.srid); assert.equal(parsed.auth, expected.auth); assert.equal(parsed.esri, expected.esri); assert.equal(parsed.is_geographic, expected.is_geographic); assert.equal(parsed.valid, expected.valid); }); it('should detect wgs84 proj4 literal no datum detection', function() { var parsed = srs.parse('+proj=longlat +ellps=WGS84 +no_defs'); assert.ok(parsed.proj4); assert.equal(parsed.proj4, '+proj=longlat +ellps=WGS84 +no_defs'); assert.equal(parsed.srid, expected.srid); assert.equal(parsed.auth, expected.auth); assert.equal(parsed.esri, expected.esri); assert.equal(parsed.is_geographic, expected.is_geographic); assert.equal(parsed.valid, expected.valid); }); it('should detect wgs84 wkt from prj file', function() { var data = fs.readFileSync('./test/data/4326.esri.prj'); var parsed = srs.parse(data); assert.ok(parsed.proj4); assert.equal(parsed.proj4, '+proj=longlat +ellps=WGS84 +no_defs'); assert.equal(parsed.srid, expected.srid); assert.equal(parsed.auth, expected.auth); assert.equal(parsed.esri, expected.esri); assert.equal(parsed.is_geographic, expected.is_geographic); assert.equal(parsed.valid, expected.valid); }); it('should detect wgs84 wkt from another prj file', function() { var data = fs.readFileSync('./test/data/4326.prj'); var parsed = srs.parse(data); assert.ok(parsed.proj4); assert.equal(parsed.proj4, '+proj=longlat +ellps=WGS84 +no_defs'); assert.equal(parsed.srid, expected.srid); assert.equal(parsed.auth, expected.auth); assert.equal(parsed.esri, expected.esri); assert.equal(parsed.is_geographic, expected.is_geographic); assert.equal(parsed.valid, expected.valid); }); });node-srs-0.3.2/test/version.test.js0000644000175000017500000000056012204545112015341 0ustar devdevvar srs = require('srs'); var fs = require('fs'); var assert = require('assert'); describe('Version check', function() { it('test version updated for release', function() { if (parseInt(process.version.split('.')[1]) > 4) { var info = require('../package.json'); assert.equal(info.version, srs.version); } }); }); node-srs-0.3.2/test/data/0000755000175000017500000000000012204545112013250 5ustar devdevnode-srs-0.3.2/test/data/4326.prj0000644000175000017500000000021712204545112014363 0ustar devdevGEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]]node-srs-0.3.2/test/data/mystery-api0000644000175000017500000000027212204545112015457 0ustar devdev { "type":"Feature", "id":"OpenLayers.Feature.Vector_314", "properties":{}, "geometry":{ "type":"Point", "coordinates":[97.03125, 39.7265625] } }node-srs-0.3.2/test/data/900913.esri.prj0000644000175000017500000000060012204545112015467 0ustar devdevPROJCS["Google_Maps_Global_Mercator",GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]],PROJECTION["Mercator_2SP"],PARAMETER["standard_parallel_1",0],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",0],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["Meter",1]]node-srs-0.3.2/test/data/4326.esri.prj0000644000175000017500000000021712204545112015324 0ustar devdevGEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]]node-srs-0.3.2/test/data/maryland.prj0000755000175000017500000000076712204545112015611 0ustar devdevPROJCS["NAD_1983_StatePlane_Maryland_FIPS_1900",GEOGCS["GCS_North_American_1983",DATUM["D_North_American_1983",SPHEROID["GRS_1980",6378137.0,298.257222101]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Lambert_Conformal_Conic"],PARAMETER["False_Easting",400000.0],PARAMETER["False_Northing",0.0],PARAMETER["Central_Meridian",-77.0],PARAMETER["Standard_Parallel_1",38.3],PARAMETER["Standard_Parallel_2",39.45],PARAMETER["Latitude_Of_Origin",37.66666666666666],UNIT["Meter",1.0]]node-srs-0.3.2/test/data/prj2epsg-wkt-3857.prj0000644000175000017500000000147612204545112016740 0ustar devdevPROJCS["WGS 84 / Pseudo-Mercator", GEOGCS["WGS 84", DATUM["World Geodetic System 1984", SPHEROID["WGS 84", 6378137.0, 298.257223563, AUTHORITY["EPSG","7030"]], AUTHORITY["EPSG","6326"]], PRIMEM["Greenwich", 0.0, AUTHORITY["EPSG","8901"]], UNIT["degree", 0.017453292519943295], AXIS["Geodetic longitude", EAST], AXIS["Geodetic latitude", NORTH], AUTHORITY["EPSG","4326"]], PROJECTION["Popular Visualisation Pseudo Mercator", AUTHORITY["EPSG","1024"]], PARAMETER["semi_minor", 6378137.0], PARAMETER["latitude_of_origin", 0.0], PARAMETER["central_meridian", 0.0], PARAMETER["scale_factor", 1.0], PARAMETER["false_easting", 0.0], PARAMETER["false_northing", 0.0], UNIT["m", 1.0], AXIS["Easting", EAST], AXIS["Northing", NORTH], AUTHORITY["EPSG","3857"]] node-srs-0.3.2/test/data/3395-non-spherical-merc.prj0000644000175000017500000000010512204545112020050 0ustar devdev+proj=merc +lon_0=0 +k=1 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defsnode-srs-0.3.2/test/data/cali.prj0000644000175000017500000000106712204545112014701 0ustar devdevPROJCS["NAD_1983_StatePlane_California_III_FIPS_0403_Feet",GEOGCS["GCS_North_American_1983",DATUM["D_North_American_1983",SPHEROID["GRS_1980",6378137.0,298.257222101]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Lambert_Conformal_Conic"],PARAMETER["False_Easting",6561666.666666666],PARAMETER["False_Northing",1640416.666666667],PARAMETER["Central_Meridian",-120.5],PARAMETER["Standard_Parallel_1",37.06666666666667],PARAMETER["Standard_Parallel_2",38.43333333333333],PARAMETER["Latitude_Of_Origin",36.5],UNIT["Foot_US",0.3048006096012192]]node-srs-0.3.2/test/data/simplified-land-polygons-complete-3857.prj0000644000175000017500000000151712204545112023114 0ustar devdevPROJCS["WGS 84 / Pseudo-Mercator", GEOGCS["WGS 84", DATUM["WGS_1984", SPHEROID["WGS 84",6378137,298.257223563, AUTHORITY["EPSG","7030"]], AUTHORITY["EPSG","6326"]], PRIMEM["Greenwich",0, AUTHORITY["EPSG","8901"]], UNIT["degree",0.0174532925199433, AUTHORITY["EPSG","9122"]], AUTHORITY["EPSG","4326"]], PROJECTION["Mercator_1SP"], PARAMETER["central_meridian",0], PARAMETER["scale_factor",1], PARAMETER["false_easting",0], PARAMETER["false_northing",0], UNIT["metre",1, AUTHORITY["EPSG","9001"]], AXIS["X",EAST], AXIS["Y",NORTH], EXTENSION["PROJ4","+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"], AUTHORITY["EPSG","3857"]] node-srs-0.3.2/test/data/admin-0-poly.prj0000755000175000017500000000050412204545112016175 0ustar devdevPROJCS["Mercator_2SP",GEOGCS["unnamed ellipse",DATUM["D_unknown",SPHEROID["Unknown",6378137,0]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]],PROJECTION["Mercator_2SP"],PARAMETER["standard_parallel_1",0],PARAMETER["central_meridian",0],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["Meter",1]]node-srs-0.3.2/test/data/world_borders_merc.prj0000755000175000017500000000051012204545112017641 0ustar devdevPROJCS["Mercator_2SP",GEOGCS["GCS_unnamed ellipse",DATUM["D_unknown",SPHEROID["Unknown",6378137,0]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]],PROJECTION["Mercator_2SP"],PARAMETER["standard_parallel_1",0],PARAMETER["central_meridian",0],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["Meter",1]]node-srs-0.3.2/test/data/sr-org-6-esriwkt.prj0000644000175000017500000000072312204545112017031 0ustar devdevPROJCS["Mercator_2SP",GEOGCS["unnamed ellipse",DATUM["D_unknown",SPHEROID["Unknown",6378137,0]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]],PROJECTION["Mercator_2SP"],PARAMETER["standard_parallel_1",0],PARAMETER["central_meridian",0],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["Meter",1],EXTENSION["PROJ4","+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"]]node-srs-0.3.2/test/data/esri-mercator-1sp.prj0000644000175000017500000000057212204545112017246 0ustar devdevPROJCS["Mercator_1SP",GEOGCS["GCS_Geographic Coordinate System",DATUM["D_WGS_1984_MAJOR_AUXILIARY_SPHERE",SPHEROID["Sphere_Radius_6378137_m",6378137,0]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]],PROJECTION["Mercator"],PARAMETER["central_meridian",0],PARAMETER["standard_parallel_1",0],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["Meter",1]] node-srs-0.3.2/test/data/test.json0000644000175000017500000000047012204545112015123 0ustar devdev { "type":"Feature", "id":"OpenLayers.Feature.Vector_314", "properties":{}, "geometry":{ "type":"Point", "coordinates":[97.03125, 39.7265625] }, "crs":{ "type":"OGC", "properties":{ "urn":"urn:ogc:def:crs:OGC:1.3:CRS84" } } }node-srs-0.3.2/test/data/osm_landusages.prj0000644000175000017500000000063212204545112016772 0ustar devdevPROJCS["Popular_Visualisation_CRS_Mercator_deprecated",GEOGCS["GCS_Popular Visualisation CRS",DATUM["D_Popular_Visualisation_Datum",SPHEROID["Popular_Visualisation_Sphere",6378137,0]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]],PROJECTION["Mercator"],PARAMETER["central_meridian",0],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["Meter",1],PARAMETER["standard_parallel_1",0.0]]node-srs-0.3.2/test/data/bogus_mercator2sp.prj0000644000175000017500000000050412204545112017424 0ustar devdevPROJCS["Mercator_2SP",GEOGCS["unnamed ellipse",DATUM["D_unknown",SPHEROID["Unknown",6378137,0]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]],PROJECTION["Mercator_2SP"],PARAMETER["standard_parallel_1",0],PARAMETER["central_meridian",0],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["Meter",1]]node-srs-0.3.2/test/data/world_extent_merc.geojson0000644000175000017500000000064612204545112020370 0ustar devdev{ "crs": { "type": "name", "properties": { "name": "epsg:900913" } }, "type": "FeatureCollection", "features": [ { "type": "Feature", "properties": { "FID": 0.000000 }, "geometry": { "type": "Polygon", "coordinates": [[ [-20037508.34,-20037508.34], [-20037508.34,20037508.34], [20037508.34,20037508.34], [20037508.34,-20037508.34], [-20037508.34,-20037508.34] ]] } } ] } node-srs-0.3.2/test/data/27700_esri_wkt.prj0000644000175000017500000000063712204545112016361 0ustar devdevPROJCS["OSGB 1936 / British National Grid",GEOGCS["OSGB 1936",DATUM["D_OSGB_1936",SPHEROID["Airy_1830",6377563.396,299.3249646]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",49],PARAMETER["central_meridian",-2],PARAMETER["scale_factor",0.9996012717],PARAMETER["false_easting",400000],PARAMETER["false_northing",-100000],UNIT["Meter",1]]node-srs-0.3.2/test/data/world_extent_wgs84.geojson0000644000175000017500000000051512204545112020411 0ustar devdev{ "type": "FeatureCollection", "features": [ { "type": "Feature", "properties": { "FID": 0.000000 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -180.0, -85.051129 ], [ -180.0, 85.051129 ], [ 180.0, 85.051129 ], [ 180.0, -85.051129 ], [ -180.0, -85.051129 ] ] ] } } ] } node-srs-0.3.2/test/data/esri_webmerc_auxshpere.prj0000644000175000017500000000065112204545112020521 0ustar devdevPROJCS["WGS_1984_Web_Mercator_Auxiliary_Sphere",GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Mercator_Auxiliary_Sphere"],PARAMETER["False_Easting",0.0],PARAMETER["False_Northing",0.0],PARAMETER["Central_Meridian",0.0],PARAMETER["Standard_Parallel_1",0.0],PARAMETER["Auxiliary_Sphere_Type",0.0],UNIT["Meter",1.0]]node-srs-0.3.2/test/data/3857-ogr-1.10.0-wkt.prj0000644000175000017500000000052712204545112016502 0ustar devdevPROJCS["WGS_84_Pseudo_Mercator",GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]],PROJECTION["Mercator"],PARAMETER["central_meridian",0],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["Meter",1],PARAMETER["standard_parallel_1",0.0]]node-srs-0.3.2/test/data/esri_webmerc_auxshpere2.prj0000644000175000017500000000103112204545112020574 0ustar devdevPROJCS["WGS_1984_Web_Mercator_Auxiliary_Sphere", GEOGCS["GCS_WGS_1984", DATUM["D_WGS_1984", SPHEROID["WGS_1984",6378137.0,298.257223563]], PRIMEM["Greenwich",0.0], UNIT["Degree",0.0174532925199433]], PROJECTION["Mercator_Auxiliary_Sphere"], PARAMETER["False_Easting",0.0], PARAMETER["False_Northing",0.0], PARAMETER["Central_Meridian",0.0], PARAMETER["Standard_Parallel_1",0.0], PARAMETER["Auxiliary_Sphere_Type",0.0], UNIT["Meter",1.0], AUTHORITY["ESRI","102100"]]node-srs-0.3.2/test/data/27700_ogc_wkt.prj0000644000175000017500000000117012204545112016160 0ustar devdevPROJCS["OSGB 1936 / British National Grid",GEOGCS["OSGB 1936",DATUM["OSGB_1936",SPHEROID["Airy 1830",6377563.396,299.3249646,AUTHORITY["EPSG","7001"]],AUTHORITY["EPSG","6277"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.01745329251994328,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4277"]],UNIT["metre",1,AUTHORITY["EPSG","9001"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",49],PARAMETER["central_meridian",-2],PARAMETER["scale_factor",0.9996012717],PARAMETER["false_easting",400000],PARAMETER["false_northing",-100000],AUTHORITY["EPSG","27700"],AXIS["Easting",EAST],AXIS["Northing",NORTH]]node-srs-0.3.2/test/data/sr-org-6-ogcwkt.prj0000644000175000017500000000071212204545112016635 0ustar devdevPROJCS["unnamed",GEOGCS["unnamed ellipse",DATUM["unknown",SPHEROID["unnamed",6378137,0]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433]],PROJECTION["Mercator_2SP"],PARAMETER["standard_parallel_1",0],PARAMETER["central_meridian",0],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["Meter",1],EXTENSION["PROJ4","+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"]]node-srs-0.3.2/test/data/esri_webmerc.prj0000644000175000017500000000063312204545112016435 0ustar devdevPROJCS["WGS_1984_Web_Mercator",GEOGCS["GCS_WGS_1984_Major_Auxiliary_Sphere",DATUM["D_WGS_1984_Major_Auxiliary_Sphere",SPHEROID["WGS_1984_Major_Auxiliary_Sphere",6378137.0,0.0]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Mercator"],PARAMETER["False_Easting",0.0],PARAMETER["False_Northing",0.0],PARAMETER["Central_Meridian",0.0],PARAMETER["Standard_Parallel_1",0.0],UNIT["Meter",1.0]]node-srs-0.3.2/test/geojson.test.js0000644000175000017500000000165512204545112015326 0ustar devdevvar srs = require('srs'); var assert = require('assert'); describe('GeoJSON', function() { it('should detect mercator', function() { var merc = srs.parse('./test/data/world_extent_merc.geojson'); assert.equal(merc.proj4, srs.canonical.spherical_mercator.proj4); }); it('should detect wgs84', function() { var wgs84 = srs.parse('./test/data/world_extent_wgs84.geojson'); assert.equal(wgs84.proj4, '+proj=longlat +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +no_defs'); }); it('should detect wgs84 2', function() { var wgs84_2 = srs.parse('./test/data/test.json'); assert.equal(wgs84_2.proj4, '+proj=longlat +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +no_defs'); }); it('should detect with no ext', function() { var wgs84 = srs.parse('./test/data/mystery-api'); assert.equal(wgs84.proj4, '+proj=longlat +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +no_defs'); }); }); node-srs-0.3.2/test/shapefile.3857.test.js0000644000175000017500000004274112204545112016230 0ustar devdevvar srs = require('srs'); var fs = require('fs'); var assert = require('assert'); var expected = srs.canonical.spherical_mercator; describe('Mercator', function() { it('should detect non-spherical mercator', function() { // non spherical merc's - should not match //# WGS 84 / PDC Mercator (deprecated) //<3349> +proj=merc +lon_0=-150 +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> // typo NAD83(NSRS2007) / Michigan Central //check_result('+init=epsg:3587',srs.canonical.spherical_mercator, false); var not_3857 = { srid: undefined, auth: undefined, esri: false, is_geographic: false, valid: true }; var srid3349 = '+proj=merc +lon_0=-150 +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs'; var parsed = srs.parse(srid3349); assert.ok(parsed.proj4); assert.equal(parsed.proj4, '+proj=merc +lon_0=-150 +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs'); assert.equal(parsed.srid, not_3857.srid); assert.equal(parsed.auth, not_3857.auth); assert.equal(parsed.esri, not_3857.esri); assert.equal(parsed.is_geographic, not_3857.is_geographic); assert.equal(parsed.valid, not_3857.valid); var epsg3395 = fs.readFileSync('./test/data/3395-non-spherical-merc.prj').toString(); parsed = srs.parse(epsg3395); assert.ok(parsed.proj4); assert.equal(parsed.proj4, '+proj=merc +lon_0=0 +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs'); assert.equal(parsed.srid, not_3857.srid); assert.equal(parsed.auth, not_3857.auth); assert.equal(parsed.esri, not_3857.esri); assert.equal(parsed.is_geographic, not_3857.is_geographic); assert.equal(parsed.valid, not_3857.valid); }); /* EPSG:900913 aka. Spherical Mercator http://wiki.openstreetmap.org/wiki/EPSG:3857 */ // https://github.com/springmeyer/node-srs/issues/27 it('should detect qgis/ogr wkt', function() { var val = fs.readFileSync('./test/data/3857-ogr-1.10.0-wkt.prj').toString(); var parsed = srs.parse(val); assert.ok(parsed.proj4); //assert.equal(parsed.proj4,''); assert.equal(parsed.srid, expected.srid); assert.equal(parsed.auth, expected.auth); assert.equal(parsed.esri, expected.esri); assert.equal(parsed.is_geographic, expected.is_geographic); assert.equal(parsed.valid, expected.valid); }); it('should detect qgis/ogr wkt', function() { var val = fs.readFileSync('./test/data/world_borders_merc.prj').toString(); var parsed = srs.parse(val); assert.ok(parsed.proj4); //assert.equal(parsed.proj4,''); assert.equal(parsed.srid, expected.srid); assert.equal(parsed.auth, expected.auth); assert.equal(parsed.esri, expected.esri); assert.equal(parsed.is_geographic, expected.is_geographic); assert.equal(parsed.valid, expected.valid); }); it('should detect sr-org produced by older ogr version', function() { var val = fs.readFileSync('./test/data/sr-org-6-esriwkt.prj').toString(); var parsed = srs.parse(val); assert.ok(parsed.proj4); //assert.equal(parsed.proj4,''); assert.equal(parsed.srid, expected.srid); assert.equal(parsed.auth, expected.auth); assert.equal(parsed.esri, expected.esri); assert.equal(parsed.is_geographic, expected.is_geographic); assert.equal(parsed.valid, expected.valid); }); it('should detect sr-ogr6', function() { var val = '+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'; var parsed = srs.parse(val); assert.ok(parsed.proj4); //assert.equal(parsed.proj4,''); assert.equal(parsed.srid, expected.srid); assert.equal(parsed.auth, expected.auth); assert.equal(parsed.esri, expected.esri); assert.equal(parsed.is_geographic, expected.is_geographic); assert.equal(parsed.valid, expected.valid); }); it('should detect http://prj2epsg.org/epsg/3857', function() { var val = fs.readFileSync('./test/data/prj2epsg-wkt-3857.prj').toString(); var parsed = srs.parse(val); assert.ok(parsed.proj4); //assert.equal(parsed.proj4,''); assert.equal(parsed.srid, expected.srid); assert.equal(parsed.auth, expected.auth); assert.equal(parsed.esri, expected.esri); assert.equal(parsed.is_geographic, expected.is_geographic); assert.equal(parsed.valid, expected.valid); }); it('should detect +over stripped', function() { var val = '+proj=merc +lon_0=0 +lat_ts=0 +x_0=0 +y_0=0 +ellps=WGS84 +units=m +no_defs'; var parsed = srs.parse(val); assert.ok(parsed.proj4); //assert.equal(parsed.proj4,''); assert.equal(parsed.srid, expected.srid); assert.equal(parsed.auth, expected.auth); assert.equal(parsed.esri, expected.esri); assert.equal(parsed.is_geographic, expected.is_geographic); assert.equal(parsed.valid, expected.valid); }); it('should detect proj 3857', function() { var val = '+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'; var parsed = srs.parse(val); assert.ok(parsed.proj4); //assert.equal(parsed.proj4,''); assert.equal(parsed.srid, expected.srid); assert.equal(parsed.auth, expected.auth); assert.equal(parsed.esri, expected.esri); assert.equal(parsed.is_geographic, expected.is_geographic); assert.equal(parsed.valid, expected.valid); }); it('should detect 900913', function() { var val = '+init=epsg:900913'; var parsed = srs.parse(val); assert.ok(parsed.proj4); //assert.equal(parsed.proj4,''); assert.equal(parsed.srid, expected.srid); assert.equal(parsed.auth, expected.auth); assert.equal(parsed.esri, expected.esri); assert.equal(parsed.is_geographic, expected.is_geographic); assert.equal(parsed.valid, expected.valid); }); it('should detect esri 900913', function() { var val = fs.readFileSync('./test/data/900913.esri.prj').toString(); var parsed = srs.parse(val); assert.ok(parsed.proj4); //assert.equal(parsed.proj4,''); assert.equal(parsed.srid, expected.srid); assert.equal(parsed.auth, expected.auth); assert.equal(parsed.esri, expected.esri); assert.equal(parsed.is_geographic, expected.is_geographic); assert.equal(parsed.valid, expected.valid); }); it('should detect esri 900913 hint', function() { var val = 'ESRI::' + fs.readFileSync('./test/data/900913.esri.prj').toString(); var parsed = srs.parse(val); assert.ok(parsed.proj4); //assert.equal(parsed.proj4,''); assert.equal(parsed.srid, expected.srid); assert.equal(parsed.auth, expected.auth); assert.equal(parsed.esri, expected.esri); assert.equal(parsed.is_geographic, expected.is_geographic); assert.equal(parsed.valid, expected.valid); }); it('should detect esri webmerc', function() { var val = fs.readFileSync('./test/data/esri_webmerc.prj').toString(); var parsed = srs.parse(val); assert.ok(parsed.proj4); //assert.equal(parsed.proj4,''); assert.equal(parsed.srid, expected.srid); assert.equal(parsed.auth, expected.auth); assert.equal(parsed.esri, expected.esri); assert.equal(parsed.is_geographic, expected.is_geographic); assert.equal(parsed.valid, expected.valid); }); it('should detect esri webmerc hint', function() { var val = 'ESRI::' + fs.readFileSync('./test/data/esri_webmerc.prj').toString(); var parsed = srs.parse(val); assert.ok(parsed.proj4); //assert.equal(parsed.proj4,''); assert.equal(parsed.srid, expected.srid); assert.equal(parsed.auth, expected.auth); assert.equal(parsed.esri, expected.esri); assert.equal(parsed.is_geographic, expected.is_geographic); assert.equal(parsed.valid, expected.valid); }); it('should detect esri webmerc aux', function() { var val = fs.readFileSync('./test/data/esri_webmerc_auxshpere.prj').toString(); var parsed = srs.parse(val); assert.ok(parsed.proj4); //assert.equal(parsed.proj4,''); assert.equal(parsed.srid, expected.srid); assert.equal(parsed.auth, expected.auth); assert.equal(parsed.esri, expected.esri); assert.equal(parsed.is_geographic, expected.is_geographic); assert.equal(parsed.valid, expected.valid); }); it('should detect webmerc aux hint', function() { var val = 'ESRI::' + fs.readFileSync('./test/data/esri_webmerc_auxshpere.prj').toString(); var parsed = srs.parse(val); assert.ok(parsed.proj4); //assert.equal(parsed.proj4,''); assert.equal(parsed.srid, expected.srid); assert.equal(parsed.auth, expected.auth); assert.equal(parsed.esri, expected.esri); assert.equal(parsed.is_geographic, expected.is_geographic); assert.equal(parsed.valid, expected.valid); }); it('should detect esri webmerc aux2', function() { var val = fs.readFileSync('./test/data/esri_webmerc_auxshpere2.prj').toString(); var parsed = srs.parse(val); assert.ok(parsed.proj4); //assert.equal(parsed.proj4,''); assert.equal(parsed.srid, expected.srid); assert.equal(parsed.auth, expected.auth); assert.equal(parsed.esri, expected.esri); assert.equal(parsed.is_geographic, expected.is_geographic); assert.equal(parsed.valid, expected.valid); }); it('should detect esri webmerc aux2 hint', function() { var val = 'ESRI::' + fs.readFileSync('./test/data/esri_webmerc_auxshpere2.prj').toString(); var parsed = srs.parse(val); assert.ok(parsed.proj4); //assert.equal(parsed.proj4,''); assert.equal(parsed.srid, expected.srid); assert.equal(parsed.auth, expected.auth); assert.equal(parsed.esri, expected.esri); assert.equal(parsed.is_geographic, expected.is_geographic); assert.equal(parsed.valid, expected.valid); }); // https://github.com/mapbox/tilemill/issues/1759 it('should detect osm_landusages', function() { var val = 'ESRI::' + fs.readFileSync('./test/data/osm_landusages.prj').toString(); var parsed = srs.parse(val); assert.ok(parsed.proj4); //assert.equal(parsed.proj4,''); assert.equal(parsed.srid, expected.srid); assert.equal(parsed.auth, expected.auth); assert.equal(parsed.esri, expected.esri); assert.equal(parsed.is_geographic, expected.is_geographic); assert.equal(parsed.valid, expected.valid); }); it('should detect bogus proj 1', function() { var val = '+proj=merc +lon_0=0 +lat_ts=0 +x_0=0 +y_0=0 +ellps=WGS84 +units=m +no_defs +foo'; var parsed = srs.parse(val); assert.ok(parsed.proj4); //assert.equal(parsed.proj4,''); assert.equal(parsed.srid, expected.srid); assert.equal(parsed.auth, expected.auth); assert.equal(parsed.esri, expected.esri); assert.equal(parsed.is_geographic, expected.is_geographic); assert.equal(parsed.valid, expected.valid); }); it('should detect bogus proj 2', function() { var val = '+proj=merc +lon_0=0 +lat_ts=0 +x_0=0 +y_0=0 +a=6378137 +b=6378137 +units=m'; var parsed = srs.parse(val); assert.ok(parsed.proj4); //assert.equal(parsed.proj4,''); assert.equal(parsed.srid, expected.srid); assert.equal(parsed.auth, expected.auth); assert.equal(parsed.esri, expected.esri); assert.equal(parsed.is_geographic, expected.is_geographic); assert.equal(parsed.valid, expected.valid); }); /* Mercator_1SP and Mercator_2SP lots of confusion with these: http://trac.osgeo.org/gdal/ticket/2744 http://trac.osgeo.org/gdal/ticket/1797 http://www.remotesensing.org/geotiff/proj_list/mercator_2sp.html These are not spherical merc, but for our purposes we are going to ignore complexity and assume when these keywords are used in the top level name, aka the `PROJCS` then this is meant to be spherical mercator and may originate from some app or lonely soul grabbing a wkt in deparation from http://spatialreference.org/ref/sr-org/7299/ogcwkt/ which at the time of writing was equal to: PROJCS["Mercator_1SP",GEOGCS["GCS_Geographic Coordinate System",DATUM["D_WGS_1984_MAJOR_AUXILIARY_SPHERE",SPHEROID["Sphere_Radius_6378137_m",6378137,0]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]],PROJECTION["Mercator"],PARAMETER["central_meridian",0],PARAMETER["standard_parallel_1",0],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["Meter",1]] or http://spatialreference.org/ref/sr-org/google-projection/esriwkt/: PROJCS["Mercator_2SP",GEOGCS["unnamed ellipse",DATUM["D_unknown",SPHEROID["Unknown",6378137,0]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]],PROJECTION["Mercator_2SP"],PARAMETER["standard_parallel_1",0],PARAMETER["central_meridian",0],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["Meter",1]] */ it('should detect sr.org mercator1sp', function() { var val = 'ESRI::' + fs.readFileSync('./test/data/esri-mercator-1sp.prj').toString(); var parsed = srs.parse(val); assert.ok(parsed.proj4); assert.ok(parsed.proj4); //assert.equal(parsed.proj4,''); assert.equal(parsed.srid, expected.srid); assert.equal(parsed.auth, expected.auth); assert.equal(parsed.esri, expected.esri); assert.equal(parsed.is_geographic, expected.is_geographic); assert.equal(parsed.valid, expected.valid); }); it('should detect sr.org messed up mercator2sp', function() { var val = 'ESRI::' + fs.readFileSync('./test/data/bogus_mercator2sp.prj').toString(); var parsed = srs.parse(val); assert.ok(parsed.proj4); assert.ok(parsed.proj4); //assert.equal(parsed.proj4,''); assert.equal(parsed.srid, expected.srid); assert.equal(parsed.auth, expected.auth); assert.equal(parsed.esri, expected.esri); assert.equal(parsed.is_geographic, expected.is_geographic); assert.equal(parsed.valid, expected.valid); }); it('should detect openstreetmapdata.com as 3857', function() { var val = fs.readFileSync('./test/data/simplified-land-polygons-complete-3857.prj').toString(); var parsed = srs.parse(val); assert.ok(parsed.proj4); assert.ok(parsed.proj4); //assert.equal(parsed.proj4,''); assert.equal(parsed.srid, expected.srid); assert.equal(parsed.auth, expected.auth); assert.equal(parsed.esri, expected.esri); assert.equal(parsed.is_geographic, expected.is_geographic); assert.equal(parsed.valid, expected.valid); }); it('should detect +init=epsg:3857 as 3857', function() { var val = '+init=epsg:3857'; var parsed = srs.parse(val); assert.ok(parsed.proj4); //assert.equal(parsed.proj4,''); assert.equal(parsed.srid,expected.srid); assert.equal(parsed.auth,expected.auth); assert.equal(parsed.esri,expected.esri); assert.equal(parsed.is_geographic,expected.is_geographic); assert.equal(parsed.valid,expected.valid); }); it('should detect +init=esri:102100 as 3857', function() { var val = '+init=esri:102100'; var parsed = srs.parse(val); assert.ok(parsed.proj4); //assert.equal(parsed.proj4,''); assert.equal(parsed.srid,expected.srid); assert.equal(parsed.auth,expected.auth); assert.equal(parsed.esri,expected.esri); assert.equal(parsed.is_geographic,expected.is_geographic); assert.equal(parsed.valid,expected.valid); }); it('should detect +init=esri:102113 as 3857', function() { var val = '+init=esri:102113'; var parsed = srs.parse(val); assert.ok(parsed.proj4); //assert.equal(parsed.proj4,''); assert.equal(parsed.srid,expected.srid); assert.equal(parsed.auth,expected.auth); assert.equal(parsed.esri,expected.esri); assert.equal(parsed.is_geographic,expected.is_geographic); assert.equal(parsed.valid,expected.valid); }); it('should detect +init=epsg:3785 as 3857', function() { var val = '+init=epsg:3785'; var parsed = srs.parse(val); assert.ok(parsed.proj4); //assert.equal(parsed.proj4,''); assert.equal(parsed.srid,expected.srid); assert.equal(parsed.auth,expected.auth); assert.equal(parsed.esri,expected.esri); assert.equal(parsed.is_geographic,expected.is_geographic); assert.equal(parsed.valid,expected.valid); }); it('should detect +init=osgeo:41001 as 3857', function() { var val = '+init=osgeo:41001'; var parsed = srs.parse(val); assert.ok(parsed.proj4); //assert.equal(parsed.proj4,''); assert.equal(parsed.srid,expected.srid); assert.equal(parsed.auth,expected.auth); assert.equal(parsed.esri,expected.esri); assert.equal(parsed.is_geographic,expected.is_geographic); assert.equal(parsed.valid,expected.valid); }); }); node-srs-0.3.2/test/shapefile.27700.test.js0000644000175000017500000000437412204545112016301 0ustar devdevvar srs = require('srs'); var fs = require('fs'); var assert = require('assert'); describe('OSGB 1936', function() { it('should report that it was parsed as esri if ESRI:: was manually prepended', function() { var esri_srs = fs.readFileSync('./test/data/27700_esri_wkt.prj').toString(); var esri_result = srs.parse('ESRI::'+esri_srs); assert.equal(esri_result.esri,true); }); // https://github.com/springmeyer/node-srs/issues/25 it('should detect OGC format for OSGB 1936 / British National Grid', function() { var ogc_srs = fs.readFileSync('./test/data/27700_ogc_wkt.prj').toString(); var ogc = srs.parse(ogc_srs); assert.equal(ogc.srid,27700); assert.equal(ogc.name,'OSGB 1936 / British National Grid'); assert.equal(ogc.esri,false); assert.equal(ogc.proj4,'+proj=tmerc +lat_0=49 +lon_0=-2 +k=0.9996012717 +x_0=400000 +y_0=-100000 +datum=OSGB36 +units=m +no_defs'); }); // https://github.com/springmeyer/node-srs/issues/25 it('should detect correct proj4 for ESRI format for OSGB 1936 / British National Grid', function() { var esri_srs = fs.readFileSync('./test/data/27700_esri_wkt.prj').toString(); // parse by forcing ESRI:: prepend var esri_result = srs.parse('ESRI::'+esri_srs); assert.equal(esri_result.name,'OSGB 1936 / British National Grid'); // should be: // +proj=tmerc +lat_0=49 +lon_0=-2 +k=0.9996012717 +x_0=400000 +y_0=-100000 +datum=OSGB36 +units=m +no_defs // not: // +proj=tmerc +lat_0=49 +lon_0=-2 +k=0.9996012717 +x_0=400000 +y_0=-100000 +ellps=airy +units=m +no_defs var expected = '+proj=tmerc +lat_0=49 +lon_0=-2 +k=0.9996012717 +x_0=400000 +y_0=-100000 +datum=OSGB36 +units=m +no_defs'; assert.equal(esri_result.proj4,expected); // and test parsing without forcing ESRI:: prepend var esri_result2 = srs.parse(esri_srs); assert.equal(esri_result2.proj4,expected); }); it('should detect correct srid for ESRI format for OSGB 1936 / British National Grid', function() { var esri_srs = fs.readFileSync('./test/data/27700_esri_wkt.prj').toString(); var esri_result = srs.parse(esri_srs); assert.equal(esri_result.srid,27700); }); });node-srs-0.3.2/lib/0000755000175000017500000000000012210127655012133 5ustar devdevnode-srs-0.3.2/lib/srs.js0000644000175000017500000002261512204545112013301 0ustar devdevvar path = require('path'); var fs = require('fs'); var srs = require('./_srs'); var exists = require('fs').existsSync || require('path').existsSync; if (exists('./settings.js')) { var _settings = require('./settings'); } exports.version = require('../package').version; /* This is a custom srs definition for spherical mercator that we make canonical because no single variant of the projection stored by various applications is optimal. This is basically a modification of gdal's understanding of epsg 3857 Changes: * add +over and +wktext to proj4 string * remove any double spaces in proj4 string * epsg is 3857, the new official epsg for 900913 * name is pulled from gdal/data/cubwerx_extra.wkt for 900913 instead of using 'WGS 84 / Pseudo-Mercator' or 'Popular...' TODO: * +x_0=0.0 vs +x_0=0 (same with +y_0) * handle two scaling aliases +k and +k_0 * meaning of +k=1. vs +k=1.0 ? */ var merc_pretty_wkt = 'PROJCS["WGS 84 / Pseudo-Mercator",\n GEOGCS["WGS 84",\n DATUM["WGS_1984",\n SPHEROID["WGS 84",6378137,298.257223563,\n AUTHORITY["EPSG","7030"]],\n AUTHORITY["EPSG","6326"]],\n PRIMEM["Greenwich",0,\n AUTHORITY["EPSG","8901"]],\n UNIT["degree",0.0174532925199433,\n AUTHORITY["EPSG","9122"]],\n AUTHORITY["EPSG","4326"]],\n UNIT["metre",1,\n AUTHORITY["EPSG","9001"]],\n PROJECTION["Mercator_1SP"],\n PARAMETER["central_meridian",0],\n PARAMETER["scale_factor",1],\n PARAMETER["false_easting",0],\n PARAMETER["false_northing",0],\n EXTENSION["PROJ4","+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over"],\n AUTHORITY["EPSG","3857"],\n AXIS["X",EAST],\n AXIS["Y",NORTH]]'; var lon_lat_pretty_wkt = 'GEOGCS["WGS 84",\n DATUM["WGS_1984",\n SPHEROID["WGS 84",6378137,298.257223563,\n AUTHORITY["EPSG","7030"]],\n TOWGS84[0,0,0,0,0,0,0],\n AUTHORITY["EPSG","6326"]],\n PRIMEM["Greenwich",0,\n AUTHORITY["EPSG","8901"]],\n UNIT["degree",0.0174532925199433,\n AUTHORITY["EPSG","9108"]],\n AUTHORITY["EPSG","4326"]]'; var canonical = { spherical_mercator: { proj4: '+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over', srid: 3857, // or 900913 auth: 'EPSG', pretty_wkt: merc_pretty_wkt, esri: false, name: 'Google Maps Global Mercator', // so many variants here valid: true, is_geographic: false }, wgs_84: { proj4: '+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs', srid: 4326, auth: 'EPSG', pretty_wkt: lon_lat_pretty_wkt, esri: false, name: 'WGS 84', valid: true, is_geographic: true } }; function oc(a) { var o = {}; for (var i = 0; i < a.length; i++) { o[a[i]] = ''; } return o; } var merc_names = [ 'Google_Maps_Global_Mercator', 'Google Maps Global Mercator', 'WGS 84 / Pseudo-Mercator', // 3857 'WGS_84_Pseudo_Mercator', // 3857 with new gdal/ogr name as per https://github.com/springmeyer/node-srs/issues/27 'Popular Visualisation CRS / Mercator', // 3785 'WGS_1984_Web_Mercator', // ESRI 'WGS_1984_Web_Mercator_Auxiliary_Sphere', // ESRI 'Popular_Visualisation_CRS_Mercator_deprecated', // wtf 'Mercator_1SP', 'Mercator_2SP' ]; var merc_srids = [ 900913, // http://crschmidt.net/blog/archives/243/google-projection-900913/ 3857, // epsg official, second try 3785, // epsg deprecated, failed first try 102100, // esri official, second try 102113, // esri deprecated, failed first try 41001 //osgeo ]; // commonly confused as spherical mercator, but not, right? // here only for reference currently, nothing done programmatically var other_merc_srids = [ 3395, // "WGS 84 / World Mercator" or normal, no googlized mercator: lacked +a=6378137 +b=6378137 3587, // common typo but actually NAD83(NSRS2007) / Michigan Central // for these see also notes in shapefile.3857.test.js 9804, // older, esri style-named traditional merc: http://www.remotesensing.org/geotiff/proj_list/mercator_1sp.html 9805, // older, esri style-named traditional merc: http://www.remotesensing.org/geotiff/proj_list/mercator_2sp.html ] var known_esri_variant_special_cases = [ ['DATUM["D_OSGB_1936"','DATUM["OSGB_1936"'] ]; /* if we have statically linked libosr then we need to set the GDAL_DATA directory so that the bundled .csv and .wkt files are found. */ if (_settings && _settings.static_osr) { process.env.GDAL_DATA = path.join(__dirname, 'srs_data'); } var force_merc = function(result) { var new_merc = canonical.spherical_mercator; new_merc.input = result.input; return new_merc; }; var split_proj = function(literal) { var parts = literal.split(' '); // remove blank parts due to double spaces (common in proj epsg table) var len = parts.length; for (i = 0; i < len; i++) { if (parts[i] === '') { parts.splice(i, 1); } } // break into key=value pairs, discarding +modifiers without values var pairs = {}; parts.sort(); var new_len = parts.length; for (i = 0; i < new_len; i++) { var p = parts[i]; if (p.indexOf('=') != -1) { var pair = p.split('='); if (pair[1] && pair[1] === '0') { // https://github.com/mapbox/tilemill/issues/1866 pair[1] = '0.0' } pairs[pair[0]] = pair[1]; } } return pairs; }; var canonical_parts = split_proj(canonical.spherical_mercator.proj4); var canonical_stringify = JSON.stringify(canonical_parts); var parse = function(arg) { if (arg instanceof Buffer) { arg = arg.toString(); } if (exists(arg)) { var extension = path.extname(arg).toLowerCase(); var is_json = false; if (extension == '.json' || extension == '.geojson') { is_json = true; } var file_data = fs.readFileSync(arg); if (!is_json) { if (file_data[0] == '{') { is_json = true; } else { var fstring = file_data.toString(); if ( ((fstring.search('"type"') > -1) && (fstring.search('"coordinates"') > -1)) || (fstring.search('"FeatureCollection"') > -1) || ((fstring.search('"geometryType"') > -1) && (fstring.search('"esriGeometry"') > -1)) ) { is_json = true; } } } if (is_json) { var file = JSON.parse(file_data); if (file.crs && file.crs.properties && file.crs.properties.urn) { arg = file.crs.properties.urn; } else if (file.crs && file.crs.properties && file.crs.properties.name) { arg = file.crs.properties.name; } else { arg = '+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs'; } } } // early check for known +init=epsg: syntax, which we will // translate to +proj literal to avoid requiring proj4 to do that in mapnik var arg_lower = arg.toLowerCase(); if (arg_lower.indexOf('+init=') > -1) { var parts = arg_lower.split(':'); if (parts[1]) { var code = +parts[1]; if (merc_srids.indexOf(code) > -1) { return force_merc({input:arg}); } } } for (var hack in known_esri_variant_special_cases) { var obj = known_esri_variant_special_cases[hack]; if (arg.indexOf(obj[0]) > -1) { arg = arg.replace(obj[0],obj[1]); } } var result; try { result = srs._parse(arg); } catch (e) { if (arg.indexOf('ESRI::') !== 0) { result = srs._parse('ESRI::' + arg); } else { throw e; } } // detect mercator variants and // replace with canonical.spherical_mercator if (result.name in oc(merc_names)) { // this should be a fast track for many .prj files return force_merc(result); } else if (result.srid in oc(merc_srids)) { return force_merc(result); } else if (result.proj4 !== undefined && result.proj4.indexOf('+proj=merc') != -1) { // catch case of gdal's translation to proj4 being used as input if (result.proj4 === '+proj=merc +lon_0=0 +lat_ts=0 +x_0=0 +y_0=0 +ellps=WGS84 +units=m +no_defs') { return force_merc(result); } else if (result.proj4 === '+proj=merc +lon_0=0 +lat_ts=0 +x_0=0 +y_0=0 +a=6378137 +b=6378137 +units=m +no_defs') { return force_merc(result); } // break into parts // TODO - sort and remove less critical pairs var parts = split_proj(result.proj4); if (JSON.stringify(parts) === canonical_stringify) { return force_merc(result); } } // detect OSGB variant and fix the srid // https://github.com/springmeyer/node-srs/issues/25 if (!result.srid && result.name == 'OSGB 1936 / British National Grid') { result.srid = 27700; result.auth = 27700; } return result; }; // push all C++ symbols into js module for (var k in srs) { exports[k] = srs[k]; } // make available objects from js exports.settings = _settings; exports.canonical = canonical; exports.split_proj = split_proj; exports.parse = parse; node-srs-0.3.2/lib/index.js0000644000175000017500000000004312204545112013570 0ustar devdevmodule.exports = require('./srs'); node-srs-0.3.2/README.md0000644000175000017500000000571012204545112012642 0ustar devdev # Node-Srs Bindings to libosr for handling spatial references in [node](http://nodejs.org). ## Example Detect a proj4 literal string as spherical mercator: ```js > var srs = require('srs'); > srs.parse('+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') { proj4: '+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over', srid: 3857, auth: 'EPSG', pretty_wkt: 'PROJCS["WGS 84 / Pseudo-Mercator",\n GEOGCS["WGS 84",\n DATUM["WGS_1984",\n SPHEROID["WGS 84",6378137,298.257223563,\n AUTHORITY["EPSG","7030"]],\n AUTHORITY["EPSG","6326"]],\n PRIMEM["Greenwich",0,\n AUTHORITY["EPSG","8901"]],\n UNIT["degree",0.0174532925199433,\n AUTHORITY["EPSG","9122"]],\n AUTHORITY["EPSG","4326"]],\n UNIT["metre",1,\n AUTHORITY["EPSG","9001"]],\n PROJECTION["Mercator_1SP"],\n PARAMETER["central_meridian",0],\n PARAMETER["scale_factor",1],\n PARAMETER["false_easting",0],\n PARAMETER["false_northing",0],\n EXTENSION["PROJ4","+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"],\n AUTHORITY["EPSG","3857"],\n AXIS["X",EAST],\n AXIS["Y",NORTH]]', esri: false, name: 'Google Maps Global Mercator', valid: true, is_geographic: false, input: '+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' } ``` Detect a WKT string as WGS84: ```js > srs.parse('GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]]') { input: 'GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]]', proj4: '+proj=longlat +ellps=WGS84 +no_defs', srid: 4326, auth: 'EPSG', pretty_wkt: 'GEOGCS["GCS_WGS_1984",\n DATUM["D_WGS_1984",\n SPHEROID["WGS_1984",6378137,298.257223563]],\n PRIMEM["Greenwich",0],\n UNIT["Degree",0.017453292519943295],\n AUTHORITY["EPSG","4326"]]', esri: false, name: 'GCS_WGS_1984', valid: true, is_geographic: true } ``` ## Depends node >= 0.2.4 (development headers) No other required dependencies Optionally can depend/dynamically link to libgdal by doing: ./configure --shared-gdal make or: export NODE_SRS_SHARED_GDAL=1 npm install srs ## Installation Install node-srs: From source: $ git clone git://github.com/springmeyer/node-srs.git $ cd node-srs $ ./configure $ make $ sudo make install $ make test Make sure the node modules is on your path: export NODE_PATH=/usr/local/lib/node/ Or you can install via npm: $ npm install srs ## License BSD, see LICENSE.txtnode-srs-0.3.2/configure0000755000175000017500000000011512204545112013264 0ustar devdev#!/bin/sh `npm explore npm -g -- pwd`/bin/node-gyp-bin/node-gyp configure $@node-srs-0.3.2/LICENSE.txt0000644000175000017500000000311212204545112013200 0ustar devdevCopyright (c) 2011, Dane Springmeyer All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the author nor the names of other contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. This project also includes code and files from GDAL, see GDAL_LICENSE for more details.node-srs-0.3.2/CHANGELOG.md0000644000175000017500000000104412204545112013170 0ustar devdev# changelog 0.3.2 - Re-enabled optional linking with `gdal-config --dep-libs` by passing `npm install --runtime_link=static` 0.3.1 - Removed build linking to gdal libs / gdal-config --dep-libs, now only linking to libgdal itself by default 0.3.0 - Now using node-gyp for build - Now requiring Node >= 0.6.13 (for node-gyp support) - Node v0.10.x support - Now requiring external libgdal - Better detection of more spherical mercator variants - Better detection of +init=epsg based mercator srs and auto-transformation to +proj syntax node-srs-0.3.2/src/0000755000175000017500000000000012204545112012147 5ustar devdevnode-srs-0.3.2/src/_srs.cc0000644000175000017500000001571012204545112013430 0ustar devdev// v8 #include // node #include #include // stl #include #include #include #include // osr #include "ogr_spatialref.h" //#include "ogr_core.h" //#include "cpl_conv.h" #include "cpl_string.h" //#include "ogr_p.h" //#include "cpl_multiproc.h" //#include "ogr_srs_api.h" using namespace node; using namespace v8; #define TOSTR(obj) (*String::Utf8Value((obj)->ToString())) /* OGRERR_DICT = { 1 : (OGRException, "Not enough data."), 2 : (OGRException, "Not enough memory."), 3 : (OGRException, "Unsupported geometry type."), 4 : (OGRException, "Unsupported operation."), 5 : (OGRException, "Corrupt data."), 6 : (OGRException, "OGR failure."), 7 : (SRSException, "Unsupported SRS."), 8 : (OGRException, "Invalid handle."), } */ static Handle parse(const Arguments& args) { HandleScope scope; if (args.Length() != 1 || !args[0]->IsString()) return ThrowException(Exception::TypeError( String::New("first argument must be srs string in any form readable by OGR, like WKT (.prj file) or a proj4 string"))); OGRSpatialReference oSRS; Local result = Object::New(); result->Set(String::NewSymbol("input"), args[0]->ToString()); // intialize as undefined result->Set(String::NewSymbol("proj4"), Undefined()); result->Set(String::NewSymbol("srid"), Undefined()); result->Set(String::NewSymbol("auth"), Undefined()); result->Set(String::NewSymbol("pretty_wkt"), Undefined()); result->Set(String::NewSymbol("esri"), Undefined()); result->Set(String::NewSymbol("name"), Undefined()); std::string wkt_string = TOSTR(args[0]->ToString()); const char *wkt_char = wkt_string.data(); bool error = false; Handle err; if( oSRS.SetFromUserInput(wkt_char) != OGRERR_NONE ) { error = true; std::ostringstream s; s << "OGR Error type #" << CPLE_AppDefined << " problem occured importing from srs wkt: " << wkt_string << ".\n";; err = ThrowException(Exception::TypeError(String::New(s.str().c_str()))); // try again to import from ESRI oSRS.Clear(); char **wkt_lines = NULL; wkt_lines = CSLTokenizeString2( wkt_char, " \t\n", CSLT_HONOURSTRINGS | CSLT_ALLOWEMPTYTOKENS ); if( oSRS.importFromESRI(wkt_lines) != OGRERR_NONE ) { error = true; oSRS.Clear(); //std::ostringstream s; //s << "b: OGR Error type #" << CPLE_AppDefined // << " problem occured importing assuming esri wkt " << wkt_string << ".\n"; //err = ThrowException(Exception::TypeError(String::New(s.str().c_str()))); } else { error = false; std::clog << "imported assuming esri format...\n"; result->Set(String::NewSymbol("esri"), Boolean::New(true)); } } else { error = false; if (wkt_string.substr(0,6) == "ESRI::") { result->Set(String::NewSymbol("esri"), Boolean::New(true)); } else { result->Set(String::NewSymbol("esri"), Boolean::New(false)); } } if (error) return err; char *srs_output = NULL; if( oSRS.Validate() == OGRERR_NONE) result->Set(String::NewSymbol("valid"), Boolean::New(true)); else if (oSRS.Validate() == OGRERR_UNSUPPORTED_SRS) result->Set(String::NewSymbol("valid"), Boolean::New(false)); else result->Set(String::NewSymbol("valid"), Boolean::New(false)); // TODO - trim output of proj4 result if (oSRS.exportToProj4( &srs_output ) != OGRERR_NONE ) { std::ostringstream s; s << "OGR Error type #" << CPLE_AppDefined << " problem occured when converting to proj4 format " << wkt_string << ".\n"; // for now let proj4 errors be non-fatal so that some info can be known... //std::clog << s.str(); //return ThrowException(Exception::TypeError(String::New(s.str().c_str()))); } else { // proj4 strings from osr have an uneeded trailing slash, so we trim it... result->Set(String::NewSymbol("proj4"), String::New(CPLString(srs_output).Trim())); } CPLFree( srs_output ); if (oSRS.AutoIdentifyEPSG() != OGRERR_NONE ) { /*std::ostringstream s; s << "OGR Error type #" << CPLE_AppDefined << " problem occured when attempting to auto identify epsg code " << wkt_string << ".\n"; std::clog << s.str(); */ //return ThrowException(Exception::TypeError(String::New(s.str().c_str()))); } if (oSRS.IsGeographic()) { result->Set(String::NewSymbol("is_geographic"), Boolean::New(true)); const char *code = oSRS.GetAuthorityCode("GEOGCS"); if (code) result->Set(String::NewSymbol("srid"), Integer::New(atoi(code))); const char *auth = oSRS.GetAuthorityName("GEOGCS"); if (auth) result->Set(String::NewSymbol("auth"), String::New(auth)); const char *name = oSRS.GetAttrValue("GEOGCS"); if (name) result->Set(String::NewSymbol("name"), String::New(name)); } else { result->Set(String::NewSymbol("is_geographic"), Boolean::New(false)); const char *code = oSRS.GetAuthorityCode("PROJCS"); if (code) result->Set(String::NewSymbol("srid"), Integer::New(atoi(code))); const char *auth = oSRS.GetAuthorityName("PROJCS"); if (auth) result->Set(String::NewSymbol("auth"), String::New(auth)); const char *name = oSRS.GetAttrValue("PROJCS"); if (name) result->Set(String::NewSymbol("name"), String::New(name)); } char *srs_output2 = NULL; if (oSRS.exportToPrettyWkt( &srs_output2 , 0) != OGRERR_NONE ) { // this does not yet actually return errors std::ostringstream s; s << "OGR Error type #" << CPLE_AppDefined << " problem occured when converting to pretty wkt format " << wkt_string << ".\n"; //std::clog << s.str(); //return ThrowException(Exception::TypeError(String::New(s.str().c_str()))); } else { result->Set(String::NewSymbol("pretty_wkt"), String::New(srs_output2)); } CPLFree( srs_output2 ); //OGRSpatialReference::DestroySpatialReference( &oSRS ); return scope.Close(result); } extern "C" { static void init (Handle target) { NODE_SET_METHOD(target, "_parse", parse); // versions of deps Local versions = Object::New(); versions->Set(String::NewSymbol("node"), String::New(NODE_VERSION+1)); versions->Set(String::NewSymbol("v8"), String::New(V8::GetVersion())); // ogr/osr ? target->Set(String::NewSymbol("versions"), versions); } NODE_MODULE(_srs, init); } node-srs-0.3.2/binding.gyp0000644000175000017500000000165712204545112013524 0ustar devdev{ 'includes': [ 'common.gypi' ], 'variables': { 'runtime_link%':'shared', }, 'targets': [ { 'target_name': '_srs', 'libraries' : ['", "contributors" : [], "licenses" : ["BSD"], "dependencies" : {}, "directories" : { "src" : "src" }, "engines": { "node": ">= 0.6.13" }, "scripts" : { "test" : "make test" } } node-srs-0.3.2/vcbuild.bat0000644000175000017500000000064512204545112013505 0ustar devdevset PROJ_LIB=C:\dev2\proj\nad set GDAL_DATA=C:\dev2\gdal\data del build.sln rd /q /s Default del lib\\_srs.node rd /q /s lib\\srs_data python gyp/gyp build.gyp --depth=. -f msvs -G msvs_version=2010 msbuild build.sln copy Default\\_srs.node lib\\_srs.node rem test! echo module.exports.static_osr = false; > lib\settings.js set NODE_PATH=lib node node_modules\mocha\bin\mocha rem node -e "console.log(require('mapnik'))"