如何使用 Java GeoTools 添加文本并将其显示在 JMapFrame 的地图内容上?
How do you use Java GeoTools to add text and display them on JMapFrame's map content?
我知道如何在 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);
这就是我创建图层的方式,下面我设法在形状文件上显示我的点。我没有 post 我所有的代码,因为它太多了,但这是一般的实现。
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>
我知道如何在 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);
这就是我创建图层的方式,下面我设法在形状文件上显示我的点。我没有 post 我所有的代码,因为它太多了,但这是一般的实现。
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>