[GRASS-dev] how to derive polygons (bounding boxes) from text strings

Markus Neteler neteler at osgeo.org
Wed Dec 14 12:16:11 PST 2022


Hello Uwe,

On Fri, Dec 9, 2022 at 10:29 AM <gisfisch at t-online.de> wrote:
>
> Hello list,
>
> I have a point feature layer with attributes for a text string (call it 'label') and the fontsize in map units (which are meters in my case).
>
> Is there a way in Grass to derive polygons (like boundig boxes) from this input information which enclose the label string letter  when those are used to label the points?
>
> For those who know ArcMap: what I mean is exactly what happens when you export Annotation features as Shapes in ArcCatalog: you get a polygon layer in which each text string has a polygon hull which fits the height and width, respectively.
>
> From a developer, I heard that this can be done d_get_text_box from display library, which is not exposed to the end user.

Well, it is exposed to the "C language" end user :-)

For a local test, I have added these lines (as a simple debug output):

git diff display/d.text/
diff --git a/display/d.text/main.c b/display/d.text/main.c
index a5fb7fec7..0aab3db8d 100644
--- a/display/d.text/main.c
+++ b/display/d.text/main.c
@@ -626,10 +626,12 @@ static void draw_text(char *text, double *x,
double *y, double size,
        D_text_rotation(0.0);

     D_get_text_box(text, &t, &b, &l, &r);
+    fprintf(stdout, "t: %.2f, b: %.2f, l: %.2f, r: %.2f\n", t, b, l, r);
     t = D_u_to_d_row(t);
     b = D_u_to_d_row(b);
     l = D_u_to_d_col(l);
     r = D_u_to_d_col(r);
+    fprintf(stdout, "t: %.2f, b: %.2f, l: %.2f, r: %.2f\n", t, b, l, r);

     if (rotation != 0.0)
        D_text_rotation(rotation * 180.0 / M_PI);


I guess it would do what you need - tested in North Carolina sample
data location:

GRASS nc_spm_08_grass7/user1:d.text >

g.region raster=zipcodes_elev_avg
d.mon wx0

# test 1: font size 4
d.text text="This is a test of d.text" color=yellow bgcolor=gray size=4
t: 228897.44, b: 228500.00, l: 626709.08, r: 634951.64
t: -26.02, b: 0.00, l: 3.39, r: 543.13

# test 2: font size 6
d.text text="This is a test of d.text" color=yellow bgcolor=gray size=6
t: 229096.16, b: 228500.00, l: 626735.00, r: 639098.84
t: -39.04, b: 0.00, l: 5.09, r: 814.69


> Since I am not a programmer, I am looking for help how to use d_get_text_box. My goal ist o integrate it in a
> simple Python script which I already have. This script can import Shapefiles, do simple GIS processing using
> GRASS modules and write the shapes back.

The (current) pity is that there is no Python wrapper around the
display library in

https://github.com/OSGeo/grass/tree/main/python/grass/pygrass
https://github.com/OSGeo/grass/tree/main/python/grass/script

> Of course, if coding is necessary to accomplish this, I will pay for it.

Maybe not a hard task to write this Python access to the C function
D_get_text_box() but unfortunately I am lacking time.
Hopefully someone else here is willing to pick up the task.

Best,
Markus

> thank you and best regards, Uwe
>


More information about the grass-dev mailing list