Keeping pixels aligned across sensors

I’m co-registering Sentinel‑2 L2A (10 m) with NAIP 2021 (0.6 m) over the Sacramento River; after warping both to EPSG:26910 in QGIS 3.34 with gdalwarp, I still see about 8–12 m drift along levee edges. What’s your go-to to preserve edge integrity and spectral values — anchor everything to NAIP with nearest neighbor, or do you fine-register with GCPs/OTB because we’re up against Sentinel‑2’s geolocation limits?

‌⁠‍⁠​‍​‍‌⁠‌​​‍​‍​⁠‍‍​‍​‍‌‍‌⁠‌‍‌⁠‌‍‍‍​‍​‍​‍⁠​​‍​‍‌‍‍⁠​‍​‍​⁠‍‍​‍​‍‌‍⁠‍‌‍‌‌‌⁠‌⁠‌‌⁠⁠‌⁠‌​‌‍⁠⁠‌⁠​​‌‍‍‌‌‍​⁠​‍​‍​‍⁠​​‍​‍‌‍‍‌‌‍‌​​‍​‍​⁠‍‍​‍​‍‌‍⁠‍‌‍‌‌‌⁠‌⁠​‍​‍​‍⁠​​‍​‍‌‍‌​​‍​‍​⁠‍‍​‍​‍​⁠​‍​⁠​​​⁠​‍​⁠‌‌​⁠​‌​⁠​‍​⁠​‍​⁠‌‌​‍​‍​‍⁠​​‍​‍‌‍‍​​‍​‍​⁠‍‍​‍​‍​⁠‌‌‌⁠‌⁠‌‌‌​‌​‌‍‌‌‌⁠‌‍‌​‌⁠‍‌​⁠‌⁠‌⁠‌‍​‍⁠‌‌​⁠‌‌‍‌⁠‌​‍‍‌‌‌⁠‌​⁠‌‌‍​⁠​‍​‍‌⁠⁠‌​​

@OP I’ve seen that 8–12 m along the Sac levees; I anchor to NAIP 2021, snap S2 onto the NAIP grid with gdalwarp -tap -tr 10 10 -te -t_srs EPSG:26910 -r near, then run OTB FineRegistration on a handful of levee-edge GCPs for a subpixel nudge (FineRegistration — Orfeo ToolBox 9.1.0 documentation). If you’re in a hurry, a single local affine from about 10 tie points gets you under about 2 m, but don’t resample NAIP again.

‌⁠‍⁠​‍​‍‌⁠‌​​‍​‍​⁠‍‍​‍​‍‌‍‌⁠‌‍‌⁠‌‍‍‍​‍​‍​‍⁠​​‍​‍‌‍‍⁠​‍​‍​⁠‍‍​‍​‍‌⁠​‍‌‍‌‌‌⁠​​‌‍⁠​‌⁠‍‌​‍​‍​‍⁠​​‍​‍‌‍‍‌‌‍‌​​‍​‍​⁠‍‍​⁠‌‍​⁠​‍​⁠‍​​⁠​‍​‍⁠​​‍​‍‌‍‌​​‍​‍​⁠‍‍​‍​‍​⁠​‍​⁠​​​⁠​‍​⁠‌‌​⁠​‌​⁠​‍​⁠​‍​⁠‌⁠​‍​‍​‍⁠​​‍​‍‌‍‍​​‍​‍​⁠‍‍​‍​‍‌‍⁠⁠‌‌​‍‌‍‍‌​‍⁠‌‌⁠‍​‌​⁠​​⁠‍​‌‌‌⁠​⁠‌‌‌⁠‌‍‌​⁠​‌⁠‌‍‌‍‌​‌⁠​‍​⁠‌‌‌​‍‍​‍​‍‌⁠⁠‌​