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){