Skip to main content
1-Visitor
December 22, 2016
Solved

Updating Weather Data Properties

  • December 22, 2016
  • 9 replies
  • 6444 views

Hello Everyone

I have tried to alter the Weather forecast API tutorial to get current weather data and write it to some thing properties instead of an infotable. I'm doing this so that I can log it against some other data. Currently when i run my script i get back NaN in the properties. My code is below

var stringLocation=me.Location+" ";

var arrayLocations=stringLocation.split(",");

var lat=arrayLocations[0];

var long=arrayLocations[1];

var params = {

url: "http://api.openweathermap.org/data/2.5/weather?lat="+lat+"&lon="+long+"&units=metric&type=accurate&mode=xml&APPID=4abc8a3c9f101ccf9c7cfe7cbf3dfed7" /* STRING */,

timeout: 160 /* NUMBER */

};

// result:

var xmlPage = Resources["ContentLoaderFunctions"].LoadXML(params);

me.WindDirection = xmlPage.current.wind.direction.@name;

me.WindSpeed=xmlPage.current.wind.speed.@value;

me.WeatherTemp=parseInt(xmlPage.current.temperature.@value);

me.WeatherHumidity=parseFloat(xmlPage.current.humidity.@value);

me.WeatherTime = xmlPage.current.lastupdate.@value;

me.Title=xmlPage.current.city.@name+" "+xmlPage.city.country;

me.Precipitation=(xmlPage.current.precipitation.@mode);

I'm not sure if it is correct and am new to javascript and API calls

Any help will be greatly appreciated.

Thanks Matt

Best answer by adrianpet

Hi Matt,

    Use this code:

if(location!=null){

var test=location+"";

var arrayLocations=test.split(",");

var lat=arrayLocations[0];

var long=arrayLocations[1];

var params = { url: "http://api.openweathermap.org/data/2.5/weather?lat=" +lat+"&lon="+long+"&appid=4abc8a3c9f101ccf9c7cfe7cbf3dfed7&mode=xml&units=metric"/* STRING */,

timeout: 60 /* NUMBER */ };

var xmlPage = Resources["ContentLoaderFunctions"].LoadXML(params);

var params = {

infoTableName : "InfoTable", dataShapeName : "WeatherDataShape"

};

// CreateInfoTableFromDataShape(infoTableName:STRING("InfoTable"), dataShapeName:STRING):INFOTABLE(YahooWeatherFeed)

var result = Resources["InfoTableFunctions"].CreateInfoTableFromDataShape(params);

}

var row = new Object()

row.City = xmlPage.city.@name;

row.WeatherTemperature = parseFloat(xmlPage.temperature.@value);

row.WeatherHumidity = parseFloat(xmlPage.humidity.@value);

row.WindSpeed = parseFloat(xmlPage.wind.speed.@value.toString());

row.WindDirection = xmlPage.wind.direction.@name;

row.Sunrise = xmlPage.city.sun.@rise;

row.Sunset = xmlPage.city.sun.@set;

row.WeatherCondition = "http://openweathermap.org/img/w/" + xmlPage.weather.@icon + ".png";

result.AddRow(row);

me.City = row.City;

me.WindSpeed = row.WindSpeed;

me.WindDirection = row.WindDirection;

me.Temperature = row.WeatherTemperature;

me.Sunrise = row.Sunrise;

me.Humidity = row.WeatherHumidity;

me.Sunset = row.Sunset;

In this way you will keep your InfoTable and also write the values inside your properties. You might have to change some spelling if you don't have the same "naming". For example, I think you have defined the property WeatherTemp while i have Temperature setup for the same property.

Thanks,

Adrian

9 replies

5-Regular Member
December 28, 2016

Hello, are you sure that your REST request returns information when run in the browser? I have seen issues with NaN just because the syntax wasn't quite right in the request. Also, are you sure you need those "@" signs in there? I have never seen this before when working with XML files.

msutton1-VisitorAuthor
1-Visitor
January 3, 2017

Hello Tori

The rest request returns this in the browser. I copied the @ signs across from the weather tutorial and i'm not sure of their function. I assumed there were some kind of location marker for the value.

This XML file does not appear to have any style information associated with it. The document tree is shown below.

<current>

<city id="3019355" name="Etretat">

<coord lon="0.21" lat="49.71"/>

<country>FR</country>

<sun rise="2017-01-03T07:56:03" set="2017-01-03T16:12:01"/>

</city>

<temperature value="-0.58" min="-2" max="1" unit="metric"/>

<humidity value="100" unit="%"/>

<pressure value="1030" unit="hPa"/>

<wind>

<speed value="3.1" name="Light breeze"/>

<gusts/>

<direction value="190" code="S" name="South"/>

</wind>

<clouds value="20" name="few clouds"/>

<visibility value="3800"/>

<precipitation mode="no"/>

<weather number="701" value="mist" icon="50d"/>

<lastupdate value="2017-01-03T08:00:00"/>

</current>

msutton1-VisitorAuthor
1-Visitor
January 3, 2017

Sorry copying the text seemed to mess up the formatting

5-Regular Member
December 29, 2016

Hey Matt, are you attempting to bind the values at runtime with "@" because you sure can't annotate in JS to make calls like so in Java, not without using some special libraries, keep in mind they are still in early stage.

msutton1-VisitorAuthor
1-Visitor
January 3, 2017

Hi Sushant

I copied the @ across from the weather tutorial. i have removed them now and tested the code. I still get NAN do you know what i would need for binding the xml values to a property? Does anyone have an example? Thanks for the help

5-Regular Member
January 3, 2017

Hi Matthew, i checked  "@" used in your original code appears to be for accessing the child attributes so this should be fine (apologies i misunderstood it to be something like invoking service/method in Java ), besides is there any issue in using the values from the Infotable, since you can also have property of datatype Infotable so you can store all the fetched values at once.

Found some useful hints here XML to Infotable detailed example not sure if you have already checked this. Could you please share the link to the tutorial you are using for weather app?

adrianpet5-Regular MemberAnswer
5-Regular Member
January 5, 2017

Hi Matt,

    Use this code:

if(location!=null){

var test=location+"";

var arrayLocations=test.split(",");

var lat=arrayLocations[0];

var long=arrayLocations[1];

var params = { url: "http://api.openweathermap.org/data/2.5/weather?lat=" +lat+"&lon="+long+"&appid=4abc8a3c9f101ccf9c7cfe7cbf3dfed7&mode=xml&units=metric"/* STRING */,

timeout: 60 /* NUMBER */ };

var xmlPage = Resources["ContentLoaderFunctions"].LoadXML(params);

var params = {

infoTableName : "InfoTable", dataShapeName : "WeatherDataShape"

};

// CreateInfoTableFromDataShape(infoTableName:STRING("InfoTable"), dataShapeName:STRING):INFOTABLE(YahooWeatherFeed)

var result = Resources["InfoTableFunctions"].CreateInfoTableFromDataShape(params);

}

var row = new Object()

row.City = xmlPage.city.@name;

row.WeatherTemperature = parseFloat(xmlPage.temperature.@value);

row.WeatherHumidity = parseFloat(xmlPage.humidity.@value);

row.WindSpeed = parseFloat(xmlPage.wind.speed.@value.toString());

row.WindDirection = xmlPage.wind.direction.@name;

row.Sunrise = xmlPage.city.sun.@rise;

row.Sunset = xmlPage.city.sun.@set;

row.WeatherCondition = "http://openweathermap.org/img/w/" + xmlPage.weather.@icon + ".png";

result.AddRow(row);

me.City = row.City;

me.WindSpeed = row.WindSpeed;

me.WindDirection = row.WindDirection;

me.Temperature = row.WeatherTemperature;

me.Sunrise = row.Sunrise;

me.Humidity = row.WeatherHumidity;

me.Sunset = row.Sunset;

In this way you will keep your InfoTable and also write the values inside your properties. You might have to change some spelling if you don't have the same "naming". For example, I think you have defined the property WeatherTemp while i have Temperature setup for the same property.

Thanks,

Adrian

msutton1-VisitorAuthor
1-Visitor
January 6, 2017

Thank you Adrian that has worked perfectly and furthered my understanding of how to access the xml data and use info tables. Cheers Matt