

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 提供方位角高程星历数据
<a name="providing-azimuth-elevation-ephemeris-data"></a>

**重要**  
 方位角仰角星历表功能目前处于预览状态，需要明确加入。  
 对于数量有限的预先确定的专业用例，方位角仰角星历功能受到严格的访问控制。访问权限比客户提供的标准星历功能严格得多。有关批准的用例和访问请求流程的更多信息，请通过以下方式开 AWS 支持 票[AWS Support Center Console](https://console.aws.amazon.com/support)。我们的团队将指导您完成特殊用例的批准流程。

## 概述
<a name="w2aac28c17c15b5"></a>

 方位角仰角星历表提供了一种无需提供卫星轨道信息即可直接指定天线指向方向的方法。与其上传描述卫星轨道的星历表数据，不如提供带有时间标签的方位角和仰角来告诉天线在整个接触过程中确切指向何处。

 AWS Ground Station 将星历视为[个性化使用数据。](https://aws.amazon.com/service-terms)如果您使用此可选功能，AWS 将使用您的星历数据来提供故障排除支持。

 这种方法对以下场景特别有用：
+ *早期运营支持：*在发射和早期轨道阶段（LEOP）期间，当无法获得精确的轨道数据或轨道参数迅速变化时。
+ *自定义指向模式：为天线测试或非标准操作*实现特定的指向序列。

**注意**  
 使用方位角仰角星历表时，联系人预订请求中可能会省略卫星 ARN。如果不省略卫星 ARN，它仍将作为联系数据的一部分包括在内，但方位角仰角星历表将用于天线指向，而不是执行星历优先分辨率。方位角仰角星历表与特定的地面站相关联，用于定义该位置的天线指向方向。

## 方位角高程星历表数据格式
<a name="w2aac28c17c15b7"></a>

 方位角高程星历表数据由按分段组织的时间标记方位角和高程值组成。每个分段都包含一系列覆盖特定时间范围的方位角和仰角。

 方位角高程星历表数据的关键组成部分是：
+ *地面站：*将使用该方位角仰角星历表的特定地面站。
+ *角度单位：*角度的计量单位（`DEGREE_ANGLE`或`RADIAN`）。
+ *分段：*一个或多个有时间限制的方位角和仰角集合。
+ *Time-tagged 角度：带有相关时间戳的*单个方位角和仰角值。

 每个分段都需要：
+ 参考时期（分段的基准时间）
+ 有效的时间范围（分段的开始和结束时间）
+ 至少 5 对带有时间标签 azimuth/elevation 的配对

 方位角高程约束：
+ 以度为单位的方位角：-180° 至 360°
+ 以弧度表示的方位角：-p 到 2p
+ 以度为单位的仰角：-90° 至 90°
+ 以弧度为单位的海拔：-ω/2 至 ω/2
+ 每个分段内的时间值必须按升序排列
+ 区段在时间上不得重叠

 有关更多信息，请参阅 [ CreateEphemeris ](https://docs.aws.amazon.com/ground-station/latest/APIReference/API_CreateEphemeris.html) API 文档和[TimeAzEl](https://docs.aws.amazon.com/ground-station/latest/APIReference/API_TimeAzEl.html)数据类型。

## 创建方位角仰角星历
<a name="w2aac28c17c15b9"></a>

 方位角高程星历表使用相同的 [ CreateEphemeris ](https://docs.aws.amazon.com/ground-station/latest/APIReference/API_CreateEphemeris.html) API 操作创建，但使用星历类型。`azEl`与 TLE 和 OEM 星历表的主要区别在于：
+ 必须指定一个`groundStation`参数
+ 请求中必须省略该`satelliteId`参数
+ 优先级设置不适用（每个方位角仰角星历表都特定于地面站）
+ 每个分段必须包含至少 5 个 azimuth/elevation 点才能支持 4 阶拉格朗日插值
+ [CreateEphemeris](https://docs.aws.amazon.com/ground-station/latest/APIReference/API_CreateEphemeris.html)API 文档中详细介绍了其他限制和要求

 请务必注意，上传星历会将星历设置为 `VALIDATING` 并启动异步工作流程，该工作流程将验证您的星历并生成可能联络。星历表仅在通过此工作流程且状态变为后才用于联系人。`ENABLED`您应该轮[DescribeEphemeris](https://docs.aws.amazon.com/ground-station/latest/APIReference/API_DescribeEphemeris.html)询星历状态或使用 CloudWatch 事件来跟踪星历表的状态变化。

 要对无效的星历表进行故障排除，请参阅：[对无效的星历进行故障排除](troubleshooting-invalid-ephemerides.md)

## 示例：通过 API 创建方位角仰角星历
<a name="w2aac28c17c15c11"></a>

 以下示例说明如何使用适用于 Python 的 AWS 软件开发工具包 (Boto3) 创建方位角仰角星历：

```
import boto3

# Create AWS Ground Station client
ground_station_client = boto3.client("groundstation")

# Create azimuth elevation ephemeris
azimuth_elevation_ephemeris = ground_station_client.create_ephemeris(
    name="Azimuth Elevation for Ohio Ground Station",
    ephemeris={
        "azEl": {
            "groundStation": "Ohio 1",
            "data": {
                "azElData": {
                    "angleUnit": "DEGREE_ANGLE",
                    "azElSegmentList": [
                        {
                            "referenceEpoch": "2024-03-15T10:00:00Z",
                            "validTimeRange": {
                                "startTime": "2024-03-15T10:00:00Z",
                                "endTime": "2024-03-15T10:15:00Z",
                            },
                            "azElList": [
                                {"dt": 0.0, "az": 45.0, "el": 10.0},
                                {"dt": 180.0, "az": 50.0, "el": 15.0},
                                {"dt": 360.0, "az": 55.0, "el": 20.0},
                                {"dt": 540.0, "az": 60.0, "el": 25.0},
                                {"dt": 720.0, "az": 65.0, "el": 30.0},
                                {"dt": 900.0, "az": 70.0, "el": 35.0},
                            ],
                        }
                    ],
                }
            },
        }
    },
)

print(f"Created ephemeris with ID: {azimuth_elevation_ephemeris['ephemerisId']}")
```

 在本示例中：
+ 方位角高程数据与 “俄亥俄州 1” 地面站相关联
+ 角度以度为单位指定
+ 该片段涵盖了 15 分钟的时段
+ 这些`dt`值是相对于参考周期的原子秒偏移量
+ 提供六 azimuth/elevation 对（最少 5 对）

## 示例：从 S3 上传方位角高程数据
<a name="w2aac28c17c15c13"></a>

 对于较大的数据集，您可以从 S3 存储桶上传方位角高程数据：

```
import boto3
import json

# Create AWS clients
s3_client = boto3.client("s3")
ground_station_client = boto3.client("groundstation")

# Define S3 bucket and key
bucket_name = "azimuth-elevation-bucket"
object_key = "singapore-azimuth-elevation.json"

# Create sample azimuth elevation data
azimuth_elevation_data = {
    "angleUnit": "DEGREE_ANGLE",
    "azElSegmentList": [
        {
            "referenceEpoch": "2024-03-15T10:00:00Z",
            "validTimeRange": {
                "startTime": "2024-03-15T10:00:00Z",
                "endTime": "2024-03-15T10:15:00Z",
            },
            "azElList": [
                {"dt": 0.0, "az": 45.0, "el": 10.0},
                {"dt": 180.0, "az": 50.0, "el": 15.0},
                {"dt": 360.0, "az": 55.0, "el": 20.0},
                {"dt": 540.0, "az": 60.0, "el": 25.0},
                {"dt": 720.0, "az": 65.0, "el": 30.0},
                {"dt": 900.0, "az": 70.0, "el": 35.0},
            ],
        },
        {
            "referenceEpoch": "2024-03-15T10:15:00Z",
            "validTimeRange": {
                "startTime": "2024-03-15T10:15:00Z",
                "endTime": "2024-03-15T10:30:00Z",
            },
            "azElList": [
                {"dt": 0.0, "az": 70.0, "el": 35.0},
                {"dt": 180.0, "az": 75.0, "el": 40.0},
                {"dt": 360.0, "az": 80.0, "el": 45.0},
                {"dt": 540.0, "az": 85.0, "el": 50.0},
                {"dt": 720.0, "az": 90.0, "el": 55.0},
                {"dt": 900.0, "az": 95.0, "el": 50.0},
            ],
        },
    ],
}

# Upload sample data to S3
print(f"Uploading azimuth elevation data to s3://{bucket_name}/{object_key}")

s3_client.put_object(
    Bucket=bucket_name,
    Key=object_key,
    Body=json.dumps(azimuth_elevation_data, indent=2),
    ContentType="application/json",
)
print("Sample data uploaded successfully to S3")

# Create azimuth elevation ephemeris from S3
print("Creating azimuth elevation ephemeris from S3...")

s3_azimuth_elevation_ephemeris = ground_station_client.create_ephemeris(
    name="Large Azimuth Elevation Dataset",
    ephemeris={
        "azEl": {
            "groundStation": "Singapore 1",
            "data": {"s3Object": {"bucket": bucket_name, "key": object_key}},
        }
    },
)

print(f"Created ephemeris with ID: {s3_azimuth_elevation_ephemeris['ephemerisId']}")
```

 S3 对象应包含 JSON 结构，其方位角高程数据的格式与直接上传示例中所示的格式相同。

## 使用方位角仰角星历表保留联系人
<a name="w2aac28c17c15c15"></a>

 使用方位角仰角星历表预订联系人时，该过程与 TLE 和 OEM 星历表不同：

1. 使用创建方位角高程星历 [ CreateEphemeris ](https://docs.aws.amazon.com/ground-station/latest/APIReference/API_CreateEphemeris.html)

1. 等待星历达到状态 `ENABLED`

1. 使用追踪[ReserveContact](https://docs.aws.amazon.com/ground-station/latest/APIReference/API_ReserveContact.html)功能预留联系人

 使用方位角仰角星历表预约接触的示例：

```
import boto3
from datetime import datetime
import time

# Create AWS Ground Station client
ground_station_client = boto3.client("groundstation")

# First, create an azimuth elevation ephemeris
print("Creating azimuth elevation ephemeris...")

create_ephemeris_response = ground_station_client.create_ephemeris(
    name="Azimuth Elevation for Contact Reservation",
    ephemeris={
        "azEl": {
            "groundStation": "Ohio 1",
            "data": {
                "azElData": {
                    "angleUnit": "DEGREE_ANGLE",
                    "azElSegmentList": [
                        {
                            "referenceEpoch": "2024-03-15T10:00:00Z",
                            "validTimeRange": {
                                "startTime": "2024-03-15T10:00:00Z",
                                "endTime": "2024-03-15T10:15:00Z",
                            },
                            "azElList": [
                                {"dt": 0.0, "az": 45.0, "el": 10.0},
                                {"dt": 180.0, "az": 50.0, "el": 15.0},
                                {"dt": 360.0, "az": 55.0, "el": 20.0},
                                {"dt": 540.0, "az": 60.0, "el": 25.0},
                                {"dt": 720.0, "az": 65.0, "el": 30.0},
                                {"dt": 900.0, "az": 70.0, "el": 35.0},
                            ],
                        }
                    ],
                }
            },
        }
    },
)

ephemeris_id = create_ephemeris_response["ephemerisId"]
print(f"Created ephemeris with ID: {ephemeris_id}")

# Wait for ephemeris to become ENABLED
print("Waiting for ephemeris to become ENABLED...")

while True:
    status = ground_station_client.describe_ephemeris(ephemerisId=ephemeris_id)[
        "status"
    ]
    if status == "ENABLED":
        print("Ephemeris is ENABLED")
        break
    elif status in ["INVALID", "ERROR"]:
        raise RuntimeError(f"Ephemeris failed: {status}")
    time.sleep(5)

# Reserve contact with azimuth elevation ephemeris
print("Reserving contact...")

contact = ground_station_client.reserve_contact(
    # Note: satelliteArn is omitted when using azimuth elevation ephemeris
    missionProfileArn="arn:aws:groundstation:us-east-2:111122223333:mission-profile/example-mission-profile",
    groundStation="Ohio 1",
    startTime=datetime(2024, 3, 15, 10, 0, 0),
    endTime=datetime(2024, 3, 15, 10, 15, 0),
    trackingOverrides={"programTrackSettings": {"azEl": {"ephemerisId": ephemeris_id}}},
)

print(f"Reserved contact with ID: {contact['contactId']}")
```

**注意**  
 保留方位角仰角星历表的接触时可以省略该`satelliteArn`参数。在接触过程中，天线将遵循指定的方位角和仰角。

## 列出可用联系人
<a name="w2aac28c17c15c17"></a>

 使用方位角仰角星历表时，API 需要特定的参数：[ListContacts](https://docs.aws.amazon.com/ground-station/latest/APIReference/API_ListContacts.html)
+ 该`satelliteArn`参数可以从请求中省略
+ 必须提供具有方位角仰角星历 ID 的`ephemeris`参数，以指定要使用哪个星历
+ 当提供的方位角和仰角高于所请求地面[站的场地掩](https://docs.aws.amazon.com/ground-station/latest/ug/locations.site-masks.html)模时，可用的接触窗口将显示出来
+ 您仍必须提供`groundStation`和 `missionProfileArn`

 创建方位角仰角星历表并列出可用联系人的示例：

```
import boto3
from datetime import datetime, timezone
import time

# Create AWS Ground Station client
ground_station_client = boto3.client("groundstation")

# Step 1: Create azimuth elevation ephemeris
print("Creating azimuth elevation ephemeris...")
ephemeris_response = ground_station_client.create_ephemeris(
    name="Stockholm AzEl Ephemeris",
    ephemeris={
        "azEl": {
            "groundStation": "Stockholm 1",
            "data": {
                "azElData": {
                    "angleUnit": "DEGREE_ANGLE",
                    "azElSegmentList": [
                        {
                            "referenceEpoch": "2024-04-01T12:00:00Z",
                            "validTimeRange": {
                                "startTime": "2024-04-01T12:00:00Z",
                                "endTime": "2024-04-01T12:30:00Z",
                            },
                            "azElList": [
                                {"dt": 0.0, "az": 30.0, "el": 15.0},
                                {"dt": 360.0, "az": 45.0, "el": 30.0},
                                {"dt": 720.0, "az": 60.0, "el": 45.0},
                                {"dt": 1080.0, "az": 75.0, "el": 35.0},
                                {"dt": 1440.0, "az": 90.0, "el": 20.0},
                                {"dt": 1800.0, "az": 105.0, "el": 10.0},
                            ],
                        }
                    ],
                }
            },
        }
    },
)

ephemeris_id = ephemeris_response["ephemerisId"]
print(f"Created ephemeris: {ephemeris_id}")

# Step 2: Wait for ephemeris to become ENABLED
print("Waiting for ephemeris to become ENABLED...")
while True:
    describe_response = ground_station_client.describe_ephemeris(
        ephemerisId=ephemeris_id
    )
    status = describe_response["status"]

    if status == "ENABLED":
        print("Ephemeris is ENABLED")
        break
    elif status in ["INVALID", "ERROR"]:
        # Check for validation errors
        if "invalidReason" in describe_response:
            print(f"Ephemeris validation failed: {describe_response['invalidReason']}")
        raise RuntimeError(f"Ephemeris failed with status: {status}")

    print(f"Current status: {status}, waiting...")
    time.sleep(5)

# Step 3: List available contacts using the azimuth elevation ephemeris
print("Listing available contacts with azimuth elevation ephemeris...")

# Convert epoch timestamps to datetime objects
start_time = datetime.fromtimestamp(1760710513, tz=timezone.utc)
end_time = datetime.fromtimestamp(1760883313, tz=timezone.utc)

contacts_response = ground_station_client.list_contacts(
    startTime=start_time,
    endTime=end_time,
    groundStation="Stockholm 1",
    statusList=["AVAILABLE"],
    ephemeris={"azEl": {"id": ephemeris_id}},
    # satelliteArn is optional
    satelliteArn="arn:aws:groundstation::111122223333:satellite/a88611b0-f755-404e-b60d-57d8aEXAMPLE",
    missionProfileArn="arn:aws:groundstation:eu-north-1:111122223333:mission-profile/966b72f6-6d82-4e7e-b072-f8240EXAMPLE",
)

# Process the results
if contacts_response["contactList"]:
    print(f"Found {len(contacts_response['contactList'])} available contacts:")
    for contact in contacts_response["contactList"]:
        print(f"  - Contact from {contact['startTime']} to {contact['endTime']}")
        print(
            f"    Max elevation: {contact.get('maximumElevation', {}).get('value', 'N/A')}°"
        )
else:
    print("No available contacts found for the specified azimuth elevation ephemeris")
```

**注意**  
 列出联系人时必须提供具有方位角仰角 ID 的`ephemeris`参数，以指定应使用哪个方位角仰角星历表来确定接触窗口。如果包括`satelliteArn`在内，它将与联系数据相关联，但方位角仰角星历表将用于天线指向，而不是执行星历优先分辨率。