Updates between September 9, 2019 and December 1, 2019.
- Added
.from_pdal
class method which converts aPDAL
python.filter
ins
argument to a Cloud object.
._build_polygons
is now multithreaded..create_index
is now multithreaded. Closes #65from_dir
now supports glob strings. Closes #66par_apply
accepts optional keyword arguments using theargs
parameter. 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.classify
was throwing a key error. Closes #62.
- Added
all_returns
metric, that counts the number of returns in a cell.
- Gridding of points has been simplified. Closes #67.
- Modified
.travis.yml
for Windows testing environment. - Added additional checks for number of
.lax
files produced and length of tile change onretile_raster
for collection testing. Removed printing statements.
0.3.6
now officially supports conda installation! Dancing in the streets. Check the README for instructions.
- Version numbers must now be set in both
setup.py
and__init__.py
for compatibility with conda-forge
Updates between April 20, 2019 and September 9, 2019
A few small maintenance updates and implementation of metrics
.
.normalize
wrapper now allows for using already classified ground points with theclassified
argument.
- Added metrics computations for
grid
objects - Finalized the standard set of metrics for both
cloud
andgrid
objects viastandard_metrics_grid
andstandard_metrics_cloud
.watershed_seg
and.local_maxima
were 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_extent
when 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_extent
function that allows users to force a specific output bounding box for a raster.
- Revamped
par_apply
to take advantage of.lax
files if they are present. - Added a
.crs
attribute 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 theCloudDataFrame
class.
- Removed
plotly
dependencies 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
detection
module. 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
.las
and.laz
fields.
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
.clip
when 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
Zhang2003
andKrausPfeifer1998
, changed filter instantiation to reflectscikit-learn
type instantiation.
- Implemented single sourcing for package versioning. #43
- Minor adjustments to
environment.yml
to 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
name
attribute that returned the entire directory instead of just the filename (without extension) - Added
.subtract
function, this allows a user to provide their own (properly referenced) DEM for use in normalizing the parent cloud object. Cloud.clip
now resets the index of the points dataframeCloud.data.points
- Resolved issues instantiating
Cloud
objects using.laz
files. - Changed the default normalization algorithm back to
Zhang2003
now that it is working properly again (see below). Cloud.convex_hull
now returns a singleshapely.geometry.Polygon
instead ofgeopandas.GeoSeries
- Added
bounding_box
attribute that retrieves the bounding box of the entire collection, used in retiling. - Added
retile
function to split large acquisitions into smaller tile sizes, for now this just splits into quadrants. - Added
clip
function to make memory-optimized spatial queries of collections, for example: clipping a collection of field plots. - Made
CloudDataFrame.index_las
andCloudDataFrame.from_dir
into internal functions:CloudDataFrame._index_las
andCloudDataFrame._from_dir
respectively.
- Added a check for empty dataframe before writing to file.
- Improved the structure of
LASData
to prevent writing non-existant columns to file.
- Added
normalize
function toZhang2003
. - Fixed an issue where
KrausPfeifer1998
was producing non-sensical normalizations.
Grid
now 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
,.laz
and.las
- Added
lastools
andlaxpy
to 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
LayerStacking
toAyrey2017
to cohere more with the citation format.
- Updated docstrings with 0.3.0 changes.
- Removed
Grid.normalize
, a deprecated function - Added a
UserWarning
in 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
Collections
sample - 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
.ply
files - Changed default normalization algorithm to
ground_filter.KrausPfeifer1998
while I debug and restructureground_filter.zhang
- Made
CloudData
a base class for the newLASDAta
andPLYData
classes.
- Changed
Grid.raster
to allow for keyword arguments for passed functions. - Added
DeprecationWarning
torasterizer.Grid.normalize
, will be replaced with standalone ground filters in 3.1. - Added
DetectedTops
object, used for visualizing detected tops from CHM.
- Moved
filter
toground_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.0
requirement which thereby requires use ofconda-forge
channel. - Added
plyfile
requirement (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
pyqtgraph
import 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_top
to 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_raster
argument (see below)
- Added basic
VoxelGrid
class 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.iplot3d
that 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_Metrics
sample.
- Removed the plot function from
rasterizer.Grid
, did not seem to fit with the philosophy of the object. - Added
as_raster
argument 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.clip
to handle only shapely polygons for maintainability.
clip_funcs.poly_clip
now 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.