中国海员联盟吧 关注:2,337贴子:5,994
  • 0回复贴,共1

OpenCPN电子海图探索--S57Obji-中船系统工程研究院电子海图讲座

只看楼主收藏回复

OpenCPN电子海图探索--S57Obji-中船系统工程研究院电子海图讲座
2014-1-19 10:18|发布者: 懒猴航海|查看: 3|评论: 0|原作者: ouyangxiong
摘要: 电子海图软件OpenCPN探索——S57Obj中船系统工程研究院电子海图讲座本文介绍OpenCPN 的重要数据结构S57Obj。S57Obj是连接SENC文件和显示的桥梁,S57Obj是OpenCPN核心数据之一。下面是针对S57Obj的分析。1.首先看一 ...opencpn电子海图探索——S57Obj本文介绍电子海图软件OpenCPN 的重要数据结构S57Obj。S57Obj是连接SENC文件和显示的桥梁,S57Obj是电子海图软件OpenCPN核心数据之一。
下面是针对S57Obj的分析。1. 首先看一下S57Obj的定义,class S57Obj{public: // Public Methods S57Obj(); ~S57Obj(); S57Obj(char*first_line, wxInputStream *fpx, double ref_lat, double ref_lon); wxStringGetAttrValueAsString ( char *attr ); intGetAttributeIndex( const char *AttrSeek ); // PrivateMethodsprivate: boolIsUsefulAttribute(char *buf); intmy_fgets( char *buf, int buf_len_max, wxInputStream& ifs ); intmy_bufgetl( char *ib_read, char *ib_end, char *buf, int buf_len_max );public: // InstanceData char FeatureName[8]; GeoPrim_t Primitive_type; ……
}
其中S57Obj(char *first_line,wxInputStream *fpx, double ref_lat, double ref_lon)是从SENC文件读取内容,构建S57Obj对象的重要函数,构建时会把S57Obj的属性赋值给各个属性字段。下面是依次调用的顺序。InitReturn s57chart::Init( const wxString& name,ChartInitFlag flags )InitReturn s57chart::PostInit( ChartInitFlag flags,ColorScheme cs )int s57chart::BuildRAZFromSENCFile( const wxString&FullPath )S57Obj *obj = new S57Obj( buf, &fpx, 0, 0 );在形成S57Obj的过程中,会形成另一个重要的数据结构:ObjRazRulestypedef struct_ObjRazRules{ LUPrec *LUP; S57Obj *obj; s57chart *chart; //dsr ... chart object owningthis rule set struct _ObjRazRules *child; // child list, used only forMultiPoint Soundings struct _ObjRazRules *next;}ObjRazRules;里面的LUP查找表是供s52plib使用的。class s52plib{public: s52plib( const wxString& PLib, boolb_forceLegacy = false ); ~s52plib(); void SetPPMM( float ppmm ) {canvas_pix_per_mm = ppmm; } float GetPPMM() { return canvas_pix_per_mm;} LUPrec *S52_LUPLookup( LUPname LUP_name,const char * objectName, S57Obj *pObj, bool bStrict = 0 ); int _LUP2rules( LUPrec *LUP, S57Obj *pObj); S52color* getColor( const char *colorName); wxColour getwxColour( const wxString&colorName ); void UpdateMarinerParams( void ); void ClearCNSYLUPArray( void ); void GenerateStateHash(); long GetStateHash() { return m_state_hash; } void SetPLIBColorScheme( wxString scheme ); wxString GetPLIBColorScheme( void ) {return m_ColorScheme; } void SetGLRendererString(const wxString&renderer); bool ObjectRenderCheck( ObjRazRules*rzRules, ViewPort *vp ); bool ObjectRenderCheckPos( ObjRazRules*rzRules, ViewPort *vp ); bool ObjectRenderCheckCat( ObjRazRules*rzRules, ViewPort *vp ); bool ObjectRenderCheckCS( ObjRazRules*rzRules, ViewPort *vp ); static void DestroyLUP( LUPrec *pLUP ); static void ClearRulesCache( Rule *pR );// Temporarily save/restore the currentcolortable index// Useful for Thumbnail rendering void SaveColorScheme( void ) {m_colortable_index_save = m_colortable_index;} void RestoreColorScheme( void ) {}….… }s52plib是s52 Presentation Lib的实现。OpenCPN没有完全实现S52标准的相关规定,其中条件符号化过程仅仅实现一小部分内容。如果要做到完全符合S52标准,还有很多工作要做。s52plib画图时,分为对象和区域不同显示。S52plib中还引用RenderFromHPGL实现绘图功能。classRenderFromHPGL {public: RenderFromHPGL( s52plib* plibarg ); void SetTargetDC( wxDC* pdc ); void SetTargetOpenGl(); void SetTargetGCDC( wxGCDC* gdc ); bool Render(char *str, char *col, wxPoint&r, wxPoint &pivot, double rot_angle = 0); private: const char* findColorNameInRef( charcolorCode, char* col ); void RotatePoint( wxPoint& point,double angle ); wxPoint ParsePoint( wxString& argument); void SetPen(); void Line( wxPoint from, wxPoint to ); void Circle( wxPoint center, int radius,bool filled = false ); void Polygon(); s52plib* plib; int scaleFactor; wxDC* targetDC; wxGCDC* targetGCDC; wxColor penColor; wxPen* pen; wxColor brushColor; wxBrush* brush; long penWidth; int noPoints; wxPoint polygon[100]; bool renderToDC; bool renderToOpenGl; bool renderToGCDC; bool havePushedOpenGlAttrib;} OpenCPN中绘图机制是最复杂的过程之一,也是最为核心的内容。其中涉及的内容多,算法复杂,理解了绘图机制,也就理解了OpenCPN最核心的东西,可以从S57Obj入手了解整个过程。SENC的内容如何赋值给S57Obj,如何根据S57Obj形成查找表,如果根据查找表形成s52绘制对象等。
融成科技 中船系统工程研究院电子海图讲座
摘自:http://www.opencpn.cn/OpenCPNDocs/OpenCPN%E6%8E%A2%E7%B4%A2--S57Obj.pdf 已同步至 懒猴航海的微博


IP属地:北京1楼2014-01-19 12:02回复