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

SQL Anywhere 12.0.1 » SQL Anywhere サーバー 空間データサポート » 空間データの使用 » チュートリアル:空間機能の実験

 

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

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

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 ) );

    ST_Geometry タイプの ST_Transform メソッドを参照してください。

  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 メソッドとは異なります)。

    DROP VARIABLE @Mass_01775;
    CREATE 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;

    ST_Geometry タイプの ST_Touches メソッドを参照してください。

  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] をクリックして、[トランケーションの長さ] に大きな値を設定します。クエリを再び実行してジオメトリを表示します。

    ST_Geometry タイプの ST_UnionAggr メソッドを参照してください。

  7. これで、「空間機能の実験」 チュートリアルは終了です。

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