-
Notifications
You must be signed in to change notification settings - Fork 6
Description
I'm trying to use the "boundary" method of Cell to get a better outline for dart and skew_quad cells, while displaying a map with cells, cell parents, and parent parents.
I figured I'd need 10 points per side in order for the parents and the "grandsons" to align, which seems to be the case. However, calling boundary is a lot slower than calling vertices, to the point that map display it not interactive any longer.
For reference, this map, produced using vertices(False), takes 2 seconds, which is slow but still acceptable for an output of this size (click to see full size):

This one instead, produced using boundary(10, False), requires 14 seconds, which is too much even for a large output:

I've reduced it to a pure python script and tested the results with "time", to make sure it was not the GeoServer Java code calling onto the interpreter, slowing down things.
Vertices test
from rhealpixdggs import dggs, ellipsoids
from rhealpixdggs.ellipsoids import Ellipsoid
from rhealpixdggs.dggs import RHEALPixDGGS, Cell
WGS84_TB16 = Ellipsoid(a=6378137.0, b=6356752.314140356, e=0.0578063088401, f=0.003352810681182, lon_0=-131.25)
dggs = RHEALPixDGGS(ellipsoid=WGS84_TB16, north_square=0, south_square=0, N_side=3)
cell = dggs.cell(('S', 2, 2, 4))
for i in range(1, 10000):
list(cell.vertices(False)) time python3 /tmp/test_vertices.py
real 0m14,944s
user 0m15,375s
sys 0m1,694s
Boundary test
from rhealpixdggs import dggs, ellipsoids
from rhealpixdggs.ellipsoids import Ellipsoid
from rhealpixdggs.dggs import RHEALPixDGGS, Cell
WGS84_TB16 = Ellipsoid(a=6378137.0, b=6356752.314140356, e=0.0578063088401, f=0.003352810681182, lon_0=-131.25)
dggs = RHEALPixDGGS(ellipsoid=WGS84_TB16, north_square=0, south_square=0, N_side=3)
cell = dggs.cell(('S', 2, 2, 4))
for i in range(1, 10000):
list(cell.boundary(10, False))And output:
>time python3 /tmp/test_boundary.py
real 1m14,551s
user 1m14,906s
sys 0m1,751s
Boundary does more work, so it's normal that it would be slower... but the overhead seem to be too big.
Side note, it would probably interesting to compromise and call the boundary method only on skew_quad and dart cells, but I don't see a method to determine the type of the cell. Is there any obvious test that can be performed to lean about the nature of the cell? I'm guessing that maybe it's just a matter of checking if the top-most parent is either N or S? (edit, this approach seems to work, reduces the time of the "accurate" map down to 6 seconds... which is still too much).