• Tidak ada hasil yang ditemukan

IMPLEMENTASI DAN PENGUJIAN SISTEM

DAFTAR PUSTAKA

[1] Munir, R. 2009. Matematika Diskrit. Edisi Ketiga. Informatika. Bandung.

[2] Yatini, I. & Nasution, E. 2005. Algoritma dan Struktur Data. Graha Ilmu.

Yogyakarta.

[3] P. Insap Santosa. 2004. Struktur Data Menggunakan Turbo Pascal 6.0. Andi.

Yogyakarta.

[4] Kurniawan, I. 2010. Sistem Informasi Geografis Berbasis WEB Sebagai

Penentu Shortest Path Dengan Menggunakan Algoritma Dijkstra. Skripsi.

Universitas Sumatera Utara.

[5] Purwanato, Y., Purwitasari, D. & Wibowo, A.W. 2005. Implementasi Dan

Analisis Algoritma Pencarian Rute Terpendek Di Kota Surabaya. Jurnal Penelitian dan Pengembangan Telekomunikasi. Fakultas Teknik Informatika, Vol.10, No.2, Hal. 94.

[6] Nurwiningtyas, O. 2015. Aplikasi Pencarian Pos Pendakian Gunung Merbabu Menggunakan Formula Haversine Dilengkapi Dengan Prakiraan Cuaca Dan Kompas Berbasis Android. Skripsi. Universitas Dian Nuswantoro.

[7] Ismail, N., Maharoni. & Lindra, I. 2015. Analisis Perencanaan Pembangunan

BTS (Base Transceiver Station) Berdasarkan Faktor Kelengkungan Bumi Dan Daerah Fresnel Di Regional Project Sumatera Bagian Selatan. Jurnal Teknik Elektro, Vol 9, No. 1, Hal. 107.

[8] Ardiansyah., Efendi, F.S., Syaifullah., Pinto, M., Pujianto. & Tempake, H.S.

2010. Implementasi Algoritma Greedy Untuk Melakukan Graph Coloring:

Studi Kasus Peta Provinsi Jawa Timur. Jurnal Informasi, Vol 4, No. 1. Hal. 1-2.

[9] Daud, M. 2013. Sistem Informasi Geogarfis Pendataan Kos Berbasis Web Di Kota Gorontalo. Skripsi. Universitas Negeri Gorontalo.

[10] Putri, R.M. 2012. Aplikasi Petunjuk Arah Kampus Gunadarma (D&J) Menggunakan Metode Haversine. Skripsi. Universita Gunadarma.

[11] Hidayat, S. 2014. Sistem Informasi Geografis Menentukan Lokasi Bandara

Terdekat Untuk Pendaratan Darurat Dengan Menggunakan Haversine Formula. Skripsi. Universitas Maritim Raja Ali Haji.

[12] Fitria. & Triansyah, A. 2013. Implementasi Algoritma Dijkstra Dalam

Aplikasi Untuk Menentukan Lintasan Terpendek Jalan Darat Antar Kota Di Sumatera Bagian Selatan. Jurnal Sistem Informasi (JSI), Vol 5, No. 2, Hal 612.

[13] Putra, R.M.D.P., Sujiani, H. & Safriandi, N. 2015. Penerapan Metode

Haversine Formula Pada Sistem Informasi Geografis Pengukuran Luas Tanah. Jurnal Sistem dan Teknologi Informasi (JUSTIN), Vol 1, No. 1, Hal

2. Universitas Sumatera Utara

[14] Sitanggang, S. 2010. Perbandingan Algoritma Dijksatra Dan Floyd-Warshall

Dalam Pemilihan Rute Terpendek Jaringan Jalan. Skripsi. Universitas Sumatera Utara.

[15] Hidayat, A. 2013. Pencarian Rute Terpendek Dengan Menggunakan Algoritma Floyd Warshall Untuk Taksi Dengan Rute Terminal Leuwi Panjang Dipati Ukur. Skripsi. Universita Komputer Indonesia.

[16] Priatmoko, S. B. 2014. Algoritma Dijkstra Untuk Pencarian Jalur Terdekat

Dan Rekomendasi Objek Pariwisata Di Pulau Bali. Skripsi. Universitas Dian Nuswantoro.

[17] Gallo. G & Pallotino. S. 1998. Shortest Path Algorithm. Annals of Operations Research 13 (1988) 3-79.

[18] Broumi, Said. 2016. Applying Dijkstra Algorithm for Solving Neutrosophic Shortest Path Problem. IEEE. Vol. 6, 978-1-5090-5346-9.

[19] Szczesniak, Ireneusz & Bozena Wo´zna-Szczesniak. 2016. Adapted and

Constrained Dijkstra for Elastic Optical Networks. IEEE. Vol. 6, 978-1-4673-9988-3.

Form Home :

/// Description of home.

/// </summary>

public partial class home : Form {

public home() {

//

// The InitializeComponent() call is required for Windows Forms designer support.

//

InitializeComponent();

//

// TODO: Add constructor code after the InitializeComponent() call.

//

}

tArgs e)

void PengolahanDataToolStripMenuItemClick(object sender, Even {

Pengujian f2 = new Pengujian();

f2.Show();

this.Hide();

}

void HomeFormClosing(object sender, FormClosingEventArgs e) {

DialogResult tombol = MessageBox.Show("Apakah anda ingin keluar

?","Pertanyaan", MessageBoxButtons.YesNo,MessageBoxIcon.Question, Mes sageBoxDefaultButton.Button1);

else if (tombol == DialogResult.Yes) {

Form Pengujian :

/// Description of Pengujian.

/// </summary>

public partial class Pengujian : Form {

Map map;

List<Node> semuaNode;

DatabaseHelper dbHelper;

Node asal, tujuan;

Djikstra algoDjikstra;

bool solusiDjikstra;

float ukuranGaris = 5f;

float ukuranPattern = 5f;

public Pengujian() {

//

// The InitializeComponent() call is required for Windows Forms designer support.

//

InitializeComponent();

map = new Map(panel_graph);

dbHelper = new DatabaseHelper();

semuaNode = dbHelper.ambilSemuaNode();

asal = null;

tujuan = null;

isiComboBox();

/*

* Test Haversine

*/

Haversine.hitungJarak(ambilNodeBerdasarkanId(1), ambilNod eBerdasarkanId(3));

//

// TODO: Add constructor code after the InitializeComponent() call.

//

}

Node ambilNodeBerdasarkanId(int id){

foreach(Node node in semuaNode){

if(node.getId() == id) return node;

void gambarGraph(){

/*

* Bersihkan semua gambar dari graph

*/

map.mapGraphics.Clear(panel_graph.BackColor);

/*

* Menggambar semua link pada graph

*/

foreach(Node node in semuaNode){

foreach(Hubungan hubungan in node.getHubungan()){

map.drawLink(node.getX(), node.getY(), hubungan.g etNode().getX(), hubungan.getNode().getY(), hubungan.getJarak(), fals e);

} }

if(solusiDjikstra){

/*

* Konfigurasi tampilan garis

*/

Pen ruteDjikstra

= new Pen(Color.DarkRed, ukuranGaris);

map.drawPath(algoDjikstra.hasil, ruteDjikstra);

} /*

* Menggambar lingkaran

*/

foreach(Node node in semuaNode){

map.drawNode(node);

} /*

* Menggambar jarak antar node

*/

foreach(Node node in semuaNode){

foreach(Hubungan hubungan in node.getHubungan()){

map.drawDistance(node.getX(), node.getY(), hubung an.getNode().getX(), hubungan.getNode().getY(), hubungan.getJarak());

} } /*

* Menggambar penanda asal dan tujuan pada graph

*/

if(asal != tujuan){

if(asal != null)

map.drawNode(asal, new SolidBrush(Color.Yellow));

if(tujuan != null)

map.drawNode(tujuan, new SolidBrush(Color.Yellow) );

} }

void isiComboBox(){

Universitas Sumatera Utara

combobox_asal_pengujian.DataSource = null;

combobox_tujuan_pengujian.DataSource = null;

combobox_asal_pengujian.Items.Clear();

combobox_asal_pengujian.DisplayMember = "Text";

combobox_asal_pengujian.ValueMember = "Value";

combobox_tujuan_pengujian.Items.Clear();

combobox_tujuan_pengujian.DisplayMember = "Text";

combobox_tujuan_pengujian.ValueMember = "Value";

List<object> items = new List<object>();

foreach(Node node in semuaNode){

items.Add(

new {

Text = node.getNama() + "

[" + node.getAbjad() + "] ",

Value = node.getId() }

);

}

combobox_asal_pengujian.DataSource

= new List<object>(items);

combobox_tujuan_pengujian.DataSource

= new List<object>(items);

}

void Button1Click(object sender, EventArgs e) {

semuaNode = dbHelper.ambilSemuaNode();

panel_graph.Invalidate();

isiComboBox();

solusiDjikstra = false;

}

void Panel_graphPaint(object sender, PaintEventArgs e) {

gambarGraph();

}

void Combobox_asal_pengujianSelectedIndexChanged(object sende r, EventArgs e)

void Combobox_tujuan_pengujianSelectedIndexChanged(object sen der, EventArgs e)

{

tujuan

= ambilNodeBerdasarkanId(Convert.ToInt32(combobox_tujuan_pengujian.Se lectedValue));

void Btn_cari_ruteClick(object sender, EventArgs e) {

if(asal != tujuan && asal != null && tujuan != null){

algoDjikstra = new Djikstra(semuaNode);

solusiDjikstra = false;

if(algoDjikstra.cariRuteTerpendek(asal, tujuan)){

solusiDjikstra = true;

listbox_rute_djikstra.Items.Clear();

for(int i

= 1; i < algoDjikstra.hasil.Count; i++){

Node node = algoDjikstra.hasil[i];

Node nodePrev = algoDjikstra.hasil[i-1];

String teks = "Dari

" + nodePrev.getNama() + " ke " + node.getNama() + " lewat Jln." + node.dariJalan;

listbox_rute_djikstra.Items.Add(teks);

}

label_running_time_djikstra.Text = algoDjikstra.runningTime.TotalMilliseconds + "ms";

total_jarak_djikstra.Text =

String.Format("{0:0.000}", algoDjikstra.totalJarak) + " km";

} }

panel_graph.Invalidate();

}

void Panel_graphMouseMove(object sender, MouseEventArgs e) {

foreach(Node node in semuaNode){

float xStart = node.getX() - (35 / 2.0F), xEnd = xStart + 35,

yStart = node.getY() - (25 / 2.0F), yEnd = yStart + 25;

if( e.X >= xStart && e.X <= xEnd

&& e.Y >= yStart && e.Y <= yEnd){

label_info_node.Text = node.getNama();

label_info_alamat.Text = node.getAlamat();

return;

} }

label_info_node.Text = "";

label_info_alamat.Text = "";

}

void UbahDataToolStripMenuItemClick(object sender, EventArgs e) {

new PengolahanData().Show();

}

void BantuanToolStripMenuItemClick(object sender, EventArgs e) {

new Bantuan().Show();

Universitas Sumatera Utara

}

void TentangPenulisToolStripMenuItemClick(object sender, EventArgs e) {

new Tentang().Show();

}

void ToolStripButton1Click(object sender, EventArgs e) {

new PengolahanData().Show();

}

void ToolStripButton2Click(object sender, EventArgs e) {

new Tentang().Show();

}

void ToolStripButton3Click(object sender, EventArgs e) {

new Bantuan().Show();

}

void PengujianFormClosing(object sender, FormClosingEventArgs e) {

DialogResult tombol = MessageBox.Show("Apakah anda ingin keluar ?", "Pertanyaan",

MessageBoxButtons.YesNo,MessageBoxIcon.Question, MessageBoxDefaultBut

else if (tombol == DialogResult.Yes) {

Environment.Exit(0);

} }

void HomeToolStripMenuItemClick(object sender, EventArgs e) {

Form Pengolahan Data :

/// Description of PengolahanData.

/// </summary>

public partial class PengolahanData : Form {

dbHelper = new DatabaseHelper();

refreshDataGridNode();

isiComboBoxStatus();

}

public void refreshDataGridNode(){

datagrid.Rows.Clear();

semuaNode = dbHelper.ambilSemuaNode();

foreach(Node node in semuaNode){

datagrid.Rows.Add(new object[]{

public void refreshDataGridKoneksi(){

datagrid_koneksi.Rows.Clear();

semuaKoneksi = dbHelper.ambilSemuaKoneksi();

foreach(DataKoneksi item in semuaKoneksi){

datagrid_koneksi.Rows.Add(new object[]{

void BtnTambahClick(object sender, EventArgs e)

} catch(Exception ex){

MessageBox.Show("Data tidak

valid", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);

}

refreshDataGridNode();

}

void TabControl1SelectedIndexChanged(object sender, EventArgs e)

{

if(tabControl1.SelectedIndex == 0){

//Jika tab 1 (node) yang aktif maka kita refresh Data Grid Node

refreshDataGridNode();

} else

if(tabControl1.SelectedIndex == 1){

//Jika tab 2 (koneksi) yang aktif maka kita refresh Data Grid Koneksi dan Combo Box

isiComboBox();

* Combobox untuk menyatakan titik yang diinputkan

* merupakan node atau simpang

*/

combobox_status_tambah.DataSource = null;

combobox_status_update.DataSource = null;

List<object> status = new List<object>(){

new {

Text = "Simpang", Value = 0

}, new {

Text = "Node", Value = 1 };

combobox_status_tambah.Items.Clear();

combobox_status_tambah.DisplayMember = "Text";

combobox_status_tambah.ValueMember = "Value";

combobox_status_tambah.DataSource

= new List<object>(status);

combobox_status_update.Items.Clear();

combobox_status_update.DisplayMember = "Text";

combobox_status_update.ValueMember = "Value";

combobox_status_update.DataSource

= new List<object>(status);

}

void isiComboBox(){

combobox_asal.DataSource = null;

combobox_asal_update.DataSource = null;

combobox_tujuan.DataSource = null;

combobox_tujuan_update.DataSource = null;

combobox_asal.Items.Clear();

combobox_asal.DisplayMember = "Text";

combobox_asal.ValueMember = "Value";

combobox_asal_update.Items.Clear();

combobox_asal_update.DisplayMember = "Text";

combobox_asal_update.ValueMember = "Value";

combobox_tujuan.Items.Clear();

combobox_tujuan.DisplayMember = "Text";

combobox_tujuan.ValueMember = "Value";

combobox_tujuan_update.Items.Clear();

combobox_tujuan_update.DisplayMember = "Text";

combobox_tujuan_update.ValueMember = "Value";

List<object> items = new List<object>();

foreach(Node node in semuaNode){

items.Add(

new {

Text = node.getNama() + " [" + node.getId() +"]", Value = node.getId()

} );

}

combobox_asal.DataSource = new List<object>(items);

combobox_asal_update.DataSource

= new List<object>(items);

combobox_tujuan.DataSource = new List<object>(items);

combobox_tujuan_update.DataSource

= new List<object>(items);

}

void BtnHapusClick(object sender, EventArgs e) {

try {

//Memastikan bahwa id sudah diset if(!(tb_id_update.Text.Equals(""))){

int indexBaris = datagrid.SelectedCells[0].RowIndex;

DataGridViewRow satuBaris = datagrid.Rows[indexBaris];

int id = Convert.ToInt32(satuBaris.Cells["id"].Value);

dbHelper.hapusNode(id);

} }

Universitas Sumatera Utara

catch(Exception ex){

MessageBox.Show("Proses tidak bisa

dilakukan", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);

}

refreshDataGridNode();

}

void DatagridCellClick(object sender, DataGridViewCellEventArgs e) {

int indexBaris = datagrid.SelectedCells[0].RowIndex;

DataGridViewRow satuBaris = datagrid.Rows[indexBaris];

tb_id_update.Text =

= (int) satuBaris.Cells["status"].Value;

} catch (Exception ex){

} }

void BtnUpdateClick(object sender, EventArgs e) {

try {

int indexBaris = datagrid.SelectedCells[0].RowIndex;

DataGridViewRow satuBaris = datagrid.Rows[indexBaris];

//Memastikan bahwa id sudah diset if(!(tb_id_update.Text.Equals(""))){ } catch(Exception ex){

MessageBox.Show("Proses tidak bisa

dilakukan", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error );

} }

void Btn_tambah_koneksiClick(object sender, EventArgs e)

} catch (Exception ex){

MessageBox.Show("Proses tidak bisa dilakukan

" + ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIco n.Error);

}

refreshDataGridKoneksi();

}

void Datagrid_koneksiCellClick(object sender, DataGridV iewCellEventArgs e)

{

int indexBaris =

datagrid_koneksi.SelectedCells[0].RowIndex;

DataGridViewRow satuBaris = datagrid_koneksi.Rows[indexBaris];

void Btn_hapus_koneksiClick(object sender, EventArgs e) {

try {

//Memastikan bahwa id sudah diset

if(!(tb_id_koneksi_update.Text.Equals(""))){

int indexBaris =

datagrid_koneksi.SelectedCells[0].RowIndex;

DataGridViewRow satuBaris = datagrid_koneksi.Rows[indexBaris];

int id =

Universitas Sumatera Utara

Convert.ToInt32(satuBaris.Cells["id_koneksi"].Value);

dbHelper.hapusKoneksi(id);

}

} catch(Exception ex){

MessageBox.Show("Proses tidak bisa

dilakukan", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error );

}

refreshDataGridKoneksi();

}

void Btn_update_koneksiClick(object sender, EventArgs e)

{

try {

int indexBaris =

datagrid_koneksi.SelectedCells[0].RowIndex;

DataGridViewRow satuBaris = datagrid_koneksi.Rows[indexBaris];

e, lue,

//Memastikan bahwa id sudah diset

if(!(tb_id_koneksi_update.Text.Equals(""))){

} catch(Exception ex){

MessageBox.Show("Proses tidak bisa dilakukan

" + ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIco n.Error);

} } } }

Class DatabaseHelper.cs :

/// Description of DatabaseHelper.

/// </summary>

public class DatabaseHelper {

string TABEL_1 = "TABEL_NODE";

string TABEL_2 = "TABEL_KONEKSI";

SQLiteConnection sql;

List<Node> hasil;

public DatabaseHelper() {

//Lakukan pengecekkan jika seandainya database sudah ada //Jika database tidak ada

bool baruDibuat = false;

if(!File.Exists("db.sqlite")){

baruDibuat = true;

SQLiteConnection.CreateFile("db.sqlite");

}

//Melakukan koneksi ke db.sqlite sql = new SQLiteConnection("Data Source=db.sqlite;Version=3;");

sql.Open();

//Proses pembuatan tabel if(baruDibuat){

//Membuat tabel Node /*

* Untuk kasus A* dibutuhkan jarak heuristik

* Jarak Heuristik dihitung dengan menggunakan metode haversine

* Haversine membutuhkan latitude longitude

*/

String sqlSyntax = "CREATE TABLE " + TABEL_1 + " ("

+ "id INTEGER primary key AUTOINCREMENT,"

+ "nama TEXT,"

+ "alamat TEXT,"

+ "x REAL,"

+ "y REAL,"

+ "lat REAL,"

+ "lng REAL,"

+ "status INTEGER"

+ ")";

Universitas Sumatera Utara

SQLiteCommand sqlCommand

= new SQLiteCommand(sqlSyntax, sql);

if(sqlCommand.ExecuteNonQuery() <= 0)

MessageBox.Show("Gagal membuat tabel node");

//Membuat tabel Koneksi

sqlSyntax = "CREATE TABLE " + TABEL_2 + " ("

+ "id INTEGER primary key AUTOINCREMENT,"

+ "idAwal INTEGER,"

+ "idAkhir INTEGER,"

+ "jarak REAL,"

+ "jalan TEXT"

+ ")";

sqlCommand = new SQLiteCommand(sqlSyntax, sql);

if(sqlCommand.ExecuteNonQuery() <= 0)

MessageBox.Show("Gagal membuat tabel Koneksi");

} }

//Fungsi dari ambilSemuaNode adalah mengambil semua data yang ada pada database

public List<Node> ambilSemuaNode(){

hasil = new List<Node>();

List<DataKoneksi> koneksi = new List<DataKoneksi>();

String sqlSyntax = "SELECT * FROM " + TABEL_1;

SQLiteCommand sqlCommand

= new SQLiteCommand(sqlSyntax, sql);

SQLiteDataReader sqlReader = sqlCommand.ExecuteReader();

int abjad_ascii = 65;

int simpang_mark = 1;

while(sqlReader.Read()){

Node newNode

= new Node(int.Parse(sqlReader["id"].ToString()),

sqlReader["nama"].ToString(),

* Jika Node yang diambil bukanlah simpang

* maka berikan dia penanda berupa karakter A-Z

*/

if(newNode.getStatus() == 1){

newNode.abjad = Char.ConvertFromUtf32(abjad_ascii++);

}

newNode.abjad = simpang_mark++.ToString();

}

hasil.Add(newNode);

}

/*

*

* TODO:Tambahkan koneksi dari tabel koneksi ke dalam node.hubungan

*

*/

koneksi = ambilSemuaKoneksi();

foreach(Node node in hasil){

foreach(DataKoneksi data in koneksi){

Node asal = new Node(), tujuan = new Node();

//Mencari node sesuai dengan id pada dataKoneksi foreach(Node node_pencarian in hasil){

if(node_pencarian.getId() == data.idAwal){

asal = node_pencarian;

}

if(node_pencarian.getId() == data.idTujuan){

tujuan = node_pencarian;

} }

lan);

if(data.idAwal == node.getId()){

node.tambahHubungan(tujuan, data.jarak, data.jalan);

} else if(data.idTujuan == node.getId()){

node.tambahHubungan(asal, data.jarak, data.ja }

} }

return hasil;

}

Node ambilNodeBerdasarkanId(int id){

foreach(Node node in hasil){

if(node.getId() == id) return node;

}

return null;

}

public List<DataKoneksi> ambilSemuaKoneksi(){

List<DataKoneksi> hasil = new List<DataKoneksi>();

String sqlSyntax = "SELECT tbl2.id AS id, tbl2.idAwal AS idAwal, tbl3.nama AS asal, tbl2.idAkhir AS idTujuan, tbl4.nama AS tujuan, tbl2.jarak AS jarak, tbl2.jalan AS jalan " +

"FROM " + TABEL_2 + " AS tbl2, (SELECT * FROM

" + TABEL_1 + ") AS tbl3, (SELECT * FROM " + TABEL_1 + ") AS tbl4 " +

"WHERE idAwal = tbl3.id AND idTujuan = tbl4.id";

SQLiteCommand sqlCommand

= new SQLiteCommand(sqlSyntax, sql);

SQLiteDataReader sqlReader = sqlCommand.ExecuteReader();

while(sqlReader.Read()){

DataKoneksi item = new DataKoneksi(

int.Parse(sqlReader["id"].ToString()),

0,

sqlReader["jalan"].ToString());

/*

* Proses pengaturan jarak antar titik menggunakan haversine

*/

public bool hapusNode(int id){

String sqlSyntax = "DELETE FROM " + TABEL_1 + " WHERE id = " + id;

SQLiteCommand sqlCommand

= new SQLiteCommand(sqlSyntax, sql);

if(sqlCommand.ExecuteNonQuery() > 0){

return true;

} else {

return false;

} }

public bool hapusKoneksi(int idKoneksi){

String sqlSyntax = "DELETE FROM " + TABEL_2 + "

WHERE id = " + idKoneksi;

SQLiteCommand sqlCommand

= new SQLiteCommand(sqlSyntax, sql);

if(sqlCommand.ExecuteNonQuery() > 0){

return true;

} else {

return false;

} }

public bool updateNode(int id, Node newNode){

String sqlSyntax = "UPDATE " + TABEL_1 + " SET "

+ " nama='" + newNode.getNama() + "',"

+ " alamat='" + newNode.getAlamat() + "',"

+ " x=" + newNode.getX() + ","

+ " y=" + newNode.getY() + ","

+ " lat=" + newNode.getLat() + ","

+ " lng=" + newNode.getLng() + ","

+ " status=" + newNode.getStatus() + " WHERE id = " + id;

SQLiteCommand sqlCommand

= new SQLiteCommand(sqlSyntax, sql);

if(sqlCommand.ExecuteNonQuery() > 0){

return true;

} else {

return false;

public bool updateNode(int id, String nama, String alamat, float x, float y, float lat, float lng, int status){

String sqlSyntax = "UPDATE " + TABEL_1 + " SET "

+ " nama='" + nama + "',"

= new SQLiteCommand(sqlSyntax, sql);

if(sqlCommand.ExecuteNonQuery() > 0){

return true;

} else {

return false;

} }

public bool updateKoneksi(int id, int idAwal, int idTuj uan, string jalan){

String sqlSyntax = "UPDATE " + TABEL_2 + " SET "

+ " idAwal=" + idAwal + ","

+ " idAkhir=" + idTujuan + ","

+ " jalan=" + jalan + " WHERE id = " + id;

SQLiteCommand sqlCommand

= new SQLiteCommand(sqlSyntax, sql);

if(sqlCommand.ExecuteNonQuery() > 0){

return true;

} else {

return false;

} }

public bool tambahNode(Node node){

String sqlSyntax = "INSERT INTO

" + TABEL_1 + "(nama, alamat, x, y, lat, lng, status) VALUES ("

+ "'" + node.getNama() + "', "

= new SQLiteCommand(sqlSyntax, sql);

if(sqlCommand.ExecuteNonQuery() > 0){

return true;

} else {

return false;

} }

public bool tambahNode(String nama, String

alamat, float x, float y, float lat, float lng, int status){

String sqlSyntax = "INSERT INTO

Universitas Sumatera Utara

" + TABEL_1 + "(nama, alamat, x, y, lat, lng, status) VALUES ("

= new SQLiteCommand(sqlSyntax, sql);

if(sqlCommand.ExecuteNonQuery() > 0){

return true;

} else {

return false;

} }

public bool tambahKoneksi(int idAwal, int idAkhir, stri ng jalan){

String sqlSyntax = "INSERT INTO

" + TABEL_2 + "(idAwal, idAkhir, jalan) VALUES ("

+ idAwal + ", "

+ idAkhir + ", "

+ "'" + jalan + "'"

+ ")";

SQLiteCommand sqlCommand

= new SQLiteCommand(sqlSyntax, sql);

if(sqlCommand.ExecuteNonQuery() > 0){

return true;

Class DataKoneksi.cs :

using System;

namespace Skripsi {

/// <summary>

/// Description of DataKoneksi.

/// </summary>

public class DataKoneksi {

public int id, idAwal, idTujuan;

public String asal, tujuan, jalan;

public float jarak;

public DataKoneksi() {

}

public DataKoneksi(int id, int idAwal, String

asal, int idTujuan, String tujuan, float jarak, string jalan){

this.id = id;

this.idAwal = idAwal;

this.asal = asal;

this.idTujuan = idTujuan;

this.tujuan = tujuan;

this.jarak = jarak;

this.jalan = jalan;

} } }

Universitas Sumatera Utara

Class Djikstra.cs :

/// Description of Djikstra.

/// </summary>

public class Djikstra {

List<Node> semuaNode;

/*

* Variabel penampung rute terpendek

*/

public List<Node> hasil;

public float totalJarak;

/*

* Variabel penampung running time

*/

public TimeSpan runningTime;

public Djikstra() {

}

public Djikstra(List<Node> semuaNode){

this.totalJarak = 0;

this.hasil = new List<Node>();

this.semuaNode = new List<Node>(semuaNode);

}

public bool cariRuteTerpendek(Node asal, Node tujuan){

/*

* Menghitung running time

*/

var watch = System.Diagnostics.Stopwatch.StartNew();

Node aktif = new Node();

foreach(Node node in semuaNode){

/*

* Bersihkan atribut dari masing-masing node

*/

node.dari = null;

node.jarak = float.PositiveInfinity;

/*

* Jika ternyata vertex tersebut adalah Asal

* maka jaraknya diset dengan 0

*/

if(node.getId() == asal.getId()){

} /*

* List<Node> open berfungsi untuk menampung vertex yang akan diproses

* jadi jika List<Node> open sudah tidak memiliki Node

* maka pencarian dianggap telah selesai

*/

List<Node> open = new List<Node>(semuaNode);

/*

* Selama masih ada elemen dalam List open

*/

while(open.Count > 0){

open.Remove(aktif);

foreach(Hubungan hub in aktif.getHubungan()){

Node nodeTerhubung = hub.getNode();

/*

* Simpan nilai jarak ke node yang terhubung dengan node yang aktif sekarang

*/

float jarakNodeTerhubung = aktif.cariJarakKe(nodeTerhubung.getId());

dilalui lebih

Terhubung)){

/*

* Jika ternyata jarak ke node + jarak yang sudah

* kecil dari pada jarak yang disimpan sebelumnya

*/

if(hub.getNode().jarak > (aktif.jarak + jarakNode nodeTerhubung.jarak =

aktif.jarak + jarakNodeTerhubung;

nodeTerhubung.dari = aktif;

nodeTerhubung.dariJalan = hub.jalan;

}

* Cari node dengan nilai jarak terkecil dari

* Nilai terkecil inilah yang akan menjadi node aktif

*/

float jarakMinimum = float.PositiveInfinity;

foreach(Node node in open){

/*

* Jarak minimum dan node tersebut belum pernah

* artinya node tersebut masih ada dalam

*/

if(node.jarak < jarakMinimum){

jarakMinimum = node.jarak;

aktif = node;

} } }

Universitas Sumatera Utara

dan jarak /*

* Menghasilkan dan menyimpan rute

* Setiap node yang sudah diproses memiliki node sebelum

*/

Node nodeSekarang = tujuan;

totalJarak = tujuan.jarak;

while(nodeSekarang != null){

hasil.Insert(0, nodeSekarang);

nodeSekarang = nodeSekarang.dari;

}

watch.Stop();

runningTime = watch.Elapsed;

return true;

} } }

Class Haversine.cs :

/// Description of Haversine.

/// </summary>

public class Haversine {

public Haversine() {

}

public static float deg2rad(float deg){

return (float) (deg * (Math.PI / 180));

}

public static float hitungJarak(Node node_a, Node node_b){

var R = 6371;

// Debug.WriteLine("Perhitungan Haversine");

// Debug.WriteLine("Titik awal, Lat : " + node_a.getLat() + " Long : " + node_a.getLng());

// Debug.WriteLine("Titik akhir, Lat : " + node_b.getLat() + " Long : " + node_b.getLng());

// Debug.WriteLine("--- ---");

// Debug.WriteLine("Delta LAT = " + (node_b.getLat()- node_a.getLat()));

// Debug.WriteLine("Delta LNG = " + (node_b.getLng()- node_a.getLng()));

var dLat = deg2rad(node_b.getLat()-node_a.getLat());

Debug.WriteLine("Sin Delta LAT =

" + Math.Sin(dLat/2));

var dLon = deg2rad(node_b.getLng()-node_a.getLng());

Debug.WriteLine("Sin Delta LNG =

" + Math.Sin(dLon/2));

var a =

Math.Sin(dLat/2) * Math.Sin(dLat/2) +

Math.Cos(deg2rad(node_a.getLat())) * Math.Cos(deg 2rad(node_b.getLat())) *

Math.Sin(dLon/2) * Math.Sin(dLon/2)

;

// Debug.WriteLine("Cos LAT 1 : " + Math.Cos(deg2rad(node_a.getLat())));

// Debug.WriteLine("Cos LAT 2 : " + Math.Cos(deg2rad(node_b.getLat())));

// Debug.WriteLine("Sin DELTA LON : " + Math.Sin(dLon/2));

var c = 2 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1-a));

// Debug.WriteLine("SQRT A : " + Math.Sqrt(a));

Universitas Sumatera Utara

// Debug.WriteLine("SQRT A-1 : " + Math.Sqrt(1-a));

// Debug.WriteLine("ATAN(A, A-1): " + Math.Atan2(Math.Sqrt(a), Math.Sqrt(1-a)));

var d = R * c;

// Debug.WriteLine("A = " + a);

// Debug.WriteLine("C = " + c);

// Debug.WriteLine("D = " + d);

return (float) d;

} }

}

Class Maps.cs :

/// Description of Map.

/// </summary>

public class Map {

/*

* Define Const

*/

//SIMPANG

private static float simpangWidth = 10;

private static float simpangHeight = 10;

private static int simpangTextSize = 6;

//MARKER

private static float markerTextSize = 7;

//NODE

private static float nodeWidth = 25;

private static float nodeHeight = 25;

private static int nodeTextSize = 8;

//LINK

private static float linkWidth = 0F;

private static int linkTextSize = 7;

private static float distanceTextBorderWidth = 1F;

/*

* Define variable

*/

private Panel mapContainer;

private Brush nodeColor;

private Brush simpangColor;

private Brush linkTextColor;

private Brush nodeNameColor;

private Brush markerColor;

private Brush markerTextColor;

private Pen shortestPathColor;

private Pen linkColor;

private Pen linkTextBorderColor;

private Brush popUpBackground;

private Brush popUpTextColor;

public Graphics mapGraphics;

public Map(Panel groupBox) {

this.mapContainer = groupBox;

this.mapGraphics = groupBox.CreateGraphics();

Universitas Sumatera Utara

/*

* Konfigurasi tampilan dari map

*/

//Warna dari node

this.nodeColor = new SolidBrush(Color.DarkGray);

//warna dari simpang

this.simpangColor = new SolidBrush(Color.LightGray);

//Warna dari tulisan jarak

this.linkTextColor = new SolidBrush(Color.Black);

//Warna link yang menghubungkan antar vertex this.linkColor = new Pen(Color.Black, linkWidth);

AdjustableArrowCap bigArrow

= new AdjustableArrowCap(1, 1);

//Warna dari tulisan nama node

this.nodeNameColor = new SolidBrush(Color.Black);

//Warna dari marker

this.markerColor = new SolidBrush(Color.Yellow);

//Warna dari tulisan marker

this.markerTextColor = new SolidBrush(Color.Black);

//Warna dari stroke jarak pada link this.linkTextBorderColor

= new Pen(Color.Black, distanceTextBorderWidth);

//Warna dari popUp

this.popUpBackground = new SolidBrush(Color.DarkGray);

//Warna dari tulisan popUp

this.popUpTextColor = new SolidBrush(Color.Black);

//Warna dari shortest path yang dihasilkan

this.shortestPathColor = new Pen(Color.OrangeRed, 6);

this.shortestPathColor.CustomEndCap

= new AdjustableArrowCap(3, 3);

}

public void drawPopUp(float x, float y, string msg){

Font popUpFont = new Font(new FontFamily("Segoe UI"), nodeTextSize);

SizeF popUpFontDimension

= this.mapGraphics.MeasureString(msg, popUpFont);

this.mapGraphics

.FillRectangle(new SolidBrush(Color.DarkGray), x,

y + popUpFontDimension.Height, popUpFontDimension.Width, popUpFontDimension.Height);

this.mapGraphics .DrawString(msg,

x,

y + popUpFontDimension.Height);

}

public void drawPath(List<Node> items){

PointF[] points = new PointF[items.Count];

for(int index = 0; index < items.Count; index++){

points[index] = new PointF(items[index].getX(), items [index].getY());

}

this.mapGraphics

.DrawLines(shortestPathColor, points);

}

public void drawPath(List<Node> items, Pen color){

PointF[] points = new PointF[items.Count];

for(int index = 0; index < items.Count; index++){

points[index] = new PointF(items[index].getX(), items [index].getY());

}

this.mapGraphics

.DrawLines(color, points);

}

public void drawNode(float x, float y, string id){

try { /*

* Menggambar Node ke Map

*/

/*

* Dilakukan pengecekkan terhadap jenis node

* apakah node tersebut simpang atau tidak

*/

this.mapGraphics

.FillEllipse(nodeColor, new RectangleF(x - (float)(nodeWidth / 2.0),

(float)(nodeHeight / 2.0),

));

y -

nodeWidth, nodeHeight

/*

* Menambahkan Nama Node

*/

Font nodeFont = new Font(new FontFamily("Segoe UI"), nodeTextSize);

float nodeFontWidth

= this.mapGraphics.MeasureString(id, nodeFont).Width;

float nodeFontHeight

= this.mapGraphics.MeasureString(id, nodeFont).Height;

this.mapGraphics

} catch (Exception e){

MessageBox.Show("Error : " + e.ToString());

} }

public void drawNode(Node node){

try { /*

* Dilakukan pengecekkan terhadap jenis node

* apakah node tersebut simpang atau tidak

*/

float x = node.getX();

float y = node.getY();

string id = node.getAbjad();

if(node.getStatus() == 0){

this.mapGraphics

.FillEllipse(simpangColor, new RectangleF(x - (float)(simpangWidth / 2.0),

(float)(simpangHeight / 2.0), angWidth,

angHeight));

y - simp simp

Font simpangFont = new Font(new FontFamily("Segoe UI"), simpangTextSize);

float simpangFontWidth

= this.mapGraphics.MeasureString(id, simpangFont).Width;

float simpangFontHeight

= this.mapGraphics.MeasureString(id, simpangFont).Height;

this.mapGraphics

.FillEllipse(nodeColor, new RectangleF(x - (float)(nodeWidth / 2.0),

(float)(nodeHeight / 2.0), dth,

ight));

/*

* Menambahkan Nama Node

*/

y - nodeWi nodeHe

UI"), nodeTextSize);

Font nodeFont = new Font(new FontFamily("Segoe float nodeFontWidth

= this.mapGraphics.MeasureString(id, nodeFont).Width;

float nodeFontHeight

this.mapGraphics

} catch (Exception e){

MessageBox.Show("Error : " + e.ToString());

} }

public void drawNode(Node node, Brush customColor){

try { /*

* Dilakukan pengecekkan terhadap jenis node

* apakah node tersebut simpang atau tidak

*/

float x = node.getX();

float y = node.getY();

string id = node.getAbjad();

if(node.getStatus() == 0){

this.mapGraphics

.FillEllipse(customColor, new RectangleF(x - (float)(simpangWidth / 2.0),

(float)(simpangHeight / 2.0), angWidth,

angHeight));

y - simp simp

Font simpangFont = new Font(new FontFamily("Segoe UI"), simpangTextSize);

float simpangFontWidth

= this.mapGraphics.MeasureString(id, simpangFont).Width;

float simpangFontHeight

= this.mapGraphics.MeasureString(id, simpangFont).Height;

this.mapGraphics

.FillEllipse(customColor, new RectangleF(x - (float)(nodeWidth / 2.0),

(float)(nodeHeight / 2.0), dth,

UI"), nodeTextSize);

/*

* Menambahkan Nama Node

*/

Font nodeFont = new Font(new FontFamily("Segoe float nodeFontWidth

= this.mapGraphics.MeasureString(id, nodeFont).Width;

float nodeFontHeight

= this.mapGraphics.MeasureString(id, nodeFont).Height;

this.mapGraphics

} catch (Exception e){

MessageBox.Show("Error : " + e.ToString());

} }

public void drawLink(float x, float y, float x2, float y2, fl oat distance, bool hasil){

try {

Pen routeColor;

if(hasil){

routeColor = shortestPathColor;

} else {

routeColor = linkColor;

}

//Menghitung rotasi dari teks jarak

float angleInDegrees = (float) (Math.Atan2(y2 - y, x2 - x) * 180 / Math.PI);

float gradient = 0F;

if(deltaY == 0 || deltaX == 0) gradient = 0;

else if(deltaY >= deltaX) gradient = deltaX / deltaY;

else if(deltaX >= deltaY) gradient = deltaY / deltaX;

/*

* Membuat link antara 2 vertex

*/

float movX, movY;

if(deltaY > deltaX){

movX = (20 * gradient * multiplierX);

movY = (20 * multiplierY);

} else {

movX = (20 * multiplierX);

movY = (20 * gradient * multiplierY);

}

} catch (Exception e){

} catch (Exception e){

Dokumen terkait