sql >> データベース >  >> RDS >> Oracle

Oracleのsdo_geometryからlatとlongを取得する方法

    表示する表記は、単一の2Dまたは3Dポイントを表すのに最適な表記ではありません。これらのポイントをエンコードする一般的で最も効率的な方法は次のとおりです。

    SDO_GEOMETRY(2001,4326,SDO_POINT_TYPE(51.702814,32.624736,NULL),NULL,NULL)
    

    私が見たすべてのGISツールは、この表記法を使用しています。あなたが示したものも有効です-それはただより多くのストレージを使用します。ただし、2つの表記法は完全に機能的に同等です。

    コンパクトな表記法を使用すると、個々の座標を取得するのは簡単です。たとえば、US_CITIESに上記のコンパクトな表記法にポイントが含まれていることを考えると:

    select c.city, c.location.sdo_point.x longitude, c.location.sdo_point.y latitude 
    from us_cities c where state_abrv='CO';
    
    CITY                                        LONGITUDE   LATITUDE
    ------------------------------------------ ---------- ----------
    Aurora                                     -104.72977  39.712267
    Lakewood                                   -105.11356    39.6952
    Denver                                     -104.87266  39.768035
    Colorado Springs                            -104.7599    38.8632
    
    4 rows selected.
    

    使用するより複雑な配列ベースの表記法から同じ結果を得るのは、より複雑です。 SDO_UTIL.GETVERTICESアプローチを使用できます。たとえば、US_CITIES_Aに同じポイントが含まれているが、配列ベースの表記法であると仮定します。

    select city, t.x longitude, t.y latitude
    from us_cities_a, table (sdo_util.getvertices(location)) t
    where state_abrv = 'CO';
    
    CITY                                        LONGITUDE   LATITUDE
    ------------------------------------------ ---------- ----------
    Aurora                                     -104.72977  39.712267
    Lakewood                                   -105.11356    39.6952
    Denver                                     -104.87266  39.768035
    Colorado Springs                            -104.7599    38.8632
    
    4 rows selected.
    

    私が実際に簡単だと思うもう1つのアプローチは、配列から値を抽出するためのいくつかの単純な関数を定義することです。

    create or replace function get_x (g sdo_geometry) return number is
    begin
      return g.sdo_ordinates(1);
    end;
    /
    

    および

    create or replace function get_y (g sdo_geometry) return number is
    begin
      return g.sdo_ordinates(2);
    end;
    /
    

    次に、関数を使用すると、構文が簡単になります。

    select city, get_x(location) longitude, get_y(location) latitude
    from us_cities_a
    where state_abrv = 'CO';
    
    CITY                                        LONGITUDE   LATITUDE
    ------------------------------------------ ---------- ----------
    Aurora                                     -104.72977  39.712267
    Lakewood                                   -105.11356    39.6952
    Denver                                     -104.87266  39.768035
    Colorado Springs                            -104.7599    38.8632
    
    4 rows selected.
    


    1. 自動インクリメントを使用したmysqlの2列の主キー

    2. SQL:すべての結合されたレコードが何らかの条件を満たすレコードを選択します

    3. 暗号化されたデータをPostgresに保存する

    4. MySQLの数値に先行ゼロを追加する方法