/// <summary>
        /// Calculates the elevation of a point using a preloaded data, using intepolation of 3 points in a plane:
        /// 3
        /// |    p
        /// |
        /// 1______2
        /// </summary>
        /// <param name="latLng">The point to calculate elevation for</param>
        /// <returns>A task with the elevation results</returns>
        public async Task <double> GetElevation(Coordinate latLng)
        {
            var key = new Coordinate(Math.Floor(latLng.X), Math.Floor(latLng.Y));

            if (_initializationTaskPerLatLng.ContainsKey(key) == false)
            {
                return(0);
            }
            await _initializationTaskPerLatLng[key];

            if (_elevationData.ContainsKey(key) == false)
            {
                return(0);
            }
            var array = _elevationData[key];
            var lat   = (array.GetLength(0) - 1) - Math.Abs(latLng.Y - key.Y) * array.GetLength(0);
            var lng   = Math.Abs(latLng.X - key.X) * array.GetLength(1);

            if ((lat >= array.GetLength(0) - 1) || (lng >= array.GetLength(1) - 1))
            {
                return(array[(int)lat, (int)lng]);
            }
            var coordinate1 = new CoordinateZ((int)lng, (int)lat, array[(int)lat, (int)lng]);
            var coordinate2 = new CoordinateZ((int)lng + 1, (int)lat, array[(int)lat, (int)lng + 1]);
            var coordinate3 = new CoordinateZ((int)lng, (int)lat + 1, array[(int)lat + 1, (int)lng]);

            return(Vertex.InterpolateZ(new Coordinate(lng, lat), coordinate1, coordinate2, coordinate3));
        }
        // see: https://github.com/NetTopologySuite/NetTopologySuite/issues/111
        public void issue_111_polygonhandler_with_invalid_values()
        {
            var factory = GeometryFactory.Default;

            var points = new Coordinate[5];

            points[0] = new CoordinateZ(0, 0);
            points[1] = new CoordinateZ(1, 0);
            points[2] = new CoordinateZ(1, 1);
            points[3] = new CoordinateZ(0, 1);
            points[4] = new CoordinateZ(0, 0);
            var poly = factory.CreatePolygon(points);

            var mpoly = factory.CreateMultiPolygon(new[] { poly });

            Geometry[] arr        = new[] { mpoly, GeometryCollection.Empty };
            var        geometries = factory.CreateGeometryCollection(arr);

            var shapeType = Shapefile.GetShapeType(geometries);

            Assert.AreEqual(ShapeGeometryType.PolygonZM, shapeType);

            string tempPath = Path.GetTempFileName();
            var    sfw      = new ShapefileWriter(Path.GetFileNameWithoutExtension(tempPath), shapeType);

            Assert.Throws <ArgumentException>(() => sfw.Write(geometries));
        }
示例#3
0
        public void TestToString()
        {
            const string expectedResult = "(100, 200, 50)";
            string       actualResult   = new CoordinateZ(100, 200, 50).ToString();

            Assert.AreEqual(expectedResult, actualResult);
        }
示例#4
0
        public void TestEqualsInZ()
        {
            var c         = new CoordinateZ(100.0, 200.0, 50.0);
            var withSameZ = new CoordinateZ(100.1, 200.1, 50.1);

            Assert.IsTrue(c.EqualInZ(withSameZ, 0.2));
        }
示例#5
0
        private bool TryParseCoordinate(JsonArray coordinates, out Coordinate result)
        {
            result = null;
            if (coordinates == null || coordinates.Count < 2)
            {
                return(false);
            }

            var valid = coordinates.All(x => x is double || x is long);

            if (!valid)
            {
                return(false);
            }

            if (coordinates.Count == 2)
            {
                result = new Coordinate(Convert.ToDouble(coordinates[1]), Convert.ToDouble(coordinates[0]));
            }
            else if (coordinates.Count == 3)
            {
                result = new CoordinateZ(Convert.ToDouble(coordinates[1]), Convert.ToDouble(coordinates[0]), Convert.ToDouble(coordinates[2]));
            }
            else
            {
                result = new CoordinateZM(Convert.ToDouble(coordinates[1]), Convert.ToDouble(coordinates[0]), Convert.ToDouble(coordinates[2]), Convert.ToDouble(coordinates[3]));
            }
            return(true);
        }
示例#6
0
        public void TestEquals2DWithinTolerance()
        {
            var c       = new CoordinateZ(100.0, 200.0, 50.0);
            var aBitOff = new CoordinateZ(100.1, 200.1, 50.0);

            Assert.IsTrue(c.Equals2D(aBitOff, 0.2));
        }
示例#7
0
        public async Task <List <Feature> > GetByBoundingBox(Coordinate sourthWest, Coordinate northEast, string language)
        {
            for (int retryIndex = 0; retryIndex < 3; retryIndex++)
            {
                try
                {
                    var geoSearchGenerator = new GeoSearchGenerator(_wikiSites[language])
                    {
                        BoundingRectangle = GeoCoordinateRectangle.FromBoundingCoordinates(sourthWest.X, sourthWest.Y, northEast.X, northEast.Y),
                        PaginationSize    = 500
                    };
                    var results = await geoSearchGenerator.EnumItemsAsync().ToListAsync();

                    var features = new List <Feature>();
                    foreach (var geoSearchResultItem in results)
                    {
                        var coordinate = new CoordinateZ(geoSearchResultItem.Coordinate.Longitude, geoSearchResultItem.Coordinate.Latitude);
                        var attributes = GetAttributes(coordinate, geoSearchResultItem.Page.Title,
                                                       geoSearchResultItem.Page.Id.ToString(), language);
                        features.Add(new Feature(new Point(coordinate), attributes));
                    }
                    return(features);
                }
                catch
                {
                    // this is used since this function throws an unrelated timeout error...
                }
            }
            _logger.LogError($"All Retries failed while trying to get data from {language}.wikipedia");
            return(new List <Feature>());
        }
        public void LineString3D()
        {
            const int size   = 10;
            var       points = new Coordinate[size];

            for (int i = 0; i < size; i++)
            {
                // just some arbitrary values
                points[i] = new CoordinateZ(100 * Math.Sin(i), 200 * Math.Cos(i), 300 * Math.Tan(i));
            }
            var source   = new LineString(points);
            var pgWriter = new PostGisWriter()
            {
                HandleOrdinates = Ordinates.XYZ
            };

            byte[] bytes  = pgWriter.Write(source);
            var    target = (LineString) new PostGisReader().Read(bytes);

            for (int i = 0; i < size; i++)
            {
                Assert.AreEqual(source.Coordinates[i].X, target.Coordinates[i].X);
                Assert.AreEqual(source.Coordinates[i].Y, target.Coordinates[i].Y);
                Assert.AreEqual(source.Coordinates[i].Z, target.Coordinates[i].Z);
            }
        }
示例#9
0
        public void TestClone()
        {
            var c     = new CoordinateZ(100.0, 200.0, 50.0);
            var clone = (CoordinateZ)c.Copy();

            Assert.IsTrue(c.Equals3D(clone));
        }
示例#10
0
 /// <summary>
 /// Initializes a new instance of the <see cref="Vector"/> class where the X, Y and Z terms are the same as the specified coordinate.
 /// </summary>
 /// <param name="coord">The ICoordinate to use.</param>
 public Vector(CoordinateZ coord)
 {
     X = coord.X;
     Y = coord.Y;
     Z = coord.Z;
     RemoveNan();
 }
示例#11
0
        public void TestDistance3D()
        {
            var    coord1   = new CoordinateZ(0.0, 0.0, 0.0);
            var    coord2   = new CoordinateZ(100.0, 200.0, 50.0);
            double distance = coord1.Distance3D(coord2);

            Assert.AreEqual(229.128784747792, distance, 0.000001);
        }
示例#12
0
        public void TestGetOrdinate()
        {
            var c = new CoordinateZ(350.2, 4566.8, 5266.3);

            Assert.AreEqual(c[Ordinate.X], 350.2);
            Assert.AreEqual(c[Ordinate.Y], 4566.8);
            Assert.AreEqual(c[Ordinate.Z], 5266.3);
        }
示例#13
0
        public void TestDistance()
        {
            var    coord1   = new CoordinateZ(0.0, 0.0, 0.0);
            var    coord2   = new CoordinateZ(100.0, 200.0, 50.0);
            double distance = coord1.Distance(coord2);

            Assert.AreEqual(distance, 223.60679774997897, 0.00001);
        }
示例#14
0
        public void TestConstructor2D()
        {
            var c = new CoordinateZ(350.2, 4566.8);

            Assert.AreEqual(c.X, 350.2);
            Assert.AreEqual(c.Y, 4566.8);
            Assert.AreEqual(c.Z, Coordinate.NullOrdinate);
        }
示例#15
0
        public void TestDefaultConstructor()
        {
            var c = new CoordinateZ();

            Assert.AreEqual(c.X, 0.0);
            Assert.AreEqual(c.Y, 0.0);
            Assert.AreEqual(c.Z, Coordinate.NullOrdinate);
        }
示例#16
0
        public void TestConstructor3D()
        {
            var c = new CoordinateZ(350.2, 4566.8, 5266.3);

            Assert.AreEqual(c.X, 350.2);
            Assert.AreEqual(c.Y, 4566.8);
            Assert.AreEqual(c.Z, 5266.3);
        }
示例#17
0
        /// <summary>
        /// Computes the normal vector to the triangle p0-p1-p2. In order to compute the normal each
        /// triangle coordinate must have a Z value. If this is not the case, the returned Coordinate
        /// will have NaN values. The returned vector has unit length.
        /// </summary>
        /// <param name="p0">A point</param>
        /// <param name="p1">A point</param>
        /// <param name="p2">A point</param>
        /// <returns>The normal vector to the triangle <paramref name="p0"/>-<paramref name="p1"/>-<paramref name="p2"/></returns>
        public static Coordinate NormalToTriangle(Coordinate p0, Coordinate p1, Coordinate p2)
        {
            var v1 = new CoordinateZ(p1.X - p0.X, p1.Y - p0.Y, p1.Z - p0.Z);
            var v2 = new CoordinateZ(p2.X - p0.X, p2.Y - p0.Y, p2.Z - p0.Z);
            var cp = CrossProduct(v1, v2);

            Normalize(cp);
            return(cp);
        }
示例#18
0
        public virtual void New_pointZ_should_be_written()
        {
            var coord = new CoordinateZ(11.11, 22.22, 33.33);
            var point = GeometryFactory.Default.CreatePoint(coord);

            DoTest(conn =>
            {
                using (var cmd = conn.CreateCommand())
                {
                    const string sql = @"
DELETE FROM [sample_feature_table_z];
INSERT INTO [sample_feature_table_z] ([id], [geometry])
VALUES (1, @pbytes);";
                    cmd.CommandText  = sql;
                    var writer       = new GeoPackageGeoWriter
                    {
                        HandleOrdinates = Ordinates.XYZ
                    };
                    byte[] bytes = writer.Write(point);
                    cmd.Parameters.AddWithValue("pbytes", bytes);

                    int ret = cmd.ExecuteNonQuery();
                    Assert.AreEqual(1, ret);
                }

                using (var cmd = conn.CreateCommand())
                {
                    const string sql = @"
SELECT
    geometry
   ,ST_Is3D(geometry)
   ,ST_IsMeasured(geometry)
   ,ST_AsText(GeomFromGPB(geometry))   
FROM [sample_feature_table_z]
WHERE [id] = 1;";
                    cmd.CommandText  = sql;
                    using (var rdr = cmd.ExecuteReader())
                    {
                        Assert.IsTrue(rdr.Read());
                        byte[] blob = rdr.GetFieldValue <byte[]>(0);
                        var reader  = new GeoPackageGeoReader
                        {
                            HandleOrdinates = Ordinates.XYZ
                        };
                        var geom = reader.Read(blob);
                        Assert.AreEqual(point, geom);
                        Assert.AreEqual(point.AsBinary(), geom.AsBinary());
                        Assert.IsTrue(rdr.GetBoolean(1));
                        Assert.IsFalse(rdr.GetBoolean(2));
                        string wkt = rdr.GetString(3);
                        Assert.IsFalse(string.IsNullOrEmpty(wkt));
                        Assert.AreEqual("POINT Z(11.11 22.22 33.33)", wkt);
                    }
                }
            });
        }
示例#19
0
        public void TestEquals3D()
        {
            var c1 = new CoordinateZ(1, 2, 3);
            var c2 = new CoordinateZ(1, 2, 3);

            Assert.IsTrue(c1.Equals3D(c2));

            var c3 = new CoordinateZ(1, 22, 3);

            Assert.IsFalse(c1.Equals3D(c3));
        }
示例#20
0
        public void TestSetCoordinate()
        {
            var orig = new CoordinateZ(350.2, 4566.8, 5266.3);
            var c    = new CoordinateZ {
                CoordinateValue = orig
            };

            Assert.AreEqual(c.X, 350.2);
            Assert.AreEqual(c.Y, 4566.8);
            Assert.AreEqual(c.Z, 5266.3);
        }
        private static CoordinateZ[] Reversed(CoordinateZ[] coordinates)
        {
            var reversed = new CoordinateZ[coordinates.Length];
            int maxIndex = coordinates.Length - 1;

            for (int i = 0; i < coordinates.Length; i++)
            {
                reversed[i] = coordinates[maxIndex - i];
            }
            return(reversed);
        }
        public void TrySerialize_With_Valid_3dCoordinate()
        {
            var type  = new GeoJSONPositionScalar();
            var input = new CoordinateZ(1, 2, 100);

            var result = type.TrySerialize(input, out var value);

            Assert.True(result);
            Assert.Equal(3, Assert.IsType <double[]>(value).Length);
            Assert.Equal(new [] { 1D, 2D, 100D }, Assert.IsType <double[]>(value));
        }
示例#23
0
        public void TestSetOrdinate()
        {
            var c = new CoordinateZ();

            c[Ordinate.X] = 111;
            c[Ordinate.Y] = 222;
            c[Ordinate.Z] = 333;
            Assert.AreEqual(c[Ordinate.X], 111.0);
            Assert.AreEqual(c[Ordinate.Y], 222.0);
            Assert.AreEqual(c[Ordinate.Z], 333.0);
        }
示例#24
0
        // TODO: This private method was marked as protected to allow PackedCoordinateSequenceTest to override Test2DZOrdinate
        // The method should not be marked as protected, and should be altered when the correct PackedCoordinateSequence.GetCoordinate result is migrated to NTS
        protected Coordinate[] CreateArray(int size)
        {
            var coords = new Coordinate[size];

            for (int i = 0; i < size; i++)
            {
                double baseUnits = 2 * 1;
                coords[i] = new CoordinateZ(baseUnits, baseUnits + 1, baseUnits + 2);
            }
            return(coords);
        }
        public void ParseValue_With_3Valid_Coordinates()
        {
            var type       = new GeoJSONPositionScalar();
            var coordinate = new CoordinateZ(1.1, 2.2, 3.3);

            var result = type.ParseValue(coordinate);

            Assert.Equal("1.10", Assert.IsType <ListValueNode>(result).Items[0].Value);
            Assert.Equal("2.20", Assert.IsType <ListValueNode>(result).Items[1].Value);
            Assert.Equal("3.30", Assert.IsType <ListValueNode>(result).Items[2].Value);
        }
示例#26
0
        private async Task <Feature> ConvertPageToFeature(WikiPage page, string language)
        {
            await page.RefreshAsync(new WikiPageQueryProvider
            {
                Properties =
                {
                    new ExtractsPropertyProvider       {
                        AsPlainText = true, IntroductionOnly = true, MaxSentences = 1
                    },
                    new PageImagesPropertyProvider     {
                        QueryOriginalImage = true
                    },
                    new GeoCoordinatesPropertyProvider {
                        QueryPrimaryCoordinate = true
                    },
                    new RevisionsPropertyProvider      {
                        FetchContent = false
                    }
                }
            });

            if (page.Exists == false)
            {
                return(null);
            }
            var geoCoordinate = page.GetPropertyGroup <GeoCoordinatesPropertyGroup>().PrimaryCoordinate;

            if (geoCoordinate.IsEmpty)
            {
                return(null);
            }
            var coordinate = new CoordinateZ(geoCoordinate.Longitude, geoCoordinate.Latitude, double.NaN);
            var attributes = GetAttributes(coordinate, page.Title, page.Id.ToString(), language);

            attributes.Add(FeatureAttributes.DESCRIPTION + ":" + language, page.GetPropertyGroup <ExtractsPropertyGroup>().Extract ?? string.Empty);
            var imageUrl = page.GetPropertyGroup <PageImagesPropertyGroup>().OriginalImage.Url ?? string.Empty;

            if (!string.IsNullOrWhiteSpace(imageUrl) &&
                (imageUrl.EndsWith(".jpg", StringComparison.OrdinalIgnoreCase) ||
                 imageUrl.EndsWith(".jpeg", StringComparison.OrdinalIgnoreCase) ||
                 imageUrl.EndsWith(".png", StringComparison.OrdinalIgnoreCase) ||
                 imageUrl.EndsWith(".bmp", StringComparison.OrdinalIgnoreCase)))
            {
                attributes.Add(FeatureAttributes.IMAGE_URL, imageUrl);
            }
            attributes.Add(FeatureAttributes.POI_USER_NAME + ":" + language, page.LastRevision.UserName);
            attributes.Add(FeatureAttributes.POI_USER_ADDRESS + ":" + language, _wikiSites[language].SiteInfo.MakeArticleUrl($"User:{Uri.EscapeUriString(page.LastRevision.UserName)}"));
            attributes.Add(FeatureAttributes.POI_LAST_MODIFIED + ":" + language, page.LastRevision.TimeStamp.ToString("o"));
            var feature = new Feature(new Point(coordinate), attributes);

            feature.SetTitles();
            feature.SetId();
            return(feature);
        }
示例#27
0
        public void TrySerialize_With_Nan_3dCoordinate()
        {
            var type  = new GeoJsonPositionType();
            var input = new CoordinateZ(1, 2, double.NaN);

            var result = type.TrySerialize(input, out object?value);

            Assert.True(result);
            Assert.Equal(2, Assert.IsType <double[]>(value).Length);
            Assert.Equal(new[] { 1D, 2D }, Assert.IsType <double[]>(value));
        }
示例#28
0
        public void ParseValue_With_3Valid_Coordinates()
        {
            var type       = new GeoJsonPositionType();
            var coordinate = new CoordinateZ(1.1, 2.2, 3.3);

            IValueNode result = type.ParseValue(coordinate);

            Assert.Equal("1.1", Assert.IsType <ListValueNode>(result).Items[0].Value);
            Assert.Equal("2.2", Assert.IsType <ListValueNode>(result).Items[1].Value);
            Assert.Equal("3.3", Assert.IsType <ListValueNode>(result).Items[2].Value);
        }
示例#29
0
        public void TestCompareTo()
        {
            var lowest         = new CoordinateZ(10.0, 100.0, 50.0);
            var highest        = new CoordinateZ(20.0, 100.0, 50.0);
            var equalToHighest = new CoordinateZ(20.0, 100.0, 50.0);
            var higherStill    = new CoordinateZ(20.0, 200.0, 50.0);

            Assert.AreEqual(-1, lowest.CompareTo(highest));
            Assert.AreEqual(1, highest.CompareTo(lowest));
            Assert.AreEqual(-1, highest.CompareTo(higherStill));
            Assert.AreEqual(0, highest.CompareTo(equalToHighest));
        }
示例#30
0
        public void TrySerialize_With_Valid_3dCoordinate()
        {
            // arrange
            var type  = new GeoJsonPositionType();
            var input = new CoordinateZ(1, 2, 100);

            // act
            var result = type.TrySerialize(input, out object?value);

            // assert
            Assert.True(result);
            Assert.Equal(3, Assert.IsType <double[]>(value).Length);
            Assert.Equal(new[] { 1D, 2D, 100D }, Assert.IsType <double[]>(value));
        }
示例#31
0
        public GeomagnetismResult(CoordinateZ coordinate, DateTime date, double x, double y, double z)
        {
            Date = date;
            Coordinate = coordinate;
            if ((Math.Abs(x - 0.0) < double.Epsilon * 2 || Math.Abs(y - 0.0) < double.Epsilon * 2))
                return;

            X = x;
            Y = y;
            Z = z;

            HorizontalIntensity = Math.Sqrt(x * x + y * y);
            TotalIntensity = Math.Sqrt(x * x + y * y + z * z);
            Declination = Math.Atan2(y, x).ToDegrees();
            Inclination = Math.Atan2(z, HorizontalIntensity).ToDegrees();
        }
示例#32
0
        private bool TryParseCoordinate(JsonArray coordinates, out Coordinate result)
        {
            result = null;
            if (coordinates == null || coordinates.Count < 2)
                return false;

            var valid = coordinates.All(x => x is double || x is long);
            if (!valid)
                return false;

            if (coordinates.Count == 2)
                result = new Coordinate(Convert.ToDouble(coordinates[1]), Convert.ToDouble(coordinates[0]));
            else if (coordinates.Count == 3)
                result = new CoordinateZ(Convert.ToDouble(coordinates[1]), Convert.ToDouble(coordinates[0]), Convert.ToDouble(coordinates[2]));
            else
                result = new CoordinateZM(Convert.ToDouble(coordinates[1]), Convert.ToDouble(coordinates[0]), Convert.ToDouble(coordinates[2]), Convert.ToDouble(coordinates[3]));
            return true;
        }
示例#33
0
文件: Circle.cs 项目: spadger/Geo
 public Circle(double latitiude, double longitude, double elevation, double radius)
 {
     Center = new CoordinateZ(latitiude, longitude, elevation);
     Radius = radius;
 }
示例#34
0
文件: Point.cs 项目: spadger/Geo
 public Point(double latitude, double longitude, double elevation)
 {
     Coordinate = new CoordinateZ(latitude, longitude, elevation);
 }
示例#35
0
文件: Fix.cs 项目: asapostolov/Geo
 public Fix(double latitude, double longitude, double elevation, DateTime dateTime)
 {
     Coordinate = new CoordinateZ(latitude, longitude, elevation);
     TimeUtc = dateTime;
 }