Map 组件的使用

发送反馈


Map 组件提供了与地图相关的一系列 GIS 功能,包括清除地图缓存、获取可用的地图名称、量算、查询、地图缩放等。下面以 SuperMap 文件型工作空间为例,构建一个 Map 组件,并对其查询、出图、量算的功能分别加以介绍:

完整的示例代码参见:%SuperMap iServer_HOME%/samples/code/UseJavaAPI/MapComponentSample 位置。

1. Map 组件的初始化

Map 组件(地图组件)可以由地图组件上下文(MapContext)创建,一个完整的地图组件上下文需要设置地图服务组件配置信息和地图服务提供者,其中关于服务提供者的设置,MapContext 提供了设置服务提供者对象和服务提供者配置信息两种方式。

上图为使用 SuperMap 数据构建一个 Map 组件的过程(MapImpl),其中箭头表示初始化的流程,虚线箭头表示在 MapContext 中,另一种设置服务提供者的方式,本文示例的流程跟实线箭头表示的流程一致。即通过地图配置(MapConfig)和 SuperMap 地图服务提供者配置(UGCMapProviderSetting)直接构建地图组件上下文(MapContext),然后由地图组件上下文初始化地图组件(MapImpl 对象),示例代码如下(China400.smwu 工作空间的全路径要根据实际情况修改):

// 初始化 SuperMap 地图服务提供者设置。
UGCMapProviderSetting ugcPSetting = new UGCMapProviderSetting();
// SuperMap 工作空间路径,运行时需按指定路径设置。
String workspacePath = "../../../data/China400/China400.smwu";
if (!new File(workspacePath).exists()) {
      System.out.println(workspacePath + "位置的工作空间不存在,请更换工作空间地址");
      System.exit(0);
}
ugcPSetting.setWorkspacePath(workspacePath);
// 地图服务提供者的地图图片的输出路径。
ugcPSetting.setOutputPath(".\\output");
// 地图服务提供者的地图图片发布站点。
ugcPSetting.setOutputSite("http://localhost");
ugcPSetting.setName("default");
// 地图服务提供者集合,用于初始化地图服务组件上下文。
List<MapProviderSetting> ugcPSettings = new ArrayList<MapProviderSetting>();
ugcPSettings.add(ugcPSetting);
// 初始化地图服务组件上下文。
MapContext mapContext = new MapContext();
mapContext.setMapProviderSettings(ugcPSettings);
// 创建地图服务组件。
MapImpl mapc = new MapImpl(mapContext);

2. 缓冲区查询

缓冲区查询就是在指定的地图上,查询距离指定几何对象一定范围内的几何对象。到指定几何对象的一定距离范围,实际是以指定几何对象为中心的一个圆,在这个圆内以及与圆相交的几何对象都能够被查询出来。

语法如下:

public QueryResult queryByDistance(java.lang.String mapName, Geometry geometry, double distance, QueryParameterSet queryParameterSet)

参数说明:

查询结果为一个 QueryResult 对象,包含多个查询记录集,查询记录集的个数与查询参数中 QueryParameterSet 包含的查询参数的个数一致。

缓冲区查询的示例代码如下:

// 属性查询参数集合。
QueryParameterSet queryParameters = new QueryParameterSet();
QueryParameter[] queryLayerParams = new QueryParameter[1];
queryLayerParams[0] = new QueryParameter();
queryLayerParams[0].name = "China_Capital_P@China400";
// 属性过滤条件,这里设为空。
queryLayerParams[0].attributeFilter = "";
// 返回的属性字段名称(不区分大小写)。
queryLayerParams[0].fields = new String[] { "AdminName", "AdminCode" };
queryParameters.queryParams = queryLayerParams;
// 设置查询结果只包含属性信息。
queryParameters.queryOption = QueryOption.ATTRIBUTE;
// 创建缓冲区查询的参照几何对象,这里为一个三角形的面状对象。
Point2D p1 = new Point2D(12128888.89, 4628888.89);
Point2D p2 = new Point2D(11000000.0, 3500000.0);
Point2D p3 = new Point2D(12128888.89, 3500000.0);
Point2D[] point2ds = { p1, p2, p3 };
Geometry geometry = Geometry.fromPoint2Ds(point2ds, GeometryType.REGION);
// 查询在“China”地图的“China_Capital_P@China400”图层中,距离指定几何对象为100范围内所有的要素。
QueryResult queryResult = mapc.queryByDistance("China", geometry, 100, queryParameters);
mapc.dispose();

3. 根据中心点和比例尺出图

根据中心点和比例尺出图,即在指定的地图中,指定出图的中心点和地图的比例尺,获取指定大小的地图图片。默认生成的地图图片大小是256*256像素。

语法如下:

public MapImage viewByScale(Point2D center, double scale, MapParameter mapParameter, ImageOutputOption outputOption)

参数说明:

获取的结果是一个 MapImage 对象,指定的图片输出格式是二进制流,格式是 PNG ;如果指定的图片输出格式是图片格式,结果(MapImage)中包含指向图片地址的 URI,此时,实际图片位于缓存中,缓存位置在创建地图组件时设定的地图组件配置中指定,本示例中位于".\\output",即当前目录下的 output 子目录。示例代码如下:

注意:服务提供者配置中设置的缓存路径也会起作用,即在两个缓存路径下都会有缓存图片。

// 初始化地图服务组件,参见地图服务组件的初始化。
MapImpl mapc = getMapComponent();
// 中心点坐标。
Point2D center = new Point2D(11000000.0, 3500000.0);
// 出图的比例尺。
double scale = 0.00000003;
// 地图参数,这里使用“China”默认的地图参数。
MapParameter mapParameter = mapc.getDefaultMapParameter("China");
// 图片输出设置,这里设置图片输出格式是 PNG。
ImageOutputOption outputOption = new ImageOutputOption();
mapParameter.returnType = ReturnType.BINARY;
outputOption.format = OutputFormat.PNG;
MapImage mapImage = mapc.viewByScale(center, scale, mapParameter, outputOption);

// 释放地图组件占用的资源
mapc.dispose();

4. 面积量算

面积量算,即在指定的地图中指定一系列坐标点,计算这一系列坐标点围成的面状区域的面积。可以在参数中指定量算的单位。

根据地图名称、二维地理坐标点、量算参数进行面积量算。

语法如下:

public MeasureResult measureArea(java.lang.String mapName, Point2D[] points, MeasureParameter measureParameter)

参数说明:

获取的结果是一个 MeasureResult 对象,其中包含了量算结果的值,和量算的单位。量算的单位为“METER”,则表示最终的结果的单位是“平方米”

Point2D p1 = new Point2D(12128888.89, 4628888.89);
Point2D p2 = new Point2D(11000000.0, 3500000.0);
Point2D p3 = new Point2D(12128888.89, 3500000.0);
Point2D[] point2ds = { p1, p2, p3 };
// 量算参数。
 MeasureParameter measureParameter = new MeasureParameter();
measureParameter.unit = Unit.METER;
// 执行量算。
MeasureResult measureResult = mapc.measureArea("China", point2ds, measureParameter);
// 释放地图组件占用的资源
mapc.dispose();

完整的示例代码参见:%SuperMap iServer_HOME%/samples/code/UseJavaAPI/MapComponentSample 位置。