Project pane context menus include new commands for working with related components:
The Show Related command finds all components related to the clicked component and displays them in a dialog as a list.
The concept of related components is asymmetric, the idea is to find all components that will need to change if a specific component changes, but not the other way around. Related components include:
- For a table or query: all drawings and images based on that table or query, all labels based on drawings, all maps that include drawings / images / labels as layers, all layouts that include any of the mentioned components as frames.
- For a drawing: all labels based on that drawing, all maps that include them as layers, all layouts that include them or maps that include them as frames.
- For an image or labels: all maps that include them as layers, all layouts that include them or maps that include them in frames.
- For other components: all layouts that include them as frames.
Finding related components works across all opened data sources. If the list of related components includes components from data sources other than the opened MAP file, the components are sorted by data souce with the innermost data source appearing first (the reverse of the order in the Project pane).
Selecting a component in a list shows components that reference it directly using a distinctive icon on the right. (Eg, selecting a table will put an icon next to all drawings that reference it.)
The Delete Related command finds all components related to the clicked component, displays them in a dialog and allows picking components to delete. The list of related components is reduced to only those components which cannot function without other components on the list (eg, maps are excluded because deleting a drawing will at most delete a map layer and the map will continue to function). Marking a component for deletion marks all components that depend on it for deletion as well. Unmarking a component unmarks all components that it depends on.
The Rename Related command finds all components related to the clicked component, displays them in a dialog and allows picking components to rename. The list of related components is reduced to only those components which cannot function without other components on the list, similarly to Delete Related. Marking a component for rename allows specifying the new name using F2 (or Enter, or double-click). Providing a new name automatically adjusts names of other components marked for rename. Unmarking a component resets the name to the current name.
The Delete Related / Rename Related commands detect read-only data sources and disallow deleting / renaming components on them.
(Caveat: deleting or renaming components using regular means in the Project pane continues to behave as it did before and does not do anything to the related components. In the future, we might make those regular means a little smarter than they currently are, although we don't want to lose being able to, say, rename a component from 'Cities' to 'Cities Temp' and then rename 'Cities Backup' to 'Cities' without making any other changes whatsoever to any other components.)
Component windows no longer close when their main component is renamed and adjust to the new name. All types of renames are supported - those made in the UI as well as in query or script. (The feature requires support from the database that hosts the component, but we believe we adjusted all of the dataports that we have to provide such support. Also, we are currently not tracking renames for components other than the main component of a window - eg, if you open a drawing, creating a virtual map, then drop a second component into the virtual map, we will currently detect if the original drawing is renamed, but not when the second component is renamed. We will extend the feature to track renames of all components. In the meantime, save the virtual map into a real map.)
There are new query functions and transforms to create rasters with Euclidean / shortest paths to points:
- TileDistanceMake / TileDistanceMakePar - take a raster and the distance type, return a distance buffer that can be used in further calls. The distance type can be 0 (Euclidean distance, default), 1 (shortest paths avoid missing pixels) or 2 (shortest paths avoid missing pixels and use values in valid pixels as distance / travel cost). TileDistanceMakePar is a parallel variant.
- TileDistanceTilesClosest / TileDistanceTilesClosestPar - take a distance buffer and a drawing with points, return a raster with each pixel set to the Z of the closest point. (Use the Set Geom Z transform to set Zs to the value that you want.) TileDistanceTilesClosestPar is a parallel variant.
- TileDistanceTilesDirection / TileDistanceTilesDirectionPar - take a distance buffer, a drawing with points and the direction type, return a raster with each pixel set to the direction of the shortest path from the pixel to the closest point. The direction type can be 0 (direction to the closest point, degrees between 0 and 360, Euclidean distances only, default), 1 (direction to the next pixel on the shortest path to the closest point, degrees between 0 and 360, path distances only), 2 (direction to the next pixel on the shortest path to the closest point, quadrant value between 0 and 7, -1 for pixel under the closest point, path distances only), 3 (direction to the next pixel on the shortest path to the closest point, quadrant value between 1 and 8, 0 for pixel under the closest point, path distances only).
- TileDistanceTilesLength / TileDistanceTilesLengthPar - take a distance buffer and a drawing with points, return a raster with each pixel set to the distance from the pixel to the closest point.
- Closest Euclidean, Direction - produces a raster with Euclidean directions, in degrees.
- Closest Euclidean, Distance - produces a raster with Euclidean distances.
- Closest Euclidean, Source - produces a raster with Z values of closest points using Euclidean distances.
- Closest Weighted, Direction - produces a raster with path directions, in degrees. The 'Use equal weights' option switches between just walking around missing pixels and also using pixel values as walking costs.
- Closest Weighted, Length - produces a raster with path distances. The 'Use equal weights' option works as above.
- Closest Weighted, Source - produces a raster with Z values of closest points using path distances. The 'Use equal weights' option works as above.
(In the future, we are planning to extend these functions to allow working with lines and areas, or to start from a raster with pixels pre-filled with IDs of source objects.)
Resolving plateaus for watersheds has been adjusted to use the new algorithm for shortest paths, which produces much more robust results (previously, paths might have varied depending on the order of processing tiles, which is unpredictable for parallel execution) and is a little faster.
There is a new dataport for a folder of LAS / LAZ files ('laslibary'). There is an option to recursively include files in subfolders. The dataport exposes a single composite drawing for all files and manages access to individual files dynamically. If individual LAS / LAZ files are of different detail level, the composite table exposes fields for the most verbose level and files at lower detail levels have fields that they don't have return NULL values. If individual LAS / LAZ files use different coordinate systems, the library picks a random coordinate system and projects data from all files to that system dynamically.
Accessing each LAS / LAZ file in a LAS library for the first time captures some metadata and stores it in JSON format near the file to avoid having to re-capture it later, for better performance.
Spatial indexes used by LAS / LAZ data have been adjusted to perform better, particularly as part if the file is part of a library.
Exporting a drawing to GPKG puts the coordinate system of the drawing in WKT format into the GPKG system table, where it can be accessed by third-party applications. Same for copying and pasting a drawing into a GPKG database.
End of list.
Happy New Year!