Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SAP Sybase SQL Anywhere 16.0 » SQL Anywhere サーバ 空間データサポート » 空間データ » チュートリアル:空間機能の実験

 

レッスン 6:空間データの投影

このレッスンでは、面積の計算と距離の測定ができるように、平面モデルを使用する空間参照系にデータを投影する方法を説明します。

前提条件

このレッスンは、受講者がこれまでのすべてのレッスンを終了していることを前提としています。レッスン 1:追加の測定単位と空間参照系のインストールを参照してください。

このレッスンでは、このチュートリアルの冒頭の「権限」セクションに一覧になっているロールおよび権限を持っていることを前提としています。 チュートリアル:空間機能の実験

内容と備考

Massdata の空間値は、ESRI シェイプファイルからデータベースにデータをロードするときに、SRID 4269 (NAD83 空間参照系) が割り当てられています。SRID 4269 は曲面の空間参照系です。ただし、ジオメトリの面積やいくつかの空間述部などの計算は、曲面モデルではサポートされません。現在、データが曲面空間参照系に関連付けられている場合、平面空間参照系に値を投影する新しい空間カラムを作成し、そのカラムに対して計算を実行できます。

 ♦ タスク
  1. 郵便番号区域を表す多角形の面積を測定するには、Massdata.geometry のデータを平面空間参照系に投影する必要があります。

    Massdata.geometry のデータを投影する適切な SRID を選択するには、Interactive SQL を使用して、次のように単語 Massachusetts を含む SRID を ST_SPATIAL_REFERENCE_SYSTEMS 統合ビューに問い合わせます。

    SELECT * FROM ST_SPATIAL_REFERENCE_SYSTEMS WHERE srs_name LIKE '%massachusetts%';

    これにより、Massachusetts のデータに使用するのに適したいくつかの SRID が返されます。このチュートリアルの用途には、SRID 「3586」 を使用します。

  2. 次に、ST_Transform メソッドを使用してジオメトリを SRID 3586 に投影するカラム Massdata.proj_geometry を作成する必要があります。削除するには、Interactive SQL で次の文を実行します。

    ALTER TABLE Massdata 
    ADD proj_geometry 
     AS ST_Geometry(SRID=3586)
     COMPUTE( geometry.ST_Transform( 3586 ) );
  3. Massdata.proj_geometry を使用して面積を計算できます。たとえば、Interactive SQL で次の文を実行します。

    SELECT zip, proj_geometry.ST_ToMultiPolygon().ST_Area('Statute Mile') AS area
    FROM Massdata
    ORDER BY area DESC;
    注意

    ST_Area は曲面空間参照系ではサポートされません。ST_Distance はサポートされますが、ポイントジオメトリ間のみです。

  4. 別の空間参照系への投影の影響を距離の計算で確認するには、次のクエリを使用し、曲面モデル (より正確) および投影された平面モデルを使用して、郵便番号区域の中心点間の距離を計算します。このデータでは両方のモデルがかなり一致します。これは、選択された投影がこのデータセットに適しているためです。

    SELECT M1.zip, M2.zip,
           M1.CenterPoint.ST_Distance( M2.CenterPoint, 'Statute Mile' ) dist_round_earth, 
           M1.CenterPoint.ST_Transform( 3586 ).ST_Distance( M2.CenterPoint.ST_Transform( 3586 ), 
           'Statute Mile' ) dist_flat_earth
    FROM Massdata M1, Massdata M2
    WHERE M1.ZIP = '01775'
    ORDER BY dist_round_earth DESC;
  5. 郵便番号区域 01775 に隣接する郵便番号区域を検索するとします。これを行うには、ST_Touches メソッドを使用します。ST_Touches メソッドは、ジオメトリを比較して、ジオメトリが別のジオメトリに重なり合わずに接触しているかどうかをチェックします。ST_Touches の結果には、郵便番号 01775 のローは含まれません (ST_Intersects メソッドとは異なります)。

    CREATE OR REPLACE VARIABLE @Mass_01775 ST_Geometry;
    SELECT geometry INTO @Mass_01775
    FROM Massdata
    WHERE ZIP = '01775';
    
    SELECT record_number, proj_geometry 
    FROM Massdata 
    WHERE proj_geometry.ST_Touches( @Mass_01775.ST_Transform( 3586 ) ) = 1;
  6. ST_UnionAggr メソッドを使用すると、郵便番号区域のグループの結合を表すジオメトリが返されます。たとえば、隣接する郵便番号区域の論理和 (ただし 01775 を含まない) を反映したジオメトリを表示するとします。

    Interactive SQL で、[ツール] » [空間ビューア] をクリックして、次のクエリを実行します。

    SELECT ST_Geometry::ST_UnionAggr(proj_geometry) 
    FROM Massdata
    WHERE proj_geometry.ST_Touches( @Mass_01775.ST_Transform( 3586 ) ) = 1;

    結果をダブルクリックして表示します。

    データベースから完全なカラムを読み込めないことを示すエラーを受け取った場合、Interactive SQL の [トランケーションの長さ] 設定の値を増やします。これを行うには、Interactive SQL で、[ツール] » [オプション] » [SQL Anywhere] をクリックして、[トランケーションの長さ] に大きな値を設定します。クエリを再び実行してジオメトリを表示します。

結果

これでチュートリアルは完了しました。

次の手順

サンプルデータベース (demo.db) を元の状態にリストアするには、サンプルデータベースの再作成 (demo.db)の手順に従ってください。

 参照