Validity of cross-border monthly pass on rail replacement bus services

Hi, I'm renting living in Thionville and I hold a valid monthly train pass covering the journey between Thionville and Bettembourg. Due to the planned rail infrastructure works between 16 July and 23 August, I will be using the official CFL rail replacement bus services to travel to my destination at Belval-Université, even though these buses may follow a different route than the train line.

Could you please confirm if my existing monthly cross-borde train pass is officially accepted as a valid travel document for the entire duration of the journey on these designated replacement buses?

Many thanks

reddit.com
u/Nicholas_Geo — 1 day ago

Package for downloading data from geostationary satellite?

Hi, I want to download land surface temperature data from geostationary MTG satellite. These are 10 minutes data. I Googled online if there is any package that can help me do that but I couldn't find anything useful.

Any recommendations?

reddit.com
u/Nicholas_Geo — 11 days ago

[Q] Quantifying discretization error and spatial support changes in covariate aggregation for spatial downscaling

In a spatial downscaling experiment (i.e., increasing the spatial resolution), I am upscaling sensor Viewing Angle (VA) by an aggregation factor of 3 to reduce computational cost. This workflow assumes scale invariance.

My supervisor raised a concern regarding the Change of Support problem and discretization. Because the VA follows a continuous spatial gradient from nadir to the edge of the swath, aggregating into larger spatial blocks turns a smooth gradient into a stepped surface. The concern is that if the block size becomes too large, the variance within a single aggregated block will become too large to safely ignore, thereby violating the assumption that the value represents a uniform spatial support.

To mathematically prove that the discretization error is negligible, I proposed calculating the ratio of the within-block standard deviation to the between-block standard deviation.

My hypothesis is that if this ratio is sufficiently small (e.g., < 0.05), and the absolute physical range of values within any single block is minimal, the aggregation is methodologically justified.

Is the ratio of within-block to between-block variance a statistically rigorous metric for validating spatial aggregation and addressing the Change of Support concern in this context?

Without wanting to add complexity to the post, the overall aim is to measure the effect of the sensor's viewing angle on the point spread function.

reddit.com
u/Nicholas_Geo — 16 days ago

Two rows quick link missing from New look

Hi, I switched to New look and I can't figure out how to specify two rows in the quick links. In the old look I could easily do that. Please see the attached images. In fact, there is no option to add a second row in the New look. Is that the case or I missed something?

u/Nicholas_Geo — 22 days ago

Ιnstallation issue with GWmodel3 from source – missing libgwmodel submodule

Hi,

I am trying to install GWmodel3 from the source repository on my Linux system, but the compilation fails because the libgwmodel submodule is missing.

$  inxi -Sxxx
System:
  Host: Lenovo-Z50-70 Kernel: 6.17.0-35-generic arch: x86_64 bits: 64
    compiler: gcc v: 13.3.0 clocksource: tsc
  Desktop: MATE v: 1.26.2 wm: marco v: 1.26.2 with: mate-panel
    tools: mate-screensaver vt: 7 dm: LightDM v: 1.30.0
    Distro: Linux Mint 22.3 Zena base: Ubuntu 24.04 noble

Already installed dependencies GSL, sf and RcppArmadillo when I created the R project I am working on, many months ago.

What I did

  1. Downloaded GWmodel3-master.zip from GitHub.
  2. Unzipped into my R project folder that uses renv.
  3. Ran R CMD build GWmodel3-master → the DESCRIPTION was OK, but the build process failed with:

&#8203;

make: *** No rule to make target 'libgwmodel/src/gwmodelpp/spatialweight/BandwidthWeight.cpp', needed by '.../BandwidthWeight.o'. Stop.
ERROR: compilation failed for package ‘GWmodel3’

I checked the unzipped folder and confirmed that libgwmodel is missing.
The .gitmodules file exists, but the submodule content is not included in the ZIP archive.

I also tried to install the package using pak,same issue.

&gt; sessionInfo()
R version 4.6.0 (2026-04-24)
Platform: x86_64-pc-linux-gnu
Running under: Linux Mint 22.3

Matrix products: default
BLAS:   /usr/lib/x86_64-linux-gnu/blas/libblas.so.3.12.0 
LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.12.0  LAPACK version 3.12.0

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C               LC_TIME=el_GR.UTF-8        LC_COLLATE=en_US.UTF-8     LC_MONETARY=el_GR.UTF-8   
 [6] LC_MESSAGES=en_US.UTF-8    LC_PAPER=el_GR.UTF-8       LC_NAME=C                  LC_ADDRESS=C               LC_TELEPHONE=C            
[11] LC_MEASUREMENT=el_GR.UTF-8 LC_IDENTIFICATION=C       

time zone: Europe/Paris
tzcode source: system (glibc)

attached base packages:
[1] stats     graphics  grDevices datasets  utils     methods   base     

loaded via a namespace (and not attached):
[1] compiler_4.6.0    tools_4.6.0       rstudioapi_0.19.0 renv_1.2.3 

R version 4.6.0 (2026-04-24)
Platform: x86_64-pc-linux-gnu
Running under: Linux Mint 22.3

Matrix products: default
BLAS:   /usr/lib/x86_64-linux-gnu/blas/libblas.so.3.12.0 
LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.12.0  LAPACK version 3.12.0

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C               LC_TIME=el_GR.UTF-8        LC_COLLATE=en_US.UTF-8     LC_MONETARY=el_GR.UTF-8   
 [6] LC_MESSAGES=en_US.UTF-8    LC_PAPER=el_GR.UTF-8       LC_NAME=C                  LC_ADDRESS=C               LC_TELEPHONE=C            
[11] LC_MEASUREMENT=el_GR.UTF-8 LC_IDENTIFICATION=C       

time zone: Europe/Paris
tzcode source: system (glibc)

attached base packages:
[1] stats     graphics  grDevices datasets  utils     methods   base     

loaded via a namespace (and not attached):
[1] compiler_4.6.0    tools_4.6.0       rstudioapi_0.19.0 renv_1.2.3 
u/Nicholas_Geo — 24 days ago

Is dqf == 0 the correct way to mask GOES-16 LST (Land Surface Temperature) data over land using the terra package?

Hi everyone,

I am preprocessing GOES-16 ABI Level 2 Land Surface Temperature data (OR_ABI-L2-LSTC) using the terra package in R. I want to ensure I am correctly filtering out clouds and bad pixels so that only high-quality data remains over my study area. I have never worked with such dataset before.

When inspecting the NetCDF attributes of the DQF (Data Quality Flag) layer using ncdf4, the file returns these bitwise flag meanings:

&gt; print(dqf_values)
 [1]  0  0  2  0  4  0  8  0 16  0 32
&gt; print(dqf_meanings)
[1] "good_retrieval_qf valid_input_data_qf invalid_due_to_bad_or_missing_input_data_qf valid_clear_conditions_qf invalid_due_to_cloudy_conditions_qf valid_LZA_qf degraded_due_to_LZA_threshold_exceeded_qf valid_land_or_inland_water_surface_type_qf invalid_due_to_water_surface_type_qf valid_land_surface_temperature_qf invalid_due_to_out_of_range_land_surface_temperature_qf"

If I blindly filter using dqf == 0, all of my lakes get completely masked out because the satellite automatically triggers the water surface flag (Bit 4 = 16) for them (at least that what an LLM said), even if the pixel retrieval is perfectly clear and valid.

To fix this, I am switching to a native terra bitwise approach to explicitly target and mask only clouds, bad data, and out-of-range values, while purposefully letting the water flag pass through:

library(terra)
r &lt;- rast("path_to_goes_file.nc")

lst_raw &lt;- r[["LST"]]
dqf     &lt;- r[["DQF"]]

# Bitwise checks using terra's native operators
bad_data   &lt;- (dqf &amp; 2) == 2
cloudy     &lt;- (dqf &amp; 4) == 4
out_range  &lt;- (dqf &amp; 32) == 32

# Mask out errors, but ignore Bit 4 (16) so lakes are preserved
good_pixels_mask &lt;- !bad_data &amp; !cloudy &amp; !out_range

lst_masked  &lt;- mask(lst_raw, good_pixels_mask, maskvalues = FALSE)
lst_celsius &lt;- lst_masked - 273.15
  1. Does this bitwise logic look solid for capturing valid inland water temperatures alongside land?
  2. In the attached image, near bottom, it appears stripes, is this normal in GOES-16 LST after applying DFQ?

Thanks in advance for verifying!

&gt; sessionInfo()
R version 4.6.0 (2026-04-24 ucrt)
Platform: x86_64-w64-mingw32/x64
Running under: Windows 11 x64 (build 26200)

Matrix products: default
  LAPACK version 3.12.1

locale:
[1] LC_COLLATE=English_United States.utf8  LC_CTYPE=English_United States.utf8    LC_MONETARY=English_United States.utf8
[4] LC_NUMERIC=C                           LC_TIME=English_United States.utf8    

time zone: Europe/Paris
tzcode source: internal

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] ncdf4_1.24   terra_1.9-27

loaded via a namespace (and not attached):
 [1] compiler_4.6.0    cli_3.6.6         ragg_1.5.2        tools_4.6.0       rstudioapi_0.19.0 Rcpp_1.1.1-1.1    codetools_0.2-20 
 [8] textshaping_1.0.5 lifecycle_1.0.5   rlang_1.2.0       systemfonts_1.3.2

Edit 1

This the newest version, what do you think? I am only interested in good quality pixels:

pacman::p_load(terra, ncdf4, tmap, stars)

f &lt;- "path/OR_ABI-L2-LSTC-M3_G16_s20180010822197_e20180010824571_c20180010826159.nc"

# ------------------------------------------------------------
# 1. Read with stars (GDAL handles GOES fixed-grid projection)
# ------------------------------------------------------------
s &lt;- read_stars(f, sub = c("LST", "DQF"))

lst_raw &lt;- s["LST"]
dqf     &lt;- s["DQF"]

# ------------------------------------------------------------
# 2. DQF mask (still in Kelvin)
# ------------------------------------------------------------
dqf_arr   &lt;- dqf[[1]]
bad_data     &lt;- bitwAnd(dqf_arr,  2L) == 2L   # bad/missing input
cloudy       &lt;- bitwAnd(dqf_arr,  4L) == 4L   # cloudy
lza          &lt;- bitwAnd(dqf_arr,  8L) == 8L   # degraded LZA threshold
# water        &lt;- bitwAnd(dqf_arr, 16L) == 16L  # water surface — was MISSING, if I want to remove water
out_range    &lt;- bitwAnd(dqf_arr, 32L) == 32L  # out of range LST

# Water flag (16) is intentionally excluded to keep lakes
good_mask &lt;- !(bad_data | cloudy | lza | out_range)
good_mask[is.na(good_mask)] &lt;- FALSE

lst_k &lt;- lst_raw
lst_k[[1]][!good_mask] &lt;- NA

names(lst_k) &lt;- "LST_K"
u/Nicholas_Geo — 26 days ago

How to assign, randomly, red hues in each cell of a grid?

I am working on Inkscape and I want to create a grid with a red color palette where the red hues are assigned randomly to each cell. Basically, I want to re-create the below image, but with random red hues in each grid:

Example

(Namaiti et al., 2026).

I am very new to the software so I am not really sure how to proceed. I can create the desired grid be selecting Extensions -> Render -> Grid -> Cartesian Grid and finally, from the Layers and Objects menu I remove the subGridlines.

I am very new to the software so I am not really sure how to proceed. I can create the desired grid be selecting Extensions -> Render -> Grid -> Cartesian Grid and finally, from the Layers and Objects menu I remove the subGridlines.

I still don't know how to automatically assign random red hues in each cell of the grid. Is there a way to do so or I have to do it manually?

Inkscape 1.4.3 (0d15f75, 2025-12-25)

                  Compile  (Run)
GLib version:     2.86.3
GTK version:      3.24.51 (3.24.51)
glibmm version:   2.66.8
gtkmm version:    3.24.10
libxml2 version:  2.15.1
libxslt version:  1.1.45
Cairo version:    1.18.4 (1.18.4)
Pango version:    1.56.4 (1.56.4)
HarfBuzz version: 12.2.0 (12.2.0)

OS version:       Windows 11 25H2

I have found this post, where it says to Create Tiled Clones, but I can't figure out how to set Unset Paint on the initial square.

reddit.com
u/Nicholas_Geo — 27 days ago

How to apply a geometric anisotropic filter 1/cos²(theta) to a raster?

I am downscaling (i.e., increasing the spatial resolution) VIIRS nighttime lights imagery. The transfer function between the coarse and fine resolution is approximated by a Gaussian filter whose width σ varies with the per‑column viewing angle θ. This is an analytical, geometric relationship, not an estimate.

In the cross‑track direction (left→right), the sigma scales as

σ(θ)=σ_0/cos^2θ

where θ is the per‑pixel viewing angle. The filter should act only horizontally (along x), pooling all y‑values within the column uniformly. My earlier attempt simply multiplied the raster values by

1/cos^2θ

Given a value raster x and an angle raster theta with identical dimensions, what is the correct and efficient way in R (using terra) to apply a 1‑D Gaussian blur on each row, where the kernel’s standard deviation is determined by theta at the central pixel’s column?

Current (incomplete) attempt:

library(terra)

# ---- 1. Create example rasters ----
set.seed(42)
nrows &lt;- 5
ncols &lt;- 200

x &lt;- rast(nrows = nrows, ncols = ncols, vals = runif(nrows * ncols))
theta_vals &lt;- rep(seq(20, 26, length.out = ncols), each = nrows)
theta &lt;- rast(nrows = nrows, ncols = ncols, vals = theta_vals)

# ---- 2. Spatially varying Gaussian blur function ----
# sigma0 = standard deviation of Gaussian at nadir (in pixel units)
# theta: raster of angles in degrees (same dimensions as x)
anisotropic_blur &lt;- function(x, theta, sigma0 = 10) {
  # Convert to matrix (rows = y, cols = x)
  mat_x &lt;- as.matrix(x, wide = TRUE)
  mat_angle &lt;- as.matrix(theta, wide = TRUE)  # same dimensions
  nr &lt;- nrow(mat_x)
  nc &lt;- ncol(mat_x)
  mat_out &lt;- matrix(NA_real_, nr, nc)
  
  # For each row, apply convolution with column-dependent sigma
  for (r in 1:nr) {
    row_vals &lt;- mat_x[r, ]
    for (c in 1:nc) {
      theta_c &lt;- mat_angle[r, c]               # angle at this pixel (degrees)
      sigma &lt;- sigma0 / (cos(theta_c * pi/180)^2)
      halfwin &lt;- ceiling(3 * sigma)            # kernel half‑width
      col_idx &lt;- max(1, c - halfwin) : min(nc, c + halfwin)
      dist &lt;- abs(col_idx - c)
      w &lt;- exp(-0.5 * (dist / sigma)^2)
      w &lt;- w / sum(w)
      mat_out[r, c] &lt;- sum(w * row_vals[col_idx])
    }
  }
  # Return as raster with same properties
  rast(mat_out, crs = crs(x), ext = ext(x))
}

# ---- 3. Apply the filter ----
x_blurred &lt;- anisotropic_blur(x, theta, sigma0 = 10)

# ---- 4. Plot side‑by‑side ----
par(mfrow = c(1, 2))
plot(x, main = "Original predictor")
plot(x_blurred, main = expression("Filtered: Gaussian "*sigma*" = "*sigma[0]/cos^2*theta))

I need to actually perform a 1‑D Gaussian convolution along rows with a column‑varying (σ). What is an idiomatic way to do this in terra?

reddit.com
u/Nicholas_Geo — 2 months ago

Commuting to Lux: Is the "Thionville to Bettembourg Frontière" monthly pass correct? Does it cover the return?

Hello everyone,

I am setting up my daily train travelling from Thionville to Luxembourg for work. I am over 26 years old, so I am looking at the Abonnement Presto Mensuel from TER Grand Est.

Because public transport inside Luxembourg is free, I am trying to use the pricing loophole by selecting Bettembourg Frontière as my destination so I only pay for the French side of the tracks.

Here is the exact link to the pass I am looking at.

When selecting the stations, I picked:

  • Departure: Thionville
  • Arrival: Bettembourg Frontière

I have two questions for the experienced commuters between borders here:

  1. Is this the correct trip?
  2. Does this cover the return trip? When I take the train back in the evening from Luxembourg/Bettembourg to Thionville, does this specific pass cover me for the return leg once the train crosses back into France, or do I need to buy a separate pass for the "Bettembourg Frontière -> Thionville" direction?

Thanks in advance for your help!

reddit.com
u/Nicholas_Geo — 2 months ago

[Transport] Citéline Bus (Florange/Thionville): How to get the contactless card when commuting to Lux every day?

Hello everyone,

I just moved to Florange and I am starting my new daily commute to Luxembourg for work.

For the first leg of my trip, I need to take the local bus from Florange to get to Thionville (train station) before heading across the border. I am over 26 years old.

Looking at the temo 'b website, it looks like the Pass Mouv' at €35/month is the standard unlimited monthly pass for my age group. Can anyone confirm if this is the correct one for my daily commute?

My main issue is the logistics of actually getting the physical Contactless Card (Temo'b / SimpliCités): Because I leave early in the morning and get back late from Luxembourg during the week, it is completely impossible for me to visit a Temo'b boutique (in Florange) during their weekday opening hours.

I have a few questions for anyone familiar with the network:

  1. Is it possible to do the entire card creation process online and have it sent to my home address? If so, how long does it usually take to arrive?
  2. Once I finally have the physical card, can I easily top it up online (and if so, how?), or do I still have to use a physical machine/ticket office?
  3. Is the Temo'b boutique in Thionville open on Saturday mornings, and do they print the card on the spot if I walk in?

Thanks in advance for any tips to help a new commuter out!

reddit.com
u/Nicholas_Geo — 2 months ago
▲ 2 r/Luxembourg+1 crossposts

Hi everyone! I’m moving to Thionville soon and will be commuting daily to Esch-sur-Alzette (Luxembourg) for work.

I’ve been trying to find a way to purchase a monthly train or bus pass online before I arrive, but I’m struggling to find a clear portal that handles the cross-border aspect.

A few specific questions for the daily commuters:Is there a specific app or portal you use to buy a monthly "cross-border" pass for the train?

  1. For the bus (like the 551), is there a separate digital subscription, or is it covered by the same pass as the train
  2. Physical vs. Digital: Do I need to physically go to Thionville station to set up a subscription for the first time, or can the whole process be done from my phone?
  3. Free Transport: Since transport is free inside Luxembourg, how does that affect the price/type of monthly pass I should be looking for from France?

Any advice or "hacks" to make the daily border crossing smoother would be amazing. Thanks in advance!

reddit.com
u/Nicholas_Geo — 2 months ago
▲ 5 r/rstats

I am downscaling (i.e., increasing the spatial resolution) VIIRS nighttime lights imagery. The transfer function between the coarse and fine resolution is approximated by a Gaussian filter whose width σ varies with the per‑column viewing angle θ. This is an analytical, geometric relationship, not an estimate.

In the cross‑track direction (left→right), the sigma scales as

σ(θ)=σ_0/cos^2θ

where θ is the per‑pixel viewing angle. The filter should act only horizontally (along x), pooling all y‑values within the column uniformly. My earlier attempt simply multiplied the raster values by

1/cos^2θ

Given a value raster x and an angle raster theta with identical dimensions, what is the correct and efficient way in R (using terra) to apply a 1‑D Gaussian blur on each row, where the kernel’s standard deviation is determined by theta at the central pixel’s column?

Current (incomplete) attempt:

library(terra)

# ---- 1. Create example rasters ----
set.seed(42)
nrows &lt;- 5
ncols &lt;- 200

x &lt;- rast(nrows = nrows, ncols = ncols, vals = runif(nrows * ncols))
theta_vals &lt;- rep(seq(20, 26, length.out = ncols), each = nrows)
theta &lt;- rast(nrows = nrows, ncols = ncols, vals = theta_vals)

# ---- 2. Spatially varying Gaussian blur function ----
# sigma0 = standard deviation of Gaussian at nadir (in pixel units)
# theta: raster of angles in degrees (same dimensions as x)
anisotropic_blur &lt;- function(x, theta, sigma0 = 10) {
  # Convert to matrix (rows = y, cols = x)
  mat_x &lt;- as.matrix(x, wide = TRUE)
  mat_angle &lt;- as.matrix(theta, wide = TRUE)  # same dimensions
  nr &lt;- nrow(mat_x)
  nc &lt;- ncol(mat_x)
  mat_out &lt;- matrix(NA_real_, nr, nc)
  
  # For each row, apply convolution with column-dependent sigma
  for (r in 1:nr) {
    row_vals &lt;- mat_x[r, ]
    for (c in 1:nc) {
      theta_c &lt;- mat_angle[r, c]               # angle at this pixel (degrees)
      sigma &lt;- sigma0 / (cos(theta_c * pi/180)^2)
      halfwin &lt;- ceiling(3 * sigma)            # kernel half‑width
      col_idx &lt;- max(1, c - halfwin) : min(nc, c + halfwin)
      dist &lt;- abs(col_idx - c)
      w &lt;- exp(-0.5 * (dist / sigma)^2)
      w &lt;- w / sum(w)
      mat_out[r, c] &lt;- sum(w * row_vals[col_idx])
    }
  }
  # Return as raster with same properties
  rast(mat_out, crs = crs(x), ext = ext(x))
}

# ---- 3. Apply the filter ----
x_blurred &lt;- anisotropic_blur(x, theta, sigma0 = 10)

# ---- 4. Plot side‑by‑side ----
par(mfrow = c(1, 2))
plot(x, main = "Original predictor")
plot(x_blurred, main = expression("Filtered: Gaussian "*sigma*" = "*sigma[0]/cos^2*theta))

I need to actually perform a 1‑D Gaussian convolution along rows with a column‑varying (σ). What is an idiomatic way to do this in terra?

u/Nicholas_Geo — 2 months ago