我在用mapobjects组件开发GIS程序时发现该组件只提供了ToMapPoint方法将当前鼠标点转换为普通坐标的,而没有提供将当前鼠标点转换为经纬度坐标的方法。请各位高手帮忙解决,谢谢!!

解决方案 »

  1.   

    请单独建立一个单元文件,如:SQLServerUnit
    然后在interface部分写:function StartSQLServer(szErrorMsg:string):Boolean;
    在implementation部分写:const
       SERVICE_UNKNOWN =0;type
       enumSQLSCMCommands=(SQLSCMCmd_STOP,SQLSCMCmd_PAUSE,SQLSCMCmd_START,SQLSCMCmd_CONTINUE);
    const
      wn95scm='w95scm.dll';
    // Function prototypes
    function SQLSCMLocalServiceControlA(lpszSvc:LPSTR;iCommand:integer;
      pdwErr:LPDWORD;iCount:integer;lpStartParameter:Pointer):BOOL;stdcall
      external wn95scm name 'SQLSCMLocalServiceControlA';
    function SQLSCMLocalServiceControlW(lpszSvc:LPWSTR;iCommand:integer;
      pdwErr:LPDWORD;iCount:integer;lpStartParameter:Pointer):BOOL;stdcall
      external wn95scm name 'SQLSCMLocalServiceControlW';
    function SQLSCMGetLocalServiceStateA(lpszSvc:LPSTR;pdwErr:LPDWORD):DWORD;stdcall
      external wn95scm name 'SQLSCMGetLocalServiceStateA';
    function SQLSCMGetLocalServiceStateW(pwszSvc:LPWSTR;pdwErr:LPDWORD):DWORD;stdcall
      external wn95scm name 'SQLSCMGetLocalServiceStateW';
      
    {$ifdef UNICODE}
    function SQLSCMLocalServiceControl(lpszSvc:LPSTR;iCommand:integer;
      pdwErr:LPDWORD;iCount:integer;lpStartParameter:Pointer):BOOL;stdcall
      external wn95scm name 'SQLSCMLocalServiceControlW';
    function SQLSCMGetLocalServiceState(pwszSvc:LPWSTR;pdwErr:LPDWORD):DWORD;stdcall
      external wn95scm name 'SQLSCMGetLocalServiceStateW';
    {$else}
    function SQLSCMLocalServiceControl(lpszSvc:LPSTR;iCommand:integer;
      pdwErr:LPDWORD;iCount:integer;lpStartParameter:Pointer):BOOL;stdcall
      external wn95scm name 'SQLSCMLocalServiceControlA';
    function SQLSCMGetLocalServiceState(lpszSvc:LPSTR;pdwErr:LPDWORD):DWORD;stdcall
      external wn95scm name 'SQLSCMGetLocalServiceStateA';
    {$endif} // !UNICODEfunction StartSQLServer(szErrorMsg:string):Boolean;
    var
       szService:LPSTR;
       dwErr:PDWORD;
       dwServiceState:DWORD;
       bControlSuccessful:BOOL;
       lsStr:string;
    begin
       result:=false;   szService := 'MSSQLServer';   bControlSuccessful:=TRUE;
       dwServiceState := SQLSCMGetLocalServiceState(szService, dwErr);
       while ((dwServiceState <>0) and (bControlSuccessful = TRUE))do
       begin
          if (dwServiceState = SERVICE_RUNNING) then
               break;
          case dwServiceState of
             SERVICE_PAUSED:begin     // Paused, so continue.
                bControlSuccessful :=  SQLSCMLocalServiceControl(szService,
                   Ord(SQLSCMCmd_CONTINUE),dwErr, 0, nil);
             end;
             SERVICE_STOPPED:begin     // Stopped, start service.
                bControlSuccessful :=  SQLSCMLocalServiceControl(szService,
                   Ord(SQLSCMCmd_START), dwErr, 0, nil);
             end;
             else // Error if state is 0 otherwise state is changing.
             begin
                if (dwServiceState = 0) then
                begin    // Error. Return failure.
                   StrPCopy(PChar(dwErr),lsStr);
                   szErrorMsg:='Error '+lsStr+' on attempt to determine service state.';
                   exit;
                end;
             end;
          end;
          Sleep(5);
          dwServiceState := SQLSCMGetLocalServiceState(szService, dwErr);
       end;
       if (bControlSuccessful) then
       begin
          StrPCopy(PChar(dwErr),lsStr);
          szErrorMsg:='Error '+lsStr+' returned on attempt to change service state.';
       end;
       result:=bControlSuccessful;
    end;
    以上是启动SQL Server 的服务,至于停止服务可以根据以上代码自己编写,很容易实现的。
      

  2.   

    function ScreenToMap(Zoom:Double;Margin:TPoint;ViewportOffset:TPoint;Extent:TExtent; const _ptg : TPoint ) : TGIS_Point ;
      begin
        if FZoom <= 0 then begin
          Result := GisPoint(0, 0 ) ;
          SysUtils.Abort ;
        end ;    Result.x := Extent.XMin +
                    ( (_ptg.x - ( Margin.X + ViewportOffset.X ) ) / Zoom +
                      Viewport.X
                    ) ;
        Result.y := FExtent.Ymax -
                    ( (_ptg.y - ( Margin.Y + ViewportOffset.Y ) ) / Zoom +
                      Viewport.Y
                    ) ;
      end ;
      

  3.   

    都幾天了,還沒結帖! 樓主你問題的問題不完整! 
    GIS里面算坐標需要如下幾個參數:Extent 屏幕表示經偉度的範圍 也就是LeftTop and BottomRight 這兩點所表示的經偉度! 還有就是Zoom 地圖的比例,這兩個參數是不能少的.
    在小的地理範圍里(如:一個城市),經偉度坐標可以把它當做為平面直角坐標來處里.如果是這樣的話那你的問題也就是一般高中生能解決的問題了! 如果你的地理範圍很大,如全中國,那你就得費點心思了!
    我以上的那些代碼是把它當做是小的地理範圍
      

  4.   

    我记得Mo有鼠标点转成地理坐标的方法,好像就是FromMapPoint,你再看看吧。