利用Delphi的DataSnap编写高斯正算WEB程序

其实类似于这种的WEB应用程序用ASP.NET做起来非常方便,因为ASP.NET有强大的C#语言作为后盾。但是今天我上课的时候突发奇想,想利用Delphi的DataSnap来做,第一想到的便是PHP+DataSnap,用JSON作为中间层数据,但是后来仔细一想,有了JSON,那何必用PHP呢,杀鸡焉用牛刀!用JavaScript脚本完全足够了。不多说,直接看操作,首先用Delphi建立一个DataSnap程序,直接File->New->Other,然后看图:

确定后如图:

好了后,首页设置一下DSHTTPService组件的HttpPort属性,也就是设置我们的服务器端口,设为81,免得与我本机的端口相冲突。如图:

然后来到ServerMethodsUnit1单元,先引用单元Math和DBXJson,其中DBXJson是Delphi中Json相关的单元。然后我们在TServerMethods1类里面添加我们需要的方法和函数,单元的完整代码如下:

unit ServerMethodsUnit1;

interface

uses
  SysUtils, Classes, DSServer,Math,DBXJson;

type
  TServerMethods1 = class(TDSServerModule)
  private
    { Private declarations }
  public
    { Public declarations }
    //*****************高斯投影正算,已知B、L求x、y,B、L为秒值********************
    procedure GassBLToxy(B,L:extended;var x,y:extended);
    //*****************将角度转换成秒值,如30.20.10转换成秒值**********************
    function CoordinateToSeconds(Deg:string):extended;
    function BLToxy(B,L:string): TJSONObject;
  end;

var
  ServerMethods1: TServerMethods1;

implementation

{$R *.dfm}

{ TServerMethods1 }

function TServerMethods1.BLToxy(B, L: string): TJSONObject;
var x,y: Extended;
begin
  GassBLToxy(CoordinateToSeconds(B),CoordinateToseconds(L),x,y);
  Result := TJSONObject.Create;
  Result.AddPair(TJSONPair.Create('x',FloatToStr(x)));
  Result.AddPair(TJSONPair.Create('y',FloatToStr(y)));
end;

function TServerMethods1.CoordinateToSeconds(Deg: string): extended;
var deg1,deg2:string;
    sum:extended;
    temp:string;
begin
    sum:=0;
    temp:=Deg;
    if copy(Deg,1,1)='-' then Deg:=Copy(Deg,2,Length(Deg)-1);//如果为负数则化为正的
    if pos('.',Deg)=0 then
      begin
       sum:=StrToInt(Deg)*3600;
      end;
    if pos('.',Deg)<>0 then
      begin
        deg1:=copy(deg,pos('.',deg)+1,length(deg)-pos('.',deg));  //deg1=30.20
        deg2:=copy(deg,1,pos('.',deg)-1);                         //deg2=60
        sum:=StrToInt(deg2)*3600;                                 //化成秒
        if pos('.',deg1)=0 then
          begin
           sum:=sum+StrToInt(deg1)*60;
          end;
        if pos('.',deg1)<>0 then
          begin
           deg2:=copy(deg1,1,pos('.',deg1)-1);
           sum:=sum+StrToInt(deg2)*60;
           deg2:=copy(deg1,pos('.',deg1)+1,length(deg1)-pos('.',deg1));
           sum:=sum+StrToFloat(deg2);
          end;
      end;
   result:=sum;
   if copy(temp,1,1)='-' then result:=-result;
end;

procedure TServerMethods1.GassBLToxy(B, L: extended; var x, y: extended);
var B_r,sinB,cosB,cosB2,l_cha,l_r,N,a0,a4,a6,a3,a5,l2:extended;
begin
  B_r := B / 3600 / 180 * PI;  //B_r为B的弧度值
  sinB := Sin(B_r);
  cosB := Cos(B_r);
  cosB2 := Sqr(cosB);
  l_cha := L - (Round(L / (6 * 3600)) * 6 - 3) * 3600;//按6度带,l为L与中央子午线之差
  l_r := l_cha / 3600 / 180 * PI;                      //l_r为l的弧度值
  N := 6399698.902 - (21562.267 - (108.973 - 0.612 * cosB2) * cosB2) * cosB2;
  a0 := 32140.404 - (135.3302 - (0.7092 - 0.004 * cosB2) * cosB2) * cosB2;
  a4 := (0.25 + 0.00252 * cosB2) * cosB2 - 0.04166;
  a6 := (0.166 * cosB2 - 0.084) * cosB2;
  a3 := (0.3333333 + 0.001123 * cosB2) * cosB2 - 0.1666667;
  a5 := 0.0083 - (0.1667 - (0.1968 + 0.004 * cosB2) * cosB2) * cosB2;
  l2 := Sqr(l_r);
  x := 6367558.4969 * B_r - (a0 - (0.5 + (a4 + a6 * l2) * l2) * l2 * N) * sinB * cosB;
  y := (1 + (a3 + a5 * l2) * l2) * l_r * N * cosB;
end;

end.

好了,现在我们运行我们写好的DataSnap服务程序,如图:

然后我们就可以在IE中访问了,因为我们在前面的设置中设置了有TCP/IP和HTTP两种方式,当然我需要的是HTTP。在IE中输入地址:

http://127.0.0.1:81/datasnap/zaitian/TServerMethods1/BLToxy/11.0/12.0

其中datasnap是固定参数,zaitian是们设置的,在图三中有说明。TServerMethods1是我们的类,BLToxy是我们调用的函数,11.0和12.0是函数的参数,各个参数之间都用/符号分开。访问后浏览器就显示出服务器返回的JSON数据,如下:{“result”:[{“x”:”1218127.4049474″,”y”:”328008.141507914″}]}

然后我们就可以用JavaScript来调出我们的x和y的值了,分别用data.result[0].x和data.result[0].y来调用。

最后我们编写HTML服务端,在后台调用我们的DataSnap程序,得出结果,HTML网页代码如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

<title>DataSnap坐标转换</title>

<script type="text/javascript" src="JQuery.js"></script>

<script type="text/javascript">

function trans()

{

$.ajax({

      type:"get",

      url:"http://127.0.0.1:81/DataSnap/zaitian/TServerMethods1/BLToxy/"+$(‘#coor_B’).val()+"/"+$(‘#coor_L’).val(),

      dataType:"json",

      success:function(data){

       $(‘#coor_x’).val(data.result[0].x);

       $(‘#coor_y’).val(data.result[0].y);

      }

      })

}

</script>

</head>


<body>

<div style="text-align:center; margin-top:100px;">

<label>B:</label><input type="text" id="coor_B" value="11"/>

<label>L:</label><input type="text" id="coor_L" value="12"/>

<input type="button" value="转换" onclick="trans()"/>

<label>x:</label><input type="text" id="coor_x" />

<label>y:</label><input type="text" id="coor_y" />

</div>

</body>

</html>

效果如图:

网页代码中须要说明的是,调用AJAX时里面的代码要注意大小写,我刚开始就是把dataType:”json”写成了datatype:”json”才始终不能解释JSON数据。

其实DataSnap还可以做成dll文件,然后与IIS结合起来,或是做成exe的CGI文件,与Apache结合起来。只是在新建项目的时候新建DataSnap WebBroker Application就可以了。我这里就以CGI做实验。

然后写的代码就和上面的一样了。编译后生成我们需要的exe文件,然后我们把该文件放到Apache的cgi-bin目录下面去,然后在IE里面访问就可以了,IE访问地址为:

http://127.0.0.1/cgi-bin/project1.exe/datasnap/rest/TServerMethods1/BLToxy/11/12

注意多了个datasnap这个固定的参数。

实现这个的前提是Apache要配置好支持CGI才行,在Apache的配置文件中相关代码为:

<Directory "E:/www/Apache2.2/cgi-bin">

     AllowOverride None

     Options None

     Order allow,deny

     Allow from all

</Directory>


AddHandler cgi-script .cgi .exe

有了这个小小的实例,就可以发挥想像了,可以做许多的WEB应用程序,都按照这种方式做。由于实现了Winodws应用程序与HTML网页或PHP网页的分离,这种多元化的开发方式非常方便实用,而且实现了数据与前台页面的完全分离,更是网页设计的大势所趋。总之,以后有尽量用这种模式来开发WEB应用程序!