壊れた画層をデバッグする

既定では、Infrastructure Map Server は画層をレンダリングする際に発生するエラーを自動的に省略します。そのため、画層をレンダリングしているときに発生するエラーをデバッグしやすくするには、ログへの警告レベルの記録をオンにして、警告がエラー ログとトレース ログの両方に記録されるようにします。

[GeneralProperties]
LogsDetail = MappingService:1,FeatureService:1,
RenderingService:1

警告メッセージ自体は、問題を起こしている画層を特定できるほど十分な詳細は提供しません。

<2008-07-17T14:57:29>   2364 Anonymous
 Warning: An exception occurred in FDO component.
        Geometry property value encountered!
 StackTrace:
  - MgStylizationUtil.ExceptionTrap() line 199 file 
  .\GeometryAdapter.cpp
  An exception occurred in FDO component.

トレース ログをオンにすると、十分な詳細が提供できます。利用できる詳細レベルはサービスによって決まります。ほとんどのサービスはレベル 2 の詳細を返すことができます。Mapping Service はレベル 3 の詳細を返すことができます。MgStylizationUtil.StylizerLayers トレース エントリは、Mapping Service に関するレベル 3 の詳細です。

Mapping Service に関するレベル 3 の詳細と、Feature および Rendering Service に関するレベル 2 の詳細を返すには、LogsDetail パラメータを次のように設定します。

[GeneralProperties]
LogsDetail = MappingService:3,FeatureService:2,
RenderingService:2

この結果は次のとおりです。

<2008-07-17T14:57:29>   
 2364    BGN     MgStylizationUtil.StylizeLayers 
 Map=Sheboygan,LayerId=Library://Samples/Sheboygan/Layers/
 CityLimits.LayerDefinition
<2008-07-17T14:57:29>   
 1544    MgClientHandler::Initialize() - 
 Address: 27.0.0.1:2812
<2008-07-17T14:57:29>   
 1544    MgClientHandler::Initialize() - 
 Address: 27.0.0.1:2811
<2008-07-17T14:57:29>   
 2300    MgServerMappingService::GenerateLegendImage
<2008-07-17T14:57:29>   
 2364    BGN     MgServerFeatureService.GetSpatialContexts
 Id=Library://Samples/Sheboygan/Data/
 CityLimits.FeatureSource,ActiveOnly=0
<2008-07-17T14:57:29>   
 2364    END     MgServerFeatureService.GetSpatialContexts
<2008-07-17T14:57:29>   
 2364    BGN     MgServerFeatureService.SelectFeatures
 Resource=Library://Samples/Sheboygan/Data/
 CityLimits.FeatureSource,ClassName=SHP_Schema:CityLimits,
 Options={{Operator=1}{GeomProp=SHPGEOM}
 {GeomOp=EnvelopeIntersects}{Geometry=POLYGON 
 ((-87.780335659913959 43.691398128787803, 
 -87.680172841948519 43.691398128787803, 
 -87.680172841948519 43.797520000480297, 
 -87.780335659913959 43.797520000480297, 
 -87.780335659913959 43.691398128787803))}}
<2008-07-17T14:57:29>   
 2364    END     MgServerFeatureService.SelectFeatures
<2008-07-17T14:57:29>   
 2364 Warning: An exception occurred in FDO component.
 Geometry property value encountered!
<2008-07-17T14:57:29>   
 2364    END     MgStylizationUtil.StylizeLayers

エラー ログからは、スレッド 2364 で警告メッセージが生成されています。 タイムスタンプとスレッド ID を使用して、トレース ログで呼び出しスタックをトレースできます。トレース ログ内の警告文から MgServerFeatureService.SelectFeatures 呼び出しを介して MgStylizationUtil.StylizeLayers 呼び出しに至るまで、スレッド 2364 をバックトレースすることができます。BGN/END 文は、スレッドごとにネストしている処理を示します。Excel またはテキスト エディタを使用して、他のスレッドをログから削除することができます。

<2008-07-17T14:57:29>   
 2364    
BGN
MgStylizationUtil.StylizeLayers  Map=Sheboygan,LayerId=Library://Samples/Sheboygan/Layers/  CityLimits.LayerDefinition <2008-07-17T14:57:29>  2364 BGN MgServerFeatureService.GetSpatialContexts  Id=Library://Samples/Sheboygan/Data/  CityLimits.FeatureSource,ActiveOnly=0 <2008-07-17T14:57:29>  2364 END MgServerFeatureService.GetSpatialContexts <2008-07-17T14:57:29>  2364 BGN MgServerFeatureService.SelectFeatures  Resource=Library://Samples/Sheboygan/Data/  CityLimits.FeatureSource,ClassName=SHP_Schema:CityLimits,  Options={{Operator=1}{GeomProp=SHPGEOM}  {GeomOp=EnvelopeIntersects}{Geometry=POLYGON  ((-87.780335659913959 43.691398128787803,  -87.680172841948519 43.691398128787803,  -87.680172841948519 43.797520000480297,  -87.780335659913959 43.797520000480297,  -87.780335659913959 43.691398128787803))}} <2008-07-17T14:57:29>  2364 END MgServerFeatureService.SelectFeatures <2008-07-17T14:57:29>  2364 Warning: An exception occurred in FDO component.       Geometry property value encountered! <2008-07-17T14:57:29>  2364
END
MgStylizationUtil.StylizeLayers

FDO 例外は、SelectFeatures の呼び出し後すぐに発行されます。 これは論理的です。なぜなら、SelectFeaturesMgFeatureReader を返し、スタイライザによって実行される最初の ReadNext() はエラーを発生させるためです。

ログを見ると、StylizeLayers の BGN/END ブロックの間に警告メッセージが生じていることがわかります。これは、CityLimits 画層定義がエラーを引き起こす画層であることを意味します。これにより、マップ内のすべての画層を調べる必要なく、1 つの画層に専念することができます。