[GRASS-dev] trying to amend d.vect.chart - need for advice

Moritz Lennert mlennert at club.worldonline.be
Tue Sep 12 04:20:19 EDT 2006


After an offline discussion with Hamish, I come back to the list, with a 
revised proposal and still some need for advice.

As a reminder, here's the issue:

Moritz Lennert wrote:
> Hello,
> 
> With a colleague we are trying to amend d.vect.chart in order to
> 
> 1) speed it up
> 2) allow a where clause
> 
> Currently, d.vect.chart loops through each vector feature and opens a 
> new db cursor to fetch the column information. On a map with a fair 
> amount of features (20464 centroids) with the table in Postgresql it 
> seems that the db connection is what takes the most of the time (even 
> worse obviously when the map is linked to a view which needs to be 
> recalculated for every feature).
> 
> So currently, the program's logic is as follows (in 
> display/d.vect.chart/plot.c):
> 
> - get number of features (little aside question: why is this done with 
> Vect_get_num_lines() which should return number of lines, not number of 
> features - as you can see I'm very new to the vector library)
> - loop through each feature:
>    - get cat of feature
>    - open cursor selecting columns [and sizecol] for this feature 
> according to cat
>    - close cursor
>    - plot with this info
> 
> We would like to modify this according to the following logic:
> 
> - add a 'where' option
> - open a cursor selecting cat, columns [and sizecol] limited by the 
> where option
> - loop through the cursor:
>    - find x,y values according to cat
>    - plot with this info
> - close cursor
> 

Now, after discussion, there seem to be the following issues with our 
solution:

- If a map is linked to a table containing a lot of lines not linked to 
an object in the map we have to loop through all these lines, with the 
search for x,y failing. This might slow things down again. One path 
towards a solution to this problem would be to get the list of cats from 
the map and include them in the where clause of the cursor select 
statement, but if there are a lot of objects this would be a _very_ long 
where clause which is probably not feasible.

- A given cat value may correspond to several objects, and thus to 
several x,y values. For chart objects, it should probably be considered 
a bug that the same chart is drawn several times on the map. If you want 
to see a country's total population, you don't want to see the same 
circle repeated on every island belonging to this country. But since we 
cannot automatically tell which object is the "mainland", this has to be 
left to the user. But at least we should include a warning before 
painting several times the same chart, so that the user is made aware of 
the issue and can clean up the map of needed.

- The above only works if we have a function that allows us to find the 
x,y value on the basis of a given cat value. I still haven't been able 
to find such a function. Does it exist ?

Thanks to anyone who can point me in the right direction.

Moritz




More information about the grass-dev mailing list