Functions and Templates
There is a new GeomScaleCentered query function that scales a geom around the specified center location. The Scale transform template is adjusted to use that function and scale around the centroid.
There is a new GeomShift query function which calls GeomScaleShift with scales equal to 1, only applying a shift. There is a new GeomScale query function which calls GeomScaleShift with shifts equal to zero, only applying a scale. There is also a new GeomScaleRev function which calls GeomScaleShift with scales equal to 1/scale, unscaling the geom scaled with a previous call to GeomScale back.
There is a new GeomFlip query function that flips a geom horizontally and / or vertically, and a new Flip transform template that calls it.
The GeomFlip / GeomRotate / GeomScale / GeomScaleRev / GeomScaleCentered / GeomScaleShift / GeomShift functions preserve curves in 2d geoms and preserve Z values but not curves for 3d geoms. Caveat: attempting to apply uneven XY scales to a circular arc will currently not convert it to an ellipse arc, and will instead compose a new circular arc that passes the scaled ends and the scaled control point. We are planning to address that in the future (with a slight rework of curves in geoms).
There is a new GeomReverseLine query function that reverses a line, and a new Reverse Line transform template that calls it. Reversing a line preserves curves and Z values.
There is a new GeomIsLineClosed query function that reports whether each branch of a line geom is closed (has the starting coordinate equal to the ending coordinate), and a new Lines, Closed select / transform template that calls it.
There is a new ComponentCoordSystemAutoXY query function that returns the coordinate system for a component and forces the coordinate system for an image to use XY axes. This reflects the fact that for an image, because it is stored in a special way, the axes of a coordinate system are ignored and are always interpreted as XY / XYH, and allows passing the returned coordinate system without any further modifications to the coordinate converter object. Queries generated by the UI tools have been modified to use the new function instead of ComponentCoordSystem.
The CoordConvertTile query function allows specifying interpolation type: 0 = nearest neighbor (the only former option), 1 = bilinear, 2 = bicubic. If the interpolation type is set to a negative value (auto), the function will use nearest neighbor, for compatibility with previous builds and due to the principle of least surprise.
The CoordConvertTileSet / Par query functions are renamed to CoordConvertTileSetDirect / Par. There are new CoordConvertTileSet / Par query functions that use the standard projection method, allow specifying interpolation type and return the projected image as a table. The result tables returned by the CoordConvertTileSetXxx functions (all four) support a BTREE index on XY fields, which allows efficiently using them in a join directly without having to copy the returned data into a different table.
(A tech note on performance of query functions for projecting images: for the standard projection method there are thus two ways to perform the projection with multiple threads - either use CoordConvertTile in a SELECT with THREADS, or use CoordConvertTileSetPar. The CoordConvertTileSetPar should generally be able to arbitrate threads better. If the result of the projection will be used as a temporary table in a join, the use of CoordConvertTileSetPar is thus preferable. However, if the result of the projection will simply be used to populate a persistent table, it is better to use CoordConvertTile because this will avoid creating a copy of the projected image in memory.)
There is a new GeomCoordLine query function that takes a line and a distance and returns the coordinate on a line at the specified distance from its start. The function considers all line branches - if the first branch ends before the specified distance, the function moves on to check the second branch and so on, until the distance is reached. If the distance is negative or bigger than the total length of all line branches, the function returns a NULL value. There is a new Line Coordinate transform template (available when used on a field of x2 type, we'll perhaps rework it so that it should be used with a geom field instead) that uses the function.
There is a new GeomToCoordsLineSequence query function that takes a line and returns a sequence of coordinates at the specified distances on a line. The distances are specified as begin distance, end distance and step, similarly to ValueSequence. The step can be positive or negative. (Eg, for begin = 0, end = 5, step = 1, the function will return coordinates at 0, 1, 2, 3, 4, 5, and for begin = 5, end = 0, step = -1, the function will return coordinates at 5, 4, 3, 2, 1, 0.) One or both of begin / end can be outside of the line. (Eg, for begin = -2, end = 50, step = 10, the function will return coordinates at 8, 18, 28, 38, 48.) The coordinates are returned as a table with two fields: distance from the start (Value) and coordinate (XY). There is a new Decompose to Line Coordinates transform template that uses the function.
There is a new CoordSystemScaleXYToUnit query function which takes a coordinate system and a unit name and returns the XY scale required to scale the geom in the coordinate system to the specified unit. If the specified coordinate system and unit are incompatible (eg, the coordinate system is metric, but the unit name is 'degree'), the function returns a NULL value.
(The idea behind CoordSystemScaleXYToUnit is to use it together with GeomScale / GeomScaleRev instead of more complex coordinate converter functions, to perform measurements in the desired units when the math required is minimal. Eg, if you want to find a location on a line 2 miles from the start of the line, you could call CoordSystemScaleXYToUnit and pass 'mi' to get the scale required to convert the line coordinates into miles, call GeomScale with that scale on a line, call GeomCoordLine and pass 2 as a distance, then convert the returned x2 value to a geom using GeomMakePoint, and finally call GeomScaleRev with the exact same scale as before to convert the created geom to the coordinate system of the line.)
(Fix) The TileGeomXxx query functions used in the Join dialog for raster to vector joins no longer fail to produce values for some of the lines.
Trying to use a transform that needs to know the bounds of a map layer on a layer based on a query that does not know them auto-computes the bounds (instead of silently failing).
The Join dialog copies tile reduce / tile size / tile type properties for newly created tile fields.
The Reproject Component dialog for an image allows specifying interpolation type: nearest neighbor (the only former option), bilinear (the default since this build), bicubic.
End of list.