Updates between September 9, 2019 and December 1, 2019.
- Added
.from_pdalclass method which converts aPDALpython.filterinsargument to a Cloud object.
._build_polygonsis now multithreaded..create_indexis now multithreaded. Closes #65from_dirnow supports glob strings. Closes #66par_applyaccepts optional keyword arguments using theargsparameter. These are passed to the applying function.- Added date-time parsing to collections.
- Removed some deprecated functions that were only used for tree segmentation
- Fixed a bug where
KrausPfeifer1998.classifywas throwing a key error. Closes #62.
- Added
all_returnsmetric, that counts the number of returns in a cell.
- Gridding of points has been simplified. Closes #67.
- Modified
.travis.ymlfor Windows testing environment. - Added additional checks for number of
.laxfiles produced and length of tile change onretile_rasterfor collection testing. Removed printing statements.
0.3.6now officially supports conda installation! Dancing in the streets. Check the README for instructions.
- Version numbers must now be set in both
setup.pyand__init__.pyfor compatibility with conda-forge
Updates between April 20, 2019 and September 9, 2019
A few small maintenance updates and implementation of metrics.
.normalizewrapper now allows for using already classified ground points with theclassifiedargument.
- Added metrics computations for
gridobjects - Finalized the standard set of metrics for both
cloudandgridobjects viastandard_metrics_gridandstandard_metrics_cloud
.watershed_segand.local_maximawere removed. Please see treeseg for new implementations of these methods.
- Added tests for
Cloud.subtract,Raster.force_extent.
Hotixes applied directly to master between April 20, 2019 and 0.4.0 release.
- Fixed bug in
force_extentwhen appending empty arrays to bottom or top dimensions (May 3, 2019)
- Restructured
_construct_tile
Updates between February 10, 2019 and April 20, 2019.
In addition to the new features below, the documentation and user manual
have been unified into one website located here. The pyfor_manual
repository will be deprecated and deleted in the coming months. All of its content has been transferred to the new
website.
- Added
force_extentfunction that allows users to force a specific output bounding box for a raster.
- Revamped
par_applyto take advantage of.laxfiles if they are present. - Added a
.crsattribute to set a collection level coordinate reference system.
- Added a class (
collection.Retiler) and wrapper functions (CloudDataFrame.retile_raster, etc) to assist in setting tile extents for a particular collection. This allows for flexibility when outputting summary rasters and reduced clutter in theCloudDataFrameclass.
- Removed
plotlydependencies and functions. These were not essential to the package, and created a lot of dependencies for the conda installation that are no longer present. - Removed
detectionmodule. This module was poorly maintained and implemented an unoptimized tree detection function. In the coming months I plan to start implementing detection tasks again, but in a more optimized way.
- Added tests for new
par_apply - Testing for commonly loaded
.lasand.lazfields.
Updates between December 4th, 2018 and February 10, 2019. 0.3.3 implements a few structural changes and bug fixes.
Its release will be followed by a major restructuring to implement in-memory .laz support in 0.3.4.
- Added warning to
.clipwhen no points are present after the clip. #38 - Minor restructuring to accommodate for a file write bug, addresses #40
- Parallelized
CloudDataFrame.clip
- Fixed a bug where crown segments were misprojected. #37
- For both
Zhang2003andKrausPfeifer1998, changed filter instantiation to reflectscikit-learntype instantiation.
- Implemented single sourcing for package versioning. #43
- Minor adjustments to
environment.ymlto ensure Travis success. #41
Updates between October 25th, 2018 and December 4th, 2018. Note: some of these were applied directly to master before the merging of this branch.
0.3.2 represents many bug fixes and the addition of a few (relatively performant, your mileage may very) functions to collection.
A shoutout to Ben Weinstein, whos diligent bug reporting has made pyfor a friendlier package during this update.
- Fixed a bug with the
nameattribute that returned the entire directory instead of just the filename (without extension) - Added
.subtractfunction, this allows a user to provide their own (properly referenced) DEM for use in normalizing the parent cloud object. Cloud.clipnow resets the index of the points dataframeCloud.data.points- Resolved issues instantiating
Cloudobjects using.lazfiles. - Changed the default normalization algorithm back to
Zhang2003now that it is working properly again (see below). Cloud.convex_hullnow returns a singleshapely.geometry.Polygoninstead ofgeopandas.GeoSeries
- Added
bounding_boxattribute that retrieves the bounding box of the entire collection, used in retiling. - Added
retilefunction to split large acquisitions into smaller tile sizes, for now this just splits into quadrants. - Added
clipfunction to make memory-optimized spatial queries of collections, for example: clipping a collection of field plots. - Made
CloudDataFrame.index_lasandCloudDataFrame.from_dirinto internal functions:CloudDataFrame._index_lasandCloudDataFrame._from_dirrespectively.
- Added a check for empty dataframe before writing to file.
- Improved the structure of
LASDatato prevent writing non-existant columns to file.
- Added
normalizefunction toZhang2003. - Fixed an issue where
KrausPfeifer1998was producing non-sensical normalizations.
Gridnow computes bins starting from the top left of an inputCloud. This fixes a lot of unnecessary array flipping further downstream. A UserWarning was added and will remain in effect until0.3.3.
- Now testing multiple file types,
.ply,.lazand.las - Added
lastoolsandlaxpyto the dependency stack. - Edited ~60% of the docstrings to reflect recent changes. Added cross referenced links and other small improvements.
- Updated the samples to reflect recent changes. Added a few sections to the Normalization and Collections samples.
Updates between October 11th, 2018 and October 25th, 2018
- Refactored
LayerStackingtoAyrey2017to cohere more with the citation format.
- Updated docstrings with 0.3.0 changes.
- Removed
Grid.normalize, a deprecated function - Added a
UserWarningin the case of undefined coordinate reference system of the Cloud object when writing aRaster
- Added many tests to achieve 90% coverage
Updates between September 5, 2018 and October 10th, 2018
- Added 'CloudDataFrame', an inherited class from GeoDataFrame used to manage large LiDAR acquisitions.
- Added
Collectionssample - Adjusted normalization/bem/etc sample with new updates.
- Addressed issues with plotting on Windows 10 - an up-to-date version of PyCharm should work well.
- Added support for
.plyfiles - Changed default normalization algorithm to
ground_filter.KrausPfeifer1998while I debug and restructureground_filter.zhang - Made
CloudDataa base class for the newLASDAtaandPLYDataclasses.
- Changed
Grid.rasterto allow for keyword arguments for passed functions. - Added
DeprecationWarningtorasterizer.Grid.normalize, will be replaced with standalone ground filters in 3.1. - Added
DetectedTopsobject, used for visualizing detected tops from CHM.
- Moved
filtertoground_filter
- Restructued filters into their own Classes, each with
.bem,.classify()and.normalize. Fits better with the structure of the package. - Added Kraus and Pfeifer (1998) ground filter after having some issues with
zhang. This filter is a much simpler ground filter but provides reasonable results.
- Enforcing
rasterio > 1.0requirement which thereby requires use ofconda-forgechannel. - Added
plyfilerequirement (see above)
Updates between August 5, 2018 and September 5, 2018. These updates are minor improvements to set up for 0.3.0 release.
- Moved documentation from ReadTheDocs to brycefrank.com/pyfor
- Updated documentation main page and internal structure
- Fixed broken clip polygons
- Fixed clip sample (from above)
- Added LayerStacking sample
- Several improvements to
detection.LayerStacking
- Added a project indices function, mostly for internal use.
Updates between May 9, 2018 and August 5, 2018.
- Fixed pandas SettingWithCopyWarning after clip + plot, still needs to be tested for performance (i.e. is this copy necessary?)
- Added plotting for custom dimensions for
Cloud.plot3d() - Moved
pyqtgraphimport statements witinCloud.plot3d()to improve import perormance - Added functionality for plotting detected trees. Very rough but functional.
- Added summary functionality, use
print(some_cloud_object)to view.
- Watershed segmentation output was oriented incorrectly, fixed. (Actually was fixed via master, putting here for reference).
- Fixed a bug that produced the wrong axes tick mark labels after modification of the Cloud object.
- Reworked the behavior of
rasterizer.Raster.local_maxima- By default only produces one pixel per detected top, whereas before it was possible to produce many pixels per top. This occurred if the detected top pixels were all equal in height.
- If you prefer this type of behavior, you can set the argument
multi_topto True - The other major rework here is that the function now returns a properly geo-referenced Raster, instead of a raw array. This is much more useful w/r/t I/O.
- Added dedicated detection module
- Added early version of LayerStacking (Ayrey et al. 2017)
- This gets as far as the "Overlap map" in their paper
- Sample forthcoming
- Added an second feature to the testing shapefile.
- Adjusted testing suite to NEON data set for simplicity.
- Test fixes for the above changes.
- Enforcing rasterio version >= 1.0.2 in the environment for use of MemoryFiles (involved with LayerStacking)
Update merged to master: May 9th, 2018
This update was meant to implement features and bug fixes on the tile processing capabilities as well as improve some of the visualization functions. More samples and documentation were added, along with ~90% code coverage. Although the 0.3.0-specific voxelizer.py was added, it is not officially supported in this release.
- Added a watershed segmentation sample.
- Added a clipping sample.
- Improved normalization sample
- Added grid metrics sample with the new
as_rasterargument (see below)
- Added basic
VoxelGridclass with a 3D version of raster
- Added a plot argument to the
rasterizer.Raster.watershed_seg()function. This will plot the segment polygons over the raster object. - Fixed a bug in
rasterizer.Raster.iplot3dthat prevented plotting - Added
rasterizer.Raster._convex_hull_mask, this helps plot interpolated rasters correctly by setting values outside of the convex hull to nan. This will help with future plotting and writing function to be written. columns that describe which dimension and which metric were calculated for the raster in that row. More details can be seen in theGrid_Metricssample.
- Removed the plot function from
rasterizer.Grid, did not seem to fit with the philosophy of the object. - Added
as_rasterargument torasterizer.Grid.metrics, this returns a pandas dataframe of the Raster objects that has
- Added
cloud.Cloud.convex_hull, returns the convex hull of the two dimensional plane. - Reduced
cloud.Cloud.clipto handle only shapely polygons for maintainability.
clip_funcs.poly_clipnow returns the indices of the original input cloud object. This is a cleaner approach than previously implemented.- Some slight adjustments to the other functions to accommodate (1).
- More tests were added.
- Added a sample polygon shapefile: pyfortest/data/clip.shp, this will be used to test the clipping function.
- Moved some import statements to their respective functions to reduce import time of the package.
- Changed the theme of the documentation to something a bit more readable.