Minimum convex polygon
The minimum convex polygon (MCP) is the smallest convex shape that encloses all of an animal’s fixes (Mohr 1947), like a rubber band stretched around the outermost points.
For a p % MCP with p below 100, the app leaves out the fixes farthest from the animal’s centre. It does this the same way as adehabitatHR::mcp (Calenge 2006):
- Find the centre: the mean x and mean y of all fixes.
- Measure the distance from each fix to the centre.
- Keep the fixes whose distance is no more than the pth percentile of those distances. The percentile uses R’s default method (“type 7”), and fixes that tie at the cut-off are kept.
- Draw the MCP around the fixes that are left.
An MCP needs at least 5 fixes.
Kernel density estimate
A kernel density estimate (KDE) turns the fixes into a smooth surface that shows how much the animal used each part of its range. This surface is the utilization distribution. The app places a bivariate normal “bump” of width h (the bandwidth) over every fix and adds them up (Worton 1989; Silverman 1986). The sum is calculated at each node of a regular grid:
f(x) = 1 / (2π n h²) · Σi exp(−|x − Xi|² / 2h²)
As in adehabitatHR, a fix is skipped at a grid node when it is more than 4h from that node in x or y. This leaves out about 0.01 % of each bump.
The grid covers the fixes plus an extent buffer on each side, set as a fraction of the fixes’ range. You can set the grid’s resolution as a number of cells along its longer side or as a fixed cell size.
KDE bandwidth
The bandwidth h is the width of the bump placed over each fix in the kernel density estimate. It applies only to the KDE, not the MCP. A small h gives a patchy range that hugs the fixes, and a large h gives a smoother, wider one. The KDE settings offer three ways to choose h.
Reference bandwidth: href = σ · n−1/6, where σ = √(½ (var x + var y)) and the variances are sample variances. This is the best choice when the fixes come from a single bivariate normal distribution (Silverman 1986). Real ranges often have several centres of activity, and href then tends to oversmooth.
Least-squares cross-validation (LSCV) picks the h that minimizes an estimate of the integrated squared error, a measure of how far the estimated surface is from the true one. In the simulations of Seaman & Powell (1996), fixed kernels with LSCV gave area estimates with little bias. Like adehabitatHR, the app tries 100 bandwidths from 0.1 href to 1.5 href, and warns you if the best one is at either end of that range. Fixes with identical coordinates push LSCV toward ever smaller values of h, so the app reports duplicates.
Manual: you enter h in metres.
KDE isopleths and areas
A p % isopleth is the line around the smallest area that holds p % of the utilization distribution. To find the 95 % isopleth, for example, the app sorts the grid nodes (the cell centres) from highest density to lowest. Going down the list, it adds up density × cell area as a running percentage. Nodes with a running total of 95 % or less are inside the isopleth.
The line between the inside and outside nodes is traced with marching squares. Wherever a cell edge joins an inside node to an outside node, the line crosses that edge at a point interpolated between the two nodes’ values. Cells where the line’s path is ambiguous are handled the same way as in R’s contourLines. An isopleth can be split into several patches and can have holes.
The area shown is the area inside the isopleth minus any holes, as in adehabitatHR’s getverticeshr. The CSV export also gives a cell-count area: the number of cells inside the isopleth times the area of one cell, as in adehabitatHR’s kernel.area. Counting whole cells gives a stair-stepped outline, so the two areas differ slightly. They get closer as the cells get smaller relative to h.
The app warns you when cells are larger than the bandwidth. It also warns when an isopleth reaches the edge of the grid, which means the extent buffer is too small.
Independence and autocorrelation
Standard KDE assumes that each fix is an independent sample from the utilization distribution. GPS fixes taken close together in time usually are not, because where an animal is now depends on where it was an hour ago. This autocorrelation makes standard KDE underestimate home range size. The more often fixes are taken compared with how quickly the animal crosses its range, the bigger the underestimate (Fleming et al. 2015; Noonan et al. 2019).
Autocorrelated KDE (AKDE) corrects for this, and is available in the R package ctmm (Calabrese, Fleming & Gurarie 2016). This app does not do AKDE. Keep that in mind when reading its KDE results, or thin your fixes so they are closer to independent.
Projections
Areas are calculated in metres after projecting the fixes onto a flat map. By default the app uses a Lambert azimuthal equal-area projection (Snyder 1987) centred on the fixes being analysed. Because it is equal-area, areas are exact wherever the animals are. Distances stretch slightly away from the centre (by 0.3 % at 1,000 km), but they only matter for the kernel, and the app tells you if the stretch goes over 0.5 %. This projection has no EPSG code, so exports record it as a PROJ string.
To match other studies, the advanced options also offer automatic UTM and fixed Albers and Lambert systems. UTM is calculated with the transverse Mercator Krüger series to order n⁶ (Karney 2011). UTM is not equal-area: areas are scaled by 0.9992 on the central meridian, and the scale grows farther from it. The app warns when the area scale is off by more than ±0.5 %.
NAD83 and WGS 84 are treated as the same. They differ by only 1–2 m, which does not affect areas.
Validation
Every method was checked against adehabitatHR 0.4.22 using the simulated bears and two example datasets from its companion packages: wild boar at Puéchabon, France, and a GPS-collared brown bear in Sweden.
MCP areas, href and grids match to within 10−14. Densities, cell counts and isopleth areas match to within 10−8. Ambiguous (saddle) cells are resolved using the saddle value of the bilinear surface through the cell’s four nodes, which matched R’s contourLines in every case tested.
LSCV bandwidths match for all but two animals. The LSCV score adds up a term for every pair of fixes, but an indexing quirk in adehabitatHR’s C code leaves out one pair: the animal’s last two fixes. This app includes that pair. Leaving it out only changes the score when those two fixes are close together, so it usually makes no difference.
Simulated example
The example file contains five simulated bears, not real animals. Each bear moves between three activity centres in southern Yukon as a biased correlated random walk (Codling, Plank & Benhamou 2008). There is a fix every 4 hours from 15 April to 15 October 2025, with 8 % of fixes failing and 15 m of location error.
The movement is stationary, meaning each bear stays in the same range for the whole period, which autocorrelated KDE requires. Four rows contain deliberate errors to show how the import check works.
Privacy
Your files stay on your device. The app reads them with your browser’s File API and analyses them in this tab and a background worker, and exports are created on your device too. Once the page has loaded, the app makes no network requests (its fonts are bundled) unless you turn on the basemap.
The basemap is off by default. When it is on, it loads map tiles from Esri or OpenStreetMap. Those services can see which area you are viewing, but not your data.