Glossary of Weather and Climate Data Terms
#map { height: 45vh; }
.search-control {
display: flex;
align-items: center;
background: white;
padding: 4px 6px;
border-radius: 4px;
box-shadow: 0 2px 4px rgba(0,0,0,0.2);
gap: 4px;
transition: width 0.3s ease;
}
.search-control .search-input {
width: 0;
padding: 0;
font-size: 14px;
border: none;
transition: width 0.3s ease, padding 0.3s ease;
overflow: hidden;
opacity: 0;
pointer-events: none;
}
.search-control .close-btn {
display: none;
background: none;
border: none;
font-size: 18px;
cursor: pointer;
color: #222;
}
/* Show Marker and X only it is expanded */
.search-control.expanded .search-input {
width: 150px;
padding: 3px 6px;
opacity: 1;
pointer-events: auto;
border: 1px solid #ccc;
border-radius: 3px;
}
.search-control.expanded .close-btn {
display: inline-block;
}
.search-icon {
background: none;
border: none;
font-size: 18px;
cursor: pointer;
}
https://unpkg.com/leaflet@1.9.3/dist/leaflet.js
https://unpkg.com/leaflet.markercluster@1.5.3/dist/leaflet.markercluster.js
const australiaBounds = L.latLngBounds(
L.latLng(-50, 106),
L.latLng(-4, 160)
);
const map = L.map(‘map’, {
maxBounds: australiaBounds,
maxBoundsViscosity: 1.0,
minZoom: 3.5
}).setView([-25, 134], 3.5);
map.createPane(‘climateZones’);
map.getPane(‘climateZones’).style.zIndex = 300;
L.tileLayer(‘https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png’, {
attribution: ‘© OpenStreetMap contributors’
}).addTo(map);
const markerCluster = L.markerClusterGroup();
fetch(‘https://exemplary.energy/wp-content/uploads/2025/08/map_final_v5_226-locations_250802_final.geojson’) // Replace this
.then(res => res.json())
.then(data => {
const geoJsonLayer = L.geoJSON(data, {
pane: ‘climateZones’,
filter: feature => feature.geometry.type === ‘Polygon’ || feature.geometry.type === ‘MultiPolygon’,
style: feature => ({
color: feature.properties.stroke || ‘#666’,
weight: feature.properties[‘stroke-width’] || 1,
opacity: feature.properties[‘stroke-opacity’] || 1,
fillColor: feature.properties.fill || ‘#ccc’,
fillOpacity: feature.properties[‘fill-opacity’] || 0.5
}),
onEachFeature: (feature, layer) => {
const props = feature.properties;
const postcode = props.postcode || props.POA_CODE || ‘Unknown’;
const zoneMatch = props[‘popup-text’]?.match(/Zone\s*(\d+)/i);
const zone = zoneMatch ? zoneMatch[1] : ‘Unknown’;
const popupContent = `Postcode: ${postcode}
NatHERS Climate Zone: ${zone}`;
layer.bindPopup(popupContent);
}
}).addTo(map);
//on click and hover
const pointLayer = L.geoJSON(data, {
filter: feature => feature.geometry.type === ‘Point’,
pointToLayer: (feature, latlng) => {
const marker = L.marker(latlng);
const popupText = feature.properties[‘popup-text’];
if (feature.properties[‘popup-text’]) {
marker.bindPopup(feature.properties[‘popup-text’]);
marker.bindTooltip(popupText, {
permanent: false,
direction: ‘top’,
sticky: true,
opacity: 0.9,
});
marker.on(‘click’, () => {
marker.unbindTooltip();
});
}
return marker;
}
});
markerCluster.addLayer(pointLayer);
map.addLayer(markerCluster);
});
// Search Control
class SearchControl extends L.Control {
onAdd(map) {
const container = L.DomUtil.create(‘div’, ‘search-control’);
// Order: [input] [search] [close]
const input = L.DomUtil.create(‘input’, ‘search-input’, container);
input.type = ‘text’;
input.placeholder = ‘Search Australia…’;
const searchIcon = L.DomUtil.create(‘button’, ‘search-icon’, container);
searchIcon.innerHTML = ‘🔍’;
searchIcon.type = ‘button’;
const closeBtn = L.DomUtil.create(‘button’, ‘close-btn’, container);
closeBtn.innerHTML = ‘✖’;
closeBtn.type = ‘button’;
// Started with collapsed
container.classList.remove(‘expanded’);
// Click 🔍 extend or search
searchIcon.onclick = (e) => {
e.preventDefault();
if (!container.classList.contains(‘expanded’)) {
container.classList.add(‘expanded’);
input.focus();
} else {
this.search(input.value.trim());
input.value = ”;
container.classList.remove(‘expanded’);
}
};
// Click ✖ Collapse
closeBtn.onclick = (e) => {
e.preventDefault();
input.value = ”;
container.classList.remove(‘expanded’);
};
// Allow enter search
input.addEventListener(‘keypress’, (e) => {
if (e.key === ‘Enter’) {
this.search(input.value.trim());
input.value = ”;
container.classList.remove(‘expanded’);
}
});
input.addEventListener(‘keydown’, (e) => {
if (e.key === ‘Escape’) {
closeBtn.click();
}
});
L.DomEvent.disableClickPropagation(container);
return container;
}
async search(query) {
const coordRegex = /^-?\d+(\.\d+)?\s*,\s*-?\d+(\.\d+)?$/;
if (coordRegex.test(query)) {
const [lat, lon] = query.split(‘,’).map(Number);
map.setView([lat, lon], 10);
L.popup().setLatLng([lat, lon]).setContent(`Coordinates: ${lat}, ${lon}`).openOn(map);
} else {
try {
//const res = await fetch(`https://nominatim.openstreetmap.org/search?format=json&q=${encodeURIComponent(query)}`); //world
const res = await fetch(`https://nominatim.openstreetmap.org/search?format=json&countrycodes=au&q=${encodeURIComponent(query)}`); //au only
const data = await res.json();
if (data.length > 0) {
const { lat, lon, display_name } = data[0];
map.setView([lat, lon], 10);
L.popup().setLatLng([lat, lon]).setContent(`Location: ${display_name}`).openOn(map);
} else {
alert(‘No results found’);
}
} catch (err) {
console.error(err);
alert(‘Search failed’);
}
}
}
}
map.addControl(new SearchControl({ position: ‘topright’ }));
function formatFilter(val) {
let queryString = window.location.search;
if (queryString.indexOf(‘?product-page=’)!=-1){
if (queryString.indexOf(‘&’)!=-1) {
queryString = queryString.replace(/[?]product-page=[0-9]{1,2}[&]$/,’?’);
}
else {
queryString = queryString.replace(/[?]product-page=[0-9]{1,2}$/,”);
}
}
else if (queryString.indexOf(‘&product-page=’)!=-1){
queryString = queryString.replace(/&product-page=[0-9]{1,2}$/,”);
}
if (queryString.indexOf(‘?s-filter=’)!=-1){
queryString = queryString.replace(/[?]s-filter=[a-zA-Z0-9@.]+/i,’?’);
if (queryString.indexOf(‘?&’)!=-1){
queryString = queryString.replace(‘?&’,’?’);
}
else {
queryString = queryString.replace(‘?’,”);
}
}
/* removing search keyword when click the epw or acdb temporarly pause
if (queryString.indexOf(‘&s-filter=’)!=-1){
queryString = queryString.replace(/[&]s-filter=[a-zA-Z0-9@.]+/i,”);
}
else if (queryString.indexOf(‘?s-filter=’)!=-1){
queryString = queryString.replace(/[?]s-filter=[a-zA-Z0-9@.]+/i,”);
}
*/
if (queryString == ”){
window.location.replace(queryString+’?pa_format-filter=’+val);
}
else if (queryString != ”){
if (queryString.indexOf(val)==-1){
// if there is a keyword but format is not in the query, add format
if (queryString.indexOf(‘ausolrad’)!=-1){
queryString = ‘?pa_format-filter=’+val
window.location.replace(queryString);
}
else if ((val == ‘epw’ & queryString.indexOf(‘acdb’)==-1) || (val == ‘acdb’ & queryString.indexOf(‘epw’)==-1)){
queryString = queryString.replace(‘?’,’&’)
queryString = ‘?pa_format-filter=’+val+queryString
window.location.replace(queryString);
}
//replace format from acdb to epw
else if (val == ‘epw’ & queryString.indexOf(‘pa_format-filter=acdb’)!=-1){
queryString = queryString.replace(‘acdb’,’epw’);
window.location.replace(queryString);
}
//replace format from epw to acdb
else if (val == ‘acdb’ & queryString.indexOf(‘pa_format-filter=epw’)!=-1){
queryString = queryString.replace(‘epw’,’acdb’);
window.location.replace(queryString);
}
//replace format from solrad to acdb
else if (val == ‘ausolrad’ & queryString.indexOf(‘pa_format-filter=acdb’)!=-1){
queryString = queryString.replace(‘acdb’,’ausolrad’);
window.location.replace(queryString);
}
//replace format from solrad to epw
else if (val == ‘ausolrad’ & queryString.indexOf(‘pa_format-filter=epw’)!=-1){
queryString = queryString.replace(‘epw’,’ausolrad’);
window.location.replace(queryString);
}
}
//if format is on the query
else if (queryString.indexOf(val)!=-1){
//if click same format is on the query, remove the format and update the query
if (queryString.indexOf(‘?pa_format-filter=’+val +’&’)!=-1){
window.location.href = window.location.href.replace(‘?pa_format-filter=’+val+’&’, ‘?’);
}
//if click same format is on the query but only format is on query including page number, go to the main page.
else if (queryString.indexOf(‘?pa_format-filter=’+val)!=-1){
window.location.href = ‘https://exemplary.energy/data-purchase/’;
}
//if click same format is on the query (&), remove the format and update the query
else if (queryString.indexOf(‘&pa_format-filter=’+val)!=-1){
window.location.href = window.location.href.replace(‘&pa_format-filter=’+val, ”);
}
}
}
};
function setType(val) {
const typeArray = [‘rty’,’rmy’,’ismy’,’fwr’,’efmy’,’xmy’,’sample’];
const arrayLength = typeArray.length;
let queryString = window.location.search;
if (queryString.indexOf(‘?product-page=’)!=-1){
if (queryString.indexOf(‘&’)!=-1) {
queryString = queryString.replace(/[?]product-page=[0-9]{1,2}[&]$/,’?’);
}
else {
queryString = queryString.replace(/[?]product-page=[0-9]{1,2}$/,”);
}
}
else if (queryString.indexOf(‘&product-page=’)!=-1){
queryString = queryString.replace(/&product-page=[0-9]{1,2}$/,”);
}
if (queryString.indexOf(‘?s-filter=’)!=-1){
queryString = queryString.replace(/[?]s-filter=[a-zA-Z0-9@.]+/i,’?’);
if (queryString.indexOf(‘?&’)!=-1){
queryString = queryString.replace(‘?&’,’?’);
}
else {
queryString = queryString.replace(‘?’,”);
}
}
if (queryString.indexOf(‘&s-filter=’)!=-1){
queryString = queryString.replace(/[&]s-filter=[a-zA-Z0-9@.]+/i,”);
}
if (queryString == ”){
window.location.href = queryString+’?pa_datatype-filter=’+val;
}
else if (queryString != ”){
if (queryString.indexOf(val)==-1 & queryString.indexOf(‘pa_datatype-filter’)==-1){
window.location.href = queryString+’&pa_datatype-filter=’+val;
}
else if (queryString.indexOf(val)==-1 & queryString.indexOf(‘pa_datatype-filter’)!=-1) {
for (var i = 0; i < arrayLength; i++) {
if (queryString.indexOf(typeArray[i])!=-1){
window.location.href = queryString.replace(typeArray[i], val);
}
}
}
else if (queryString.indexOf(val)!=-1){
//if click same format is on the query, remove the type and update the query
if (queryString.indexOf('?pa_datatype-filter='+val +'&')!=-1){
window.location.href = window.location.href.replace('?pa_datatype-filter='+val+'&', '?');
//if click same format is on the query but only type is on query including page number, go to the main page.
}else if (queryString.indexOf('?pa_datatype-filter='+val)!=-1){
window.location.href = 'https://exemplary.energy/data-purchase/';
}
else if (queryString.indexOf('&pa_datatype-filter='+val)!=-1){
window.location.href = window.location.href.replace('&pa_datatype-filter='+val, '');
}
}
}
};
Showing 427–432 of 432 results
-
ACDBXMYYoung Climate Data – eXtreme Meteorological Year (ACDB)
$100.00 exc. GST/Tax Add to Cart -
EPWXMYYoung Climate Data – eXtreme Meteorological Year (EPW)
$100.00 exc. GST/Tax Add to Cart -
ACDB34 YearsYoung Climate Data – Full 34 Years (ACDB)
$100.00 exc. GST/Tax Add to Cart -
EPW34 YearsYoung Climate Data – Full 34 Years (EPW)
$100.00 exc. GST/Tax Add to Cart -
ACDBRMYYoung Climate Data – Reference Meteorological Year (ACDB)
Price range: $100.00 through $150.00 exc. GST/Tax Add to Cart This product has multiple variants. The options may be chosen on the product page -
EPWRMYYoung Climate Data – Reference Meteorological Year (EPW)
Price range: $100.00 through $150.00 exc. GST/Tax Add to Cart This product has multiple variants. The options may be chosen on the product page
Selected option
if (window.location.href.indexOf(“epw”) > -1) {
document.getElementById(‘format-epw’).style.background = ‘#ff6900’;
document.getElementById(‘format-epw’).style.color = ‘white’;
}
else if (window.location.href.indexOf(“acdb”) > -1) {
document.getElementById(‘format-acdb’).style.background = ‘#ff0000’;
document.getElementById(‘format-acdb’).style.color = ‘white’;
}
if (window.location.href.indexOf(“datatype-filter=rty”) > -1) {
document.getElementById(‘type-rty’).style.background = ‘#d11749’;
document.getElementById(‘type-rty’).style.color = ‘white’;
}
else if (window.location.href.indexOf(“datatype-filter=rmy”) > -1) {
document.getElementById(‘type-rmy’).style.background = ‘#fcb900’;
document.getElementById(‘type-rmy’).style.color = ‘white’;
}
else if (window.location.href.indexOf(“datatype-filter=ismy”) > -1) {
document.getElementById(‘type-ismy’).style.background = ‘#79d627’;
document.getElementById(‘type-ismy’).style.color = ‘white’;
}
else if (window.location.href.indexOf(“datatype-filter=fwr”) > -1) {
document.getElementById(‘type-fwr’).style.background = ‘#3265b3’;
document.getElementById(‘type-fwr’).style.color = ‘white’;
}
else if (window.location.href.indexOf(“datatype-filter=efmy”) > -1) {
document.getElementById(‘type-efmy’).style.background = ‘#4b525c’;
document.getElementById(‘type-efmy’).style.color = ‘white’;
}
else if (window.location.href.indexOf(“datatype-filter=xmy”) > -1) {
document.getElementById(‘type-xmy’).style.background = ‘#8ed1fc’;
document.getElementById(‘type-xmy’).style.color = ‘white’;
}
else if (window.location.href.indexOf(“datatype-filter=sample”) > -1) {
document.getElementById(‘type-sample’).style.background = ‘#53a8b6’;
document.getElementById(‘type-sample’).style.color = ‘white’;
}
Showing 1–12 of 432 results
-
ACDBEFMYAlbury Climate Data – Ersatz Future Meteorological Years (ACDB)
$200.00 exc. GST/Tax Add to Cart -
EPWEFMYAlbury Climate Data – Ersatz Future Meteorological Years (EPW)
$200.00 exc. GST/Tax Add to Cart -
ACDBXMYAlbury Climate Data – eXtreme Meteorological Year (ACDB)
$100.00 exc. GST/Tax Add to Cart -
EPWXMYAlbury Climate Data – eXtreme Meteorological Year (EPW)
$100.00 exc. GST/Tax Add to Cart -
ACDB34 YearsAlbury Climate Data – Full 34 Years (ACDB)
$100.00 exc. GST/Tax Add to Cart -
EPW34 YearsAlbury Climate Data – Full 34 Years (EPW)
$100.00 exc. GST/Tax Add to Cart -
ACDBRMYAlbury Climate Data – Reference Meteorological Year (ACDB)
Price range: $100.00 through $150.00 exc. GST/Tax Add to Cart This product has multiple variants. The options may be chosen on the product page -
EPWRMYAlbury Climate Data – Reference Meteorological Year (EPW)
Price range: $100.00 through $150.00 exc. GST/Tax Add to Cart This product has multiple variants. The options may be chosen on the product page -
ACDBEFMYArmidale Climate Data – Ersatz Future Meteorological Years (ACDB)
$200.00 exc. GST/Tax Add to Cart -
EPWEFMYArmidale Climate Data – Ersatz Future Meteorological Years (EPW)
$200.00 exc. GST/Tax Add to Cart -
ACDBXMYArmidale Climate Data – eXtreme Meteorological Year (ACDB)
$100.00 exc. GST/Tax Add to Cart -
EPWXMYArmidale Climate Data – eXtreme Meteorological Year (EPW)
$100.00 exc. GST/Tax Add to Cart

