オントロジーMapMap 用にデータ統合Map Search Around 機能

注: 以下の翻訳の正確性は検証されていません。AIPを利用して英語版の原文から機械的に翻訳されたものです。

Map Search Around 機能

Map Search Around 関数を書くことで、Mapに対して強力な Map Search Arounds を作成することができます。これにより、選択されたオブジェクトが与えられ、オントロジーを走査して特定の分析に必要または有用なすべてのオブジェクトを戻すTypeScript関数を書くことができます。

Map Search Around 関数は、以下を含むデータ構造を返します:

  • objectRids: Mapに追加されるオブジェクト。
  • edges: ソースオブジェクト、ターゲットオブジェクト、およびオプションで中間オブジェクトを含むエッジ。ソースオブジェクトとターゲットオブジェクトは、それらの間に描かれた弧と共にマップに追加され、弧が選択されたときに中間オブジェクトがリストされます。
  • measures: シリーズパネルに追加される時間系列測定。

Map Search Around 関数の実装

Map Search Around 関数は、TypeScript関数リポジトリで開発されます。詳細については、関数ドキュメンテーション を参照してください。

戻り値の型

Map Search Around 関数は、戻り値の型を Promise<IMapSearchAroundResults> と宣言する必要があります。Mapアプリケーションは、その戻り値の型の名前と構造を使用してSearch Around関数を検出するため、戻り値の型は以下のように正確に宣言する必要があります:

Copied!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 // IMapSearchAroundResultsインターフェースを定義します。 // このインターフェースは、地図の検索結果を表します。 export interface IMapSearchAroundResults { // オブジェクトのRidの配列。これはオプションです。 objectRids?: string[]; // IMapSearchAroundEdgeの配列。これもオプションです。 edges?: IMapSearchAroundEdge[]; // IMapSearchAroundMeasureの配列。これもオプションです。 measures?: IMapSearchAroundMeasure[]; } // IMapSearchAroundEdgeインターフェースを定義します。 // このインターフェースは、地図上のエッジを表します。 export interface IMapSearchAroundEdge { // ソースオブジェクトのRid。 sourceObjectRid: string; // ターゲットオブジェクトのRid。 targetObjectRid: string; // 中間オブジェクトのRidの配列。これはオプションです。 intermediaryObjectRids?: string[]; } // IMapSearchAroundMeasureインターフェースを定義します。 // このインターフェースは、地図上の計測を表します。 export interface IMapSearchAroundMeasure { // オブジェクトのRidの配列。 objectRids: string[]; // 計測ID。 measureId: string; }

パラメーター

Map Search Around 関数には、以下のいずれかを含む 1 つのオブジェクトパラメーターを指定する必要があります(ただし 1 つだけ)。

  • 単一のオブジェクト: 指定されたタイプの単一オブジェクトが選択された場合、この Search Around 関数は Search Around メニューで利用可能になります。例:
Copied!
1 2 // この関数はExampleObjectTypeのオブジェクトを引数に取り、特定の操作を行います public exampleSearchAround(object: ExampleObjectType) { ...
  • オブジェクト配列: この周辺検索機能は、指定されたタイプのオブジェクトが何個でも選択されている場合に、周辺検索メニューで利用可能になります。例えば:
Copied!
1 2 // 例の検索周辺メソッド public exampleSearchAround(objects: ExampleObjectType[]) { ...
  • オブジェクトセット: この Search Around 機能は、指定されたタイプのオブジェクトが何個でも選択されているときに、Search Around メニューで使用できます。例えば:
Copied!
1 2 // 例のオブジェクトタイプのオブジェクトセットを中心に検索する関数 public exampleSearchAround(objectSet: ObjectSet<ExampleObjectType>) { ...

Map Search Around関数は、オプショナルでこれらのスカラタイプの追加パラメーターを任意の数だけ含めることができます:stringbooleanIntegerLongFloatDoubleLocalDate、またはTimestamp(詳細はScalar typesを参照してください)。ユーザーが追加パラメーター付きのSearch Around関数を実行すると、ユーザーにはパラメーターの値を入力するように求められます。例えば:

Copied!
1 2 3 4 5 6 7 // 日本語のコメントを追加します public exampleSearchAround(objectSet: ObjectSet<ExampleObjectType>, stringParameter: string, timestampParameter: Timestamp) { // objectSet: オブジェクトセットの型がExampleObjectTypeのインスタンスです // stringParameter: 文字列のパラメータです // timestampParameter: タイムスタンプのパラメータです ... }

ヒントとトラブルシューティング

  • パフォーマンスを最大化するために、すべてのコードはできるだけ非同期的にすべきです。関数コードでは、オブジェクトをロードする際に all()get() の代わりに allAsync()getAsync() を使用し、await ステートメントをできるだけ少なく使用してください。
  • Map アプリケーションは、関数の最新の公開バージョンを使用します。関数を公開するには、ブランチ/コミットに semver 互換のバージョンをタグ付けする必要があります。例: 1.0.0。
  • リポジトリは、関数で使用するオントロジーのオブジェクトとリンクにアクセスする必要があります。これは、リポジトリの 設定オントロジー セクションで設定できます。
  • オブジェクトタイプとその元データセットがリポジトリとは異なるプロジェクトで定義されている場合、リポジトリを含むプロジェクトは、元データセットとそのオブジェクトタイプへの参照が必要です。

この例のコードには、Foundry Reference Project サンプルデータに基づく3つの Search Around 関数が含まれています。

  • airportsRelatedObjects: 一連の空港に関連するさまざまなオブジェクトを返します。空港分析のマップテンプレートで使用できます。
  • nearbyAirports: 与えられた距離内にある他の空港を見つけるための地理空間検索を実行します。関数はオプションの距離パラメーターを取り、ユーザーが関数の実行時に距離を指定できるようにします。
  • routesBetweenAirports: 一連の空港が与えられた場合、それらの空港間のすべてのルートを返します。
Copied!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 import { Distance, Function, Integer, Filters } from "@foundry/functions-api"; import { ObjectSet, Objects, ExampleDataAirport } from "@foundry/ontology-api"; export interface IMapSearchAroundResults { objectRids?: string[]; edges?: IMapSearchAroundEdge[]; measures?: IMapSearchAroundMeasure[]; } export interface IMapSearchAroundEdge { sourceObjectRid: string; targetObjectRid: string; intermediaryObjectRids?: string[]; } export interface IMapSearchAroundMeasure { objectRids: string[]; measureId: string; } export class MapSearchAroundFunctions { /** * 空港に関連するオブジェクトを返す: 滑走路、ルート */ @Function() public async airportsRelatedObjects(airportSet: ObjectSet<ExampleDataAirport>): Promise<IMapSearchAroundResults> { const relatedObjects = (await Promise.all([ airportSet.searchAroundExampleDataRunway().allAsync(), airportSet.searchAroundRoutes().allAsync(), ])).flat(); const objectRids = relatedObjects.map(o => o.rid!); return { objectRids, }; } /** * 選択した空港から指定された距離(デフォルトは50km)以内にあるすべての空港を返す */ @Function() public async nearbyAirports(airport: ExampleDataAirport, distanceKm?: Integer): Promise<IMapSearchAroundResults> { const point = airport.airportLocation; const distance = Distance.ofKilometers(distanceKm ?? 50); if (point === undefined) { return {}; } const nearbyAirports = await Objects.search() .exampleDataAirport() .filter(airportFilter => airportFilter.airportLocation.withinDistanceOf(point, distance)) .allAsync(); const objectRids = nearbyAirports.map(o => o.rid!); return { objectRids, }; } /** * 選択した空港間のルートのみを返す */ @Function() public async routesBetweenAirports(airportSet: ObjectSet<ExampleDataAirport>): Promise<IMapSearchAroundResults> { const airports = await airportSet.allAsync(); const airportCodes = airports.map(airport => airport.airport); const airportsByCodes = new Map(Array.from(airports, a => [a.airport, a])); const routes = await Objects.search() .exampleDataRoute() .filter(route => Filters.and( route.origin.exactMatch(...airportCodes), route.dest.exactMatch(...airportCodes), )) .allAsync(); const edges = routes.map(route => ({ sourceObjectRid: airportsByCodes.get(route.origin!)!.rid!, targetObjectRid: airportsByCodes.get(route.dest!)!.rid!, intermediaryObjectRids: [route.rid!], })); return { edges }; } }