Select Page

Welcome to the EAGLE students' webpage!


This is the offical EAGLE master students’ webpage. Here you can find useful information on the EAGLE graduate program (M.Sc.) offered by the University of Würzburg and the German Aerospace Center (DLR), directly provided by its students.

Explore our news, read the students’ personal portraits or find FAQs and contact information.

Settling down in Würzburg – an International’s edition

Settling down in a foreign country can be a challenging process, especially if you do not speak their language well. Untangling the process can be daunting, complex, and usually lengthy.

Before you embark on this process, please make sure that you have enough money with you, so that you can survive until you have opened your bank account for your scholarship, blocked account or sponsors to deposit money for your use. Also, having someone who can help translate German is a boon to many of these steps. P/s: You also have the option to contact a student tutor for help.

Figure 1: Flowchart showing the basic process of settling down in Würzburg. Having a German phone line is highly useful, as communication will be easier. Arrows with unbroken lines denote that the process is sequential, while arrows with broken line mean that there are alternatives (read the article for more information).


Initial trip from the airport to Würzburg
The easiest option to travel to Würzburg is via train. You may purchase your tickets ahead of time via Deutsche Bahn website and search for a cheaper offer. Do provide ample time between your arrival and the train departure, as immigration clearance may take time if there’s a crowd and German trains are usually punctual.

Another option is by coach (locally known as bus). If you’re arriving at either Frankfurt or Munich International Airport, Flixbus provides cheap transport between the airport and Würzburg. However, coaches are definitely slower and less frequent than train.

German phone line (with data)
If you do not have any form of communication and want to avoid hefty overseas mobile charges, this is a very important milestone to clear. There are many options to choose – from phone shops with postpaid phone plans to the cheaper prepaid options from supermarkets.

In Germany, all SIM cards are sold locked. To unlock them for use, you have to complete a verification process, which require your passport, and a bit of time while they process your verification. If possible, complete the verification in the shop immediately after your SIM card purchase. This will save you the trouble of finding a WiFi source (especially if you do not have easy access to one) for the online verification. Do note that you’ll need a German address for this verification. It is possible to use an interim address (e.g. your temporary accommodation) for this.

For example, if you are purchasing the prepaid SIM cards from an ALDI supermarket, approach the cashier and ask for an in‑shop verification. While you might have to wait a while before the cashier is free to help you with the verification, it’s useful in the long run to get your communication channel up and running as soon as possible. Beware though, as some of us were unlucky and encountered service staffs that only spoke German.

Transport within Würzburg can be pricy. A bus ride will cost at least €2.70 per trip. Until you get your matriculation card (which also functions as a transport pass), it is recommended to get the day pass to cover your transport needs. The day pass can be easily obtained from any bus conductor or ticketing stations and costs €5.10.

In the unfortunate event which your matriculation card will take more than two weeks to issue, it will be more economical to purchase a monthly ticket that costs €45. This ticket allows you to travel within Würzburg and its surrounding areas without limitations for a month.

OpenStreetMap is the recommended map service for Würzburg, as Google Maps does not have information about the tram (locally known as street train, or Straßebahn) and bus services that ply in Würzburg. You may use also apps such as Bayern Fahrplan to help you with moving around Würzburg (Android and IOS).

Health insurance
Health insurance is required in Germany. You have a range of choices from both public and private health insurance companies. Do note that choosing between public or private health insurers will have short‑term and long‑term consequences, especially if you have plans to remain in Germany after your studies. You will not able to return to public insurance once you switch out to a private insurer. There is also an age‑restriction for entry into public health insurance (e.g. below 30 years of age). It is essential to do your due diligence before choosing.

If you choose a private health insurer, you would need to get an exemption letter from a public health insurer. One option is to visit the AOK Bayern Student Service Office in Sanderring. As long as your private health plan provides sufficient coverage and is valid for your whole school term (ie. at least 2 years coverage for the EAGLE programme), you may obtain the required exemption letter.

Bring along all necessary documents as instructed by the matriculation letter to the international office. Once you have matriculated, you will need to activate your online student account. The login information will be sent via email. As the activation is not immediate and will take a few days, do complete this online activation as soon as possible.

You will also need to wait for your matriculation card to be produced. The International Office will contact you once the card is ready. Take the card to a validation machine (available in the library and ground floor of building 82). Follow the instructions provided by the Office and your card is now valid for “free” transport.

This is a crucial milestone. Basically, a German address is required for matriculation, phone verification, health insurance, unlocking a blocked account (if you have one), and even opening a bank account. Not to mention, there will be less stress in your life with a secured roof over your head.

Unfortunately, the process of obtaining an accommodation is stuck in a loop with the bank account and residence permit. Simply put, a proof of residence (usually residence permit) is required to open a bank account, which may be required to pay for your accommodation, which then is required to apply for a residence permit.

Fortunately, alternatives are available to break this loop. Not all accommodations require a German bank account for payment. Bring sufficient cash to Germany so that you can use them to pay for an accommodation if needed. You may also wire or transfer money from an overseas account directly to your landlord to pay for your accommodation’s initial payment, if this option is available.

If you are fortunate enough to secure an accommodation before you arrive at Würzburg, give yourself a pat on the back. Demand for accommodation here is way more than supply – even the student apartments may have a waiting list of one semester or more! There is no easy way around finding an affordable accommodation here. You will need to use all possible avenues, such as Studentenwerk, WG-Gesucht and even word‑of‑mouth, until you find a suitable place. In the interim, you may try Babelfish or Jugendherberge for a cheap temporary accommodation.

Bank account
While opening a bank account can be annoying as part of the bank‑accommodation‑permit loop, there are possible bypasses (e.g. obtaining an official letter with your name and German address on it or opening an account with an online bank).

To open an account in the usual brick‑and‑mortar banks, you will require a residence permit or an official letter with your name and German address on it. As the contract for opening a bank account is only legally binding in German, you will need to either understand German or bring someone who can translate German to you. A fee is required in order to keep the current account operational. Some banks offer a student account which has zero fees, but these accounts are usually age‑restricted (e.g. below 27 years of age).

If you would prefer to avoid the traditional banks, online banks are available for your use, such as N26. As with all financial decisions, do take time to research and consider your options carefully.

Residence permit
In order to obtain a residence permit, you need an accommodation, period/full stop. When you secure one, you will be provided with a letter for registration at the town hall (local term: Rathaus). You will also need your passport, matriculation letter/matriculation card, and bank account statement. If you are married, a translated copy of your marriage certificate (in English or German) is required too.

After you have obtained a residence permit, you may receive a letter from the German broadcasting institution (Beitragsservice von ARD, ZDF und Deutschlandradio). The legal ruling is that each residence is required to pay the fee, regardless of whether you use their services. If you live alone, do register with them as instructed and pay the fees (€17.50 per month). If you have housemates, check if anyone is already paying, get their account number and inform the Beitragsservice that you’re covered under that account number.

Electronic residence card
The final milestone. You are only allowed to book an appointment with the Rathaus when you have less than three months remaining for your student visa. Depending on the length of your entry visa (e.g. some were given three months while others have six months), you might have to wait.

On your first visit, you will not be processing anything. Instead, you will be given a form to fill and a second appointment on another day. This means, please do not come to the Rathaus with less than a month of your visa remaining.

On your second visit, you will need to bring all the documents as instructed in the form and €107 (either in cash or by debit card). You will need to come half an hour before your given appointment time to provide your mugshots and biometrics (fingerprints, etc). That costs €7. Your application will then cost another €100. It’s then time to return home and wait for two letters (about a few weeks later).

When you get the two letters, bring them for your third visit to the Rathaus and get your card. Congratulations, you are now a third state citizen in Germany! Do check the validity date on your card. If you only have one year before it expires, then you will need to repeat the whole application process (including another set of mugshots and biometrics) in your second year here.

Other useful information
If you come from a country/place which businesses and shops open till late and on weekends, be prepared for a major change. Not only do shops and supermarkets in Bavaria close at 8pm or earlier, they are also non‑operational on Sundays and public holidays. While there are exceptions such as certain F&B outlets, this means that you will need to stock up with food (and party beers) beforehand to avoid nuisance during these periods.

Remember to bring your own bags for shopping. Shops in Germany do not provide free bags for your groceries and other shopping goods. You will need to purchase these bags at a small cost from the cashier if you require them.

You may refer to the University calendar here. That should help with your scheduling and time management.

Tips for convenience
Bring more money if possible. Until you get access to your funds (e.g. unblocking of blocked account), your funds will be mostly restricted to what you bring. For blocked account holders, you will need to undergo a verification process before your account can be unblocked. Verification may be delayed for many reasons. Do take that into consideration when planning your money.

Most entry visa do not come with an innate work permit for students, which is a pre‑requisite for a student job. If you wish to get a work permit, please visit the Rathaus.

Having someone to translate German for you will be highly helpful. In fact, it may even expedite the process considerably. While you can approach the student tutors available at the International Office, don’t shy away from asking your fellow coursemates and/or seniors who can speak German. This will double as an icebreaker, which will make a great start for your student life in EAGLE!

Settling down in Würzburg may seem complex and frustrating when you’re unprepared for how Germany conducts her administrative matters. For the well‑prepared, this can be a smooth process. If you are ever frustrated or depressed about this matter, remember that you can always approach your seniors – we’ve been through the process! Feel free to contact us through our contact form. We look forward to meeting you in Würzburg!

This article is written based on the experiences and mistakes by your EAGLE seniors when they first settled in Würzburg.

Many thanks to everyone for sharing your experiences and challenges, as well as providing feedback to improve the article.

This article was written in June 2018.

EAGLEs forming a football team at yesterday’s Geo summer party

EAGLEs forming a football team at yesterday’s Geo summer party

Yesterday, many Geography students and some lecturers of the University of Wuerzburg met at the center lawn of Campus Hubland for the annual Geography summer party, organized by the faculty’s Student Council. One highlight, as every year, was the football tournament, in which nine teams, all drafted explicitly for the event, competed against each other to win the Mohorovičić Cup”. The cup is named in honor to the Croatian meteorologist and seismologist Andrija Mohorovičić, who is considered as the founder of modern seismology and after whom the “Mohorovičić discontinuity”, the boundary between the Earth’s crust and the mantle, is named.

With “Team EAGLE”, the University’s EAGLE Master students also participated in the games, playing the important role of representing the Geography Institute’s remote sensing community at the cup. Following the model of Europe’s most successful football clubs, Team EAGLE was formed out of an international selection of players, being (by far) the team with the highest international diversity in the whole tournament: Team EAGLE represented five nationalities, including German (three players), Pakistani, Iranian, Afghan and Singaporean (each one player). Moreover, team EAGLE was one of the two only teams to be multi-gender, being supported on the field by a female striker, who always was dangerous in front of the opponent’s goal. A cheering crowd of EAGLE students, sitting directly next to the field, celebrated the team’s efforts to score enough goals to make it through the group stage, consisting of four games from which four teams remained to play in the semi-finals and final game.

While the individual class of each EAGLE player was clearly outstanding against many “hobby” players of the other teams, a little lack of practice playing in the chosen formation caused the team to be not as effective as needed, especially in front of the opponent’s goal. This, combined with some unlucky situations where the goal post was involved in saving the opponent from being played off by team EAGLE, forced the latter and its supporters to accept that they had been kicked out of the tournament after four hard fight games.

However, being aware of how loosing can make you even stronger, team EAGLE is prepared to fight back one year ahead and to bring the cup home to the Oswal-Külpe-Weg. With a lot of young and fresh talents, expected to arrive in October this year, team EAGLE will improve its skills, its tactics, its class and – its unprecedented, shining spirit!


EAGLE team fan

A fan of the big EAGLE team fan base photo-bombing the EAGLE team picture. Luckily, no security had to step in to secure our talents. Players (from upper left to lower right): Fowad, Silvan, Sebastian, Theresa, Navid, Salim. Missing Player: Benjamin.


Group stage game

A group stage game of two other teams at Mohorovičić Cup.


Summer Dialogue 2018

We will be holding our annual EAGLE Summer Dialogue and Barbeque on 22 June 2018. Here is a quick peek at our programme:

We will provide marinated steaks from pork and poultry, as well as sausages from pork and beef. Grilled vegetables, bread, some salads and desserts will also be available. If you are still missing something in particular, bring it along and we will be happy to barbecue it for you. Otherwise just come without bringing anything and have a great time with us. Cooled drinks like soda, water, beer and other non-alcoholic beverages will be provided as well.
Guests will be asked for reimbursement to cover the funding of foods and drinks. Suggested prices will be displayed.
Cutlery and glasses will also be provided.

If you want to come, register now at EAGLESummerDialogue2018.
Feel free to bring your family along!
Do let us know by 15 June 2018, so that we can better prepare and cater to your enjoyment.
All data collected will be used solely for the purpose of this event and deleted after the event.

If you have any questions, please do not hesitate to contact us at
We eagerly look forward to meeting you at our event.

The EAGLE Team

R Package “superClassAnalysis”

For our final project in the course “MB2 – Introduction to Programming and Geostatistics” held by
Dr. Martin Wegmann the students were encouraged to explore the possibilities for analyzing and
working with remote sensing data in R. In this context I created a package called “superClassAnalysis”
that includes several functions which add further methods for data analysis to the “superClass()”
command of the “RStoolbox” built by Benjamin Leutner. The aim of the package is to find the best
presets in form of resolution, number of sample pixels, polygons and number of bands in order to
achieve highest classification accuracies.

The package can be downloaded in installed via GitHub:


As of right now the package consists of seven functions, one of them being the “SampleSaturation()”
function. It enables a quick analysis of the minimum number of sample pixels required for each class
in order to receive best results in a supervised classification. The user has the ability to automatically
plot the result in form of a table or a ggplot which shows the overall accuracy, as well as either the
user’s or producer’s accuracy for each class depending on the user’s preference.

x1 <- SampleSaturation(img = img, model = 'rf', trainData = training_data,
 valData = validation_data, nSamples = c(10, 50, 100, 500),
 classes = training_data$class_name, 
 responseCol = "class_name", prodAcc = TRUE, 
 overall = TRUE, plot_graph = TRUE)


Another function included in the package is the “PolygonSaturation()” function. The purpose of this function is to analyze the impact of each polygon on the classification accuracy and aids for identifying potentially erroneous or generally bad polygons. In order to achieve that, a supervised classification loop will be executed starting with two polygons per class. After each run, one additional polygon per class is being added and the accuracy results for each classification is again displayed in form of a ggplot. In this example when looking at the class “no_forest” the producer’s accuracy increases with the fourth polygon, while the fifth polygon results in a decrease of the producer’s accuracy for that class.

x2 <- PolygonSaturation(img = img, model = 'rf', trainData = training_data, 
 valData = validation_data, nSamples = 100, 
 classes = training_data$class_name, 
 responseCol = "class_name", prodAcc = TRUE,
 overall = TRUE, plot_graph = TRUE)


Other functions included in the package are e.g. the “ResolutionSaturation()” function, which analyzes the impact of spatial resolution of remote sensing data on classification processes by resampling the raster file to different resolutions according to a given vector. Again a classification loop will run with the different resolutions and the result is automatically visualized.

All functions are written in a way so that they automatically adjust to the given dataset, independent of its size, number of classes or the class names.

Reporting from the Students’ Board

Marius Philipp

Field Measurements in Demmin 2018

In order to get some practical experience in terms of field work the EAGLE program offers an excursion to Demmin which is located in federal state of Mecklenburg-Western Pomerania in North-East Germany. The test site is an intensively used agricultural ecosystem that has been established in 1999 with a close cooperation between the local farmers and the German Aerospace Center (DLR). Furthermore, since 2011 it is part of the TERENO observatory ‘North-East German Lowlands’ that is managed by the GeoForschungsZentrum (GFZ) Potsdam. The young Pleistocene landscape which was formed approximately 10000 years ago by glaciers and melting waters is widely used for forestry and agriculture. Nowadays more than 65 soil moisture SPADE sensors and over 40 environmental measurement stations are managed by GFZ and DLR. Over the years a large number of data have been gathered and are now available (Truckenbrodt et al. 2018).

Students had the opportunity to collect different types of samples, e.g. measuring biophysical parameters like the Leaf Area Index using a LAI-2200 plant canopy analyzer (LI-COR). In addition to that the leaf chlorophyll content was measured through non-destructive absorbance measurements using a SPAD-502Plus chlorophyll meter. Other sampling tasks included measuring the soil moisture with a portable sensor, as well as taking actual soil and biomass samples which could be measured afterwards in the laboratory. Also, the surface roughness was estimated by using a pin profiler measurement. Students were provided with a field reader before the actual excursion so that they could prepare for the field work beforehand.

This field campaign offered EAGLE students an insight in the world of field work and the possibility to conduct measurements using various devices. Students learned to organize themselves and distribute the tasks in order to work efficiently. Furthermore, this excursion also strengthened the relationship of EAGLEs as a group which could be expressed through joint dinners and barbecue as well as other fun activities.

Reporting from the Student’s Board

Marius Philipp


Truckenbrodt, S. Hüttich, C., Borg, E., Ahmadian, N., Dahms, T., Heupel, K., Spengler, D., Conrad, C. (2018): “DEMMIN_2.0 – Combining in situ observations and remote sensing data – Field Reader”.

Land-Use Change Coded By Color (R Package)

The remote sensing R package LCquickVieweR makes land-use change visible by creating false color images. The methodical approach is a combination of Image Differencing and Multi Temporal Stacking using NDVI. This way change is coded by color. All processing steps are automatized.

LCquickVieweR was built for the final project of MB2 – Introduction to Programming and Geostatistics and was initially just a processing script that grew into an R package gradually. At this stage [0.0.1] some functions are customized for my latest project, but can be adjusted easily.

Animation 1: LCquickVieweR final product.


Install LCquickVieweR directly from github by using devtools.



LCquickVieweR provides a small set of functions:

Adjusting study area:

  • mergeThis() – [0.0.1] merges two tiles into a single image for every dataset in a committed directory. Including more tiles is possible by adjusting the referenced raster::mosaic() function.
  • subsetThis() – crops every raster image in a committed directory to the extend of any shapefile.

Image Differencing and Multi Temporal Stacking using NDVI:

  • getNDVI() – computes the NDVI for every Landsat5 and Landsat8 scene in a committed directory.
    • NDVI() – basic ratio computation using Red & NIR bands, see NDVI.
    • Landsat5_NDVI() – looks for the right Landsat5 bands for NDVI computation.
    • Landsat8_NDVI() – looks for the right Landsat8 bands for NDVI computation.
  • getDeltaNDVI() – creates image subtractions of every successive pair within a directory. The order of subtractions is the order of the committed directory.
    • deltaNDVI() – raster calculation: deltaNDVI() subtracts NDVI datasets from each other. The prior dataset is subtracted from the later.
  • stackTime() – creates the final product by stacking the prior, later, and delta datasets into their respective RGB channels.

Bonus functions that make RStudio life easier:

  • packageChecker() – takes a list of packageNames and checks it against the internal library. If a package is missing, it will download, install and activate it. If a package is already installed but old, it will be updated and activated. If a package is already installed, it will be activated.
  • set.wd()– setting a working directory by pasting a windows path directly, without changing any single \backslash.
    • backslashConverter() – converts \ into /.

Get Started

A quick demonstration of what LCquickVieweR can do:

Put all your downloaded satellite images into one folder. Up to this point the automatization works only for Landsat 5 and 8 scenes. Bands from other satellites need to be addressed manually.


# Load packages
packages <- c("raster", "sp", "RStoolbox", "rgdal")

# set your working directory to your sat-image folder

# create subfolders for temporal datasets and results
directories <- c("result_NDVIs", "result_mosaic", "result_subset", 
                 "result_deltaNDVIs", "result_falseColor")
for(i in 1:length(directories)){
# create the main list of your working directory
dirList <- list.files()

Main program:

# creating NDVIs for all downloaded data

Figure 1: Converting all datasets into NDVI datasets.


# filtering for needed tiles
imageTile1 <- list.files("result_NDVIs/", pattern = "177044")
imageTile2 <- list.files("result_NDVIs/", pattern = "177045")

# combining tiles for full study area
mergeThis(imageTile1, imageTile2)

# loading extent of study area -> shp-file
studyArea <- readOGR(dsn = "_vector_data", layer = "studyArea")
# addressing all merged images
allMosaics <- list.files("result_mosaic/")

# creating subset from all mosaics
subsetThis(allMosaics, studyArea)

Figure 2: Merged and cropped study area.


# getting all subsets into a list
allSubsets <- list.files("result_subset/")

# image differencing deltaNDVI()

# collecting preprocessed datasets for final product
delta <- list.files("result_deltaNDVIs/")
ndvi <- list.files("result_subset/")

# creating main land-use change product
stackTime(ndvi, delta)

Figure 3: Assembling the final product.



Once the processing is done, your results will look pretty much like the scenes in the GIFs. Regardless of where that scene is from, the colorCode will still be the same:

  • reddish colors: lost areas
  • cyan colors: gained areas
  • yellowish and purple areas: areas without change

In general color depends on NDVI intensity in both dates.

Animation 2: LCquickVieweR final product.

To Estimate Biomass Using Light Use Efficiency Model in R

Recently, I published “lue” package in R that is based on the light use efficiency model, which returns the biomass of any crop based on the simple physiological paradigm modelled by Shi et al. (2007). It contains LUE_BIOMASS () which calculates the absorbed photosynthetically active radiation (APAR) in the first step and the actual light use efficiency (LUEact) in the second. Many climatic parameters like clear sky photosynthetically active radiation (PAR), minimum, maximum and dewpoint temperature, which affect the biomass, has been also considered as an input variable. The thresholds of these climatic parameters play a significant role in calculating accurate biomass (Russel and Wilson 1994). Therefore, this function also considers the threshold values for example, the minimum values of minimum temperature signify the LUEact = 0 and maximum values of minimum temperatures define that LUEact equals to the optimal light use efficiency(LUEopt). Every crop has its own LUEopt, for instance the LUEopt for wheat is 3.0 (Djumaniyazova et al., 2010), in that case LUE_BIOMASS () multiplies this optimal value with minimum temperature. The output generated by this function looks similar as below:

Biomass_wheat <- LUE_BIOMASS(fpar_raster, par,tmin,-2,12,3) ,


Similarly, vapour pressure deficit (VPD) also alters the values of biomass. The LUE_BIOMASS_VPD () of this package calculates the biomass by considering the effect of VPD. The complete code with all functions of lue package is available on GitHub. If you have any more ideas or suggestions, please update us via GitHub (


Shi. Z., Ruecker, G. R., Mueller, M., Conrad, C., Lamers, J. P., Ibragimov, N., Martius, C., Strunz, G., Dech, S., & Vlek, P. L. (2007) – Modeling of Cotton Yields in the Amu Darya River Floodplains of Uzbekistan Integrating Multitemporal Remote Sensing and Minimum Field Data. Agronomy Journal 99, 1317-1326.

Russell, G., & Wilson, G. W. (1994) -An Agri-Pedo-Climatological Knowledge-Base of Wheat in Europe. Joint Research Centre, European Commission, Luxembourg, 158.

Djumaniyazova, Y., Sommer, R., Ibragimov, N., Ruzimov, J., Lamers, J., & Vlek, P. (2010) – Simulating water use and N response of winter wheat in the irrigated floodplains of Northwest Uzbekistan. Field Crops Research, 116, 239-251.

Spectral unmixing in R

Recently, in January, I finished the development of the first version of a spectral unmixing function being part of RStoolbox, an R package offering numerous tools for remote sensing analysis written by Benjamin Leutner. The multiple endmember spectral mixture analysis (mesma) function makes it possible to unmix multi- and hyper-spectral imagery by sets of spectral endmember profiles.

For this, a non-negative least squares (NNLS) solver was implemented. NNLS is a statistical approach to fit model parameters to data, assuming that the model parameters are always expressed linearly to those not expressed by the model (unknown parameters) and that the model parameters can never be negative. There are different approaches to solve the NNLS problem. A popular one had been introduced by Lawson & Hanson (1974), which can be considered as fundamental work on practical Least Square Problems solving. It was originally published as FORTRAN code, which is still widely used, e.g. by the R NNLS package or by the Python scipy library. However, compared to newer developing frameworks and languages emerged, the FORTRAN implementation is relatively slow. Thus and to be independent from existing solutions, I wrote a C++ NNLS solver for mesma(), based on a sequential coordinate-wise algorithm (SCA) introduced by Franc et al. (2005). The latter method inherits strong control about the solver’s iteration stopping conditions.

Apart from NNLS, we are planning to add further solver methods (which is why I am currently looking for other practicable unmixing methods).

In this post, I want to demonstrate, how to use the unmixing function RStoolbox::mesma() by giving an example. It can be reproduced on any device running R and having installed the current RStoolbox beta. To do so, execute devtools::install_github(“bleutner/RStoolbox”).

First, we are going to load the Landsat example imagery delivered with RStoolbox:

#if not already done, install RStoolbox beta:
#required caret 6.0-79, which is not on CRAN yet

#load packages

#load an example dataset


To create some endmember spectra, we simply collect the spectral profiles of “water” and “land” from our imagery. We keep it simple here – instead, you could use spectra from a spectral library.

#make up some endmember spectra: water and land
em_names <- c("water", "land")
pts <- data.frame(class=em_names, cell = c(47916,5294))
em <- lsat[pts$cell]
rownames(em) <- em_names


That’s all for the pre-processing! Now you have an image and two endmembers. Note that you need to have at least two endmembers (as we have in this example) to unmix an image. Also, take a look at “em” and “lsat” before continuing: Both have the same spectral resolution (band number), which is a prerequisite. This means that if you want to use data from a spectral library for unmixing, you simply need to resample the data to the same spectral resolution of your imagery to use mesma().

Now, just call mesma(). It returns a probability raster, each layer representing one class of your endmembers, except for the last layer, which gives you the RMSE for each pixel.

#unmix the image for water and land
probs <- mesma(lsat, em, method = "NNLS")


Since we decided to develop the NNLS solver from scratch in C++ and not to use existing older FORTRAN implementations, mesma() is quiet fast. It supports parallel processing, if you want to unmix large amounts of data and have multiple CPU cores available. To do so, just create a cluster before calling mesma() using raster::beginCluster() and stop it afterwards using raster::endCluster().

Now, let us look at the output’s:

#take a look
raster::plot(probs$water, col = c("white","blue"))
raster::plot(probs$land, col = c("white","brown"))


Here are the probabilities for water…

and here they are for land:

You clearly see, how mesma() could easily differentiate between these two endmembers with only one spectrum per class. If you have ideas or find a problem, please report us via GitHub!



Franc, V., Hlaváč, V., & Navara, M. (2005). Sequential coordinate-wise algorithm for the non-negative least squares problem. In: International Conference on Computer Analysis of Images and Patterns (pp. 407-414). Berlin, Heidelberg.

Lawson, C. L., & Hanson, R. J. (1974). Solving least squares problems (Vol. 15). Siam.

Block course “Hyperspectral Remote Sensing”

One reason that makes this master’s program so attractive is its highly diverse coursework. This is being reflected by the currently available block courses. The “Hyperspectral Remote Sensing” course held by Dr.rer.nat. Martin Bachmann is part of that. In this course students receive an introduction to the world of spectroscopy and hyperspectral remote sensing, its limitations and potential.

The main focus of the seminar was working with a field spectrometer. Students got hands on experience calibrating the spectrometer using a spectralon, as well as measuring the spectral signatures of different subjects under simulated laboratory conditions. Different LAI measurements, as well as measurements of various minerals, soil types and the effect of wetness have been examined. Additionally, further studies on the impact of soil aggregate size and shadow effects were carried out.

Since the purpose of a field spectrometer is to be used in the field, the students took the opportunity to take some measurements across the campus, under the guidance and provided with the expertise of Dr.rer.nat. Martin Bachmann. Taking measurements outside introduces more factors that need to be taken in account, for example cloud coverage and the spectral behavior of solar radiance in contrast to laboratory conditions.

The software ENVI Classic has been used to visualize the measurements, calculating various statistics and for identifying features regarded to distinct spectral behaviors of different materials. Furthermore, own spectral libraries consisting of the taken measurements have been created and compared to existing libraries.

This course provided students with the knowledge how to correctly conduct field spectroscopy measurements, the impact of shadow effects, surface roughness and different viewing angles, as well as the expertise to visualize and interpret certain spectral characteristics.

Reporting from the Student’s Board

Marius Philipp

Photoshooting for the EAGLE Website

Another Year, another generation of students. After our studies began there was also the need for updating the EAGLE students’ webpage in order to reveal the new generation of EAGLEs to the world. The first step was of course the creation of a group photo, as well as individual profile pictures that introduce each EALGE student.

But next to that, some additional photo shooting took place, so that some stock photos for the website could be submitted. Pictures during several lectures, learning events and other occasions were taken and uploaded in order to give a small insight in the daily life and work of us EAGLE students.

These photo shootings tend to be quite fun and will definitely continue throughout our studies to keep the website and anyone interested in this master’s program up to date.

Reporting from the Student’s Board

Marius Philipp

Winter Term 2018/19








Python Script for QGIS 3.0 Basemaps

The OpenLayer Plugin for QGIS provided all my basemap layers for quite some time now. But since the eagerly awaited launch of QGIS 3.0 earlier this year this plugin became incompatible, leaving you with two options:

  • you either gather and compile all XYZ Tiles manually,
  • OR run a Python Script.

Open the Python Console (Ctrl+Alt+P), take the script and hit “run command”. Done!
Thanks to Klas Karlsson, this will save you a lot of time!

Install every missing R package in one go

Before submitting a project or setting up R on a new system, this function might come in handy. You can put all your favourite or required packages into a single vector and check if they’re already installed.

If not, packageChecker() will take care of that.

Figure 1: Code Snippet (showcase).

copyable snippet

packageChecker <- function(requiredPacks){ check <- requiredPacks %in% installed.packages()[,”Package”] for(i in 1:length(check)){ if(check[i] == FALSE){ install.packages(requiredPacks[i]) } } } # execution requiredPacks <- c(“pwltools”, “sp”, “raster”, “ggplot2”, “RStoolbox”) packageChecker(requiredPacks)


Once I completed coding this, I realized that installing the packages might only be half the job. You’ll most likely want to load them into your R session before executing the rest of your code.

While researching how to operate vectors on library() I found a neat existing solution.
But adding this inside the loop will do the trick.

copyable snippet

sapply(requiredPacks, require, character.only = TRUE)


Thanks to Steven Worthington.


New 2017 EAGLE students welcomed

The new 2017 EAGLE students have been welcomed to Wuerzburg and recently started their studies. Our webpage will be updated as soon as reports and photos about the new students are available.

EAGLE and Department of Remote Sensing Summer BBQ

Since the first ever semester of the EAGLE program has come to an end, we think it is time to come together and enjoy a nice summer evening. On the 23d of June, the EAGLE students invite to a great BBQ at the University of Würzburg. We hope for a good mixture of students, lecturers and other EAGLE interested people. The party will be a great place to share the experiences and information with each other. If you are interested to join, please fill in the contact sheet. More information will be provided via email – stay tuned!

Number of currently enrolled EAGLE students