使用C1ReportDesigner > 报表中的地图 > 地图使用演练 |
在本演练中,您将看到如何向报表添加一个地图,用来显示美国各州的订单总额,按照各州数据进行汇总。原本不带地图的报表非常简洁,仅列出每一个州的订单总额。以下是全部的数据:
订单总额州名称
16325.15 Alaska
3490.02 California
115673.39 Idaho
1947.24 Montana
52245.9 New Mexico
30393.93 Oregon
31001.65 Washington
12489.7 Wyoming
您将向该报表添加一个地图,并使用颜色范围从绿色(表示该州没有订单)到黄色和红色(取决于订单总额的具体数量)填充每一个州的区域。此外,每一个州还具有一个直径和总金额按比例相关的圆形标记,同时还有一个标签表示总金额。最后您还将添加两个小的插页地图,用来表示阿拉斯加和夏威夷。
注意,该演练将使用以下文件:
完成以下步骤:
向设计器添加一个新的报表,将C1NWindMaps.mdb做为数据源,并使用以下SQL查询:
SELECT Orders.ShipRegion, Orders.ShipCountry, StateNamesGeo.StateName,
Sum([Order Details].UnitPrice*[Order Details].Quantity) AS OrderValue,
(select Longitude from StateNamesGeo where StateNamesGeo.Abbr = Orders.ShipRegion) as Longitude,
(select Latitude from StateNamesGeo where StateNamesGeo.Abbr = Orders.ShipRegion) as Latitude
FROM ((Categories INNER JOIN Products ON Categories.CategoryID = Products.CategoryID)
INNER JOIN (Orders INNER JOIN [Order Details] ON Orders.OrderID = [Order Details].OrderID)
ON Products.ProductID = [Order Details].ProductID)
INNER JOIN StateNamesGeo on Orders.ShipRegion = StateNamesGeo.Abbr
WHERE Orders.ShipCountry = "USA"
GROUP BY Orders.ShipRegion, Orders.ShipCountry, StateNamesGeo.StateName
ORDER BY Orders.ShipRegion;
使用报表向导向内容节区域添加OrderValue和StateName字段,运行报表,确保其正确的显示了以上数据。
请使用以下步骤向报表页眉区域添加一个地图:
1.在报表设计器中,向下拖拽报表页眉区域底部边缘,以便留出足够的空间放置地图。
2.单击Map自定义字段的图标(地球)并拖拽至报表页眉区域。
3.设置地图的尺寸为12870 ×7620twips或者相似尺寸,按照需要对其进行排布。
按照下面的列表设置地图的属性(仅列举了非默认值的属性):
请注意因为我们要显示美国的地图,所以将按照需要手动设置坐标轴(因为我们要在右侧留出足够的空间以显示阿拉斯加和夏威夷两个插页地图)。
打开MarkerStyles集合,添加一个样式。其属性设置如下:
这个样式用来在每一个州的区域绘制一个圆形的标记,其尺寸大小表示订单总额。请注意填充的颜色为半透明,以便在本示例中达到更好的效果。同时请注意标记的尺寸和订单总值的平方根成正比。该样式的名称(msTotalSales)将被用来引用该样式。
您同时也可以根据自己的喜好设置其他一些属性(字体、笔画以及文本颜色等等)。
将全部的州分成六组,按照不同的订单总金额范围:
? 没有任何订单的州
? 订单总金额超过1万美元的州
? 订单总金额介于1万到3万美元之间的州
? 订单总金额介于3万到5万美元之间的州
? 订单总金额介于5万到10万美元之间的州
? 订单总金额大于10万美元的州
因此您需要为每一组创建一个KML项目样式。打开KmlItemStyles集合,添加六个具有不同的FillColor属性值以区分不同分组的州的样式。每个样式的命名大体如上面的分组列表:
名称很重要,我们将在KML项目表达式中按照每一个州的订单总金额的值使用它们来选择一个样式。
我们的地图最重要的部分就是这个KML图层,它将用来显示每一个州的边界并使用合适的颜色对其进行填充。打开地图的Layers集合编辑器并添加一个KML图层。设置其属性如下所示:
? KmlFileName:us_states_abbr.kmz(指定不带路径的文件名将在报表定义文件所在的目录下搜索该文件);
RecordSource:
SELECT Orders.ShipRegion, Sum([Order Details].UnitPrice*[Order Details].Quantity) AS OrderValue FROM (Categories INNER JOIN Products ON Categories.CategoryID = Products.CategoryID) INNER JOIN (Orders INNER JOIN [Order Details] ON Orders.OrderID = [Order Details].OrderID) ON Products.ProductID = [Order Details].ProductID WHERE Orders.ShipCountry = "USA" GROUP BY Orders.ShipRegion ORDER BY Orders.ShipRegion;
ItemFilterExpr: kmlItemName=ShipRegion(确保KML项目表达式,尤其是用来绘制KML项目的样式,市通过当前的KML项目相关的州的数据进行计算的);
KmlVisibleExpr: kmlItemName<>"AK"(确保主地图不显示阿拉斯加);
ItemStyleExpr:
iif (OrderValue > 100000, "ks100kup", iif (OrderValue > 50000, "ks50k100k", iif (OrderValue > 30000, "ks30k50k", iif (OrderValue > 10000, "ks10k30k", iif (OrderValue > 0, "ks0k10k", "ksNoOrders" )))))
以上表达式按照来自于RecordSource的每一条记录,按照不同的州计算出的OrderValue的值的合计,计算出相应的KML样式的名称(参见前一段中的样式名称定义)。之前指定的ItemFilterExpr属性的值确保某个州的数据已经从KML文件加载。
添加圆形标记。
为了使地图数据更加直观,您也可以在标点层为每个州添加一些圆形标记,标记的大小和州的订单总金额成正比。您可以通过以下步骤做到这一点,首先向Layers集合添加一个PointsLayer,并移动到KML层的上方,使得在地图呈现时,该图层显示在KML图层的上方。设置该图层的属性如下所示:
您需要向地图添加两个图例:一个仅仅是一个标题,位于右上角,另一个是KML项目的颜色列表,位于右下角。
添加插页地图。
我们将为阿拉斯加和夏威夷添加两个额外的插页地图。按照以下步骤:
- 单击Map自定义字段图标,在主地图的左上角绘制两个小一些的地图,上面是阿拉斯加,紧挨着下面一点是 夏威夷。
两个新增的地图将重用主地图定义的样式,因此我们不必添加新的样式到插页地图的样式集合。
- 图层分布和主地图一致,我们为每一个插页地图的Layers集合添加两个图层:
- 一个标点层,MarkerStyleExpr设置为“msTotalSales”,同时MarkerVisibleExpr设置为StateName = "Alaska"(在夏威夷的插页图中,设置为“Hawaii”),其他的属性和主地图保持一致。
- 一个KML图层,全部的属性(包括RecordSource属性)从主地图的KML图层复制过来,最后将ItemVisibleExpr属性设置为kmlItemName="AK"(对于夏威夷,设置kmlItemName="HI")。特别需要提到的是,即使ItemStyleExpr计算出的样式名称引用自其他地图的样式集合,该样式依然能够正常工作。
- 最后,为每一个插页地图添加一个图例,分别显示这两个州的名称。
大功告成。现在可以运行报表,确保我们以上的设置能够正常工作。