├── .browserslistrc ├── .eslintrc.js ├── .gitignore ├── .postcssrc.js ├── README.md ├── deploy.sh ├── docs ├── 200.html ├── css │ └── app.2772cfea.css ├── favicon.ico ├── index.html └── js │ ├── app.c766263a.js │ ├── app.c766263a.js.map │ ├── chunk-vendors.e6dfc605.js │ └── chunk-vendors.e6dfc605.js.map ├── package-lock.json ├── package.json ├── public ├── favicon.ico └── index.html ├── src ├── App.vue ├── components │ └── Guesser.vue └── main.js ├── vue.config.js └── yarn.lock /.browserslistrc: -------------------------------------------------------------------------------- 1 | > 1% 2 | last 2 versions 3 | not ie <= 8 -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | env: { 4 | node: true 5 | }, 6 | 'extends': [ 7 | 'plugin:vue/essential', 8 | 'eslint:recommended' 9 | ], 10 | rules: { 11 | 'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off', 12 | 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off' 13 | }, 14 | parserOptions: { 15 | parser: 'babel-eslint' 16 | } 17 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /dist 4 | 5 | # local env files 6 | .env.local 7 | .env.*.local 8 | 9 | # Log files 10 | npm-debug.log* 11 | yarn-debug.log* 12 | yarn-error.log* 13 | 14 | # Editor directories and files 15 | .idea 16 | .vscode 17 | *.suo 18 | *.ntvs* 19 | *.njsproj 20 | *.sln 21 | *.sw* 22 | -------------------------------------------------------------------------------- /.postcssrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | autoprefixer: {} 4 | } 5 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # what-the-proj 2 | 3 | https://stevage.github.io/WhatTheProj/ 4 | 5 | What do you do when you have a geospatial file and you don't know which projection it's in? Use *What the Proj*! 6 | 7 | 1. Enter one of the projected coordinates, as X and Y. 8 | 2. Enter the longitude and latitude that you think it might correspond to. (For instance, if you know all the data is related to Canberra, you could pick a long/lat in the middle of Canberra) 9 | 3. Click "Guess!" All known EPSG codes will be tried. The one that gives a result closest to your target will be shown. 10 | 11 | Don't have any actual data and just want to see it work? Try [test data](https://stevage.github.io/WhatTheProj/#test) 12 | 13 | ## Project setup 14 | ``` 15 | npm install 16 | ``` 17 | 18 | ### Compiles and hot-reloads for development 19 | ``` 20 | npm run serve 21 | ``` 22 | 23 | ### Compiles and minifies for production 24 | ``` 25 | npm run build 26 | ``` 27 | 28 | ### Lints and fixes files 29 | ``` 30 | npm run lint 31 | ``` 32 | -------------------------------------------------------------------------------- /deploy.sh: -------------------------------------------------------------------------------- 1 | mkdir -p docs 2 | rm -f docs/js/* 3 | rm -f docs/css/* 4 | 5 | npm run build 6 | cp -pr dist/* docs 7 | git add docs/* 8 | git commit -m "Rebuild" 9 | git push -------------------------------------------------------------------------------- /docs/200.html: -------------------------------------------------------------------------------- 1 | What the Proj?!
-------------------------------------------------------------------------------- /docs/css/app.2772cfea.css: -------------------------------------------------------------------------------- 1 | h3[data-v-9b916924]{margin:40px 0 0}a[data-v-9b916924]{color:#42b983}#guesser[data-v-9b916924]{font-family:Avenir,Helvetica,Arial,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-align:center;color:#2c3e50;font-size:16pt}#submit[data-v-9b916924]{padding:1em;cursor:pointer;font-size:20pt;width:10em;margin:1em auto;border:1px solid #42b983}#submit[data-v-9b916924]:hover{color:pink}#result .projection[data-v-9b916924]{font-size:40pt}#result .definition[data-v-9b916924]{font-family:Consolas,monaco,Courier New,Courier,monospace;color:maroon;padding:1em;text-align:center;letter-spacing:-1px}#other-results table[data-v-9b916924]{text-align:left;margin-left:auto;margin-right:auto;max-width:800px}#other-results .definition[data-v-9b916924]{color:maroon;font-size:7pt;font-family:Consolas,monaco,Courier New,Courier,monospace;letter-spacing:-1px}.preamble[data-v-9b916924]{font-size:12pt;color:grey}#app{font-family:Avenir,Helvetica,Arial,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-align:center;color:#2c3e50;margin-top:60px}button{margin:3em;padding:3em}#footer{margin-top:2em} -------------------------------------------------------------------------------- /docs/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevage/WhatTheProj/6d96c98d0b9f0d58e5a3ebebf1e23d18b19538f0/docs/favicon.ico -------------------------------------------------------------------------------- /docs/index.html: -------------------------------------------------------------------------------- 1 | What the Proj?!

What the proj?

Do you have a Shapefile with no projection information? A GeoJSON with no CRS?
WhatTheProj can help you guess the projection for a given point.

Someone gave me this projected coordinate:



Tip: try pasting a full X,Y string into the X box.

I think it should be somewhere near:


-------------------------------------------------------------------------------- /docs/js/app.c766263a.js: -------------------------------------------------------------------------------- 1 | (function(t){function e(e){for(var r,i,o=e[0],u=e[1],l=e[2],p=0,v=[];p!t.match(/urn:ogc:def:crs:EPSG/)),this.result?this.status="found":this.status="failed"},spatialRefLink(t=this.result.projection){const e=t.match(/^([^:]+):(.*)$/);if(e)return e[1].match(/epsg/i)?`https://epsg.io/${e[2]}`:`http://spatialreference.org/ref/${e[1].toLowerCase()}/${e[2]}/`}},mounted(){window.guesser=this},watch:{x(){const t=this.x.match(/([0-9.-]+)[^0-9-.]+([0-9.-]+)/);t&&(this.x=t[1],this.y=t[2])}}},p=c,v=(n("21a3"),n("2877")),d=Object(v["a"])(p,i,o,!1,null,"9b916924",null);d.options.__file="Guesser.vue";var h=d.exports;const f={name:"app",mounted(){window.app=this},components:{Guesser:h}};var m=f,_=m,g=(n("034f"),Object(v["a"])(_,a,s,!1,null,null,null));g.options.__file="App.vue";var b=g.exports;r["a"].config.productionTip=!1,window.v=new r["a"]({render:function(t){return t(b)}}).$mount("#app")},"64a9":function(t,e,n){},caf5:function(t,e,n){}}); 2 | //# sourceMappingURL=app.c766263a.js.map -------------------------------------------------------------------------------- /docs/js/app.c766263a.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/App.vue?7db8","webpack:///./src/components/Guesser.vue?b640","webpack:///./src/App.vue?4d4e","webpack:///./src/components/Guesser.vue?537a","webpack:///src/components/Guesser.vue","webpack:///./src/components/Guesser.vue?fc14","webpack:///./src/components/Guesser.vue?59a5","webpack:///src/App.vue","webpack:///./src/App.vue?8b55","webpack:///./src/App.vue?622c","webpack:///./src/main.js"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","installedChunks","push","Object","prototype","hasOwnProperty","call","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","depId","splice","__webpack_require__","s","installedModules","app","exports","module","l","m","c","d","name","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","p","jsonpArray","window","oldJsonpFunction","slice","_node_modules_mini_css_extract_plugin_dist_loader_js_ref_6_oneOf_1_0_node_modules_css_loader_index_js_ref_6_oneOf_1_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_6_oneOf_1_2_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_App_vue_vue_type_style_index_0_lang_css___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_ref_6_oneOf_1_0_node_modules_css_loader_index_js_ref_6_oneOf_1_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_6_oneOf_1_2_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_App_vue_vue_type_style_index_0_lang_css___WEBPACK_IMPORTED_MODULE_0___default","_node_modules_mini_css_extract_plugin_dist_loader_js_ref_6_oneOf_1_0_node_modules_css_loader_index_js_ref_6_oneOf_1_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_6_oneOf_1_2_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_Guesser_vue_vue_type_style_index_0_id_9b916924_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_ref_6_oneOf_1_0_node_modules_css_loader_index_js_ref_6_oneOf_1_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_6_oneOf_1_2_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_Guesser_vue_vue_type_style_index_0_id_9b916924_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_0___default","render","_vm","this","_h","$createElement","_c","_self","attrs","id","_m","staticRenderFns","_v","href","Guesservue_type_template_id_9b916924_scoped_true_lang_pug_render","directives","rawName","expression","type","domProps","on","change","input","$event","target","composing","x","y","staticStyle","color","font-size","lon","lat","click","guess","status","_e","staticClass","spatialRefLink","projection","_s","def","Math","round","distance","_l","results","Guesservue_type_template_id_9b916924_scoped_true_lang_pug_staticRenderFns","dev","location","hash","match","guessProjection","Guesservue_type_script_lang_js_","undefined","computed","[object Object]","methods","filter","parts","toLowerCase","guesser","watch","matches","components_Guesservue_type_script_lang_js_","component","componentNormalizer","options","__file","Guesser","components","Appvue_type_script_lang_js_","src_Appvue_type_script_lang_js_","App_component","App","vue_runtime_esm","config","productionTip","v","h","$mount"],"mappings":"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","file":"js/app.c766263a.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t\"app\": 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \tvar jsonpArray = window[\"webpackJsonp\"] = window[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// add entry module to deferred list\n \tdeferredModules.push([0,\"chunk-vendors\"]);\n \t// run deferred modules when ready\n \treturn checkDeferredModules();\n","import mod from \"-!../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../node_modules/css-loader/index.js??ref--6-oneOf-1-1!../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=style&index=0&lang=css&\"; export default mod; export * from \"-!../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../node_modules/css-loader/index.js??ref--6-oneOf-1-1!../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=style&index=0&lang=css&\"","import mod from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/index.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Guesser.vue?vue&type=style&index=0&id=9b916924&scoped=true&lang=css&\"; export default mod; export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/index.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Guesser.vue?vue&type=style&index=0&id=9b916924&scoped=true&lang=css&\"","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"app\"}},[_c('Guesser'),_vm._m(0)],1)}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"footer\"}},[_vm._v(\"\\n Built by Steve Bennett (\"),_c('a',{attrs:{\"href\":\"https://twitter.com/stevage1/\"}},[_vm._v(\"@Stevage1\")]),_vm._v(\")\\n \"),_c('br'),_c('a',{attrs:{\"href\":\"http://hire.stevebennett.me/\"}},[_vm._v(\"hire.stevebennett.me\")])])}]\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"guesser\"}},[_c('h1',[_vm._v(\"What the proj?\")]),_vm._m(0),_c('h4',[_vm._v(\"Someone gave me this projected coordinate:\")]),_c('label',[_vm._v(\"X:\")]),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.x),expression:\"x\"}],attrs:{\"type\":\"text\"},domProps:{\"value\":(_vm.x)},on:{\"change\":_vm.change,\"input\":function($event){if($event.target.composing){ return; }_vm.x=$event.target.value}}}),_c('br'),_c('label',[_vm._v(\"Y:\")]),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.y),expression:\"y\"}],attrs:{\"type\":\"text\"},domProps:{\"value\":(_vm.y)},on:{\"change\":_vm.change,\"input\":function($event){if($event.target.composing){ return; }_vm.y=$event.target.value}}}),_c('br'),_c('small',{staticStyle:{\"color\":\"grey\",\"font-size\":\"14px\"}},[_vm._v(\"Tip: try pasting a full X,Y string into the X box.\")]),_vm._m(1),_c('label',[_vm._v(\"Longitude:\")]),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.lon),expression:\"lon\"}],attrs:{\"type\":\"text\"},domProps:{\"value\":(_vm.lon)},on:{\"change\":_vm.change,\"input\":function($event){if($event.target.composing){ return; }_vm.lon=$event.target.value}}}),_c('br'),_c('label',[_vm._v(\"Latitude:\")]),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.lat),expression:\"lat\"}],attrs:{\"type\":\"text\"},domProps:{\"value\":(_vm.lat)},on:{\"change\":_vm.change,\"input\":function($event){if($event.target.composing){ return; }_vm.lat=$event.target.value}}}),_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.x && _vm.y && _vm.lon && _vm.lat),expression:\"x && y && lon && lat\"}],attrs:{\"id\":\"submit\"},on:{\"click\":_vm.guess}},[_c('a',{attrs:{\"href\":\"#\"}}),_c('b',[_vm._v(\"Guess!\")])]),(_vm.status === 'failed')?_c('div',{attrs:{\"id\":\"result\"}},[_vm._v(\"Oh dear. Couldn't find any projection that matched.\")]):_vm._e(),(_vm.status === 'thinking')?_c('div',{attrs:{\"id\":\"result\"}},[_vm._v(\"Thinking!\")]):_vm._e(),(_vm.status === 'found')?_c('div',{attrs:{\"id\":\"result\"}},[_vm._v(\"It might be...\"),_c('div',{staticClass:\"projection\"},[(_vm.spatialRefLink(_vm.result.projection))?_c('a',{attrs:{\"href\":_vm.spatialRefLink(_vm.result.projection),\"target\":\"_blank\"}},[_vm._v(_vm._s(_vm.result.projection))]):_c('span',[_vm._v(_vm._s(_vm.result.projection))])]),_c('div',{staticClass:\"definition\"},[_vm._v(_vm._s(_vm.result.def))]),_vm._v(\"That gives a result \"+_vm._s(Math.round(_vm.result.distance))+\"km from your target.\")]):_vm._e(),(_vm.status === 'found')?_c('div',{attrs:{\"id\":\"other-results\"}},[_vm._v(\"Or maybe:\"),_c('table',_vm._l((_vm.results.slice(1,10)),function(result){return _c('tr',[_c('td',{staticClass:\"projection\"},[(_vm.spatialRefLink(result.projection))?_c('a',{attrs:{\"href\":_vm.spatialRefLink(result.projection),\"target\":\"_blank\"}},[_vm._v(_vm._s(result.projection))]):_c('span',[_vm._v(_vm._s(result.projection))])]),_c('td',{staticClass:\"distance\"},[_vm._v(_vm._s(Math.round(result.distance))+\"km\")]),_c('td',{staticClass:\"definition\"},[_vm._v(_vm._s(result.def))])])}))]):_vm._e()])}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"preamble\"},[_vm._v(\"Do you have a Shapefile with no projection information? A GeoJSON with no CRS?\"),_c('br'),_vm._v(\" WhatTheProj can help you guess the projection for a given point.\")])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('h4',[_vm._v(\"I think it \"),_c('i',[_vm._v(\"should\")]),_vm._v(\" be somewhere near:\")])}]\n\nexport { render, staticRenderFns }","\n\n\n\n\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Guesser.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Guesser.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Guesser.vue?vue&type=template&id=9b916924&scoped=true&lang=pug&\"\nimport script from \"./Guesser.vue?vue&type=script&lang=js&\"\nexport * from \"./Guesser.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Guesser.vue?vue&type=style&index=0&id=9b916924&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"9b916924\",\n null\n \n)\n\ncomponent.options.__file = \"Guesser.vue\"\nexport default component.exports","\n\n\n\n\n","import mod from \"-!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./App.vue?vue&type=template&id=56512ac1&\"\nimport script from \"./App.vue?vue&type=script&lang=js&\"\nexport * from \"./App.vue?vue&type=script&lang=js&\"\nimport style0 from \"./App.vue?vue&type=style&index=0&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"App.vue\"\nexport default component.exports","import Vue from 'vue'\nimport App from './App.vue'\n\nVue.config.productionTip = false\n\nwindow.v = new Vue({\n render: function (h) { return h(App) },\n}).$mount('#app')\n"],"sourceRoot":""} -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "what-the-proj", 3 | "version": "0.1.0", 4 | "private": true, 5 | "scripts": { 6 | "start": "vue-cli-service serve", 7 | "serve": "vue-cli-service serve", 8 | "build": "vue-cli-service build", 9 | "deploy": "bash deploy.sh", 10 | "lint": "vue-cli-service lint", 11 | "postbuild": "react-snap" 12 | }, 13 | "dependencies": { 14 | "guess-projection": "^0.3.0", 15 | "pug": "^2.0.3", 16 | "pug-loader": "^2.4.0", 17 | "pug-plain-loader": "^1.0.0", 18 | "vue": "^2.5.17" 19 | }, 20 | "devDependencies": { 21 | "@vue/cli-plugin-eslint": "^3.1.2", 22 | "@vue/cli-service": "^3.1.2", 23 | "babel-eslint": "^10.0.1", 24 | "eslint": "^5.8.0", 25 | "eslint-plugin-vue": "^5.0.0-0", 26 | "react-snap": "^1.23.0", 27 | "vue-template-compiler": "^2.5.17" 28 | }, 29 | "reactSnap": { 30 | "source": "dist", 31 | "minifyHtml": { 32 | "collapseWhitespace": false, 33 | "removeComments": false 34 | } 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevage/WhatTheProj/6d96c98d0b9f0d58e5a3ebebf1e23d18b19538f0/public/favicon.ico -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | What the Proj?! 10 | 11 | 12 | 15 |
16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /src/App.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 24 | 25 | 44 | -------------------------------------------------------------------------------- /src/components/Guesser.vue: -------------------------------------------------------------------------------- 1 | 48 | 49 | 108 | 109 | 110 | 177 | -------------------------------------------------------------------------------- /src/main.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import App from './App.vue' 3 | 4 | Vue.config.productionTip = false 5 | 6 | window.v = new Vue({ 7 | render: function (h) { return h(App) }, 8 | }).$mount('#app') 9 | -------------------------------------------------------------------------------- /vue.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | baseUrl: '' 3 | } --------------------------------------------------------------------------------