diff --git a/.github/actions/create-upload-suggestions/action.yml b/.github/actions/create-upload-suggestions/action.yml index 8ac14895db8..6a4cf1201dd 100644 --- a/.github/actions/create-upload-suggestions/action.yml +++ b/.github/actions/create-upload-suggestions/action.yml @@ -177,7 +177,7 @@ runs: echo "diff-file-name=${INPUT_DIFF_FILE_NAME}" >> "${GITHUB_OUTPUT}" env: INPUT_DIFF_FILE_NAME: ${{ steps.tool-name-safe.outputs.diff-file-name }} - - uses: actions/upload-artifact@0b2256b8c012f0828dc542b3febcab082c67f72b # v4.3.4 + - uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 id: upload-diff if: >- ${{ (steps.files_changed.outputs.files_changed == 'true') && @@ -200,7 +200,7 @@ runs: echo 'Suggestions can only be added near to lines changed in this PR.' echo 'If any fixes can be added as code suggestions, they will be added shortly from another workflow.' } >> "${GITHUB_STEP_SUMMARY}" - - uses: actions/upload-artifact@0b2256b8c012f0828dc542b3febcab082c67f72b # v4.3.4 + - uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 id: upload-changes if: >- ${{ always() && diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index daf1e8762b0..960941d4ede 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -56,7 +56,7 @@ jobs: if: ${{ matrix.language == 'c-cpp' }} - name: Initialize CodeQL - uses: github/codeql-action/init@afb54ba388a7dca6ecae48f608c4ff05ff4cc77a # v3.25.15 + uses: github/codeql-action/init@eb055d739abdc2e8de2e5f4ba1a8b246daa779aa # v3.26.0 with: languages: ${{ matrix.language }} config-file: ./.github/codeql/codeql-config.yml @@ -81,6 +81,6 @@ jobs: run: .github/workflows/build_ubuntu-22.04.sh "${HOME}/install" - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@afb54ba388a7dca6ecae48f608c4ff05ff4cc77a # v3.25.15 + uses: github/codeql-action/analyze@eb055d739abdc2e8de2e5f4ba1a8b246daa779aa # v3.26.0 with: category: "/language:${{matrix.language}}" diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index d3104a6ed4b..9040030669c 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -76,7 +76,7 @@ jobs: password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Build and push id: docker_build - uses: docker/build-push-action@5176d81f87c23d6fc96624dfdbcd9f3830bbe445 # v6.5.0 + uses: docker/build-push-action@16ebe778df0e7752d2cfcbd924afdbbd89c1a755 # v6.6.1 with: push: true pull: true diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml index da6a1a4d295..6fd2442659c 100644 --- a/.github/workflows/macos.yml +++ b/.github/workflows/macos.yml @@ -72,7 +72,7 @@ jobs: nc_spm_full_v2alpha2.tar.gz" - name: Make HTML test report available if: ${{ always() }} - uses: actions/upload-artifact@0b2256b8c012f0828dc542b3febcab082c67f72b # v4.3.4 + uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 with: name: testreport-macOS path: testreport diff --git a/.github/workflows/macos_dependencies.txt b/.github/workflows/macos_dependencies.txt index 19edb646ac2..8f9507c15b0 100644 --- a/.github/workflows/macos_dependencies.txt +++ b/.github/workflows/macos_dependencies.txt @@ -1,39 +1,48 @@ -clang_osx-arm64 -clangxx_osx-arm64 -setuptools -python -python.app -numpy -gdal -freetype +blas cairo -matplotlib -pandoc -pillow -six -wxpython -sqlite -jpeg -libpng -libtiff -pkg-config -libiconv +clangxx_osx-arm64 +clang_osx-arm64 +cmake fftw -lapack -blas -giflib -proj +flex +freetype geos -krb5 gettext -lastools ghostscript -zstd +giflib +git +libjpeg-turbo +krb5 +lapack +lastools +libgdal-arrow-parquet +libgdal-core +libgdal-hdf4 +libgdal-hdf5 +libgdal-netcdf +libgdal-pdf +libgdal-pg +libgdal-postgisraster +libgdal-tiledb +libiconv +libjpeg-turbo +libpng +libsvm +libtiff +llvm-openmp +matplotlib +numpy<2 +pandoc pdal +pillow +pkg-config ply postgresql -# postgis>=3.1.4 -cmake -llvm-openmp -flex -git +proj +python +python.app +setuptools +six +sqlite +wxpython +zstd diff --git a/.github/workflows/osgeo4w.yml b/.github/workflows/osgeo4w.yml index 2fd1412d76b..ba1217620c3 100644 --- a/.github/workflows/osgeo4w.yml +++ b/.github/workflows/osgeo4w.yml @@ -30,7 +30,7 @@ jobs: git config --global core.autocrlf false git config --global core.eol lf - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - - uses: msys2/setup-msys2@5df0ca6cbf14efcd08f8d5bd5e049a3cc8e07fd2 # v2.24.0 + - uses: msys2/setup-msys2@ddf331adaebd714795f1042345e6ca57bd66cea8 # v2.24.1 with: path-type: inherit location: D:\ @@ -83,7 +83,7 @@ jobs: - name: Make HTML test report available if: ${{ always() }} - uses: actions/upload-artifact@0b2256b8c012f0828dc542b3febcab082c67f72b # v4.3.4 + uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 with: name: testreport-${{ matrix.os }} path: testreport diff --git a/.github/workflows/pytest.yml b/.github/workflows/pytest.yml index 70ad658265f..17b6203ffe1 100644 --- a/.github/workflows/pytest.yml +++ b/.github/workflows/pytest.yml @@ -114,7 +114,7 @@ jobs: token: ${{ secrets.CODECOV_TOKEN }} - name: Make python-only code coverage test report available if: ${{ !cancelled() }} - uses: actions/upload-artifact@0b2256b8c012f0828dc542b3febcab082c67f72b # v4.3.4 + uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 with: name: python-codecoverage-report-${{ matrix.os }}-${{ matrix.python-version }} path: coverage_html_report diff --git a/.github/workflows/python-code-quality.yml b/.github/workflows/python-code-quality.yml index ea8eb9eeac8..42c7913bdb1 100644 --- a/.github/workflows/python-code-quality.yml +++ b/.github/workflows/python-code-quality.yml @@ -28,15 +28,15 @@ jobs: PYTHON_VERSION: "3.10" MIN_PYTHON_VERSION: "3.8" # renovate: datasource=pypi depName=black - BLACK_VERSION: "24.4.2" + BLACK_VERSION: "24.8.0" # renovate: datasource=pypi depName=flake8 - FLAKE8_VERSION: "7.1.0" + FLAKE8_VERSION: "7.1.1" # renovate: datasource=pypi depName=pylint PYLINT_VERSION: "2.12.2" # renovate: datasource=pypi depName=bandit BANDIT_VERSION: "1.7.9" # renovate: datasource=pypi depName=ruff - RUFF_VERSION: "0.5.5" + RUFF_VERSION: "0.5.7" runs-on: ${{ matrix.os }} permissions: @@ -129,13 +129,13 @@ jobs: bandit -c pyproject.toml -iii -r . -f sarif -o bandit.sarif --exit-zero - name: Upload Bandit Scan Results - uses: actions/upload-artifact@0b2256b8c012f0828dc542b3febcab082c67f72b # v4.3.4 + uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 with: name: bandit.sarif path: bandit.sarif - name: Upload SARIF File into Security Tab - uses: github/codeql-action/upload-sarif@afb54ba388a7dca6ecae48f608c4ff05ff4cc77a # v3.25.15 + uses: github/codeql-action/upload-sarif@eb055d739abdc2e8de2e5f4ba1a8b246daa779aa # v3.26.0 with: sarif_file: bandit.sarif @@ -201,7 +201,7 @@ jobs: cp -rp dist.$ARCH/docs/html/libpython sphinx-grass - name: Make Sphinx documentation available - uses: actions/upload-artifact@0b2256b8c012f0828dc542b3febcab082c67f72b # v4.3.4 + uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 with: name: sphinx-grass path: sphinx-grass diff --git a/.github/workflows/ubuntu.yml b/.github/workflows/ubuntu.yml index e6f2899c2ce..4f70486e05e 100644 --- a/.github/workflows/ubuntu.yml +++ b/.github/workflows/ubuntu.yml @@ -147,7 +147,7 @@ jobs: - name: Make HTML test report available if: ${{ always() }} - uses: actions/upload-artifact@0b2256b8c012f0828dc542b3febcab082c67f72b # v4.3.4 + uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 with: name: testreport-${{ matrix.os }}-${{ matrix.config }}-${{ matrix.extra-include }} path: testreport diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 47d0cd36bb9..2dc9dc65f35 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -37,7 +37,7 @@ repos: ) - repo: https://github.com/astral-sh/ruff-pre-commit # Ruff version. - rev: v0.5.5 + rev: v0.5.7 hooks: # Run the linter. - id: ruff @@ -49,7 +49,7 @@ repos: - id: markdownlint-fix # Using this mirror lets us use mypyc-compiled black, which is about 2x faster - repo: https://github.com/psf/black-pre-commit-mirror - rev: 24.4.2 + rev: 24.8.0 hooks: - id: black-jupyter exclude: | @@ -57,7 +57,7 @@ repos: python/libgrass_interface_generator/ ) - repo: https://github.com/pycqa/flake8 - rev: 7.1.0 + rev: 7.1.1 hooks: - id: flake8 exclude: | diff --git a/display/d.text/test.py b/display/d.text/test.py index 6e7fe676a65..1089096d2ef 100755 --- a/display/d.text/test.py +++ b/display/d.text/test.py @@ -52,7 +52,7 @@ def text(in_text): for i in range(36): font(fonts[int(i % len(fonts))]) - size((36 - i if (i >= 9 and i <= 18 or i > 27) else i) % 9) + size((36 - i if ((i >= 9 and i <= 18) or i > 27) else i) % 9) rotate(i * 10) color(colors[i % len(colors)]) xy( diff --git a/docker/alpine/Dockerfile b/docker/alpine/Dockerfile index ea463f5906a..dfd840263e9 100644 --- a/docker/alpine/Dockerfile +++ b/docker/alpine/Dockerfile @@ -202,6 +202,9 @@ ENV GRASS_SKIP_MAPSET_OWNER_CHECK=1 \ COPY --from=build /usr/local/bin/grass /usr/local/bin/grass COPY --from=build /usr/local/grass* /usr/local/grass/ COPY --from=build /usr/lib/gdalplugins/*_GRASS.so /usr/lib/gdalplugins/ +# Set GISBASE +ENV GISBASE /usr/local/grass + # run simple LAZ test COPY docker/testdata/simple.laz /tmp/ COPY docker/testdata/test_grass_python.py docker/testdata/test_grass_session.py docker/alpine/grass_tests.sh /scripts/ diff --git a/general/g.findfile/main.c b/general/g.findfile/main.c index 1871c5da6e1..ef75cb5ab92 100644 --- a/general/g.findfile/main.c +++ b/general/g.findfile/main.c @@ -33,6 +33,7 @@ int main(int argc, char *argv[]) struct Option *mapset_opt; struct Option *file_opt; struct Flag *n_flag, *l_flag; + size_t len; module = G_define_module(); G_add_keyword(_("general")); @@ -104,8 +105,12 @@ int main(int argc, char *argv[]) strcpy(name, file_opt->answer); G_free_tokens(map_mapset); } - else - strcpy(name, file_opt->answer); + else { + len = G_strlcpy(name, file_opt->answer, sizeof(name)); + if (len >= sizeof(name)) { + G_fatal_error(_("Name <%s> is too long"), file_opt->answer); + } + } mapset = G_find_file2(elem_opt->answer, name, search_mapset); if (mapset) { diff --git a/general/g.region/Makefile b/general/g.region/Makefile index a288c856113..9d6c871c9f4 100644 --- a/general/g.region/Makefile +++ b/general/g.region/Makefile @@ -2,7 +2,7 @@ MODULE_TOPDIR = ../.. PGM = g.region -LIBES = $(GPROJLIB) $(VECTORLIB) $(DIG2LIB) $(RASTER3DLIB) $(RASTERLIB) $(GISLIB) $(MATHLIB) $(PROJLIB) +LIBES = $(GPROJLIB) $(VECTORLIB) $(DIG2LIB) $(RASTER3DLIB) $(RASTERLIB) $(GISLIB) $(MATHLIB) $(PROJLIB) $(PARSONLIB) DEPENDENCIES = $(GPROJDEP) $(VECTORDEP) $(DIG2DEP) $(RASTER3DDEP) $(RASTERDEP) $(GISDEP) EXTRA_INC = $(VECT_INC) $(PROJINC) EXTRA_CFLAGS = $(VECT_CFLAGS) diff --git a/general/g.region/g.region.html b/general/g.region/g.region.html index 4716aee2e38..85d75a058df 100644 --- a/general/g.region/g.region.html +++ b/general/g.region/g.region.html @@ -457,6 +457,59 @@
+g.region -p format=json +
+{ + "projection": "99 (Lambert Conformal Conic)", + "zone": 0, + "datum": "nad83", + "ellipsoid": "a=6378137 es=0.006694380022900787", + "region": { + "north": 320000, + "south": 10000, + "west": 120000, + "east": 935000, + "ns-res": 500, + "ns-res3": 1000, + "ew-res": 500, + "ew-res3": 1000 + }, + "top": 500, + "bottom": -500, + "tbres": 100, + "rows": 620, + "rows3": 310, + "cols": 1630, + "cols3": 815, + "depths": 10, + "cells": 1010600, + "cells3": 2526500 +} +
+g.region -l format=json +
+{ + "nw_long": -78.688888505507336, + "nw_lat": 35.743893244701788, + "ne_long": -78.669097826118957, + "ne_lat": 35.743841072010554, + "se_long": -78.669158624787542, + "se_lat": 35.728968779193615, + "sw_long": -78.688945667963168, + "sw_lat": 35.729020942542441, + "center_long": -78.679022655614958, + "center_lat": 35.736431420327719, + "rows": 165, + "cols": 179 +} +
Raster: {raster} | |
---|---|
Value | +{value} | +
All horizon values are positive (or zero). While negative values are in theory possible, r.horizon currently does not support them. + +
+The iterations of the algorithm used in r.horizon +depends on the topography. As a result, the benchmark results may vary +depending on the topography of the study area. + +
+r.report -n -a map=towns,elevation units=miles,meters,kilometers,acres,hectares,cells,percent nsteps=2 format=json +
+{ + "location": "nc_spm_08_grass7", + "created": "2024-07-24T14:59:09+0530", + "region": { + "north": 320000, + "south": 10000, + "east": 935000, + "west": 120000, + "ew_res": 500, + "ns_res": 500 + }, + "mask": null, + "maps": [ + { + "name": "towns", + "label": "South West Wake: Cities and towns derived from zipcodes", + "type": "raster", + }, + { + "name": "zipcodes", + "label": "South West Wake: Zipcode areas derived from vector map", + "type": "raster", + } + ], + "categories": [ + { + "category": 1, + "label": "CARY", + "units": [ + { + "unit": "square miles", + "value": 10.231707201374819 + }, + { + "unit": "square meters", + "value": 26500000 + }, + { + "unit": "square kilometers", + "value": 26.5 + }, + { + "unit": "acres", + "value": 6548.2926088798722 + }, + { + "unit": "hectares", + "value": 2650 + }, + { + "unit": "cell counts", + "value": 106 + }, + { + "unit": "% cover", + "value": 13.086419753086419 + } + ], + "categories": [ + { + "category": 1, + "label": "from to", + "range": { + "from": 55.578792572021484, + "to": 105.9543285369873 + }, + "units": [ + { + "unit": "square miles", + "value": 0.8687298567205034 + }, + { + "unit": "square meters", + "value": 2250000 + }, + { + "unit": "square kilometers", + "value": 2.25 + }, + { + "unit": "acres", + "value": 555.98710830112122 + }, + { + "unit": "hectares", + "value": 225 + }, + { + "unit": "cell counts", + "value": 9 + }, + { + "unit": "% cover", + "value": 8.4905660377358494 + } + ] + }, + { + "category": 2, + "label": "from to", + "range": { + "from": 105.9543285369873, + "to": 156.32986450195312 + }, + "units": [ + { + "unit": "square miles", + "value": 9.3629773446543147 + }, + { + "unit": "square meters", + "value": 24250000 + }, + { + "unit": "square kilometers", + "value": 24.25 + }, + { + "unit": "acres", + "value": 5992.305500578751 + }, + { + "unit": "hectares", + "value": 2425 + }, + { + "unit": "cell counts", + "value": 97 + }, + { + "unit": "% cover", + "value": 91.509433962264154 + } + ] + } + ] + }, + { + "category": 2, + "label": "GARNER", + "units": [ + { + "unit": "square miles", + "value": 5.5019557592298556 + }, + { + "unit": "square meters", + "value": 14250000 + }, + { + "unit": "square kilometers", + "value": 14.25 + }, + { + "unit": "acres", + "value": 3521.2516859071011 + }, + { + "unit": "hectares", + "value": 1425 + }, + { + "unit": "cell counts", + "value": 57 + }, + { + "unit": "% cover", + "value": 7.0370370370370372 + } + ], + "categories": [ + { + "category": 1, + "label": "from to", + "range": { + "from": 55.578792572021484, + "to": 105.9543285369873 + }, + "units": [ + { + "unit": "square miles", + "value": 4.3436492836025176 + }, + { + "unit": "square meters", + "value": 11250000 + }, + { + "unit": "square kilometers", + "value": 11.25 + }, + { + "unit": "acres", + "value": 2779.9355415056061 + }, + { + "unit": "hectares", + "value": 1125 + }, + { + "unit": "cell counts", + "value": 45 + }, + { + "unit": "% cover", + "value": 78.94736842105263 + } + ] + }, + { + "category": 2, + "label": "from to", + "range": { + "from": 105.9543285369873, + "to": 156.32986450195312 + }, + "units": [ + { + "unit": "square miles", + "value": 1.158306475627338 + }, + { + "unit": "square meters", + "value": 3000000 + }, + { + "unit": "square kilometers", + "value": 3 + }, + { + "unit": "acres", + "value": 741.31614440149497 + }, + { + "unit": "hectares", + "value": 300 + }, + { + "unit": "cell counts", + "value": 12 + }, + { + "unit": "% cover", + "value": 21.05263157894737 + } + ] + } + ] + }, + { + "category": 3, + "label": "APEX", + "units": [ + { + "unit": "square miles", + "value": 0.9652553963561149 + }, + { + "unit": "square meters", + "value": 2500000 + }, + { + "unit": "square kilometers", + "value": 2.5 + }, + { + "unit": "acres", + "value": 617.76345366791247 + }, + { + "unit": "hectares", + "value": 250 + }, + { + "unit": "cell counts", + "value": 10 + }, + { + "unit": "% cover", + "value": 1.2345679012345678 + } + ], + "categories": [ + { + "category": 1, + "label": "from to", + "range": { + "from": 55.578792572021484, + "to": 105.9543285369873 + }, + "units": [ + { + "unit": "square miles", + "value": 0.096525539635611488 + }, + { + "unit": "square meters", + "value": 250000 + }, + { + "unit": "square kilometers", + "value": 0.25 + }, + { + "unit": "acres", + "value": 61.776345366791247 + }, + { + "unit": "hectares", + "value": 25 + }, + { + "unit": "cell counts", + "value": 1 + }, + { + "unit": "% cover", + "value": 10 + } + ] + }, + { + "category": 2, + "label": "from to", + "range": { + "from": 105.9543285369873, + "to": 156.32986450195312 + }, + "units": [ + { + "unit": "square miles", + "value": 0.8687298567205034 + }, + { + "unit": "square meters", + "value": 2250000 + }, + { + "unit": "square kilometers", + "value": 2.25 + }, + { + "unit": "acres", + "value": 555.98710830112122 + }, + { + "unit": "hectares", + "value": 225 + }, + { + "unit": "cell counts", + "value": 9 + }, + { + "unit": "% cover", + "value": 90 + } + ] + } + ] + }, + { + "category": 4, + "label": "RALEIGH-CITY", + "units": [ + { + "unit": "square miles", + "value": 6.0811089970435237 + }, + { + "unit": "square meters", + "value": 15750000 + }, + { + "unit": "square kilometers", + "value": 15.75 + }, + { + "unit": "acres", + "value": 3891.9097581078486 + }, + { + "unit": "hectares", + "value": 1575 + }, + { + "unit": "cell counts", + "value": 63 + }, + { + "unit": "% cover", + "value": 7.7777777777777777 + } + ], + "categories": [ + { + "category": 1, + "label": "from to", + "range": { + "from": 55.578792572021484, + "to": 105.9543285369873 + }, + "units": [ + { + "unit": "square miles", + "value": 5.3089046799586326 + }, + { + "unit": "square meters", + "value": 13750000 + }, + { + "unit": "square kilometers", + "value": 13.75 + }, + { + "unit": "acres", + "value": 3397.6989951735186 + }, + { + "unit": "hectares", + "value": 1375 + }, + { + "unit": "cell counts", + "value": 55 + }, + { + "unit": "% cover", + "value": 87.301587301587304 + } + ] + }, + { + "category": 2, + "label": "from to", + "range": { + "from": 105.9543285369873, + "to": 156.32986450195312 + }, + "units": [ + { + "unit": "square miles", + "value": 0.7722043170848919 + }, + { + "unit": "square meters", + "value": 2000000 + }, + { + "unit": "square kilometers", + "value": 2 + }, + { + "unit": "acres", + "value": 494.21076293432998 + }, + { + "unit": "hectares", + "value": 200 + }, + { + "unit": "cell counts", + "value": 8 + }, + { + "unit": "% cover", + "value": 12.698412698412698 + } + ] + } + ] + }, + { + "category": 5, + "label": "RALEIGH-SOUTH", + "units": [ + { + "unit": "square miles", + "value": 47.394039961085241 + }, + { + "unit": "square meters", + "value": 122750000 + }, + { + "unit": "square kilometers", + "value": 122.75 + }, + { + "unit": "acres", + "value": 30332.185575094503 + }, + { + "unit": "hectares", + "value": 12275 + }, + { + "unit": "cell counts", + "value": 491 + }, + { + "unit": "% cover", + "value": 60.617283950617285 + } + ], + "categories": [ + { + "category": 1, + "label": "from to", + "range": { + "from": 55.578792572021484, + "to": 105.9543285369873 + }, + "units": [ + { + "unit": "square miles", + "value": 25.579268003437047 + }, + { + "unit": "square meters", + "value": 66250000 + }, + { + "unit": "square kilometers", + "value": 66.25 + }, + { + "unit": "acres", + "value": 16370.731522199681 + }, + { + "unit": "hectares", + "value": 6625 + }, + { + "unit": "cell counts", + "value": 265 + }, + { + "unit": "% cover", + "value": 53.971486761710793 + } + ] + }, + { + "category": 2, + "label": "from to", + "range": { + "from": 105.9543285369873, + "to": 156.32986450195312 + }, + "units": [ + { + "unit": "square miles", + "value": 21.814771957648198 + }, + { + "unit": "square meters", + "value": 56500000 + }, + { + "unit": "square kilometers", + "value": 56.5 + }, + { + "unit": "acres", + "value": 13961.454052894822 + }, + { + "unit": "hectares", + "value": 5650 + }, + { + "unit": "cell counts", + "value": 226 + }, + { + "unit": "% cover", + "value": 46.028513238289207 + } + ] + } + ] + }, + { + "category": 6, + "label": "RALEIGH-WEST", + "units": [ + { + "unit": "square miles", + "value": 8.0116197897557537 + }, + { + "unit": "square meters", + "value": 20750000 + }, + { + "unit": "square kilometers", + "value": 20.75 + }, + { + "unit": "acres", + "value": 5127.4366654436735 + }, + { + "unit": "hectares", + "value": 2075 + }, + { + "unit": "cell counts", + "value": 83 + }, + { + "unit": "% cover", + "value": 10.246913580246913 + } + ], + "categories": [ + { + "category": 1, + "label": "from to", + "range": { + "from": 55.578792572021484, + "to": 105.9543285369873 + }, + "units": [ + { + "unit": "square miles", + "value": 0.096525539635611488 + }, + { + "unit": "square meters", + "value": 250000 + }, + { + "unit": "square kilometers", + "value": 0.25 + }, + { + "unit": "acres", + "value": 61.776345366791247 + }, + { + "unit": "hectares", + "value": 25 + }, + { + "unit": "cell counts", + "value": 1 + }, + { + "unit": "% cover", + "value": 1.2048192771084338 + } + ] + }, + { + "category": 2, + "label": "from to", + "range": { + "from": 105.9543285369873, + "to": 156.32986450195312 + }, + "units": [ + { + "unit": "square miles", + "value": 7.9150942501201422 + }, + { + "unit": "square meters", + "value": 20500000 + }, + { + "unit": "square kilometers", + "value": 20.5 + }, + { + "unit": "acres", + "value": 5065.6603200768823 + }, + { + "unit": "hectares", + "value": 2050 + }, + { + "unit": "cell counts", + "value": 82 + }, + { + "unit": "% cover", + "value": 98.795180722891573 + } + ] + } + ] + } + ], + "totals": [ + { + "unit": "square miles", + "value": 78.185687104845314 + }, + { + "unit": "square meters", + "value": 202500000 + }, + { + "unit": "square kilometers", + "value": 202.5 + }, + { + "unit": "acres", + "value": 50038.839747100916 + }, + { + "unit": "hectares", + "value": 20250 + }, + { + "unit": "cell counts", + "value": 810 + }, + { + "unit": "% cover", + "value": 100 + } + ] +} +