2015年11月10日火曜日

GeoExt3-dev 7 - GeoExt.data.MapfishPrintProvider Example 2

7-2 JavaScript ファイルの作成
「basic-mapfish.js(7-geoext3.js)」は、マップを表示するための JavaScript ファイルです。

「7-geoext3.js」
Ext.require([
/** require( expressions, [fn], [scope] )
 * Loads all classes by the given names and all their 
 * direct dependencies; optionally executes the given 
 * callback function when finishes, within the optional 
 * scope.
 * 指定された名前とそのすべての直接依存によって、すべて
 * のクラスをロードします。任意の範囲内で、終了するとき
 * に任意で与えられたコールバック関数を実行します。
 * (GeoExt doc[w/ext])
 */
 'GeoExt.component.Map',
 /** GeoExt.component.Map
  * The map component and a panel side by side
  * map component(マップコンポーネント)とパネルの位置関
  * 係(並び)。
  * (GeoExt doc[w/ext])
  */
 'GeoExt.data.MapfishPrintProvider',
 /** GeoExt.data.MapfishPrintProvider
  * Provides an interface to a Mapfish or GeoServer print 
  * module.
  * MapfishまたはGeoServerプリントモジュールへのインタフェー
  * スを提供します。
  * (GeoExt doc[w/ext])
  */
 'GeoExt.data.serializer.TileWMS',
 /** GeoExt.data.serializer.TileWMS
  * A serializer for layer that hava a ol.source.TileWMS 
  * source.
  * ol.source.TileWMS ソースを持つレイヤのシリアライザ。
  * (GeoExt doc[w/ext])
  */
 'GeoExt.data.serializer.Vector'
 /** GeoExt.data.serializer.Vector
  * A serializer for layers that have a ol.source.Vector 
  * source.
  * This class is heavily inspired by the excellent ngeo 
  * Print service class: camptocamp/ngeo.
  * Additionally some utility methods were borrowed from 
  * the color class of the google/closure-library.
  * ol.source.Vector ソースを持つレイヤのためのシリアライザ。
  * このクラスは、優れた nego プリントサービスクラス
  * (camptocamp/nego)に大きく触発されています。
  * さらにいくつかのユーティリティメソッドは、Google/クロージャ
  * ライブラリのカラークラスから借用されました。
  * (GeoExt doc[w/ext])
  */
]);
var olMap,
 mapComponent,
 mapPanel;
Ext.application({
/** Ext.app.Application
 * Represents an Ext JS application, which is typically 
 * a single page app using a Viewport.
 * An application consists of one or more Views. The 
 * behavior of a View is managed by its corresponding 
 * ViewController and ViewModel.
 * Global activities are coordinated by Controllers 
 * which are ultimately instantiated by an instance 
 * of this (or a derived) class.
 * 通常、ビューポートを使用して1つのページの app である 
 * ExtJS アプリケーションを表します。
 * アプリケーションは、1つまたは複数の View で構成されて
 * います。View の動作は、その対応する ViewController 
 * と ViewModel によって管理されます。
 * グローバルな動作は、このインスタンス(または派生)
 * クラスで最終的にインスタンス化されている Controller 
 * によって調整されます。(GeoExt doc[w/ext])
 */
 name: 'MapPanel',
 /** name : String
  * The name of your application. This will also be the 
  * namespace for your views, controllers models and 
  * stores. Don't use spaces or special characters in 
  * the name. Application name is mandatory.
  * アプリケーションの名前。これはまた、views、controllers 
  * models と stores の名前空間になります。name には
  * スペースや特殊文字を使用しないでください。アプリケー
  * ション名は必須です。初期値は、''。
  * (GeoExt doc[w/ext])
  */
 launch: function(){
 /** launch( profile ) : Booleantemplate
  * Called automatically when the page has completely 
  * loaded. This is an empty function that should be 
  * overridden by each application that needs to take 
  * action on page load.
  * ページが完全にロードされたときに自動的に呼び出されます。
  * これは、ページのロード時にアクションを実行する必要があ
  * る各アプリケーションによって上書きされなければならない
  * 空の関数です。(GeoExt doc[w/ext])
  */
  var description;
  var extentLayer = new ol.layer.Vector({
  /** ol.layer.Vector
   * Vector data that is rendered client-side.
   * クライアント側で描画されたベクタデータ。(ol3 API)
   */
   source: new ol.source.Vector(),
   /** ol.source.Vector
    * Provides a source of features for vector layers.
    * ベクタレイヤのフィーチャのソースを用意します。(ol3 API)
    */
  });
  var vectorLayer = new ol.layer.Vector({
   source: new ol.source.Vector({
    // url: '../data/SanFranciscoPublicSchools-Points.kml',
    url: 'js/libs/geoext3-master/examples/data/SanFranciscoPublicSchools-Points.kml',
    format: new ol.format.KML(),
    /** ol.source.KML 
     * Static vector source in KML format
     * KML フォーマットの静的ベクタソース(0l3 API)
     */
    attributions: [new ol.Attribution({
    /** ol.Attribution
     * An attribution for a layer source.
     * レイヤソースの属性(ol3 API)
     */
     html: '<a href="https://data.sfgov.org/Geographic' +
      '-Locations-and-Boundaries/San-Francisco-Public' +
      '-Schools-Points/dpub-rukj">' +
      '© 2015 City and County of San Francisco' +
      '</a>' +
      ', (via data.sfgov.org)'
    })]
   })
  });
  var bgLayer = new ol.layer.Tile({
  /** ol.layer.Tile 
   * For layer sources that provide pre-rendered, tiled 
   * images in grids that are organized by zoom levels 
   * for specific resolutions. 
   * プリレンダリング(事前描画)を提供するレイヤソースの
   * ための、特定の解像度でのズームレベルによって編成され
   * ているグリッドのタイルイメージ。(ol3 API)
   */
   source: new ol.source.TileWMS({
   /** ol.source.TileWMS
    * Layer source for tile data from WMS servers.
    * WMS サーバからのタイルデータのレイヤソース。
    * (ol3 API)
    */
    url: 'http://ows.terrestris.de/osm-gray/service',
    params: {
     LAYERS: "OSM-WMS"
    }
   })
  });
  olMap = new ol.Map({
   layers: [
    bgLayer,
    vectorLayer,
    extentLayer
   ],
   view: new ol.View({
    center: ol.proj.fromLonLat( [-122.416667, 37.783333] ),
    /** ol.proj.fromLonLat(coordinate, opt_projection)
     * Transforms a coordinate from longitude/latitude to a 
     * different projection.
     * 緯度/経度座標から異なる投影に変換します。(ol3 API)
     */
    zoom: 12
   })
  });
  mapComponent = Ext.create('GeoExt.component.Map', {
  /** create( [name], [args] ) : Object
   * Instantiate a class by either full name, alias or 
   * alternate name.
   * If Ext.Loader is enabled and the class has not been 
   * defined yet, it will attempt to load the class via 
   * synchronous loading.
   * 完全な名前、別名または代替名のいずれかによってクラスを
   * インスタンス化します。
   * Ext.Loader が有効になっており、クラスがまだ定義されて
   * いない場合は、同期ロードを経由してクラスをロードしよう
   * とします。(GeoExt doc[w/ext)
   */
   map: olMap
  });
  mapPanel = Ext.create('Ext.panel.Panel', {
  /** Ext.panel.Panel
   * Panel is a container that has specific functionality 
   * and structural components that make it the perfect 
   * building block for application-oriented user interfaces.
   * Panels are, by virtue of their inheritance from 
   * Ext.container.Container, capable of being configured 
   * with a layout, and containing child Components.
   * パネルは、特定の機能とそれアプリケーション指向のユーザ
   * インターフェイスに最適なビルディングブロックにする構造
   * 的要素を持っているコンテナです。パネルは、
   * Ext.container.Container からの継承のおかげで、layout 
   * で構成し、子コンポーネントを含むことができます。
   * (GeoExt doc[w/ext])
   */
   title: 'GeoExt.data.model.print.Capability Example',
   /** title : String
    * The title text to be used to display in the Panel 
    * Header. Or a config object for a Panel Title.
    * Panel Header に表示するために使用される title テキ
    * スト。または Panel Title のための config オブジェ
    * クト。(GeoExt doc[w/ext)
    */
   region: 'center',
   /** region : "north"/"south"/"east"/"west"/"center"
    * Defines the region inside border layout.
    * ボーダレイアウトの内側の領域を定義します。
    * (GeoExt doc[w/ext)
    */
   layout: 'fit',
   /** layout : Ext.enums.Layout/Object
    * Important: In order for child items to be correctly 
    * sized and positioned, typically a layout manager must 
    * be specified through the layout configuration option.
    * The sizing and positioning of child items is the 
    * responsibility of the Container's layout manager 
    * which creates and manages the type of layout you have 
    * in mind. 
    * 重要:子アイテムが正しいサイズと配置されるためには、
    * 一般的にレイアウトマネージャは、layout configuration 
    * option(レイアウト設定オプション)を使用して指定する
    * 必要があります。
    * 子アイテムのサイズと位置は、レイアウトの種類を管理す
    * るContainer's layout manager(コンテナレイアウトマ
    * ネージャ)の役割です。
    * (GeoExt doc[w/ext)
    */
   items: [mapComponent]
   /** items : Object/Object[]
    * A single item, or an array of child Components to be 
    * added to this container
    * Unless configured with a layout, a Container simply 
    * renders child Components serially into its 
    * encapsulating element and performs no sizing or 
    * positioning upon them.
    * 単一の item(アイテム)、または子 Compornents(コン
    * ポーネント)の配列は、このコンテナに追加します。
    * layout(レイアウト)で構成されていない限り、Container
    * (コンテナ)は単に、子 Compornents(コンポーネント)
    * をそのカプセル化要素に直列にレンダリングし、それらに
    * サイズや位置調整も実行しません。
    * (GeoExt doc[w/ext)
    */
  });
  description = Ext.create('Ext.panel.Panel', {
   contentEl: 'description',
   /** contentEl : String
    * Specify an existing HTML element, or the id of an 
    * existing HTML element to use as the content for this 
    * component.
    * This config option is used to take an existing HTML 
    * element and place it in the layout element of a new 
    * component (it simply moves the specified DOM element 
    * after the Component is rendered to use as the content.
    * 既存のHTMLエレメントを指定するか、既存のHTMLエレメン
    * トの id は、このコンポーネントのコンテンツとして使用
    * します。
    * Component(コンポーネント)が 、content(コンテンツ)
    * として使用するためにレンダリングされた後に、この設定オ
    * プションは、既存のHTMLエレメントを取得し、新しい 
    * component(コンポーネント)の layout(レイアウト)エレ
    * メントでそれを配置するために使用されます(それは単に指定
    * された DOM エレメントを移動させます)。
    * (GeoExt doc[w/ext)
    */
   title: 'Description',
   region: 'east',
   width: 300,
   /** width : Number|String
    * The width of this component. A numeric value will be 
    * interpreted as the number of pixels; a string value 
    * will be treated as a CSS value with units.
    * このコンポーネントの幅。数値は、ピクセル数として解釈さ
    * れます。文字列値が単位で CSS 値として扱われます。
    * (GeoExt doc[w/ext)
    */
   border: false,
   /** border : Boolean
    * Specify as false to render the Panel with zero width 
    * borders.
    * Leaving the value as true uses the selected theme's 
    * $panel-border-width.
    * Defaults to false when using or extending Neptune.
    * Defaults to: true.
    * ゼロ幅の border(境界線)でパネルを描画するため false 
    * を指定します。
    * true として値を残すためには、選択されたテーマ 
    * $panel-border-width を使用します。
    * ネプチューン(Neptune Theme)を使用するか拡張すると
    * き、デフォルトは false です。
    * デフォルトは:true。
    * (GeoExt doc[w/ext)
    */
   bodyPadding: 5
   /** bodyPadding : Number/String
    * A shortcut for setting a padding style on the body 
    * element. The value can either be a number to be 
    * applied to all sides, or a normal css string 
    * describing padding.
    * bodyエレメントにパディングスタイルを設定するための
    * ショートカット。値は、すべての側面に適用される数字、
    * または通常のCSSの文字列記述パディングのいずれかにで
    * きます。
    * (GeoExt doc[w/ext)
    */
  });
  /**
   * Once the store is loaded, we can create the button with 
   * the following assumptions:
   * ストアがロードされると、私たちは以下の仮定を持つボタンを
   * 作成することができます。
   *
   *     * The button will print the first layout
   *     * ボタンは最初のレイアウトを印刷します。
   *     * The attributes used are the first of the above 
   *     * layout
   *     * 使用された属性は最初の上部のレイアウトです。
   *     * We'll request the first dpi value of the 
   *     * suggested ones
   *     * 提案された最初の dpi 値を要求します。
   */
  var onPrintProviderReady = function(provider) {
   // this is the assumption: take the first layout and 
   // render an appropriate extent on the map
   // これは仮定です:最初のレイアウトを取得し、地図上の適切な
   // 範囲をレンダリングします。
   var capabilities = provider.capabilityRec;
   /** capabilityRec : Objectreadonly
    * The capabiltyRec is an instance of 
    * 'GeoExt.data.model.print.Capability' and contains the 
    * PrintCapabilities of the Printprovider.
    * capabiltyRec は「GeoExt.data.model.print.Capability」
    * のインスタンスであり、Printprovider の PrintCapabilities
    * を含んでいます。
    * (GeoExt doc[w/ext)
    */
   var layout = capabilities.layouts().getAt(0);
   /** getAt( index ) : Object
    * Returns the item at the specified index.
    * 指定されたインデックスの item を返します。
    * (GeoExt doc[w/ext)
    */
   var attr = layout.attributes().getAt(0);
   /** attributes( attributes )
    * Formats an object of name value properties as HTML 
    * element attribute values suitable for using when 
    * creating textual markup.
    * テキストマークアップを作成する際に使用するのに適したHTML
    * 要素属性値として、名前値プロパティのオブジェクトをフォー
    * マとします。
    * (GeoExt doc[w/ext)
    */
   var clientInfo = attr.get('clientInfo');
   var render = GeoExt.data.MapfishPrintProvider.renderPrintExtent;
   /** renderPrintExtent(mapComponent, extentLayer, 
    * clientInfo) static
    * Renders the extent of the printout. Will ensure that 
    * the extent is always visible and that the ratio matches 
    * the ratio that clientInfo contains
    * 印刷の範囲を描画します。範囲が常に表示されていることを確認
    * し、比率が、CLIENTINFO を含んでいる割合と一致していること
    * になります。
    * (GeoExt doc[w/ext)
    */
   render(mapComponent, extentLayer, clientInfo);
   mapComponent.getView().on('propertychange', function(){
   /** getView( ) : ol.View
    * Returns the view of the map.
    * map の view を返します。
    * (GeoExt doc[w/ext)
    */
   /** on( eventName, [fn], [scope], [options], [order] ) : 
    * Object
    * The on method is shorthand for addListener.
    * Appends an event handler to this object. 
    * on メソッドは addListener の短縮形です。
    * このオブジェクトにイベントハンドラを追加します。
    * (GeoExt doc[w/ext)
    */
    extentLayer.getSource().clear();
    /** getSource()
     * Return the associated vectorsource of the layer.
     * レイヤの関連したベクタソースを返します。
     * (ol3 API)
     */
    /** clear(opt_fast)
     * Remove all features from the source.
     * ソースから据えてのフィーチャを削除します。
     * (ol3 API)
     */
    render(mapComponent, extentLayer, clientInfo);
   });
   description.add({
   /**add( component ) : Ext.Component[]/Ext.Component
    * Adds Component(s) to this Container.
    * このコンテナにコンポーネントを追加します。
    * (GeoExt doc[w/ext)
    */
    xtype: 'button',
    /** xtype
     * Every component has a specific xtype, which is its 
     * Ext-specific type name, along with methods for 
     * checking the xtype like getXType and isXType. See the 
     * [Component Guide][../../../core_concepts/
     * components.html] 
     * for more information on xtypes and the Component 
     * hierarchy.
     * すべてのコンポーネントは、getXType と isXType ような 
     * xtype をチェックするための方法に沿って、その Ext 特定
     * の type name である特定 xtype を持っています。xtypes 
     * の詳細とコンポーネント階層について[コンポーネントガイ
     * ド] [../../../ core_concepts/ components.html]を参
     * 照してください 。
     * (GeoExt doc[w/ext)
     */
    text: 'Print',
    handler: function(){
    /** handler : Function/String
     * A function called when the button is clicked (can be 
     * used instead of click event).
     * ボタンがクリックされたときに呼び出される関数。(代わ
     * りにクリックイベントを使用することができます)。
     * (GeoExt doc[w/ext)
     */
     var spec = {
      layout: layout.get('name'),
      attributes: {}
     };
     var firstFeature = extentLayer.getSource().getFeatures()[0];
     /** getFeatures()
      * Get all features on the source.
      * ソース上のすべてのフィーチャを取得します。
      * (ol3 API)
      */
     var bbox = firstFeature.getGeometry().getExtent();
     /** getGeometry()
      * Get the feature's default geometry. A feature may 
      * have any number of named geometries. The "default" 
      * geometry (the one that is rendered by default) is 
      * set when calling ol.Feature#setGeometry.
      * フィーチャのデフォルトのジオメトリを取得します。フィー
      * チャは、任意の数の指定のジオメトリのを有することができ
      * ます。 「デフォルト」のジオメトリ(デフォルトでレンダ
      * リングされるもの)が ol.Feature#setGeometry を呼び
      * 出すときに設定されています。(ol3 API)
      */
     /** getExtent()
      * Get the validity extent for this projection.
      * この投影の有効範囲を取得。(ol3 API)
      */
     var util = GeoExt.data.MapfishPrintProvider;
     var mapView = mapComponent.getView();
     var serializedLayers = util.getSerializedLayers(
     /** getSerializedLayers( )static
      * Will return an array of serialized layers for 
      * mapfish print servlet v3.0.
      * mapfish印刷サーブレットv3.0のためにシリアライズされた
      * レイヤの配列を返します。
      * (GeoExt doc[w/ext)
      */
      mapComponent,
      function(layer) {
       // do not print the extent layer
       // エクステントレイヤを印刷しません。
       var isExtentLayer = (extentLayer === layer);
       return !isExtentLayer;
      }
     );
     serializedLayers.reverse();
     /** Array.prototype.reverse()
      * 配列の要素を反転させます。最初の要素は最後に、最後の要
      * 素は最初になります。
      * (MDN[https://developer.mozilla.org/ja/docs/Web/
      * JavaScript/Reference/Global_Objects/Array/reverse])
      */
     spec.attributes[attr.get('name')] = {
      bbox: bbox,
      dpi: clientInfo.dpiSuggestions[0],
      layers: serializedLayers,
      projection: mapView.getProjection().getCode(),
      /** getProjection()
       * Get the view projection.
       * View の投影を取得します。(ol3 API)
       */
      /** getCode()
       * Get the code for this projection, e.g. 'EPSG:4326'.
       * この投影のコード(例えば EPSG:4326)を取得します。
       * (ol3 API)
       */
      rotation: mapView.getRotation()
      /** getRotation()
       * view の回転角度を取得します。(ol3 API)
       */
     };
     Ext.create('Ext.form.Panel', {
     /** Ext.form.Panel
      * FormPanel provides a standard container for forms. 
      * It is essentially a standard Ext.panel.Panel which 
      * automatically creates a BasicForm for managing any 
      * Ext.form.field.Field objects that are added as 
      * descendants of the panel. It also includes 
      * conveniences for configuring and working with the 
      * BasicForm and the collection of Fields.
      * FormPanel は、フォームのための標準的なコンテナを提供し
      * ます。それは本質的に、自動的にパネルの子孫として追加さ
      * れているすべての Ext.form.field.Field オブジェクトを
      * 管理するための BasicForm を作成する標準 
      * Ext.panel.Panel です。また、設定と BasicForm と
      * フィールドのコレクションを操作するための便利さを備えて
      * います。(GeoExt doc[w/ext)
      */
      standardSubmit: true,
      /** standardSubmit : Boolean
       * If set to true, a standard HTML form submit is used 
       * instead of a XHR (Ajax) style form submission. All 
       * of the field values, plus any additional params 
       * configured via baseParams and/or the options to 
       * submit, will be included in the values submitted 
       * in the form.
       * trueに設定すると、XHR(アヤックス)スタイルのフォー
       * ムの送信の替わりに、標準の HTML 形式送信が使用されま
       * す。すべてのフィールド値、プラス baseParams 経由を設
       * 定された任意の追加のparams および/または送信オプショ
       * ン、がフォームに送信された値に含まれます。
       * (GeoExt doc[w/ext)
       */
      url: 'http://webmapcenter.de/print-servlet-3.1.2/' +
       'print/geoext/buildreport.pdf',
      /** url : String
       * The URL to use for form actions if one isn't 
       * supplied in the doAction options.
       * doAction オプションで提供されないなら、フォームアクショ
       * ンに使用する URL。
       * (GeoExt doc[w/ext)
       */
      method: 'POST',
      /** method : String
       * The request method to use (GET or POST) for form 
       * actions if one isn't supplied in the action options.
       * action オプションで提供されないなら、フォームアクショ
       * ンに(GET or POST を)使用するリクエストメソッド。
       * (GeoExt doc[w/ext)
       */
      items: [
       {
        xtype: 'textfield',
        name: 'spec',
        value: Ext.encode(spec)
        /** value : String/Number
         * The value of this button. Only applicable when 
         * used as an item of a Segmented Button.
         * このボタンの値。セグメント化されたボタンの item と
         * して使用したときだけ適用。
         * (GeoExt doc[w/ext)
         */
        /** encode( o ) : String
         * Shorthand for Ext.JSON.encode
         * Ext.JSON.encode の短縮形。
         * (GeoExt doc[w/ext)
         */
       }
      ]
     }).submit();
     /** submit( options )
      * This is a proxy for the underlying BasicForm's 
      * Ext.form.Basic.submit call.
      * これは、基礎となるBasicFormの Ext.form.Basic.submit
      * 呼び出しのプロキシです。
      * (GeoExt doc[w/ext)
      */
    }
   });
  };
  Ext.create('GeoExt.data.MapfishPrintProvider', {
   url: "http://webmapcenter.de/print-servlet-3.1.2/" +
    "print/geoext/capabilities.json",
   listeners: {
    ready: onPrintProviderReady
    /** ready( provider, eOpts )
     * Fires after the PrintCapability store is loaded.
     * PrintCapability ストアがロードされた後、起動します。
     * (GeoExt doc[w/ext)
     */
   }
  });
  Ext.create('Ext.Viewport', {
  /** Ext.Viewport (Ext.container.Viewport)
   * A specialized container representing the viewable 
   * application area (the browser viewport).
   * The Viewport renders itself to the document body, 
   * and automatically sizes itself to the size of the 
   * browser viewport and manages window resizing. There 
   * may only be one Viewport created in a page.
   * 表示可能なアプリケーション領域(ブラウザのビューポート)
   * を表す特殊なコンテナ。
   * Viewport は、document body にそれ自身をレンダリングし、
   * 自動的に自身のサイズをブラウザのビューポートのサイズにし、
   * ウィンドウのサイズ変更を管理します。1ページに作成した
   * ビューポートは一つだけ設定できます。
   * (GeoExt doc[w/ext])
   */
   layout: "border",
   items: [
    mapPanel,
    description
   ]
  });
 }
});

0 件のコメント: