java - 如何使用 Java GeoTools 添加文本并将其显示在 JMapFrame 的 map 内容上?

标签 java geotools

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

    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);

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

    MapContent map = new MapContent();
    map.layers().add(layer);
    JMapFrame.showMap(map);

任何人都可以帮助我在我的点旁边添加文本字符串吗?非常感谢!!!

最佳答案

您需要将 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< 创建符号器 作为要使用的字体(这必须是您计算机上的字体),最后 attributeName 是用于创建标签的数据列(属性)。如果您想要一个固定字符串,那么您可以使用 styleBuilder.createStaticTextSymbolizer它仅使用最后一个参数作为标签文本。

一般来说,对于实际代码,最好使用 StyleBuilder 而不是 SLD 方法来完全控制样式。内部 GeoTools 样式表示为 OGC 样式图层描述符 (SLD),因此 SLD Cookbook可能会有帮助。我在调试时也经常使用这种方法。

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);
  }

这将为上面的代码打印:

<?xml version="1.0" encoding="UTF-8"?><sld:UserStyle xmlns="http://www.opengis.net/sld" xmlns:sld="http://www.opengis.net/sld" xmlns:gml="http://www.opengis.net/gml" xmlns:ogc="http://www.opengis.net/ogc">
  <sld:Name>Default Styler</sld:Name>
  <sld:FeatureTypeStyle>
    <sld:Name>name</sld:Name>
    <sld:Rule>
      <sld:PointSymbolizer>
        <sld:Graphic>
          <sld:Mark>
            <sld:Fill>
              <sld:CssParameter name="fill">#FF0000</sld:CssParameter>
            </sld:Fill>
            <sld:Stroke>
              <sld:CssParameter name="stroke">#FF0000</sld:CssParameter>
            </sld:Stroke>
          </sld:Mark>
          <sld:Size>8.0</sld:Size>
        </sld:Graphic>
      </sld:PointSymbolizer>
    </sld:Rule>
    <sld:Rule>
      <sld:TextSymbolizer>
        <sld:Label>
          <ogc:PropertyName>name</ogc:PropertyName>
        </sld:Label>
        <sld:Font>
          <sld:CssParameter name="font-family">Times New Roman</sld:CssParameter>
          <sld:CssParameter name="font-size">10.0</sld:CssParameter>
          <sld:CssParameter name="font-style">normal</sld:CssParameter>
          <sld:CssParameter name="font-weight">normal</sld:CssParameter>
        </sld:Font>
        <sld:LabelPlacement>
          <sld:PointPlacement>
            <sld:AnchorPoint>
              <sld:AnchorPointX>0.0</sld:AnchorPointX>
              <sld:AnchorPointY>0.5</sld:AnchorPointY>
            </sld:AnchorPoint>
          </sld:PointPlacement>
        </sld:LabelPlacement>
        <sld:Fill>
          <sld:CssParameter name="fill">#000000</sld:CssParameter>
        </sld:Fill>
      </sld:TextSymbolizer>
    </sld:Rule>
  </sld:FeatureTypeStyle>
</sld:UserStyle>

关于java - 如何使用 Java GeoTools 添加文本并将其显示在 JMapFrame 的 map 内容上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54191555/

相关文章:

java - 将 ECQL 从 geotools 转换为 SQL

java - 为什么这总是返回 -99?

Java,正则表达式 : Replace fields in Json by field key

java - ListActivity TwoLineListItem 备选方案

java - 如何在 Android 中以编程方式解压缩文件?

java - 通过 Eclipse 配置 logback 以进行 Tomcat 日志记录

java - GeoTools WebMapServer GetMapRequest 问题

java - 使用 CompositeFeatureCollection 的 FeatureJSON

java - 使用地理工具在多边形中点

java - GeoTiffReader 阻止 deleteOnExit