Пример #1
0
 public void TestReadingAaaShapeFile()
 {
     Assert.Catch <FileNotFoundException>(() =>
     {
         using (ShapefileDataReader reader = new ShapefileDataReader("aaa", Factory))
         {
             int length = reader.DbaseHeader.NumFields;
             while (reader.Read())
             {
                 Debug.WriteLine(reader.GetValue(length - 1));
             }
         }
         Assert.Fail();
     });
 }
Пример #2
0
        public void TestReadingShapeFileWithNulls()
        {
            using (ShapefileDataReader reader = new ShapefileDataReader("AllNulls", Factory))
            {
                while (reader.Read())
                {
                    IGeometry geom = reader.Geometry;
                    Assert.IsNotNull(geom);

                    object[] values = new object[5];
                    int      result = reader.GetValues(values);
                    Assert.IsNotNull(values);
                }
            }
        }
        public void TestLoadShapeFileWithEncoding()
        {
            ShapefileDataReader reader = new ShapefileDataReader("encoding_sample.shp", GeometryFactory.Default);
            DbaseFileHeader     header = reader.DbaseHeader;

            Assert.AreEqual(header.Encoding.WindowsCodePage, 1252, "Invalid encoding!");

            Assert.AreEqual(header.Fields[1].Name, "Test");
            Assert.AreEqual(header.Fields[2].Name, "Ålder");
            Assert.AreEqual(header.Fields[3].Name, "Ödestext");

            Assert.IsTrue(reader.Read(), "Error reading file");
            Assert.AreEqual(reader["Test"], "Testar");
            Assert.AreEqual(reader["Ödestext"], "Lång text med åäö etc");
        }
Пример #4
0
        private void SetColumns(string file)
        {
            cmbParentItem.Items.Add("");
            cmbFieldCodeName.Items.Add("");
            cmbChildren.Items.Add("");
            cmbFieldCaptionName.Items.Add("");
            cmbHousehold.Items.Add("");
            cmbPopulation.Items.Add("");
            cmbUrbanity.Items.Add("");

            using (ShapefileDataReader dr = new ShapefileDataReader(file, new GeometryFactory()))
            {
                ShapefileHeader shpHeader = dr.ShapeHeader;
                var             header    = dr.DbaseHeader;

                lblShapeType.Visible = true;
                lblShapeType.Text    = "Tipo de shp: " + shpHeader.ShapeType.ToString();

                lblRecords.Visible = true;
                lblRecords.Text    = "Registros dbf: " + header.NumRecords;

                for (int i = 0; i < header.NumFields; i++)
                {
                    var fld = header.Fields[i];
                    cmbParentItem.Items.Add(fld.Name);
                    cmbFieldCodeName.Items.Add(fld.Name);
                    cmbChildren.Items.Add(fld.Name);
                    cmbFieldCaptionName.Items.Add(fld.Name);
                    cmbHousehold.Items.Add(fld.Name);
                    cmbPopulation.Items.Add(fld.Name);
                    cmbUrbanity.Items.Add(fld.Name);
                }
            }
            cmbParentItem.SelectedIndex       = 0;
            cmbFieldCodeName.SelectedIndex    = 0;
            cmbChildren.SelectedIndex         = 0;
            cmbFieldCaptionName.SelectedIndex = 0;
            cmbHousehold.SelectedIndex        = 0;
            cmbPopulation.SelectedIndex       = 0;
            cmbUrbanity.SelectedIndex         = 0;

            cmbParentItem.SetDropDownWidth();
            cmbFieldCodeName.SetDropDownWidth();
            cmbChildren.SetDropDownWidth();
            cmbFieldCaptionName.SetDropDownWidth();
            cmbHousehold.SetDropDownWidth();
            cmbPopulation.SetDropDownWidth();
        }
Пример #5
0
        /// <summary>
        /// Adds the attributes in the current record in the shapefile reader to the given attribute collection.
        /// </summary>
        public static void AddToAttributeCollection(this ShapefileDataReader reader, IAttributeCollection collection)
        {
            var valueString = string.Empty;

            for (var i = 1; i < reader.FieldCount; i++)
            {
                var name  = reader.GetName(i);
                var value = reader.GetValue(i - 1);
                valueString = string.Empty;
                if (value != null)
                {
                    valueString = value.ToInvariantString();
                }
                collection.AddOrReplace(name, valueString);
            }
        }
Пример #6
0
        internal static ShapeDataReadIterator CreateIterator(string path, int index, Encoding encoding)
        {
            var factory = new GeometryFactory();
            ShapefileDataReader reader;

            if (encoding == null)
            {
                reader = new ShapefileDataReader(path, factory);
            }
            else
            {
                Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
                reader = new ShapefileDataReader(path, factory, encoding);
            }
            return(CreateIterator(path, index, reader));
        }
        public void Test_TestRead()
        {
            PrecisionModel  pm = new PrecisionModel(100000, 0, 0);
            GeometryFactory geometryFactory = new GeometryFactory(pm, -1);

            //DataSets can be enumerated thru, or you can use Read(). This one tests the read;
            string filename = Global.GetUnitTestRootDirectory() + @"\IO\Shapefile\Testfiles\statepop";
            ShapefileDataReader shpDataReader = Geotools.IO.Shapefile.CreateDataReader(filename, geometryFactory);

            int i = 0;

            while (shpDataReader.Read())
            {
                i++;
            }
            Assertion.AssertEquals("Read using Read()", 49, i);
        }
Пример #8
0
        public static int FindIndex(string shapeFilePath, string filedName)
        {
            var factory = new GeometryFactory();

            ShapefileDataReader reader = new ShapefileDataReader(shapeFilePath, factory);

            int length = reader.DbaseHeader.NumFields;

            for (var i = 0; i < length; i++)
            {
                if (reader.DbaseHeader.Fields[i].Name.Equals(filedName, StringComparison.InvariantCultureIgnoreCase))
                {
                    return(i + 1);
                }
            }
            return(0);
        }
Пример #9
0
        private static ShapefileDataReader TryShapefileDataReader(string filename)
        {
            var factory = new GeometryFactory();
            ShapefileDataReader reader;

            try
            {
                reader = new ShapefileDataReader(filename, factory);
            }
            catch (Exception e)
            {
                Console.WriteLine("The file " + filename + " did not load correctly: " + e.Message);
                return(null);
            }
            reader.Reset();

            return(reader);
        }
Пример #10
0
 protected override void Dispose(bool disposing)
 {
     try
     {
         if (disposing)
         {
             if (_reader != null)
             {
                 _reader.Dispose();
             }
         }
     }
     finally
     {
         _reader = null;
         base.Dispose(disposing);
     }
 }
Пример #11
0
        public void GeometryTransformTest()
        {
            #region Init ICoordinateTransformation

            // RGF93_Lambert_93
            const string coordSysRGF93_Lambert_93 = "PROJCS[\"RGF93_Lambert_93\",GEOGCS[\"GCS_RGF_1993\",DATUM[\"D_RGF_1993\",SPHEROID[\"GRS_1980\",6378137.0,298.257222101]],PRIMEM[\"Greenwich\",0.0],UNIT[\"Degree\",0.0174532925199433]],PROJECTION[\"Lambert_Conformal_Conic\"],PARAMETER[\"False_Easting\",700000.0],PARAMETER[\"False_Northing\",6600000.0],PARAMETER[\"Central_Meridian\",3.0],PARAMETER[\"Standard_Parallel_1\",44.0],PARAMETER[\"Standard_Parallel_2\",49.0],PARAMETER[\"Latitude_Of_Origin\",46.5],UNIT[\"Meter\",1.0]]";

            // SRID 4326
            const string coordSys4326 = "GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.01745329251994328,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4326\"]]";

            var csSource = ProjNet.Converters.WellKnownText.CoordinateSystemWktReader.Parse(coordSysRGF93_Lambert_93) as GeoAPI.CoordinateSystems.ICoordinateSystem;
            var csTarget = ProjNet.Converters.WellKnownText.CoordinateSystemWktReader.Parse(coordSys4326) as GeoAPI.CoordinateSystems.ICoordinateSystem;

            var transform = new ProjNet.CoordinateSystems.Transformations.CoordinateTransformationFactory().CreateFromCoordinateSystems(csSource, csTarget);

            var piSource    = ProjectionInfo.FromEsriString(coordSysRGF93_Lambert_93);
            var piTarget    = ProjectionInfo.FromEsriString(coordSys4326);
            var dsTransform = new DotSpatialMathTransform(piSource, piTarget);

            #endregion Init ICoordinateTransformation

            using (var shapeDataReader = new ShapefileDataReader(@"..\..\..\NetTopologySuite.Samples.Shapefiles\DEPARTEMENT.SHP", GeometryFactory.Default))
            {
                while (shapeDataReader.Read())
                {
                    var outGeomDotSpatial =
                        CoordinateSystems.Transformations.GeometryTransform.TransformGeometry(GeometryFactory.Default,
                                                                                              shapeDataReader.Geometry,
                                                                                              dsTransform);
                    Assert.IsFalse(outGeomDotSpatial.IsEmpty);
                    Console.WriteLine(outGeomDotSpatial.AsText());
                    var outGeomProjNet =
                        CoordinateSystems.Transformations.GeometryTransform.TransformGeometry(GeometryFactory.Default,
                                                                                              shapeDataReader.Geometry,
                                                                                              transform.MathTransform);
                    Assert.IsFalse(outGeomProjNet.IsEmpty);
                    Console.WriteLine(outGeomProjNet.AsText());

                    var hd = Algorithm.Distance.DiscreteHausdorffDistance.Distance(outGeomProjNet, outGeomDotSpatial);
                    Console.WriteLine(string.Format("\nHaussdorffDistance: {0}", hd));
                    Console.WriteLine();
                }
            }
        }
Пример #12
0
        public ShapeFile(string fileName)
        {
            if (String.IsNullOrEmpty(fileName))
            {
                throw new ArgumentNullException();
            }

            m_MapName = fileName;
            IEditSpatialIndex index = new SpatialIndex();

            ShapefileDataReader sfdr = Shapefile.CreateDataReader(fileName, new GeometryFactory());
            ShapefileHeader     hdr  = sfdr.ShapeHeader;
            Envelope            ex   = hdr.Bounds;

            m_Extent = new Window(ex.MinX, ex.MinY, ex.MaxX, ex.MaxY);

            foreach (object o in sfdr)
            {
                // You get back an instance of GisSharpBlog.NetTopologySuite.IO.RowStructure, but
                // that's internal, so cast to the interface it implements (we'll attach this to
                // the geometry we wrap).
                //ICustomTypeDescriptor row = (ICustomTypeDescriptor)o;
                AdhocPropertyList row  = CreatePropertyList(sfdr);
                NTS.Geometry      geom = sfdr.Geometry;
                geom.UserData = row;

                List <NTS.Geometry> geoms = GetBasicGeometries(geom);
                foreach (NTS.Geometry g in geoms)
                {
                    g.UserData = row;
                    if (g is NTS.Point)
                    {
                        index.Add(new PointWrapper((NTS.Point)g));
                    }
                    else
                    {
                        index.Add(new GeometryWrapper(g));
                    }
                }
            }

            // Don't permit any further additions
            m_Index = index;
        }
Пример #13
0
        public Collection <IFeature> ReadAll()
        {
            IGeometryFactory      factory  = GeometryFactory.Default;
            ShapefileDataReader   reader   = new ShapefileDataReader(shpFile, factory);
            Collection <IFeature> features = new Collection <IFeature>();

            while (reader.Read())
            {
                Feature feature = new Feature();
                feature.Geometry   = reader.Geometry;
                feature.Attributes = new AttributesTable();
                for (int i = 0; i < reader.DbaseHeader.NumFields; i++)
                {
                    feature.Attributes.AddAttribute(reader.GetName(i), reader.GetValue(i));
                }
                features.Add(feature);
            }
            return(features);
        }
 private void fieldValues(string filename, int fieldIndex)
 {
     try
     {
         GeometryFactory f = new GeometryFactory(new PrecisionModel(), 23030);
         using (ShapefileDataReader dr = new ShapefileDataReader(filename, f))
         {
             while (dr.Read())
             {
                 //obtenemos todos los valores del campo seleccionado
                 _fieldValues.Add(dr.GetValue(fieldIndex).ToString());
             }
         }
     }
     catch (Exception ex)
     {
         throw ex;
     }
 }
Пример #15
0
        private List <Feature> ReadShapefile(string shpFilename)
        {
            var features = new List <Feature>();

            using (ShapefileDataReader dr = new ShapefileDataReader(shpFilename, new GeometryFactory()))
            {
                DbaseFileHeader header = dr.DbaseHeader;
                while (dr.Read())
                {
                    AttributesTable attributesTable = new AttributesTable();
                    for (int i = 0; i < header.NumFields; i++)
                    {
                        attributesTable.AddAttribute(header.Fields[i].Name, dr.GetValue(i));
                    }

                    features.Add(new Feature(dr.Geometry, attributesTable));
                }
            }
            return(features);
        }
Пример #16
0
        public static void ImportShapeFileIntoDatabase(string filePath)
        {
            ShapeDataReader reader = new ShapeDataReader(filePath);

            GeometryFactory     factory       = new GeometryFactory();
            ShapefileDataReader shapeFileData = new ShapefileDataReader("", factory);

            DbaseFieldDescriptor[] fieldsInformation = shapeFileData.DbaseHeader.Fields;
            Envelope mb = reader.ShapefileBounds;
            IEnumerable <IShapefileFeature> result = reader.ReadByMBRFilter(mb);
            IAttributesTable columnAttributes      = result.First().Attributes;

            IShapefileFeature[] rowInformation = result.ToArray();

            //CREATE TABLE COLUMNS
            RunSqlQuery(CreateTableColumns(columnAttributes, fieldsInformation));

            //INSERTING TABLE VALUES
            InsertTableValues(result.Count(), rowInformation).ForEach(x => RunSqlQuery(x));
        }
Пример #17
0
        public static List <Feature> ReadFeatures(string filename)
        {
            if (!File.Exists(filename))
            {
                Console.WriteLine("The file " + filename + " does not exist.");
                return(new List <Feature>());
            }
            var result = new List <Feature>();
            ShapefileDataReader reader = TryShapefileDataReader(filename);

            if (reader == null)
            {
                return(new List <Feature>());
            }

            try
            {
                while (reader.Read())
                {
                    var feature  = new Feature();
                    var attr     = new AttributesTable();
                    var geometry = (Geometry)reader.Geometry;
                    for (int i = 0; i < reader.DbaseHeader.NumFields; ++i)
                    {
                        attr.Add(reader.DbaseHeader.Fields[i].Name, reader.GetValue(i + 1));
                    }
                    feature.Geometry   = geometry;
                    feature.Attributes = attr;
                    result.Add(feature);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("Exception in feature read: " + ex.ToString() + ", filename: " + filename);
            }
            reader.Close();
            reader.Dispose();

            return(result);
        }
        public void TestReadingCrustalTestShapeFile()
        {
            // Original file with characters '°' in NAME field.
            using (ShapefileDataReader reader = new ShapefileDataReader("crustal_test_bugged", Factory))
            {
                int length = reader.DbaseHeader.NumFields;
                while (reader.Read())
                {
                    Debug.WriteLine(reader.GetValue(length - 1));
                }
            }

            // Removed NAME field characters
            using (ShapefileDataReader reader = new ShapefileDataReader("crustal_test", Factory))
            {
                int length = reader.DbaseHeader.NumFields;
                while (reader.Read())
                {
                    Debug.WriteLine(reader.GetValue(length - 1));
                }
            }
        }
        public void TestSeptPolygones()
        {
            const string wktGeom9 =
                "MULTIPOLYGON ( " +
                "((-73.8706030450129 45.425307895968558, -73.8691180248536 45.425712901466682, -73.862907940551338 45.425949154673731, -73.862739188260548 45.423181617104319, -73.864662964375952 45.423384119853267, -73.8654729753718 45.42220285381751, -73.865979232244342 45.421730347403241, -73.866822993698463 45.42088658594912, -73.866485489116826 45.420481580450996, -73.865202971706537 45.42041407953468, -73.864629213917681 45.421325341905117, -73.864156707503412 45.422236604275611, -73.863481698340081 45.422405356566514, -73.863414197423765 45.421899099693974, -73.863414197423765 45.421190340072485, -73.8635491992564 45.4200765749531, -73.864122957045254 45.419165312582606, -73.864797966208585 45.419064061208076, -73.866316736825922 45.419030310749974, -73.867092997363727 45.419266563957194, -73.867295500112789 45.419536567622515, -73.867396751487263 45.420751584116317, -73.867092997363727 45.421527844654122, -73.866384237742238 45.422506607941045, -73.866046733160658 45.423215367562364, -73.8669579955311 45.423721624434904, -73.868881771646556 45.423485371227684, -73.8694555294353 45.423417870311312, -73.8700630376822 45.423991628100168, -73.870434292722109 45.424497884972709, -73.8706030450129 45.425307895968558), " +
                "(-73.86921927622808 45.425139143677825, -73.868983023020974 45.424464134514437, -73.868544267064863 45.423991628100168, -73.86813926156691 45.423991628100168, -73.867092997363727 45.423991628100168, -73.86533797353917 45.423620373060317, -73.864966718499375 45.424059129016484, -73.864966718499375 45.424497884972709, -73.865304223081068 45.42534164642683, -73.866451738658668 45.425409147343146, -73.86756550377811 45.425274145510514, -73.86921927622808 45.425139143677825), " +
                "(-73.865937695291677 45.419884197388171, -73.865599517078863 45.419585804847259, -73.86432637557175 45.4198046260438, -73.864167232883347 45.4205605538138, -73.864565089604355 45.420500875305606, -73.865937695291677 45.419884197388171)), " +
                "((-73.868038010192436 45.424869140012561, -73.866620490949458 45.424869140012561, -73.865844230411653 45.424970391386921, -73.865742979037179 45.42436288314002, -73.865979232244342 45.42402537855844, -73.866687991865717 45.424295382223704, -73.867869257901532 45.424396633598121, -73.868038010192436 45.424869140012561), " +
                "(-73.86744733356926 45.424703767127937, -73.867371896498639 45.42446991220919, -73.867002254852821 45.424454824795021, -73.866232796733016 45.424432193673908, -73.866345952338861 45.4246509611786, -73.86744733356926 45.424703767127937)), " +
                "((-73.86512208901371 45.419923983060187, -73.864604875276427 45.420301946945074, -73.8644059469159 45.420043340076518, -73.86512208901371 45.419923983060187)))";

            IGeometryFactory factory   = GeometryFactory.Default; //new GeometryFactory(new PrecisionModel(Math.Pow(10, 13)));
            WKTReader        wktReader = new WKTReader(factory);
            List <IGeometry> polys     = new List <IGeometry>();

            using (ShapefileDataReader reader = new ShapefileDataReader("sept_polygones", factory))
            {
                int index = 0;
                while (reader.Read())
                {
                    IGeometry geom = reader.Geometry;
                    Assert.IsNotNull(geom);
                    Assert.IsTrue(geom.IsValid);
                    geom.Normalize();
                    Debug.WriteLine(String.Format("Geom {0}: {1}", ++index, geom));
                    polys.Add(geom);
                }
            }

            IGeometry expected = wktReader.Read(wktGeom9);

            expected.Normalize();

            Envelope e1 = expected.EnvelopeInternal;
            Envelope e2 = polys[8].EnvelopeInternal;

            Assert.IsTrue(e1.Equals(e2), string.Format("{0}\ndoes not match\n{1}", e1, e2));
            Assert.IsTrue(expected.EqualsTopologically(polys[8]), string.Format("{0}\ndoes not match\n{1}", expected, polys[8]));
        }
        public void TestIssue161()
        {
            //SETUP
            var filePath = Path.Combine(CommonHelpers.TestShapefilesDirectory, "LSOA_2011_EW_BGC.shp");

            if (!File.Exists(filePath))
            {
                Assert.Ignore("File '{0}' not present", filePath);
            }

            //ATTEMPT
            using (var reader = new ShapefileDataReader(filePath, GeometryFactory.Default))
            {
                var header = reader.ShapeHeader;

                while (reader.Read())//&& count++ < 3)
                {
                    object val;
                    Assert.DoesNotThrow(() => val = reader["LSOA11CD"]);
                }
            }
        }
Пример #21
0
        public void Test_DataGrid()
        {
            PrecisionModel  pm = new PrecisionModel(100000, 0, 0);
            GeometryFactory geometryFactory = new GeometryFactory(pm, -1);

            string filename = Global.GetUnitTestRootDirectory() + @"\IO\Shapefile\Testfiles\statepop";
            ShapefileDataReader shpDataReader = Geotools.IO.Shapefile.CreateDataReader(filename, geometryFactory);

            // make sure the datagrid gets the column headings.
            DataGrid grid = new DataGrid();

            grid.DataSource = shpDataReader;
            grid.DataBind();

            TextWriter tempWriter = new StringWriter();

            grid.RenderControl(new HtmlTextWriter(tempWriter));
            string html = tempWriter.ToString();
            bool   same = Compare.CompareAgainstString(Global.GetUnitTestRootDirectory() + @"\IO\Shapefile\Testfiles\ExpectedDataGridDataReader.txt", html);

            Assertion.AssertEquals("Datagrid properties", true, same);
        }
        public void TestReadingShapeFileAfvalbakken()
        {
            IGeometryFactory factory  = GeometryFactory.Default;
            List <IPolygon>  polys    = new List <IPolygon>();
            const int        distance = 500;

            using (ShapefileDataReader reader = new ShapefileDataReader("afvalbakken", factory))
            {
                int index = 0;
                while (reader.Read())
                {
                    IGeometry geom = reader.Geometry;
                    Assert.IsNotNull(geom);
                    Assert.IsTrue(geom.IsValid);
                    Debug.WriteLine(String.Format("Geom {0}: {1}", index++, geom));

                    IGeometry buff = geom.Buffer(distance);
                    Assert.IsNotNull(buff);

                    polys.Add((IPolygon)geom);
                }
            }

            IMultiPolygon multiPolygon = factory.CreateMultiPolygon(polys.ToArray());

            Assert.IsNotNull(multiPolygon);
            Assert.IsTrue(multiPolygon.IsValid);

            IMultiPolygon multiBuffer = (IMultiPolygon)multiPolygon.Buffer(distance);

            Assert.IsNotNull(multiBuffer);
            Assert.IsTrue(multiBuffer.IsValid);

            ShapefileWriter writer = new ShapefileWriter(factory);

            writer.Write(@"test_buffer", multiBuffer);
            ShapefileWriter.WriteDummyDbf(@"test_buffer.dbf", multiBuffer.NumGeometries);
        }
Пример #23
0
        private GeoData ConvertReaderToGeoData(ShapefileDataReader reader)
        {
            var geoData = new GeoData
            {
                Values = new Dictionary <string, object>(StringComparer.InvariantCultureIgnoreCase)
            };


            var(points, dataType) = ConvertGeometryToPointXY(reader.Geometry);

            geoData.Points   = points;
            geoData.DataType = dataType;

            var header = reader.DbaseHeader;

            for (var i = 0; i < header.NumFields; i++)
            {
                var field = header.Fields[i];
                geoData.Values[field.Name] = reader.GetValue(i + 1);
            }

            return(geoData);
        }
Пример #24
0
        public void Test_TestGets()
        {
            PrecisionModel  pm = new PrecisionModel(1, 0, 0);
            GeometryFactory geometryFactory = new GeometryFactory(pm, -1);

            string filename = Global.GetUnitTestRootDirectory() + @"\IO\Shapefile\Testfiles\statepop";
            ShapefileDataReader shpDataReader = Geotools.IO.Shapefile.CreateDataReader(filename, geometryFactory);


            // note alaska and hawaii are missing - hence 48 states not 50.

            // tests GetValues().
            object[] values = new object[shpDataReader.FieldCount];
            foreach (object columnValues in shpDataReader)
            {
                if (columnValues == null)
                {
                    Assertion.Fail("columnValues should have data.");
                }
                // get  values using GetValue()
                for (int i = 0; i < shpDataReader.FieldCount; i++)
                {
                    values[i] = shpDataReader.GetValue(i);
                }

                // get values using GetValues()
                object[] values2 = new object[shpDataReader.FieldCount];
                shpDataReader.GetValues(values2);

                // ensure they are both the same.
                for (int i = 0; i < shpDataReader.FieldCount; i++)
                {
                    Assertion.AssertEquals("Values " + i, values[i], values2[i]);
                }
            }
        }
        public void Test()
        {
            var features = new List <IFeature>();
            var seq      = DotSpatialAffineCoordinateSequenceFactory.Instance.Create(1, Ordinates.XY);

            seq.SetOrdinate(0, Ordinate.X, -91.0454);
            seq.SetOrdinate(0, Ordinate.Y, 32.5907);
            var pt   = new GeometryFactory(DotSpatialAffineCoordinateSequenceFactory.Instance).CreatePoint(seq);
            var attr = new AttributesTable();

            attr.Add("FirstName", "John");
            attr.Add("LastName", "Doe");
            features.Add(new Feature(pt, attr));

            string fileName = Path.GetTempFileName();

            fileName = fileName.Substring(0, fileName.Length - 4);
            var shpWriter = new ShapefileDataWriter(fileName, features[0].Geometry.Factory)
            {
                Header = ShapefileDataWriter.GetHeader(features[0], features.Count)
            };

            shpWriter.Write(features);

            bool isTrue;

            using (var reader = new ShapefileDataReader(fileName, pt.Factory))
                @isTrue = reader.ShapeHeader.ShapeType.ToString() == "Point";

            foreach (string file in Directory.GetFiles(Path.GetTempPath(), Path.GetFileName(fileName) + ".*"))
            {
                File.Delete(file);
            }

            Assert.IsTrue(@isTrue);
        }
Пример #26
0
        private void TestWriteZMValuesShapeFile(bool testM)
        {
            var points = new Coordinate[3];

            points[0] = new Coordinate(0, 0);
            points[1] = new Coordinate(1, 0);
            points[2] = new Coordinate(1, 1);

            var csFactory = DotSpatialAffineCoordinateSequenceFactory.Instance;
            var sequence  = csFactory.Create(3, Ordinates.XYZM);

            for (int i = 0; i < 3; i++)
            {
                sequence.SetOrdinate(i, Ordinate.X, points[i].X);
                sequence.SetOrdinate(i, Ordinate.Y, points[i].Y);
                sequence.SetOrdinate(i, Ordinate.Z, 1 + i);
                if (testM)
                {
                    sequence.SetOrdinate(i, Ordinate.M, 11 + i);
                }
            }
            var lineString = Factory.CreateLineString(sequence);

            var attributes = new AttributesTable();

            attributes.Add("FOO", "Trond");

            var feature  = new Feature(Factory.CreateMultiLineString(new[] { lineString }), attributes);
            var features = new Feature[1];

            features[0] = feature;

            var shpWriter = new ShapefileDataWriter("ZMtest", Factory)
            {
                Header = ShapefileDataWriter.GetHeader(features[0], features.Length)
            };

            shpWriter.Write(features);

            // Now let's read the file and verify that we got Z and M back
            var factory = new GeometryFactory(DotSpatialAffineCoordinateSequenceFactory.Instance);

            using (var reader = new ShapefileDataReader("ZMtest", factory))
            {
                reader.Read();
                var geom = reader.Geometry;

                for (int i = 0; i < 3; i++)
                {
                    var c = geom.Coordinates[i];
                    Assert.AreEqual(i + 1, c.Z);
                }

                if (testM)
                {
                    sequence = ((ILineString)geom).CoordinateSequence;
                    for (int i = 0; i < 3; i++)
                    {
                        Assert.AreEqual(sequence.GetOrdinate(i, Ordinate.M), 11 + i);
                    }
                }

                // Run a simple attribute test too
                string v = reader.GetString(1);
                Assert.AreEqual(v, "Trond");
            }
        }
Пример #27
0
        public static void Compress(string shapeFilePath, int gridFieldIndex, string encoding = null, string outputShapeFileName = "")
        {
            var factory = new GeometryFactory();

            if (!File.Exists(shapeFilePath))
            {
                Console.WriteLine("文件不存在。");
                return;
            }
            string filePath            = Path.GetDirectoryName(shapeFilePath);
            string outputShapeFilePath = "";
            var    outputFilePath      = Path.ChangeExtension(shapeFilePath, ".text");

            if (!string.IsNullOrEmpty(outputShapeFileName))
            {
                outputShapeFilePath = Path.Combine(filePath, outputShapeFileName);
                outputFilePath      = Path.ChangeExtension(outputShapeFileName, ".txt");
            }

            var      nFile        = new FileStream(outputFilePath, FileMode.Create);
            Encoding fileEncoding = Encoding.UTF8;

            nFile.Position = nFile.Length;

            var fts = new List <IFeature>();
            ShapefileDataReader reader;

            if (string.IsNullOrEmpty(encoding))
            {
                reader = new ShapefileDataReader(shapeFilePath, factory);
            }
            else
            {
                Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
                reader = new ShapefileDataReader(shapeFilePath, factory, Encoding.GetEncoding(encoding));
            }

            using (reader)
            {
                var  dict        = new Dictionary <string, IGeometry>();
                int  count       = 0;
                long recordCount = 0;
                try {
                    while (reader.Read())
                    {
                        recordCount++;
                        var gridId = reader.GetString(gridFieldIndex);
                        if (dict.ContainsKey(gridId))
                        {
                            continue;
                        }

                        count++;
                        if (count % 1000 == 0)
                        {
                            Console.WriteLine($"{count}");
                            nFile.Flush();
                        }


                        dict.Add(gridId, reader.Geometry);
                        string text  = $"{gridId},{reader.Geometry.ToString()}\n";
                        var    bytes = fileEncoding.GetBytes(text);

                        nFile.Write(bytes, 0, bytes.Length);

                        var attrs = new AttributesTable();
                        attrs.Add("GRIDID", gridId);
                        var feature = new Feature(reader.Geometry, attrs);
                        fts.Add(feature);
                    }
                }
                catch (Exception)
                {
                    Console.WriteLine($"第{recordCount}条记录读取错误!");
                    throw;
                }
                Console.WriteLine($"共处理{reader.RecordCount}条数据,压缩生成{count}条数据");


                nFile.Close();
            };


            if (!string.IsNullOrEmpty(outputShapeFilePath))
            {
                var writer = new ShapefileDataWriter(outputShapeFilePath, factory);
                writer.Header = ShapefileDataWriter.GetHeader(fts[0], fts.Count);
                writer.Write(fts);
            }

            Console.WriteLine("成功结束!");
        }
        /// <summary>
        /// Convert shape-file to geojson-file stream
        /// </summary>
        /// <param name="shapeFilePath"></param>
        public static Stream ConvertToGeoJsonStream(string shapeFilePath)
        {
            var factory = new GeometryFactory();
            //Create a feature collection
            var featureCollection = new FeatureCollection();

            //Try to get crs from .prj file
            var crs = TryToGetCrs(shapeFilePath);

            //Set crs if we found it
            if (crs != CoordinateSystemId.None)
            {
                featureCollection.CRS = new NamedCRS(new CoordinateSystem(crs).Id.EpsgCode());
            }

            using (var shapeFileDataReader = new ShapefileDataReader(shapeFilePath, factory))
            {
                //Get shape file dbase header
                var header = shapeFileDataReader.DbaseHeader;

                //Loop throw all geometries
                while (shapeFileDataReader.Read())
                {
                    var attributesTable = new AttributesTable();
                    var geometry        = (Geometry)shapeFileDataReader.Geometry;

                    //Get header fields
                    for (var i = 0; i < header.NumFields; i++)
                    {
                        var fldDescriptor = header.Fields[i];
                        attributesTable.AddAttribute(fldDescriptor.Name, shapeFileDataReader.GetValue(i));
                    }

                    //Create feature using geometry and attributes
                    var feature = new Feature()
                    {
                        Geometry   = geometry,
                        Attributes = attributesTable
                    };

                    //Add feature to collection
                    featureCollection.Features.Add(feature);
                }

                //Close and free up any resources
                shapeFileDataReader.Close();
            }

            // Create a stream to write to.
            var outputStream   = new MemoryStream();
            var sw             = new StreamWriter(outputStream);
            var jsonSerializer = new GeoJsonSerializer(factory);

            //Serialize feature collection to json
            jsonSerializer.Serialize(sw, featureCollection);

            //Flush stream writer and reset stream position
            sw.Flush();
            outputStream.Position = 0;
            return(outputStream);
        }
        private void ReadFromShapeFile()
        {
            var          featureCollection = new List <IFeature>();
            const string filename          = @"country";

            if (!File.Exists(filename + ".dbf"))
            {
                throw new FileNotFoundException(filename + " not found at " + Environment.CurrentDirectory);
            }
            var dataReader = new ShapefileDataReader(filename, new GeometryFactory());

            while (dataReader.Read())
            {
                var feature = new Feature {
                    Geometry = dataReader.Geometry
                };

                var length = dataReader.DbaseHeader.NumFields;
                var keys   = new string[length];
                for (var i = 0; i < length; i++)
                {
                    keys[i] = dataReader.DbaseHeader.Fields[i].Name;
                }

                feature.Attributes = new AttributesTable();
                for (var i = 0; i < length; i++)
                {
                    var val = dataReader.GetValue(i);
                    feature.Attributes.AddAttribute(keys[i], val);
                }

                featureCollection.Add(feature);
            }

            var index = 0;

            Console.WriteLine("Elements = " + featureCollection.Count);
            foreach (IFeature feature in featureCollection)
            {
                Console.WriteLine("Feature " + index++);
                var table = feature.Attributes as AttributesTable;
                foreach (var name in table.GetNames())
                {
                    Console.WriteLine(name + ": " + table[name]);
                }
            }

            //Directory
            var dir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory,
                                   string.Format(@"..{0}..{0}..{0}NetTopologySuite.Samples.Shapefiles{0}",
                                                 Path.DirectorySeparatorChar));
            // Test write with stub header
            var file = dir + "testWriteStubHeader";

            if (File.Exists(file + ".shp"))
            {
                File.Delete(file + ".shp");
            }
            if (File.Exists(file + ".shx"))
            {
                File.Delete(file + ".shx");
            }
            if (File.Exists(file + ".dbf"))
            {
                File.Delete(file + ".dbf");
            }

            var dataWriter = new ShapefileDataWriter(file);

            dataWriter.Header = ShapefileDataWriter.GetHeader(featureCollection[0] as IFeature, featureCollection.Count);
            dataWriter.Write(featureCollection);

            // Test write with header from a existing shapefile
            file = dir + "testWriteShapefileHeader";
            if (File.Exists(file + ".shp"))
            {
                File.Delete(file + ".shp");
            }
            if (File.Exists(file + ".shx"))
            {
                File.Delete(file + ".shx");
            }
            if (File.Exists(file + ".dbf"))
            {
                File.Delete(file + ".dbf");
            }

            dataWriter = new ShapefileDataWriter(file)
            {
                Header =
                    ShapefileDataWriter.GetHeader(dir + "country.dbf")
            };
            dataWriter.Write(featureCollection);
        }
Пример #30
0
        public void ImportShapeFile(string connectionString,
                                    string targetCoordSystem,
                                    bool recreateTable,
                                    enSpatialType spatialType,
                                    int SRID,
                                    string tableName,
                                    string schema,
                                    string IdColName,
                                    string geomcolName,
                                    List <string> fieldsToImport)
        {
            _worker = new BackgroundWorker();
            _worker.WorkerSupportsCancellation = true;
            _worker.WorkerReportsProgress      = true;
            _worker.RunWorkerCompleted        += new RunWorkerCompletedEventHandler(_worker_RunWorkerCompleted);
            _worker.ProgressChanged           += new ProgressChangedEventHandler(_worker_ProgressChanged);
            _worker.DoWork += new DoWorkEventHandler(delegate(object sender, DoWorkEventArgs e)
            {
                try
                {
                    #region Work

                    MapBindTrace.Source.TraceEvent(TraceEventType.Information, 1, "Worker started");
                    _worker.ReportProgress(0, "Starting...");

                    #region Init ICoordinateTransformation
                    _transform = null;
                    if (!string.IsNullOrWhiteSpace(targetCoordSystem))
                    {
                        //string v_targetCoordSys =  "GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.01745329251994328,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4326\"]]";

                        ICoordinateSystem csSource = ProjNet.Converters.WellKnownText.CoordinateSystemWktReader.Parse(this.CoordinateSystem) as ICoordinateSystem;
                        ICoordinateSystem csTarget = ProjNet.Converters.WellKnownText.CoordinateSystemWktReader.Parse(targetCoordSystem) as ICoordinateSystem;

                        _transform = new CoordinateTransformationFactory().CreateFromCoordinateSystems(csSource, csTarget);
                    }
                    #endregion Init ICoordinateTransformation


                    using (ShapefileDataReader shapeDataReader = new ShapefileDataReader(_shapeFile, GeometryFactory.Default))
                    {
                        using (SqlConnection db = new SqlConnection(connectionString))
                        {
                            MapBindTrace.Source.TraceEvent(TraceEventType.Information, 1, "Opening SQL connection");
                            db.Open();

                            SqlTransaction transaction = db.BeginTransaction(IsolationLevel.Serializable);


                            try
                            {
                                #region Create destination table



                                DbaseFieldDescriptor[] fields = (from field in shapeDataReader.DbaseHeader.Fields
                                                                 where fieldsToImport.Contains(field.Name)
                                                                 select field).ToArray();
                                List <SqlColumnDescriptor> sqlFields = ShapeFileHelper.TranslateDbfTypesToSql(fields);

                                MapBindTrace.Source.TraceEvent(TraceEventType.Information, 1, "Create SQL table " + tableName);
                                string sqlScriptCreateTable = SqlServerModel.GenerateCreateTableScript(tableName, schema, sqlFields, spatialType, recreateTable, geomcolName, IdColName);
                                DataTable dataTable         = SqlServerModel.GenerateDataTable(tableName, sqlFields, spatialType, recreateTable, geomcolName, IdColName);
                                new SqlCommand(sqlScriptCreateTable, db, transaction).ExecuteNonQuery();

                                #endregion

                                #region Read shape file

                                int numRecord = 0;
                                while (shapeDataReader.Read())
                                {
                                    numRecord++;
                                    try
                                    {
                                        #region Shape feature import

                                        if (_worker.CancellationPending)
                                        {
                                            break;
                                        }

                                        IGeometry geom    = shapeDataReader.Geometry;
                                        IGeometry geomOut = null;                                         // BUGGY GeometryTransform.TransformGeometry(GeometryFactory.Default, geom, trans.MathTransform);
                                        if (_transform == null)
                                        {
                                            geomOut = geom;
                                        }
                                        else
                                        {
                                            geomOut = ShapeFileHelper.ReprojectGeometry(geom, _transform);
                                        }

                                        #region Prepare insert

                                        // Set geom SRID
                                        geomOut.SRID = SRID;

                                        List <object> SqlNativeGeomList = new List <object>();
                                        List <object> properties        = new List <object>();

                                        switch (spatialType)
                                        {
                                            #region geography
                                        case enSpatialType.geography:
                                            try
                                            {
                                                SqlNativeGeomList.Add(SqlServerHelper.ConvertToSqlType(geomOut, SRID, true, numRecord));
                                            }
                                            catch (Exception exGeomConvert)
                                            {
                                                MapBindTrace.Source.TraceData(TraceEventType.Error, 1, "Error Converting geography : ", exGeomConvert);
                                                var args = new ShapeImportExceptionEventArgs(exGeomConvert, false, shapeDataReader.DumpCurrentRecord(), shapeDataReader.Geometry, numRecord);
                                                if (this.Raise_Error(args))
                                                {
                                                    if (args.Ignore)
                                                    {
                                                        SqlNativeGeomList = new List <object>();
                                                    }
                                                    else
                                                    {
                                                        break;
                                                    }
                                                }
                                                else
                                                {
                                                    break;
                                                }
                                            }

                                            break;

                                            #endregion
                                            #region geometry
                                        case enSpatialType.geometry:
                                            try
                                            {
                                                SqlNativeGeomList.Add(SqlServerHelper.ConvertToSqlType(geomOut, SRID, false, numRecord));
                                            }
                                            catch (Exception exGeomConvert)
                                            {
                                                MapBindTrace.Source.TraceData(TraceEventType.Error, 1, "Error Converting geometry : ", exGeomConvert);
                                                var args = new ShapeImportExceptionEventArgs(exGeomConvert, false, shapeDataReader.DumpCurrentRecord(), shapeDataReader.Geometry, numRecord);
                                                if (this.Raise_Error(args))
                                                {
                                                    if (args.Ignore)
                                                    {
                                                        SqlNativeGeomList = new List <object>();
                                                    }
                                                    else
                                                    {
                                                        break;
                                                    }
                                                }
                                                else
                                                {
                                                    break;
                                                }
                                            }

                                            break;

                                            #endregion
                                            #region both
                                        case enSpatialType.both:

                                            bool geomConverted = false;
                                            try
                                            {
                                                SqlNativeGeomList.Add(SqlServerHelper.ConvertToSqlType(geomOut, SRID, false, numRecord));
                                                geomConverted = true;
                                                SqlNativeGeomList.Add(SqlServerHelper.ConvertToSqlType(geomOut, SRID, true, numRecord));
                                            }
                                            catch (Exception exGeomConvert)
                                            {
                                                MapBindTrace.Source.TraceData(TraceEventType.Error, 1, "Error Converting geometry or geography : ", exGeomConvert);
                                                var args = new ShapeImportExceptionEventArgs(exGeomConvert, false, shapeDataReader.DumpCurrentRecord(), shapeDataReader.Geometry, numRecord);
                                                if (this.Raise_Error(args))
                                                {
                                                    if (args.Ignore)
                                                    {
                                                        if (geomConverted)
                                                        {
                                                            SqlNativeGeomList.Add(null);
                                                        }
                                                        else
                                                        {
                                                            SqlNativeGeomList.AddRange(new object[] { null, null });
                                                        }
                                                    }
                                                    else
                                                    {
                                                        break;
                                                    }
                                                }
                                                else
                                                {
                                                    break;
                                                }
                                            }

                                            break;
                                            #endregion
                                        }


                                        // Get Attributes
                                        for (int i = 0; i < fields.Length; i++)
                                        {
                                            properties.Add(shapeDataReader[fields[i].Name]);
                                        }


                                        // Fill in-memory datatable
                                        DataRow row = SqlServerModel.GetNewDataTableRow(dataTable, tableName, SqlNativeGeomList, properties);
                                        dataTable.Rows.Add(row);

                                        #endregion

                                        //if (numRecord % 10 == 0)
                                        _worker.ReportProgress((int)((numRecord * 100f) / this.RecordCount), string.Format("Reading {0} records", numRecord));

                                        #endregion
                                    }
                                    catch (Exception exGeom)
                                    {
                                        MapBindTrace.Source.TraceData(TraceEventType.Error, 1, "Error Converting geometry : ", exGeom);
                                        this.Raise_Error(new ShapeImportExceptionEventArgs(exGeom, true, shapeDataReader.DumpCurrentRecord(), shapeDataReader.Geometry, numRecord));
                                    }
                                }

                                #endregion Read shape file

                                #region Bulk insert

                                if (!_worker.CancellationPending)
                                {
                                    using (SqlBulkCopy bulk = new SqlBulkCopy(db, SqlBulkCopyOptions.Default, transaction))
                                    {
                                        try
                                        {
                                            bulk.DestinationTableName = SqlServerModel.GenerateFullTableName(tableName, schema);
                                            bulk.BulkCopyTimeout      = 3600;                                        // 1 hour timeout
                                            bulk.NotifyAfter          = 10;
                                            bulk.SqlRowsCopied       += (o, args) =>
                                            {
                                                if (_worker.CancellationPending)
                                                {
                                                    args.Abort = true;
                                                }
                                                else
                                                {
                                                    _worker.ReportProgress((int)((args.RowsCopied * 100f) / this.RecordCount), string.Format("Writing {0} records", args.RowsCopied));
                                                }
                                            };

                                            _worker.ReportProgress(0, string.Format("Writing {0} records", 0));
                                            bulk.WriteToServer(dataTable);
                                            bulk.Close();
                                        }
                                        catch (OperationAbortedException ex)
                                        {
                                            MapBindTrace.Source.TraceData(TraceEventType.Error, 1, "Error inserting: ", ex);
                                            bulk.Close();
                                        }
                                    }
                                }

                                #endregion

                                if (_worker.CancellationPending)
                                {
                                    MapBindTrace.Source.TraceEvent(TraceEventType.Warning, 1, "Rolling back transaction");
                                    transaction.Rollback();
                                }
                                else
                                {
                                    #region Create spatial index

                                    MapBindTrace.Source.TraceEvent(TraceEventType.Information, 1, "Create spatial index");
                                    _worker.ReportProgress(100, "Creating index...");

                                    // Create spatial index
                                    string sqlScriptCreateIndex      = SqlServerModel.GenerateCreateSpatialIndexScript(tableName, schema, geomcolName, SqlServerHelper.GetBoundingBox(this.Bounds), spatialType, enSpatialIndexGridDensity.MEDIUM);
                                    SqlCommand v_createdIndexcmd     = new SqlCommand(sqlScriptCreateIndex, db, transaction);
                                    v_createdIndexcmd.CommandTimeout = 3600;
                                    v_createdIndexcmd.ExecuteNonQuery();

                                    #endregion

                                    MapBindTrace.Source.TraceEvent(TraceEventType.Information, 1, "Commit transaction");
                                    transaction.Commit();
                                }
                            }
                            catch (Exception ex)
                            {
                                MapBindTrace.Source.TraceData(TraceEventType.Error, 2, "Error: ", ex);

                                MapBindTrace.Source.TraceEvent(TraceEventType.Warning, 2, "Rolling back transaction");
                                transaction.Rollback();
                                if (!this.Raise_Error(new ShapeImportExceptionEventArgs(ex, true)))
                                {
                                    throw;
                                }
                            }


                            MapBindTrace.Source.TraceEvent(TraceEventType.Verbose, 2, "closing DB");
                            db.Close();
                        }
                    }
                    #endregion
                }
                catch (Exception ex)
                {
                    MapBindTrace.Source.TraceData(TraceEventType.Error, 3, "Error: ", ex);

                    this.Raise_Error(new ShapeImportExceptionEventArgs(ex, true));
                }
            });

            Trace.CorrelationManager.StartLogicalOperation("ImportShapeFile Worker");
            _worker.RunWorkerAsync();
            Trace.CorrelationManager.StopLogicalOperation();
        }