Subscribe to this thread
Home - General / All posts - Accurate Geographic Circles and Buffers around a point?
hgmonaro45 post(s)
#15-Aug-14 06:05

I have a map with 3 drawing layers called Points, Buffers & Manual Circles. I add a point on the point layer then add a geographic circle of 1 kilometer radius to the Manual Circles layer centered on the point. I then add a buffer around the point of 1000m (1km) using the Buffer action on the toolbar and both circles 'line up'. Measuring the radius with the Tracker agrees it's 1km radius. All good!

Now I create another project but I start with a image layer of Google Maps Street Map, then add my drawing layers and add my point, the manual circle and the 1000m buffer. The 2 circles are not the same radius, the buffer is accurate but the manually added geographic circle is bigger (approx 1275m).

I've played around with Local Scale & Scale Correction factor in the projection but that doesn't seem to do much and doesn't explain why the manually added circle doesn't get added accurately in the 1st place.

Any ideas on what I'm doing wrong? or any suggestions for drawing circles around points automatically (too many to add manually and want to be able to change the distance easily)

Also, is there a setting to make the buffers command 'draw' using more points? Geographic circles can have 99 divisions and look round, the buffer have less (32) and look 'clunky'

tjhb
10,094 post(s)
#15-Aug-14 10:37

The fundamental point here--and the need for caution--is that Buffer always creates a "circle" in the current coordinate system, while a Geographic Circle is always created in unprojected geographic space.

They're *always* different (however wildly, or slightly), unless the current projection is Latitude/Longitude.

So try not to think of a Geographic Circle as a "manually added circle". It may or may not give a visual circle.

Similarly, Buffer only gives a circular polygon in the current coordinate system. After reprojection it will no longer be circular.

Decide what kind of circle you need, in what projection.

On the 32-circle thing, that's a good point. The answer is that Buffers always have only 32 segments (thus the "scare quotes" above). Yes, you can get around this by using a query or script to create a circle with any number of segments. (You can write your own code for this, or just ask for something already written.)

tjhb
10,094 post(s)
#15-Aug-14 23:11

This line is wrong--

They're *always* different (however wildly, or slightly), unless the current projection is Latitude/Longitude.

--since the same is true even if the current projection is Latitude/Longitude. Barring equatorial and polar cases.

tjhb
10,094 post(s)
#18-Aug-14 04:15

I left out the importance of this paragraph.

Now I create another project but I start with a image layer of Google Maps Street Map, then add my drawing layers and add my point, the manual circle and the 1000m buffer. The 2 circles are not the same radius, the buffer is accurate but the manually added geographic circle is bigger (approx 1275m).

You don't mention the projection used for this map explicitly (or for the other map for that matter), but I think it must be WGS 84 (Auto), which is a kind of Mercator projection.

Mercator is not usually a good projection for measuring distances or, therefore, drawing buffers in. Distances are inflated in the horizontal axis, the more so as you move away from the Equator.

So in this case, the geographic circle is likely to be much more accurate than the buffer. At this location, a radius of 1000m measured in the Mercator projection probably measures about 1000 * (1000 / 1275) = 784m on the ground. The geographic circle won't look quite round (but is, on the ground), while the Mercator buffer will look round (but isn't).

hgmonaro45 post(s)
#18-Aug-14 04:36

thanks tjgb. the Google Maps image does say "Mercator / World Geodetic 1984 (WGS84) Auto" so your explantion seems reasonable. I thought I had tried to 'match' the drawing layers to the Google image thinking this might have been the issue but maybe in my confusion didn't hit that combo... however adding circles via code (with higher no of segments) would be preferable, can you suggest some code to do this (preferably VBScript as I think I'll be up to converting an example to my map & layers)

tjhb
10,094 post(s)
#18-Aug-14 04:54

This query (SQL not vbscript, sorry about that) will draw a circle of user-defined radius using an arbitrary number of coordinates (< 10000) around each selected point in [Drawing].

Note that like the Buffers transform, this draws in the current projection, whatever that is, not in geographic space. So it has the same limitation; the radius is only as accurate as distances in the current projection at the given location.

Anything else is possible, though, if you say more about what you need.

PARAMETERS [Radius] DOUBLE[Coordinates] SINGLE;

INSERT INTO [Drawing] ([Geom (I)])

SELECT ConvertToArea(AllCoords([point]))

FROM

    (SELECT 

        NewPoint(

            [X (I)] + [Radius] * Sin([angle]),

            [Y (I)] + [Radius] * Cos([angle])

            ) AS [point]

    FROM

        (SELECT TOP [Coordinates]

            2 * [pi] / [Coordinates] * [n] AS [angle]

        FROM

            (VALUES (4 * Atn(1)) NAMES ([pi]))

            CROSS JOIN 

            (SELECT

--                [1e4] * 1e4 +

                [1e3] * 1e3 +

                [100] * 100 + 

                [ten] * 10 + 

                [one] AS [n]

            FROM

--                (VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9) NAMES ([1e4]))

--                CROSS JOIN

                (VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9) NAMES ([1e3]))

                CROSS JOIN

                (VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9) NAMES ([100]))

                CROSS JOIN

                (VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9) NAMES ([ten]))

                CROSS JOIN

                (VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9) NAMES ([one])))

        )

        LEFT JOIN 

        [Drawing]

        ON [Drawing].[Selection (I)]

    );

Attachments:
Draw circle a (area).txt

hgmonaro45 post(s)
#18-Aug-14 05:43

have copied that into a query and added a single point to a layer named 'Drawing'. Selected the point and run the query, which adds an area to the Drawing layer, but the coordinates are 90 (Lat) 23.0382 (lon) and the 'area' actualy looks like a straight line rather than a 2dim area (circle or elipse). I tried adding more points and it still draws a single straight line. Unfortunately, the SQL is too complex for me to understand what it's trying to do. I'll try posting my .map file so show you what I've got.

What I 'want to do', is draw either 2 or 3 kilometer circles around my points and to be able to remove and re-add using a different radius easily.

Attachments:
Circles.map

tjhb
10,094 post(s)
#18-Aug-14 06:34

Interesting (not in a good way!). Let me try to figure out why.

Do you *need* to work in WGS 84 (Auto)--the projection of Google Maps/Google Earth/Bing Maps? At first sight it looks as if its geometry quirks may be the cause here. (Though if that's the case, it's odd that it hasn't come up before.)

tjhb
10,094 post(s)
#18-Aug-14 07:11

The problem seems to apply to the Mercator projection (not specifically using datum WGS 84 (Auto)), iff the coordinates are a long way from the projection centre. It may apply to other projections as well, in the same way. Further testing required.

tjhb
10,094 post(s)
#18-Aug-14 07:29

No no no, the problem is entirely with me.

We need to assign the correct coordinate system to each new point. (Given this error, it's surprising the discrepancy wasn't worse.)

Please use this corrected query. I apologise for the error.

PARAMETERS [Radius] DOUBLE[Coordinates] SINGLE;

INSERT INTO [Drawing] ([Geom (I)])

SELECT 

    ConvertToArea(AllCoords([point]))

FROM

    (SELECT 

        AssignCoordSys(

            NewPoint(

                [X (I)] + [Radius] * Sin([angle]),

                [Y (I)] + [Radius] * Cos([angle])

                ),

            CoordSys("Drawing" AS COMPONENT)

            ) AS [point]

    FROM

        (SELECT TOP [Coordinates]

            2 * [pi] / [Coordinates] * [n] AS [angle]

        FROM

            (VALUES (4 * Atn(1)) NAMES ([pi]))

            CROSS JOIN 

            (SELECT

--                [1e4] * 1e4 +

                [1e3] * 1e3 +

                [100] * 100 +

                [ten] * 10 +

                [one] AS [n]

            FROM

--                (VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9) NAMES ([1e4]))

--                CROSS JOIN

                (VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9) NAMES ([1e3]))

                CROSS JOIN

                (VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9) NAMES ([100]))

                CROSS JOIN

                (VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9) NAMES ([ten]))

                CROSS JOIN

                (VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9) NAMES ([one])))

        )

        LEFT JOIN 

        [Drawing]

        ON [Drawing].[Selection (I)]

    );

Attachments:
Draw circle a (area).txt

hgmonaro45 post(s)
#18-Aug-14 07:45

no probs (re error) thanks for helping me... that worked with one point selected (although the size of the circle generated wasn't the size I expected), with more points it drew a area around all the selected points. Have to run now, so will do some more testing in the morning!

tjhb
10,094 post(s)
#18-Aug-14 07:56

(For me this has been a lesson in reusing 7-year-old code. Maybe I was an infant then.)

ColinD

2,081 post(s)
#18-Aug-14 11:32

You are a Jedi master and SQL poet now Tim, much to the benefit of many of us. Thanks again


Aussie Nature Shots

tjhb
10,094 post(s)
#19-Aug-14 00:38

I'm rewriting the query with some handy new features. Back soon.

hgmonaro45 post(s)
#19-Aug-14 02:44

a radius of 26750 seems to convert close to 1km... is that a byproduct of the sin/cos calcs?

tjhb
10,094 post(s)
#19-Aug-14 03:49

No that will be a result of the drawing having local scale values other than 1--being based on those of the image.

This can be avoided by reprojecting to use local scale values of 1.

That said, ideally the query would just cope with that itself so you didn't need to think about it. The new version will sort it out.

hgmonaro45 post(s)
#19-Aug-14 05:10

two things... the local scale of the google map (which all the drawing layers are based on) is 0.037ish so 1/that equals 26793, so you were spot on!

secondly, I modified the query to put the circle objects on another layer! hey I was impressed by myself!!

hgmonaro45 post(s)
#19-Aug-14 05:22

spent a few minutes browsing your photos Colin. nice!

valimai
14 post(s)
#19-Aug-14 11:09

Agree! I like all your photo, Collin.

ColinD

2,081 post(s)
#19-Aug-14 21:29

Appreciated, but I think it would be better to leave feedback on my site rather than here


Aussie Nature Shots

tjhb
10,094 post(s)
#31-Aug-14 04:23

OK finally I have things working as they should. Apologies for the delay.

There are now two versions. The first version draws ordinary circles around each selected object in [Drawing], in its native coordinate system, using the radius and the number of coordinates supplied by the user.

As we have discussed (and as discussed in the manual), where the drawing uses a projection that shows significant distortion at the current location (as is often the case with Google/Bing pseudo-projections, and many compromise projections), the "circles" that are drawn will look circular, but not describe accurate circles on the Earth.

To draw accurate circles, we can use Manifold's built-in Geographic Circle function, to draw one circle at a time, or use the second query below. This follows the same method as Geographic Circle, i.e. it draws circles in an Azimuthal Equidistant projection centred on the chosen location, or here, centred on each selected object.

Most of the interesting stuff is in the second query, specifically in making a custom Azimuthal Equidistant projection centred on each object. We currently have to go via the WKT for a default projection, centred at (0, 0), and use regular expressions to splice in custom parameters. (So this is one thing that is miles easier via the object model than in SQL.) The method can easily be adapted for other projections. (The RegExp code is commented at the bottom.)

For both queries, if you don't enter a radius or a number of coordinates, then defaults of 10 units and 32 coordinates are used.

Both queries draw areas. Change one function name to give lines.

The first query is much like the earlier versions above, except that it's fixed to draw a separate circle for each selected object (normally much more useful). The second query is much like Geographic Circle in the GUI, except that it draws any number of circles at a time.

Query 1 (Draw projected circles):

-- Draw a circle about each selected object in [Drawing]

-- in projected (native) space

PARAMETERS

    [Radius (10)] DOUBLE

    [Coordinates (32)] SINGLE;

INSERT INTO [Drawing] ([Geom (I)])

SELECT ConvertToArea(AllCoords([arc point]))

FROM

    (SELECT

        [ID]

        AssignCoordSys(

            NewPoint(

                CentroidX([point]) + [r] * Sin([arc]),

                CentroidY([point]) + [r] * Cos([arc])

                ),

            CoordSys("Drawing" AS COMPONENT)

            ) AS [arc point]

    FROM

        (SELECT

            [ID],

            Centroid([Geom (I)]AS [point] -- NB point, for any object type

        FROM [Drawing]

        WHERE [Selection (I)]

        )

        CROSS JOIN

        (SELECT

            [r],

            2 * [pi] / [m] * [n] AS [arc] -- cursor angle in radians

        FROM

            (VALUES (

                Coalesce([Radius (10)], 10), -- default radius 10 units

                Coalesce([Coordinates (32)], 32), -- default 32 coordinates

                4 * Atn(1) -- pi

                )

            NAMES ([r][m][pi])

            )

            LEFT JOIN 

            (SELECT

                [1e3] * 1e3 +

                [100] * 100 +

                [ten] * 10 +

                [one] AS [n]

            FROM

                (VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9) NAMES ([1e3]))

                CROSS JOIN

                (VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9) NAMES ([100]))

                CROSS JOIN

                (VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9) NAMES ([ten]))

                CROSS JOIN

                (VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9) NAMES ([one]))

            )

            ON [n] < [m]

        )

    )

GROUP BY [ID];

Query 2 (Draw geographic circles):

-- Draw a circle about each selected object in [Drawing]

-- in geographic space

-- (using a custom Azimuthal Equidistant projection

-- centred on each object)

PARAMETERS

    [Radius (10)] DOUBLE

    [Coordinates (32)] SINGLE;

INSERT INTO [Drawing] ([Geom (I)])

SELECT ConvertToArea(AllCoords([arc point]))

FROM

    (SELECT

        [ID]

        Project(

            AssignCoordSys(

                NewPoint(

                    CentroidX([point AE]) + [r] * Sin([arc]),

                    CentroidY([point AE]) + [r] * Cos([arc])

                    ),

                [AE local]

                ),

            CoordSys("Drawing" AS COMPONENT)

            ) AS [arc point]

    FROM

        (SELECT

            [ID],

            [AE local],

            Project([point native][AE local]AS [point AE]

        FROM

            (SELECT

                [ID][point native],

                WktToCoordSys(

                    RegExp(

                        RegExp([AE origin WKT],

                            [findCX],

                            CAST(CentroidX([point geographic]AS TEXT)

                            ),

                        [findCY]

                        CAST(CentroidY([point geographic]AS TEXT)

                        )

                    )

                AS [AE local] -- custom Azimuthal Equidistant projection, centred at this point

            FROM

                (SELECT

                    [ID],

                    Centroid([Geom (I)]AS [point native]-- NB point, for any object type

                    Project(Centroid([Geom (I)]), CoordSys("Latitude / Longitude")) AS [point geographic]

                FROM [Drawing]

                WHERE [Selection (I)]

                )

                CROSS JOIN

                (VALUES (

                    -- default Azimuthal Equidistant projection, centred at (0, 0)

                    CoordSysToWkt(COORDSYS("Azimuthal Equidistant")),

                    -- search strings to recentre default Azimuthal Equidistant projection (note 1)

                    "(?<=\[\x22Central_Meridian\x22,)\d+\.?\d*(?=\])",

                    "(?<=\[\x22Latitude_Of_Origin\x22,)\d+\.?\d*(?=\])"

                    )

                    NAMES ([AE origin WKT][findCX][findCY])

                )

            )

        )

        CROSS JOIN

        (SELECT

            [r]

            2 * [pi] / [m] * [n] AS [arc] -- cursor angle in radians

        FROM

            (VALUES (

                Coalesce([Radius (10)], 10), -- default radius 10 units

                Coalesce([Coordinates (32)], 32), -- default 32 coordinates

                4 * Atn(1) -- pi

                )

            NAMES ([r][m][pi])

            )

            LEFT JOIN 

            (SELECT

                [1e3] * 1e3 +

                [100] * 100 +

                [ten] * 10 +

                [one] AS [n]

            FROM

                (VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9) NAMES ([1e3]))

                CROSS JOIN

                (VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9) NAMES ([100]))

                CROSS JOIN

                (VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9) NAMES ([ten]))

                CROSS JOIN

                (VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9) NAMES ([one]))

            )

            ON [n] < [m]

        )

    )

GROUP BY [ID];

-- Notes

-- 1

-- RegExp search strings

-- "(?<=\[\x22Central_Meridian\x22,)\d+\.?\d*(?=\])"

-- "(?<=\[\x22Latitude_Of_Origin\x22,)\d+\.?\d*(?=\])"

--        positive look-behind (preceding text): '["Central_Meridian",' or '["Latitude_Of_Origin",'

--        matched text: one or more digits, optional decimal point, zero or more digits

--        positive look-ahead (following text): ']'

Attachments:
Draw geographic circles.txt
Draw projected circles.txt

tjhb
10,094 post(s)
#03-Sep-14 06:22

One last version. This is an alternative to the first query in the post above--the one drawing circles in projected space.

This version automatically corrects for a drawing whose projection has Local scale values other than 1 (as is the case for a drawing created "under the influence" of an image or a surface, or a map containing one).

I had said it would be nice if the query just handled these cases, drawing circles with the specified radius regardless (not a scaled version of the specified radius--which is not very helpful).

But the main point in posting this query is as an example of correcting for Local Scale values in SQL. The method here is to extract the parameter values from the XML representation of the coordinate system using regular expressions. There's a note breaking down the RegExp search pattern at the end.

(Note that it's not necessary to apply scale correction when drawing geographic circles, since the inherent reprojection takes care of that implicitly. So no change to the second query above.)

-- Draw a circle about each selected object in [Drawing]

-- in projected (native) space

-- (correcting for local scale values if necessary)

PARAMETERS

    [Radius (10)] DOUBLE

    [Coordinates (32)] SINGLE;

INSERT INTO [Drawing] ([Geom (I)])

SELECT ConvertToArea(AllCoords([arc point]))

FROM

    (SELECT

        [ID],

        AssignCoordSys(

            NewPoint(

                CentroidX([point]) + [r] * Sin([arc]) / [localScaleX],

                CentroidY([point]) + [r] * Cos([arc]) / [localScaleY]

                ),

            CoordSys("Drawing" AS COMPONENT)

            ) AS [arc point]

    FROM

        (SELECT

            [ID],

            Centroid([Geom (I)]AS [point] -- NB point, for any object type

        FROM [Drawing]

        WHERE [Selection (I)]

        )

        CROSS JOIN

        (SELECT

            CAST(

                RegExp(

                    [cs xml],

                    "^[\s\S]*(?<=<localScaleX>)([\s\S]+)(?=<\/localScaleX>)[\s\S]*$"

                    "$1")

                AS DOUBLE

                ) AS [localScaleX],

            CAST(

                RegExp(

                    [cs xml],

                    "^[\s\S]*(?<=<localScaleY>)([\s\S]+)(?=<\/localScaleY>)[\s\S]*$"

                    "$1")

                AS DOUBLE

                ) AS [localScaleY]

        FROM

            (VALUES (CAST(CoordSys("Drawing" AS COMPONENTAS TEXT))

            NAMES ([cs xml])

            )

        )

        CROSS JOIN

        (SELECT

            [r],

            2 * [pi] / [m] * [n] AS [arc] -- cursor angle in radians

        FROM

            (VALUES (

                Coalesce([Radius (10)], 10), -- default radius 10 units

                Coalesce([Coordinates (32)], 32), -- default 32 coordinates

                4 * Atn(1) -- pi

                )

            NAMES ([r][m][pi])

            )

            LEFT JOIN 

            (SELECT

                [1e3] * 1e3 +

                [100] * 100 +

                [ten] * 10 +

                [one] AS [n]

            FROM

                (VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9) NAMES ([1e3]))

                CROSS JOIN

                (VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9) NAMES ([100]))

                CROSS JOIN

                (VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9) NAMES ([ten]))

                CROSS JOIN

                (VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9) NAMES ([one]))

            )

            ON [n] < [m]

        )

    )

GROUP BY [ID];

-- Notes

-- RegExp search pattern

-- "^[\s\S]*(?<=<tag>)([\s\S]+)(?=<\/tag>)[\s\S]*$"

--        ^[\s\S]*

--            beginning zero or more of any character (NB including line breaks, which . operator excludes)

--        (?<=<localScaleX>)

--            positive look-behind (preceding text): <tag>

--        ([\s\S]+)

--            capturing group: one or more of any character

--            assumes target value is correctly formed (could check)

--        (?=\<\/localScaleX\>)

--            positive look-ahead (following text): <\tag>

--        [\s\S]*$

--            ending zero or more of any character (including line breaks)

Attachments:
Draw projected circles b.txt

hgmonaro45 post(s)
#11-Sep-14 06:10

thankyou!

hgmonaro45 post(s)
#24-Jun-16 07:09

Tim, I've been using this query successfully but now have the need to identify which circle belongs with which point. I've tried adding field from the Drawing points to the query but not having any luck referencing it correctly. I've added a field to the Circles table called 'Name' and added that to the INSERT statement then added a field to the SELECT below it (temporarily "TEST") which does as intended, however I want a field from the DRAWING table (let's say it's called "NAME"). This nested Select SQL is too complicated for me :( can you advise where I'm supposed to add it to make available for the where the "TEST" bit is?

ie. what I've managed to change

PARAMETERS

[Radius (10)] DOUBLE,

[Coordinates (32)] SINGLE;

INSERT INTO [Circles] ([Geom (I)],[Name] )

SELECT ConvertToArea(AllCoords([arc point])), "TEST"

FROM

tjhb
10,094 post(s)
#24-Jun-16 09:13

That is straightforward but I will need to address it in the morning (NZ time).

hgmonaro45 post(s)
#27-Jun-16 00:57

I've trimmed down my project to the basic components as the table names have changed from above, might be easier to work with. Cheers, Nige

Attachments:
temp.map

hgmonaro45 post(s)
#28-Jun-16 00:57

Well I got it to 'work' however I'm not sure it's the best way... I still don't understand why I can't add a field that's available (I trimmed the query down to the stuff inside that section and it works how I thought it should - NAME is present and correct) to that first SELECT but I can add a random text (ie. "test") to it?

I've added my changes to V2 of the query in attached .map file to bring the NAME field up through the query to where I want it but by making it the GROUP BY element, it was then available to assign in the first SELECT

Attachments:
tempV2.map

hgmonaro45 post(s)
#22-Dec-16 22:39

back again trying to enhance this query slightly but hitting an error I can't work out.

Want to add another field to the final output and have added the field to various SELECT statements, but when I add that field to the first SELECT after the INSERT statement it don't like it, giving an "Incorrect Usage" error. Replacing the field for a text literal works fine.

Q2 select

SELECT ConvertToArea(AllCoords([arc point])), [Name], "Test"

Q3 select

SELECT ConvertToArea(AllCoords([arc point])), [Name], [Store Type]

Q2 works, Q3 fails

EDIT : Just re-read what I found last time and tried that (adding [Store type] to the GROUP BY clause) and it worked!

Attached a revised map file. Q4 include the revised GROUP BY clause

So, if anyone can explain why that's necessary, I'm all ears!

Attachments:
tempV3.map

tjhb
10,094 post(s)
#22-Dec-16 23:10

So you've worked out how to fix it, but not why the change is necessary.

When you use grouping, the source columns fall into two distinct categories.

(a) The column helps to define the group. (For assessing common values.) These columns remain available in the SELECT list.

(b) The column is available within aggregate expressions. (For making new values, one for each group.) These columns can't also be listed separately.

If you need a column to appear in the SELECT list, it must help to define the group. (That's the specifc point for your issue.)

If you need a column to be aggregated, it can't help to define the group.

You could think of the grouping columns as a lens used to look at other columns.

hgmonaro45 post(s)
#22-Dec-16 23:38

thanks for the explanation! now I've just got to remember it for next time (the problem of dabbling part-time in something)

tjhb
10,094 post(s)
#23-Dec-16 00:40

Let me know if the idea of a lens works at all for you. I don't know.

hgmonaro45 post(s)
#13-Jan-17 03:37

Hi Tim, Happy New Year!

After reading your response I reviewed the SQL of many MS-Access queries (not something I've done much of) and could see what you were describing. As for the lens, maybe a telescope or microscope that limits what is visible.

Cheers

Manifold User Community Use Agreement Copyright (C) 2007-2021 Manifold Software Limited. All rights reserved.