Skip to content

chore(deps): bump proj4rs from 0.2.1 to 0.3.0 - #1199

Merged
deniial00 merged 10 commits into
mainfrom
dependabot/cargo/proj4rs-0.3.0
Nov 2, 2026
Merged

deniial00 merged 10 commits into
mainfrom
dependabot/cargo/proj4rs-0.3.0

Conversation

@dependabot

@dependabot dependabot Bot commented on behalf of github Oct 31, 2026

Copy link
Copy Markdown
Contributor

Bumps proj4rs from 0.2.1 to 0.3.0.

Commits

Dependabot compatibility score

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


Dependabot commands and options

You can trigger Dependabot actions by commenting on this PR:

  • @dependabot rebase will rebase this PR
  • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
  • @dependabot show <dependency name> ignore conditions will show all of the ignore conditions of the specified dependency
  • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
  • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
  • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)

Bumps [proj4rs](https://github.com/3liz/proj4rs) from 0.2.1 to 0.3.0.
- [Commits](https://github.com/3liz/proj4rs/commits)

---
updated-dependencies:
- dependency-name: proj4rs
  dependency-version: 0.3.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
@dependabot dependabot Bot added dependencies Pull requests that update a dependency file rust Pull requests that update rust code labels Oct 31, 2026
@coderabbitai

coderabbitai Bot commented Oct 31, 2026 •

Copy link
Copy Markdown
Contributor

Important

Review skipped

Bot user detected.

To trigger a single review, invoke the @coderabbitai review command.

Run configuration
  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: Organization UI
  • Review profile: ASSERTIVE
  • Plan: Advanced
  • Run ID: 4d34f9d6-35b4-4958-b9e7-5872172552aa

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • Trigger review
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

Share

@deniial00

Copy link
Copy Markdown
Member

The test / Test (ubuntu-latest) failure isn't the lockfile: proj4rs 0.3.0 grew the oblique Mercator, Cassini-Soldner, the polyconic, Equal Earth and sinusoidal projections. every_system_east_and_north_gets_a_prj (every EPSG code proj4rs projects must get a writable .prj) now reaches the ~68 codes that use them and panics on the first, EPSG:2057, because to_wkt had no arm for omerc.

Pushing a commit that:

  • writes and reads those systems in raster/wkt.rs (writer arms, reader support, and WKT2 methods 9812/9815 with parameters 8813/8814 in the translation tables), checked against PROJ 9.9 at representative points;
  • refuses the degenerate azimuth 90° oblique Mercator (proj4rs' omerc is wrong there; the Swiss case keeps somerc);
  • updates the map and engine tests that refuse +proj=poly (EPSG:5880 draws now) and pins the still-unimplemented Laborde (EPSG:8441) instead;
  • fixes the EPSG:2056 row of wkt2_corpus.tsv, whose ground truth predated the datum shift and never ran (the row was unreadable by parameters before).

…read back

The bump to 0.3.0 makes the oblique Mercator, Cassini-Soldner, the polyconic and
Equal Earth parse, so the EPSG codes using them (Oman's grid, Malaysia's RSO,
Tobago's and Berlin's, Brazil's polyconic, Equal Earth) are written as WKT and
read back by their parameters, checked against PROJ 9.9. An oblique Mercator at
azimuth 90° stays refused (proj4rs' omerc is degenerate there; the Swiss case
keeps somerc). The map and engine tests that refused +proj=poly pin the
still-unimplemented Laborde instead, the EPSG:2056 row of the WKT2 corpus takes
the ground truth of PROJ's own pipeline, and the user guide's list of refused
methods names Laborde now. (#1199)
Comment thread crates/data/src/raster/wkt.rs Resolved
Comment thread crates/data/src/raster/wkt2_corpus.tsv Resolved
@github-actions

Copy link
Copy Markdown
Contributor

Code review

Reviewed PR #1199 (Dependabot bump of proj4rs 0.2.1 → 0.3.0). The diff goes well beyond a version bump. It also adds Hotine oblique Mercator, Cassini-Soldner, polyconic and Equal Earth support, changes reference data, and updates tests and docs. I could not build or run tests here, so nothing below is verified by execution.

Bugs

  • Degenerate-azimuth guard misses 270° (crates/data/src/raster/wkt.rs:672, inline suggestion posted). azimuth.abs() - 90 catches 90° and -90° but not 270°, which has the same cos(α) = 0. Matching modulo 180° fixes it. Confidence: medium.
  • EPSG:2056 reference values changed without provenance (crates/data/src/raster/wkt2_corpus.tsv:53, inline comment posted). x/y moved by about +80 m E and +146 m N while lon/lat stayed the same. The file header says pyproj 3.7.2 generated these rows, and 2056 is now checked against the PROJ definition for the first time. If the new numbers came from proj4rs itself, the test is circular. Confidence: medium. I couldn't verify the Swiss figures offline.

Security

  • No issues found in the changed lines. Input comes from WKT files, and the new parameters use the same get() path as the existing ones.

Performance

  • Nothing notable.

Quality

  • Stale module docs in crates/data/src/raster/esri.rs:15,25. The list of systems "proj4rs lacks" still names omerc, cass and poly, and the refused oblique Mercators (53025, 54025) are still listed as refused. This PR adds those methods, so the list and the "167 left out" count need updating or re-checking. docs/user-guide/data.md:77 also mentions only Swiss oblique Mercator and Krovak. The inline comment on esri.rs failed because that file is not in the PR diff, so it is reported here. Confidence: high.
  • Minor: the POLYCONIC and CASSINI_SOLDNER arms emit +k_0, which PROJ ignores for these methods. Harmless, but it's noise.

AGENTS.md

  • Notices not refreshed. AGENTS.md says to run cargo xtask notices after changing dependencies. This PR changes proj4rs and proj4rs-geodesic (which now depends on wasm-bindgen instead of cc) but touches no THIRD-PARTY-LICENSES.txt. Those files list crate names only, so the content may not change. Please run the xtask to confirm. Confidence: medium.
  • Scope and attribution. The PR is titled as a dependency bump, but it carries new projection-method code, reference-data changes and docs. The PR body is the Dependabot template and doesn't say what changed or name the reference projects consulted (CONTRIBUTING's "where code comes from"). Splitting the feature work into its own PR, with a description, would be cleaner. Confidence: high.
  • Wasm and licence checks. Run cargo build --target wasm32-unknown-unknown -p rustgis-web and cargo deny check licenses in CI for the new proj4rs-geodesic wiring. I could not check either here.

Change size

Compared with the base branch (merge base 6692b1b to PR head 2813f33). Sizes are file sizes, not line counts.

Measure Value
Files changed 7 (0 added, 7 modified, 0 removed, 0 renamed)
Size before 1.72 MB (1,802,724 B)
Size after 1.72 MB (1,808,010 B)
Total size change +5.1 KB (+5,286 B)
Path Before After Change
crates/data/src/raster/wkt.rs 91.2 KB 95.5 KB +4.3 KB
crates/map/src/projection.rs 85.9 KB 86.7 KB +814 B
crates/engine/src/tests.rs 1.24 MB 1.24 MB +72 B
docs/user-guide/maps.md 31.4 KB 31.4 KB −29 B
Cargo.lock 184.7 KB 184.7 KB +10 B
crates/data/src/raster/wkt2_corpus.tsv 89.6 KB 89.6 KB −2 B
Cargo.toml 5.9 KB 5.9 KB 0 B

@github-actions

github-actions Bot commented Oct 31, 2026 •

Copy link
Copy Markdown
Contributor

📖 Docs preview

Item Value
Preview https://preview.rustgis.app/pr-1199/
Web app https://preview.rustgis.app/pr-1199/app/
Commit 255d8ce

GitHub Pages takes a minute or two to publish a new commit.

An azimuth of 270° is the same east-west centre line as 90°, and the omerc
formula is degenerate there in proj4rs and PROJ alike (verified: PROJ 9.9's own
`omerc +no_uoff +alpha=90` lands 10 Mm off), so the guard matches modulo 180°.
Cassini and the polyconic take no scale factor, so the reader stops emitting
`+k_0`. The ESRI table's notes say they were checked against proj4rs 0.2, and
the user guide lists the methods that read from parameters now.
Comment thread crates/data/src/raster/wkt2_corpus.tsv Resolved
Comment thread crates/map/src/projection.rs Outdated
assert!(e.contains("labrd"), "{e}");
// proj4rs 0.3 added Cassini, the polyconic, Equal Earth and the oblique Mercator: their
// codes are accepted (EPSG:5880's polyconic, whose refusal was #208), and draw where PROJ
// does: (5 000 000, 8 894 145) for 10°W 54°S of SIRGAS 2000's origin, its false northing

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: the comment has the axes swapped. Coord::new(-54.0, -10.0) on the next line is 54°W, 10°S, not "10°W 54°S". The expected 8_894_145.167 also has no stated provenance. The repo's convention is pyproj-derived expected values, so please name the source (for example "pyproj 3.7.x, EPSG:5880") next to the constant.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed (a7e971d), with the provenance named: pyproj 3.8.0's EPSG:5880.

Comment thread crates/data/src/raster/wkt.rs Resolved
Comment thread Cargo.toml Resolved
Comment thread crates/data/src/raster/wkt.rs Resolved
@github-actions

Copy link
Copy Markdown
Contributor

Code review

Bugs

  • High confidence the edit is unexplained, medium confidence on which side is right: the EPSG:2056 row in wkt2_corpus.tsv was rewritten about 80 m east and 145 m north. The file says its values are pyproj/PROJ output, and the test tolerance is 1 m. Removing 2056 from by_code_only makes the row self-consistent with RustGIS rather than checked against PROJ. If proj4rs 0.3's Swiss somerc really disagrees with PROJ, LV95 users would see roughly 100 m error. (Inline comment posted.)

Security

  • Nothing found.

Performance

  • Nothing found.

Quality

  • Test coverage: the new omerc, eqearth, cass and poly branches are checked only by round-trip, except for the corpus rows 3375 and 3168. Medium confidence. (Inline comment posted.)
  • Nit: the Brazil comment swaps lon and lat ("10°W 54°S" should be 54°W, 10°S), and the expected 8_894_145.167 has no stated pyproj source. High confidence. (Inline comment posted.)
  • Nit: the HOTINE_OBLIQUE_MERCATOR_AZIMUTH_NATURAL_ORIGIN arm has no METHODS entry, so it may be unreachable. Low confidence. (Inline comment posted.)

AGENTS.md

  • The dependency change (proj4rs 0.2.1 → 0.3.0, and proj4rs-geodesic now depends on wasm-bindgen instead of cc) does not come with a cargo xtask notices run. None of the THIRD-PARTY-LICENSES.txt files are in the diff. They list names rather than versions, so they may be unchanged. Medium-low confidence. (Inline comment posted.)
  • Process: the PR is Dependabot-authored (chore(deps)) but carries feature code and hand-edited reference data. Dependabot stops rebasing once a PR is altered, so the feature and corpus work should be split out.

Not verified: I could not run cargo xtask ci, the tests, or pyproj, and I could not check proj4rs 0.3's API or numerics. The findings are from reading the diff and the repo.

Change size

Compared with main (merge base 6692b1b to PR head 9ff744b).

Measure Value
Files changed 9 (0 added, 9 modified, 0 removed, 0 renamed)
Size before 2.18 MB
Size after 2.18 MB
Total size change +5.87 KB
Path Before After Change
crates/data/src/raster/wkt.rs 91.2 KB 95.9 KB +4.72 KB
crates/map/src/projection.rs 85.9 KB 86.7 KB +814 B
crates/data/src/raster/esri.rs 391.3 KB 391.5 KB +229 B
docs/user-guide/data.md 78.3 KB 78.4 KB +75 B
crates/engine/src/tests.rs 1.24 MB 1.24 MB +72 B
docs/user-guide/maps.md 31.4 KB 31.4 KB −29 B
Cargo.lock 184.7 KB 184.7 KB +10 B
crates/data/src/raster/wkt2_corpus.tsv 89.6 KB 89.6 KB −2 B
Cargo.toml 5.9 KB 5.9 KB 0 B

…asked for

The oblique Mercator, Equal Earth, Cassini and polyconic round trips couldn't
catch a wrong formula, both sides being the same code: each now has a point
checked against pyproj 3.8.0 (EPSG:4326 to the code). The corpus header says the
Swiss row's x,y is pyproj's own EPSG:2056 pipeline of its round point, and lists
CH1903+ among the systems whose longitude and latitude are WGS 84. The ESRI
WKT1 name for the Hotine variant A is real input (ArcGIS writes
Hotine_Oblique_Mercator_Azimuth_Natural_Origin, pyproj's EPSG:3078 included),
so the reader arm stays, said so; the Swiss guard gets a note on why it checks
the azimuth exactly, and the polyconic test says 54°W 10°S, not 10°W 54°S.
Comment thread docs/user-guide/data.md
available. Swiss oblique Mercator and the standard Krovak East/North variant are supported from
their parameters.
available. Swiss oblique Mercator, the standard Krovak East/North variant, and the oblique
Mercator, Cassini-Soldner, polyconic and Equal Earth methods are supported from their

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit (docs overstate support): the code refuses the two-point Hotine form (no AZIMUTH, see wkt.rs around line 685), so "the oblique Mercator" needs qualifying. Confidence: high.

Suggested change
Mercator, Cassini-Soldner, polyconic and Equal Earth methods are supported from their
Mercator (its azimuth form), Cassini-Soldner, polyconic and Equal Earth methods are supported from their

EPSG:4087 0.0 0.0 0.0 0.0 PROJCRS["WGS 84 / World Equidistant Cylindrical",BASEGEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],MEMBER["World Geodetic System 1984 (G2296)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["World Equidistant Cylindrical",METHOD["Equidistant Cylindrical",ID["EPSG",1028]],PARAMETER["Latitude of 1st standard parallel",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8823]],PARAMETER["Longitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["False easting",0,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",0,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["easting (X)",east,ORDER[1],LENGTHUNIT["metre",1,ID["EPSG",9001]]],AXIS["northing (Y)",north,ORDER[2],LENGTHUNIT["metre",1,ID["EPSG",9001]]]]
EPSG:27572 549771.5393519275 2192985.1139478907 1.6800000000000002 46.735 PROJCRS["NTF (Paris) / Lambert zone II",BASEGEOGCRS["NTF (Paris)",DATUM["Nouvelle Triangulation Francaise (Paris)",ELLIPSOID["Clarke 1880 (IGN)",6378249.2,293.466021293627,LENGTHUNIT["metre",1]]],PRIMEM["Paris",2.5969213,ANGLEUNIT["grad",0.0157079632679489]],ID["EPSG",4807]],CONVERSION["Lambert zone II",METHOD["Lambert Conic Conformal (1SP)",ID["EPSG",9801]],PARAMETER["Latitude of natural origin",52,ANGLEUNIT["grad",0.0157079632679489],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",0,ANGLEUNIT["grad",0.0157079632679489],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.99987742,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",600000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",2200000,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["easting (X)",east,ORDER[1],LENGTHUNIT["metre",1,ID["EPSG",9001]]],AXIS["northing (Y)",north,ORDER[2],LENGTHUNIT["metre",1,ID["EPSG",9001]]]]
EPSG:2056 2659938.9861671347 1184470.9666418221 8.225 46.81 PROJCRS["CH1903+ / LV95",BASEGEOGCRS["CH1903+",DATUM["CH1903+",ELLIPSOID["Bessel 1841",6377397.155,299.1528128,LENGTHUNIT["metre",1]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4150]],CONVERSION["Swiss Oblique Mercator 1995",METHOD["Hotine Oblique Mercator (variant B)",ID["EPSG",9815]],PARAMETER["Latitude of projection centre",46.9524055555556,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8811]],PARAMETER["Longitude of projection centre",7.43958333333333,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8812]],PARAMETER["Azimuth at projection centre",90,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8813]],PARAMETER["Angle from Rectified to Skew Grid",90,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8814]],PARAMETER["Scale factor at projection centre",1,SCALEUNIT["unity",1],ID["EPSG",8815]],PARAMETER["Easting at projection centre",2600000,LENGTHUNIT["metre",1],ID["EPSG",8816]],PARAMETER["Northing at projection centre",1200000,LENGTHUNIT["metre",1],ID["EPSG",8817]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1,ID["EPSG",9001]]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1,ID["EPSG",9001]]]]
EPSG:2056 2660019.111857919 1184616.167839863 8.225 46.81 PROJCRS["CH1903+ / LV95",BASEGEOGCRS["CH1903+",DATUM["CH1903+",ELLIPSOID["Bessel 1841",6377397.155,299.1528128,LENGTHUNIT["metre",1]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4150]],CONVERSION["Swiss Oblique Mercator 1995",METHOD["Hotine Oblique Mercator (variant B)",ID["EPSG",9815]],PARAMETER["Latitude of projection centre",46.9524055555556,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8811]],PARAMETER["Longitude of projection centre",7.43958333333333,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8812]],PARAMETER["Azimuth at projection centre",90,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8813]],PARAMETER["Angle from Rectified to Skew Grid",90,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8814]],PARAMETER["Scale factor at projection centre",1,SCALEUNIT["unity",1],ID["EPSG",8815]],PARAMETER["Easting at projection centre",2600000,LENGTHUNIT["metre",1],ID["EPSG",8816]],PARAMETER["Northing at projection centre",1200000,LENGTHUNIT["metre",1],ID["EPSG",8817]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1,ID["EPSG",9001]]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1,ID["EPSG",9001]]]]

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixture changed to fit the new output, not checked against PyProj (medium confidence). The EPSG:2056 row's x,y moved by about 80 m (2659938.98 to 2660019.11) and its lon/lat columns now mean WGS 84 instead of CH1903+. The header explains the change, but the five new codes in checked are the only pyproj-verified values in the PR, and this row isn't one of them. Please add it to the checked table, computed by pyproj from the WGS 84 round point, so the test doesn't just echo RustGIS's output.

@github-actions

Copy link
Copy Markdown
Contributor

Code review

This PR is titled and described as a Dependabot bump of proj4rs 0.2.1 to 0.3.0, but the diff also adds new projection support (Hotine oblique Mercator by azimuth, Cassini-Soldner, polyconic, Equal Earth), changes which EPSG codes are refused, rewrites a fixture row and edits docs. None of that is in the title or body.

Bugs

  • The EPSG:2056 fixture row was rewritten to match the new output rather than checked against PyProj (about 80 m shift, and the lon/lat columns changed datum). Confidence: medium. Inline comment posted.

Security

  • Nothing found. The new parameters go through the existing num and get helpers, which filter non-finite values, so NaN and inf azimuths are rejected.

Performance

  • Nothing found.

Quality

  • Docs overstate support: the two-point Hotine form is refused, but data.md says "the oblique Mercator" is supported. Confidence: high. Inline suggestion posted.
  • In projection.rs, the comment on the EPSG:5880 check ("its false easting less a million-odd metres") is confusing. At the central meridian, x equals the false easting, so the comment should say that. Confidence: medium.
  • Scope and process: a Dependabot branch with hand-written commits can't be rebased by Dependabot, and @dependabot recreate would discard them. Splitting the bump from the projection work would keep both reviewable. Confidence: high.

AGENTS.md

  • Projection work is new feature scope, not a self-contained bump. Per CONTRIBUTING, the PR description should carry the proposal, and it should name the PROJ/EPSG references the new formulas were checked against. Confidence: high.
  • The THIRD-PARTY-LICENSES files list crate names only, and cc and wasm-bindgen are already listed, so no notice refresh looks necessary. Confidence: medium.
  • Tests and fixtures: the regression tests cover both the new methods and the refusal paths. Pass/fail was not run here, since this review is read-only.

Change size

Compared: the whole PR against main (merge base 6692b1b to PR head a7e971d).

Files changed Added Modified Removed Renamed Size before Size after Total change
9 0 9 0 0 2.18 MB 2.18 MB +7.1 KB
Path Size before Size after Change
crates/data/src/raster/wkt.rs 91.2 KB 97.0 KB +5.9 KB
crates/map/src/projection.rs 85.9 KB 86.7 KB +826 B
crates/data/src/raster/esri.rs 391.3 KB 391.5 KB +229 B
crates/data/src/raster/wkt2_corpus.tsv 89.6 KB 89.7 KB +105 B
docs/user-guide/data.md 78.3 KB 78.4 KB +75 B
crates/engine/src/tests.rs 1.24 MB 1.24 MB +72 B
docs/user-guide/maps.md 31.4 KB 31.4 KB -29 B
Cargo.lock 184.7 KB 184.7 KB +10 B
Cargo.toml 5.9 KB 5.9 KB 0 B

pyproj's EPSG:4326 to the EPSG code applies the datum registry's own
transformation, which for SAD69 (EPSG:29100) differs from the definition's
bundled three-parameter shift by some 46 m. Against the definition itself,
pyproj and proj4rs agree bit for bit, and the comparison keeps the bundled
shift the reader emits.
EPSG:4087 0.0 0.0 0.0 0.0 PROJCRS["WGS 84 / World Equidistant Cylindrical",BASEGEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],MEMBER["World Geodetic System 1984 (G2296)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["World Equidistant Cylindrical",METHOD["Equidistant Cylindrical",ID["EPSG",1028]],PARAMETER["Latitude of 1st standard parallel",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8823]],PARAMETER["Longitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["False easting",0,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",0,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["easting (X)",east,ORDER[1],LENGTHUNIT["metre",1,ID["EPSG",9001]]],AXIS["northing (Y)",north,ORDER[2],LENGTHUNIT["metre",1,ID["EPSG",9001]]]]
EPSG:27572 549771.5393519275 2192985.1139478907 1.6800000000000002 46.735 PROJCRS["NTF (Paris) / Lambert zone II",BASEGEOGCRS["NTF (Paris)",DATUM["Nouvelle Triangulation Francaise (Paris)",ELLIPSOID["Clarke 1880 (IGN)",6378249.2,293.466021293627,LENGTHUNIT["metre",1]]],PRIMEM["Paris",2.5969213,ANGLEUNIT["grad",0.0157079632679489]],ID["EPSG",4807]],CONVERSION["Lambert zone II",METHOD["Lambert Conic Conformal (1SP)",ID["EPSG",9801]],PARAMETER["Latitude of natural origin",52,ANGLEUNIT["grad",0.0157079632679489],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",0,ANGLEUNIT["grad",0.0157079632679489],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.99987742,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",600000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",2200000,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["easting (X)",east,ORDER[1],LENGTHUNIT["metre",1,ID["EPSG",9001]]],AXIS["northing (Y)",north,ORDER[2],LENGTHUNIT["metre",1,ID["EPSG",9001]]]]
EPSG:2056 2659938.9861671347 1184470.9666418221 8.225 46.81 PROJCRS["CH1903+ / LV95",BASEGEOGCRS["CH1903+",DATUM["CH1903+",ELLIPSOID["Bessel 1841",6377397.155,299.1528128,LENGTHUNIT["metre",1]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4150]],CONVERSION["Swiss Oblique Mercator 1995",METHOD["Hotine Oblique Mercator (variant B)",ID["EPSG",9815]],PARAMETER["Latitude of projection centre",46.9524055555556,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8811]],PARAMETER["Longitude of projection centre",7.43958333333333,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8812]],PARAMETER["Azimuth at projection centre",90,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8813]],PARAMETER["Angle from Rectified to Skew Grid",90,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8814]],PARAMETER["Scale factor at projection centre",1,SCALEUNIT["unity",1],ID["EPSG",8815]],PARAMETER["Easting at projection centre",2600000,LENGTHUNIT["metre",1],ID["EPSG",8816]],PARAMETER["Northing at projection centre",1200000,LENGTHUNIT["metre",1],ID["EPSG",8817]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1,ID["EPSG",9001]]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1,ID["EPSG",9001]]]]
EPSG:2056 2660019.111857919 1184616.167839863 8.225 46.81 PROJCRS["CH1903+ / LV95",BASEGEOGCRS["CH1903+",DATUM["CH1903+",ELLIPSOID["Bessel 1841",6377397.155,299.1528128,LENGTHUNIT["metre",1]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4150]],CONVERSION["Swiss Oblique Mercator 1995",METHOD["Hotine Oblique Mercator (variant B)",ID["EPSG",9815]],PARAMETER["Latitude of projection centre",46.9524055555556,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8811]],PARAMETER["Longitude of projection centre",7.43958333333333,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8812]],PARAMETER["Azimuth at projection centre",90,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8813]],PARAMETER["Angle from Rectified to Skew Grid",90,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8814]],PARAMETER["Scale factor at projection centre",1,SCALEUNIT["unity",1],ID["EPSG",8815]],PARAMETER["Easting at projection centre",2600000,LENGTHUNIT["metre",1],ID["EPSG",8816]],PARAMETER["Northing at projection centre",1200000,LENGTHUNIT["metre",1],ID["EPSG",8817]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1,ID["EPSG",9001]]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1,ID["EPSG",9001]]]]

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reference value changed for EPSG:2056 (LV95), about 80 m east and 146 m north. The old row is replaced by a value that the new code produces. The row was previously in by_code_only, so it was never checked numerically. It is now checked to 1 m against this row, so the row and the code agree by construction. The header attributes the new value to PROJ 9.8.1, but PROJ version bumps don't usually move LV95 by about 150 m. The likely cause is a different datum operation (the bundled Helmert versus a grid, or a changed CH1903+ transformation), not the projection formula.

Confidence: medium. I could not verify this offline. Before merging, please state which PROJ operation produced the new value, and check it against an independent source such as swisstopo's published LV95 coordinates for a reference point. If the 150 m shift is not explained, keep the old value and investigate the Swiss path separately.

// arrives as the plain name through the METHODS table.
"HOTINE_OBLIQUE_MERCATOR" | "HOTINE_OBLIQUE_MERCATOR_AZIMUTH_NATURAL_ORIGIN" if get(&["AZIMUTH"]).is_some() => omerc(true)?,
// EPSG's methods 9806 and 9818 have no scale factor; PROJ's cass and poly ignore one.
"CASSINI_SOLDNER" => format!("+proj=cass +lat_0={lat0} {at}"),

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Possible gap: ArcGIS's .prj name for Cassini-Soldner may not match. The reader matches only CASSINI_SOLDNER, which is the normalized form of GDAL's Cassini_Soldner. ArcGIS, as I recall it, writes Cassini. Such files are refused with an error rather than drawn wrong, so this is not silent. It is still a gap for the ESRI systems the PR mentions as candidates.

Confidence: low to medium, unverified here. If it's right, add the alias and a test with an ESRI Cassini .prj:

Suggested change
"CASSINI_SOLDNER" => format!("+proj=cass +lat_0={lat0} {at}"),
"CASSINI_SOLDNER" | "CASSINI" => format!("+proj=cass +lat_0={lat0} {at}"),

Comment thread docs/user-guide/data.md
available. Swiss oblique Mercator and the standard Krovak East/North variant are supported from
their parameters.
available. Swiss oblique Mercator, the standard Krovak East/North variant, and the oblique
Mercator, Cassini-Soldner, polyconic and Equal Earth methods are supported from their

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The docs overstate the oblique Mercator support. Only the azimuth forms are supported. The two-point Hotine form (no AZIMUTH, ESRI 53025 and 54025) is still refused, as esri.rs says. Suggest "the azimuth forms of the oblique Mercator". The same applies to the refusal list in docs/user-guide/maps.md (around line 329), which now omits the two-point case. Confidence: high.

@github-actions

Copy link
Copy Markdown
Contributor

Code review

Scope: This PR is titled "chore(deps): bump proj4rs from 0.2.1 to 0.3.0", but the diff also adds about 200 lines of new projection support: Hotine oblique Mercator, Cassini-Soldner, polyconic and Equal Earth, plus tests and docs. The PR body is Dependabot's text and says none of this. The bump and the feature should be split into separate PRs or commits.

Bugs

  • EPSG:2056 (LV95) reference value changed by about 80 m east and 146 m north in wkt2_corpus.tsv. The row was previously excluded from the numeric check; it is now checked to 1 m against the new value, so it agrees with the code by construction. The explanation given is a PROJ version change, which is unlikely to account for a shift this size. Likely a different datum operation. Confidence: medium. (Posted inline.)
  • Possible ESRI name gap: the reader matches only CASSINI_SOLDNER, but ArcGIS may write Cassini. Such files are refused rather than drawn wrong. Confidence: low to medium, unverified. (Posted inline with a suggestion.)

Security: No issues found. The new WKT paths use get/ok_or_else/unwrap_or, with no unwrap or panic in non-test code. Malformed or non-finite azimuths reach the existing proj4rs error path.

Performance: Nothing notable.

Quality

  • The engine test asserts that EPSG:8441 fails with labrd. With proj4rs = "0.3", a future 0.3.x patch that adds Laborde would break it. Confidence: medium.
  • esri.rs wording: "two two-point oblique Mercators" is a stutter. Nit.
  • The wkt2_corpus.tsv header line wrap is awkward ("which use WGS 84 and the bundled / # Helmert shift."). Nit.
  • Documentation overstates oblique Mercator support. (Posted inline on data.md line 78; the same applies to the maps.md refusal list around line 329.)

AGENTS.md

  • The PR changes dependencies, but THIRD-PARTY-LICENSES.txt lists crate names without versions, so a stale notice is unlikely from the version bump alone. Please still run cargo xtask notices and confirm. proj4rs-geodesic also drops cc and adds wasm-bindgen, which needs a wasm build check (cargo build --target wasm32-unknown-unknown -p rustgis-web).
  • The PR does not name the sources followed for the new methods (EPSG method definitions, PROJ reference values). AGENTS.md requires this. Confidence: medium.
  • Verified by reading only, not run: the test suite, the wasm build, and the proj4rs 0.3 API and feature names. Those need CI.

Change size

Compared: the whole PR against main (merge base 6692b1b to PR head 85cb511).

Measure Value
Files changed 9 (0 added, 9 modified, 0 removed, 0 renamed)
Size before 2.18 MB
Size after 2.19 MB
Total size change +7.1 KB
Path Before After Change
crates/data/src/raster/wkt.rs 91.2 KB 97.2 KB +6.0 KB
crates/map/src/projection.rs 85.9 KB 86.7 KB +826 B
crates/data/src/raster/esri.rs 391.3 KB 391.5 KB +229 B
crates/data/src/raster/wkt2_corpus.tsv 89.6 KB 89.7 KB +105 B
docs/user-guide/data.md 78.3 KB 78.4 KB +75 B
crates/engine/src/tests.rs 1.24 MB 1.24 MB +72 B
docs/user-guide/maps.md 31.4 KB 31.4 KB −29 B
Cargo.lock 184.7 KB 184.7 KB +10 B
Cargo.toml 5.9 KB 5.9 KB 0 B

giswqs and others added 3 commits October 31, 2026 13:17
Buffer's fix lets a long line and polygons agree with the reference, and
the test fails on a marked case that agrees. The point and road cases
still differ, within their looser tolerance, so they keep theirs.
Comment thread Cargo.toml
# The tests' Zstandard-compressed GeoTIFFs (the version the tiff crate decodes with).
zstd = { version = "0.14", default-features = false }
proj4rs = { version = "0.2", default-features = false }
proj4rs = { version = "0.3", default-features = false }

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bugs (CI): fuzz/Cargo.lock still pins proj4rs 0.2.1 and proj4rs-geodesic 0.1.1. The fuzz crate is its own workspace and builds rustgis-data by path, so it now needs proj4rs 0.3. .github/workflows/fuzz.yml runs cargo deny --manifest-path fuzz/Cargo.toml --locked check licenses, which fails when the lock would need an update. That job runs on ci:fuzz-labelled PRs and nightly. Fix: run cargo update -p proj4rs --manifest-path fuzz/Cargo.toml (or cargo generate-lockfile there) and commit the lock. Confidence: high.

Comment on lines +1178 to +1179
// does: 54°W 10°S lands at (5 000 000, 8 894 145.167) in pyproj 3.8.0's EPSG:5880, its
// false easting less a million-odd metres.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Quality: the comment is wrong about which offset is which. x = 5 000 000 is EPSG:5880's false easting, so it isn't "its false easting less a million-odd metres". The offset is in the northing: 10 000 000 − 8 894 145 ≈ 1.1 million m. Confidence: medium-high (from the EPSG:5880 parameters, not checked against the file).

Suggested change
// does: 54°W 10°S lands at (5 000 000, 8 894 145.167) in pyproj 3.8.0's EPSG:5880, its
// false easting less a million-odd metres.
// does: 54°W 10°S lands at (5 000 000, 8 894 145.167) in pyproj 3.8.0's EPSG:5880: the
// false easting itself, and the false northing (10 000 000) less about 1.1 million metres.

@github-actions

Copy link
Copy Markdown
Contributor

Code review

Bugs

  • fuzz/Cargo.lock still pins proj4rs 0.2.1 and proj4rs-geodesic 0.1.1. The fuzz crate builds rustgis-data by path, so it needs 0.3. The fuzz licences job runs cargo deny --locked, which fails on a stale lock. It runs on ci:fuzz-labelled PRs and nightly. Fix: cargo update -p proj4rs --manifest-path fuzz/Cargo.toml. (Inline on Cargo.toml:65.) Confidence: high.

Security

  • Nothing found. The new custom() and to_wkt() arms format only parsed f64 values into proj strings, so a WKT or proj-string parameter cannot inject extra + terms.

Performance

  • Nothing found.

Quality

AGENTS.md

  • Notices are name-based, so the THIRD-PARTY-LICENSES.txt files don't need regenerating. The fuzz lock item above is the one dependency-file gap.
  • The new refusals (azimuth 90°/270°, missing azimuth, Laborde) return errors, not silent results, and each has a test. No unwrap/panic appears in non-test code.

No other findings survived. I did not run the test suite, since this review had no execution tool; the pyproj-derived expectations are unverified.

Change size

Compared with main (merge base 78b1799 to PR head 751307d), the whole PR.

Measure Value
Files changed 11 (0 added, 11 modified, 0 removed, 0 renamed)
Size before 2.25 MB
Size after 2.26 MB
Total size change +6.7 KB
Path Before After Change
crates/data/src/raster/wkt.rs 91.2 KB 97.2 KB +6.0 KB
crates/map/src/projection.rs 85.9 KB 86.7 KB +826 B
crates/analysis/tests/reference/cases.json 14.7 KB 14.4 KB −345 B
crates/data/src/raster/esri.rs 391.3 KB 391.5 KB +229 B
crates/data/src/raster/wkt2_corpus.tsv 89.6 KB 89.7 KB +105 B
docs/user-guide/data.md 78.3 KB 78.4 KB +75 B
crates/engine/src/tests.rs 1.28 MB 1.28 MB +72 B
docs/user-guide/maps.md 31.4 KB 31.4 KB −29 B
crates/analysis/tests/reference/generate.py 27.1 KB 27.1 KB −21 B
Cargo.lock 184.7 KB 184.7 KB +10 B
Cargo.toml 5.9 KB 5.9 KB 0 B

@deniial00

Copy link
Copy Markdown
Member

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Nov 1, 2026 •

Copy link
Copy Markdown
Contributor
Action not completed

Review skipped.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

//! planetary ones (Moon, Mars), whose bodies the map can't hold;
//! - the seven PROJ can't write as a PROJ string (Hammer–Aitoff, Fuller, Cube, Tobler …) and the
//! two oblique Mercators it refuses (53025, 54025).
//! two two-point oblique Mercators (53025, 54025), for which RustGIS has no WKT form.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit (wording, high confidence): "for which RustGIS has no WKT form" makes it sound as if these two codes have no WKT at all. ESRI's WKT1 does have a two-point form, and RustGIS refuses it (the azimuth-less case in wkt.rs, around line 685). The previous wording, "it refuses", said that. The doubled "two two-point" also reads awkwardly.

Suggested change
//! two two-point oblique Mercators (53025, 54025), for which RustGIS has no WKT form.
//! two-point oblique Mercators (53025, 54025), which RustGIS refuses.

@github-actions

github-actions Bot commented Nov 1, 2026

Copy link
Copy Markdown
Contributor

Code review

I read the full diff against the staged AGENTS.md and the prior threads. I checked the new Hotine/omerc guard and its WKT1/WKT2 method mapping, the to_wkt arms (including the generic false easting/northing push), the Projector finite checks, the new test assertions, the Domain::Cap change, and both lockfiles. I found no confirmed bugs, security issues, or performance problems. One nit is posted inline (esri.rs:27).

Bugs

  • Low confidence (about 30%): to_wkt (crates/data/src/raster/wkt.rs, the "omerc" arm, around line 1244) writes a Hotine WKT for a PROJ definition with +alpha=90 or 270, which the reader now refuses. A file could be written that won't read back. It only arises from a degenerate PROJ string, so I'm not posting it inline.

Security

  • None found. Parsed numbers go through num()'s finite filter, and Projector::forward rejects non-finite output.

Performance

  • None found.

Quality

  • Posted inline on crates/data/src/raster/esri.rs:27: the new wording "for which RustGIS has no WKT form" is inaccurate, since the two-point form exists and is refused. High confidence.

AGENTS.md

  • No new violations. The added non-test code has no unwrap/expect/indexing, refusals are errors rather than silent drops, and the test changes cover both the refusal and the accept paths.

Earlier threads

  • I left 14 earlier threads alone: 5 resolved, 9 unresolved. Their points still stand in the diff, and none has new evidence. Two of them are addressed by this push: the fuzz lockfile now pins proj4rs 0.3.0, and the omerc refusal now covers 270°. The unanswered comment about the EPSG:5880 offset wording (projection.rs around line 1179) is still present.

Change size

Compared: the whole PR against main (merge base 4392fc2 to PR head 255d8ce).

Measure Value
Files changed 10 (added 0, modified 10, removed 0, renamed 0)
Size before 2.34 MB
Size after 2.34 MB
Total size change +7.25 KB
Path Before After Change
crates/data/src/raster/wkt.rs 91.2 KB 97.2 KB +5.98 KB
crates/map/src/projection.rs 85.9 KB 86.7 KB +826 B
crates/data/src/raster/esri.rs 391.3 KB 391.5 KB +229 B
crates/data/src/raster/wkt2_corpus.tsv 89.6 KB 89.7 KB +105 B
docs/user-guide/data.md 81.5 KB 81.6 KB +75 B
crates/engine/src/tests.rs 1.30 MB 1.30 MB +72 B
docs/user-guide/maps.md 32.0 KB 32.0 KB −29 B
Cargo.lock 184.7 KB 184.7 KB +10 B
fuzz/Cargo.lock 97.2 KB 97.3 KB +10 B
Cargo.toml 5.9 KB 5.9 KB 0 B

@deniial00

Copy link
Copy Markdown
Member

@coderabbitai resume

@coderabbitai

coderabbitai Bot commented Nov 1, 2026 •

Copy link
Copy Markdown
Contributor
Action not completed

Review skipped.

@deniial00
deniial00 merged commit 4b454e7 into main Nov 2, 2026
28 of 29 checks passed
@deniial00
deniial00 deleted the dependabot/cargo/proj4rs-0.3.0 branch November 2, 2026 18:16
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependencies Pull requests that update a dependency file rust Pull requests that update rust code

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants