Z-GIS

Z-GIS是一個企業級的通用外掛程式式GIS應用程式框架,Z-GIS框架能夠從根本上解決架構穩定性和需求多變性之間的矛盾。

基本介紹

  • 中文名:Z-GIS
  • 全稱:Z-GIS框架
  • 級別:企業級的
  • 屬性:通用外掛程式式GIS應用程式框架
Z-GIS簡介,Z-GIS框架,Z-GIS框架的運行環境,Z-GIS的名稱由來,Z-GIS的設計思想,Z-GIS接口,頂級接口,間接接口,間接接口的使用,Z-GIS二次開發範例(C#),創建啟動畫面,創建用戶登錄模組,創建命令,創建地圖互動工具,創建Combobox下拉框,創建任意複雜控制項,二次開發高級功能,

Z-GIS簡介

Z-GIS框架

Z-GIS是一個企業級的通用外掛程式式GIS應用程式框架,Z-GIS框架能夠從根本上解決架構穩定性和需求多變性之間的矛盾。
Z-GIS框架不僅僅支持二次開發,還支持二次設計。Z-GIS系列軟體就是在Z-GIS統一框架的基礎上進行構建(設計、開發)的。
Z-GIS框架完全可以套用於任何領域、任何類型、任何規模、甚至任何開發語言的GIS產品(或項目),同時不需要對Z-GIS框架本身做任何改動。基於Z-GIS框架進行產品(線)開發,將大大減少開發的工作量。我們會提供相應的開發源碼來驗證、說明Z-GIS統一框架基本特性。
在Z-GIS框架安裝程式中,暫時只提供Z-GIS框架在國土行業的套用範例及C#(.NET)開發範例源碼,如需要其他語言的開發範例源碼請聯繫作者!基於Z-GIS框架進行產品開發需要符合COM規範,但也並非必須完全符合COM規範。

Z-GIS框架的運行環境

Z-GIS框架是基於某個特定的GIS平台而構建的高級的、企業級套用框架;所以,Z-GIS框架運行環境取決特定的GIS平台。如:如果是基於ESRI公司的ArcEngine構建的Z-GIS框架,那么它的運行環境則是Windows + ArcEngine;如果是基於超圖的GIS平台構建的Z-GIS框架,那么它的運行環境則是Windows + 超圖的GIS環境。

Z-GIS的名稱由來

Z-GIS框架由周健設計並加以實現。Z就是周漢語拼音的首字母。

Z-GIS的設計思想

Z-GIS的設計思想是封裝變化部分,固化穩定部分;嚴格遵循開閉原則,針對接口編程;做到底層實現依賴高層抽象。
封裝變化主要是指針對業務組件部分的封裝,讓業務組件部分可以獨立演化而不影響其他部件,從而保證軟體的高內聚低偶合; 固化穩定部分主要是指框架本身的穩定性,穩定的部分應該固化從而最大限度的保證軟體的穩定性。
開閉原則是指對擴展開放、修改關閉;針對接口編程(即針對抽象編程),可以從很大程度上保證軟體對開閉原則的遵循。
要做到底層實現依賴高層抽象,是因為底層業務邏輯的實現往往和用戶的需求密切相關;用戶的需求是多變的,因而底層的實現是多變的、在穩定性方面是非常脆弱的。高層抽象主要指兩個方面,一是指框架,框架位於系統的最高層,其和用戶的需求沒有直接關係;二是指框架提供的接口,框架提供的接口除了用於實現系統必要功能以外,便主要是用於擴展,這些和用戶的需求也沒有直接的關係;因此,高層抽象部分應該是穩定的。所以,從總體上保證底層實現依賴高層抽象,是保證軟體設計合理性的重要手段之一。

Z-GIS接口

頂級接口

由Z-GIS框架直接提供的主要接口如下:
IZhoujianApplication
IZhoujianCommand 該接口繼承於ICommand接口。
IZhoujianTool 該接口繼承於ITool接口。
IZhoujianControl 該接口用於實現任意複雜控制項在界面中顯示,實現該接口必須要實現IZhoujianCommand。
IZhoujianStartForm
IZhoujianProgressBar
IZhoujianStatusBar

間接接口

Z-GIS是支持二次設計的,在Z-GIS二次設計時設計的接口稱為間接接口:如在國土行業的套用範例中,對Z-GIS進行了二次設計。在二次設計中,設計了一個通用的(反饋)訊息的組件,該組件對應的接口是IZhoujianMessageBox。類似的接口還有IZhoujianCJCommandLine、IZhoujianCJParameter、IZhoujianLayerControl、IZhoujianDatasource等等。

間接接口的使用

所有的間接接口都是要註冊到Z-GIS框架中的,註冊過程是可視化的。對於已經註冊在Z-GIS系統中的間接接口的使用方法是:通過調用IZhoujianApplication接口提供的方法(函式)先獲取相應的接口,再使用相應的接口提供方法(或屬性)。

Z-GIS二次開發範例(C#)

創建啟動畫面

基於Z-GIS框架進行二次開發時,可以根據產品(或項目)的需求,靈活創建個性化的啟動界面。創建個性啟動界面只要實現IZhoujianStartForm接口即可。範例如下:(注本功能代碼為Delphi實現,其他均為C#)
unit unt_ZhoujianCJStartFormIMP;
{$WARN SYMBOL_PLATFORM OFF}
interface
uses
Windows, ActiveX, Classes, ComObj, ZhoujianCJ_TLB, StdVcl,
zhoujianUI_Tlb, forms, frm_CJForm;
type
TCJStartForm = class(TTypedComObject, IZhoujianStartForm)
protected
function Show: HResult; stdcall;
function Close: HResult; stdcall;
function SendMessage(const MessageInfo: WideString): HResult; stdcall;
function Get_Description(out Value: WideString): HResult; stdcall;
private
frm: TfrmCJForm;//定義一個窗體,作啟動畫面
end;
implementation
uses ComServ;
//返回本啟動畫面的描述信息
function TCJStartForm.Get_Description(out Value: WideString): HResult;
begin
Value := '採集子系統啟動畫面(Z-GIS系列軟體)'
end;
//向啟動畫面傳送當前程式正在啟動的相應信息
function TCJStartForm.SendMessage(const MessageInfo: WideString): HResult;
begin
frm.lblinfo.Caption := MessageInfo;
Application.ProcessMessages;
end;
//程式啟動後,做銷毀操作
function TCJStartForm.Close: HResult;
begin
frm.Free;
frm := nil;
end;
//顯示啟動畫面
function TCJStartForm.Show: HResult;
var
L, T, H, V: Longint;
begin
frm := TfrmCJForm.Create(Application);
H := GetSystemMetrics(SM_CXSCREEN);
V := GetSystemMetrics(SM_CYSCREEN);
L := Round((H / 2)) - Round((frm.Width / 2));
T := Round((V / 2)) - Round((frm.Height / 2));
frm.Left := L;
frm.Top := T;
AnimateWindow(frm.Handle, 1000, AW_CENTER);
AnimateWindow(frm.Handle, 400, AW_CENTER + AW_HIDE);
AnimateWindow(frm.Handle, 300, AW_CENTER);
end;
initialization
TTypedComObjectFactory.Create(ComServer, TCJStartForm, Class_CJStartForm,
ciMultiInstance, tmApartment);
end.

創建用戶登錄模組

對於一般的管理信息系統而言,都會有用戶登錄模組(即完成用戶登錄,驗證用戶合法性的功能)。對於GIS類型的信息系統來說,用戶登錄模組也是必不可少的。基於Z-GIS框架進行二次開發要增加這樣的一個功能,是通過Z-GIS中間件來實現的;在Z-GIS框架中只要實現一個IZhoujianMidWare接口即可完全這樣的功能。具體代碼如下:
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using ZhoujianUI;
using System.Windows.Forms;
namespace UserLoginSpace
{
[Guid("3308ca48-c67e-4ed9-a283-d6b66fd66ab3")]
[ClassInterface(ClassInterfaceType.None)]
[ProgId("MDataSource.Class1")]
public class UserLoginIMP : IZhoujianMidWare, IUserInfo
{
private IZhoujianApplication mApp = null;
private IUserInfo mUserInfo = null;
private string _UserDepartment,_UserName;
//假設IUserInfo接口只有兩個元素,分別是UserName,UserDepartment,表示用戶名和所屬部門
#region IUserInfo 成員
public string UserName
{
get { return _UserName; }
}
public string UserDepartment
{
get { return _UserDepartment; }
}
#endregion
#region IZhoujianMidWare 成員
public string Name
{
get { return "User Login"; }
}
public void OnCreate(IZhoujianApplication ZApplication)
{
//首先,讓用戶進行認證, frmLogin是一個已經存在的窗體,作用戶登錄界面
mUserInfo = this as IUserInfo;
frmLogin frm = new frmLogin(mUserInfo);
if (frm.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{ //通過認證
mApp = ZApplication;
//通過驗證以後,可能會根據針對不同用戶進行不同的初始化操作
//在此處添加業務代碼
//最後在應用程式的狀態欄上顯示當前登錄的用戶信息
mApp.StatusBar.setValue(1,string.format("用戶名:{0} 部門: {1}",mUserInfo.UserName,mUserinfo.UserDepartmen));
}
else
{ //否則,結束應用程式
ZApplication.Quit();
}
}
public object get_MidWare(string UniqueName)
{ //在實際的套用中可能要根據UniqueName參數的情況不同而返回不同的值,這裡只返回了用戶信息
//本例中,對於其他模組還可以通過接口查詢操作來獲取用戶信息,但Z-GIS推薦使用本方法。
return mUserInfo;
}
#endregion
}
}

創建命令

創建命令只要實現IZhoujianCommand接口即可,代碼如下:
//第一步:首先是引用相關的命名空間
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using ZhoujianUI;
namespace CommandDEmo
{
[Guid("d21d37d1-2599-4ce4-a555-4c079071b86f")]
[ClassInterface(ClassInterfaceType.None)]
[ProgId("CommandDEmo.Class_CommandDEmo")]
//藉助相應的類來實現IZhoujianCommand
public class CommandDemoIMP: IZhoujianCommand
{
#region IZhoujianCommand 成員
/// <summary>
/// 設定命令按鈕的圖示
/// </summary>
public int Bitmap
{
get
{
return Resource1.forCommand.GetHbitmap().ToInt32();//注意一定要是Bitmap Handle
}
}
//設定命令按鈕標題
public string Caption
{
get { return "demo Command"; }
}
public string Category
{
get { return "Demo"; }
}
public bool Checked
{
get { return false; }
}
public bool Enabled
{
get { return true; }
}
public int HelpContextID
{
get { throw new NotImplementedException(); }
}
public string HelpFile
{
get { throw new NotImplementedException(); }
}
public string Message
{
get { return "【demo】創建命令按鈕!"; }
}
public string Name
{
get {return "command demos"; }
}
int i = 0;
//命令被點擊時,要執行相關操作的入口
public void OnClick()
{
MessageBox.Show("我被點了"+ ++i+"下!!!") ;
}
public void OnCreate(object hook)
{ //這裡可以加入初始化時要做的操作
//hook 可以通過強制類型轉換成IZhoujianApplication
}
public string Tooltip
{//這是命令按鈕的提示信息
get { return Message; }
}
#endregion
}
}

創建地圖互動工具

//創建命令除了要實現IZhoujianCommand接口,同時還要實現IZhoujianTool接口,IZhoujianTool定義了所有與地圖互動操作的方法。代碼如下:
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using ZhoujianUI;
using System.Windows.Forms;
namespace ToolEDemo
{
[Guid("ca5fc134-a474-450f-89d3-f210cacce31c")]
[ClassInterface(ClassInterfaceType.None)]
[ProgId("ToolEDemo.Class1")]
public class DemoToolIMP: IZhoujianCommand,IZhoujianTool
{
ContextMenuStrip mPopMenu =null;
IZhoujianApplication mApp = null;
#region IZhoujianTool 成員
public int Cursor
{
get
{
return Resource1.forCursor.Handle.ToInt32();
}
}
/// <summary>
/// 當激活其他工具時…………
/// </summary>
/// <returns></returns>
public bool Deactivate()
{
mApp.StatusBar.SetValue(1, "");
return true;
}
public bool OnContextMenu(int x, int y)
{
if (mPopMenu != null) mPopMenu.Show(x, y);
return true;
}
public void OnDblClick()
{
MessageBox.Show("在地圖上雙擊了一次!");
}
public void OnKeyDown(int keyCode, int shift)
{
//MessageBox.Show("OnKeyDown");
}
public void OnKeyUp(int keyCode, int shift)
{
//MessageBox.Show("OnKeyUp");
}
/// <summary>
///
/// </summary>
/// <param name="button"></param>
/// <param name="shift"></param>
/// <param name="x"></param>
/// <param name="y"></param>
public void OnMouseDown(int button, int shift, int x, int y)
{
//MessageBox.Show("OnMouseDown");
}
/// <summary>
/// 處理滑鼠在地圖上移動時的事件
/// </summary>
/// <param name="button"></param>
/// <param name="shift"></param>
/// <param name="x"></param>
/// <param name="y"></param>
public void OnMouseMove(int button, int shift, int x, int y)
{
mApp.StatusBar.SetValue(1, string.Format("正在移動滑鼠,位置X={0};Y={1}【註:是螢幕坐標】",x,y));
}
public void OnMouseUp(int button, int shift, int x, int y)
{
//MessageBox.Show("OnKeyDown");
}
public void Refresh(int hdc)
{
//該方法高級操作才會用到
}
#endregion
#region IZhoujianCommand 成員
public int Bitmap
{
get
{
return Resource1.forCommand.ToBitmap().GetHbitmap().ToInt32();//注意:返回的必須是bitmap handle
}
}
public string Caption
{
get { return "Tool例"; }
}
public string Category
{
get { return "工具"; }
}
public bool Checked
{
get { return false; }
}
public bool Enabled
{
get { return true; }
}
public int HelpContextID
{
get { throw new NotImplementedException(); }
}
public string HelpFile
{
get { throw new NotImplementedException(); }
}
public string Message
{
get { return "這是一個滑鼠與地圖進行互動的範例!" ; }
}
public string Name
{
get { return "tool demox"; }
}
public void OnClick()
{
}
public void OnCreate(object hook)
{
mApp = hook as IZhoujianApplication;
InitializePopMenu();
}
/// <summary>
/// 初始快捷選單
/// (如果,不熟悉通過代碼進行快捷選單的初始化,可以在窗體設計器中進行相應操作及設計 )
/// </summary>
private void InitializePopMenu()
{
if (mPopMenu == null) mPopMenu = new ContextMenuStrip();
mPopMenu.Items.Add("第1項").Click += new EventHandler(DemoToolIMP_Click);
mPopMenu.Items.Add("第2項").Click += new EventHandler(DemoToolIMP_Click);
mPopMenu.Items.Add("第3項").Click += new EventHandler(DemoToolIMP_Click);
mPopMenu.Items.Add("第4項").Click += new EventHandler(DemoToolIMP_Click);
mPopMenu.Items.Add("第5項").Click += new EventHandler(DemoToolIMP_Click);
mPopMenu.Items.Add("第6項").Click += new EventHandler(DemoToolIMP_Click);
mPopMenu.Items.Add("第7項").Click += new EventHandler(DemoToolIMP_Click);
mPopMenu.Items.Add("第8項").Click += new EventHandler(DemoToolIMP_Click);
}
/// <summary>
/// 處理快捷選單事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void DemoToolIMP_Click(object sender, EventArgs e)
{
MessageBox.Show((sender as ToolStripItem).Text + ",被點了!");
}
public string Tooltip
{
get { return Message; }
}
#endregion
}
}

創建Combobox下拉框

//在工具列上創建下拉框除了要實現IZhoujianCommand接口,同時還要實現IZhoujianControl接口,IZhoujianControl接口只定義了一個方法,用於返回可視化Windows控制項的句柄。代碼如下:
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using ZhoujianUI;
namespace ComboboxDemo
{
[Guid("191e0060-f725-4144-ac16-0bbae7571a36")]
[ClassInterface(ClassInterfaceType.None)]
[ProgId("ComboboxDemo.Class1")]
public class ComboBoxIMP: IZhoujianCommand, IZhoujianControl
{
IZhoujianApplication mApp = null;
ComboBox mCbx = new ComboBox();
#region IZhoujianControl 成員
public int WinControlHandle
{
get { return mCbx.Handle.ToInt32(); }
}
#endregion
#region IZhoujianCommand 成員
public int Bitmap
{
get { return -1; }
}
public string Caption
{
get { return "ComboBox"; }
}
public string Category
{
get { return "控制項案例"; }
}
public bool Checked
{
get { return false; }
}
public bool Enabled
{
get { return true; }
}
public int HelpContextID
{
get { throw new NotImplementedException(); }
}
public string HelpFile
{
get { throw new NotImplementedException(); }
}
public string Message
{
get { return "這是一個在工具列上新增ComboBox範例。"; }
}
public string Name
{
get { return "combexTest"; }
}
public void OnClick()
{
//這個方法不會被使用到
}
public void OnCreate(object hook)
{
mApp = hook as IZhoujianApplication;
initializeCombobox();
}
/// <summary>
/// 初始化Combobox
/// 並增加items 增加事件
/// </summary>
private void initializeCombobox()
{
if (mCbx == null) mCbx = new ComboBox();
mCbx.Items.Add("第一項");
mCbx.Items.Add("第二項");
mCbx.Items.Add("第三項");
mCbx.Items.Add("第四項");
mCbx.Items.Add("第五項");
mCbx.Items.Add("第六項");
mCbx.MouseEnter += new EventHandler(mCbx_MouseEnter);
mCbx.MouseLeave += new EventHandler(mCbx_MouseLeave);
mCbx.SelectedValueChanged += new EventHandler(mCbx_SelectedValueChanged);
}
/// <summary>
/// 當ComboBox選項改變的時候,將其當前值在程式標題欄上顯示
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void mCbx_SelectedValueChanged(object sender, EventArgs e)
{
mApp.Caption = mCbx.SelectedItem.ToString();
MessageBox.Show("您選擇了【"+mCbx.SelectedItem.ToString()+"】");
}
/// <summary>
/// 清除系統列上 提示信息
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void mCbx_MouseLeave(object sender, EventArgs e)
{
mApp.StatusBar.SetValue(0, "");
}
/// <summary>
/// 在系統列上顯示 提示信息
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void mCbx_MouseEnter(object sender, EventArgs e)
{
mApp.StatusBar.SetValue(0, Tooltip);
}
public string Tooltip
{
get { return "這是一個在工具列上新增ComboBox範例。"; }
}
#endregion
}
}

創建任意複雜控制項

選單或工具列中創建任意複雜控制項的方法同創建Combobox類似,只要在IZhoujianControl的 public int WinControlHandle 中返回任意複雜控制項的句柄即可。代碼如下:
public int WinControlHandle
{
get {
return hComplexHandle; //hComplexHandle為任意複雜控制項的句柄
}
}

二次開發高級功能

由於高級功能比較複雜(會涉及二次設計、多個模組間的通信及模組的依賴關係),所以代碼會非常的多。如要了解二次開發高級功能,可以安裝Z-GIS框架程式,其中包含少量二次開發的高級功能。

相關詞條

熱門詞條

聯絡我們