• Web sitemizin içeriğine ve tüm hizmetlerimize erişim sağlamak için Web sitemize kayıt olmalı ya da giriş yapmalısınız. Web sitemize üye olmak tamamen ücretsizdir.

Harita Ölçek Hesaplayayıcısı.PS1 Betiği

TRWE_2012

لِيَغْفِرَ لَكَ اللّٰهُ مَا تَقَدَّمَ مِنْ ذَنْبِك
Moderatör
Konum
BERTUNA
Forum Yaşı
6 Yıl
Mesajlar
5,457
Tepkime puanı
17,030
Merhabalar

Ekran Görüntüsü :

Ds9IfXL.gif


KOD İÇERİĞİ :

Kod:
# Harita Ölçek Dönüşüm Betiği (BigInteger + Decimal)
Add-Type -AssemblyName System.Numerics

function Get-ScaleType {
    param([System.Numerics.BigInteger]$scaleBI)
    # scaleBI ile karşılaştırma için int64 güvenli aralıkta kontrol et
    try {
        $s = [int64]$scaleBI
    } catch {
        return "Aşırı Küçük Ölçek (1/x çok büyük)"
    }

    if ($s -le 1000) { return "Çok Büyük Ölçekli Harita (1/1.000 ve daha büyük)" }
    elseif ($s -le 5000) { return "Büyük Ölçekli Harita (1/1.001 – 1/5.000)" }
    elseif ($s -le 25000) { return "Orta Ölçekli Harita (1/5.001 – 1/25.000)" }
    elseif ($s -le 100000) { return "Küçük Ölçekli Harita (1/25.001 – 1/100.000)" }
    elseif ($s -le 500000) { return "Çok Küçük Ölçekli Harita (1/100.001 – 1/500.000)" }
    else { return "Aşırı Küçük Ölçek (1/500.000+)" }
}

Write-Output "===== Harita Ölçek Dönüşüm Betiği ====="

# 1) Mesafe giriş
$distanceInput = Read-Host "Mesafeyi girin (sayı olarak, tam sayı veya ondalık kabul edilir)"
$unit = Read-Host "Birimi seçin (m/km)"

# Decimal için güvenli parse
try {
    $distanceDecimal = [decimal]::Parse($distanceInput)
} catch {
    Write-Error "Mesafe değeri okunamadı. Lütfen sayısal bir değer girin."
    exit 1
}

# BigInteger için metre bazlı tam sayı (kullanıcı büyük tam sayı girerse)
# Eğer kullanıcı ondalıklı bir sayı verdiyse, tam mm hesabı için önce metri ondalıklı -> mm -> BigInteger kullanacağız.
# Ancak BigInteger::Parse sadece tam sayı string ister; bu yüzden integer kısmı alma veya ondalıklı mm dönüştürme yolu kullanacağız.
# Önce kullanıcı girişi metre cinsinden (decimal), sonra BigInteger metre kısmı oluşturulacak.
if ($unit -eq "km") {
    $distanceDecimalMeters = $distanceDecimal * 1000
} else {
    $distanceDecimalMeters = $distanceDecimal
}

# BigInteger metresini oluştur (tam metrenin tam kısmı)
# Burada metrenin tam kısmını alıyoruz; ondalıklı değer için mm hesabında decimal kullanacağız.
$distanceMetersWhole = [System.Numerics.BigInteger]::Parse([string][math]::Floor($distanceDecimalMeters))

# 2) Ölçek
$scaleInput = Read-Host "Ölçek katsayısı (ör: 50000)"
try {
    $scaleDecimal = [decimal]::Parse($scaleInput)
} catch {
    Write-Error "Ölçek değeri okunamadı. Lütfen sayısal bir değer girin."
    exit 1
}
try {
    $scaleBig = [System.Numerics.BigInteger]::Parse($scaleInput)
} catch {
    Write-Error "Ölçek değeri BigInteger olarak okunamadı."
    exit 1
}

# 3) Yön
$direction = Read-Host "Dönüşüm yönü? 1=Gerçek → Harita, 2=Harita → Gerçek"

Write-Output "`n===== Sonuçlar =====`n"

if ($direction -eq "1") {
    # Gerçek -> Harita

    # 1) Ondalıklı metre sonucu (decimal)
    $mapDecMetre = $distanceDecimalMeters / $scaleDecimal
    # formatlı gösterim (gerekirse)
    $mapDecMetreStr = [string]::Format("{0:N6}", $mapDecMetre).TrimEnd('0').TrimEnd('.')

    Write-Output "Ondalıklı (decimal) sonuç: $mapDecMetreStr metre"

    # 2) Kesirsiz BigInteger sonuç (mm cinsinden)
    # Kullanıcı tarafından girilen (metre) ondalıklı değer -> önce mm (decimal) -> round down to integer mm
    $distanceMM_decimal = [math]::Floor($distanceDecimalMeters * 1000)   # decimal -> floor to mm
    $distanceMM_BI = [System.Numerics.BigInteger]::Parse([string]$distanceMM_decimal)

    # mm cinsinden harita mesafesi = distanceMM_BI / scaleBig  (tam mm, küsürat atılır)
    if ($scaleBig -eq [System.Numerics.BigInteger]::Zero) {
        Write-Error "Ölçek 0 olamaz."
        exit 1
    }
    $mapMM_BI = [System.Numerics.BigInteger]::Divide($distanceMM_BI, $scaleBig)
    Write-Output "Kesirsiz BigInteger sonuç: $mapMM_BI mm"

    # 3) mm -> m cm mm ayrıştırma
    $m = [System.Numerics.BigInteger]::Divide($mapMM_BI, 1000)
    $rem_mm = $mapMM_BI % 1000
    $cm = [System.Numerics.BigInteger]::Divide($rem_mm, 10)
    $mm = $rem_mm % 10

    Write-Output "Ayrıştırılmış sonuç: ${m} m ${cm} cm ${mm} mm"

    # Açıklama / ölçek türü
    $scaleType = Get-ScaleType -scaleBI $scaleBig
    $explanation = "Arazi gerçekte büyük olduğunda, 1/$scaleBig ölçekli bir harita onu $scaleBig kat küçültür. " +
                   "Bu yüzden haritada görülen '$([string]$mapDecMetreStr) m' uzunluğundaki çizgi, gerçekte çok daha büyük bir değeri temsil eder. " +
                   "Ölçek türü: $scaleType."
    Write-Output "`nAçıklama:`n$explanation"
}
elseif ($direction -eq "2") {
    # Harita -> Gerçek

    # 1) Ondalıklı (decimal) gerçek metre
    $realDecMetre = $distanceDecimalMeters * $scaleDecimal
    $realDecMetreStr = [string]::Format("{0:N6}", $realDecMetre).TrimEnd('0').TrimEnd('.')
    Write-Output "Ondalıklı (decimal) sonuç: $realDecMetreStr metre"

    # 2) BigInteger tam mm hesap
    # Kullanıcının girdiği mesafe (map metre) -> önce mm tam kısm
    $mapMM_decimal = [math]::Floor($distanceDecimalMeters * 1000)
    $mapMM_BI = [System.Numerics.BigInteger]::Parse([string]$mapMM_decimal)

    $realMM_BI = [System.Numerics.BigInteger]::Multiply($mapMM_BI, $scaleBig)
    Write-Output "Kesirsiz BigInteger sonuç: $realMM_BI mm"

    # 3) mm -> m cm mm ayrıştırma
    $m = [System.Numerics.BigInteger]::Divide($realMM_BI, 1000)
    $rem_mm = $realMM_BI % 1000
    $cm = [System.Numerics.BigInteger]::Divide($rem_mm, 10)
    $mm = $rem_mm % 10

    Write-Output "Ayrıştırılmış sonuç: ${m} m ${cm} cm ${mm} mm"

    $scaleType = Get-ScaleType -scaleBI $scaleBig
    $explanation = "1/$scaleBig ölçekli haritadaki '$distanceDecimalMeters m' uzunluğu, gerçekte $([string]$realDecMetreStr) metreye karşılık gelir. Ölçek türü: $scaleType."
    Write-Output "`nAçıklama:`n$explanation"
}
else {
    Write-Error "Geçersiz yön seçimi. Lütfen 1 veya 2 girin."
}

Write-Host ""
Read-Host "Çıkmak için Enter'a bas..."

Güle güle kullanın...! :)
 

Ekli dosyalar

Geri
Üst