ルート レイヤーの作成 (Make Route Layer) (Network Analyst)

サマリー

ルート ネットワーク解析レイヤーを作成し、解析プロパティを設定します。ルート解析レイヤーは、指定したネットワーク コストに基づいて、ネットワーク ロケーション間の最適ルートを決定する際に役立ちます。

レガシー:

このツールは非推奨ツールです。この機能は、[ルート解析レイヤーの作成 (Make Route Analysis Layer)] ツールに置き換えられています。

使用法

  • このツールで解析レイヤーを作成した後は、[ロケーションの追加 (Add Locations)] ツールを使用して解析レイヤーにネットワーク解析オブジェクトを追加し、[解析の実行 (Solve)] ツールを使用して解析を実行し、[レイヤー ファイルの保存 (Save To Layer File)] ツールを使用して結果をディスクに保存することができます。

  • このツールをジオプロセシング モデルに使用するときは、モデルをツールとして動作させる場合、出力ネットワーク解析レイヤーにモデル パラメーターを作成する必要があります。そうしないと、出力レイヤーはマップのコンテンツに追加されません。

パラメーター

ラベル説明データ タイプ
入力ネットワーク データセット

ルート解析が実行されるネットワーク データセット。

Network Dataset Layer
出力レイヤー名

作成するルート ネットワーク解析レイヤーの名前。

String
インピーダンス属性

解析でインピーダンスとして使用されるコスト属性。

String
ストップを並べ替えて最適ルートを検出
(オプション)
  • オン - 最適ルートを検索するためにストップの順番を並べ替えます。このオプションにより、ルート解析は最短パス問題から巡回セールスマン問題に変わります。
  • オフ - 入力の順序に従って、ストップを巡回します。これがデフォルトです。
Boolean
ストップの順番を維持
(オプション)

[ストップを並べ替えて最適ルートを検出] パラメーターがオンになっているときに、ストップの順序を指定します。

  • 最初と最後のストップを維持入力の順序に従って最初と最後のストップをルートの最初と最後のストップとして維持します。
  • 最初のストップを維持入力の順序に従って最初のストップをルートの最初のストップとして維持します。ただし、最後のストップは並べ替えることができます。
  • 最後のストップを維持入力の順序に従って最後のストップをルートの最後のストップとして維持します。ただし、最初のストップは並べ替えることができます。
  • すべてのストップを並べ替え最初のストップと最後のストップは保持されませんが、並べ替えることができます。
String
Use Time Windows
(オプション)

ストップでタイム ウィンドウが使用されるかどうかを指定します。

  • オン - ルートはストップのタイム ウィンドウを考慮します。ストップにタイム ウィンドウ以前に到着した場合、タイム ウィンドウが開始するまで待ち時間が発生します。ストップにタイム ウィンドウ以後に到着した場合、タイム ウィンドウ違反になります。ルート計算時には、タイム ウィンドウ超過時間の合計は追加するインピーダンスになるよう分散されます。このオプションはインピーダンスが時間単位のときのみ有効です。
  • オフ - ルートはストップのタイム ウィンドウを無視します。これがデフォルトです。
Boolean
累積
(オプション)

解析中に累積されるコスト属性のリスト。 これらの累積属性は、参考情報としてのみ使用されます。解析では、[インピーダンス属性] パラメーターで指定されているコスト属性のみを使用してルートを計算します。

累積されるコスト属性ごとに、解析で出力されたルートに Total_[Impedance] プロパティが追加されます。

String
U ターン ポリシー
(オプション)

ジャンクションで使用される U ターン ポリシーを指定します。 U ターンを許可するということは、解析においてジャンクションで方向転換し、同じ道路を引き返すことができるということを意味します。 ジャンクションが道路の交差と行き止まりを表すことを前提に、さまざまな車両が、一部のジャンクションでは方向転換でき、他のジャンクションでは方向転換できない、というように設定できます。これは、ジャンクションが交差と行き止まりのどちらを表すかによって変わります。 これに対応するには、ジャンクションに接続するエッジの数 (ジャンクションでのノードへの接続数) によって、暗黙的に U ターン ポリシーを指定します。 以下では、このパラメーターで選択できる値と、ジャンクションの接続におけるそれぞれの意味について示します。

U ターン ポリシーをさらに正確に定義する必要がある場合、グローバル ターン遅延エバリュエーターをネットワーク コスト属性に追加するか、すでに存在する場合はそれを調整することを検討してください。その際、逆ターンの設定には特に注意が必要です。 また、ネットワーク ロケーションの CurbApproach プロパティも設定できます。

  • 許可任意の数の接続されたエッジを持つジャンクションで U ターンを許可します。 これがデフォルト値です。
  • 許可しないジャンクションの接続にかかわらず、すべてのジャンクションで U ターンを禁止します。 ただし、このオプションが指定されている場合でも、ネットワーク ロケーションでは U ターンが許可されます。同様に、個々のネットワーク ロケーションの CurbApproach プロパティで U ターンを禁止するように設定できます。
  • 行き止まりでのみ許可1 つの隣接エッジを持つジャンクション (行き止まり) を除くすべてのジャンクションでの U ターンを禁止します。
  • 行き止まりと交差点でのみ許可2 つの隣接するエッジが接するジャンクションでの U ターンを禁止します。ただし、交差点 (3 つ以上の隣接エッジを持つジャンクション) および行き止まり (1 つの隣接エッジを持つジャンクション) では U ターンを許可します。 ネットワークには、道路セグメントの中間に無関係のジャンクションが存在する場合があります。 このオプションは、これらの場所で車両が U ターンすることを防ぎます。
String
規制
(オプション)

解析中に適用される規制属性のリスト。

String
解析に階層を使用
(オプション)
  • オン - 階層属性が解析に使用されます。 階層を使用すると、解析は下位ランクのエッジよりも上位ランクのエッジを優先します。 階層解析は、より高速で、運転者が遠回りであっても一般道路よりも高速道路を利用する状況をシミュレートするのに使用できます。 このオプションは入力ネットワーク データセットが階層属性を持つ場合のみ有効です。
  • オフ - 階層属性は解析に使用されず、ネットワーク データセットの正確なルートが出力されます。

解析を実行するネットワーク データセットに使用する階層属性が定義されていない場合、このパラメーターは非アクティブになります。

Boolean
階層ランクの設定
(オプション)

レガシー:

10 より前のバージョンでは、このパラメーターによって、解析のためにネットワーク データセット構築時のデフォルトの階層範囲から階層範囲の変更を行うことを許可していました。 バージョン 10 では、このパラメーターはサポートされていません。 解析のために階層範囲を変更するには、ネットワーク データセットのデフォルトの階層範囲を更新します。

Network Analyst Hierarchy Settings
出力経路の形状
(オプション)

解析で出力されるルート フィーチャに使用される形状タイプを指定します。

指定した出力形状のタイプに関係なく、常に最適なルートはユークリッド距離ではなくネットワーク インピーダンスによって決定されます。 これは、ルート形状のみが異なり、ネットワークの基となっているトラバースは同じであることを意味します。

  • メジャー値を含む正確なライン形状出力ルートはネットワーク ソースの正確な形状を保持します。 リニア リファレンスのためのルートのメジャー値が出力に含まれます。 メジャー値は、最初のストップから増加し、指定された位置に到着するまでの累積インピーダンスを記録します。
  • メジャー値を含まない正確なライン形状出力ルートはネットワーク ソースの正確な形状を保持します。
  • 直線出力ルート形状はストップ間を結ぶ 1 本の直線になります。
  • ラインなし出力ルートに形状は生成されません。
String
開始時間
(オプション)

ルートの開始日時。 ルートの開始時間は一般的に、1 日の時刻に応じて変化するインピーダンス属性に基づいたルートの検索に使用されます。 たとえば、混雑時の交通量を考慮したルートの検索では、開始時間として午前 7 時を使用します。 このパラメーターのデフォルト値は、午前 8 時です。 日付と時刻は 2005/10/21 10:30 のように指定できます。ルートが複数日にわたり、開始時間のみが指定されている場合は、現在の日付が使用されます。

特定の静的な日付の代わりに曜日または現在の日付をモデル化するには、次のいずれかの特殊な日付を使用するように解析を構成します。

  • 今日 - 12/30/1899
  • 日曜 - 12/31/1899
  • 月曜 - 1/1/1900
  • 火曜 - 1/2/1900
  • 水曜 - 1/3/1900
  • 木曜 - 1/4/1900
  • 金曜 - 1/5/1900
  • 土曜 - 1/6/1900

たとえば、移動を火曜日の 5:00 PM に開始するよう指定するには、パラメーター値を 1900/1/2 5:00 PM に指定します。

解析後、出力ルートにはルートの開始時刻と終了時刻が挿入されます。 これらの開始時刻と終了時刻は、ルート案内の生成時にも使用されます。

ネットワーク解析での日時の使用と解釈の詳細

Date

派生した出力

ラベル説明データ タイプ
Network Analyst レイヤー

新しく作成されたネットワーク解析レイヤー。

Network Analyst レイヤー

arcpy.na.MakeRouteLayer(in_network_dataset, out_network_analysis_layer, impedance_attribute, {find_best_order}, {ordering_type}, {time_windows}, {accumulate_attribute_name}, {UTurn_policy}, {restriction_attribute_name}, {hierarchy}, {hierarchy_settings}, {output_path_shape}, {start_date_time})
名前説明データ タイプ
in_network_dataset

ルート解析が実行されるネットワーク データセット。

Network Dataset Layer
out_network_analysis_layer

作成するルート ネットワーク解析レイヤーの名前。

String
impedance_attribute

解析でインピーダンスとして使用されるコスト属性。

String
find_best_order
(オプション)
  • FIND_BEST_ORDER最適ルートを検索するためにストップの順番を並べ替えます。このオプションにより、ルート解析は最短パス問題から巡回セールスマン問題に変わります。
  • USE_INPUT_ORDER入力の順序に従って、ストップを巡回します。これがデフォルトです。
Boolean
ordering_type
(オプション)

FIND_BEST_ORDER を使用するときに、ストップの順番を指定します。

  • PRESERVE_BOTH入力の順序に従って最初と最後のストップをルートの最初と最後のストップとして維持します。
  • PRESERVE_FIRST入力の順序に従って最初のストップをルートの最初のストップとして維持します。ただし、最後のストップは並べ替えることができます。
  • PRESERVE_LAST入力の順序に従って最後のストップをルートの最後のストップとして維持します。ただし、最初のストップは並べ替えることができます。
  • PRESERVE_NONE最初のストップと最後のストップは保持されませんが、並べ替えることができます。
String
time_windows
(オプション)

ストップでタイム ウィンドウが使用されるかどうかを指定します。

  • USE_TIMEWINDOWSルートはストップのタイム ウィンドウを考慮します。ストップにタイム ウィンドウ以前に到着した場合、タイム ウィンドウが開始するまで待ち時間が発生します。ストップにタイム ウィンドウ以後に到着した場合、タイム ウィンドウ違反になります。ルート計算時には、タイム ウィンドウ超過時間の合計は最小のインピーダンスになるよう分散されます。これはインピーダンスが時間単位のときのみ有効なオプションです。
  • NO_TIMEWINDOWSルートはストップのタイム ウィンドウを無視します。これがデフォルト設定。
Boolean
accumulate_attribute_name
[accumulate_attribute_name,...]
(オプション)

解析中に累積されるコスト属性のリスト。 これらの累積属性は、参考情報としてのみ使用されます。解析では、[インピーダンス属性] パラメーターで指定されているコスト属性のみを使用してルートを計算します。

累積されるコスト属性ごとに、解析で出力されたルートに Total_[Impedance] プロパティが追加されます。

String
UTurn_policy
(オプション)

ジャンクションで使用される U ターン ポリシーを指定します。 U ターンを許可するということは、解析においてジャンクションで方向転換し、同じ道路を引き返すことができるということを意味します。 ジャンクションが道路の交差と行き止まりを表すことを前提に、さまざまな車両が、一部のジャンクションでは方向転換でき、他のジャンクションでは方向転換できない、というように設定できます。これは、ジャンクションが交差と行き止まりのどちらを表すかによって変わります。 これに対応するには、ジャンクションに接続するエッジの数 (ジャンクションでのノードへの接続数) によって、暗黙的に U ターン ポリシーを指定します。 以下では、このパラメーターで選択できる値と、ジャンクションの接続におけるそれぞれの意味について示します。

  • ALLOW_UTURNS任意の数の接続されたエッジを持つジャンクションで U ターンを許可します。 これがデフォルト値です。
  • NO_UTURNSジャンクションの接続にかかわらず、すべてのジャンクションで U ターンを禁止します。 ただし、このオプションが指定されている場合でも、ネットワーク ロケーションでは U ターンが許可されます。同様に、個々のネットワーク ロケーションの CurbApproach プロパティで U ターンを禁止するように設定できます。
  • ALLOW_DEAD_ENDS_ONLY1 つの隣接エッジを持つジャンクション (行き止まり) を除くすべてのジャンクションでの U ターンを禁止します。
  • ALLOW_DEAD_ENDS_AND_INTERSECTIONS_ONLY2 つの隣接するエッジが接するジャンクションでの U ターンを禁止します。ただし、交差点 (3 つ以上の隣接エッジを持つジャンクション) および行き止まり (1 つの隣接エッジを持つジャンクション) では U ターンを許可します。 ネットワークには、道路セグメントの中間に無関係のジャンクションが存在する場合があります。 このオプションは、これらの場所で車両が U ターンすることを防ぎます。

U ターン ポリシーをさらに正確に定義する必要がある場合、グローバル ターン遅延エバリュエーターをネットワーク コスト属性に追加するか、すでに存在する場合はそれを調整することを検討してください。その際、逆ターンの設定には特に注意が必要です。 また、ネットワーク ロケーションの CurbApproach プロパティも設定できます。

String
restriction_attribute_name
[restriction_attribute_name,...]
(オプション)

解析中に適用される規制属性のリスト。

String
hierarchy
(オプション)
  • USE_HIERARCHY階層属性が解析に使用されます。 階層を使用すると、解析は下位ランクのエッジよりも上位ランクのエッジを優先します。 階層解析は、より高速で、運転者が遠回りであっても一般道路よりも高速道路を利用する状況をシミュレートするのに使用できます。 このオプションは入力ネットワーク データセットが階層属性を持つ場合のみ有効です。
  • NO_HIERARCHY階層属性は解析に使用されず、ネットワーク データセットの正確なルートが出力されます。

解析を実行するネットワーク データセットに使用する階層属性が定義されていない場合、このパラメーターは使用されません。

Boolean
hierarchy_settings
(オプション)

レガシー:

10 より前のバージョンでは、このパラメーターによって、解析のためにネットワーク データセット構築時のデフォルトの階層範囲から階層範囲の変更を行うことを許可していました。 バージョン 10 では、このパラメーターはサポートされていないため、空の文字列を指定する必要があります。 解析のために階層範囲を変更するには、ネットワーク データセットのデフォルトの階層範囲を更新します。

Network Analyst Hierarchy Settings
output_path_shape
(オプション)

解析で出力されるルート フィーチャに使用される形状タイプを指定します。

  • TRUE_LINES_WITH_MEASURES出力ルートはネットワーク ソースの正確な形状を保持します。 リニア リファレンスのためのルートのメジャー値が出力に含まれます。 メジャー値は、最初のストップから増加し、指定された位置に到着するまでの累積インピーダンスを記録します。
  • TRUE_LINES_WITHOUT_MEASURES出力ルートはネットワーク ソースの正確な形状を保持します。
  • STRAIGHT_LINES出力ルート形状はストップ間を結ぶ 1 本の直線になります。
  • NO_LINES出力ルートに形状は生成されません。

指定した出力形状のタイプに関係なく、常に最適なルートはユークリッド距離ではなくネットワーク インピーダンスによって決定されます。 これは、ルート形状のみが異なり、ネットワークの基となっているトラバースは同じであることを意味します。

String
start_date_time
(オプション)

ルートの開始日時。 ルートの開始時間は一般的に、1 日の時刻に応じて変化するインピーダンス属性に基づいたルートの検索に使用されます。 たとえば、混雑時の交通量を考慮したルートの検索では、開始時間として午前 7 時を使用します。 このパラメーターのデフォルト値は、午前 8 時です。 日付と時刻は 2005/10/21 10:30 のように指定できます。ルートが複数日にわたり、開始時間のみが指定されている場合は、現在の日付が使用されます。

特定の静的な日付の代わりに曜日または現在の日付をモデル化するには、次のいずれかの特殊な日付を使用するように解析を構成します。

  • 今日 - 12/30/1899
  • 日曜 - 12/31/1899
  • 月曜 - 1/1/1900
  • 火曜 - 1/2/1900
  • 水曜 - 1/3/1900
  • 木曜 - 1/4/1900
  • 金曜 - 1/5/1900
  • 土曜 - 1/6/1900

たとえば、移動を火曜日の 5:00 PM に開始するよう指定するには、パラメーター値を 1900/1/2 5:00 PM に指定します。

解析後、出力ルートにはルートの開始時刻と終了時刻が挿入されます。 これらの開始時刻と終了時刻は、ルート案内の生成時にも使用されます。

ネットワーク解析での日時の使用と解釈の詳細

Date

派生した出力

名前説明データ タイプ
output_layer

新しく作成されたネットワーク解析レイヤー。

Network Analyst レイヤー

コードのサンプル

MakeRouteLayer (ルート レイヤーの作成) の例 1 (Python ウィンドウ)

必須パラメーターのみを使用して、ツールを実行します。

network = "C:/Data/SanFrancisco.gdb/Transportation/Streets_ND"
arcpy.na.MakeRouteLayer(network, "WorkRoute", "TravelTime")
MakeRouteLayer (ルート レイヤーの作成) の例 2 (Python ウィンドウ)

すべてのパラメーターを使用してツールを実行します。

network = "C:/Data/SanFrancisco.gdb/Transportation/Streets_ND"
arcpy.na.MakeRouteLayer(network, "InspectionRoute", "TravelTime",
                        "FIND_BEST_ORDER", "PRESERVE_BOTH", "USE_TIMEWINDOWS",
                        ["Meters", "TravelTime"],
                        "ALLOW_DEAD_ENDS_AND_INTERSECTIONS_ONLY", ["Oneway"],
                        "USE_HIERARCHY", "", "TRUE_LINES_WITH_MEASURES",
                        "1/1/1900 9:00 AM")
MakeRouteLayer (ルート レイヤーの作成) の例 3 (ワークフロー)

次のスタンドアロン Python スクリプトは、MakeRouteLayer ツールを使用して、ジオコーディングされたストップ ロケーションを巡回する最適ルートを検索する方法を示しています。

# Name: MakeRouteLayer_Workflow.py
# Description: Find a best route to visit the stop locations and save the
#              route to a layer file. The stop locations are geocoded from a
#              text file containing the addresses.
# Requirements: Network Analyst Extension

#Import system modules
import arcpy
from arcpy import env
import os

try:
    #Set environment settings
    output_dir = "C:/Data"
    #The NA layer's data will be saved to the workspace specified here
    env.workspace = os.path.join(output_dir, "Output.gdb")
    env.overwriteOutput = True

    #Set local variables
    input_gdb = "C:/Data/SanFrancisco.gdb"
    network = os.path.join(input_gdb, "Transportation", "Streets_ND")
    layer_name = "BestRoute"
    impedance = "TravelTime"
    address_locator = os.path.join(input_gdb, "SanFranciscoLocator")
    address_table = "C:/Data/StopAddresses.csv"
    address_fields = "Street Address;City City;State State;ZIP <None>"
    out_stops = "GeocodedStops"
    output_layer_file = os.path.join(output_dir, layer_name + ".lyrx")

    #Create a new Route layer. For this scenario, the default values for all the
    #remaining parameters statisfy the analysis requirements
    result_object = arcpy.na.MakeRouteLayer(network, layer_name, impedance)

    #Get the layer object from the result object. The route layer can now be
    #referenced using the layer object.
    layer_object = result_object.getOutput(0)

    #Get the names of all the sublayers within the route layer.
    sublayer_names = arcpy.na.GetNAClassNames(layer_object)
    #Stores the layer names that we will use later
    stops_layer_name = sublayer_names["Stops"]

    #Geocode the stop locations from a csv file containing the addresses.
    #The Geocode Addresses tool can use a text or csv file as input table
    #as long as the first line in the file contains the field names.
    arcpy.geocoding.GeocodeAddresses(address_table, address_locator,
                                     address_fields, out_stops)

    #Load the geocoded address locations as stops mapping the address field from
    #geocoded stop features as Name property using field mappings.
    field_mappings = arcpy.na.NAClassFieldMappings(layer_object,
                                                            stops_layer_name)
    field_mappings["Name"].mappedFieldName = "Address"
    arcpy.na.AddLocations(layer_object, stops_layer_name, out_stops,
                            field_mappings, "",
                            exclude_restricted_elements="EXCLUDE")

    #Solve the route layer, ignoring any invalid locations such as those that
    #cannot be geocoded
    arcpy.na.Solve(layer_object, "SKIP")

    #Save the solved route layer as a layer file on disk
    layer_object.saveACopy(output_layer_file)

    print("Script completed successfully")

except Exception as e:
    # If an error occurred, print line number and error message
    import traceback, sys
    tb = sys.exc_info()[2]
    print("An error occurred on line %i" % tb.tb_lineno)
    print(str(e))
MakeRouteLayer (ルート レイヤーの作成) の例 4 (ワークフロー)

この例では、1 つの解析で複数のルートを作成します。これは多くの場合、起点と終点の間の距離または運転時間の計算に使用されます。

# Name: MakeRouteLayer_MultiRouteWorkflow.py
# Description: Calculate the home-work commutes for a set of people and save
#              the output to a feature class
# Requirements: Network Analyst Extension

#Import system modules
import arcpy
from arcpy import env
import datetime
import os

try:
    #Set environment settings
    output_dir = "C:/Data"
    #The NA layer's data will be saved to the workspace specified here
    env.workspace = os.path.join(output_dir, "Output.gdb")
    env.overwriteOutput = True

    #Set local variables
    input_gdb = "C:/data/SanFrancisco.gdb"
    network = os.path.join(input_gdb, "Transportation", "Streets_ND")
    stops_home = os.path.join(input_gdb, "Analysis", "Commuters_Home")
    stops_work = os.path.join(input_gdb, "Analysis", "Commuters_Work")
    layer_name = "Commuters"
    out_routes_featureclass = "Commuter_Routes"
    impedance = "TravelTime"

    #Set the time of day for the analysis to 8AM on a generic Monday.
    start_time = datetime.datetime(1900, 1, 1, 8, 0, 0)

    #Create a new Route layer.  Optimize on TravelTime, but compute the
    #distance traveled by accumulating the Meters attribute.
    result_object = arcpy.na.MakeRouteLayer(network, layer_name, impedance,
                                         accumulate_attribute_name=["Meters"],
                                         hierarchy="NO_HIERARCHY",
                                         start_date_time=start_time)

    #Get the layer object from the result object. The route layer can now be
    #referenced using the layer object.
    layer_object = result_object.getOutput(0)

    #Get the names of all the sublayers within the route layer.
    sublayer_names = arcpy.na.GetNAClassNames(layer_object)
    #Stores the layer names that we will use later
    stops_layer_name = sublayer_names["Stops"]
    routes_layer_name = sublayer_names["Routes"]

    #Before loading the commuters' home and work locations as route stops, set
    #up field mapping.  Map the "Commuter_Name" field from the input data to
    #the RouteName property in the Stops sublayer, which ensures that each
    #unique Commuter_Name will be placed in a separate route.  Matching
    #Commuter_Names from stops_home and stops_work will end up in the same
    #route.
    field_mappings = arcpy.na.NAClassFieldMappings(layer_object, stops_layer_name)
    field_mappings["RouteName"].mappedFieldName = "Commuter_Name"

    #Add the commuters' home and work locations as Stops. The same field mapping
    #works for both input feature classes because they both have a field called
    #"Commuter_Name"
    arcpy.na.AddLocations(layer_object, stops_layer_name, stops_home,
                        field_mappings, "",
                        exclude_restricted_elements = "EXCLUDE")
    arcpy.na.AddLocations(layer_object, stops_layer_name, stops_work,
                        field_mappings, "", append="APPEND",
                        exclude_restricted_elements = "EXCLUDE")

    #Solve the route layer.
    arcpy.na.Solve(layer_object)

    # Get the output Routes sublayer and save it to a feature class
    routes_sublayer = layer_object.listLayers(routes_layer_name)[0]
    arcpy.management.CopyFeatures(routes_sublayer, out_routes_featureclass)

    print("Script completed successfully")

except Exception as e:
    # If an error occurred, print line number and error message
    import traceback, sys
    tb = sys.exc_info()[2]
    print("An error occurred on line %i" % tb.tb_lineno)
    print(str(e))

ライセンス情報

  • Basic: Yes
  • Standard: Yes
  • Advanced: Yes

関連トピック