地理空間データのデータモデルの記述には、UML(Unified Modeling Language:統一モデリング言語)の図の1つであるUMLクラス図を使用します。
UMLクラス図は、システムに存在する「モノ」が性質として持っている構造(クラス)と、それらの関係を表現する図の記法です。この記法は「モノ」の性質や「モノ同士の関係」を表現できる点で、地理空間データのデータモデルの基本的な要素である「地物」の捉え方と合っていたことから、地理空間データのデータモデルの記法として採用されています。
UMLクラス図では、「モノ」とその性質を箱で表現し、「モノ同士の関係」は箱をつなぐ線で表現します。
例えば、以下のUMLクラス図(図2-1)には、建物や出入口などを含むデータモデルが示されています。
図 2‑1 UMLクラス図の例
UMLクラス図の記法は、以降の節で紹介しますが、このUMLクラス図を見ると、このデータモデルに従って作成された地理空間データは以下のようになると想像できると思います。
l 地物として、建物、道路、地下街及び出入口が含まれている
l 建物には名前、完成年そして階数の情報が含まれている
l 建物と地下街、建物と出入口及び出入口と道路には関係がある
このように、UMLクラス図は、地理空間データにどんな地物が含まれているのか、その地物にはどんな属性や関係があるのかを視覚的にわかりやすく示すことができます。
ポイント: UMLクラス図は、箱と箱をつなぐ線を使って、地物の構造を視覚的にわかりやすく示すことができます。
クラスは、「共通の性質を持つオブジェクト(もの)を表す概念」であり、データの構造に相当します。
例えば、「屋根及び周壁又はこれに類するものを有し、土地に定着した建造物であって、その目的として用途に供し得る状態にある」という共通の性質を持つものを、「建物」というクラスで表現できます。また、「地表面に落下した雨や雪などの天水が集まり、 海や湖などに注ぐ流れの筋」という共通の性質を持つものを「河川」というクラスで表現できます。
クラスは、3段の箱から構成します。
l 1段目の箱:「ステレオタイプ」と「クラス名」を記述します。
Ø ステレオタイプ:クラスの種類を指します。
Ø クラス名:他のクラスと区別するための名前になります。
l 2段目の箱:クラスが持つ「属性」を記述します。属性の記述は、次項で説明します。
l 3段目の箱:データモデルの記述では使用しません。
クラス名は、自由につけることができますが、クラスを識別できなければならないため、データモデルの中ではユニーク(重複してはならない)でなければなりません。
図2-2に示す例では、「建物」というクラスが定義されています。
図 2‑2 クラスの例
「建物」クラスには、ステレオタイプ(2.7節参照)として「FeatureType」が付与されています。「FeatureType」は、そのクラスが「地物」であることを示します。「建物」クラスには、名前、完成年及び階数という3種類の属性が定義されています。
ポイント: クラスは、1段目にステレオタイプとクラス名、2段目にクラスの属性を記述します。
クラスの2段目の箱には、クラスが持つ属性を記述します。属性とは、そのクラスの性質のことです。
属性は、属性名、属性の型及び属性の多重度から構成されます。
l 属性名:そのクラスが持つ他の属性と区別するための名前
l 属性の型:その属性がとる値の種類
l 属性の多重度:その属性を記述することができる回数
属性名は、そのクラスの中では他の属性名と重複してはならず、ユニークでなければなりません。
属性の型には、例えば文字列(xs:string)や整数(xs:integer)といった基本的な型を使用できるほか、他のクラスを属性の型として使用できます。属性の型の詳細は、2.4節で説明します。
また、属性の多重度は、その属性を記述できる回数です。例えば、建物の名前として、不動産登記された正式な名称と利用者が使用する呼称が異なっていたとします。もし「建物名」という属性を1回しか記述できないと、どちらかを選択しなければなりません。このような場合に、属性の多重度として、「建物名」を2回記述できると、正式な名称と呼称の両方を記述することができます。
属性の多重度は、特定の回数又は範囲を指定できます。記述できる回数を指定する場合は、[m]、記述できる回数を範囲で指定する場合は[m..n]のように指定します。このとき、mやnはm<nとなる任意の整数となります。[m]は、必ずm回その属性を記述できることを意味します。また、[m..n]はその属性を記述可能な回数の範囲を示します。このとき、最小m回、最大n回を意味します。ただし、多重度の記述が省略された場合、[1](必ず1回記述する)を意味します。多重度の詳細は、2.9節で説明します。
図2-3に示す例では、「建物」というクラスには、名前、完成年及び階数という3種類の属性が定義されています。
図 2‑3 属性の記述
属性「名前」は値を文字列(属性の型がxs:string)で必ず1回(多重度が省略されているため、[1]の意味となる)記述することになります。
属性「完成年」は値を西暦年(属性の型がxs:gYear)で記述します。多重度は[0..1]です。最小0回最大1回という意味ですので、完成年は省略(最小0回)してもかまいません。完成年を記述する場合は1回のみとなります。
属性「階数」は値を「階数型」で記述します。この階数型ですが、2.1節で例示したUMLクラス図(図 2‑1)には「階数型」というクラスがあります。この、属性「階数」の属性の型である「階数型」とは、クラスとして定義された「階数型」を指しています。このように、属性の型には、他のクラスを指定することができます。この例の場合、「階数型」は属性として「地上階数」と「地下階数」の2種類の属性が定義されていますので、結果として、「建物」クラスの属性「階数」は、「階数型」というクラスを通して、「地上階数」と「地下階数」の2種類の属性を持つことをUMLクラス図で示しています。属性「階数」の多重度は[0..1]ですので、「完成年」と同様に、1回記述できる省略可能な属性であることを意味します。
ポイント: クラスの属性は、属性名、属性の型及び属性の多重度を記述します。
属性の型には、文字列などの基本的な型や他で定義したクラスを指定することができます。
基本的な型とは、属性の値として、文字列や数値といった単純な値を記述する型です。これらの基本的な型は、標準として用意されているものを指定します。よく使う基本的な型には以下のような型があります(表2-1)。
表 2‑1 基本的な型の例
xs:stringは文字列です。xs:integerは整数です。xs:integerは、正の整数と負の整数のいずれも含みます。xs:positiveIntegerは、正の整数のみです。xs:doubleは浮動小数点数です。xs:dateは年月日で表現する日付です。xs:booleanは真偽値であり、真(true又は1)か偽(false又は0)のいずれかを値としてとります。
gml:CodeTypeは、コード(事前に定義された文字列)を値として記述する属性の型です。コードとその説明を対応付けたリスト(コードリスト)に含まれるコードを値としてとることが基本となります。このとき、どのコードリストに定義されたコードであるかを指定する必要があります。また、もしコードリストに適切なコードがない場合は、文字列で記述することもできます(図2-4)。
図 2‑4 コードリストの例
gml:MeasureTypeは、面積や速度といった計測値を単位と共に記述できる型です。gml:LengthTypeは、上述したgml:MeasureTypeの一種で、計測値の種類が長さの場合にのみ使用される型です。
ポイント: 文字列や数値といった属性の基本的な型は、標準で用意されているものを指定します。
属性の型を新たに定義することもできます。具体的には、新しいクラスを定義し、このクラスを属性の型として指定します。このとき、新しいクラスに複数の属性を定義することで、これらを1つのかたまりとして扱うことができるようになります。
例えば、建物の階数として、地上階数と地下階数のそれぞれを分けて把握したいとします。この場合、新たに「階数型」というクラスを作成し、この「階数型」に「地上階数」と「地下階数」という属性を定義します。「建物」クラスの属性「階数」の型として、「階数型」を指定します。これにより、建物の「階数」として、「地上階数」と「地下階数」をそれぞれ記述できるようになります。以下に、UMLクラス図を示します(図2-5)。
図 2‑5 独自の型とその利用例
「建物」クラスには属性として「名前」、「完成年」及び「階数」が定義されています。「名前」は文字列、「完成年」は西暦年、「階数」は「階数型」です。「名前」は必須ですが、「完成年」と「階数」は省略可能です。
「階数」の型である「階数型」には、「地上階数」と「地下階数」が属性として定義されています。いずれも整数です。この「地上階数」と「地下階数」はいずれも必須です。つまり「階数」は省略可能ですが、もし「階数」を記述する場合、「地上階数」と「地下階数」をいずれも記述しなければなりません(図2-6)。
図 2‑6 建物クラスのデータ構造イメージ
ではUMLクラス図に従って作成した「建物」データの例を見てみましょう。表2-2は4棟の建物のデータをUMLクラス図に従って記述したものです。
表 2‑2 「建物」データの例
「名前」は必須ですので、4棟のデータの全てに名前が記述されています。一方、「完成年」及び「階数」は記述されている場合と省略されている場合があります。「階数」が記述されている場合は、必ず、「地上階数」と「地下階数」の両方が記述されています。例えば「中央合同庁舎第3号館」という名前の建物には、「階数」として「地上階数」は11、「地下階数」は2という値が記述されています。
ポイント: 新しいクラスを定義し、属性の型として指定することで、複数のデータを1つにまとめて記述できるようになります。
「関連」とは、クラスとクラスの対応関係です。「関連」は、クラスとクラスを実線でつなぎます。
「関連」には名前を付けることができます。関連付けられたクラスは相手のクラスに対する役割を持ちます。この役割は名前を持ちます。これを「関連役割名」と呼びます。また、役割は多重度を持ちます。多重度は、この関連におけるクラスとクラスの対応付けにおいて、相手のクラスがいくつ対応付くかを示します。さらに「関連」は向きを指定することができます。
以下の例では、「出入口」クラスと「道路」クラスに関連を定義しています(図2-7)。
図 2‑7 関連の記述
この関連は、「出入り」という名前を持っており、建物の「出入口」と、出入口から出ることのできる「道路」を対応付けています。出入口に対して、道路は「つながる道路」という役割を持ちます。
建物の出入口は道路につながっている場合や、地下階の出入口のように道路とつながっていない場合があります。つまり、出入口があった場合、つながる道路がある場合とない場合があります。そこで、多重度は、[0..1]としています。出入口に対し、つながる道路がない場合は0、道路がある場合は最大1を意味します。多重度の記載方法は、属性と同じです。詳細は、2.9節に示します。
関連には向きを指定できます。向きは矢印で表現します。矢印の向きは、クラスとクラスの対応関係を辿ることができる方向を示しています。関連の向きが片方向の場合、対応関係は矢印の向きにしか辿ることができません。関連が双方向の場合は、お互いに対応関係を辿ることができます。図 2‑7の場合は、「出入口」から「道路」への片方向の関連です。矢印の向きは、「出入口」から「道路」に向かっていますので、「出入口」は、つながる「道路」がわかりますが、「道路」からはどの「出入口」につながっているのかがわかりません。
なお、関連の名前は省略することができます。ただし、関連役割名については、対応関係を辿ることができる向きの関連役割名を省略することはできません。
また、関連は、相手を識別する情報(「識別子」といいます)を使って、どの相手と対応関係を持っているのかを特定します。
「出入口」と「道路」のUMLクラス図に従ってデータを作成した例を図2-8に示します。
図 2‑8 関連のデータの例
「正面出口」という名前の出入口は、道路につながっています。この場合、「つながる道路」という関連役割には「国道2号線」という値が入っています。これは、この「正面出口」という出入口が、「国道2号線」という名前を持つ道路データと対応付いていることを示しています。「国道2号線」という名前は、道路データの中でユニークでなければなりません。もし同じ名前が複数あった場合、どの「国道2号線」の道路データと、この出入口データを対応付けてよいかわからないからです。
このように、関連は、クラスとクラスの対応関係であり、識別子を使って相手を特定する仕組みです。
ポイント: 関連はクラス間の対応関係であり、対応付けにはデータの識別子を使用します。
「集成」とは、関連の一種であり、クラスとクラスが全体と部品との意味を持つ対応関係です。「集成」は、クラスとクラスを実線でつなぎ、全体となるクラス側の端点に、白抜きのひし形を付けます。
「集成」には、関連と同様に名前を付けることができます。集成で関連付けられたクラスは相手のクラスに対する役割を持ちます。この役割は名前を持ちます。これを「関連役割名」と呼びます。また、役割は多重度を持ちます。また、「集成」は向きを指定することができます。
図2-9では「建物」クラスと「出入口」クラスに集成の関連を定義しています。この場合、「建物」が全体となり「出入口」が部品となります。
図 2‑9 集成の記述
この集成は、「構造」という名前を持っており、「建物」と建物の「出入口」を対応付けています。「建物」の部品として「出入口」が存在しており、この集成において「出入口」は「出入口」という役割を持ちます。
建物には少なくとも1つの出入口があり、複数の出入口がある場合もあります。そこで、多重度は、[1..*]としています。多重度の記載方法は、属性や関連と同じです。詳細は、2.9節に示します。
また、集成も関連ですので、向きを指定できます。向きは矢印で表現します。矢印の向きは、クラスとクラスの対応関係を辿ることができる方向を示しています。関連の向きが片方向の場合、対応関係は矢印の向きにしか辿ることができません。関連が双方向の場合は、お互いに対応関係を辿ることができます。例図の場合は、「建物」から「出入口」への片方向の関連です。矢印の向きは、「建物」から「出入口」に向かっていますので、「建物」は「出入口」がわかりますが、「出入口」からは「建物」を辿ることができません。集成も、相手を識別する情報(「識別子」といいます)を使って、どの相手と対応関係を持っているのかを特定します。
以下に「建物」と「出入口」のUMLクラス図に従ってデータを作成した例を示します。集成の場合は、2通りのデータの作成方法があります。1つ目は、識別子を使って参照する方法 (図2-10)です。2つ目は、全体のデータの内部に部品となるデータを記述する方法 (図2-11)です。
識別子を使って参照する方法は、関連と同様の記述方法です。
図 2‑10 集成のデータの例①(参照する方法)
「○○ビル」という名前の建物には、3つの出入口があります。この場合、「出入口」という関連役割は3つのデータが作成され、それぞれ、「正面出口」、「北出口」及び「地下出口」という値がそれぞれ入っています。これは、「○○ビル」という建物のデータが、「正面出口」、「北出口」及び「地下出口」という名前を持つ出入口のデータと対応付いていることを示しています。集成も関連と同様に、識別子を使って対応付くクラスのデータを特定します。
全体のデータの内部に部品となるデータを記述する方法は、独自の型を属性の型に指定する方法(2.4.2項参照)と同様の記述方法です。
図 2‑11 集成のデータの例②(内部に記述する方法)
「○○ビル」という名前の建物には、3つの出入口があります。この場合、「出入口」という関連役割は3つのデータが作成され、それぞれ、「正面出口」、「北出口」及び「地下出口」という名前を持つ出入口のデータが入っています。
識別子を参照する方法は、「建物」データと「出入口」データが独立して存在しており、「建物」データは「出入口」データの識別子(この場合は「名前」)を使用して対応付けを行っていました。内部に記述する方法では、「建物」データの中に「出入口」データが含まれているという点で異なっています。
ポイント: 集成はクラス間の全体と部品という意味を持つ対応関係であり、対応付けにはデータの識別子を参照する方法と、全体のデータの中に部品のデータを記述する方法があります。
「合成」とは、関連の一種であり、集成と同様にクラスとクラスが全体と部品の意味を持つ関係ですが、集成よりもより強い関係となります。「合成」はクラスとクラスを実線でつなぎ、全体となるクラス側の端点に、黒塗りのひし形を付けます。
「合成」には、関連や集成と同様に名前を付けることができます。合成で関連付けられたクラスは相手のクラスに対する役割を持ちます。この役割は名前を持ちます。これを「関連役割名」と呼びます。また、役割は多重度を持ちます。また、「合成」は向きを指定することができます。
以下の例では、「建物」クラスと「出入口」クラスに合成の関連を定義しています(図2-12)。この場合、「建物」が全体となり「出入口」が部品となります。
図 2‑12 合成の記述
この合成は、「構造」という名前を持っており、「建物」と建物の「出入口」を対応付けています。「建物」の部品として「出入口」が存在しており、この合成において「出入口」は「出入口」という役割を持ちます。
関連名、関連役割名、多重度や向きの記載については、集成と同様です。
合成と集成の違いは、全体となるクラスと部品となるクラスの関係性の強さであり、より強い関係性を持つのが合成です。合成の場合は、全体となるクラスがなくなると、部品となるクラスもなくなるという関係性を持ちます。また、同じ部品を複数の全体が共有することはできません。
以下に「建物」と「出入口」のUMLクラス図に従ってデータを作成した例を示します。合成の場合は、全体となるクラスがなくなると、部品となるクラスもなくなるという強い関係性を持つので、全体のデータの内部に部品となるデータを記述する方法 (図2-13)で記述されます。
図 2‑13 合成のデータの例
集成と合成の違いは、フォルダとファイルに例えて説明することもできます。フォルダを全体クラス、ファイルは部品クラスと考えてください。
合成の場合は、フォルダの中に直接ファイルを格納します。フォルダを消すと、中に格納されたファイルも消えてしまいますし、また、異なるフォルダに同じファイルを格納することはできません。
一方、集成の場合は、フォルダの中に、ファイルのショートカットを格納(①識別子により参照する方法)又はファイルそのものを格納(②内部にデータを記述する方法)することができます。ショートカットが格納されている場合、フォルダを消すとファイルのショートカットは消えますが、ファイルそのものは消えません。また、異なるフォルダに、同じファイルのショートカットをそれぞれ格納することで、それぞれのフォルダから1つのファイルにアクセスすることができます。
クラスとクラスの対応関係を、関連とするか、集成とするか、合成とするかは、データの利用目的においてどのようにデータを取り扱えるとよいかを考えて選択するとよいでしょう。
ポイント: 合成はクラス間の全体と部品という意味を持つ対応関係であり、全体のデータの中に部品のデータを記述することで対応付けを行います。
「継承」とは、クラスの性質を受け継ぐ仕組みのことです。「継承」は、クラスとクラスを実線でつなぎ、継承の元となるクラス側の端点に白抜きの三角をつけます。継承の元となるクラスは「汎化クラス」(「上位クラス」又は「親クラス」)、また、汎化クラスの性質を受け継ぐクラスを「特化クラス」(「下位クラス」又は「子クラス」)と呼びます。「継承」の関係において、汎化クラスはより抽象度の高い意味を持ち、特化クラスは汎化クラスをある着眼点からより具体化した意味を持ちます。
継承は、クラスの性質を受け継ぐ仕組みですので、特化クラスは汎化クラスに定義された属性や他のクラスとの関係を全て持ちます。加えて、自身に独自の属性や関係を定義することができます。
図2-14は継承の記述例です。このUMLクラス図では、「建物」クラスを継承して、「地下街」クラスを定義しています。「地下街」クラスは、「建物」クラスの性質を受け継ぎます。つまり、「建物」クラスに定義された「名前」、「完成年」及び「階数」の属性を持ちます。また、「地下街」クラスには「接続駅名」という属性が定義されていますので、結果として、「地下街」クラスは、「名前」、「完成年」、「階数」及び「接続駅名」という4種類の属性を持つことになります。
図 2‑14 継承の記述
表2-3に「建物」クラスと「地下街」クラスのUMLクラス図に従って作成した「地下街」データの例を示します。
表 2‑3 「地下街」データの例
「駅前地下街」という名前を持つ地下街のデータには、「建物」クラスから継承した属性である「名前」、「完成年」及び「階数」に加え、「地下街」クラスに定義された属性「接続駅名」という属性も持ちます。
UMLクラス図を作成する場合、同じ属性を持つ複数のクラスを作成するかもしれません。このような場合に、共通する属性をまとめた汎化クラスを定義し、これを継承した特化したクラスに差分となる属性を定義することでUMLクラス図をわかりやすく整理できます。汎化クラスに共通の属性を定義することで、似て非なる属性を追加することを防げたり、継承により独自の属性を追加するだけで新しいクラスを定義できたりしますので、データモデルの管理がしやすくなります。
ポイント: 継承は抽象度の高い汎化クラスの性質を、これを継承する特化クラスが受け継ぐ関係です。特化クラスは、汎化クラスに定義された属性や関係を持ちます。
ステレオタイプとは、クラスの種類を指します。ステレオタイプは、データモデルを作る人が自由に定めることができますが、地理空間データのデータモデルではあらかじめいくつかのステレオタイプが用意されています。よく使用するステレオタイプを表2-4に示します。
表 2‑4 ステレオタイプの例
<<FeatureType>>は地物を表すクラスに適用するステレオタイプです。地物は識別できなければなりません。そのため、<<FeatureType>>が適用されたクラスに従って作成されたデータには、識別子が必要です。
それ以外のステレオタイプは、地物の部品として、属性の型や関連の相手クラスのステレオタイプに適用されます。
<<Type>>は、識別可能なオブジェクト(具体的なものやデータ)のクラスに適用するステレオタイプです。識別可能ですので、地物と同様に、何らかの識別子を持つ必要があります。地理空間データのデータモデルの場合、点、線、面、立体などの幾何形状を表すクラスには、<<Type>>を適用します。そのため、個々の幾何形状は、識別子を持つデータとなります。
<<DataType>>は、地物の属性の型に適用します。図2-15に例を示します。
図 2‑15 <<DataType>>の例
「階数型」というクラスは、地物である「建物」の属性「階数」の型として使用します。よって、「階数」クラスのステレオタイプは<<DataType>>となります。なお、地理空間データのモデルでは、地物を識別可能な最小単位と考えます。このとき、地物の属性は地物の中に含まれるデータとなります。識別可能な最小単位が地物ですので、それよりも小さなデータとなる属性は識別することはできません。
「抽象クラス」と「具象クラス」は、クラスの種類の一種であり、クラス間の「継承」の関係がある場合に使用します。「抽象クラス」は、データにならないクラスです。「具象クラス」はデータになるクラスです。抽象クラスは、クラス名をイタリック(斜体)で記述します。具象クラスは、クラス名を正体で記述します。
抽象クラスは、「継承」の関係がある場合に登場します。抽象クラスはデータにすることができない決まりになっており、抽象クラスを継承する具象クラスはデータにすることができます。
例えば、下図に示すように、「建物」クラスと「地下街」クラスに継承の関係があったとします(図2-16)。
図 2‑16 抽象クラスと具象クラス
このとき、「建物」クラスが具象クラスであった場合、このUMLクラス図に従うと「建物」データと「地下街」データを作成することができます。一方、「建物」クラスが抽象クラスであった場合、このUMLクラス図に従って作成できるデータは、「地下街」データのみとなります。
「継承」の説明の中で、同じ属性を持つ複数のクラスがある場合に、共通する属性をまとめた汎化クラスを定義し、これを継承した特化クラスにそれぞれで異なる属性を定義するという説明がありました。この場合、汎化クラスはあまり意味がなく、実際にデータとしてほしいのは特化クラスのデータです。このような場合に、汎化クラスを抽象クラスとすると、これを継承する具象クラスのみのデータを作成することができます。
例として、図2-17に3D都市モデル標準製品仕様書の土地利用(LandUse(CityGML))のUMLクラス図を示します。クラスluse::LandUseに着目すると、抽象クラスのcore::_CityObjectから継承を行い、具象クラスとして定義されているのがわかります。
図 2‑17 土地利用(LandUse(CityGML))のUMLクラス図
ポイント: 継承ではデータ化しない汎化クラスを、「抽象クラス」として定義できます。抽象クラスは、クラス名をイタリック(斜体)で記述します。
多重度は、属性や関連で使用するものであり、ある属性又は関連を記述できる回数を指定するものです。属性の場合は、属性を記述できる回数、関連の場合は、関連の相手クラスの識別子又はデータを記述できる回数となります。
多重度は、特定の値又は範囲で指定できます。特定の値を指定する場合は[m]、範囲で指定する場合は[m..n]と記述します。このとき、mやnはm<nとなる任意の整数となります。
整数の代わりに*(アスタリスク)が記述されている場合、これは何度でも繰り返してよいことを意味します。また、多重度の記述が省略された場合、[1](必ず1回記述する)を意味します。
データモデルでよく使用される多重度の表記を表2-5に示します。
表 2‑5 多重度の表記例
例として3D都市モデル標準製品仕様書のクラス(urf::UrbanRoadAttribute)を図2-18に示します。
図 2‑18 クラス(urf::UrbanRoadAttribute)
このクラスで使用されている属性の多重度記載はほとんどが[0..1]の「省略可能、記述する場合は1回」ですが、「roadType」は多重度の記載が省略されており、「必ず1回記述する」ということがわかります。また、「structuralDetails」の多重度は[0..*]ですので、「省略可能、記述する場合は任意の回数を繰り返せる」ということになります。
クラスの数が増えたり、クラス間に様々な関係性を記述したりすると、データモデルが複雑になります。
このような場合に、パッケージを使ってデータモデルを整理できます。パッケージはクラスやUMLクラス図などを束ねる概念です。例えば、建物に関係するクラスを集めたパッケージ、道路に関するクラスを集めたパッケージというようにテーマに沿ってクラスを分類することもできますし、クラス同士の関係のみを記述したUMLクラス図を集めたパッケージ、クラスの属性を記述したUMLクラス図を集めたパッケージ、というように、特定のテーマに沿ってUMLクラス図を分類することもできます。
パッケージの中にパッケージを作成するなど、階層性を持たせることもできます。また、パッケージとパッケージの間には関係を結ぶことができます。パッケージAに定義されたクラスを使って定義されたクラスをパッケージBに定義したとします。パッケージAのクラスがなければ、パッケージBのクラスは成立しません。この場合、パッケージBはパッケージAを利用する関係にあります。パッケージ間の関係は、利用する側のパッケージから利用される側のパッケージに破線の矢印を記述します。
パッケージやパッケージ間の関係を示した図をパッケージ図と呼びます。パッケージ図では、パッケージをフォルダの形で記述します。図2-19に例を示します。
図 2‑19 パッケージ図の記法
「building」パッケージには「建物」クラスが定義されています。「uBuilding」パッケージには「地下街」クラスが定義されています。「地下街」クラスは、「建物」クラスを継承して定義されています。この場合、「建物」クラスがないと、「地下街」クラスは成立しません。そのため、「uBuilding」パッケージは、「building」パッケージを利用しています。
さらに、地理空間データのデータモデルの場合は、パッケージに、ステレオタイプとして応用スキーマであることを示す<<ApplicationSchema>>を付けます。また、クラスはパッケージの中に定義されますが、どのパッケージに定義されたクラスであるかを識別するために、クラス名の接頭辞として、パッケージの名前を表示する場合があります。UMLクラス図では、「パッケージ名::クラス名」と表示します。パッケージ名とクラス名をダブルコロン(::)でつなぎます。図2-20の例は、パッケージ名の表示例です。「建物」クラスは、「building」パッケージに定義されているため、クラス名の接頭辞として「building」が付いています。
図 2‑20 パッケージ名の表示例
ポイント: パッケージはクラスやUMLクラス図をまとめる概念です。