爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
楼主: 炜麦

[其他] c++ surfer 画等值线。

[复制链接]

新浪微博达人勋

发表于 2013-2-21 16:30:52 | 显示全部楼层
其实goldensoftware的论坛上早就有讨论,你到官网搜“ How to call GridData() from VC++”就知道了。
下面是当年切萨皮克公司的人贴的代码。

  1. John Gann Posted - 21 May 2002 12:00 -------------------------------------------------------------------------------- /** Name: Surfer.cpp Blame: John Gann, Chesapeake Technology, Inc. http://www.chesapeaketech.com Start Date: 21 MAY 2002 Purpose: To handle the OLE automation of the Surfer application object to produce a grid file from randomly spaced x,y,z data points.
  2. **/ #include "stdafx.h" #include "Surfer.h"
  3. // Adjust this path to match where your Surfer8 is installed #import "C:\Program Files\Golden Software\Surfer8\Surfer.exe" no_namespace raw_interfaces_only

  4. /** INPUT: pXYZInputFile name of the input file containing the values to be gridded pOutputGridFile name of the output file where the grid should be written
  5. My data looks like this (x, y, z) 592523, 3624300.9, 8.5 592523, 3624301.0, 8.5 592523, 3624301.1, 8.1 592523, 3624301.2, 8.1 **/ BOOL CreateSurferGridFile(const char * pXYZInputFile, const char * pOutputGridFile) { // Create an instance of the Application object // TODO: Probably want to change this to look for an existing instance of the application // object and just attach to it. IApplicationPtr pApp(__uuidof(Application));
  6. // Make the Application object visible pApp->put_Visible(VARIANT_TRUE);
  7. COleVariant vpXYZInputFile(pXYZInputFile, VT_BSTR); // input filename as a variant COleVariant vpOutputGridFile(pOutputGridFile, VT_BSTR); // output filename as a variant COleVariant vtXCol(1L); // the column containing the X coordinate (1-based index) COleVariant vtYCol(2L); // the column containing the Y coordinate (1-based index) COleVariant vtZCol(3L); // the column containing the Z coordinate (1-based index) COleVariant vtShowReport((long) FALSE, VT_I4); // i'm not interested in the report /* In case you're wondering what the heck a VARIANT_BOOL is... 0 == FALSE, -1 == TRUE typedef short VARIANT_BOOL; */ VARIANT_BOOL vtStatus; // I think this is the return value of the function // as a short. The function returns an HRESULT via the wrapper class // generated by the #import directive but the Scripter helpfile says // it should return a boolean value. According to the Microsoft // docs -1 = TRUE and 0 = FALSE. Odd.
  8. /** From MSDN: HOWTO: Pass Optional Arguments to MFC ActiveX Controls
  9. This seems to be the answer on how to default the bazillion unused parameters like VB users do. **/ VARIANT vDefaultArg; vDefaultArg.vt = VT_ERROR; vDefaultArg.scode = DISP_E_PARAMNOTFOUND;
  10. HRESULT hResult = pApp->GridData( vpXYZInputFile.bstrVal, // BSTR DataFile, vtXCol.lVal, vtYCol.lVal, vtZCol.lVal, vDefaultArg, vDefaultArg, vDefaultArg, vDefaultArg, vDefaultArg, vDefaultArg, // 10 vDefaultArg, vDefaultArg, vDefaultArg, vDefaultArg, vDefaultArg, vtShowReport, // don't show the report vDefaultArg, vDefaultArg, vDefaultArg, vDefaultArg, // 20 vDefaultArg, vDefaultArg, vDefaultArg, vDefaultArg, vDefaultArg, vDefaultArg, vDefaultArg, vDefaultArg, vDefaultArg, vDefaultArg, // 30 vDefaultArg, vDefaultArg, vDefaultArg, vDefaultArg, vDefaultArg, vDefaultArg, vDefaultArg, vDefaultArg, vDefaultArg, vDefaultArg, // 40 vDefaultArg, vDefaultArg, vDefaultArg, vDefaultArg, vDefaultArg, vDefaultArg, vDefaultArg, vDefaultArg, vDefaultArg, vpOutputGridFile.bstrVal, // 50 Output data filename srfGridFmtAscii, // 51 Output data format vDefaultArg, vDefaultArg, vDefaultArg, vDefaultArg, vDefaultArg, vDefaultArg, &vtStatus); // return status?
  11. TRACE("hResult: %lu, vtStatus: %d\n", hResult, vtStatus);
  12. pApp->Quit(); return TRUE; }


当然,这个代码据说有个小问题(我自己只用basic没验证过),因为这位干尼网友给GridData()传递了58个参数,按帮助说明是只有57个的。

有网友验证说,最后一个参数 &vtStatus 纯属多余,删除即可。

当然,GridData 函数里面第52~57个参数都是有默认值的,也就是说,可以只传递前51个参数。

只能帮你这么多了。

密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-2-21 16:33:46 | 显示全部楼层
本帖最后由 chengxf 于 2013-2-21 16:37 编辑

关于第二个问题:
C++ 中的语句 ColorMap.LoadFile(SurferApp.Path+"\ColorScales\Rainbow2.clr") 如果不行,是否改成:
ContourMap.LoadFile(SurferApp.Path+"\ColorScales\Rainbow2.lvl")
或者
Dim Levels As Object
Set Levels = ContourMap.Levels
Levels.LoadFile(SurferApp.Path+"\Samples\Rainbow2.lvl")

这里提供一个等级文件:Rainbow2.lvl 供你使用。 Rainbow2.lvl (1.4 KB, 下载次数: 8)
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2013-2-23 20:40:18 | 显示全部楼层
holz 发表于 2013-2-21 16:30
其实goldensoftware的论坛上早就有讨论,你到官网搜“ How to call GridData() from VC++”就知道了。
下面 ...

非常谢谢 我也是找到了这份资料,才把问题解决的。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2013-2-23 20:46:54 | 显示全部楼层
chengxf 发表于 2013-2-21 16:33
关于第二个问题:
C++ 中的语句 ColorMap.LoadFile(SurferApp.Path+"\ColorScales\Rainbow2.clr") 如果不 ...

非常谢谢,如果用colormap的话就要load .clr文件 如果是用 contourmap 就要load .lvl 文件,我之所以错了,是没匹配好,函数用的是contourmap,却载入.clr文件。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-3-1 15:21:05 | 显示全部楼层
炜麦 发表于 2013-2-21 10:22
非常谢谢! 请问一下你那里有汉化版surfer帮助文件吗?能麻烦你给我一份吗? 邮箱。 谢谢啦。

我也是,急需surfer的中文版,谁有也给我发份吧,有教程更好啦,邮箱1600014395@qq.com
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2016-2-2 17:25:40 | 显示全部楼层
mark,留着好好学习学习
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2016-3-9 09:00:26 | 显示全部楼层
谢谢楼主的无私分享~~
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2016-3-10 11:28:43 | 显示全部楼层
谢谢楼主的无私分享!
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2016-3-11 15:20:56 | 显示全部楼层
正好需要做一个色阶文件,谢谢
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2016-11-29 09:51:42 | 显示全部楼层
holz 发表于 2013-2-21 09:02
等级文件格式
等级文件 [.LVL] 用于为 Surfer 各种类型的地图指定等级和属性数据。等级文件是每行一个记录 ...

前辈,请问下lvl2,有个范围是  <-10  或者 >250 ,这个Level应该怎么表示,先谢谢了
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表