diff --git a/dbf.js b/dbf.js index 5e69d47..afc294f 100644 --- a/dbf.js +++ b/dbf.js @@ -56,27 +56,63 @@ } var DBF = function(url, callback){ - var xhr = new XMLHttpRequest(); - - xhr.open("GET", url, false) - xhr.overrideMimeType("text/plain; charset=x-user-defined") - xhr.send() - - if(200 != xhr.status) - throw "Unable to load " + url + " status: " + xhr.status - - this.stream = new Gordon.Stream(xhr.responseText) - this.callback = callback - - this.readFileHeader() - this.readFieldDescriptions() - this.readRecords() - - this._postMessage() + if (!!url.lastModifiedDate) + this.handleFile(url, callback); + else + this.handleUri(url, callback); } DBF.prototype = { constructor: DBF, + handleFile: function(file, callback) { + this.callback = callback; + + if (!!window.FileReader) { + var reader = new FileReader(); + } else { + var reader = new FileReaderSync(); + } + + reader.onload = (function(that){ + return function(e){ + that.onFileLoad(e.target.result) + } + })(this); + + if (!!window.FileReader) { + reader.readAsBinaryString(file); + } else { + this.onFileLoad(reader.readAsBinaryString(file)); + } + }, + onFileLoad: function(data) { + this.stream = new Gordon.Stream(data) + + this.readFileHeader() + this.readFieldDescriptions() + this.readRecords() + + this._postMessage() + }, + handleUri: function(url, callback) { + var xhr = new XMLHttpRequest(); + + xhr.open("GET", url, false) + xhr.overrideMimeType("text/plain; charset=x-user-defined") + xhr.send() + + if(200 != xhr.status) + throw "Unable to load " + url + " status: " + xhr.status + + this.stream = new Gordon.Stream(xhr.responseText) + this.callback = callback + + this.readFileHeader() + this.readFieldDescriptions() + this.readRecords() + + this._postMessage() + }, _postMessage: function() { var data = { header: this.header, diff --git a/files.html b/files.html new file mode 100644 index 0000000..a393249 --- /dev/null +++ b/files.html @@ -0,0 +1,65 @@ + + +
+Pure client-side JavaScript (no server side code) parsing of shapefiles and dbase files to GeoJSON format displayed using OpenLayers.
+ +View project at http://github.com/wavded/js-shapefile-to-geojson.
+
+
+
+
+
+
+
+ .shp
+ .dbf
+
+
+
diff --git a/shapefile.js b/shapefile.js
index 7d8cb5f..6cfda94 100644
--- a/shapefile.js
+++ b/shapefile.js
@@ -11,6 +11,8 @@
if (!worker) {
var path = (o.jsRoot || "") + "shapefile.js"
var w = worker = this.worker = new Worker(path)
+ } else {
+ var w = worker
}
w.onmessage = function(e){
@@ -64,36 +66,79 @@
}
var Shapefile = function(o,callback){
- var xhr = new XMLHttpRequest(),
- that = this,
- o = typeof o == "string" ? {shp: o} : o
-
- xhr.open("GET", o.shp, false)
- xhr.overrideMimeType("text/plain; charset=x-user-defined")
- xhr.send()
-
- if(200 != xhr.status)
- throw "Unable to load " + o.shp + " status: " + xhr.status
-
- this.url = o.shp
- this.stream = new Gordon.Stream(xhr.responseText)
+ var o = typeof o == "string" ? {shp: o} : o
this.callback = callback
- this.readFileHeader()
- this.readRecords()
- this.formatIntoGeoJson()
-
- if(o.dbf) this.dbf = IN_WORKER ?
- null :
- new DBF(o.dbf,function(data){
- that.addDBFDataToGeoJSON(data)
- that._postMessage()
- })
- else this._postMessage()
+ if (!!o.shp.lastModifiedDate)
+ this.handleFile(o);
+ else
+ this.handleUri(o);
}
Shapefile.prototype = {
constructor: Shapefile,
+ handleUri: function(o) {
+ var xhr = new XMLHttpRequest(),
+ that = this
+
+ xhr.open("GET", o.shp, false)
+ xhr.overrideMimeType("text/plain; charset=x-user-defined")
+ xhr.send()
+
+ if(200 != xhr.status)
+ throw "Unable to load " + o.shp + " status: " + xhr.status
+
+ this.url = o.shp
+ this.stream = new Gordon.Stream(xhr.responseText)
+
+ this.readFileHeader()
+ this.readRecords()
+ this.formatIntoGeoJson()
+
+ if(o.dbf) this.dbf = IN_WORKER ?
+ null :
+ new DBF(o.dbf,function(data){
+ that.addDBFDataToGeoJSON(data)
+ that._postMessage()
+ })
+ else this._postMessage()
+
+ },
+ handleFile: function(o) {
+ this.options = o
+ if (!!window.FileReader) {
+ var reader = new FileReader();
+ } else {
+ var reader = new FileReaderSync();
+ }
+
+ reader.onload = (function(that){
+ return function(e){
+ that.onFileLoad(e.target.result)
+ }
+ })(this);
+
+ if (!!window.FileReader) {
+ reader.readAsBinaryString(o.shp);
+ } else {
+ this.onFileLoad(reader.readAsBinaryString(o.shp));
+ }
+ },
+ onFileLoad: function(data) {
+ this.stream = new Gordon.Stream(data)
+
+ this.readFileHeader()
+ this.readRecords()
+ this.formatIntoGeoJson()
+
+ if(this.options.dbf) this.dbf = IN_WORKER ?
+ null :
+ new DBF(this.options.dbf,function(data){
+ that.addDBFDataToGeoJSON(data)
+ that._postMessage()
+ })
+ else this._postMessage()
+ },
_postMessage: function() {
var data = {
header: this.header,