Skip to content

Adding Range Doppler (rrdot) projection for working with Level-1 SAR data - #4922

Open
piyushrpt wants to merge 2 commits into
OSGeo:masterfrom
piyushrpt:feat/rrdot
Open

piyushrpt wants to merge 2 commits into
OSGeo:masterfrom
piyushrpt:feat/rrdot

Conversation

@piyushrpt

@piyushrpt piyushrpt commented Oct 22, 2026 •

Copy link
Copy Markdown

Adding support for the Range-Doppler coordinate system used by SAR missions.
This is the second projection system for SAR after sch.
For high resolution sensors that distribute data in Polar Format, this system can be used to describe the imaging geometry of an entire L1 product.
For missions like NISAR and Sentinel-1, which use time dependent projection systems, this can describe the imaging geometry of one range line in the Level-1 produts.

  • AI (Copilot or something similar) supported my development of this PR. See our policy about AI tool use. Use of AI tools must be indicated.
  • Closes #xxxx
  • Tests added
  • Added clear title that can be used to generate release notes
  • Fully documented, including updating docs/source/*.rst for new API

@piyushrpt

Copy link
Copy Markdown
Author

Also, attaching a more complete test suite for rrdot. Did not include in the default test suite as exact zeros get flipped to -0 on Windows after rounding on some tests.
test_rrdot.txt

@piyushrpt

Copy link
Copy Markdown
Author

Minor bug fix caught thanks to @scottstanie

If one wants to test this with simple SICD PFA files, the code would look something like this

from osgeo import gdal
import xml.etree.ElementTree as ET

# Build rrdot proj string from SICD file
ds = gdal.Open(nitffile, gdal.GA_ReadOnly)
meta = ds.GetMetadata("xml:DES")[0]
ds = None
first = meta.find("<SCPCOA>")
second = meta.find("</SCPCOA>", first)
root = ET.fromstring(meta[first:second + 9])
params = {}
pos = root.find("ARPPos")
for axis in ["X", "Y", "Z"]:
    params[axis.lower()] = float(pos.find(axis).text)

vel = root.find("ARPVel")
for axis in ["X", "Y", "Z"]:
    params[f"V{axis}".lower()] = float(vel.find(axis).text)

params["left"] = root.find("SideOfTrack").text.startswith("L")
print(params)

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant