示例#1
0
        /// <summary>
        /// Creates the grid cell bounding polygon from an SQL geometry.
        /// </summary>
        /// <param name="gridCell">The grid cell.</param>
        private static WebPolygon CreateGridCellBoundingPolygonFromSqlGeometry(SqlGeometry gridCell)
        {
            WebPolygon gridCellBoundingPolygon;

            //Map the gridCell coordinates to the BoundingBox polygon property in the returning object
            gridCellBoundingPolygon             = new WebPolygon();
            gridCellBoundingPolygon.LinearRings = new List <WebLinearRing>();
            gridCellBoundingPolygon.LinearRings.Add(new WebLinearRing());
            gridCellBoundingPolygon.LinearRings[0].Points = new List <WebPoint>();
            gridCellBoundingPolygon.LinearRings[0].Points.Add(new WebPoint());
            gridCellBoundingPolygon.LinearRings[0].Points.Add(new WebPoint());
            gridCellBoundingPolygon.LinearRings[0].Points.Add(new WebPoint());
            gridCellBoundingPolygon.LinearRings[0].Points.Add(new WebPoint());
            gridCellBoundingPolygon.LinearRings[0].Points.Add(new WebPoint());

            gridCellBoundingPolygon.LinearRings[0].Points[0].X = Convert.ToDouble(gridCell.STStartPoint().STX.Value);
            gridCellBoundingPolygon.LinearRings[0].Points[0].Y = Convert.ToDouble(gridCell.STStartPoint().STY.Value);
            gridCellBoundingPolygon.LinearRings[0].Points[1].X = Convert.ToDouble(gridCell.STStartPoint().STX.Value);
            gridCellBoundingPolygon.LinearRings[0].Points[1].Y = Convert.ToDouble(gridCell.STPointN(3).STY.Value);
            gridCellBoundingPolygon.LinearRings[0].Points[2].X = Convert.ToDouble(gridCell.STPointN(3).STX.Value);
            gridCellBoundingPolygon.LinearRings[0].Points[2].Y = Convert.ToDouble(gridCell.STPointN(3).STY.Value);
            gridCellBoundingPolygon.LinearRings[0].Points[3].X = Convert.ToDouble(gridCell.STPointN(3).STX.Value);
            gridCellBoundingPolygon.LinearRings[0].Points[3].Y = Convert.ToDouble(gridCell.STStartPoint().STY.Value);
            gridCellBoundingPolygon.LinearRings[0].Points[4].X = Convert.ToDouble(gridCell.STStartPoint().STX.Value);
            gridCellBoundingPolygon.LinearRings[0].Points[4].Y = Convert.ToDouble(gridCell.STStartPoint().STY.Value);
            return(gridCellBoundingPolygon);
        }
        /// <summary>
        /// Get a SqlGeography instance with same
        /// information as provided WebPolygon.
        /// </summary>
        /// <param name="polygon">This polygon.</param>
        /// <returns>
        /// A SqlGeography instance with same
        /// information as provided WebPolygon.
        /// </returns>
        public static SqlGeography GetGeography(this WebPolygon polygon)
        {
            Boolean       isFirstLinearRing;
            String        comma;
            StringBuilder reverseWkt;

            try
            {
                return(SqlGeography.Parse(new SqlString(polygon.GetWkt())));
            }
            catch (Exception)
            {
            }

            try
            {
                // Try with points in reverse order.
                reverseWkt = new StringBuilder("POLYGON()");

                if (polygon.IsNotNull() &&
                    polygon.LinearRings.IsNotEmpty())
                {
                    isFirstLinearRing = true;
                    foreach (WebLinearRing linearRing in polygon.LinearRings)
                    {
                        if (linearRing.Points.IsNotEmpty())
                        {
                            if (isFirstLinearRing)
                            {
                                isFirstLinearRing = false;
                                reverseWkt.Insert(8, "()");
                            }
                            else
                            {
                                reverseWkt.Insert(8, "(), ");
                            }

                            comma = String.Empty;

                            foreach (WebPoint point in linearRing.Points)
                            {
                                reverseWkt.Insert(9, point.X.WebToStringR().Replace(",", ".") + " " + (point.Y.WebToStringR().Replace(",", ".")) + comma);

                                comma = ", ";
                            }
                        }
                    }
                }

                return(SqlGeography.Parse(new SqlString(reverseWkt.ToString())));
            }
            catch (Exception)
            {
            }

            return(null);
        }
 /// <summary>
 /// Check that data is valid.
 /// </summary>
 /// <param name="polygon">The polygon.</param>
 public static void CheckData(this WebPolygon polygon)
 {
     if (polygon.IsNotNull())
     {
         polygon.LinearRings.CheckNotEmpty("LinearRings");
         foreach (WebLinearRing linearRing in polygon.LinearRings)
         {
             linearRing.CheckData();
         }
     }
 }
        /// <summary>
        /// Convert a IPolygon instance to a WebPolygon instance.
        /// </summary>
        /// <param name="polygon">An IPolygon instance.</param>
        /// <returns>A WebPolygon instance.</returns>
        public static WebPolygon ToWebPolygon(this IPolygon polygon)
        {
            WebPolygon webPolygon;

            webPolygon             = new WebPolygon();
            webPolygon.LinearRings = new List <WebLinearRing>();

            foreach (ILinearRing linearRing in polygon.LinearRings)
            {
                webPolygon.LinearRings.Add(ToWebLinearRing(linearRing));
            }

            return(webPolygon);
        }
        /// <summary>
        /// Convert a WebBoundingBox instance into a WebPolygon
        /// instance with same geographic area.
        /// </summary>
        /// <param name="boundingBox">Bounding box.</param>
        /// <returns>A WebPolygon instance.</returns>
        public static WebPolygon GetPolygon(this WebBoundingBox boundingBox)
        {
            WebLinearRing linearRing;
            WebPolygon    polygon;

            linearRing        = new WebLinearRing();
            linearRing.Points = new List <WebPoint>();
            linearRing.Points.Add(new WebPoint(boundingBox.Min.X, boundingBox.Min.Y));
            linearRing.Points.Add(new WebPoint(boundingBox.Max.X, boundingBox.Min.Y));
            linearRing.Points.Add(new WebPoint(boundingBox.Max.X, boundingBox.Max.Y));
            linearRing.Points.Add(new WebPoint(boundingBox.Min.X, boundingBox.Max.Y));
            linearRing.Points.Add(new WebPoint(boundingBox.Min.X, boundingBox.Min.Y));
            polygon             = new WebPolygon();
            polygon.LinearRings = new List <WebLinearRing>();
            polygon.LinearRings.Add(linearRing);
            return(polygon);
        }
        public void GetGeometry()
        {
            SqlGeometry   polygonGeometry;
            WebLinearRing linearRing;
            WebPolygon    polygon;

            linearRing        = new WebLinearRing();
            linearRing.Points = new List <WebPoint>();
            linearRing.Points.Add(new WebPoint(2, 2));
            linearRing.Points.Add(new WebPoint(4, 1));
            linearRing.Points.Add(new WebPoint(5, 4));
            linearRing.Points.Add(new WebPoint(2, 2));
            polygon             = new WebPolygon();
            polygon.LinearRings = new List <WebLinearRing>();
            polygon.LinearRings.Add(linearRing);
            polygonGeometry = polygon.GetGeometry();
            Assert.IsNotNull(polygonGeometry);
        }
        /// <summary>
        /// Get polygon information in WKT format.
        /// </summary>
        /// <param name="polygon">This polygon.</param>
        /// <returns>Polygon information in WKT format.</returns>
        public static String GetWkt(this WebPolygon polygon)
        {
            Boolean       isFirstLinearRing, isFirstPoint;
            StringBuilder wkt;

            wkt = new StringBuilder("POLYGON");
            wkt.Append("(");
            if (polygon.LinearRings.IsNotEmpty())
            {
                isFirstLinearRing = true;
                foreach (WebLinearRing linearRing in polygon.LinearRings)
                {
                    if (isFirstLinearRing)
                    {
                        isFirstLinearRing = false;
                    }
                    else
                    {
                        wkt.Append(", ");
                    }
                    wkt.Append("(");
                    if (linearRing.Points.IsNotEmpty())
                    {
                        isFirstPoint = true;
                        foreach (WebPoint point in linearRing.Points)
                        {
                            if (isFirstPoint)
                            {
                                isFirstPoint = false;
                            }
                            else
                            {
                                wkt.Append(", ");
                            }
                            wkt.Append(point.X.WebToStringR().Replace(",", "."));
                            wkt.Append(" " + point.Y.WebToStringR().Replace(",", "."));
                        }
                    }
                    wkt.Append(")");
                }
            }
            wkt.Append(")");
            return(wkt.ToString());
        }
        /// <summary>
        /// Convert a IPolygon instance to a WebPolygon instance.
        /// </summary>
        /// <param name="polygon">An IPolygon instance.</param>
        /// <returns>A WebPolygon instance.</returns>
        protected WebPolygon GetPolygon(IPolygon polygon)
        {
            if (polygon == null)
            {
                return(null);
            }

            var webPolygon = new WebPolygon()
            {
                LinearRings = new List <WebLinearRing>()
            };

            foreach (LinearRing linearRing in polygon.LinearRings)
            {
                webPolygon.LinearRings.Add(GetLinearRing(linearRing));
            }

            return(webPolygon);
        }
示例#9
0
        /// <summary>
        /// This method will take a list of Sql Geometries, convert them to WebMultiPolygons
        /// and reproject them from the current coordinat system to the target coordinat system.
        /// </summary>
        /// <param name="toCoordinateSystem">The target coordinate system.</param>
        /// <param name="fromCoordinateSystem">The current coordinate system.</param>
        /// <param name="sqlGeometryToBeConvertedList">The slit of Sql Geometries that are to be converted.</param>
        public static List <WebPolygon> ReProjectPolygon(WebCoordinateSystem toCoordinateSystem,
                                                         WebCoordinateSystem fromCoordinateSystem,
                                                         List <SqlGeometry> sqlGeometryToBeConvertedList)
        {
            List <WebPolygon> webPolygonListToBeConverted;
            WebPolygon        webPolygonToBeConverted;
            int sridInsqlGeometryToBeConvertedList = 0;
            int sridInfromCoordinateSystem         = 0;


            webPolygonListToBeConverted = new List <WebPolygon>();
            webPolygonToBeConverted     = new WebPolygon();
            if (sqlGeometryToBeConvertedList.IsNotEmpty())
            {
                sridInsqlGeometryToBeConvertedList = (int)sqlGeometryToBeConvertedList[0].STSrid;
                sridInfromCoordinateSystem         = GetSridFromWebCoordinateSystem(fromCoordinateSystem);

                if (!sridInfromCoordinateSystem.Equals(sridInsqlGeometryToBeConvertedList))
                {
                    throw new Exception("There is a mismatch between coordinate systems in Sql Geometry list and fromCoordinateSystem.");
                }


                if (toCoordinateSystem.GetWkt().ToUpper() != fromCoordinateSystem.GetWkt().ToUpper())
                {
                    //Todo: Konvertera sqlGeometryToBeConvertedList till WebMultiPolygon
                    foreach (SqlGeometry geom in sqlGeometryToBeConvertedList)
                    {
                        webPolygonToBeConverted = geom.GetPolygon();
                        webPolygonListToBeConverted.Add(webPolygonToBeConverted);
                    }
                    // Convert coordinates if needed
                    List <WebPolygon> toGeometryList =
                        WebServiceData.CoordinateConversionManager.GetConvertedPolygons(
                            webPolygonListToBeConverted, fromCoordinateSystem, toCoordinateSystem);

                    return(toGeometryList);
                }
            }
            return(null);
        }
        /// <summary>
        /// Cast Web Polygon to Polygon
        /// </summary>
        /// <param name="webPolygon"></param>
        /// <returns></returns>
        public static IPolygon ToPolygon(this WebPolygon webPolygon)
        {
            //First ring is shell
            var shell = webPolygon.LinearRings[0].ToLinearRing();

            ILinearRing[] holes     = null;
            var           ringCount = webPolygon.LinearRings.Count;

            //All other rings are holes
            if (ringCount > 1)
            {
                holes = new ILinearRing[ringCount - 1];

                for (var i = 1; i < ringCount; i++)
                {
                    holes[i - 1] = webPolygon.LinearRings[i].ToLinearRing();
                }
            }

            return(new Polygon(shell, holes));
        }
        public void GetBoundingBox()
        {
            WebBoundingBox boundingBox;
            WebLinearRing  linearRing;
            WebPolygon     polygon;

            linearRing        = new WebLinearRing();
            linearRing.Points = new List <WebPoint>();
            linearRing.Points.Add(new WebPoint(2, 2));
            linearRing.Points.Add(new WebPoint(4, 1));
            linearRing.Points.Add(new WebPoint(5, 4));
            linearRing.Points.Add(new WebPoint(2, 2));
            polygon             = new WebPolygon();
            polygon.LinearRings = new List <WebLinearRing>();
            polygon.LinearRings.Add(linearRing);
            boundingBox = polygon.GetBoundingBox();
            Assert.IsNotNull(boundingBox);
            Assert.AreEqual(2, boundingBox.Min.X);
            Assert.AreEqual(5, boundingBox.Max.X);
            Assert.AreEqual(1, boundingBox.Min.Y);
            Assert.AreEqual(4, boundingBox.Max.Y);
        }
示例#12
0
        /// <summary>
        /// Gets the sweden extent bounding box polygon.
        /// </summary>
        /// <param name="coordinateSystem">The coordinate system.</param>
        public static WebPolygon GetSwedenExtentBoundingBoxPolygon(WebCoordinateSystem coordinateSystem)
        {
            WebPolygon boundingBox = new WebPolygon();

            // Sweden extent in SWEREF99_TM
            WebBoundingBox swedenBoundingBox = SwedenExtentCoordinates.GetSwedenExtentWebBoundingBoxSweref99();

            if (coordinateSystem.IsNotNull() && coordinateSystem.Id.IsNotNull() &&
                (coordinateSystem.Id != CoordinateSystemId.SWEREF99_TM))
            {
                WebCoordinateSystem sweref99CoordinateSystem = new WebCoordinateSystem();
                sweref99CoordinateSystem.Id = CoordinateSystemId.SWEREF99_TM;
                boundingBox = WebServiceData.CoordinateConversionManager.GetConvertedBoundingBox(
                    swedenBoundingBox, sweref99CoordinateSystem, coordinateSystem);
            }
            else
            {
                boundingBox = swedenBoundingBox.GetPolygon();
            }

            return(boundingBox);
        }
        /// <summary>
        /// Get bounding box for provided polygon.
        /// Currently only 2 dimensions are handled.
        /// </summary>
        /// <param name="polygon">This polygon.</param>
        /// <returns>Bounding box for provided polygon.</returns>
        public static WebBoundingBox GetBoundingBox(this WebPolygon polygon)
        {
            WebBoundingBox boundingBox;

            boundingBox = null;
            if (polygon.LinearRings.IsNotEmpty() &&
                polygon.LinearRings[0].Points.IsNotEmpty())
            {
                foreach (WebPoint point in polygon.LinearRings[0].Points)
                {
                    if (boundingBox.IsNull())
                    {
                        boundingBox     = new WebBoundingBox();
                        boundingBox.Max = point.Clone();
                        boundingBox.Min = point.Clone();
                    }
                    else
                    {
                        if (boundingBox.Max.X < point.X)
                        {
                            boundingBox.Max.X = point.X;
                        }
                        if (boundingBox.Max.Y < point.Y)
                        {
                            boundingBox.Max.Y = point.Y;
                        }
                        if (boundingBox.Min.X > point.X)
                        {
                            boundingBox.Min.X = point.X;
                        }
                        if (boundingBox.Min.Y > point.Y)
                        {
                            boundingBox.Min.Y = point.Y;
                        }
                    }
                }
            }
            return(boundingBox);
        }
 /// <summary>
 /// Get a SqlGeometry instance with same
 /// information as provided WebPolygon.
 /// </summary>
 /// <param name="polygon">This polygon.</param>
 /// <returns>
 /// A SqlGeometry instance with same
 /// information as provided WebPolygon.
 /// </returns>
 public static SqlGeometry GetGeometry(this WebPolygon polygon)
 {
     return(SqlGeometry.Parse(new SqlString(polygon.GetWkt())));
 }
示例#15
0
        /// <summary>
        /// Gets the sweden extent bounding box.
        /// </summary>
        /// <param name="coordinateSystem">The coordinate system.</param>
        public static WebBoundingBox GetSwedenExtentBoundingBox(WebCoordinateSystem coordinateSystem)
        {
            WebPolygon boundingBoxPolygon = GetSwedenExtentBoundingBoxPolygon(coordinateSystem);

            return(boundingBoxPolygon.GetBoundingBox());
        }
 /// <summary>
 /// Test if point is located inside polygon.
 /// Currently only two dimensions are handled.
 /// </summary>
 /// <param name="polygon">This polygon.</param>
 /// <param name='point'>Point.</param>
 /// <returns>True if point is located inside polygon.</returns>
 public static Boolean IsPointInsideGeometry(this WebPolygon polygon,
                                             WebPoint point)
 {
     return(polygon.GetGeometry().STContains(point.GetGeometry()).Value);
 }
        public void GetDarwinCoreBySearchCriteria()
        {
            WebBirdNestActivity      birdNestActivity;
            WebCoordinateSystem      coordinateSystem, wgsCoordinateSystem;
            WebDarwinCoreInformation information1, information2;
            WebLinearRing            linearRing;
            WebPolygon polygon;
            WebSpeciesObservationSearchCriteria searchCriteria;

            coordinateSystem    = new WebCoordinateSystem();
            coordinateSystem.Id = CoordinateSystemId.Rt90_25_gon_v;

            // Test search criteria Accuracy.
            searchCriteria          = new WebSpeciesObservationSearchCriteria();
            searchCriteria.TaxonIds = new List <Int32>();
            searchCriteria.TaxonIds.Add(Settings.Default.DrumGrasshopperId);
            searchCriteria.IncludePositiveObservations = true;
            searchCriteria.IsAccuracySpecified         = true;

            searchCriteria.Accuracy = 111;
            information1            = WebServiceProxy.SwedishSpeciesObservationSOAPService.GetDarwinCoreBySearchCriteria(GetClientInformation(), searchCriteria, coordinateSystem);
            CheckDarwinCoreInformation(information1);
            foreach (WebDarwinCore darwinCore in information1.SpeciesObservations)
            {
                Assert.IsTrue(Double.Parse(darwinCore.Location.CoordinateUncertaintyInMeters) <= searchCriteria.Accuracy);
            }

            searchCriteria.Accuracy = 59;
            information2            = WebServiceProxy.SwedishSpeciesObservationSOAPService.GetDarwinCoreBySearchCriteria(GetClientInformation(), searchCriteria, coordinateSystem);
            CheckDarwinCoreInformation(information2);
            Assert.IsTrue(information2.SpeciesObservationCount < information1.SpeciesObservationCount);
            foreach (WebDarwinCore darwinCore in information2.SpeciesObservations)
            {
                Assert.IsTrue(Double.Parse(darwinCore.Location.CoordinateUncertaintyInMeters) <= searchCriteria.Accuracy);
            }

            // Test search criteria BoundingBox.
            searchCriteria          = new WebSpeciesObservationSearchCriteria();
            searchCriteria.TaxonIds = new List <Int32>();
            searchCriteria.TaxonIds.Add(Settings.Default.DrumGrasshopperId);
            searchCriteria.IncludePositiveObservations = true;
            searchCriteria.BoundingBox = new WebBoundingBox();

            searchCriteria.BoundingBox.Max = new WebPoint(1645000, 6681000);
            searchCriteria.BoundingBox.Min = new WebPoint(1308000, 6222000);
            information1 = WebServiceProxy.SwedishSpeciesObservationSOAPService.GetDarwinCoreBySearchCriteria(GetClientInformation(), searchCriteria, coordinateSystem);
            CheckDarwinCoreInformation(information1);
            foreach (WebDarwinCore darwinCore in information1.SpeciesObservations)
            {
                Assert.IsTrue(darwinCore.Location.CoordinateX <= searchCriteria.BoundingBox.Max.X);
                Assert.IsTrue(darwinCore.Location.CoordinateX >= searchCriteria.BoundingBox.Min.X);
                Assert.IsTrue(darwinCore.Location.CoordinateY <= searchCriteria.BoundingBox.Max.Y);
                Assert.IsTrue(darwinCore.Location.CoordinateY >= searchCriteria.BoundingBox.Min.Y);
            }

            searchCriteria.BoundingBox.Max = new WebPoint(1500000, 6500000);
            searchCriteria.BoundingBox.Min = new WebPoint(1400000, 6300000);
            information2 = WebServiceProxy.SwedishSpeciesObservationSOAPService.GetDarwinCoreBySearchCriteria(GetClientInformation(), searchCriteria, coordinateSystem);
            CheckDarwinCoreInformation(information2);
            Assert.IsTrue(information2.SpeciesObservationCount < information1.SpeciesObservationCount);
            foreach (WebDarwinCore darwinCore in information2.SpeciesObservations)
            {
                Assert.IsTrue(darwinCore.Location.CoordinateX <= searchCriteria.BoundingBox.Max.X);
                Assert.IsTrue(darwinCore.Location.CoordinateX >= searchCriteria.BoundingBox.Min.X);
                Assert.IsTrue(darwinCore.Location.CoordinateY <= searchCriteria.BoundingBox.Max.Y);
                Assert.IsTrue(darwinCore.Location.CoordinateY >= searchCriteria.BoundingBox.Min.Y);
            }

            // Test error with coordinate conversion.
            searchCriteria.BoundingBox.Max = new WebPoint(17.7, 60.0);
            searchCriteria.BoundingBox.Min = new WebPoint(17.6, 59.9);
            wgsCoordinateSystem            = new WebCoordinateSystem();
            wgsCoordinateSystem.Id         = CoordinateSystemId.WGS84;
            information1 = WebServiceProxy.SwedishSpeciesObservationSOAPService.GetDarwinCoreBySearchCriteria(GetClientInformation(), searchCriteria, wgsCoordinateSystem);
            CheckDarwinCoreInformation(information1);

            // Test search criteria ChangeDateTime.

            // Test search criteria DataFieldSearchCriteria.

            // Test search criteria DataSourceIds.

            // Test search criteria IncludeNeverFoundObservations.
            searchCriteria          = new WebSpeciesObservationSearchCriteria();
            searchCriteria.TaxonIds = new List <Int32>();
            searchCriteria.TaxonIds.Add(Settings.Default.DrumGrasshopperId);
            searchCriteria.IncludeNeverFoundObservations = true;
            information1 = WebServiceProxy.SwedishSpeciesObservationSOAPService.GetDarwinCoreBySearchCriteria(GetClientInformation(), searchCriteria, coordinateSystem);
            CheckDarwinCoreInformation(information1);
            foreach (WebDarwinCore darwinCore in information1.SpeciesObservations)
            {
                Assert.IsTrue(darwinCore.Occurrence.IsNeverFoundObservation);
            }

            // Test search criteria IncludeNotRediscoveredObservations.
            searchCriteria          = new WebSpeciesObservationSearchCriteria();
            searchCriteria.TaxonIds = new List <Int32>();
            searchCriteria.TaxonIds.Add(Settings.Default.DrumGrasshopperId);
            searchCriteria.IncludeNotRediscoveredObservations = true;
            information1 = WebServiceProxy.SwedishSpeciesObservationSOAPService.GetDarwinCoreBySearchCriteria(GetClientInformation(), searchCriteria, coordinateSystem);
            CheckDarwinCoreInformation(information1);
            foreach (WebDarwinCore darwinCore in information1.SpeciesObservations)
            {
                Assert.IsTrue(darwinCore.Occurrence.IsNotRediscoveredObservation);
            }

            // Test search criteria IncludePositiveObservations.
            searchCriteria          = new WebSpeciesObservationSearchCriteria();
            searchCriteria.TaxonIds = new List <Int32>();
            searchCriteria.TaxonIds.Add(Settings.Default.DrumGrasshopperId);
            searchCriteria.IncludePositiveObservations = true;
            information1 = WebServiceProxy.SwedishSpeciesObservationSOAPService.GetDarwinCoreBySearchCriteria(GetClientInformation(), searchCriteria, coordinateSystem);
            CheckDarwinCoreInformation(information1);
            foreach (WebDarwinCore darwinCore in information1.SpeciesObservations)
            {
                Assert.IsTrue(darwinCore.Occurrence.IsPositiveObservation);
            }

            // Test search criteria IncludeRedListCategories.
            searchCriteria = new WebSpeciesObservationSearchCriteria();
            searchCriteria.IncludeNotRediscoveredObservations = true;
            searchCriteria.IncludeRedListCategories           = new List <RedListCategory>();
            searchCriteria.IncludeRedListCategories.Add(RedListCategory.CR);
            information1 = WebServiceProxy.SwedishSpeciesObservationSOAPService.GetDarwinCoreBySearchCriteria(GetClientInformation(), searchCriteria, coordinateSystem);
            CheckDarwinCoreInformation(information1);
            foreach (WebDarwinCore darwinCore in information1.SpeciesObservations)
            {
                // The check for not empty red list category should not be
                // necessary but data on test server is not up to date.
                // This test has a problem with taxon 232265 that
                // is redlisted as VU since its parent taxon is
                // red listed as NT.
                if (darwinCore.Conservation.RedlistCategory.IsNotEmpty() &&
                    (Int32.Parse(darwinCore.Taxon.TaxonID) != 232265))
                {
                    Assert.AreEqual(searchCriteria.IncludeRedListCategories[0].ToString(),
                                    darwinCore.Conservation.RedlistCategory.Substring(0, 2).ToUpper());
                }
            }

            // Test search criteria IncludeRedlistedTaxa.
            searchCriteria                     = new WebSpeciesObservationSearchCriteria();
            searchCriteria.Accuracy            = 3;
            searchCriteria.IsAccuracySpecified = true;
            searchCriteria.IncludeNotRediscoveredObservations = true;
            searchCriteria.IncludeRedlistedTaxa = true;
            information1 = WebServiceProxy.SwedishSpeciesObservationSOAPService.GetDarwinCoreBySearchCriteria(GetClientInformation(), searchCriteria, coordinateSystem);
            CheckDarwinCoreInformation(information1);
            Assert.IsTrue(information1.SpeciesObservations.IsNotEmpty());

            // Test search criteria LocalityNameSearchString.
            searchCriteria = new WebSpeciesObservationSearchCriteria();
            searchCriteria.IncludePositiveObservations = true;
            searchCriteria.TaxonIds = new List <Int32>();
            searchCriteria.TaxonIds.Add(Settings.Default.DrumGrasshopperId);
            searchCriteria.LocalityNameSearchString = new WebStringSearchCriteria();
            searchCriteria.LocalityNameSearchString.CompareOperators = new List <StringCompareOperator>();
            searchCriteria.LocalityNameSearchString.CompareOperators.Add(StringCompareOperator.Like);
            searchCriteria.LocalityNameSearchString.SearchString = "Fullerö%";
            information1 = WebServiceProxy.SwedishSpeciesObservationSOAPService.GetDarwinCoreBySearchCriteria(GetClientInformation(), searchCriteria, coordinateSystem);
            CheckDarwinCoreInformation(information1);
            foreach (WebDarwinCore darwinCore in information1.SpeciesObservations)
            {
                Assert.AreEqual(searchCriteria.LocalityNameSearchString.SearchString.Substring(0, 7).ToUpper(),
                                darwinCore.Location.Locality.Substring(0, 7).ToUpper());
            }


            // Test search criteria ObservationDateTime.
            searchCriteria = new WebSpeciesObservationSearchCriteria();
            searchCriteria.IncludePositiveObservations = true;
            searchCriteria.TaxonIds = new List <Int32>();
            searchCriteria.TaxonIds.Add(Settings.Default.DrumGrasshopperId);
            searchCriteria.ObservationDateTime       = new WebDateTimeSearchCriteria();
            searchCriteria.ObservationDateTime.Begin = new DateTime(2009, 8, 1);
            searchCriteria.ObservationDateTime.End   = new DateTime(2009, 8, 31);

            information1 = WebServiceProxy.SwedishSpeciesObservationSOAPService.GetDarwinCoreBySearchCriteria(GetClientInformation(), searchCriteria, coordinateSystem);
            CheckDarwinCoreInformation(information1);
            foreach (WebDarwinCore darwinCore in information1.SpeciesObservations)
            {
                Assert.IsTrue(searchCriteria.ObservationDateTime.Begin <= darwinCore.Event.Start);
                Assert.IsTrue(searchCriteria.ObservationDateTime.End >= darwinCore.Event.Start);
            }

            searchCriteria.ObservationDateTime.PartOfYear = new List <WebDateTimeInterval>();
            searchCriteria.ObservationDateTime.PartOfYear.Add(new WebDateTimeInterval());
            searchCriteria.ObservationDateTime.PartOfYear[0].Begin = new DateTime(2009, 8, 1);
            searchCriteria.ObservationDateTime.PartOfYear[0].End   = new DateTime(2009, 8, 31);
            information1 = WebServiceProxy.SwedishSpeciesObservationSOAPService.GetDarwinCoreBySearchCriteria(GetClientInformation(), searchCriteria, coordinateSystem);
            CheckDarwinCoreInformation(information1);
            foreach (WebDarwinCore darwinCore in information1.SpeciesObservations)
            {
                Assert.AreEqual(searchCriteria.ObservationDateTime.PartOfYear[0].Begin.Month,
                                darwinCore.Event.Start.Month);
                Assert.IsTrue(searchCriteria.ObservationDateTime.PartOfYear[0].Begin.Day <= darwinCore.Event.Start.Day);
                Assert.IsTrue(searchCriteria.ObservationDateTime.PartOfYear[0].End.Day >= darwinCore.Event.Start.Day);
            }

            // Test search criteria ObserverIds.

            // Test search criteria Polygons.
            linearRing        = new WebLinearRing();
            linearRing.Points = new List <WebPoint>();
            linearRing.Points.Add(new WebPoint(1500000, 6500000));
            linearRing.Points.Add(new WebPoint(1800000, 6500000));
            linearRing.Points.Add(new WebPoint(1800000, 6800000));
            linearRing.Points.Add(new WebPoint(1500000, 6500000));
            polygon             = new WebPolygon();
            polygon.LinearRings = new List <WebLinearRing>();
            polygon.LinearRings.Add(linearRing);
            searchCriteria = new WebSpeciesObservationSearchCriteria();
            searchCriteria.IncludePositiveObservations = true;
            searchCriteria.TaxonIds = new List <Int32>();
            searchCriteria.TaxonIds.Add(Settings.Default.DrumGrasshopperId);
            searchCriteria.Polygons = new List <WebPolygon>();
            searchCriteria.Polygons.Add(polygon);
            information1 = WebServiceProxy.SwedishSpeciesObservationSOAPService.GetDarwinCoreBySearchCriteria(GetClientInformation(), searchCriteria, coordinateSystem);
            CheckDarwinCoreInformation(information1);
            Assert.IsTrue(information1.SpeciesObservations.IsNotEmpty());

            linearRing        = new WebLinearRing();
            linearRing.Points = new List <WebPoint>();
            linearRing.Points.Add(new WebPoint(1300000, 6100000));
            linearRing.Points.Add(new WebPoint(1600000, 6100000));
            linearRing.Points.Add(new WebPoint(1600000, 6300000));
            linearRing.Points.Add(new WebPoint(1300000, 6100000));
            polygon             = new WebPolygon();
            polygon.LinearRings = new List <WebLinearRing>();
            polygon.LinearRings.Add(linearRing);
            searchCriteria.Polygons.Add(polygon);
            information2 = WebServiceProxy.SwedishSpeciesObservationSOAPService.GetDarwinCoreBySearchCriteria(GetClientInformation(), searchCriteria, coordinateSystem);
            CheckDarwinCoreInformation(information2);
            Assert.IsTrue(information2.SpeciesObservations.IsNotEmpty());
            Assert.IsTrue(information1.SpeciesObservationCount < information2.SpeciesObservationCount);

            // Test search criteria ProjectIds.

            // Test search criteria RegionIds.
            searchCriteria = new WebSpeciesObservationSearchCriteria();
            searchCriteria.IncludePositiveObservations = true;
            searchCriteria.TaxonIds = new List <Int32>();
            searchCriteria.TaxonIds.Add((Int32)(TaxonId.DrumGrasshopper));
            searchCriteria.TaxonIds.Add((Int32)(TaxonId.Hedgehog));
            searchCriteria.RegionGuids = new List <String>();
            searchCriteria.RegionGuids.Add(Settings.Default.UpplandGuid);
            information1 = WebServiceProxy.SwedishSpeciesObservationSOAPService.GetDarwinCoreBySearchCriteria(GetClientInformation(), searchCriteria, coordinateSystem);
            CheckDarwinCoreInformation(information1);
            Assert.IsTrue(information1.SpeciesObservations.IsNotEmpty());

            searchCriteria.RegionGuids.Add(Settings.Default.BlekingeGUID);
            information2 = WebServiceProxy.SwedishSpeciesObservationSOAPService.GetDarwinCoreBySearchCriteria(GetClientInformation(), searchCriteria, coordinateSystem);
            CheckDarwinCoreInformation(information2);
            Assert.IsTrue(information2.SpeciesObservations.IsNotEmpty());
            Assert.IsTrue(information1.SpeciesObservationCount < information2.SpeciesObservationCount);

            searchCriteria.RegionGuids = new List <String>();
            searchCriteria.RegionGuids.Add(Settings.Default.VastmanlandCountyGuid);
            information1 = WebServiceProxy.SwedishSpeciesObservationSOAPService.GetDarwinCoreBySearchCriteria(GetClientInformation(), searchCriteria, coordinateSystem);
            CheckDarwinCoreInformation(information1);
            Assert.IsTrue(information1.SpeciesObservations.IsNotEmpty());

            // Test search criteria RegionLogicalOperator.

            // Test search criteria RegistrationDateTime.
            searchCriteria = new WebSpeciesObservationSearchCriteria();
            searchCriteria.IncludePositiveObservations = true;
            searchCriteria.TaxonIds = new List <Int32>();
            searchCriteria.TaxonIds.Add(Settings.Default.DrumGrasshopperId);
            searchCriteria.RegistrationDateTime       = new WebDateTimeSearchCriteria();
            searchCriteria.RegistrationDateTime.Begin = new DateTime(2009, 8, 1);
            searchCriteria.RegistrationDateTime.End   = new DateTime(2009, 8, 31);

            information1 = WebServiceProxy.SwedishSpeciesObservationSOAPService.GetDarwinCoreBySearchCriteria(GetClientInformation(), searchCriteria, coordinateSystem);
            CheckDarwinCoreInformation(information1);

            searchCriteria.RegistrationDateTime.PartOfYear = new List <WebDateTimeInterval>();
            searchCriteria.RegistrationDateTime.PartOfYear.Add(new WebDateTimeInterval());
            searchCriteria.RegistrationDateTime.PartOfYear[0].Begin = new DateTime(2009, 8, 1);
            searchCriteria.RegistrationDateTime.PartOfYear[0].End   = new DateTime(2009, 8, 31);
            information1 = WebServiceProxy.SwedishSpeciesObservationSOAPService.GetDarwinCoreBySearchCriteria(GetClientInformation(), searchCriteria, coordinateSystem);
            CheckDarwinCoreInformation(information1);

            // Test search criteria SpeciesActivityIds.
            searchCriteria = new WebSpeciesObservationSearchCriteria();
            searchCriteria.IncludePositiveObservations = true;
            searchCriteria.TaxonIds = new List <Int32>();
            searchCriteria.TaxonIds.Add(Settings.Default.TwiteId);
            searchCriteria.SpeciesActivityIds = new List <Int32>();
            birdNestActivity = WebServiceProxy.SwedishSpeciesObservationSOAPService.GetBirdNestActivities(GetClientInformation())[0];
            searchCriteria.SpeciesActivityIds.Add(birdNestActivity.Id);
            information1 = WebServiceProxy.SwedishSpeciesObservationSOAPService.GetDarwinCoreBySearchCriteria(GetClientInformation(), searchCriteria, coordinateSystem);
            CheckDarwinCoreInformation(information1);
            foreach (WebDarwinCore darwinCore in information1.SpeciesObservations)
            {
                if (darwinCore.DatasetName == "Fåglar")
                {
                    Assert.AreEqual(birdNestActivity.Name, darwinCore.Occurrence.Behavior);
                }
            }

            // Test search criteria TaxonIds.
            searchCriteria = new WebSpeciesObservationSearchCriteria();
            searchCriteria.IncludePositiveObservations = true;
            searchCriteria.TaxonIds = new List <Int32>();
            searchCriteria.TaxonIds.Add(Settings.Default.DrumGrasshopperId);
            information1 = WebServiceProxy.SwedishSpeciesObservationSOAPService.GetDarwinCoreBySearchCriteria(GetClientInformation(), searchCriteria, coordinateSystem);
            CheckDarwinCoreInformation(information1);
            foreach (WebDarwinCore darwinCore in information1.SpeciesObservations)
            {
                Assert.AreEqual(Settings.Default.DrumGrasshopperId, Int32.Parse(darwinCore.Taxon.TaxonID));
            }

            // Test search criteria TaxonValidationStatusIds.
        }