如何使用sharpmap渲染一个国家的图像在地球上

时间:2017-10-06 10:06:33

标签: c# .net geolocation sharpmap

我在SQL数据库中有一个区域边框列表,我使用sharpmap为我需要的每个国家渲染缩略图。它的效果非常好。

但是我想更进一步,在它周围添加一个小地球,并将国家放在它的地球上,但我不知道从哪里开始。

这是我到目前为止用来呈现国家拇指的代码。有什么想法吗?

var map = new Map(new Size(command.Width, command.Height));
map.BackColor = Color.Transparent;
var countryGeometry = GeometryFromWKT.Parse(command.CountryLevelWkt);
IProvider countryProvider = new GeometryFeatureProvider(countryGeometry);
var countryLayer = new VectorLayer("country", countryProvider);
var borderColor = System.Drawing.ColorTranslator.FromHtml(command.BorderColor);
countryLayer.Style.EnableOutline = true;
countryLayer.Style.Outline = new Pen(borderColor);
countryLayer.Style.Outline.Width = command.BorderWidth;
countryLayer.Style.Fill = Brushes.Transparent;

var transformationFactory = new CoordinateTransformationFactory();
countryLayer.CoordinateTransformation = transformationFactory.CreateFromCoordinateSystems(
            GeographicCoordinateSystem.WGS84,
            ProjectedCoordinateSystem.WebMercator);
map.Layers.Add(countryLayer);
var bottomLeft = new Coordinate(command.Extents.BottomLeft.Longitude, command.Extents.BottomLeft.Latitude);
var topRight = new Coordinate(command.Extents.TopRight.Longitude, command.Extents.TopRight.Latitude);


// transformations
var bottomLeftLongLat = countryLayer.CoordinateTransformation.MathTransform.Transform(bottomLeft);
var topRightLongLat = countryLayer.CoordinateTransformation.MathTransform.Transform(topRight);
map.ZoomToBox(new Envelope(bottomLeftLongLat, topRightLongLat));
             var img = map.GetMap();
return img;

1 个答案:

答案 0 :(得分:2)

  1. 首先在新地图上绘制所有国家/地区,每个国家/地区都在其自己的图层上。
  2. 绘制您对自己图层感兴趣的国家/地区。
  3. 将地图中心设置为步骤2中图层的Envelope.Center。例如,如果绘制澳大利亚,地图将向左移动。
  4. 将地图渲染为图像。在绘图上绘制图像(System.Drawing.Graphics)。
  5. 重新定位地图,以覆盖空白区域。例如,如果绘制澳大利亚,几乎一直向右移动地图。您需要以编程方式计算这些偏移量。
  6. 将步骤5中的地图渲染为图像。将图像添加到相同的绘图sufrace(请参阅步骤4)。
  7. 重复步骤5-6,覆盖步骤3中制作的渲染下方/上方的空白区域。
  8. 这是一个例子: Sample form with map rendering

    请注意:

    • 澳大利亚位于中心
    • 鼠标指针附近的地图图层之间存在间隙(屏幕截图中的间隙是故意展示逻辑)
    • 有些国家/地区非常庞大(例如俄罗斯)并且获得Envelope.Center将无法正常工作 - 请考虑仅基于最大的多边形进行居中

    这是一个示例Windows Forms project。在示例中,我使用了来自http://thematicmapping.org/downloads/world_borders.php的地图。