all files / src/ Worker.ts

11.59% Statements 8/69
10% Branches 2/20
33.33% Functions 2/6
10.29% Lines 7/68
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170                                                                                                                                                                                                                                                                                                                                     
 
namespace jisX0410
{
  export interface IMessage
  {
    operation: "point" | "extent";
 
    format: "GeoJSON" | "esriJSON" | "shapefile";
 
    shape:  [number,number] |  IExtent;
 
    schemaLabel: string;
 
    maxSchemaLabel: string;
  }//end interface
 
  export interface IJSONResult
  {
    features: ArrayBuffer;//Array<IGeoJsonFeature | IEsriJsonFeature>;
  }
 
  export interface IShpResult
  {
    shp: ArrayBuffer;
    shx: ArrayBuffer;
    dbf: ArrayBuffer;
    prj: string;
  }//end interface
 
  /** メッシュ作成用ワーカ */
  export class MeshWorker{
    
    /** ワーカの保持 */
    private _worker:Worker;
 
    /** コールバック処理の辞書 */
    private _callbacks: { [index:number]: (msg: IJSONResult | IShpResult ) => void } = {};
 
    /**
     * コンストラクタ
     * @param url Worker.jsのURL
     */
    constructor(url:string){
 
      let worker = new Worker(url); 
      //メッセージイベントをセット
      worker.addEventListener('message', this._onMessage.bind(this), false);
      this._worker = worker;
      
    }//end method
 
   /**
    * ワーカの処理実行
    * @param msg 処理命令 
    * @param callback 処理完了時の実行 
    */
   public postMessage(msg: IMessage, callback: (msg: IJSONResult | IShpResult ) => void){
 
    (<any>msg)._system = Date.now();
    this._callbacks[(<any>msg)._system] = callback;
    
    this._worker.postMessage( msg );
   }//end method
 
   /**
    * ワーカからのメッセージ返却時
    * @param event イベント
    */
   private _onMessage( event:MessageEvent ): void{
    
    let result = event.data;
 
    let callback = this._callbacks[(<any>result)._system];
    delete this._callbacks[(<any>result)._system];
    
    callback(result);
 
   }//end method
    
  }//end class
}//end namespace
 
 
//ブラウザ上でなければWebWorkerとして動作する準備をする
Iif (typeof addEventListener !== 'undefined') {
  
  addEventListener('message', (event) => {
    //event.data
    //let message = <jisX0410.IMessage> JSON.parse(event.data);
    let message = <jisX0410.IMessage> event.data;
    let MeshUtil  = new jisX0410.MeshUtil();
    let schema: jisX0410.MeshSchema;
    let maxSchema: jisX0410.MeshSchema;
 
    //シリアル化のため既定のスキーマ以外は現状受け取り不可
    for (let i=0; i<MeshUtil.meshSchemes.length; i++){
 
      if (message.schemaLabel === MeshUtil.meshSchemes[i].label){
        schema = MeshUtil.meshSchemes[i];
      }//end if
      if (message.maxSchemaLabel && 
          message.maxSchemaLabel === MeshUtil.meshSchemes[i].label){
        maxSchema = MeshUtil.meshSchemes[i];
      }
 
    }//end loop
 
    if (message.operation === "point"){
      let latlon = <[number,number]>message.shape;
      
      switch(message.format)
      {
        case "GeoJSON":
          let geofeatures = MeshUtil.createGeoJSON(latlon, schema, maxSchema);
          let geobuffer = MeshUtil.geoJsonToStringBuffer(geofeatures);
          (<any>message).features = geobuffer
          postMessage( message, [geobuffer] );
          //postMessage( JSON.stringify(message) );
        break;
        case "esriJSON":
          let esrifeatures = MeshUtil.createEsriJSON(latlon,schema, maxSchema);
          let esribuffer = MeshUtil.esriJsonToStringBuffer(esrifeatures);
          (<any>message).features = esribuffer
          postMessage( message, [esribuffer] );
          //postMessage( JSON.stringify(message) );
        break;
        case "shapefile":
          let shp = MeshUtil.createShp(latlon, schema, maxSchema);
          (<any>message).prj = shp.prj;
          (<any>message).shp = shp.shp;
          (<any>message).shx = shp.shx;
          (<any>message).dbf = shp.dbf;
          postMessage(message, [shp.shp,shp.shx,shp.dbf]);
          //postMessage(JSON.stringify(message), [shp.shp,shp.shx,shp.dbf]);
        break;
      }//end switch 
    } else if (message.operation === "extent") {
      let extent = <jisX0410.IExtent>message.shape;
      switch(message.format)
      {
        case "GeoJSON":
          let geofeatures = MeshUtil.createGeoJsonFromExtent(extent, schema);
          let geobuffer = MeshUtil.geoJsonToStringBuffer(geofeatures);
          (<any>message).features = geobuffer;
          postMessage( message, [geobuffer]);
          //postMessage( JSON.stringify(message) );
        break;
        case "esriJSON":
          let esrifeatures = MeshUtil.createEsriJsonFromExtent(extent, schema);
          let esribuffer = MeshUtil.esriJsonToStringBuffer(esrifeatures);
          (<any>message).features = esribuffer;
          postMessage( message, [esribuffer]);
          //postMessage( JSON.stringify(message) );
        break;
        case "shapefile":
          let shp = MeshUtil.createShpFromExtent(extent, schema);
          (<any>message).prj = shp.prj;
          (<any>message).shp = shp.shp;
          (<any>message).shx = shp.shx;
          (<any>message).dbf = shp.dbf;
          postMessage(message, [shp.shp,shp.shx,shp.dbf]);
          //postMessage( JSON.stringify(message), [shp.shp,shp.shx,shp.dbf]);
        break;
      }//end switch 
    }//end if
    
    //postMessage("");    
  }, false);
}