从 sqlite 数据库中读取轨迹数据,存储到 postgis 数据库中,再利用 postgis 的特性进行轨迹分析。
track.db
Program.cs
class Program
{
static void Main(string[] args)
{
List
运行结果为:
Sqlite中的轨迹记录数为:1521
---------------------------------------------------------------------
写入postgresql成功!
---------------------------------------------------------------------
读取postgresql中的数据成功!记录数为:1521
---------------------------------------------------------------------
轨迹总长度:16775.455657666 米
---------------------------------------------------------------------
轨迹总时间:353325 秒
---------------------------------------------------------------------
轨迹平均速度:0.0474788244751037 米/秒
---------------------------------------------------------------------
最后一个点的分析结果为:
瞬时位移:5.32844146492802 米
时间间隔:1 秒
瞬时速度:5.32844146492802 米/秒
---------------------------------------------------------------------
Track.cs
public class Track
{
public double B;
public double L;
public float H;
public float Azi;
public float AntH;
public DateTime UTCTime;
public float Hdop;
public int SolType;
}
SqliteDB.cs
///
/// Sqlite数据库操作类
///
public class SqliteDB : IDisposable
{
#region 字段
///
/// 数据库连接字符串构造器
///
private SQLiteConnectionStringBuilder _connStr = null;
///
/// 数据库连接器
///
private SQLiteConnection _conn = null;
///
/// 通过连接器创建NpgsqlCommand对象,用于执行SQL语句
///
private SQLiteCommand _comm = null;
///
/// 事务管理对象
///
private SQLiteTransaction _trans = null;
#endregion
#region 构造函数
public SqliteDB(string filePath)
{
_connStr = new SQLiteConnectionStringBuilder();
_connStr.DataSource = filePath;
_conn = new SQLiteConnection(_connStr.ToString());
_comm = _conn.CreateCommand();
}
~SqliteDB()
{
}
#endregion
#region 静态方法
///
/// 创建数据库
///
/// db文件路径+文件名
public static void CreateDB(string filePath)
{
try
{
SQLiteConnection.CreateFile(filePath);
}
catch
{
throw;
}
}
#endregion
#region 公共方法
#region 数据库操作:连接数据库、断开数据库、加密数据库
///
/// 打开数据库连接
///
/// 是否连接成功
public bool Open()
{
try
{
_conn.Open();
return true;
}
catch
{
Close();
return false;
throw;
}
}
///
/// 打开数据库连接
///
/// 密码
/// 是否连接成功
public bool Open(string password)
{
try
{
_conn.SetPassword(password);
_conn.Open();
return true;
}
catch
{
Close();
return false;
throw;
}
}
///
/// 关闭数据库连接
///
public void Close()
{
if (_conn != null)
{
_comm.Dispose();
_conn.Close();
_conn.Dispose();
}
}
///
/// 给sqlite数据库加密
///
/// 密码
public void Encrypt(string password)
{
try
{
if (_conn != null)
{
_conn.ChangePassword(password);
}
}
catch
{
throw;
}
}
#endregion
#region 查询
///
/// 执行sql语句
///
///
///
public DataTable ExecuteSQL(string sql)
{
try
{
_comm.Transaction = _trans;
_comm.CommandText = sql;
DataTable dt = new DataTable();
using (SQLiteDataAdapter adapter = new SQLiteDataAdapter(_comm))
{
adapter.Fill(dt);
}
return dt;
}
catch
{
throw;
}
}
#endregion
#region 事务管理
///
/// 开始执行事务
///
public void BeginTransaction()
{
if (_conn != null)
{
_trans = _conn.BeginTransaction();
}
}
///
/// 事务结束,保存并提交数据库数据,
///
public void Commit()
{
if (_trans != null)
{
_trans.Commit();
}
}
///
/// 回滚事务
///
public void Rollback()
{
if (_trans != null)
{
_trans.Rollback();
}
}
///
/// 结束事务,并释放资源
///
public void EndTransaction()
{
if (_trans != null)
{
_trans.Dispose();
_trans = null;
}
}
#endregion
#endregion
#region IDisposable 成员
public void Dispose()
{
this.Close();
}
#endregion
}
PostgresqlDB.cs
///
/// 数据库管理类
/// 直接操作数据库
///
public class PostgresqlDB : IDisposable
{
#region 字段
#region 连接配置
///
/// 服务器地址
///
private string server;
///
/// 端口
///
private string port;
///
/// 用户名
///
private string username;
///
/// 密码
///
private string password;
///
/// 数据库名称
///
private string db;
#endregion
#region 数据库操作相关变量
///
/// 数据库连接器
///
private NpgsqlConnection _conn;
///
/// 通过连接器创建NpgsqlCommand对象,用于执行SQL语句
///
private NpgsqlCommand _comm;
///
/// 将数据表中获取的记录生成DataSet
///
private NpgsqlDataAdapter _adapter;
///
/// 创建一个事务对象
///
private NpgsqlTransaction _trans;
#endregion
#endregion
#region 构造函数
private PostgresqlDB() { }
///
/// 数据库管理类
///
/// 数据库配置
public PostgresqlDB(string server, string port, string username, string password, string db)
{
this.server = server;
this.port = port;
this.username = username;
this.password = password;
this.db = db;
}
~PostgresqlDB()
{
}
#endregion
#region 公共方法
#region 数据库操作:连接数据库、断开数据库、数据库连接状态
///
/// 打开数据库连接
///
///
public bool Open()
{
try
{
//构造SQL语句
string sql = String.Format(
"server={0};port={1};userid={2};password={3};database={4};pooling=true;maxpoolsize=40;timeout=5;",
server, port, username, password, db);
//初始化数据库连接参数
_conn = new NpgsqlConnection(sql);
//打开数据库连接
_conn.Open();
//初始化
_comm = _conn.CreateCommand();
_adapter = new NpgsqlDataAdapter(_comm);
_trans = null;
return true;
}
catch (Exception ex)
{
if (_conn != null)
_conn.Close();
_conn = null;
return false;
}
}
///
/// 关闭数据库连接
///
public void Close()
{
if (_conn != null)
{
_adapter.Dispose();
_adapter = null;
_comm.Dispose();
_comm = null;
_conn.Close();
_conn.Dispose();
_conn = null;
}
}
///
/// 获取数据库的连接状态
///
/// true表示已连接,false表示未连接
public bool GetConnStatus()
{
return (_conn != null && _conn.State == ConnectionState.Open);
}
#endregion
#region 数据表操作:查询数据表或视图是否存在
///
/// 查询指定名称的数据表是否存在
///
/// 数据表名
/// true:存在,false:不存在
public bool QueryTableIsExist(string tableName)
{
//构建SQL语句
string sql = String.Format("select count(*) from pg_tables where tablename = '{0}';", tableName.ToLower());
//执行SQL语句
_comm.Transaction = _trans;
_comm.CommandText = sql;
NpgsqlDataReader readerTemp = _comm.ExecuteReader();
//获取查询结果
long value = -1;
if (readerTemp.HasRows == true)
{
readerTemp.Read();
value = readerTemp.GetInt64(0);
}
//释放资源
readerTemp.Close();
//value=1表示数据表存在;value=0表示数据表不存在
if (value > 0)
{
return true;
}
return false;
}
///
/// 查询指定名称的视图是否存在
///
/// 视图名
/// true:存在,false:不存在
public bool QueryViewIsExist(string viewName)
{
//构建SQL语句
string sql = String.Format("select count(*) from pg_views where viewname = '{0}';", viewName.ToLower());
//执行SQL语句
_comm.Transaction = _trans;
_comm.CommandText = sql;
NpgsqlDataReader readerTemp = _comm.ExecuteReader();
//获取查询结果
long value = -1;
if (readerTemp.HasRows == true)
{
readerTemp.Read();
value = readerTemp.GetInt64(0);
}
//释放资源
readerTemp.Close();
//value=1表示数据表存在;value=0表示数据表不存在
if (value == 0)
{
return false;
}
return true;
}
#endregion
#region 执行sql语句
///
/// 执行sql语句
///
///
public void ExecuteNonQuery(string sql)
{
try
{
_comm.Transaction = _trans;
_comm.CommandText = sql;
_comm.ExecuteNonQuery();
}
catch
{
throw;
}
}
///
/// 执行sql语句
///
///
///
public DataTable ExecuteQuery(string sql)
{
try
{
_comm.Transaction = _trans;
_comm.CommandText = sql;
DataTable dt = new DataTable();
using (NpgsqlDataAdapter adapter = new NpgsqlDataAdapter(_comm))
{
adapter.Fill(dt);
}
return dt;
}
catch (Exception ex)
{
throw ex;
}
}
#endregion
#region 事务管理
///
/// 开始执行事务
///
public void BeginTransaction()
{
if (_conn != null)
{
_trans = _conn.BeginTransaction();
}
}
///
/// 事务结束,保存并提交数据库数据,
///
public void Commit()
{
if (_trans != null)
{
_trans.Commit();
}
}
///
/// 回滚事务
///
public void Rollback()
{
if (_trans != null)
{
_trans.Rollback();
}
}
///
/// 结束事务,并释放资源
///
public void EndTransaction()
{
if (_trans != null)
{
_trans.Dispose();
_trans = null;
}
}
#endregion
#endregion
public void Dispose()
{
this.Close();
}
}