您如何使用Java GeoTools添加文本并将其显示在JMapFrame的地图内容上?

时间:2019-01-15 01:30:52

标签: java geotools

我知道如何在JMapFrame上创建图层并显示点。但是我不知道如何在一个点旁边添加文本字符串?下面是在JMapFrame上显示多个坐标的代码,我认为添加文本字符串将具有类似的代码。请帮忙,谢谢!

#include "cTool.h";

int main (void) {
    // function call from cTool.cpp
    return 0;
}

这就是我创建图层的方式,下面我设法在形状文件上显示我的点。我没有发布所有代码,因为它太多了,但这是常规的实现。

    SimpleFeatureTypeBuilder builder = new SimpleFeatureTypeBuilder();
    builder.setName("feature1");
    builder.setCRS(DefaultGeographicCRS.WGS84);
    builder.add("location", Point.class);
    final SimpleFeatureType TYPE = DataUtilities.createType("Points", "points", "the_geom:MultiPoint");
    SimpleFeatureBuilder featureBuilder = new SimpleFeatureBuilder(TYPE);
    GeometryFactory geometryFactory = (GeometryFactory) JTSFactoryFinder.getGeometryFactory();
    MultiPoint points = geometryFactory.createMultiPoint(coordinates); //be careful of the order
    featureBuilder.add(points);
    SimpleFeature feature = featureBuilder.buildFeature(null);
    DefaultFeatureCollection featureCollection = new DefaultFeatureCollection("internal", TYPE);
    featureCollection.add(feature);
    Style style = SLD.createPointStyle("square", Color.red, Color.red, 1.0f, 8.0f);
    //Style style = SLD.createSimpleStyle(TYPE,Color.RED);
    Layer layer = new FeatureLayer(featureCollection, style);

有人可以帮我在要点旁边添加文本字符串吗?非常感谢!!!

1 个答案:

答案 0 :(得分:1)

您需要在样式中添加TextSymbolizer才能绘制文本。

Style style = SLD.createPointStyle("square", Color.red, Color.red, 1.0f, 8.0f);
StyleBuilder styleBuilder = new StyleBuilder();
String attributeName = "name";
Font font = styleBuilder.createFont("Times New Roman", 10.0);
TextSymbolizer textSymb = styleBuilder.createTextSymbolizer(Color.black, font, attributeName);
Rule rule = styleBuilder.createRule(textSymb);
style.featureTypeStyles().get(0).rules().add(rule);

应该这样做。关键行是TextSymbolizer textSymb = styleBuilder.createTextSymbolizer(Color.black, font, attributeName);,它使用Black作为文本颜色,font作为要使用的字体(这必须是您计算机上的字体)创建符号化器,最后使用{{1} }是应用于创建标签的数据列(属性)。如果您想要一个固定的字符串,则可以使用styleBuilder.createStaticTextSymbolizer,它仅将最后一个参数用作标签文本。

通常对于真实代码,最好使用attributeName而不是StyleBuilder方法来完全控制样式。内部GeoTools样式表示为OGC样式层描述符(SLD),因此SLD Cookbook可能会有所帮助。在调试时,我也会定期使用此方法。

SLD

将为上面的代码打印它:

private static void printStyle(Style style) throws TransformerException {

    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    SLDTransformer transformer = new SLDTransformer();
    transformer.setIndentation(2);
    transformer.transform(style, bos);
    String styleStr = bos.toString();
    System.out.println(styleStr);
  }