public override bool Draw(RenderContext11 renderContext, float opacity, bool flat) { if (shapefile == null) { return(false); } if (shapeFileVertex == null) { List <Vector3> vertList = new List <Vector3>(); List <UInt32> indexList = new List <UInt32>(); UInt32 firstItemIndex = 0; Vector3 lastItem = new Vector3(); bool firstItem = true; bool north = true; double offsetX = 0; double offsetY = 0; double centralMeridian = 0; double mapScale = 0; double standardParallel = 70; if (shapefile.Projection == ShapeFile.Projections.PolarStereo) { north = shapefile.FileHeader.ProjectionInfo.Name.ToLower().Contains("north"); standardParallel = shapefile.FileHeader.ProjectionInfo.GetParameter("standard_parallel_1"); centralMeridian = shapefile.FileHeader.ProjectionInfo.GetParameter("central_meridian"); mapScale = shapefile.FileHeader.ProjectionInfo.GetParameter("scale_factor"); offsetY = shapefile.FileHeader.ProjectionInfo.GetParameter("false_easting"); offsetX = shapefile.FileHeader.ProjectionInfo.GetParameter("false_northing"); } UInt32 currentIndex = 0; Color color = Color; int count = 360; for (int i = 0; i < shapefile.Shapes.Count; i++) { if (shapefile.Shapes[i].GetType() == typeof(Polygon)) { Polygon p = (Polygon)shapefile.Shapes[i]; for (int z = 0; z < p.Rings.Length; z++) { count = (p.Rings[z].Points.Length); // content from DBF DataRow dr = p.Rings[z].Attributes; for (int k = 0; k < p.Rings[z].Points.Length; k++) { // 2D Point coordinates. 3d also supported which would add a Z. There's also an optional measure (M) that can be used. double Xcoord = p.Rings[z].Points[k].X; double Ycoord = p.Rings[z].Points[k].Y; if (shapefile.Projection == ShapeFile.Projections.Geo) { lastItem = Coordinates.GeoTo3d(Ycoord, Xcoord); } else if (shapefile.Projection == ShapeFile.Projections.PolarStereo) { lastItem = Coordinates.SterographicTo3d(Xcoord, Ycoord, 1, standardParallel, centralMeridian, offsetX, offsetY, mapScale, north).Vector3; } if (k == 0) { firstItemIndex = currentIndex; firstItem = true; } vertList.Add(lastItem); if (firstItem) { firstItem = false; } else { indexList.Add(currentIndex); currentIndex++; indexList.Add(currentIndex); } } indexList.Add(currentIndex); indexList.Add(firstItemIndex); currentIndex++; } } else if (shapefile.Shapes[i].GetType() == typeof(PolygonZ)) { PolygonZ p = (PolygonZ)shapefile.Shapes[i]; for (int z = 0; z < p.Rings.Length; z++) { count = (p.Rings[z].Points.Length); // content from DBF DataRow dr = p.Rings[z].Attributes; for (int k = 0; k < p.Rings[z].Points.Length; k++) { // 2D Point coordinates. 3d also supported which would add a Z. There's also an optional measure (M) that can be used. double Xcoord = p.Rings[z].Points[k].X; double Ycoord = p.Rings[z].Points[k].Y; if (shapefile.Projection == ShapeFile.Projections.Geo) { lastItem = Coordinates.GeoTo3d(Ycoord, Xcoord); } else if (shapefile.Projection == ShapeFile.Projections.PolarStereo) { lastItem = Coordinates.SterographicTo3d(Xcoord, Ycoord, 1, standardParallel, centralMeridian, offsetX, offsetY, mapScale, north).Vector3; } if (k == 0) { firstItemIndex = currentIndex; firstItem = true; } vertList.Add(lastItem); if (firstItem) { firstItem = false; } else { indexList.Add(currentIndex); currentIndex++; indexList.Add(currentIndex); } } indexList.Add(currentIndex); indexList.Add(firstItemIndex); currentIndex++; } } else if (shapefile.Shapes[i].GetType() == typeof(PolyLine)) { PolyLine p = (PolyLine)shapefile.Shapes[i]; for (int z = 0; z < p.Lines.Length; z++) { count = (p.Lines[z].Points.Length); firstItem = true; for (int k = 0; k < p.Lines[z].Points.Length; k++) { // 2D Point coordinates. 3d also supported which would add a Z. There's also an optional measure (M) that can be used. double Xcoord = p.Lines[z].Points[k].X; double Ycoord = p.Lines[z].Points[k].Y; if (shapefile.Projection == ShapeFile.Projections.Geo) { lastItem = Coordinates.GeoTo3d(Ycoord, Xcoord); } else if (shapefile.Projection == ShapeFile.Projections.PolarStereo) { lastItem = Coordinates.SterographicTo3d(Xcoord, Ycoord, 1, standardParallel, centralMeridian, offsetX, offsetY, mapScale, north).Vector3; } if (k == 0) { firstItemIndex = currentIndex; firstItem = true; } vertList.Add(lastItem); if (firstItem) { firstItem = false; } else { indexList.Add(currentIndex); currentIndex++; indexList.Add(currentIndex); } } currentIndex++; } } else if (shapefile.Shapes[i].GetType() == typeof(PolyLineZ)) { PolyLineZ p = (PolyLineZ)shapefile.Shapes[i]; for (int z = 0; z < p.Lines.Length; z++) { count = (p.Lines[z].Points.Length); Vector3[] points = new Vector3[(count)]; firstItem = true; for (int k = 0; k < p.Lines[z].Points.Length; k++) { // 2D Point coordinates. 3d also supported which would add a Z. There's also an optional measure (M) that can be used. double Xcoord = p.Lines[z].Points[k].X; double Ycoord = p.Lines[z].Points[k].Y; if (shapefile.Projection == ShapeFile.Projections.Geo) { lastItem = Coordinates.GeoTo3d(Ycoord, Xcoord); } else if (shapefile.Projection == ShapeFile.Projections.PolarStereo) { lastItem = Coordinates.SterographicTo3d(Xcoord, Ycoord, 1, standardParallel, centralMeridian, offsetX, offsetY, mapScale, north).Vector3; } if (k == 0) { firstItemIndex = currentIndex; firstItem = true; } vertList.Add(lastItem); if (firstItem) { firstItem = false; } else { indexList.Add(currentIndex); currentIndex++; indexList.Add(currentIndex); } } currentIndex++; } } else if (shapefile.Shapes[i].GetType() == typeof(ShapefileTools.Point)) { ShapefileTools.Point p = (ShapefileTools.Point)shapefile.Shapes[i]; // 2D Point coordinates. 3d also supported which would add a Z. There's also an optional measure (M) that can be used. double Xcoord = p.X; double Ycoord = p.Y; if (shapefile.Projection == ShapeFile.Projections.Geo) { lastItem = Coordinates.GeoTo3d(Ycoord, Xcoord); } else if (shapefile.Projection == ShapeFile.Projections.PolarStereo) { lastItem = Coordinates.SterographicTo3d(Xcoord, Ycoord, 1, standardParallel, centralMeridian, offsetX, offsetY, mapScale, north).Vector3; } vertList.Add(lastItem); currentIndex++; lines = false; } } shapeVertexCount = vertList.Count; shapeFileVertex = new PositionVertexBuffer11(vertList.Count, RenderContext11.PrepDevice); Vector3[] verts = (Vector3[])shapeFileVertex.Lock(0, 0); // Lock the buffer (which will return our structs) int indexer = 0; foreach (Vector3 vert in vertList) { verts[indexer++] = vert; } shapeFileVertex.Unlock(); shapeIndexCount = indexList.Count; if (lines) { if (indexList.Count > 65500) { isLongIndex = true; shapeFileIndex = new IndexBuffer11(typeof(UInt32), indexList.Count, RenderContext11.PrepDevice); } else { isLongIndex = false; shapeFileIndex = new IndexBuffer11(typeof(short), indexList.Count, RenderContext11.PrepDevice); } if (isLongIndex) { indexer = 0; UInt32[] indexes = (UInt32[])shapeFileIndex.Lock(); foreach (UInt32 indexVal in indexList) { indexes[indexer++] = indexVal; } shapeFileIndex.Unlock(); } else { indexer = 0; short[] indexes = (short[])shapeFileIndex.Lock(); foreach (UInt32 indexVal in indexList) { indexes[indexer++] = (short)indexVal; } shapeFileIndex.Unlock(); } } } renderContext.DepthStencilMode = DepthStencilMode.Off; renderContext.BlendMode = BlendMode.Alpha; SimpleLineShader11.Color = Color.FromArgb((int)(opacity * 255), Color); SharpDX.Matrix mat = (renderContext.World * renderContext.View * renderContext.Projection).Matrix11; mat.Transpose(); SimpleLineShader11.WVPMatrix = mat; SimpleLineShader11.CameraPosition = Vector3d.TransformCoordinate(renderContext.CameraPosition, Matrix3d.Invert(renderContext.World)).Vector3; SimpleLineShader11.ShowFarSide = false; SimpleLineShader11.Sky = false; renderContext.SetVertexBuffer(shapeFileVertex); SimpleLineShader11.Use(renderContext.devContext); if (lines) { renderContext.devContext.InputAssembler.PrimitiveTopology = SharpDX.Direct3D.PrimitiveTopology.LineList; renderContext.SetIndexBuffer(shapeFileIndex); renderContext.devContext.DrawIndexed(shapeFileIndex.Count, 0, 0); } else { renderContext.devContext.InputAssembler.PrimitiveTopology = SharpDX.Direct3D.PrimitiveTopology.PointList; renderContext.devContext.Draw(shapeVertexCount, 0); } renderContext.devContext.InputAssembler.PrimitiveTopology = SharpDX.Direct3D.PrimitiveTopology.TriangleList; return(true); }