public static LinesGisLayer GenerateGrid(Game Game, DVector2 leftTop, DVector2 rightBottom, int dimX, int dimY, Color color, MapProjection projection, bool keepQuad = false) { var lt = projection.WorldToTilePos(leftTop.X, leftTop.Y, 0); var rb = projection.WorldToTilePos(rightBottom.X, rightBottom.Y, 0); if (keepQuad) { rb.Y = lt.Y + (rb.X - lt.X); } double stepX = Math.Abs(rb.X - lt.X) / (dimX - 1); double stepY = Math.Abs(rb.Y - lt.Y) / (dimY - 1); List<Gis.GeoPoint> points = new List<Gis.GeoPoint>(); // Too lazy for (int row = 1; row < dimY-1; row++) { for (int col = 0; col < dimX-1; col++) { var coords0 = projection.TileToWorldPos(lt.X + stepX * col, lt.Y + stepY * row, 0); var coords1 = projection.TileToWorldPos(lt.X + stepX * (col+1), lt.Y + stepY * row, 0); points.Add(new Gis.GeoPoint { Lon = DMathUtil.DegreesToRadians(coords0.X), Lat = DMathUtil.DegreesToRadians(coords0.Y), Color = color }); points.Add(new Gis.GeoPoint { Lon = DMathUtil.DegreesToRadians(coords1.X), Lat = DMathUtil.DegreesToRadians(coords1.Y), Color = color }); } } for (int col = 1; col < dimX-1; col++) { for (int row = 0; row < dimY-1; row++) { var coords0 = projection.TileToWorldPos(lt.X + stepX * col, lt.Y + stepY * row, 0); var coords1 = projection.TileToWorldPos(lt.X + stepX * col, lt.Y + stepY * (row+1), 0); points.Add(new Gis.GeoPoint { Lon = DMathUtil.DegreesToRadians(coords0.X), Lat = DMathUtil.DegreesToRadians(coords0.Y), Color = color }); points.Add(new Gis.GeoPoint { Lon = DMathUtil.DegreesToRadians(coords1.X), Lat = DMathUtil.DegreesToRadians(coords1.Y), Color = color }); } } var linesLayer = new LinesGisLayer(Game, points.Count); Array.Copy(points.ToArray(), linesLayer.PointsCpu, points.Count); linesLayer.UpdatePointsBuffer(); linesLayer.Flags = (int)(LineFlags.THIN_LINE); return linesLayer; }
public static PolyGisLayer GenerateRegularGrid(Game engine, double left, double right, double top, double bottom, int density, int dimX, int dimY, MapProjection projection) { int[] indexes; Gis.GeoPoint[] vertices; CalculateVertices(out vertices, out indexes, density, left, right, top, bottom, projection); //var vb = new VertexBuffer(Game.Instance.GraphicsDevice, typeof(Gis.GeoPoint), vertices.Length); //var ib = new IndexBuffer(Game.Instance.GraphicsDevice, indexes.Length); //ib.SetData(indexes); //vb.SetData(vertices, 0, vertices.Length); return new PolyGisLayer(engine, vertices, indexes, false); }
static protected void CalculateVertices(out Gis.GeoPoint[] vertices, out int[] indeces, int density, double leftLon, double rightLon, double topLat, double bottomLat, MapProjection projection) { int RowsCount = density + 2; int ColumnsCount = RowsCount; var ms = projection; var verts = new List<Gis.GeoPoint>(); var leftTop = ms.WorldToTilePos(leftLon, topLat, 0); var rightBottom = ms.WorldToTilePos(rightLon, bottomLat, 0); double left = leftTop.X; double right = rightBottom.X; double top = leftTop.Y; double bottom = rightBottom.Y; float step = 1.0f / (density + 1); double dStep = 1.0 / (double)(density + 1); for (int row = 0; row < RowsCount; row++) { for (int col = 0; col < ColumnsCount; col++) { double xx = left * (1.0 - dStep * col) + right * dStep * col; double yy = top * (1.0 - dStep * row) + bottom * dStep * row; var sc = ms.TileToWorldPos(xx, yy, 0); var lon = sc.X * Math.PI / 180.0; var lat = sc.Y * Math.PI / 180.0; verts.Add(new Gis.GeoPoint { Tex0 = new Vector4(step * col, step * row, 0, 0), Lon = lon, Lat = lat }); } } var tindexes = new List<int>(); for (int row = 0; row < RowsCount - 1; row++) { for (int col = 0; col < ColumnsCount - 1; col++) { tindexes.Add(col + row * ColumnsCount); tindexes.Add(col + (row + 1) * ColumnsCount); tindexes.Add(col + 1 + row * ColumnsCount); tindexes.Add(col + 1 + row * ColumnsCount); tindexes.Add(col + (row + 1) * ColumnsCount); tindexes.Add(col + 1 + (row + 1) * ColumnsCount); } } vertices = verts.ToArray(); indeces = tindexes.ToArray(); }
public static HeatMapLayer GenerateHeatMapWithRegularGrid(Game engine, double left, double right, double top, double bottom, int density, int dimX, int dimY, MapProjection projection) { int[] indexes; Gis.GeoPoint[] vertices; var leftTop = projection.WorldToTilePos(left, top, 0); var rightBottom = projection.WorldToTilePos(right, bottom, 0); double newleft = leftTop.X; double newright = rightBottom.X; double newtop = leftTop.Y; double newbottom = newtop + (newright - newleft); var newRightBottom = projection.TileToWorldPos(newright, newbottom, 0); bottom = newRightBottom.Y; CalculateVertices(out vertices, out indexes, density, left, right, top, bottom, projection); return new HeatMapLayer(engine, vertices, indexes, dimX, dimY, false) { Left = newleft, Right = newright, Top = newtop, Bottom = newbottom, GridDensity = density, Projection = projection }; }