地理参照座標系(SDO_SRID値)が入力ジオメトリに関連付けられている場合、測定を伴うジオメトリ・ファンクションを使用すると、オプションのunitパラメータを使用して、特定の距離または面積の測定単位を指定できます。unitパラメータは、SDO_SRID値がNULLであるジオメトリ(垂直デカルト・システム)には無効です。座標系のサポートについては、「座標系(空間参照システム)」を参照してください。
デフォルトの測定単位は、地理参照座標系に関連付けられた測定単位です。ほとんどの座標系の測定単位はmです。この場合、デフォルトの距離単位はmで、デフォルトの面積単位はm2です。ただし、unitパラメータを使用すると、アプリケーション・ユーザーにとってより有効な結果(レストランまでの距離のマイル表示など)をSpatialで自動的に換算し、戻すことができます。
unitパラメータは、文字列unit=およびSDO_UNITS_OF_MEASURE表(「SDO_UNITS_OF_MEASURE表」を参照)の有効なUNIT_OF_MEAS_NAME値を一重引用符で囲む必要があります。たとえば、次の例(「座標系変換の例」の例6-17のデータおよび定義を使用)に示す'unit=KM'は、測定単位としてkmを指定しています。
SELECT c.name, SDO_GEOM.SDO_LENGTH(c.shape, m.diminfo, 'unit=KM') FROM cola_markets_cs c, user_sdo_geom_metadata m WHERE m.table_name = 'COLA_MARKETS_CS' AND m.column_name = 'SHAPE';
Spatial and Graphでは、有効な単位名や、異なる単位間での比較や変換に使用する比率を決定するために、SDO_UNITS_OF_MEASURE表(「SDO_UNITS_OF_MEASURE表」を参照)内の情報が使用されます。また、次のレガシー・ビューを使用すると、メジャーの角度、面積および距離の単位を簡単に確認することもできます。
MDSYS.SDO_ANGLE_UNITS (「MDSYS.SDO_ANGLE_UNITSビュー」を参照)
MDSYS.SSDO_AREA_UNITS (「MDSYS.SDO_AREA_UNITSビュー」を参照)
MDSYS.SSDO_DIST_UNITS (「MDSYS.SDO_DIST_UNITSビュー」を参照)
Oracleから提供されている面積および距離の測定単位でニーズを十分に満たすことができない場合は、ユーザー定義の面積および距離の単位を作成できます。(ユーザー定義の角度の単位は作成できません。)ユーザー定義の測定単位を作成するには、DBAロールが付与されているユーザーとしてデータベースに接続し、SDO_UNITS_OF_MEASURE表に必要な単位ごとに1行挿入する必要があります(「SDO_UNITS_OF_MEASURE表」を参照)。
表2-14に、ユーザー定義の測定単位に対応する行を挿入する場合に使用するSDO_UNITS_OF_MEASURE表の列と、各列の要件および推奨値を示します。
表2-14 ユーザー定義の単位で使用するSDO_UNITS_OF_MEASURE表のエントリ
| 列名 | 説明 |
|---|---|
UOM_ID |
任意の測定単位ID番号で、Oracle提供の単位または別のユーザー定義の単位で現在使用されていないIDです。例: |
UNIT_OF_MEAS_NAME |
ユーザー定義の測定単位の名前を指定します。例: |
SHORT_NAME |
測定単位の短縮名を指定します(オプションの短縮名がある場合)。 |
UNIT_OF_MEAS_TYPE |
その単位が使用される測定の種類です。 |
TARGET_UOM_ID |
サポート用のオプションとして、面積単位の場合は |
FACTOR_B |
浮動小数点数として表現できる値の場合は、ユーザー定義の1単位と等しい平方m (面積単位の場合)の数値またはm (距離単位の場合)の数値を指定します。たとえば、標準の1mの半分として定義された単位の場合は、 単純な浮動小数点数として表現できない値の場合は、ユーザー定義の単位の1つと等しい平方mの数値(面積単位の場合)またはmの数値(距離単位の場合)を決定する式FACTOR_B/FACTOR_Cの被除数を指定します。 |
FACTOR_C |
浮動小数点数として表現できる値の場合は、1を指定します。 単純な浮動小数点数として表現できない値の場合は、ユーザー定義の単位の1つと等しい平方mの数値(面積単位の場合)またはmの数値(距離単位の場合)を決定する式FACTOR_B/FACTOR_Cの除数を指定します。 |
INFORMATION_SOURCE |
|
DATA_SOURCE |
単位を説明する短い文です。例: |
IS_LEGACY |
|
LEGACY_CODE |
(ユーザー定義の単位には使用しないでください。) |
例2-20では、HALF_METERという名前のユーザー定義の距離単位を作成し、作成した単位を問合せで使用して、指定した店舗の400,000半メートル(200km)以内に居住するすべての顧客を検索します。
例2-20 ユーザー定義の測定単位の作成および使用
-- Distance unit: HALF_METER
-- FACTOR_B specifies how many meters = one of this unit.
INSERT INTO MDSYS.SDO_UNITS_OF_MEASURE
(UOM_ID, UNIT_OF_MEAS_NAME, UNIT_OF_MEAS_TYPE, TARGET_UOM_ID,
FACTOR_B, FACTOR_C, INFORMATION_SOURCE, DATA_SOURCE, IS_LEGACY)
VALUES
(100001, 'HALF_METER', 'length', 100001,
.5, 1, 'User-defined half meter', 'USER_DEFINED', 'FALSE');
. . .
-- Find all the customers within 400,000 half-meters of store_id = 101
SELECT /*+ordered*/
c.customer_id,
c.first_name,
c.last_name
FROM stores s,
customers c
WHERE s.store_id = 101
AND sdo_within_distance (c.cust_geo_location,
s.store_geo_location,
'distance = 400000 unit = HALF_METER') = 'TRUE';
CUSTOMER_ID FIRST_NAME LAST_NAME
----------- ------------------------------ ------------------------------
1005 Carla Rodriguez
1004 Thomas Williams
1003 Marian Chang
1001 Alexandra Nichols