text:
# This file is auto-generated by AWSMetadata.jl
using AWS
using AWS.AWSServices: location
using AWS.Compat
using AWS.UUIDs

"""
    associate_tracker_consumer(consumer_arn, tracker_name)
    associate_tracker_consumer(consumer_arn, tracker_name, params::Dict{String,<:Any})

Creates an association between a geofence collection and a tracker resource. This allows
the tracker resource to communicate location data to the linked geofence collection.  You
can associate up to five geofence collections to each tracker resource.  Currently not
supported — Cross-account configurations, such as creating associations between a tracker
resource in one account and a geofence collection in another account.

# Arguments
- `consumer_arn`: The Amazon Resource Name (ARN) for the geofence collection to be
  associated to tracker resource. Used when you need to specify a resource across all AWS.
  Format example:
  arn:aws:geo:region:account-id:geofence-collection/ExampleGeofenceCollectionConsumer
- `tracker_name`: The name of the tracker resource to be associated with a geofence
  collection.

"""
function associate_tracker_consumer(
    ConsumerArn, TrackerName; aws_config::AbstractAWSConfig=global_aws_config()
)
    return location(
        "POST",
        "/tracking/v0/trackers/$(TrackerName)/consumers",
        Dict{String,Any}("ConsumerArn" => ConsumerArn);
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end
function associate_tracker_consumer(
    ConsumerArn,
    TrackerName,
    params::AbstractDict{String};
    aws_config::AbstractAWSConfig=global_aws_config(),
)
    return location(
        "POST",
        "/tracking/v0/trackers/$(TrackerName)/consumers",
        Dict{String,Any}(
            mergewith(_merge, Dict{String,Any}("ConsumerArn" => ConsumerArn), params)
        );
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end

"""
    batch_delete_device_position_history(device_ids, tracker_name)
    batch_delete_device_position_history(device_ids, tracker_name, params::Dict{String,<:Any})

Deletes the position history of one or more devices from a tracker resource.

# Arguments
- `device_ids`: Devices whose position history you want to delete.   For example, for two
  devices: “DeviceIds” : [DeviceId1,DeviceId2]
- `tracker_name`: The name of the tracker resource to delete the device position history
  from.

"""
function batch_delete_device_position_history(
    DeviceIds, TrackerName; aws_config::AbstractAWSConfig=global_aws_config()
)
    return location(
        "POST",
        "/tracking/v0/trackers/$(TrackerName)/delete-positions",
        Dict{String,Any}("DeviceIds" => DeviceIds);
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end
function batch_delete_device_position_history(
    DeviceIds,
    TrackerName,
    params::AbstractDict{String};
    aws_config::AbstractAWSConfig=global_aws_config(),
)
    return location(
        "POST",
        "/tracking/v0/trackers/$(TrackerName)/delete-positions",
        Dict{String,Any}(
            mergewith(_merge, Dict{String,Any}("DeviceIds" => DeviceIds), params)
        );
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end

"""
    batch_delete_geofence(collection_name, geofence_ids)
    batch_delete_geofence(collection_name, geofence_ids, params::Dict{String,<:Any})

Deletes a batch of geofences from a geofence collection.  This operation deletes the
resource permanently.

# Arguments
- `collection_name`: The geofence collection storing the geofences to be deleted.
- `geofence_ids`: The batch of geofences to be deleted.

"""
function batch_delete_geofence(
    CollectionName, GeofenceIds; aws_config::AbstractAWSConfig=global_aws_config()
)
    return location(
        "POST",
        "/geofencing/v0/collections/$(CollectionName)/delete-geofences",
        Dict{String,Any}("GeofenceIds" => GeofenceIds);
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end
function batch_delete_geofence(
    CollectionName,
    GeofenceIds,
    params::AbstractDict{String};
    aws_config::AbstractAWSConfig=global_aws_config(),
)
    return location(
        "POST",
        "/geofencing/v0/collections/$(CollectionName)/delete-geofences",
        Dict{String,Any}(
            mergewith(_merge, Dict{String,Any}("GeofenceIds" => GeofenceIds), params)
        );
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end

"""
    batch_evaluate_geofences(collection_name, device_position_updates)
    batch_evaluate_geofences(collection_name, device_position_updates, params::Dict{String,<:Any})

Evaluates device positions against the geofence geometries from a given geofence
collection. This operation always returns an empty response because geofences are
asynchronously evaluated. The evaluation determines if the device has entered or exited a
geofenced area, and then publishes one of the following events to Amazon EventBridge:
ENTER if Amazon Location determines that the tracked device has entered a geofenced area.
 EXIT if Amazon Location determines that the tracked device has exited a geofenced area.
The last geofence that a device was observed within is tracked for 30 days after the most
recent device position update.   Geofence evaluation uses the given device position. It
does not account for the optional Accuracy of a DevicePositionUpdate.

# Arguments
- `collection_name`: The geofence collection used in evaluating the position of devices
  against its geofences.
- `device_position_updates`: Contains device details for each device to be evaluated
  against the given geofence collection.

"""
function batch_evaluate_geofences(
    CollectionName, DevicePositionUpdates; aws_config::AbstractAWSConfig=global_aws_config()
)
    return location(
        "POST",
        "/geofencing/v0/collections/$(CollectionName)/positions",
        Dict{String,Any}("DevicePositionUpdates" => DevicePositionUpdates);
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end
function batch_evaluate_geofences(
    CollectionName,
    DevicePositionUpdates,
    params::AbstractDict{String};
    aws_config::AbstractAWSConfig=global_aws_config(),
)
    return location(
        "POST",
        "/geofencing/v0/collections/$(CollectionName)/positions",
        Dict{String,Any}(
            mergewith(
                _merge,
                Dict{String,Any}("DevicePositionUpdates" => DevicePositionUpdates),
                params,
            ),
        );
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end

"""
    batch_get_device_position(device_ids, tracker_name)
    batch_get_device_position(device_ids, tracker_name, params::Dict{String,<:Any})

Lists the latest device positions for requested devices.

# Arguments
- `device_ids`: Devices whose position you want to retrieve.   For example, for two
  devices: device-ids=DeviceId1&device-ids=DeviceId2
- `tracker_name`: The tracker resource retrieving the device position.

"""
function batch_get_device_position(
    DeviceIds, TrackerName; aws_config::AbstractAWSConfig=global_aws_config()
)
    return location(
        "POST",
        "/tracking/v0/trackers/$(TrackerName)/get-positions",
        Dict{String,Any}("DeviceIds" => DeviceIds);
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end
function batch_get_device_position(
    DeviceIds,
    TrackerName,
    params::AbstractDict{String};
    aws_config::AbstractAWSConfig=global_aws_config(),
)
    return location(
        "POST",
        "/tracking/v0/trackers/$(TrackerName)/get-positions",
        Dict{String,Any}(
            mergewith(_merge, Dict{String,Any}("DeviceIds" => DeviceIds), params)
        );
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end

"""
    batch_put_geofence(collection_name, entries)
    batch_put_geofence(collection_name, entries, params::Dict{String,<:Any})

A batch request for storing geofence geometries into a given geofence collection, or
updates the geometry of an existing geofence if a geofence ID is included in the request.

# Arguments
- `collection_name`: The geofence collection storing the geofences.
- `entries`: The batch of geofences to be stored in a geofence collection.

"""
function batch_put_geofence(
    CollectionName, Entries; aws_config::AbstractAWSConfig=global_aws_config()
)
    return location(
        "POST",
        "/geofencing/v0/collections/$(CollectionName)/put-geofences",
        Dict{String,Any}("Entries" => Entries);
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end
function batch_put_geofence(
    CollectionName,
    Entries,
    params::AbstractDict{String};
    aws_config::AbstractAWSConfig=global_aws_config(),
)
    return location(
        "POST",
        "/geofencing/v0/collections/$(CollectionName)/put-geofences",
        Dict{String,Any}(mergewith(_merge, Dict{String,Any}("Entries" => Entries), params));
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end

"""
    batch_update_device_position(tracker_name, updates)
    batch_update_device_position(tracker_name, updates, params::Dict{String,<:Any})

Uploads position update data for one or more devices to a tracker resource. Amazon Location
uses the data when it reports the last known device position and position history. Amazon
Location retains location data for 30 days.  Position updates are handled based on the
PositionFiltering property of the tracker. When PositionFiltering is set to TimeBased,
updates are evaluated against linked geofence collections, and location data is stored at a
maximum of one position per 30 second interval. If your update frequency is more often than
every 30 seconds, only one update per 30 seconds is stored for each unique device ID. When
PositionFiltering is set to DistanceBased filtering, location data is stored and evaluated
against linked geofence collections only if the device has moved more than 30 m (98.4 ft).
When PositionFiltering is set to AccuracyBased filtering, location data is stored and
evaluated against linked geofence collections only if the device has moved more than the
measured accuracy. For example, if two consecutive updates from a device have a horizontal
accuracy of 5 m and 10 m, the second update is neither stored or evaluated if the device
has moved less than 15 m. If PositionFiltering is set to AccuracyBased filtering, Amazon
Location uses the default value { \"Horizontal\": 0} when accuracy is not provided on a
DevicePositionUpdate.

# Arguments
- `tracker_name`: The name of the tracker resource to update.
- `updates`: Contains the position update details for each device.

"""
function batch_update_device_position(
    TrackerName, Updates; aws_config::AbstractAWSConfig=global_aws_config()
)
    return location(
        "POST",
        "/tracking/v0/trackers/$(TrackerName)/positions",
        Dict{String,Any}("Updates" => Updates);
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end
function batch_update_device_position(
    TrackerName,
    Updates,
    params::AbstractDict{String};
    aws_config::AbstractAWSConfig=global_aws_config(),
)
    return location(
        "POST",
        "/tracking/v0/trackers/$(TrackerName)/positions",
        Dict{String,Any}(mergewith(_merge, Dict{String,Any}("Updates" => Updates), params));
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end

"""
    calculate_route(calculator_name, departure_position, destination_position)
    calculate_route(calculator_name, departure_position, destination_position, params::Dict{String,<:Any})

 Calculates a route given the following required parameters: DeparturePostiton and
DestinationPosition. Requires that you first create a route calculator resource. By
default, a request that doesn't specify a departure time uses the best time of day to
travel with the best traffic conditions when calculating the route. Additional options
include:    Specifying a departure time using either DepartureTime or DepartureNow. This
calculates a route based on predictive traffic data at the given time.   You can't specify
both DepartureTime and DepartureNow in a single request. Specifying both parameters returns
a validation error.     Specifying a travel mode using TravelMode. This lets you specify an
additional route preference such as CarModeOptions if traveling by Car, or TruckModeOptions
if traveling by Truck.

# Arguments
- `calculator_name`: The name of the route calculator resource that you want to use to
  calculate the route.
- `departure_position`: The start position for the route. Defined in WGS 84 format:
  [longitude, latitude].   For example, [-123.115, 49.285]     If you specify a departure
  that's not located on a road, Amazon Location moves the position to the nearest road. If
  Esri is the provider for your route calculator, specifying a route that is longer than 400
  km returns a 400 RoutesValidationException error.  Valid Values: [-180 to 180,-90 to 90]
- `destination_position`: The finish position for the route. Defined in WGS 84 format:
  [longitude, latitude].    For example, [-122.339, 47.615]     If you specify a destination
  that's not located on a road, Amazon Location moves the position to the nearest road.
  Valid Values: [-180 to 180,-90 to 90]

# Optional Parameters
Optional parameters can be passed as a `params::Dict{String,<:Any}`. Valid keys are:
- `"CarModeOptions"`: Specifies route preferences when traveling by Car, such as avoiding
  routes that use ferries or tolls. Requirements: TravelMode must be specified as Car.
- `"DepartNow"`: Sets the time of departure as the current time. Uses the current time to
  calculate a route. Otherwise, the best time of day to travel with the best traffic
  conditions is used to calculate the route. Default Value: false  Valid Values: false | true
- `"DepartureTime"`: Specifies the desired time of departure. Uses the given time to
  calculate the route. Otherwise, the best time of day to travel with the best traffic
  conditions is used to calculate the route.  Setting a departure time in the past returns a
  400 ValidationException error.    In ISO 8601 format: YYYY-MM-DDThh:mm:ss.sssZ. For
  example, 2020–07-2T12:15:20.000Z+01:00
- `"DistanceUnit"`: Set the unit system to specify the distance. Default Value: Kilometers
- `"IncludeLegGeometry"`: Set to include the geometry details in the result for each path
  between a pair of positions. Default Value: false  Valid Values: false | true
- `"TravelMode"`: Specifies the mode of transport when calculating a route. Used in
  estimating the speed of travel and road compatibility. The TravelMode you specify
  determines how you specify route preferences:    If traveling by Car use the CarModeOptions
  parameter.   If traveling by Truck use the TruckModeOptions parameter.   Default Value: Car
- `"TruckModeOptions"`: Specifies route preferences when traveling by Truck, such as
  avoiding routes that use ferries or tolls, and truck specifications to consider when
  choosing an optimal road. Requirements: TravelMode must be specified as Truck.
- `"WaypointPositions"`: Specifies an ordered list of up to 23 intermediate positions to
  include along a route between the departure position and destination position.    For
  example, from the DeparturePosition [-123.115, 49.285], the route follows the order that
  the waypoint positions are given [[-122.757, 49.0021],[-122.349, 47.620]]     If you
  specify a waypoint position that's not located on a road, Amazon Location moves the
  position to the nearest road.  Specifying more than 23 waypoints returns a 400
  ValidationException error. If Esri is the provider for your route calculator, specifying a
  route that is longer than 400 km returns a 400 RoutesValidationException error.  Valid
  Values: [-180 to 180,-90 to 90]
"""
function calculate_route(
    CalculatorName,
    DeparturePosition,
    DestinationPosition;
    aws_config::AbstractAWSConfig=global_aws_config(),
)
    return location(
        "POST",
        "/routes/v0/calculators/$(CalculatorName)/calculate/route",
        Dict{String,Any}(
            "DeparturePosition" => DeparturePosition,
            "DestinationPosition" => DestinationPosition,
        );
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end
function calculate_route(
    CalculatorName,
    DeparturePosition,
    DestinationPosition,
    params::AbstractDict{String};
    aws_config::AbstractAWSConfig=global_aws_config(),
)
    return location(
        "POST",
        "/routes/v0/calculators/$(CalculatorName)/calculate/route",
        Dict{String,Any}(
            mergewith(
                _merge,
                Dict{String,Any}(
                    "DeparturePosition" => DeparturePosition,
                    "DestinationPosition" => DestinationPosition,
                ),
                params,
            ),
        );
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end

"""
    create_geofence_collection(collection_name)
    create_geofence_collection(collection_name, params::Dict{String,<:Any})

Creates a geofence collection, which manages and stores geofences.

# Arguments
- `collection_name`: A custom name for the geofence collection. Requirements:   Contain
  only alphanumeric characters (A–Z, a–z, 0–9), hyphens (-), periods (.), and
  underscores (_).    Must be a unique geofence collection name.   No spaces allowed. For
  example, ExampleGeofenceCollection.

# Optional Parameters
Optional parameters can be passed as a `params::Dict{String,<:Any}`. Valid keys are:
- `"Description"`: An optional description for the geofence collection.
- `"KmsKeyId"`: A key identifier for an AWS KMS customer managed key. Enter a key ID, key
  ARN, alias name, or alias ARN.
- `"PricingPlan"`: Optionally specifies the pricing plan for the geofence collection.
  Defaults to RequestBasedUsage. For additional details and restrictions on each pricing plan
  option, see the Amazon Location Service pricing page.
- `"PricingPlanDataSource"`: Specifies the data provider for the geofence collection.
  Required value for the following pricing plans: MobileAssetTracking | MobileAssetManagement
     For more information about Data Providers, and Pricing plans, see the Amazon Location
  Service product page.  Amazon Location Service only uses PricingPlanDataSource to calculate
  billing for your geofence collection. Your data won't be shared with the data provider, and
  will remain in your AWS account or Region unless you move it.  Valid Values: Esri | Here
- `"Tags"`: Applies one or more tags to the geofence collection. A tag is a key-value pair
  helps manage, identify, search, and filter your resources by labelling them. Format:
  \"key\" : \"value\"  Restrictions:   Maximum 50 tags per resource   Each resource tag must
  be unique with a maximum of one value.   Maximum key length: 128 Unicode characters in
  UTF-8   Maximum value length: 256 Unicode characters in UTF-8   Can use alphanumeric
  characters (A–Z, a–z, 0–9), and the following characters: + - = . _ : / @.    Cannot
  use \"aws:\" as a prefix for a key.
"""
function create_geofence_collection(
    CollectionName; aws_config::AbstractAWSConfig=global_aws_config()
)
    return location(
        "POST",
        "/geofencing/v0/collections",
        Dict{String,Any}("CollectionName" => CollectionName);
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end
function create_geofence_collection(
    CollectionName,
    params::AbstractDict{String};
    aws_config::AbstractAWSConfig=global_aws_config(),
)
    return location(
        "POST",
        "/geofencing/v0/collections",
        Dict{String,Any}(
            mergewith(_merge, Dict{String,Any}("CollectionName" => CollectionName), params)
        );
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end

"""
    create_map(configuration, map_name)
    create_map(configuration, map_name, params::Dict{String,<:Any})

Creates a map resource in your AWS account, which provides map tiles of different styles
sourced from global location data providers.

# Arguments
- `configuration`: Specifies the map style selected from an available data provider.
- `map_name`: The name for the map resource. Requirements:   Must contain only alphanumeric
  characters (A–Z, a–z, 0–9), hyphens (-), periods (.), and underscores (_).    Must be
  a unique map resource name.    No spaces allowed. For example, ExampleMap.

# Optional Parameters
Optional parameters can be passed as a `params::Dict{String,<:Any}`. Valid keys are:
- `"Description"`: An optional description for the map resource.
- `"PricingPlan"`: Optionally specifies the pricing plan for the map resource. Defaults to
  RequestBasedUsage. For additional details and restrictions on each pricing plan option, see
  Amazon Location Service pricing.
- `"Tags"`: Applies one or more tags to the map resource. A tag is a key-value pair helps
  manage, identify, search, and filter your resources by labelling them. Format: \"key\" :
  \"value\"  Restrictions:   Maximum 50 tags per resource   Each resource tag must be unique
  with a maximum of one value.   Maximum key length: 128 Unicode characters in UTF-8
  Maximum value length: 256 Unicode characters in UTF-8   Can use alphanumeric characters
  (A–Z, a–z, 0–9), and the following characters: + - = . _ : / @.    Cannot use
  \"aws:\" as a prefix for a key.
"""
function create_map(
    Configuration, MapName; aws_config::AbstractAWSConfig=global_aws_config()
)
    return location(
        "POST",
        "/maps/v0/maps",
        Dict{String,Any}("Configuration" => Configuration, "MapName" => MapName);
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end
function create_map(
    Configuration,
    MapName,
    params::AbstractDict{String};
    aws_config::AbstractAWSConfig=global_aws_config(),
)
    return location(
        "POST",
        "/maps/v0/maps",
        Dict{String,Any}(
            mergewith(
                _merge,
                Dict{String,Any}("Configuration" => Configuration, "MapName" => MapName),
                params,
            ),
        );
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end

"""
    create_place_index(data_source, index_name)
    create_place_index(data_source, index_name, params::Dict{String,<:Any})

Creates a place index resource in your AWS account. Use a place index resource to geocode
addresses and other text queries by using the SearchPlaceIndexForText operation, and
reverse geocode coordinates by using the SearchPlaceIndexForPosition operation, and enable
autosuggestions by using the SearchPlaceIndexForSuggestions operation.

# Arguments
- `data_source`: Specifies the geospatial data provider for the new place index.  This
  field is case-sensitive. Enter the valid values as shown. For example, entering HERE
  returns an error.  Valid values include:    Esri – For additional information about
  Esri's coverage in your region of interest, see Esri details on geocoding coverage.    Here
  – For additional information about HERE Technologies' coverage in your region of
  interest, see HERE details on goecoding coverage.  If you specify HERE Technologies (Here)
  as the data provider, you may not store results for locations in Japan. For more
  information, see the AWS Service Terms for Amazon Location Service.    For additional
  information , see Data providers on the Amazon Location Service Developer Guide.
- `index_name`: The name of the place index resource.  Requirements:   Contain only
  alphanumeric characters (A–Z, a–z, 0–9), hyphens (-), periods (.), and underscores
  (_).   Must be a unique place index resource name.   No spaces allowed. For example,
  ExamplePlaceIndex.

# Optional Parameters
Optional parameters can be passed as a `params::Dict{String,<:Any}`. Valid keys are:
- `"DataSourceConfiguration"`: Specifies the data storage option requesting Places.
- `"Description"`: The optional description for the place index resource.
- `"PricingPlan"`: Optionally specifies the pricing plan for the place index resource.
  Defaults to RequestBasedUsage. For additional details and restrictions on each pricing plan
  option, see Amazon Location Service pricing.
- `"Tags"`: Applies one or more tags to the place index resource. A tag is a key-value pair
  that helps you manage, identify, search, and filter your resources. Format: \"key\" :
  \"value\"  Restrictions:   Maximum 50 tags per resource.   Each tag key must be unique and
  must have exactly one associated value.   Maximum key length: 128 Unicode characters in
  UTF-8.   Maximum value length: 256 Unicode characters in UTF-8.   Can use alphanumeric
  characters (A–Z, a–z, 0–9), and the following characters: + - = . _ : / @   Cannot
  use \"aws:\" as a prefix for a key.
"""
function create_place_index(
    DataSource, IndexName; aws_config::AbstractAWSConfig=global_aws_config()
)
    return location(
        "POST",
        "/places/v0/indexes",
        Dict{String,Any}("DataSource" => DataSource, "IndexName" => IndexName);
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end
function create_place_index(
    DataSource,
    IndexName,
    params::AbstractDict{String};
    aws_config::AbstractAWSConfig=global_aws_config(),
)
    return location(
        "POST",
        "/places/v0/indexes",
        Dict{String,Any}(
            mergewith(
                _merge,
                Dict{String,Any}("DataSource" => DataSource, "IndexName" => IndexName),
                params,
            ),
        );
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end

"""
    create_route_calculator(calculator_name, data_source)
    create_route_calculator(calculator_name, data_source, params::Dict{String,<:Any})

Creates a route calculator resource in your AWS account. You can send requests to a route
calculator resource to estimate travel time, distance, and get directions. A route
calculator sources traffic and road network data from your chosen data provider.

# Arguments
- `calculator_name`: The name of the route calculator resource.  Requirements:   Can use
  alphanumeric characters (A–Z, a–z, 0–9) , hyphens (-), periods (.), and underscores
  (_).   Must be a unique Route calculator resource name.   No spaces allowed. For example,
  ExampleRouteCalculator.
- `data_source`: Specifies the data provider of traffic and road network data.  This field
  is case-sensitive. Enter the valid values as shown. For example, entering HERE returns an
  error. Route calculators that use Esri as a data source only calculate routes that are
  shorter than 400 km.  Valid values include:    Esri – For additional information about
  Esri's coverage in your region of interest, see Esri details on street networks and traffic
  coverage.    Here – For additional information about HERE Technologies' coverage in your
  region of interest, see HERE car routing coverage and HERE truck routing coverage.   For
  additional information , see Data providers on the Amazon Location Service Developer Guide.

# Optional Parameters
Optional parameters can be passed as a `params::Dict{String,<:Any}`. Valid keys are:
- `"Description"`: The optional description for the route calculator resource.
- `"PricingPlan"`: Optionally specifies the pricing plan for the route calculator resource.
  Defaults to RequestBasedUsage. For additional details and restrictions on each pricing plan
  option, see Amazon Location Service pricing.
- `"Tags"`: Applies one or more tags to the route calculator resource. A tag is a key-value
  pair helps manage, identify, search, and filter your resources by labelling them.   For
  example: { \"tag1\" : \"value1\", \"tag2\" : \"value2\"}   Format: \"key\" : \"value\"
  Restrictions:   Maximum 50 tags per resource   Each resource tag must be unique with a
  maximum of one value.   Maximum key length: 128 Unicode characters in UTF-8   Maximum value
  length: 256 Unicode characters in UTF-8   Can use alphanumeric characters (A–Z, a–z,
  0–9), and the following characters: + - = . _ : / @.    Cannot use \"aws:\" as a prefix
  for a key.
"""
function create_route_calculator(
    CalculatorName, DataSource; aws_config::AbstractAWSConfig=global_aws_config()
)
    return location(
        "POST",
        "/routes/v0/calculators",
        Dict{String,Any}("CalculatorName" => CalculatorName, "DataSource" => DataSource);
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end
function create_route_calculator(
    CalculatorName,
    DataSource,
    params::AbstractDict{String};
    aws_config::AbstractAWSConfig=global_aws_config(),
)
    return location(
        "POST",
        "/routes/v0/calculators",
        Dict{String,Any}(
            mergewith(
                _merge,
                Dict{String,Any}(
                    "CalculatorName" => CalculatorName, "DataSource" => DataSource
                ),
                params,
            ),
        );
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end

"""
    create_tracker(tracker_name)
    create_tracker(tracker_name, params::Dict{String,<:Any})

Creates a tracker resource in your AWS account, which lets you retrieve current and
historical location of devices.

# Arguments
- `tracker_name`: The name for the tracker resource. Requirements:   Contain only
  alphanumeric characters (A-Z, a-z, 0-9) , hyphens (-), periods (.), and underscores (_).
  Must be a unique tracker resource name.   No spaces allowed. For example, ExampleTracker.

# Optional Parameters
Optional parameters can be passed as a `params::Dict{String,<:Any}`. Valid keys are:
- `"Description"`: An optional description for the tracker resource.
- `"KmsKeyId"`: A key identifier for an AWS KMS customer managed key. Enter a key ID, key
  ARN, alias name, or alias ARN.
- `"PositionFiltering"`: Specifies the position filtering for the tracker resource. Valid
  values:    TimeBased - Location updates are evaluated against linked geofence collections,
  but not every location update is stored. If your update frequency is more often than 30
  seconds, only one update per 30 seconds is stored for each unique device ID.
  DistanceBased - If the device has moved less than 30 m (98.4 ft), location updates are
  ignored. Location updates within this area are neither evaluated against linked geofence
  collections, nor stored. This helps control costs by reducing the number of geofence
  evaluations and historical device positions to paginate through. Distance-based filtering
  can also reduce the effects of GPS noise when displaying device trajectories on a map.
  AccuracyBased - If the device has moved less than the measured accuracy, location updates
  are ignored. For example, if two consecutive updates from a device have a horizontal
  accuracy of 5 m and 10 m, the second update is ignored if the device has moved less than 15
  m. Ignored location updates are neither evaluated against linked geofence collections, nor
  stored. This can reduce the effects of GPS noise when displaying device trajectories on a
  map, and can help control your costs by reducing the number of geofence evaluations.
  This field is optional. If not specified, the default value is TimeBased.
- `"PricingPlan"`: Optionally specifies the pricing plan for the tracker resource. Defaults
  to RequestBasedUsage. For additional details and restrictions on each pricing plan option,
  see Amazon Location Service pricing.
- `"PricingPlanDataSource"`: Specifies the data provider for the tracker resource.
  Required value for the following pricing plans: MobileAssetTracking | MobileAssetManagement
     For more information about Data Providers, and Pricing plans, see the Amazon Location
  Service product page.  Amazon Location Service only uses PricingPlanDataSource to calculate
  billing for your tracker resource. Your data will not be shared with the data provider, and
  will remain in your AWS account or Region unless you move it.  Valid values: Esri | Here
- `"Tags"`: Applies one or more tags to the tracker resource. A tag is a key-value pair
  helps manage, identify, search, and filter your resources by labelling them. Format:
  \"key\" : \"value\"  Restrictions:   Maximum 50 tags per resource   Each resource tag must
  be unique with a maximum of one value.   Maximum key length: 128 Unicode characters in
  UTF-8   Maximum value length: 256 Unicode characters in UTF-8   Can use alphanumeric
  characters (A–Z, a–z, 0–9), and the following characters: + - = . _ : / @.    Cannot
  use \"aws:\" as a prefix for a key.
"""
function create_tracker(TrackerName; aws_config::AbstractAWSConfig=global_aws_config())
    return location(
        "POST",
        "/tracking/v0/trackers",
        Dict{String,Any}("TrackerName" => TrackerName);
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end
function create_tracker(
    TrackerName,
    params::AbstractDict{String};
    aws_config::AbstractAWSConfig=global_aws_config(),
)
    return location(
        "POST",
        "/tracking/v0/trackers",
        Dict{String,Any}(
            mergewith(_merge, Dict{String,Any}("TrackerName" => TrackerName), params)
        );
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end

"""
    delete_geofence_collection(collection_name)
    delete_geofence_collection(collection_name, params::Dict{String,<:Any})

Deletes a geofence collection from your AWS account.  This operation deletes the resource
permanently. If the geofence collection is the target of a tracker resource, the devices
will no longer be monitored.

# Arguments
- `collection_name`: The name of the geofence collection to be deleted.

"""
function delete_geofence_collection(
    CollectionName; aws_config::AbstractAWSConfig=global_aws_config()
)
    return location(
        "DELETE",
        "/geofencing/v0/collections/$(CollectionName)";
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end
function delete_geofence_collection(
    CollectionName,
    params::AbstractDict{String};
    aws_config::AbstractAWSConfig=global_aws_config(),
)
    return location(
        "DELETE",
        "/geofencing/v0/collections/$(CollectionName)",
        params;
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end

"""
    delete_map(map_name)
    delete_map(map_name, params::Dict{String,<:Any})

Deletes a map resource from your AWS account.  This operation deletes the resource
permanently. If the map is being used in an application, the map may not render.

# Arguments
- `map_name`: The name of the map resource to be deleted.

"""
function delete_map(MapName; aws_config::AbstractAWSConfig=global_aws_config())
    return location(
        "DELETE",
        "/maps/v0/maps/$(MapName)";
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end
function delete_map(
    MapName, params::AbstractDict{String}; aws_config::AbstractAWSConfig=global_aws_config()
)
    return location(
        "DELETE",
        "/maps/v0/maps/$(MapName)",
        params;
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end

"""
    delete_place_index(index_name)
    delete_place_index(index_name, params::Dict{String,<:Any})

Deletes a place index resource from your AWS account.  This operation deletes the resource
permanently.

# Arguments
- `index_name`: The name of the place index resource to be deleted.

"""
function delete_place_index(IndexName; aws_config::AbstractAWSConfig=global_aws_config())
    return location(
        "DELETE",
        "/places/v0/indexes/$(IndexName)";
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end
function delete_place_index(
    IndexName,
    params::AbstractDict{String};
    aws_config::AbstractAWSConfig=global_aws_config(),
)
    return location(
        "DELETE",
        "/places/v0/indexes/$(IndexName)",
        params;
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end

"""
    delete_route_calculator(calculator_name)
    delete_route_calculator(calculator_name, params::Dict{String,<:Any})

Deletes a route calculator resource from your AWS account.  This operation deletes the
resource permanently.

# Arguments
- `calculator_name`: The name of the route calculator resource to be deleted.

"""
function delete_route_calculator(
    CalculatorName; aws_config::AbstractAWSConfig=global_aws_config()
)
    return location(
        "DELETE",
        "/routes/v0/calculators/$(CalculatorName)";
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end
function delete_route_calculator(
    CalculatorName,
    params::AbstractDict{String};
    aws_config::AbstractAWSConfig=global_aws_config(),
)
    return location(
        "DELETE",
        "/routes/v0/calculators/$(CalculatorName)",
        params;
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end

"""
    delete_tracker(tracker_name)
    delete_tracker(tracker_name, params::Dict{String,<:Any})

Deletes a tracker resource from your AWS account.  This operation deletes the resource
permanently. If the tracker resource is in use, you may encounter an error. Make sure that
the target resource isn't a dependency for your applications.

# Arguments
- `tracker_name`: The name of the tracker resource to be deleted.

"""
function delete_tracker(TrackerName; aws_config::AbstractAWSConfig=global_aws_config())
    return location(
        "DELETE",
        "/tracking/v0/trackers/$(TrackerName)";
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end
function delete_tracker(
    TrackerName,
    params::AbstractDict{String};
    aws_config::AbstractAWSConfig=global_aws_config(),
)
    return location(
        "DELETE",
        "/tracking/v0/trackers/$(TrackerName)",
        params;
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end

"""
    describe_geofence_collection(collection_name)
    describe_geofence_collection(collection_name, params::Dict{String,<:Any})

Retrieves the geofence collection details.

# Arguments
- `collection_name`: The name of the geofence collection.

"""
function describe_geofence_collection(
    CollectionName; aws_config::AbstractAWSConfig=global_aws_config()
)
    return location(
        "GET",
        "/geofencing/v0/collections/$(CollectionName)";
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end
function describe_geofence_collection(
    CollectionName,
    params::AbstractDict{String};
    aws_config::AbstractAWSConfig=global_aws_config(),
)
    return location(
        "GET",
        "/geofencing/v0/collections/$(CollectionName)",
        params;
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end

"""
    describe_map(map_name)
    describe_map(map_name, params::Dict{String,<:Any})

Retrieves the map resource details.

# Arguments
- `map_name`: The name of the map resource.

"""
function describe_map(MapName; aws_config::AbstractAWSConfig=global_aws_config())
    return location(
        "GET",
        "/maps/v0/maps/$(MapName)";
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end
function describe_map(
    MapName, params::AbstractDict{String}; aws_config::AbstractAWSConfig=global_aws_config()
)
    return location(
        "GET",
        "/maps/v0/maps/$(MapName)",
        params;
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end

"""
    describe_place_index(index_name)
    describe_place_index(index_name, params::Dict{String,<:Any})

Retrieves the place index resource details.

# Arguments
- `index_name`: The name of the place index resource.

"""
function describe_place_index(IndexName; aws_config::AbstractAWSConfig=global_aws_config())
    return location(
        "GET",
        "/places/v0/indexes/$(IndexName)";
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end
function describe_place_index(
    IndexName,
    params::AbstractDict{String};
    aws_config::AbstractAWSConfig=global_aws_config(),
)
    return location(
        "GET",
        "/places/v0/indexes/$(IndexName)",
        params;
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end

"""
    describe_route_calculator(calculator_name)
    describe_route_calculator(calculator_name, params::Dict{String,<:Any})

Retrieves the route calculator resource details.

# Arguments
- `calculator_name`: The name of the route calculator resource.

"""
function describe_route_calculator(
    CalculatorName; aws_config::AbstractAWSConfig=global_aws_config()
)
    return location(
        "GET",
        "/routes/v0/calculators/$(CalculatorName)";
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end
function describe_route_calculator(
    CalculatorName,
    params::AbstractDict{String};
    aws_config::AbstractAWSConfig=global_aws_config(),
)
    return location(
        "GET",
        "/routes/v0/calculators/$(CalculatorName)",
        params;
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end

"""
    describe_tracker(tracker_name)
    describe_tracker(tracker_name, params::Dict{String,<:Any})

Retrieves the tracker resource details.

# Arguments
- `tracker_name`: The name of the tracker resource.

"""
function describe_tracker(TrackerName; aws_config::AbstractAWSConfig=global_aws_config())
    return location(
        "GET",
        "/tracking/v0/trackers/$(TrackerName)";
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end
function describe_tracker(
    TrackerName,
    params::AbstractDict{String};
    aws_config::AbstractAWSConfig=global_aws_config(),
)
    return location(
        "GET",
        "/tracking/v0/trackers/$(TrackerName)",
        params;
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end

"""
    disassociate_tracker_consumer(consumer_arn, tracker_name)
    disassociate_tracker_consumer(consumer_arn, tracker_name, params::Dict{String,<:Any})

Removes the association between a tracker resource and a geofence collection.  Once you
unlink a tracker resource from a geofence collection, the tracker positions will no longer
be automatically evaluated against geofences.

# Arguments
- `consumer_arn`: The Amazon Resource Name (ARN) for the geofence collection to be
  disassociated from the tracker resource. Used when you need to specify a resource across
  all AWS.    Format example:
  arn:aws:geo:region:account-id:geofence-collection/ExampleGeofenceCollectionConsumer
- `tracker_name`: The name of the tracker resource to be dissociated from the consumer.

"""
function disassociate_tracker_consumer(
    ConsumerArn, TrackerName; aws_config::AbstractAWSConfig=global_aws_config()
)
    return location(
        "DELETE",
        "/tracking/v0/trackers/$(TrackerName)/consumers/$(ConsumerArn)";
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end
function disassociate_tracker_consumer(
    ConsumerArn,
    TrackerName,
    params::AbstractDict{String};
    aws_config::AbstractAWSConfig=global_aws_config(),
)
    return location(
        "DELETE",
        "/tracking/v0/trackers/$(TrackerName)/consumers/$(ConsumerArn)",
        params;
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end

"""
    get_device_position(device_id, tracker_name)
    get_device_position(device_id, tracker_name, params::Dict{String,<:Any})

Retrieves a device's most recent position according to its sample time.  Device positions
are deleted after 30 days.

# Arguments
- `device_id`: The device whose position you want to retrieve.
- `tracker_name`: The tracker resource receiving the position update.

"""
function get_device_position(
    DeviceId, TrackerName; aws_config::AbstractAWSConfig=global_aws_config()
)
    return location(
        "GET",
        "/tracking/v0/trackers/$(TrackerName)/devices/$(DeviceId)/positions/latest";
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end
function get_device_position(
    DeviceId,
    TrackerName,
    params::AbstractDict{String};
    aws_config::AbstractAWSConfig=global_aws_config(),
)
    return location(
        "GET",
        "/tracking/v0/trackers/$(TrackerName)/devices/$(DeviceId)/positions/latest",
        params;
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end

"""
    get_device_position_history(device_id, tracker_name)
    get_device_position_history(device_id, tracker_name, params::Dict{String,<:Any})

Retrieves the device position history from a tracker resource within a specified range of
time.  Device positions are deleted after 30 days.

# Arguments
- `device_id`: The device whose position history you want to retrieve.
- `tracker_name`: The tracker resource receiving the request for the device position
  history.

# Optional Parameters
Optional parameters can be passed as a `params::Dict{String,<:Any}`. Valid keys are:
- `"EndTimeExclusive"`: Specify the end time for the position history in  ISO 8601 format:
  YYYY-MM-DDThh:mm:ss.sssZ. By default, the value will be the time that the request is made.
  Requirement:   The time specified for EndTimeExclusive must be after the time for
  StartTimeInclusive.
- `"NextToken"`: The pagination token specifying which page of results to return in the
  response. If no token is provided, the default page is the first page.  Default value: null
- `"StartTimeInclusive"`: Specify the start time for the position history in  ISO 8601
  format: YYYY-MM-DDThh:mm:ss.sssZ. By default, the value will be 24 hours prior to the time
  that the request is made. Requirement:   The time specified for StartTimeInclusive must be
  before EndTimeExclusive.
"""
function get_device_position_history(
    DeviceId, TrackerName; aws_config::AbstractAWSConfig=global_aws_config()
)
    return location(
        "POST",
        "/tracking/v0/trackers/$(TrackerName)/devices/$(DeviceId)/list-positions";
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end
function get_device_position_history(
    DeviceId,
    TrackerName,
    params::AbstractDict{String};
    aws_config::AbstractAWSConfig=global_aws_config(),
)
    return location(
        "POST",
        "/tracking/v0/trackers/$(TrackerName)/devices/$(DeviceId)/list-positions",
        params;
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end

"""
    get_geofence(collection_name, geofence_id)
    get_geofence(collection_name, geofence_id, params::Dict{String,<:Any})

Retrieves the geofence details from a geofence collection.

# Arguments
- `collection_name`: The geofence collection storing the target geofence.
- `geofence_id`: The geofence you're retrieving details for.

"""
function get_geofence(
    CollectionName, GeofenceId; aws_config::AbstractAWSConfig=global_aws_config()
)
    return location(
        "GET",
        "/geofencing/v0/collections/$(CollectionName)/geofences/$(GeofenceId)";
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end
function get_geofence(
    CollectionName,
    GeofenceId,
    params::AbstractDict{String};
    aws_config::AbstractAWSConfig=global_aws_config(),
)
    return location(
        "GET",
        "/geofencing/v0/collections/$(CollectionName)/geofences/$(GeofenceId)",
        params;
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end

"""
    get_map_glyphs(font_stack, font_unicode_range, map_name)
    get_map_glyphs(font_stack, font_unicode_range, map_name, params::Dict{String,<:Any})

Retrieves glyphs used to display labels on a map.

# Arguments
- `font_stack`: A comma-separated list of fonts to load glyphs from in order of preference.
  For example, Noto Sans Regular, Arial Unicode. Valid fonts stacks for Esri styles:
  VectorEsriDarkGrayCanvas – Ubuntu Medium Italic | Ubuntu Medium | Ubuntu Italic | Ubuntu
  Regular | Ubuntu Bold    VectorEsriLightGrayCanvas – Ubuntu Italic | Ubuntu Regular |
  Ubuntu Light | Ubuntu Bold    VectorEsriTopographic – Noto Sans Italic | Noto Sans
  Regular | Noto Sans Bold | Noto Serif Regular | Roboto Condensed Light Italic
  VectorEsriStreets – Arial Regular | Arial Italic | Arial Bold    VectorEsriNavigation –
  Arial Regular | Arial Italic | Arial Bold    Valid font stacks for HERE Technologies
  styles:    VectorHereBerlin – Fira GO Regular | Fira GO Bold
- `font_unicode_range`: A Unicode range of characters to download glyphs for. Each response
  will contain 256 characters. For example, 0–255 includes all characters from range U+0000
  to 00FF. Must be aligned to multiples of 256.
- `map_name`: The map resource associated with the glyph ﬁle.

"""
function get_map_glyphs(
    FontStack, FontUnicodeRange, MapName; aws_config::AbstractAWSConfig=global_aws_config()
)
    return location(
        "GET",
        "/maps/v0/maps/$(MapName)/glyphs/$(FontStack)/$(FontUnicodeRange)";
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end
function get_map_glyphs(
    FontStack,
    FontUnicodeRange,
    MapName,
    params::AbstractDict{String};
    aws_config::AbstractAWSConfig=global_aws_config(),
)
    return location(
        "GET",
        "/maps/v0/maps/$(MapName)/glyphs/$(FontStack)/$(FontUnicodeRange)",
        params;
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end

"""
    get_map_sprites(file_name, map_name)
    get_map_sprites(file_name, map_name, params::Dict{String,<:Any})

Retrieves the sprite sheet corresponding to a map resource. The sprite sheet is a PNG image
paired with a JSON document describing the offsets of individual icons that will be
displayed on a rendered map.

# Arguments
- `file_name`: The name of the sprite ﬁle. Use the following ﬁle names for the sprite
  sheet:    sprites.png     sprites@2x.png for high pixel density displays   For the JSON
  document contain image offsets. Use the following ﬁle names:    sprites.json
  sprites@2x.json for high pixel density displays
- `map_name`: The map resource associated with the sprite ﬁle.

"""
function get_map_sprites(
    FileName, MapName; aws_config::AbstractAWSConfig=global_aws_config()
)
    return location(
        "GET",
        "/maps/v0/maps/$(MapName)/sprites/$(FileName)";
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end
function get_map_sprites(
    FileName,
    MapName,
    params::AbstractDict{String};
    aws_config::AbstractAWSConfig=global_aws_config(),
)
    return location(
        "GET",
        "/maps/v0/maps/$(MapName)/sprites/$(FileName)",
        params;
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end

"""
    get_map_style_descriptor(map_name)
    get_map_style_descriptor(map_name, params::Dict{String,<:Any})

Retrieves the map style descriptor from a map resource.  The style descriptor contains
speciﬁcations on how features render on a map. For example, what data to display, what
order to display the data in, and the style for the data. Style descriptors follow the
Mapbox Style Specification.

# Arguments
- `map_name`: The map resource to retrieve the style descriptor from.

"""
function get_map_style_descriptor(
    MapName; aws_config::AbstractAWSConfig=global_aws_config()
)
    return location(
        "GET",
        "/maps/v0/maps/$(MapName)/style-descriptor";
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end
function get_map_style_descriptor(
    MapName, params::AbstractDict{String}; aws_config::AbstractAWSConfig=global_aws_config()
)
    return location(
        "GET",
        "/maps/v0/maps/$(MapName)/style-descriptor",
        params;
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end

"""
    get_map_tile(map_name, x, y, z)
    get_map_tile(map_name, x, y, z, params::Dict{String,<:Any})

Retrieves a vector data tile from the map resource. Map tiles are used by clients to render
a map. they're addressed using a grid arrangement with an X coordinate, Y coordinate, and Z
(zoom) level.  The origin (0, 0) is the top left of the map. Increasing the zoom level by 1
doubles both the X and Y dimensions, so a tile containing data for the entire world at
(0/0/0) will be split into 4 tiles at zoom 1 (1/0/0, 1/0/1, 1/1/0, 1/1/1).

# Arguments
- `map_name`: The map resource to retrieve the map tiles from.
- `x`: The X axis value for the map tile.
- `y`: The Y axis value for the map tile.
- `z`: The zoom value for the map tile.

"""
function get_map_tile(MapName, X, Y, Z; aws_config::AbstractAWSConfig=global_aws_config())
    return location(
        "GET",
        "/maps/v0/maps/$(MapName)/tiles/$(Z)/$(X)/$(Y)";
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end
function get_map_tile(
    MapName,
    X,
    Y,
    Z,
    params::AbstractDict{String};
    aws_config::AbstractAWSConfig=global_aws_config(),
)
    return location(
        "GET",
        "/maps/v0/maps/$(MapName)/tiles/$(Z)/$(X)/$(Y)",
        params;
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end

"""
    list_device_positions(tracker_name)
    list_device_positions(tracker_name, params::Dict{String,<:Any})

A batch request to retrieve all device positions.

# Arguments
- `tracker_name`: The tracker resource containing the requested devices.

# Optional Parameters
Optional parameters can be passed as a `params::Dict{String,<:Any}`. Valid keys are:
- `"MaxResults"`: An optional limit for the number of entries returned in a single call.
  Default value: 100
- `"NextToken"`: The pagination token specifying which page of results to return in the
  response. If no token is provided, the default page is the first page. Default value: null
"""
function list_device_positions(
    TrackerName; aws_config::AbstractAWSConfig=global_aws_config()
)
    return location(
        "POST",
        "/tracking/v0/trackers/$(TrackerName)/list-positions";
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end
function list_device_positions(
    TrackerName,
    params::AbstractDict{String};
    aws_config::AbstractAWSConfig=global_aws_config(),
)
    return location(
        "POST",
        "/tracking/v0/trackers/$(TrackerName)/list-positions",
        params;
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end

"""
    list_geofence_collections()
    list_geofence_collections(params::Dict{String,<:Any})

Lists geofence collections in your AWS account.

# Optional Parameters
Optional parameters can be passed as a `params::Dict{String,<:Any}`. Valid keys are:
- `"MaxResults"`: An optional limit for the number of resources returned in a single call.
  Default value: 100
- `"NextToken"`: The pagination token specifying which page of results to return in the
  response. If no token is provided, the default page is the first page.  Default value: null
"""
function list_geofence_collections(; aws_config::AbstractAWSConfig=global_aws_config())
    return location(
        "POST",
        "/geofencing/v0/list-collections";
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end
function list_geofence_collections(
    params::AbstractDict{String}; aws_config::AbstractAWSConfig=global_aws_config()
)
    return location(
        "POST",
        "/geofencing/v0/list-collections",
        params;
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end

"""
    list_geofences(collection_name)
    list_geofences(collection_name, params::Dict{String,<:Any})

Lists geofences stored in a given geofence collection.

# Arguments
- `collection_name`: The name of the geofence collection storing the list of geofences.

# Optional Parameters
Optional parameters can be passed as a `params::Dict{String,<:Any}`. Valid keys are:
- `"NextToken"`: The pagination token specifying which page of results to return in the
  response. If no token is provided, the default page is the first page.  Default value: null
"""
function list_geofences(CollectionName; aws_config::AbstractAWSConfig=global_aws_config())
    return location(
        "POST",
        "/geofencing/v0/collections/$(CollectionName)/list-geofences";
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end
function list_geofences(
    CollectionName,
    params::AbstractDict{String};
    aws_config::AbstractAWSConfig=global_aws_config(),
)
    return location(
        "POST",
        "/geofencing/v0/collections/$(CollectionName)/list-geofences",
        params;
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end

"""
    list_maps()
    list_maps(params::Dict{String,<:Any})

Lists map resources in your AWS account.

# Optional Parameters
Optional parameters can be passed as a `params::Dict{String,<:Any}`. Valid keys are:
- `"MaxResults"`: An optional limit for the number of resources returned in a single call.
  Default value: 100
- `"NextToken"`: The pagination token specifying which page of results to return in the
  response. If no token is provided, the default page is the first page. Default value: null
"""
function list_maps(; aws_config::AbstractAWSConfig=global_aws_config())
    return location(
        "POST", "/maps/v0/list-maps"; aws_config=aws_config, feature_set=SERVICE_FEATURE_SET
    )
end
function list_maps(
    params::AbstractDict{String}; aws_config::AbstractAWSConfig=global_aws_config()
)
    return location(
        "POST",
        "/maps/v0/list-maps",
        params;
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end

"""
    list_place_indexes()
    list_place_indexes(params::Dict{String,<:Any})

Lists place index resources in your AWS account.

# Optional Parameters
Optional parameters can be passed as a `params::Dict{String,<:Any}`. Valid keys are:
- `"MaxResults"`: An optional limit for the maximum number of results returned in a single
  call. Default value: 100
- `"NextToken"`: The pagination token specifying which page of results to return in the
  response. If no token is provided, the default page is the first page. Default value: null
"""
function list_place_indexes(; aws_config::AbstractAWSConfig=global_aws_config())
    return location(
        "POST",
        "/places/v0/list-indexes";
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end
function list_place_indexes(
    params::AbstractDict{String}; aws_config::AbstractAWSConfig=global_aws_config()
)
    return location(
        "POST",
        "/places/v0/list-indexes",
        params;
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end

"""
    list_route_calculators()
    list_route_calculators(params::Dict{String,<:Any})

Lists route calculator resources in your AWS account.

# Optional Parameters
Optional parameters can be passed as a `params::Dict{String,<:Any}`. Valid keys are:
- `"MaxResults"`: An optional maximum number of results returned in a single call. Default
  Value: 100
- `"NextToken"`: The pagination token specifying which page of results to return in the
  response. If no token is provided, the default page is the first page. Default Value: null
"""
function list_route_calculators(; aws_config::AbstractAWSConfig=global_aws_config())
    return location(
        "POST",
        "/routes/v0/list-calculators";
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end
function list_route_calculators(
    params::AbstractDict{String}; aws_config::AbstractAWSConfig=global_aws_config()
)
    return location(
        "POST",
        "/routes/v0/list-calculators",
        params;
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end

"""
    list_tags_for_resource(resource_arn)
    list_tags_for_resource(resource_arn, params::Dict{String,<:Any})

Returns a list of tags that are applied to the specified Amazon Location resource.

# Arguments
- `resource_arn`: The Amazon Resource Name (ARN) of the resource whose tags you want to
  retrieve.   Format example: arn:aws:geo:region:account-id:resourcetype/ExampleResource

"""
function list_tags_for_resource(
    ResourceArn; aws_config::AbstractAWSConfig=global_aws_config()
)
    return location(
        "GET",
        "/tags/$(ResourceArn)";
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end
function list_tags_for_resource(
    ResourceArn,
    params::AbstractDict{String};
    aws_config::AbstractAWSConfig=global_aws_config(),
)
    return location(
        "GET",
        "/tags/$(ResourceArn)",
        params;
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end

"""
    list_tracker_consumers(tracker_name)
    list_tracker_consumers(tracker_name, params::Dict{String,<:Any})

Lists geofence collections currently associated to the given tracker resource.

# Arguments
- `tracker_name`: The tracker resource whose associated geofence collections you want to
  list.

# Optional Parameters
Optional parameters can be passed as a `params::Dict{String,<:Any}`. Valid keys are:
- `"MaxResults"`: An optional limit for the number of resources returned in a single call.
  Default value: 100
- `"NextToken"`: The pagination token specifying which page of results to return in the
  response. If no token is provided, the default page is the first page.  Default value: null
"""
function list_tracker_consumers(
    TrackerName; aws_config::AbstractAWSConfig=global_aws_config()
)
    return location(
        "POST",
        "/tracking/v0/trackers/$(TrackerName)/list-consumers";
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end
function list_tracker_consumers(
    TrackerName,
    params::AbstractDict{String};
    aws_config::AbstractAWSConfig=global_aws_config(),
)
    return location(
        "POST",
        "/tracking/v0/trackers/$(TrackerName)/list-consumers",
        params;
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end

"""
    list_trackers()
    list_trackers(params::Dict{String,<:Any})

Lists tracker resources in your AWS account.

# Optional Parameters
Optional parameters can be passed as a `params::Dict{String,<:Any}`. Valid keys are:
- `"MaxResults"`: An optional limit for the number of resources returned in a single call.
  Default value: 100
- `"NextToken"`: The pagination token specifying which page of results to return in the
  response. If no token is provided, the default page is the first page.  Default value: null
"""
function list_trackers(; aws_config::AbstractAWSConfig=global_aws_config())
    return location(
        "POST",
        "/tracking/v0/list-trackers";
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end
function list_trackers(
    params::AbstractDict{String}; aws_config::AbstractAWSConfig=global_aws_config()
)
    return location(
        "POST",
        "/tracking/v0/list-trackers",
        params;
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end

"""
    put_geofence(collection_name, geofence_id, geometry)
    put_geofence(collection_name, geofence_id, geometry, params::Dict{String,<:Any})

Stores a geofence geometry in a given geofence collection, or updates the geometry of an
existing geofence if a geofence ID is included in the request.

# Arguments
- `collection_name`: The geofence collection to store the geofence in.
- `geofence_id`: An identifier for the geofence. For example, ExampleGeofence-1.
- `geometry`: Contains the polygon details to specify the position of the geofence.  Each
  geofence polygon can have a maximum of 1,000 vertices.

"""
function put_geofence(
    CollectionName, GeofenceId, Geometry; aws_config::AbstractAWSConfig=global_aws_config()
)
    return location(
        "PUT",
        "/geofencing/v0/collections/$(CollectionName)/geofences/$(GeofenceId)",
        Dict{String,Any}("Geometry" => Geometry);
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end
function put_geofence(
    CollectionName,
    GeofenceId,
    Geometry,
    params::AbstractDict{String};
    aws_config::AbstractAWSConfig=global_aws_config(),
)
    return location(
        "PUT",
        "/geofencing/v0/collections/$(CollectionName)/geofences/$(GeofenceId)",
        Dict{String,Any}(
            mergewith(_merge, Dict{String,Any}("Geometry" => Geometry), params)
        );
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end

"""
    search_place_index_for_position(index_name, position)
    search_place_index_for_position(index_name, position, params::Dict{String,<:Any})

Reverse geocodes a given coordinate and returns a legible address. Allows you to search for
Places or points of interest near a given position.

# Arguments
- `index_name`: The name of the place index resource you want to use for the search.
- `position`: Specifies the longitude and latitude of the position to query.  This
  parameter must contain a pair of numbers. The first number represents the X coordinate, or
  longitude; the second number represents the Y coordinate, or latitude. For example,
  [-123.1174, 49.2847] represents a position with longitude -123.1174 and latitude 49.2847.

# Optional Parameters
Optional parameters can be passed as a `params::Dict{String,<:Any}`. Valid keys are:
- `"Language"`: The preferred language used to return results. The value must be a valid
  BCP 47 language tag, for example, en for English. This setting affects the languages used
  in the results. It does not change which results are returned. If the language is not
  specified, or not supported for a particular result, the partner automatically chooses a
  language for the result.
- `"MaxResults"`: An optional parameter. The maximum number of results returned per
  request. Default value: 50
"""
function search_place_index_for_position(
    IndexName, Position; aws_config::AbstractAWSConfig=global_aws_config()
)
    return location(
        "POST",
        "/places/v0/indexes/$(IndexName)/search/position",
        Dict{String,Any}("Position" => Position);
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end
function search_place_index_for_position(
    IndexName,
    Position,
    params::AbstractDict{String};
    aws_config::AbstractAWSConfig=global_aws_config(),
)
    return location(
        "POST",
        "/places/v0/indexes/$(IndexName)/search/position",
        Dict{String,Any}(
            mergewith(_merge, Dict{String,Any}("Position" => Position), params)
        );
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end

"""
    search_place_index_for_suggestions(index_name, text)
    search_place_index_for_suggestions(index_name, text, params::Dict{String,<:Any})

Generates suggestions for addresses and points of interest based on partial or misspelled
free-form text. This operation is also known as autocomplete, autosuggest, or fuzzy
matching. Optional parameters let you narrow your search results by bounding box or
country, or bias your search toward a specific position on the globe.  You can search for
suggested place names near a specified position by using BiasPosition, or filter results
within a bounding box by using FilterBBox. These parameters are mutually exclusive; using
both BiasPosition and FilterBBox in the same command returns an error.

# Arguments
- `index_name`: The name of the place index resource you want to use for the search.
- `text`: The free-form partial text to use to generate place suggestions. For example,
  eiffel tow.

# Optional Parameters
Optional parameters can be passed as a `params::Dict{String,<:Any}`. Valid keys are:
- `"BiasPosition"`: An optional parameter that indicates a preference for place suggestions
  that are closer to a specified position.  If provided, this parameter must contain a pair
  of numbers. The first number represents the X coordinate, or longitude; the second number
  represents the Y coordinate, or latitude. For example, [-123.1174, 49.2847] represents the
  position with longitude -123.1174 and latitude 49.2847.   BiasPosition and FilterBBox are
  mutually exclusive. Specifying both options results in an error.
- `"FilterBBox"`: An optional parameter that limits the search results by returning only
  suggestions within a specified bounding box.  If provided, this parameter must contain a
  total of four consecutive numbers in two pairs. The first pair of numbers represents the X
  and Y coordinates (longitude and latitude, respectively) of the southwest corner of the
  bounding box; the second pair of numbers represents the X and Y coordinates (longitude and
  latitude, respectively) of the northeast corner of the bounding box. For example,
  [-12.7935, -37.4835, -12.0684, -36.9542] represents a bounding box where the southwest
  corner has longitude -12.7935 and latitude -37.4835, and the northeast corner has longitude
  -12.0684 and latitude -36.9542.   FilterBBox and BiasPosition are mutually exclusive.
  Specifying both options results in an error.
- `"FilterCountries"`: An optional parameter that limits the search results by returning
  only suggestions within the provided list of countries.   Use the ISO 3166 3-digit country
  code. For example, Australia uses three upper-case characters: AUS.
- `"Language"`: The preferred language used to return results. The value must be a valid
  BCP 47 language tag, for example, en for English. This setting affects the languages used
  in the results. It does not change which results are returned. If the language is not
  specified, or not supported for a particular result, the partner automatically chooses a
  language for the result. Used only when the partner selected is Here.
- `"MaxResults"`: An optional parameter. The maximum number of results returned per
  request.  The default: 5
"""
function search_place_index_for_suggestions(
    IndexName, Text; aws_config::AbstractAWSConfig=global_aws_config()
)
    return location(
        "POST",
        "/places/v0/indexes/$(IndexName)/search/suggestions",
        Dict{String,Any}("Text" => Text);
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end
function search_place_index_for_suggestions(
    IndexName,
    Text,
    params::AbstractDict{String};
    aws_config::AbstractAWSConfig=global_aws_config(),
)
    return location(
        "POST",
        "/places/v0/indexes/$(IndexName)/search/suggestions",
        Dict{String,Any}(mergewith(_merge, Dict{String,Any}("Text" => Text), params));
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end

"""
    search_place_index_for_text(index_name, text)
    search_place_index_for_text(index_name, text, params::Dict{String,<:Any})

Geocodes free-form text, such as an address, name, city, or region to allow you to search
for Places or points of interest.  Optional parameters let you narrow your search results
by bounding box or country, or bias your search toward a specific position on the globe.
You can search for places near a given position using BiasPosition, or filter results
within a bounding box using FilterBBox. Providing both parameters simultaneously returns an
error.  Search results are returned in order of highest to lowest relevance.

# Arguments
- `index_name`: The name of the place index resource you want to use for the search.
- `text`: The address, name, city, or region to be used in the search in free-form text
  format. For example, 123 Any Street.

# Optional Parameters
Optional parameters can be passed as a `params::Dict{String,<:Any}`. Valid keys are:
- `"BiasPosition"`: An optional parameter that indicates a preference for places that are
  closer to a specified position.  If provided, this parameter must contain a pair of
  numbers. The first number represents the X coordinate, or longitude; the second number
  represents the Y coordinate, or latitude. For example, [-123.1174, 49.2847] represents the
  position with longitude -123.1174 and latitude 49.2847.   BiasPosition and FilterBBox are
  mutually exclusive. Specifying both options results in an error.
- `"FilterBBox"`: An optional parameter that limits the search results by returning only
  places that are within the provided bounding box.  If provided, this parameter must contain
  a total of four consecutive numbers in two pairs. The first pair of numbers represents the
  X and Y coordinates (longitude and latitude, respectively) of the southwest corner of the
  bounding box; the second pair of numbers represents the X and Y coordinates (longitude and
  latitude, respectively) of the northeast corner of the bounding box. For example,
  [-12.7935, -37.4835, -12.0684, -36.9542] represents a bounding box where the southwest
  corner has longitude -12.7935 and latitude -37.4835, and the northeast corner has longitude
  -12.0684 and latitude -36.9542.   FilterBBox and BiasPosition are mutually exclusive.
  Specifying both options results in an error.
- `"FilterCountries"`: An optional parameter that limits the search results by returning
  only places that are in a specified list of countries.   Valid values include ISO 3166
  3-digit country codes. For example, Australia uses three upper-case characters: AUS.
- `"Language"`: The preferred language used to return results. The value must be a valid
  BCP 47 language tag, for example, en for English. This setting affects the languages used
  in the results. It does not change which results are returned. If the language is not
  specified, or not supported for a particular result, the partner automatically chooses a
  language for the result.
- `"MaxResults"`: An optional parameter. The maximum number of results returned per
  request.  The default: 50
"""
function search_place_index_for_text(
    IndexName, Text; aws_config::AbstractAWSConfig=global_aws_config()
)
    return location(
        "POST",
        "/places/v0/indexes/$(IndexName)/search/text",
        Dict{String,Any}("Text" => Text);
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end
function search_place_index_for_text(
    IndexName,
    Text,
    params::AbstractDict{String};
    aws_config::AbstractAWSConfig=global_aws_config(),
)
    return location(
        "POST",
        "/places/v0/indexes/$(IndexName)/search/text",
        Dict{String,Any}(mergewith(_merge, Dict{String,Any}("Text" => Text), params));
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end

"""
    tag_resource(resource_arn, tags)
    tag_resource(resource_arn, tags, params::Dict{String,<:Any})

Assigns one or more tags (key-value pairs) to the specified Amazon Location Service
resource.  <p>Tags can help you organize and categorize your resources. You can also
use them to scope user permissions, by granting a user permission to access or change only
resources with certain tag values.</p> <p>You can use the
<code>TagResource</code> operation with an Amazon Location Service resource
that already has tags. If you specify a new tag key for the resource, this tag is appended
to the tags already associated with the resource. If you specify a tag key that's already
associated with the resource, the new tag value that you specify replaces the previous
value for that tag. </p> <p>You can associate up to 50 tags with a
resource.</p>

# Arguments
- `resource_arn`: The Amazon Resource Name (ARN) of the resource whose tags you want to
  update.   Format example: arn:aws:geo:region:account-id:resourcetype/ExampleResource
- `tags`: Applies one or more tags to specific resource. A tag is a key-value pair that
  helps you manage, identify, search, and filter your resources. Format: \"key\" : \"value\"
  Restrictions:   Maximum 50 tags per resource.   Each tag key must be unique and must have
  exactly one associated value.   Maximum key length: 128 Unicode characters in UTF-8.
  Maximum value length: 256 Unicode characters in UTF-8.   Can use alphanumeric characters
  (A–Z, a–z, 0–9), and the following characters: + - = . _ : / @   Cannot use \"aws:\"
  as a prefix for a key.

"""
function tag_resource(ResourceArn, Tags; aws_config::AbstractAWSConfig=global_aws_config())
    return location(
        "POST",
        "/tags/$(ResourceArn)",
        Dict{String,Any}("Tags" => Tags);
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end
function tag_resource(
    ResourceArn,
    Tags,
    params::AbstractDict{String};
    aws_config::AbstractAWSConfig=global_aws_config(),
)
    return location(
        "POST",
        "/tags/$(ResourceArn)",
        Dict{String,Any}(mergewith(_merge, Dict{String,Any}("Tags" => Tags), params));
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end

"""
    untag_resource(resource_arn, tag_keys)
    untag_resource(resource_arn, tag_keys, params::Dict{String,<:Any})

Removes one or more tags from the specified Amazon Location resource.

# Arguments
- `resource_arn`: The Amazon Resource Name (ARN) of the resource from which you want to
  remove tags.   Format example: arn:aws:geo:region:account-id:resourcetype/ExampleResource
- `tag_keys`: The list of tag keys to remove from the specified resource.

"""
function untag_resource(
    ResourceArn, tagKeys; aws_config::AbstractAWSConfig=global_aws_config()
)
    return location(
        "DELETE",
        "/tags/$(ResourceArn)",
        Dict{String,Any}("tagKeys" => tagKeys);
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end
function untag_resource(
    ResourceArn,
    tagKeys,
    params::AbstractDict{String};
    aws_config::AbstractAWSConfig=global_aws_config(),
)
    return location(
        "DELETE",
        "/tags/$(ResourceArn)",
        Dict{String,Any}(mergewith(_merge, Dict{String,Any}("tagKeys" => tagKeys), params));
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end

"""
    update_geofence_collection(collection_name)
    update_geofence_collection(collection_name, params::Dict{String,<:Any})

Updates the specified properties of a given geofence collection.

# Arguments
- `collection_name`: The name of the geofence collection to update.

# Optional Parameters
Optional parameters can be passed as a `params::Dict{String,<:Any}`. Valid keys are:
- `"Description"`: Updates the description for the geofence collection.
- `"PricingPlan"`: Updates the pricing plan for the geofence collection. For more
  information about each pricing plan option restrictions, see Amazon Location Service
  pricing.
- `"PricingPlanDataSource"`: Updates the data provider for the geofence collection.  A
  required value for the following pricing plans: MobileAssetTracking| MobileAssetManagement
  For more information about data providers and pricing plans, see the Amazon Location
  Service product page.  This can only be updated when updating the PricingPlan in the same
  request. Amazon Location Service uses PricingPlanDataSource to calculate billing for your
  geofence collection. Your data won't be shared with the data provider, and will remain in
  your AWS account and Region unless you move it.
"""
function update_geofence_collection(
    CollectionName; aws_config::AbstractAWSConfig=global_aws_config()
)
    return location(
        "PATCH",
        "/geofencing/v0/collections/$(CollectionName)";
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end
function update_geofence_collection(
    CollectionName,
    params::AbstractDict{String};
    aws_config::AbstractAWSConfig=global_aws_config(),
)
    return location(
        "PATCH",
        "/geofencing/v0/collections/$(CollectionName)",
        params;
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end

"""
    update_map(map_name)
    update_map(map_name, params::Dict{String,<:Any})

Updates the specified properties of a given map resource.

# Arguments
- `map_name`: The name of the map resource to update.

# Optional Parameters
Optional parameters can be passed as a `params::Dict{String,<:Any}`. Valid keys are:
- `"Description"`: Updates the description for the map resource.
- `"PricingPlan"`: Updates the pricing plan for the map resource. For more information
  about each pricing plan option restrictions, see Amazon Location Service pricing.
"""
function update_map(MapName; aws_config::AbstractAWSConfig=global_aws_config())
    return location(
        "PATCH",
        "/maps/v0/maps/$(MapName)";
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end
function update_map(
    MapName, params::AbstractDict{String}; aws_config::AbstractAWSConfig=global_aws_config()
)
    return location(
        "PATCH",
        "/maps/v0/maps/$(MapName)",
        params;
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end

"""
    update_place_index(index_name)
    update_place_index(index_name, params::Dict{String,<:Any})

Updates the specified properties of a given place index resource.

# Arguments
- `index_name`: The name of the place index resource to update.

# Optional Parameters
Optional parameters can be passed as a `params::Dict{String,<:Any}`. Valid keys are:
- `"DataSourceConfiguration"`: Updates the data storage option for the place index resource.
- `"Description"`: Updates the description for the place index resource.
- `"PricingPlan"`: Updates the pricing plan for the place index resource. For more
  information about each pricing plan option restrictions, see Amazon Location Service
  pricing.
"""
function update_place_index(IndexName; aws_config::AbstractAWSConfig=global_aws_config())
    return location(
        "PATCH",
        "/places/v0/indexes/$(IndexName)";
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end
function update_place_index(
    IndexName,
    params::AbstractDict{String};
    aws_config::AbstractAWSConfig=global_aws_config(),
)
    return location(
        "PATCH",
        "/places/v0/indexes/$(IndexName)",
        params;
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end

"""
    update_route_calculator(calculator_name)
    update_route_calculator(calculator_name, params::Dict{String,<:Any})

Updates the specified properties for a given route calculator resource.

# Arguments
- `calculator_name`: The name of the route calculator resource to update.

# Optional Parameters
Optional parameters can be passed as a `params::Dict{String,<:Any}`. Valid keys are:
- `"Description"`: Updates the description for the route calculator resource.
- `"PricingPlan"`: Updates the pricing plan for the route calculator resource. For more
  information about each pricing plan option restrictions, see Amazon Location Service
  pricing.
"""
function update_route_calculator(
    CalculatorName; aws_config::AbstractAWSConfig=global_aws_config()
)
    return location(
        "PATCH",
        "/routes/v0/calculators/$(CalculatorName)";
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end
function update_route_calculator(
    CalculatorName,
    params::AbstractDict{String};
    aws_config::AbstractAWSConfig=global_aws_config(),
)
    return location(
        "PATCH",
        "/routes/v0/calculators/$(CalculatorName)",
        params;
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end

"""
    update_tracker(tracker_name)
    update_tracker(tracker_name, params::Dict{String,<:Any})

Updates the specified properties of a given tracker resource.

# Arguments
- `tracker_name`: The name of the tracker resource to update.

# Optional Parameters
Optional parameters can be passed as a `params::Dict{String,<:Any}`. Valid keys are:
- `"Description"`: Updates the description for the tracker resource.
- `"PositionFiltering"`: Updates the position filtering for the tracker resource. Valid
  values:    TimeBased - Location updates are evaluated against linked geofence collections,
  but not every location update is stored. If your update frequency is more often than 30
  seconds, only one update per 30 seconds is stored for each unique device ID.
  DistanceBased - If the device has moved less than 30 m (98.4 ft), location updates are
  ignored. Location updates within this distance are neither evaluated against linked
  geofence collections, nor stored. This helps control costs by reducing the number of
  geofence evaluations and historical device positions to paginate through. Distance-based
  filtering can also reduce the effects of GPS noise when displaying device trajectories on a
  map.     AccuracyBased - If the device has moved less than the measured accuracy, location
  updates are ignored. For example, if two consecutive updates from a device have a
  horizontal accuracy of 5 m and 10 m, the second update is ignored if the device has moved
  less than 15 m. Ignored location updates are neither evaluated against linked geofence
  collections, nor stored. This helps educe the effects of GPS noise when displaying device
  trajectories on a map, and can help control costs by reducing the number of geofence
  evaluations.
- `"PricingPlan"`: Updates the pricing plan for the tracker resource. For more information
  about each pricing plan option restrictions, see Amazon Location Service pricing.
- `"PricingPlanDataSource"`: Updates the data provider for the tracker resource.  A
  required value for the following pricing plans: MobileAssetTracking| MobileAssetManagement
  For more information about data providers and pricing plans, see the Amazon Location
  Service product page  This can only be updated when updating the PricingPlan in the same
  request. Amazon Location Service uses PricingPlanDataSource to calculate billing for your
  tracker resource. Your data won't be shared with the data provider, and will remain in your
  AWS account and Region unless you move it.
"""
function update_tracker(TrackerName; aws_config::AbstractAWSConfig=global_aws_config())
    return location(
        "PATCH",
        "/tracking/v0/trackers/$(TrackerName)";
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end
function update_tracker(
    TrackerName,
    params::AbstractDict{String};
    aws_config::AbstractAWSConfig=global_aws_config(),
)
    return location(
        "PATCH",
        "/tracking/v0/trackers/$(TrackerName)",
        params;
        aws_config=aws_config,
        feature_set=SERVICE_FEATURE_SET,
    )
end


text:
@testset "DouglasRachford" begin
    # Though this seems a strange way, it is a way to compute the mid point
    M = Sphere(2)
    p = [1.0, 0.0, 0.0]
    q = [0.0, 1.0, 0.0]
    r = [0.0, 0.0, 1.0]
    start = [0.0, 0.0, 1.0]
    result = result = geodesic(M, p, q, distance(M, p, q) / 2)
    F(M, x) = distance(M, x, p)^2 + distance(M, x, q)^2
    prox1 = (M, η, x) -> prox_distance(M, η, p, x)
    prox2 = (M, η, x) -> prox_distance(M, η, q, x)
    @test_throws ErrorException DouglasRachford(M, F, Array{Function,1}([prox1]), start) # we need more than one prox
    xHat = DouglasRachford(M, F, [prox1, prox2], start)
    @test F(M, start) > F(M, xHat)
    @test distance(M, xHat, result) ≈ 0
    # but we can also compute the riemannian center of mass (locally) on Sn
    # though also this is not that useful, but easy to test that DR works
    F2(M, x) = distance(M, x, p)^2 + distance(M, x, q)^2 + distance(M, x, r)^2
    prox1 = (M, η, x) -> prox_distance(M.manifold, η, p, x)
    prox2 = (M, η, x) -> prox_distance(M.manifold, η, q, x)
    prox3 = (M, η, x) -> prox_distance(M.manifold, η, r, x)
    o = DouglasRachford(
        M,
        F2,
        [prox1, prox2, prox3],
        start;
        debug=[DebugCost(), DebugIterate(), DebugProximalParameter(), 100],
        record=[RecordCost(), RecordProximalParameter()],
        return_options=true,
    )
    xHat2 = get_solver_result(o)
    drec2 = get_record(o)
    result2 = mean(M, [p, q, r])
    # since the default does not run that long -> rough estimate
    @test distance(M, xHat2, result2) ≈ 0
end

ext: jl


text:
using Plots
using Test: @test_throws

export ellipse_sino

"""
`(sino, pos, ang) = ellipse_sino(sg, ells;
            oversample=1, xscale=1, yscale=1)`

Create sinogram projection of one or more ellipses.
Works for both parallel-beam geometry and for fan-beam geometry.

in
* `sg`                      sinogram geometry object from sino_geom()
* `ells`            		`[ne 6]`  parameters
                            [centx centy radx rady angle_degrees amplitue]
                            (or strum motion object; see ellipse_motion.m)

options
* `oversample::Integer`     oversampling factor for emulating "strips"
                            default 1: just 1 ray per detector element
* `xscale::Integer`         use -1 to flip in x (not recommended)
* `yscale::Integer`         use -1 to flip in y (not recommended)

out
* `sino`            `[nb na]` sinogram
* `pos`             `[nb 1]`  radial sample positions (or [nb na] if mojette)
* `ang`             `[na]`    angular sample locations
"""
function ellipse_sino(sg::MIRT_sino_geom,
        ells::AbstractArray{<:Real,2};
        oversample::Integer=1,
        xscale::Integer=1,
        yscale::Integer=1,
        )

		how = sg.how
        if how == :fan
                (sino, pos, ang) = ellipse_sino_go(ells, sg.nb, sg.ds, sg.offset, sg.na, sg.orbit, sg.orbit_start,
                                        sg.dso, sg.dod, sg.dfs, sg.source_offset, xscale, yscale, oversample, 0)
        elseif how == :par
                (sino, pos, ang) = ellipse_sino_go(ells, sg.nb, sg.dr, sg.offset, sg.na, sg.orbit, sg.orbit_start,
                                        Inf, 1, 0, sg.source_offset, xscale, yscale, oversample, 0)
        elseif how == :moj
                (sino, pos, ang) = ellipse_sino_go(ells, sg.nb, sg.d, sg.offset, sg.na, sg.orbit, sg.orbit_start,
					Inf, 1, 0, sg.source_offset, xscale, yscale, oversample, 0)
	else
		throw("sino geom $how not done")
	end
        return (sino, pos, ang)
end

"""
`ellipse_sino_go()`
"""
function ellipse_sino_go(ells, nb, ds, offset_s, na, orbit, orbit_start,
	dso, dod, dfs, source_offset, xscale, yscale, oversample, mojette)

	ang = ((orbit_start .+ (0:(na - 1))' / na * orbit)) * (pi/180)
	(pos, pos2) = ellipse_sino_pos(pos[:], nb, ds, offset_s, oversample, mojette, ang)
	sino = ellipse_sino_do(ells, pos2, ang[:]', xscale, yscale, dso, dod, dfs, source_offset)

	if oversample != 1
		sino = downsample2(sino, [oversample 1])
	end

	return (sino, pos, ang)
end

"""
`ellipse_sino_pos()`

determine usual and fine "radial" sample positions
"""
function ellipse_sino_pos(pos, nb, ds, offset_s, nover, mojette, ang)
	wb = (nb - 1)/2 + offset_s
	if mojette != 0 # tricky mojette radial sampling
		# trick: ray_spacing aka ds comes from dx which is in mojette
		!isempty(ds) && throw("ds must be empty for mojette case")
		dt = (abs(mojette) * max(abs(cos(ang))), abs(sin(ang)))

		!isempty(pos) && throw("mojette requires empty 'pos'")

		na = max(size(ang))
		pos_coarse = ((0:(nb-1)) - wb) * dt[:]' # [nb na]
		if nover > 1
			pos_fine = zeros(nover*nb, na)
			for ia in 1:na
				tmp = (-(nover-1):2:(nover-1)) / (2 * nover) * dt[ia]
				pos_fine[:, ia] = (tmp .+ pos_coarse[:,ia]')[:]

			end
		else
			pos_fine = pos_coarse
		end
	else # ordinary non-mojette sampling
		pos_coarse = ((0:(nb - 1)) .- wb) .* ds' # [nb]
		if nover > 1
			# determine fine sampling positions
			# to do: allow different case for trapezoidal rule
			pos_fine = (-(nover - 1):2:(nover - 1)) / (2*nover) * ds
			pos_fine = pos_fine .+ pos_coarse'
			pos_fine = pos_fine[:]
		else
			pos_fine = pos_coarse
		end
	end

	return (pos_coarse, pos_fine)
end

"""
`ellipse_sino_do()`

analytical line-integral projections of ellipse (fan-beam in general)
"""
function ellipse_sino_do(ells, pos, ang, xscale, yscale, dso, dod, dfs, source_offset)
	nb = size(pos, 1)
	na = maximum(size(ang))
	# effective radial and angular sample locations in parallel geometry

	if isinf(dso) # type of dso?
		if size(pos, 2) > 1 #mojette
			rads = pos
			angs = repeat(ang', nb, 1)
		else
			(rads, angs) = ndgrid(pos, ang')
		end

	else # fan
		size(pos, 2) > 1 && throw("mojette fan not supported")

		dis_src_det = dso + dod

		if isinf(dfs) # type of dfs?
			gam = atan(pos / dis_src_det) # gamma
		else # arc detector
			dis_foc_det = dfs + dis_src_det
			alf = pos / dis_foc_det
			gam = atan.(dis_foc_det * sin.(alf), dis_foc_det * cos.(alf) .- dfs) # gamma
		end

		rad = dso * sin.(gam) + source_offset * cos.(gam)
		rads = repeat(rad, 1, na) # [nb, na]
		angs = gam .+ ang  # [nb na] gamma + beta
	end

	# clear alf gam rad pos ang

	sino = zeros(nb, na)

	cangs = cos.(angs)
	sangs = sin.(angs)

	#loop over ellipses
	#ticker reset

	ne = size(ells)[1]
	size(ells)[2] != 6 && throw("6 parameters per ellipse")
	for ie in 1:ne
		#ticker(mfilename, ie, ne)
		if isa(ells, Type)
			ell = ells.ell[ie, na] # [na 6]
			ell = reshape(ell, 1, na, 6)
			ell = repeat(ell, nb, 1, 1)
		else
			ell = ells[ie, :]
			ell = reshape(ell, 1, 1, 6) # is this 3 dimensional
		end

		cx = xscale * ell[:, :, 1]
		rx = ell[:, :, 3]
		cy = yscale * ell[:, :, 2]
		ry = ell[:, :, 4]
		eang = ell[5] * (pi/180)
		val = ell[:, :, 6]

		if yscale == -1
			eang = -eang
		end
		if xscale == -1
			eang = pi - eang
		end
		scale = 2 * val .* rx .* ry

		# square of projected radius:
		rp2 = (rx .* (cangs .* cos(eang) + sangs .* sin(eang))).^2 + (ry .* (sangs .* cos(eang) - cangs .* sin(eang))).^2
		sp = cx .* cangs + cy .* sangs # radial shift
		dis2 = (rads - sp).^2 # square of distances from center
		sino += scale ./ rp2 .* sqrt.(max.(rp2 - dis2, 0))
	end
	return sino
end

"""
`ellipse_sino()`

shows doc strings
"""
function ellipse_sino()
	@doc ellipse_sino
end

"""
`ellipse_sino_test()`

internal test routine: standard sampling
"""
function ellipse_sino_test()
	down = 4
	ig = image_geom(nx=512, ny=504, dx=1)
	ell = [
	40 70 50 150 20 10
	]
	#(xtrue, ell) = ellipse_im(ig, ell; oversample=4)

	gf = sino_geom(:fan, nb = 888, na = 984, d = 1.0, orbit = 360,
			orbit_start = 0, offset = 0.75, dsd = 949, dod = 408, down=down)
	# dfs = Inf, source_offset = 0.7, flat fan, not working
	gp = sino_geom(:par, nb = 888, na = 984, down=down, d = 0.5, orbit = gf.orbit,
			orbit_start = gf.orbit_start, offset = 0.25)
	gm = sino_geom(:moj, nb = 888, na = 984, down=down, d = 0.5, orbit = gf.orbit,
			orbit_start = gf.orbit_start, offset = 0.25)
	sino = sino_geom(:bad)
	@test_throws String ellipse_sino(sino, ell)

	oversample = 8

	sino_mf = ellipse_sino(gf, ell; oversample=oversample) # fan
	sino_mp = ellipse_sino(gp, ell; oversample=1) # parallel
	sino_m = ellipse_sino(gm, ell; oversample=1) # mojette
	e1 = ellipse_sino(gf, ell; oversample=1, xscale=-1, yscale=-1)
	e2 = ellipse_sino(gp, ell; oversample=1, xscale=-1, yscale=-1)
	e3 = ellipse_sino(gm, ell; oversample=1, xscale=-1, yscale=-1)
end

"""
`ellipse_sino_show()`
"""
function ellipse_sino_show()
	down = 4
	ig = image_geom(nx=512, ny=504, dx=1)
	ell = [
	40 70 50 150 20 10
	]

	#(xtrue, ell) = ellipse_im(ig, ell; oversample=4)

	gf = sino_geom(:fan, nb = 888, na = 984, d = 1.0, orbit = 360,
			orbit_start = 0, offset = 0.75, dsd = 949, dod = 408, down=down)
	# dfs = Inf, source_offset = 0.7, flat fan, not working
	gp = sino_geom(:par, nb = 888, na = 984, down=down, d = 0.5, orbit = gf.orbit,
			orbit_start = gf.orbit_start, offset = 0.25)

	oversample = 8

	sino_mf = ellipse_sino(gf, ell; oversample=oversample)[1] # fan
	sino_mp = ellipse_sino(gp, ell; oversample=1)[1] # parallel
	p1 = jim(sino_mf, title="fan")
	p2 = jim(sino_mp, title="parallel")

	plot(p1, p2)
end

"""
`ellipse_sino(:test)`

`ellipse_sino(:show)`
"""
function ellipse_sino(test::Symbol)
	if test == :show
		return ellipse_sino_show()
	end
	ellipse_sino()

	ellipse_sino_test()
	ellipse_sino(:show)
	true
end

#ellipse_sino(:show)


text:
using Test, LinearAlgebra
using DynamicPolynomials
using SetProg
using Polyhedra

@testset "L1 heuristic" begin
    @polyvar x y
    p = 2x^2*y + 3x + 4y^2 - 5x^4*y^2 + 6x^2
    @test SetProg.rectangle_integrate(p, [2, 3]) ≈ -672

    Q = [1 2 4
         2 3 5
         4 5 6]
    q = SetProg.GramMatrix(Q, SetProg.monomials([x, y], 2))
    @test SetProg.rectangle_integrate(polynomial(q), [2, 3]) ≈ 3465.6

    @test SetProg.rectangle_integrate(polynomial(q), [1, 1]) ≈ 472/45

    subset = SetProg.Sets.PolySet(4, q)
    v_rep(a, b) = polyhedron(convexhull([a, b], [-a, -b], [-a, b], [a, -b]))
    h_rep(a, b) = polyhedron(HalfSpace([1, 0], a) ∩ HalfSpace([-1,  0], a) ∩
                             HalfSpace([0, 1], b) ∩ HalfSpace([ 0, -1], b))
    v_square = v_rep(1.0, 1.0)
    h_square = h_rep(1.0, 1.0)
    for square in [v_square, h_square]
        set = SetProg.Sets.Piecewise([subset, subset, subset, subset], square)
        @test SetProg.l1_integral(set, nothing) ≈ 472/45
    end

    Q = [1 2
         2 3]
    @test SetProg.rectangle_integrate(polynomial(Q, [x, y]), [2, 3]) ≈ 248

    @test SetProg.rectangle_integrate(polynomial(Q, [x, y]), [1, 1]) ≈ 16/3

    ell = SetProg.Sets.Ellipsoid(Symmetric(Q))
    for square in [v_square, h_square]
        set = SetProg.Sets.Piecewise([ell, ell, ell, ell], square)
        @test SetProg.l1_integral(set, nothing) ≈ 16/3
    end

    Δ = polyhedron(convexhull([0.0, 0.0], [1.0, 0.0], [1.0, 0.5]))
    Q = [0.0 0.5
         0.5 0.0]
    ell = SetProg.Sets.Ellipsoid(Symmetric(Q))
    @test SetProg.l1_integral(ell, Δ) ≈ 1/32
    Q = [1.0 0.0
         0.0 0.0]
    ell = SetProg.Sets.Ellipsoid(Symmetric(Q))
    @test SetProg.l1_integral(ell, Δ) ≈ 1/8
    Q = [0.0 0.0
         0.0 1.0]
    ell = SetProg.Sets.Ellipsoid(Symmetric(Q))
    @test SetProg.l1_integral(ell, Δ) ≈ 1/96
end