Wednesday, November 19, 2025

 The following script calculates the number of images required for a drone to cover the United States ground area so that each image can be vectorized and used for analysis.

def calculate_num_images(

    us_area_m2=9.15e12, # U.S. land area in square meters

    image_width_px=5472, # width of image in pixels (20MP camera default)

    image_height_px=3648, # height of image in pixels

    gsd_m=0.03, # ground sampling distance in meters/pixel (3 cm/pixel at 100m AGL)

    frontlap=0.70, # front overlap fraction (e.g., 70%)

    sidelap=0.70 # side overlap fraction (e.g., 70%)

):

    """

    Calculate the number of drone images required to cover a given area.

    Parameters:

    - us_area_m2: total area to cover (default: U.S. land area ~9.15e12 m^2)

    - image_width_px, image_height_px: image resolution in pixels

    - gsd_m: ground sampling distance in meters/pixel

    - frontlap, sidelap: overlap fractions (0.0–1.0)

    Returns:

    - num_images: estimated number of images required

    - footprint_raw: raw footprint area per image (m^2)

    - footprint_eff: effective new coverage per image with overlap (m^2)

    """

    # Ground footprint dimensions

    width_m = image_width_px * gsd_m

    height_m = image_height_px * gsd_m

    # Raw footprint area

    footprint_raw = width_m * height_m

    # Effective coverage per image with overlap

    footprint_eff = footprint_raw * (1 - frontlap) * (1 - sidelap)

    # Number of images required

    num_images = us_area_m2 / footprint_eff

    return num_images, footprint_raw, footprint_eff

if __name__ == "__main__":

    # Example with defaults

    num_images, raw_area, eff_area = calculate_num_images()

    print(f"Raw footprint per image: {raw_area:,.0f} m^2")

    print(f"Effective coverage per image (with overlap): {eff_area:,.0f} m^2")

    print(f"Total images required: {num_images:,.0f}")

    # Try different parameters

    num_images_alt, _, _ = calculate_num_images(gsd_m=0.025, frontlap=0.65, sidelap=0.65)

    print(f"\nWith 2.5 cm/pixel GSD and 65% overlap:")

    print(f"Total images required: {num_images_alt:,.0f}")

def calculate_storage_cost(

    total_images,

    image_size_kb=26, # size per image in KB

    tier1_limit_tb=50, # first tier limit in TB

    tier1_price_per_gb=0.018, # USD per GB for first 50 TB

    tier2_limit_tb=450, # second tier limit in TB

    tier2_price_per_gb=0.0173 # USD per GB for next 450 TB

):

    """

    Calculate monthly Azure storage cost for given number of images.

    Parameters:

    - total_images: number of images to store

    - image_size_kb: size of each image in KB (default 26 KB)

    - tier1_limit_tb: size of first pricing tier in TB (default 50 TB)

    - tier1_price_per_gb: price per GB for first tier

    - tier2_limit_tb: size of second pricing tier in TB (default 450 TB)

    - tier2_price_per_gb: price per GB for second tier

    Returns:

    - total_cost: monthly cost in USD

    - total_storage_tb: total storage required in TB

    """

    # Convert image size to bytes

    image_size_bytes = image_size_kb * 1024

    total_bytes = total_images * image_size_bytes

    # Convert to GB (binary, 1 GB = 2^30 bytes)

    total_gb = total_bytes / (2**30)

    total_tb = total_gb / 1024

    # Calculate tiered cost

    cost = 0.0

    remaining_gb = total_gb

    # Tier 1

    tier1_limit_gb = tier1_limit_tb * 1024

    if remaining_gb > 0:

        gb_in_tier1 = min(remaining_gb, tier1_limit_gb)

        cost += gb_in_tier1 * tier1_price_per_gb

        remaining_gb -= gb_in_tier1

    # Tier 2

    tier2_limit_gb = tier2_limit_tb * 1024

    if remaining_gb > 0:

        gb_in_tier2 = min(remaining_gb, tier2_limit_gb)

        cost += gb_in_tier2 * tier2_price_per_gb

        remaining_gb -= gb_in_tier2

    # Beyond tier 2 (if needed, assume same as tier2 price)

    if remaining_gb > 0:

        cost += remaining_gb * tier2_price_per_gb

    return cost, total_tb

if __name__ == "__main__":

    # Example: 5.66 billion images at 26 KB each

    total_images = int(5.66e9)

    cost, storage_tb = calculate_storage_cost(total_images)

    print(f"Total storage required: {storage_tb:,.1f} TB")

    print(f"Monthly cost: ${cost:,.2f}")

    # Try with a smaller dataset

    test_images = 1_000_000

    cost_test, storage_tb_test = calculate_storage_cost(test_images)

    print(f"\nFor {test_images:,} images:")

    print(f"Storage required: {storage_tb_test:.3f} TB")

    print(f"Monthly cost: ${cost_test:.2f}")


No comments:

Post a Comment