/* -------------------------------------------------------------------- */ /* Reading the Fields in this Feature */ /* -------------------------------------------------------------------- */ public static void CreateTreeFields(ref TreeNode thisFeatureTree, Feature feature, FeatureDefn featureDefn) { // field definition as we iterate through the fields FieldDefn iFieldDefn; int nameIndex; int objlIndex; string nameString; string objlString; // To get the name and the S-57 Type code (OBJL), we have to look forward into the fields. This piece of code // is mostly here to show how that is done as will need this when rendering these objects. You could easily add // shapes or color, but it is not necessary here. The name and the code is nice for the debug file though so we can // see what each feature is. // OBJL field should always exist - the exception are the meta data fields such as DSID which has no code. objlIndex = featureDefn.GetFieldIndex("OBJL"); if (objlIndex > 0) { objlString = DecodeField(feature, featureDefn.GetFieldDefn(objlIndex), objlIndex); } else { objlString = "No Code"; } // name field may not exist. we could get either the info or text description if they exist nameIndex = featureDefn.GetFieldIndex("OBJNAM"); if (nameIndex > 0) { nameString = DecodeField(feature, featureDefn.GetFieldDefn(nameIndex), nameIndex); } else { nameString = "Not Named"; } DebugUtil.WriteLine(); DebugUtil.WriteLine(string.Format(" *** Feature: {0}, Name: {1}, S-57 Code: {2}", featureDefn.GetName(), nameString, objlString)); DebugUtil.WriteLine(); // get the styles, if any if (feature.GetStyleString() != null) { DebugUtil.WriteLine(" Style = " + feature.GetStyleString()); } // this gets the sub-geometries. not all features have sub-geometries Geometry geom = feature.GetGeometryRef(); if (geom != null) { DebugUtil.WriteLine(" Geometry Name: " + geom.GetGeometryName() + " Sub-geometry Count: " + geom.GetGeometryCount()); Geometry sub_geom; for (int i = 0; i < geom.GetGeometryCount(); i++) { sub_geom = geom.GetGeometryRef(i); if (sub_geom != null) { string subGeoString; DebugUtil.Write(" sub-geometry " + i + ": "); switch (sub_geom.GetGeometryType()) { case wkbGeometryType.wkbLineString: case wkbGeometryType.wkbPoint25D: sub_geom.ExportToWkt(out subGeoString); DebugUtil.WriteLine(subGeoString); TreeUtil.AddChildNode(thisFeatureTree, subGeoString); break; default: DebugUtil.WriteLine("Unhandled subgeometry type: " + sub_geom.GetGeometryType()); TreeUtil.AddChildNode(thisFeatureTree, "Unhandled sub-geomtry type", sub_geom.GetGeometryType().ToString()); break; } } } // a bit confusing, but if it has no sub geometries, use the base geometry. mostly applies to the type POINT if (geom.GetGeometryCount() == 0) { string geom_wkt; geom.ExportToWkt(out geom_wkt); DebugUtil.WriteLine(" geom_wkt: " + geom_wkt); TreeUtil.AddChildNode(thisFeatureTree, geom_wkt); } } // if geo != null for (int iField = 0; iField < feature.GetFieldCount(); iField++) { iFieldDefn = featureDefn.GetFieldDefn(iField); // not all fields have usable information, skip those that don't. if (feature.IsFieldSet(iField)) // IsFieldSet is a handy way to see if the field has any actual information { DebugUtil.Write(" "); DebugUtil.Write("Field Name: " + iFieldDefn.GetName() + ", "); DebugUtil.Write("Type Name: " + iFieldDefn.GetFieldTypeName(iFieldDefn.GetFieldType()) + ", "); DebugUtil.Write("Field Type: " + iFieldDefn.GetFieldType() + ", "); DebugUtil.Write("Value: " + DecodeField(feature, iFieldDefn, iField)); DebugUtil.WriteLine(); } // if isField } }