web-dev-qa-db-ja.com

Oracleのsdo_geometryから緯度と経度を取得する方法

オラクルのポイントからどのように緯度と経度を取得できますか?

このように:

MDSYS.SDO_GEOMETRY(2001,4326,NULL,
  MDSYS.SDO_ELEM_INFO_ARRAY(1,1,1),
  MDSYS.SDO_ORDINATE_ARRAY(51.702814,32.624736))
6

表示する表記は、単一の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.
14
Albert Godfrind

Sdo_util.getverticesを使用できます。 ドキュメント からの例

SELECT c.mkt_id, c.name, t.X, t.Y, t.id
   FROM cola_markets c,
   TABLE(SDO_UTIL.GETVERTICES(c.shape)) t
   ORDER BY c.mkt_id, t.id;
6
Rene

エイリアスを使用しない場合、これは機能しません。

0
carlosaar22

ジオメトリテーブルa、table(sdo_util.getvertices(a.geometry_column))tからa.id、t.x、t.yを選択します。ここでa.id = 1;

0
Parmanand