/// <summary>
        /// Renders a feature into displayable render objects.
        /// </summary>
        /// <param name="feature">The feature to render.</param>
        /// <param name="style">The style to use to render the feature.</param>
        /// <returns>An enumeration of positioned render objects for display.</returns>
        public IEnumerable <TRenderObject> RenderFeature(IFeatureDataRecord feature,
                                                         TStyle style,
                                                         RenderState renderState,
                                                         ILayer layer)
        {
            Boolean cancel = false;

            OnFeatureRendering(ref cancel);

            if (cancel)
            {
                yield break;
            }

            if (style == default(TStyle))
            {
                throw new InvalidOperationException("Cannot render feature without a style.");
            }

            IEnumerable <TRenderObject> renderedObjects = DoRenderFeature(feature, style, renderState, layer);

            OnFeatureRendered();

            foreach (TRenderObject renderObject in renderedObjects)
            {
                yield return(renderObject);
            }
        }
Esempio n. 2
0
        private IConvertData GetConverter(Type tsource, Type ttarget, IFeatureDataRecord sourcetable, int index, IGeometryFactory geometryFactory)
        {
            Type t = typeof(ConvertData <,>);
            Type g = t.MakeGenericType(tsource, ttarget);

            return((IConvertData)Activator.CreateInstance(g, sourcetable, index, geometryFactory));
        }
Esempio n. 3
0
        public void TestGetFeatureByOid()
        {
            GeometryServices services = new GeometryServices();

            MsSqlServer2008Provider <long> search = new MsSqlServer2008Provider <long>(services.DefaultGeometryFactory,
                                                                                       ConfigurationManager.
                                                                                       ConnectionStrings["sql2008"].
                                                                                       ConnectionString,
                                                                                       "dbo",
                                                                                       "vw_iMARS_BRANCH", "ACSId", "Geom")
            {
                DefaultProviderProperties
                    = new ProviderPropertiesExpression(
                          new ProviderPropertyExpression[]
                {
                    new WithNoLockExpression(true),
                    new ForceIndexExpression(true)
                })
            };


            IFeatureDataRecord record = search.GetFeatureByOid(1);

            Assert.IsNotNull(record);
        }
 IEnumerable <TRenderObject> IFeatureRenderer <TRenderObject> .RenderFeature(IFeatureDataRecord feature,
                                                                             IStyle style,
                                                                             RenderState renderState,
                                                                             ILayer layer)
 {
     return(RenderFeature(feature, style as TStyle, renderState, layer));
 }
Esempio n. 5
0
        public static string WriteFeature(IGeoJsonFeatureStyle style, IFeatureDataRecord feature)
        {
            StringBuilder sb = new StringBuilder();

            WriteFeature(sb, style, feature);
            return(sb.ToString());
        }
Esempio n. 6
0
        protected override IEnumerable <TRenderObject> DoRenderFeature(IFeatureDataRecord feature,
                                                                       GeoJsonGeometryStyle style,
                                                                       RenderState state,
                                                                       ILayer layer)
        {
            if (feature == null)
            {
                throw new ArgumentNullException("feature");
            }
            if (style == null)
            {
                throw new ArgumentNullException("style");
            }

            if (feature.Geometry == null)
            {
                throw new InvalidOperationException("Feature must have a geometry to be rendered.");
            }


            StringBuilder sb = new StringBuilder();

            GeoJsonFeatureWriter.WriteFeature(sb, style, feature);
            yield return((TRenderObject)(object)(new GeoJsonRenderObject(sb.ToString())));
            /* oh dear - i feel very dirty now */
        }
Esempio n. 7
0
        IStyle ITheme.GetStyle(IFeatureDataRecord row)
        {
            if (!(row is FeatureDataRow))
            {
                throw new ArgumentException("Parameter 'row' must be of type FeatureDataRow");
            }

            return(GetStyle(row as FeatureDataRow));
        }
 public bool Read()
 {
     record = null;
     if (_enumerator.MoveNext())
     {
         read++;
         record = _enumerator.Current;
         return true;
     }
     return false;
 }
 public bool Read()
 {
     record = null;
     if (_enumerator.MoveNext())
     {
         read++;
         record = _enumerator.Current;
         return(true);
     }
     return(false);
 }
Esempio n. 10
0
        /// <summary>
        /// Renders a feature into displayable render objects.
        /// </summary>
        /// <param name="feature">The feature to render.</param>
        /// <returns>An enumeration of positioned render objects for display.</returns>
        public IEnumerable <TRenderObject> RenderFeature(IFeatureDataRecord feature)
        {
            TStyle style = DefaultStyle;

            if (style == null)
            {
                throw new InvalidOperationException("Cannot render feature without style. " +
                                                    "DefaultStyle is null.");
            }

            return(RenderFeature(feature, style, RenderState.Normal, null));
        }
        public bool Symbolize(IFeatureDataRecord obj, out object output)
        {
            TOutput toutput;

            if (Symbolize(obj, out toutput))
            {
                output = toutput;
                return(true);
            }
            output = null;
            return(false);
        }
Esempio n. 12
0
        public Boolean Read()
        {
            checkDisposed();

            Boolean reading = _objectEnumerator.MoveNext();

            if (reading)
            {
                _currentFeature = _shapeFile.GetFeatureByOid(_objectEnumerator.Current);
            }

            return(reading);
        }
        /// <summary>
        /// Renders the geometry of the <paramref name="feature"/>.
        /// </summary>
        /// <param name="feature">The feature to render.</param>
        /// <param name="style">The style to use to render the feature.</param>
        /// <returns>An enumeration of positioned render objects suitable for display.</returns>
        protected override IEnumerable <TRenderObject> DoRenderFeature(IFeatureDataRecord feature, GeometryStyle style, RenderState renderState, ILayer layer)
        {
            if (feature == null)
            {
                throw new ArgumentNullException("feature");
            }
            if (style == null)
            {
                throw new ArgumentNullException("style");
            }

            if (feature.Geometry == null)
            {
                throw new InvalidOperationException("Feature must have a geometry to be rendered.");
            }

            return(renderGeometry(feature.Geometry, style, renderState));
        }
Esempio n. 14
0
        public FeatureDataRow <TTarget> ConvertRow(IFeatureDataRecord source)
        {
            if (typeof(TSource) == typeof(TTarget) && source is FeatureDataRow)
            {
                return(source as FeatureDataRow <TTarget>);
            }
            TTarget oid = _conversionDelegate((TSource)source.GetOid());
            FeatureDataRow <TTarget> row = _target.NewRow(oid);

            object[] vals = new object[source.FieldCount];
            vals[_oidColumnIndex] = oid;
            source.GetValues(vals);
            row.ItemArray = vals;
            //row.Geometry = source.Geometry.IsValid ? source.Geometry : source.Geometry.Buffer(0.0);
            row.Geometry = source.Geometry;

            return(row);
        }
        public static void WriteFeature(StringBuilder sb, IGeoJsonFeatureStyle style, IFeatureDataRecord feature)
        {
            IGeometry g = style.PreProcessGeometries
                              ? style.GeometryPreProcessor(feature.Geometry)
                              : feature.Geometry;
            sb.Append("{");
            sb.Append("\"type\":\"Feature\",");
            if (feature.HasOid)
            {
                sb.Append(JsonUtility.FormatJsonAttribute("id", feature.GetOid()));
                sb.Append(",");
            }

            sb.Append("\"properties\":");
            WriteFeatureAttributes(sb, style, feature);
            sb.Append(",");

            if (style.IncludeBBox)
            {
                sb.Append("\"bbox\":");
                WriteExtents(sb, g.Extents, style.CoordinateNumberFormatString);
                sb.Append(",");
            }

            /* Ideally this should be higher up e.g at the layer level but we dont currently 
             * have anywhere where we can group features by layer. 
             * It still complies with the spec but will be considerably more verbose */

            if (g.SpatialReference != null || !string.IsNullOrEmpty(g.Srid))
            {
                sb.Append("\"crs\":");
                WriteNamedCrs(sb,
                              g.SpatialReference != null
                                  ? g.SpatialReference.Name
                                  : "EPSG:" + SridMap.DefaultInstance.Process(g.SpatialReference, 0));
                sb.Append(",");
            }

            sb.Append("\"geometry\":");
            WriteGeometry(sb, g, style.CoordinateNumberFormatString);

            sb.Append("}");
            sb.AppendLine();
        }
Esempio n. 16
0
 private static void WriteFeatureAttributes(StringBuilder sb, IGeoJsonFeatureStyle style,
                                            IFeatureDataRecord feature)
 {
     sb.Append("{");
     if (style.IncludeAttributes)
     {
         IDictionary <string, object> attributes = style.AttributeExtractionDelegate(feature);
         int i = 0;
         foreach (KeyValuePair <string, object> kvp in attributes)
         {
             sb.Append(JsonUtility.FormatJsonAttribute(kvp.Key, kvp.Value));
             if (i < attributes.Count - 1)
             {
                 sb.Append(",");
             }
             i++;
         }
     }
     sb.Append("}");
 }
Esempio n. 17
0
        public DataConverter(Func <TSource, TTarget> conversionDlgt, IFeatureDataRecord source, int oidColumnIndex, IGeometryFactory geometryFactory)
        {
            _conversionDelegate = conversionDlgt;
            _oidColumnIndex     = oidColumnIndex;
            string oidColName = source.GetName(oidColumnIndex);

            FeatureDataTable <TTarget> trgt = new FeatureDataTable <TTarget>("SchemaTable", oidColName,
                                                                             geometryFactory);

            for (int i = 0; i < source.FieldCount; i++)
            {
                if (i != oidColumnIndex)
                {
                    trgt.Columns.Add(new DataColumn(source.GetName(i), source.GetFieldType(i)));
                }
            }


            _target = trgt;
        }
Esempio n. 18
0
        protected override IEnumerable <GeoJsonRenderObject> DoRenderFeature(IFeatureDataRecord feature,
                                                                             GeoJsonLabelStyle style,
                                                                             RenderState state, ILayer layer)
        {
            FeatureDataRow fdr = (FeatureDataRow)feature;

            string text = fdr.Evaluate(style.LabelExpression);


            StringBuilder sb = new StringBuilder();

            sb.Append("{");
            sb.Append(JsonUtility.FormatJsonAttribute("type", "Label"));
            sb.Append(",");
            sb.Append(JsonUtility.FormatJsonAttribute("id", feature.GetOid()));
            sb.Append(",");
            sb.Append(JsonUtility.FormatJsonAttribute("text", text));
            sb.Append(",");


            IGeometry geom;

            if (style.IncludeGeometryData)
            {
                geom = style.PreProcessGeometries
                           ? style.GeometryPreProcessor(feature.Geometry)
                           : feature.Geometry;
            }
            else
            {
                geom = feature.Geometry.Centroid;
            }

            sb.Append("\"shape\":");
            GeoJsonFeatureWriter.WriteGeometry(sb, geom, style.CoordinateNumberFormatString);
            sb.Append("}");


            yield return(new GeoJsonRenderObject(sb.ToString()));
        }
Esempio n. 19
0
 public DataConverter(IFeatureDataRecord source, int oidColumnIndex, IGeometryFactory geometryFactory)
     : this(
         delegate(TSource o) { return((TTarget)Convert.ChangeType(o, typeof(TTarget))); }, source, oidColumnIndex, geometryFactory)
 {
 }
Esempio n. 20
0
        public static void WriteFeature(StringBuilder sb, IGeoJsonFeatureStyle style, IFeatureDataRecord feature)
        {
            IGeometry g = style.PreProcessGeometries
                              ? style.GeometryPreProcessor(feature.Geometry)
                              : feature.Geometry;

            sb.Append("{");
            sb.Append("\"type\":\"Feature\",");
            if (feature.HasOid)
            {
                sb.Append(JsonUtility.FormatJsonAttribute("id", feature.GetOid()));
                sb.Append(",");
            }

            sb.Append("\"properties\":");
            WriteFeatureAttributes(sb, style, feature);
            sb.Append(",");

            if (style.IncludeBBox)
            {
                sb.Append("\"bbox\":");
                WriteExtents(sb, g.Extents, style.CoordinateNumberFormatString);
                sb.Append(",");
            }

            /* Ideally this should be higher up e.g at the layer level but we dont currently
             * have anywhere where we can group features by layer.
             * It still complies with the spec but will be considerably more verbose */

            if (g.SpatialReference != null || !string.IsNullOrEmpty(g.Srid))
            {
                sb.Append("\"crs\":");
                WriteNamedCrs(sb,
                              g.SpatialReference != null
                                  ? g.SpatialReference.Name
                                  : "EPSG:" + SridMap.DefaultInstance.Process(g.SpatialReference, 0));
                sb.Append(",");
            }

            sb.Append("\"geometry\":");
            WriteGeometry(sb, g, style.CoordinateNumberFormatString);

            sb.Append("}");
            sb.AppendLine();
        }
 private static void WriteFeatureAttributes(StringBuilder sb, IGeoJsonFeatureStyle style,
                                            IFeatureDataRecord feature)
 {
     sb.Append("{");
     if (style.IncludeAttributes)
     {
         IDictionary<string, object> attributes = style.AttributeExtractionDelegate(feature);
         int i = 0;
         foreach (KeyValuePair<string, object> kvp in attributes)
         {
             sb.Append(JsonUtility.FormatJsonAttribute(kvp.Key, kvp.Value));
             if (i < attributes.Count - 1)
                 sb.Append(",");
             i++;
         }
     }
     sb.Append("}");
 }
 public static string WriteFeature(IGeoJsonFeatureStyle style, IFeatureDataRecord feature)
 {
     StringBuilder sb = new StringBuilder();
     WriteFeature(sb, style, feature);
     return sb.ToString();
 }
Esempio n. 23
0
        //private SchemaMap _schemaMap = new SchemaMap();

        //private delegate Object Converter(Object input);

        //private class SchemaMap
        //{
        //    private readonly List<SchemaMapColumnMatch> _columnMatches = new List<SchemaMapColumnMatch>();
        //    private readonly List<SchemaMapKeyMatch> _keyMatches = new List<SchemaMapKeyMatch>();

        //    public void AddColumnMatch(DataColumn src, DataColumn dst)
        //    {
        //        AddColumnMatch(src, dst, null);
        //    }

        //    public void AddColumnMatch(DataColumn src, DataColumn dst, Converter converter)
        //    {
        //        SchemaMapColumnMatch match = new SchemaMapColumnMatch(src, dst, converter);
        //        _columnMatches.Add(match);
        //    }

        //    public void AddKeyMatch(DataColumn src, DataColumn dst)
        //    {
        //        SchemaMapKeyMatch match = new SchemaMapKeyMatch(src, dst);
        //        _keyMatches.Add(match);
        //    }

        //    public SchemaMapColumnMatch GetColumnMatch(Int32 index)
        //    {
        //        return _columnMatches[index];
        //    }

        //    public SchemaMapKeyMatch GetKeyMatch(Int32 index)
        //    {
        //        return _keyMatches[index];
        //    }
        //}

        //private class SchemaMapKeyMatch
        //{
        //    private readonly DataColumn _srcColumn;
        //    private readonly DataColumn _dstColumn;

        //    public SchemaMapKeyMatch(DataColumn src, DataColumn dst)
        //    {
        //        _srcColumn = src;
        //        _dstColumn = dst;
        //    }

        //    public DataColumn Destination
        //    {
        //        get { return _dstColumn; }
        //    }

        //    public DataColumn Source
        //    {
        //        get { return _srcColumn; }
        //    }
        //}

        //private class SchemaMapColumnMatch
        //{
        //    private readonly DataColumn _srcColumn;
        //    private readonly DataColumn _dstColumn;
        //    private readonly Converter _converter;

        //    public SchemaMapColumnMatch(DataColumn src, DataColumn dst, Converter converter)
        //    {
        //        _srcColumn = src;
        //        _converter = converter;
        //        _dstColumn = dst;
        //    }

        //    public Converter Converter
        //    {
        //        get { return _converter; }
        //    }

        //    public DataColumn Destination
        //    {
        //        get { return _dstColumn; }
        //    }

        //    public DataColumn Source
        //    {
        //        get { return _srcColumn; }
        //    }
        //}

        //private static DataTable mergeSchema(DataTable source, DataSet targetDataSet, DataTable target, SchemaMergeAction mergeAction, Boolean preserveChanges)
        //{
        //    Boolean ignoreCase = ((Int32)(mergeAction & SchemaMergeAction.CaseInsensitive) != 0);
        //    DataTable targetTable = null;

        //    if (targetDataSet != null)
        //    {
        //        if (tablesContain(targetDataSet, ignoreCase, source.TableName))
        //        {
        //            targetTable = targetDataSet.Namespace != source.Namespace
        //                            ? targetDataSet.Tables[source.TableName]
        //                            : targetDataSet.Tables[source.TableName, source.Namespace];
        //        }
        //    }
        //    else
        //    {
        //        targetTable = target;
        //    }

        //    if (targetTable == null)    // This will be true when the targetDataSet doesn't have a table by the same name
        //    {
        //        throw new NotImplementedException("DataSet merges not yet implemented.");
        //    }
        //    else
        //    {
        //        if (mergeAction == SchemaMergeAction.None)
        //        {
        //            mergeExtendedProperties(source.ExtendedProperties, targetTable.ExtendedProperties, mergeAction, preserveChanges);
        //            return targetTable;
        //        }

        //        Int32 initialTargetCount = targetTable.Columns.Count;
        //        Boolean matchIfConvertible = (Int32)(mergeAction & SchemaMergeAction.MatchIfConvertible) != 0;
        //        Boolean includeKey = (Int32)(mergeAction & SchemaMergeAction.Key) != 0;
        //        Boolean add = (Int32)(mergeAction & SchemaMergeAction.AddAll) != 0;
        //        Boolean replace = (Int32)(mergeAction & SchemaMergeAction.Replace) != 0;

        //        for (int i = 0; i < source.Columns.Count; i++)
        //        {
        //            DataColumn src = source.Columns[i];
        //            DataColumn dest = columnsContain(targetTable, source, src.ColumnName, src.DataType, ignoreCase, matchIfConvertible, includeKey)
        //                                            ? targetTable.Columns[src.ColumnName]
        //                                            : null;
        //            if (dest == null)
        //            {
        //                // rematch using type coersion to System.Object to ensure match
        //                dest = columnsContain(targetTable, src.ColumnName, typeof(Object), ignoreCase, true, includeKey)
        //                                            ? targetTable.Columns[src.ColumnName]
        //                                            : null;

        //                if (dest != null && replace)
        //                {
        //                    // Find common type to convert to (widen for numeric and character data, cast up for objects)
        //                    // Add new column with found type
        //                    // Copy existing dest data to new column from old column
        //                    // Remove original destination column
        //                    throw new NotImplementedException("Schema replacement not yet implemented");
        //                }
        //            }

        //            if (dest == null)
        //            {
        //                if (add)
        //                {
        //                    dest = _cloneDataColumn(src);
        //                    targetTable.Columns.Add(dest);
        //                }
        //                else if (!isKey(source, src) || (includeKey && isKey(source, src)))
        //                {
        //                    // TODO: raise merge failed event
        //                    throw new DataException("Merge failed, can't match column: " + src.ColumnName);
        //                }
        //            }
        //            else
        //            {
        //                if (matchIfConvertible)
        //                {
        //                    throw new NotImplementedException("Schema matching on convertible types not yet implemented");
        //                }
        //                else if (dest.DataType != src.DataType ||
        //                        ((dest.DataType == typeof(DateTime)) &&
        //                        (dest.DateTimeMode != src.DateTimeMode) &&
        //                        ((dest.DateTimeMode & src.DateTimeMode) != DataSetDateTime.Unspecified)))
        //                {
        //                    throw new DataException("Merge failed, data type mismatch: " + src.ColumnName);
        //                }

        //                mergeExtendedProperties(src.ExtendedProperties, dest.ExtendedProperties, mergeAction, preserveChanges);
        //            }

        //            // Set expressions 
        //            if (targetDataSet != null)
        //            {
        //                throw new NotImplementedException("DataSet merges not yet implemented.");
        //                //for (int i = initialTargetCount; i < targetTable.Columns.Count; i++)
        //                //{
        //                //    targetTable.Columns[i].Expression = source.Columns[targetTable.Columns[i].ColumnName].Expression;
        //                //}
        //            }

        //            // 
        //            DataColumn[] targetKey = targetTable.PrimaryKey;
        //            DataColumn[] sourceKey = source.PrimaryKey;

        //            if (targetKey.Length != sourceKey.Length)
        //            {
        //                // special case when the target table does not have the PrimaryKey

        //                if (targetKey.Length == 0)
        //                {
        //                    DataColumn[] key = new DataColumn[sourceKey.Length];

        //                    for (Int32 i = 0; i < sourceKey.Length; i++)
        //                    {
        //                        key[i] = targetTable.Columns[sourceKey[i].ColumnName];
        //                    }

        //                    targetTable.PrimaryKey = key;
        //                }
        //                else if (sourceKey.Length != 0)
        //                {
        //                    targetDataSet.RaiseMergeFailed(targetTable, Res.GetString(Res.DataMerge_PrimaryKeyMismatch), missingSchemaAction);
        //                }
        //            }
        //            else
        //            {
        //                for (int i = 0; i < targetKey.Length; i++)
        //                {
        //                    if (String.Compare(targetKey[i].ColumnName, sourceKey[i].ColumnName, false, targetTable.Locale) != 0)
        //                    {
        //                        targetDataSet.RaiseMergeFailed(source,
        //                            Res.GetString(Res.DataMerge_PrimaryKeyColumnsMismatch, targetKey[i].ColumnName, sourceKey[i].ColumnName),
        //                            missingSchemaAction
        //                    );
        //                    }
        //                }
        //            }
        //        }

        //        mergeExtendedProperties(source.ExtendedProperties, targetTable.ExtendedProperties, mergeAction, preserveChanges);
        //    }

        //    return targetTable;
        //}

        //private static Boolean isKey(DataTable table, DataColumn column)
        //{
        //    return Array.Exists(table.PrimaryKey, delegate(DataColumn find) { return ReferenceEquals(find, column); });
        //}

        //private static Boolean tablesContain(DataSet targetDataSet, Boolean ignoreCase, String name)
        //{
        //    StringComparer comparer = StringComparer.Create(targetDataSet.Locale ?? CultureInfo.CurrentCulture, ignoreCase);

        //    foreach (DataTable table in targetDataSet.Tables)
        //    {
        //        if (comparer.Compare(table.TableName, name) == 0)
        //        {
        //            return true;
        //        }
        //    }

        //    return false;
        //}

        //private static Boolean columnsContain(DataTable table, String columnName, Type columnType, Boolean ignoreCase, Boolean matchIfConvertible, Boolean includeKey)
        //{
        //    StringComparer comparer = StringComparer.Create(table.Locale ?? CultureInfo.CurrentCulture, ignoreCase);

        //    foreach (DataColumn column in table.Columns)
        //    {
        //        if (comparer.Compare(column.ColumnName, columnName) == 0)
        //        {
        //            return true;
        //        }
        //    }

        //    return false;
        //}

        #endregion

        internal void MergeFeature(IFeatureDataRecord record, IGeometryFactory factory)
        {
            if (record == null)
            {
                throw new ArgumentNullException("record");
            }

            Boolean checkForTarget = _targetDataTable.Rows.Count > 0 &&
                                     (_targetDataTable.PrimaryKey.Length > 0);

            mergeSchemaIfNeeded(record, factory);

            FeatureDataRow targetFeature = null;

            if (checkForTarget && record.HasOid)
            {
                targetFeature = _targetDataTable.Find(record.GetOid());
            }

            mergeFeature(_targetDataTable, record, targetFeature, _columnMap, _transform, _geoFactory, PreserveChanges);
        }
Esempio n. 24
0
        private static void mergeFeature(FeatureDataTable target,
                                         IFeatureDataRecord srcFeature,
                                         FeatureDataRow targetFeature,
                                         ColumnMapper columnMapper,
                                         ICoordinateTransformation transform,
                                         IGeometryFactory geoFactory,
                                         Boolean preserveChanges)
        {
            if (targetFeature == null)
            {
                targetFeature = target.NewRow();
                setFeatureRowFromIFeatureDataRecord(srcFeature, targetFeature, columnMapper, transform, geoFactory);
                target.AddRow(targetFeature);
            }
            else
            {
                if (preserveChanges && targetFeature.RowState == DataRowState.Modified)
                {
                    throw new NotImplementedException("Merging updates to original features " +
                                                      "state not yet implemented.");
                }

                setFeatureRowFromIFeatureDataRecord(srcFeature, targetFeature, columnMapper, transform, geoFactory);
            }
        }
Esempio n. 25
0
        private void mergeSchemaIfNeeded(IFeatureDataRecord record, IGeometryFactory factory)
        {
            if ((SchemaMergeAction & SchemaMergeAction.AddAll) != SchemaMergeAction.None)
            {
                // HACK: Parsing and setting the schema should be less clunky here.
                //       We probably need to just do the schema merge ourselves without 
                //       having to rely on System.Data.Merger

                FeatureDataTable schemaModel = record is FeatureDataRow
                                                   ? (record as FeatureDataRow).Table
                                                   : createModelFromFeature(record, factory);

                MergeSchema(schemaModel);

                Int32 sourceCount = schemaModel.Columns.Count;
                Int32 targetCount = _targetDataTable.Columns.Count;

                if (targetCount != sourceCount)
                {
                    _columnMap = generateColumnMapper(schemaModel);
                    return;
                }

                for (Int32 i = 0; i < _targetDataTable.Columns.Count; i++)
                {
                    //jd: this seems to fix an issue where the columns would be mapped incorrectly.. 
                    //however I think there is another issue where the destination table is one column short..

                    string columnName = _targetDataTable.Columns[i].ColumnName;
                    if (_targetDataTable.Columns[i].Ordinal != schemaModel.Columns[columnName].Ordinal)
                    {
                        _columnMap = generateColumnMapper(schemaModel);
                        return;
                    }

                    //jd:the following test is always true
                    //if (_targetDataTable.Columns[i].Ordinal != schemaModel.Columns[i].Ordinal)
                    //{
                    //    _columnMap = generateColumnMapper(schemaModel);
                    //    return;
                    //}
                }
            }

            _columnMap = generateDefaultColumnMapper();
        }
Esempio n. 26
0
 private void LoadAttributes(IFeatureDataRecord data)
 {
     Shape = data.GetGeometry();
     const string idColumnName = "TransectID";
     if (data.GetOrdinal(idColumnName) < 0)
         throw new ArgumentException(string.Format("Column '{0}' does not belong to table {1}",idColumnName, FeatureSource.Name));
     Name = data[idColumnName] as string;
 }
Esempio n. 27
0
 FeatureDataRow IConvertData.ConvertRecord(IFeatureDataRecord source)
 {
     return(ConvertRow(source));
 }
Esempio n. 28
0
        private static void setFeatureRowFromIFeatureDataRecord(IFeatureDataRecord srcFeature, FeatureDataRow targetFeature)
        {
            for (int i = 0; i < srcFeature.FieldCount; i++)
            {
                string colName = srcFeature.GetName(i);
                targetFeature[colName] = srcFeature.GetValue(i);
            }

            targetFeature.Geometry = srcFeature.Geometry;

            targetFeature.IsFullyLoaded = targetFeature.IsFullyLoaded || srcFeature.IsFullyLoaded;
        }
Esempio n. 29
0
        // FIX_PERF
        private static void setFeatureRowFromIFeatureDataRecord(IFeatureDataRecord srcFeature,
                                                                FeatureDataRow targetFeature,
                                                                ColumnMapper columnMapper,
                                                                ICoordinateTransformation transform,
                                                                IGeometryFactory geoFactory)
        {
            //for (Int32 i = 0; i < srcFeature.FieldCount; i++)
            //{
            //    String colName = srcFeature.GetName(i);
            //    targetFeature[colName] = srcFeature.GetValue(i);
            //}
            if (transform != null)//jd: to prevent case when transform is null -  probably because a test was done earlier. need to check
            {
                if (srcFeature.Geometry.SpatialReference.EqualParams(transform.Target))
                {
                    transform = null;
                }
            }

            srcFeature.GetValues(columnMapper.SourceValues);
            targetFeature.ItemArray = columnMapper.Map();
            targetFeature.Geometry = transform == null
                                         ? srcFeature.Geometry
                                         : transform.Transform(srcFeature.Geometry, geoFactory);
            targetFeature.IsFullyLoaded = targetFeature.IsFullyLoaded || srcFeature.IsFullyLoaded;
        }
Esempio n. 30
0
        private static FeatureDataTable createModelFromFeature(IFeatureDataRecord srcFeature)
        {
            FeatureDataTable schemaModel = new FeatureDataTable();
            for (int fieldIndex = 0; fieldIndex < srcFeature.FieldCount; fieldIndex++)
            {
                schemaModel.Columns.Add(srcFeature.GetName(fieldIndex),
                                        srcFeature.GetFieldType(fieldIndex));
            }

            return schemaModel;
        }
Esempio n. 31
0
 /// <summary>
 /// Template method to perform the actual geometry rendering.
 /// </summary>
 /// <param name="feature">Feature to render.</param>
 /// <param name="style">Style to use in rendering geometry.</param>
 /// <param name="state">
 /// A <see cref="RenderState"/> value to indicate how to render the feature.
 /// </param>
 /// <returns></returns>
 /// <param name="layer"></param>
 protected abstract IEnumerable <TRenderObject> DoRenderFeature(IFeatureDataRecord feature, TStyle style,
                                                                RenderState state, ILayer layer);
Esempio n. 32
0
        private static FeatureDataTable createModelFromFeature(IFeatureDataRecord srcFeature,
                                                               IGeometryFactory factory)
        {
            FeatureDataTable schemaModel = new FeatureDataTable(factory);

            for (Int32 fieldIndex = 0; fieldIndex < srcFeature.FieldCount; fieldIndex++)
            {
                schemaModel.Columns.Add(srcFeature.GetName(fieldIndex),
                                        srcFeature.GetFieldType(fieldIndex));
            }

            return schemaModel;
        }
Esempio n. 33
0
        internal void MergeFeature(IFeatureDataRecord record)
        {
            if (record == null) throw new ArgumentNullException("record");

            bool checkForTarget = false;

            if ((SchemaMergeAction & SchemaMergeAction.Add) != SchemaMergeAction.None)
            {
                // HACK: Parsing and setting the schema should be less clunky here.
                //      We probably need to just do the schema merge ourselves without having 
                //      to rely on System.Data.Merger
                FeatureDataTable schemaModel = createModelFromFeature(record);
                MergeSchema(schemaModel);
                checkForTarget = _target.Rows.Count > 0 && (_target.PrimaryKey.Length > 0);
            }

            FeatureDataRow targetFeature = null;

            if (checkForTarget && record.HasOid)
            {
                targetFeature = _target.Find(record.GetOid());
            }

            mergeFeature(_target, record, targetFeature, PreserveChanges);
        }
Esempio n. 34
0
 IEnumerable IFeatureRenderer.RenderFeature(IFeatureDataRecord feature)
 {
     return(RenderFeature(feature));
 }
Esempio n. 35
0
 private static void mergeFeature(FeatureDataTable target, IFeatureDataRecord srcFeature, FeatureDataRow targetFeature, bool preserveChanges)
 {
     if (targetFeature == null)
     {
         targetFeature = target.NewRow();
         setFeatureRowFromIFeatureDataRecord(srcFeature, targetFeature);
         target.AddRow(targetFeature);
     }
     else
     {
         if (preserveChanges && targetFeature.RowState == DataRowState.Modified)
         {
             throw new NotImplementedException("Merging updates to original features state not yet implemented.");
         }
         else
         {
             setFeatureRowFromIFeatureDataRecord(srcFeature, targetFeature);
         }
     }
 }
Esempio n. 36
0
        IStyle ITheme.GetStyle(IFeatureDataRecord row)
        {
            if (!(row is FeatureDataRow))
            {
                throw new ArgumentException("Parameter 'row' must be of type FeatureDataRow");
            }

            return GetStyle(row as FeatureDataRow);
        }
Esempio n. 37
0
 public ConvertData(IFeatureDataRecord source, int oidColumnIndex, IGeometryFactory geometryFactory)
     : base(source, oidColumnIndex, geometryFactory)
 {
 }
 public abstract bool Symbolize(IFeatureDataRecord obj, out TOutput output);
Esempio n. 39
0
        private IConvertData GetConverter(Type tsource, Type ttarget, IFeatureDataRecord sourcetable, int index, IGeometryFactory geometryFactory )
        {
            Type t = typeof(ConvertData<,>);
            Type g = t.MakeGenericType(tsource, ttarget);

            return (IConvertData)Activator.CreateInstance(g, sourcetable, index, geometryFactory);
        }
        protected override IEnumerable <TRenderObject> DoRenderFeature(IFeatureDataRecord inFeature,
                                                                       LabelStyle style,
                                                                       RenderState renderState,
                                                                       ILayer inLayer)
        {
            FeatureDataRow feature = inFeature as FeatureDataRow;
            LabelLayer     layer   = inLayer as LabelLayer;

            if (style == null)
            {
                throw new ArgumentNullException("style", "LabelStyle is a required argument " +
                                                "to properly render the label");
            }

            Label2D newLabel = null;

            LabelLayer.LabelTextFormatter formatter = null;
            LabelCollisionDetection2D     collisionDetector;

            if (layer != null)
            {
                if (!layer.RenderCache.TryGetValue(feature.GetOid(), out newLabel))
                {
                    formatter = layer.TextFormatter;
                }

                collisionDetector = layer.CollisionDetector;
                collisionDetector.TextRenderer = TextRenderer;
            }
            else
            {
                if (!textFormatters.TryGetValue(style, out formatter))
                {
                    // setup formatter based on style.LabelFormatExpression
                    formatter = delegate(FeatureDataRow row)
                    {
                        return(row.Evaluate(style.LabelExpression));
                    };

                    textFormatters.Add(style, formatter);
                }

                if (!collisionDetectors.TryGetValue(style, out collisionDetector))
                {
                    collisionDetector = new LabelCollisionDetection2D();
                    collisionDetector.TextRenderer = TextRenderer;
                    collisionDetectors.Add(style, collisionDetector);
                }
            }

            if (newLabel == null)
            {
                String labelText = formatter.Invoke(feature);
                if (feature.Geometry is ILineString)

                {
                    newLabel = new Label2D(labelText, new Point2D(), style);
                    calculateLabelOnLineString(feature.Geometry as ILineString, ref newLabel);
                }
                else
                {
                    ICoordinate p = feature.Geometry.Extents.Center;
                    Double      x = p[Ordinates.X], y = p[Ordinates.Y];


                    /* Moved to RenderLabel function
                     * if (style.HorizontalAlignment != HorizontalAlignment.Right || style.VerticalAlignment != VerticalAlignment.Bottom)
                     * {
                     * Size2D size = TextRenderer.MeasureString(labelText, style.Font);
                     * //Point2D pt = RenderTransform.TransformVector(Math.Ceiling(size.Width), Math.Ceiling(size.Height));
                     * size = new Size2D(size.Width / (Double)RenderTransform[0,0], size.Height / (Double)RenderTransform[1,1]);
                     * switch (style.HorizontalAlignment)
                     * {
                     *  case HorizontalAlignment.Center:
                     *      x -= (Int32)(size.Width / 2.0f);
                     *      break;
                     *  case HorizontalAlignment.Left:
                     *      x -= size.Width;
                     *      break;
                     *  default:
                     *      break;
                     * }
                     *
                     * switch (style.VerticalAlignment)
                     * {
                     *  case VerticalAlignment.Middle:
                     *      y += (Int32)(size.Height / 2.0f);
                     *      break;
                     *  case VerticalAlignment.Top:
                     *      y += size.Height;
                     *      break;
                     *  default:
                     *      break;
                     * }
                     * }
                     */

                    newLabel = new Label2D(labelText, new Point2D(x, y), style);
                }

                if (layer != null)
                {
                    layer.RenderCache.Add(feature.GetOid(), newLabel);
                }
            }

            // now find out if we even need to render this label...
            if (style.CollisionDetectionType != CollisionDetectionType.None)
            {
                if (style.CollisionDetectionType == CollisionDetectionType.Simple)
                {
                    if (collisionDetector.SimpleCollisionTest(newLabel))
                    {
                        // we are not going to render this label
                        if (layer != null)
                        {
                            layer.RenderCache.Remove(newLabel);
                        }

                        yield break;
                    }
                }
                else if (style.CollisionDetectionType == CollisionDetectionType.Advanced)
                {
                    if (collisionDetector.AdvancedCollisionTest(newLabel))
                    {
                        // we are not going to render this label
                        if (layer != null)
                        {
                            layer.RenderCache.Remove(newLabel);
                        }

                        yield break;
                    }
                }
            }

            foreach (TRenderObject ro in RenderLabel(newLabel))
            {
                yield return(ro);
            }
        }