среда, 26 октября 2016 г.

Examples of VANE Language: NDVI


The NDVI, i.e. the normalized difference vegetation index, is a simple graphical indicator of biomass active photosynthetically.The NDVI is one of the most common and widely used indexes for evaluation of vegetated areas, their quality and quantity. Using the NDVI it is possible to detect presence of plants, its dynamics of emergence and growth. For getting of this index there is Band 5 which measures the near infrared spectrum, or NIR (Near Infrared). This part of the spectrum is reflected by water in leaves of healthy plants. Maps of the NDVI with dynamics (in various seasons) let tracing peculiar features and deviations of seasonal vegetation.
http://owm.io/sql-viewer?select=b5,b4&where=day=2016-200&op=ndvi&lon=-102.21&lat=34.3264&zoom=12

вторник, 25 октября 2016 г.

How to use OpenWeatherMap UV index


Thank you for the article  Francesco Azzola
 http://www.survivingwithandroid.com
 @survivingwithan
 https://it.linkedin.com/in/francescoazzola

This post describes how to use OpenWeatherMap UV index. This is an interesting API because we can use it to explore some important aspects about Android and location aware API. Openweathermap provides this API for free! As you may already know, Openweathermap provides also a full set of API about weather information: you can get current weather conditions, forecast, historical information and so on. This information is free and we can use Openweathermap API free of charge.
Focusing on this article, at its end, we will build an Android app that gets UV index and show it using Material design guidelines.
Before diving into the app details is useful to have an idea about UV index.
Brief Introduction to UV index
UV index (or Ultraviolet index) is an international standard to measure the ultraviolet radiation at particular place and time.
The purpose of this index is to help people protect themselves from UV radiation. So this index is very important and useful.
The UV radiation is measured using a linear scale proportional to the UV intensity.
It is important, then, to know how to get this information from OWM.
OpenWeatherMap UV Index API
To get the UV Index from OpenWeatherMap, it is necessary to send the current location expressed as latitude and longitude:
http://api.openweathermap.org/v3/uvi/{lat},{lon}/current.json?appid={your-api-key}
and of course, the api-key.
You can the API key creating an account.  This is free and you can use to this link.
If you want to have a UV index at a specific time you can use this API:
http://api.openweathermap.org/v3/uvi/{location}/{datetime}.json?appid={api_key}
where datetime is expressed using ISO 8601. As you can notice, these two API are very simple to use. If you want to have more information you can go to the API doc.
According to the documentation, the JSON response is easy to parse. It looks like:
{
   "time": "2016-03-03T12:00:00Z",
   "location": {
                   "latitude": 40.75,
                   "longitude": -74.25
               },
   "data": 3.11
}
Now we have all the information we need to build our app.
To invoke the OpenWeatherMap API is very simple once we known the current location (latitude and longitude). Let us assume, by now, that we have already the latitude and longitude.
Our Android app has to make an HTTP call to the OpenWeatherMap API and parse the JSON response. (If you want to have more information go to how to invoke Openweathermap API in Android).
As HTTP client library, the app uses OkHttp library, so the build.gradle is:
dependencies {
  ..
  compile 'com.android.support:appcompat-v7:23.2.1'
  compile 'com.android.support:design:23.2.1'
  compile 'com.google.android.gms:play-services:8.4.0'
  compile 'com.squareup.okhttp3:okhttp:3.2.0'
}
Once the dependency is configured, making an HTTP request is very simple:
private void handleConnection(Location loc) {
  double lat = loc.getLatitude();
  double lon = loc.getLongitude();
  // Make HTTP request according to Openweathermap API
  String url = UV_URL + ((int) lat) + "," + ( (int) lon) + "/current.json?appid=" + APP_ID;
  System.out.println("URL ["+url+"]");
  Request request = new Request.Builder()
    .url(url)
   .build();
  httpClient.newCall(request).enqueue(new Callback() {
   @Override
   public void onFailure(Call call, IOException e) {
    // Handle failure in HTTP request
   }
  @Override
  public void onResponse(Call call, Response response) throws IOException {
   // Ok we have the response...parse it
   try {
    JSONObject obj = new JSONObject(response.body().string());
    final double uvIndex = obj.optDouble("data");
    System.out.println("UV Index ["+uvIndex+"]");
    JSONObject jsonLoc = obj.getJSONObject("location");
    final double cLon = jsonLoc.getDouble("longitude");
    final double cLat = jsonLoc.getDouble("latitude");
    Handler handler = new Handler(MainActivity.this.getMainLooper());
    handler.post(new Runnable() {
      @Override
      public void run() {
       // Handle UI Update
      }
     });
  }
  catch(JSONException jex) {
    jex.printStackTrace();
   }
 }
});
}
The final result is shown in the picture below:
image00.png
The color of the value shown in the image above changes according to UV Index scale.
Get current longitude and latitude 
As told before, to get the current UV index, we need to use current location expressed using Latitude and Longitude.
As you may already know Google play services is a set of services that extend the Android app features providing a set of new services like Google Map, Google plus, Location Service and more. Using Google play location services we can build a location aware app.
Google play service setup
The first thing is setting up the Google play location service in build.gradle:
dependencies {
  ..
  compile 'com.google.android.gms:play-services:8.4.0'
  ..
}
Now the library is ready and we can use it in developing our Android app.
Moreover, the Android UV Index app should be aware of the current location so that it can pass the latitude and longitude to the OpenWeatherMap API to get the current UV Index.
We have to develop then a Google play services client to invoke the services exposed by Google play so that the app can retrieve the current location.
Google play location service client
Making the client is very simple and we need just a few lines of code:
private void initGoogleClient() {
     googleClient = new GoogleApiClient.Builder(this)
         .addConnectionCallbacks(this)
         .addOnConnectionFailedListener(this)
         .addApi(LocationServices.API)
         .build();

}
At line 5, we specify we use LocationServices.API. The initGoogleClient is called in onCreate method so that we initialise the Google play location services client as soon as the app starts.
It is important to remember to disconnect the client to the services when the app stops:
@Override
protected void onStop() {
  googleClient.disconnect();
  super.onStop();
}
and to reconnect the client when the app starts:
@Override
protected void onStart() {
  googleClient.connect();
  super.onStart();
}
One more thing before the Google play services is ready, it is necessary to register the app to listen when the connection fails or the connection is ready:
// Connection failure
@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
  showErrorMessage();
  return;
}
// Connection established
@Override
public void onConnected(@Nullable Bundle bundle) {
  getUVIndex();
}
The Goolge play services client is ready and as you can notice when the connection is ready the app retrieves the UV Index.
Assembling the location aware app
Finally, it is necessary to grant the permission in the Manifest.xml:
  <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
At the end to invoke correctly the UV index API, we can ask the last known location using:
private Location getLocation() {
  try {
    Location loc = LocationServices.FusedLocationApi.getLastLocation(googleClient);
    return loc;
  }
  catch(SecurityException se) {}
    return null;
  }
}
where googleClient is the client we talked about in the previous paragraph.
This method can return null value so the app can register itself for location updates so that it gets informed when the location changes:
LocationRequest req = new LocationRequest();
req.setInterval(60 * 60 * 1000);
req.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
LocationServices.FusedLocationApi.requestLocationUpdates(googleClient, req, this);
where the interval is the notification interval. To know more about LocationRequest refer to the official documentation.
Test Location aware app
To test the app, it is necessary to use a simple Android app that returns fake GPS location and enables fake GPS position in your smartphone under the developer section in the configuration menu.
Source code available @github.
(c) http://www.survivingwithandroid.com for OpenWeatherMap

пятница, 21 октября 2016 г.




Examples of VANE Language:
13 October 2016. Burning oil wells, Iraq, Al-Qayyara.(Via  http://edition.cnn.com/2016/10/12/world/burning-oil-wells-isis-iraq/)
"ISIS militants had set the wells on fire hoping to obscure the view of Iraqi and coalition warplanes".

The usual view from space: RGB(b2-b3-b4)

четверг, 20 октября 2016 г.

Examples of VANE Language: RGB



One of the simplest operations is to generate RGB map. Here an image consists of Bands 4-3-2 which correspond to the well-known RGB color model. Red, green and blue spectra combine together for creation of full color images.

http://owm.io/beautiful-vane

среда, 12 октября 2016 г.

Financial impact of changing climate on agriculture


Recent years agriculture experiences much heavier losses caused by changing climate and alterations in global middle-season temperature. Even a small rise or drop of usual temperature takes a toll on yield, productivity and profitability of agricultural sector. In such situations both manufacturers and consumers of products undergo some difficulties.  
Profit and losses of manufacturers and consumers differ significantly depending on their location; mostly this burden comes to developing countries since they have much dependence on yield productivity and it’s more difficult for them to adopt changes.    
Dense population in the regions whose economics are in direct correlation with agricultural productivity, low income, lack of social protection, and limited opportunities of risk management – all these factors make the consequences of climatic change really devastating: thousands of people can lose their livelihoods, and the threat of famine for the whole countries is no longer the illusory in the coming decades.
However it would be a big mistake to consider that this disaster can happen only to agrarian countries. Shortage of crop can affect the entire agricultural supply chain and bring substantial losses to companies and corporations throughout the world:
  • bulk companies may not be able to use its infrastructure to the full capacity, as a result, they will be likely to face a reduction in operating income, and in severe cases, they will be unable to cover their fixed costs;
  • providers of logistics services may be unable to generate enough revenue to cover their fixed costs;
  • manufacturers may get non-fulfillment of sale contracts in a supply chain since they cannot provide previously agreed amount of agricultural products, and as a result, traders will have to purchase additional amount of  products at market prices;
  • due to a drop in sale volume manufacturers of agricultural equipment may suffer as  agricultural manufacturers cannot afford to invest in more modern technologies.  
And as an overall result, the majority of costs have to be covered by ordinary consumers who will have to pay more for food basket.

Examples of VANE Language: Fire detection


Detect areas that were deforested after fire by simple coding of burn index and apply it to chosen area and data of events. You can easily compare images before and after fire by getting visual result immediately.
http://owm.io/beautiful-vane

вторник, 11 октября 2016 г.

OpenWeatherMap presents the release of the VANE Language service

OpenWeatherMap presents the release of a new service the VANE Language (former imagery API) with examples: http://owm.io/vaneLanguage 
 Initially, we called it Imagery API but finally understood that this service is much bigger than just API calls. Language is a proper name for this service. It is like an SQL for satellite images. Something unique on the satellite market.The Language is entirely online service, there is no any manual procedures or presets like maps prepared in advance. One image that we receive from Landsat8 is not an image in common understanding but several layers that have to be processed and merged somehow before you can do anything with it. The weight of each unarchived number of bands is around 2 Gb, and obviously, it takes a lot of resources and time to process it. E.g to make a global map you need around 10,000 images that should be processed and merged. With VANE Language developer does not worry about time-costly pre-processing because we do it online immediately. We give him a powerful tool that is familiar to any developer and hides all complexity. In a short word VANE Language gives a full flexibility for a developer to do with images whatever they want and deploy result into applications. VANE also have a unique feature of configuring the formula of image processing. Means that developer can set up his logic of processing of the image to make specific vegetation indexes, false colors and any other images that he can use for analysis of objects, changes, yield health, etc.