private void WriteGeometry(Geometry geom, DelimitedFileWriter writer, List <string> colNames, string primaryKeyName, string geometryColumnName, bool hasGeometry)
        {
            if (geom.Metadata != null)
            {
                var row = new List <object>();

                foreach (var colName in colNames)
                {
                    if (hasGeometry && string.CompareOrdinal(colName, geometryColumnName) == 0)
                    {
                        row.Add(geom.ToString());
                    }
                    else if (string.CompareOrdinal(colName, "Latitude") == 0 && geom is Point)
                    {
                        var p = geom as Point;

                        if (p.IsValid())
                        {
                            row.Add(p.Coordinate.Latitude.ToString("N5"));
                        }
                        else
                        {
                            row.Add(string.Empty);
                        }
                    }
                    else if (string.CompareOrdinal(colName, "Longitude") == 0 && geom is Point)
                    {
                        var p = geom as Point;

                        if (p.IsValid())
                        {
                            row.Add(p.Coordinate.Longitude.ToString("N5"));
                        }
                        else
                        {
                            row.Add(string.Empty);
                        }
                    }
                    else if (string.CompareOrdinal(colName, primaryKeyName) == 0)
                    {
                        row.Add(geom.Metadata.ID);
                    }
                    else if (geom.Metadata.Properties.ContainsKey(colName))
                    {
                        row.Add(geom.Metadata.Properties[colName]);
                    }
                    else
                    {
                        row.Add(string.Empty);
                    }
                }

                writer.WriteRow(row, true);
            }
        }
        private void Write(SpatialDataSet data, Stream outputStream)
        {
            char delimiter;

            switch (_dataSourceType)
            {
            case BingDataSourceType.PIPE:
                delimiter = '|';
                break;

            case BingDataSourceType.TAB:
                delimiter = '\t';
                break;

            case BingDataSourceType.CSV:
            default:
                delimiter = ',';
                break;
            }

            Dictionary <string, Type> columnInfo;
            bool   hasGeometry;
            string dataSourceName, entityTypeName, primaryKeyName, geometryColumnName;

            data = CleanDataSet(data, out columnInfo, out dataSourceName, out entityTypeName, out primaryKeyName, out geometryColumnName, out hasGeometry);

            var colNames = new List <string>(columnInfo.Keys);

            if (!columnInfo.ContainsKey(primaryKeyName))
            {
                columnInfo.Add(primaryKeyName, typeof(string));
                colNames.Insert(0, primaryKeyName);
            }

            if (!columnInfo.ContainsKey("Latitude"))
            {
                columnInfo.Add("Latitude", typeof(double));
                colNames.Add("Latitude");
            }

            if (!columnInfo.ContainsKey("Longitude"))
            {
                columnInfo.Add("Longitude", typeof(double));
                colNames.Add("Longitude");
            }

            if (hasGeometry && !columnInfo.ContainsKey(geometryColumnName))
            {
                columnInfo.Add(geometryColumnName, typeof(string));
                colNames.Add(geometryColumnName);
            }

            using (var writer = new DelimitedFileWriter(outputStream, columnInfo.Count, delimiter))
            {
                //Add Bing Schema Information
                writer.WriteLine(string.Format(_schemaText, entityTypeName));

                var headerCells = new List <string>();

                //Generate Header Information
                foreach (var colName in colNames)
                {
                    var name = colName + "(" + GetDelimitedPropertyType(columnInfo[colName]);

                    if (string.CompareOrdinal(colName, primaryKeyName) == 0)
                    {
                        name += ",primaryKey";
                    }

                    name += ")";

                    headerCells.Add(name);
                }

                //Write Header Information
                writer.WriteRow(headerCells, false);

                if (data != null)
                {
                    //Write the rows
                    foreach (var item in data.Geometries)
                    {
                        WriteGeometry(item, writer, colNames, primaryKeyName, geometryColumnName, hasGeometry);
                    }
                }
            }
        }