Senin, 21 Juli 2014

3G to 3G Neighbor Analyzer

Iseng2an yg kedua ini gara2 dulu waktu masih OSS ngebet banget pengen ke PLO 3G. Waktu dulu liat2 tmn yg PLO sih banyak kerjaannya create2 neighbor utk newsite, modalnya pke mapinfo, klak klik klak klik source target nya. Klo newsite nya cuma 3-4 sih gpp ya.. tp klo ampe puluhan kan puyeng juga tuh. Udh deh iseng bikin automatic create neighbor nya. 

Awalnya sih krn ini untuk keperluan newsite, yg mana waktu nyiapin neighbor nya si site nya blm tentu udh OA, jadi prediksinya cuma berdasarkan konfigurasi jarak dan azimuth. Nah trus dikembangin lg ampe yg versi terakhir ini (v.9) diperhitungkan juga SHO Attempt nya (barangkali nanti bakal dipakai di project MS).

3G-3G Neighbor Analyzer

Sederhananya, ada 5 point yang dihitung dalam prediksi neighbor ini, sesuai ama capture di atas :
  1. SHO Attempt
  2. Target to Ring Width : Posisi target di area ring width / search beam nya si source (defaultnya 270 deg).
  3. Azimuth Target to Both Direction : Point A pada gambar di bawah. Semakin mendekati 0 maka semakin besar nilai bobot nya.
  4. Azimuth Target to Azimuth Source : Point B pada gambar di bawah. Semakin mendekati 0 maka semakin besar nilai bobot nya.
  5. Target distance from Source.

Detail Kalkulasi 

Fungsi paling penting yg dipake di tool ini yaitu hitung jarak dan sudut dari 2 titik. Banyak sih di google, tinggal edit2 dikit dan diaplikasikan saja. Tapi untuk yg males googling dan edit2 lagi, berikut ini codingnya dalam bahasa basic (tinggal copy paste aja ke VBA access)

VBA nya kayak gini :
Option Compare Database
Const pi = 3.14159265358979

Function getDistance(lat1 As Double, lon1 As Double, lat2 As Double, lon2 As Double, unit As String)
  Dim theta As Double, dist As Double
  theta = lon1 - lon2
  dist = Sin(deg2rad(lat1)) * Sin(deg2rad(lat2)) + Cos(deg2rad(lat1)) * Cos(deg2rad(lat2)) * Cos(deg2rad(theta))

  dist = acos(dist)
  dist = rad2deg(dist)
  getDistance = dist * 60 * 1.1515
  Select Case UCase(unit)
    Case "K"
      getDistance = getDistance * 1.609344
    Case "N"
      getDistance = getDistance * 0.8684
  End Select
End Function


Function getAzimuth(Start_PT_Lat As Double, Start_PT_Long As Double, _
                    End_PT_Lat As Double, End_PT_Long As Double)
        
    Dim rStart_PT_Lat As Double
    Dim rEnd_PT_Lat As Double
    Dim Bearing As Double, dLon  As Double
    Dim x As Double, y As Double
    Dim AZM As Double
    
    dLon = End_PT_Long - Start_PT_Long
    
    y = Cos(deg2rad(Start_PT_Lat)) * Sin(deg2rad(End_PT_Lat)) - Sin(deg2rad(Start_PT_Lat)) * Cos(deg2rad(End_PT_Lat)) * Cos(deg2rad(dLon))
    x = Sin(deg2rad(dLon)) * Cos(deg2rad(End_PT_Lat))
    
    Bearing = aTan2(y, x)
    
    AZM = Round(rad2deg(Bearing), 0.1)
    If AZM < 0 Then
            getAzimuth = 360 - Abs(AZM)
    Else
            getAzimuth = AZM
    End If
End Function


'::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
':::  this function get the arccos function from arctan function    :::
'::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
Function acos(rad As Double)
  If Abs(rad) <> 1 Then
    acos = pi / 2 - Atn(rad / Sqr(1 - rad * rad))
  ElseIf rad = -1 Then
    acos = pi
  End If
End Function


'::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
':::  this function converts decimal degrees to radians             :::
'::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
Function deg2rad(deg As Double)
    deg2rad = CDbl(deg * pi / 180)
End Function

'::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
':::  this function converts radians to decimal degrees             :::
'::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
Function rad2deg(rad As Double)
    rad2deg = CDbl(rad * 180 / pi)
End Function

Function aTan2(y As Double, x As Double)
    If x > 0 Then
        aTan2 = Atn(y / x)
    ElseIf x < 0 And y >= 0 Then
        aTan2 = Atn(y / x) + pi
    ElseIf x = 0 And y > 0 Then
        aTan2 = pi / 2
    ElseIf x < 0 And y < 0 Then
        aTan2 = Atn(y / x) - pi
    ElseIf x = 0 And y < 0 Then
        aTan2 = -pi / 2
    End If
End Function

Atau kalau mau yg tinggal pake, download aja 3G-3G Neighbor Analyzer disini :D

Untuk skrg sih tool ini lg dikembangin ke mapbasic, jadi hasil prediksinya bisa keliatan langsung di mapinfo, plus banyak lg fitur2 standar seperti view/add/delete neighbor, dan fitur lainnya seperti overshooting search, touchdown TP/TA, dll. Untuk yg versi mapbasic bahas di posting lainnya aja kali ya.

Tidak ada komentar:

Posting Komentar