function Shapefile(){} Shapefile.tNull=0; Shapefile.tPoint=1; Shapefile.tLine=3; Shapefile.tPolygon=5; Shapefile.create=function(shapeType){ var m=new Shapefile(); m.shapeType=shapeType; // Write file header: m.mf=new MemoryFile(100,true); m.mf.writeInt32(9994); // file code m.mf.seek(24);m.mf.writeInt32(50); // file lenght m.mf.setByteOrderBig(false); m.mf.writeInt32(1000); // version m.mf.writeInt32(shapeType); // shape type m.mf.setSize(100); m.extent=new KExtent(); m.recordCount=-1; return m; }; Shapefile.open=function(buffer){ var m=new Shapefile(); if(buffer instanceof MemoryFile){ m.mf=buffer; m.mf.setByteOrderBig(true); }else m.mf=new MemoryFile(buffer,true); // Read file header: if(m.mf.readInt32()!=9994) throw "Not a shapefile"; m.mf.seek(28); m.mf.setByteOrderBig(false); if(m.mf.readInt32()!=1000) throw "Unknown shapefile version"; // TODO (shapefile.js) better exception for unsupported shape types! var type = m.mf.readInt32(); switch(type){ case 1:m.shapeType=Shapefile.tPoint;break; case 3:m.shapeType=Shapefile.tLine;break; case 5:m.shapeType=Shapefile.tPolygon;break; default: const types={0:"Null Shape",1:"Point",3:"PolyLine",5:"Polygon",8:"MultiPoint",11:"PointZ",13:"PolyLineZ", 15:"PolygonZ",18:"MultiPointZ",21:"PointM",23:"PolyLineM",25:"PolygonM",28:"MultiPointM",31:"MultiPatch"}; throw "Unsupported shape type "+types[type]; } m.recordCount=-1; m.extent=new KExtent(); if(m.mf.size>100){ m.extent.xmin=m.mf.readFloat64(); m.extent.ymin=m.mf.readFloat64(); m.extent.xmax=m.mf.readFloat64(); m.extent.ymax=m.mf.readFloat64(); } m.mf.seek(100); return m; }; Shapefile.prototype.eof=function(){ return this.mf.eof(); }; Shapefile.prototype.get=function(){ var m=this,shape=null,a,b,x,y; m.mf.skip(4); m.mf.setByteOrderBig(true); var length=m.mf.readInt32(); if(length>0){ var mf=new MemoryFile(m.mf.readRaw(length*2),false); var type=mf.readInt32(); switch(type){ case 0: shape=new KShape(KShape.stNull); break; case 1: x=mf.readFloat64(); y=mf.readFloat64(); shape=new KShape(KShape.stPoint); var line=new KLine(); line.points.push(new KPoint(x,y)); shape.lines.push(line); break; case 3:case 5: shape=new KShape(type==3?KShape.stLine:KShape.stPolygon); mf.skip(32); // extent var numParts=mf.readInt32(); var totalPoints=mf.readInt32(); var parts=[]; for(a=0;a