Google earth Engine ... Export images as ascii - export

Is it possible to export an image from Google Earth Engine as ASCII raster
Export.image.toDrive({
image: 'image',
region: region,
scale: 30,
crs: 'EPSG:4326',
});

No it is not. Currently the only supported output formats are GeoTIFF and TFRecord. https://developers.google.com/earth-engine/apidocs/export-image-todrive

Not very efficient, you can sample the pixels and export them to CSV.
// Define Region of interest
var roi = ee.Geometry.Polygon(
[[[11.304653628407992, 42.60010798357459],
[11.304653628407992, 42.40673200589496],
[11.605404360829867, 42.40673200589496],
[11.605404360829867, 42.60010798357459]]], null, false);
// get L8 image
var l8 = ee.ImageCollection("LANDSAT/LC08/C01/T1_TOA")
.filterBounds(roi).filterMetadata('CLOUD_COVER','less_than',5).first()
// add Lat/Lon
var ll = ee.Image.pixelLonLat()
var proj = l8.select('B1').projection()
var image = l8.addBands(ll.reproject(proj)).clip(roi)
// sample the image
var p = image.sample({region:roi, scale:30, projection:proj})
// Display
Map.addLayer(image)
// Export to CSV file
Export.table.toDrive({collection:p, description:'points', fileFormat:'CSV'})

Related

Convert SVG to PNG/JPEG not working on FF [duplicate]

I am trying to convert an external svg icon to a base64 png using a canvas. It is working in all browsers except Firefox, which throws an error "NS_ERROR_NOT_AVAILABLE".
var img = new Image();
img.src = "icon.svg";
img.onload = function() {
var canvas = document.createElement("canvas");
canvas.width = this.width;
canvas.height = this.height;
var ctx = canvas.getContext("2d");
ctx.drawImage(this, 0, 0);
var dataURL = canvas.toDataURL("image/png");
return dataURL;
};
Can anyone help me on this please? Thanks in advance.
Firefox does not support drawing SVG images to canvas unless the svg file has width/height attributes on the root <svg> element and those width/height attributes are not percentages. This is a longstanding bug.
You will need to edit the icon.svg file so it meets the above criteria.
As mentioned, this is an open bug caused by limitations on what Firefox accepts as specification for SVG sizes when drawing to a canvas. There is a workaround.
Firefox requires explicit width and height attributes in the SVG itself. We can add these by getting the SVG as XML and modifying it.
var img = new Image();
var src = "icon.svg";
// request the XML of your svg file
var request = new XMLHttpRequest();
request.open('GET', src, true)
request.onload = function() {
// once the request returns, parse the response and get the SVG
var parser = new DOMParser();
var result = parser.parseFromString(request.responseText, 'text/xml');
var inlineSVG = result.getElementsByTagName("svg")[0];
// add the attributes Firefox needs. These should be absolute values, not relative
inlineSVG.setAttribute('width', '48px');
inlineSVG.setAttribute('height', '48px');
// convert the SVG to a data uri
var svg64 = btoa(new XMLSerializer().serializeToString(inlineSVG));
var image64 = 'data:image/svg+xml;base64,' + svg64;
// set that as your image source
img.src = img64;
// do your canvas work
img.onload = function() {
var canvas = document.createElement("canvas");
canvas.width = this.width;
canvas.height = this.height;
var ctx = canvas.getContext("2d");
ctx.drawImage(this, 0, 0);
var dataURL = canvas.toDataURL("image/png");
return dataURL;
};
}
// send the request
request.send();
This is the most basic version of this solution, and includes no handling for errors when retrieving the XML. Better error handling is demonstrated in this inline-svg handler (circa line 110) from which I derived part of this method.
This isn't the most robust solution, but this hack worked for our purposes. Extract viewBox data and use these dimensions for the width/height attributes.
This only works if the first viewBox encountered has a size that accurately can represent the size of the SVG document, which will not be true for all cases.
// #svgDoc is some SVG document.
let svgSize = getSvgViewBox(svgDoc);
// No SVG size?
if (!svgSize.width || !svgSize.height) {
console.log('Image is missing width or height');
// Have size, resolve with new SVG image data.
} else {
// Rewrite SVG doc
let unit = 'px';
$('svg', svgDoc).attr('width', svgSize.width + unit);
$('svg', svgDoc).attr('height', svgSize.height + unit);
// Get data URL for new SVG.
let svgDataUrl = svgDocToDataURL(svgDoc);
}
function getSvgViewBox(svgDoc) {
if (svgDoc) {
// Get viewBox from SVG doc.
let viewBox = $(svgDoc).find('svg').prop('viewBox').baseVal;
// Have viewBox?
if (viewBox) {
return {
width: viewBox.width,
height: viewBox.height
}
}
}
// If here, no viewBox found so return null case.
return {
width: null,
height: null
}
}
function svgDocToDataURL(svgDoc, base64) {
// Set SVG prefix.
const svgPrefix = "data:image/svg+xml;";
// Serialize SVG doc.
var svgData = new XMLSerializer().serializeToString(svgDoc);
// Base64? Return Base64-encoding for data URL.
if (base64) {
var base64Data = btoa(svgData);
return svgPrefix + "base64," + base64Data;
// Nope, not Base64. Return URL-encoding for data URL.
} else {
var urlData = encodeURIComponent(svgData);
return svgPrefix + "charset=utf8," + urlData;
}
}

set size of a base64 image javascript - angularjs

I saw many answers but I didn't find a good solution for this:
I have a picture in my $scope.file = /9j/4VeIRXhpZgAASUkqAAgAAAAL [..]
And it size is 5217984 = 5 MB
But this picture is só big and my angular aplication/web service is not supporting it.
What have I to do? And how?
I'm trying to convert this 5 MB image to a image with 500 KB but I didn't get it. Can anyone help my please?
I don't know if it its possible, but I need a function in javascript to convert that 5MB image to a image with 500 KB for example, and I can riseze it.
And its everything right in my application when I put a image with 500 KB fir example.
var $scope.getData= function () {
var reader = new FileReader();
reader.onload = $('input[type=file]')[0].files;
var img = new Image();
img.src =(reader.onload[0].result);
img.onload = function() {
if(this.width > 640)
{
//Get resized image
img= imageToDataUri(this, 640, 480);
}
}
};
//Resize the image (in the example 640 x 480px)
function imageToDataUri(img, width, height) {
// create an off-screen canvas
const canvas = document.createElement('canvas'),
const ctx = canvas.getContext('2d');
// set its dimension to target size
canvas.width = width;
canvas.height = height;
// draw source image into the off-screen canvas:
ctx.drawImage(img, 0, 0, width, height);
// encode image to data-uri with base64 version of compressed image
return canvas.toDataURL();
}
If you have access to the encoded base64 just use this function:
$scope.getFileSize = function (base64encoded) {
try {
var encodedString = base64encoded.split(',')[1]
} catch (errorMsg) {
return false;
}
var decodedBase64 = atob(encodedString);
return decodedBase64.length;
};

Having issues with annotations in a loop in Appcelerator

So this is my first time working with Appcelerator's Map module and and I could use some advice on trying to make annotations appear on my map for every location I have identified. The dbArray is being passed in from another module and I have verified that there is data in the array, however I am not sure how to get it to be processed in the loop. Can anyone make any suggestions to help guide me?
var buildSecUI = function(dbArray){ //dbArray from data.js read function
console.log("---buildSecUI is activated---");
console.log(dbArray);
var secWin = Ti.UI.createWindow({
layout: "vertical",
backgroundColor: "#ffffff"
});
//building the map
var Map = require('ti.map');
var mapView = Map.createView({
mapType: Map.NORMAL_TYPE,
region: {latitude:25.2867, longitude:51.5333,
latitudeDelta:0.05, longitudeDelta:0.05},
animate:true,
regionFit:true,
userLocation:true
});
//array for annotations (pins for maps)
var annotations = [];
for ( var i = 0 ; i < dbArray.length; i++ ) {
// this section will create annotations and add them on the mapView
var pin = Map.createAnnotation({
latitude: this.dbArray[i].lat,
longitude: this.dbArray[i].lng,
title: this.dbArray[i].name,
animate:true,
pincolor:Map.ANNOTATION_PURPLE
});
annotations[i] = pin;
//annotations.push(pin);
mapView.addAnnotation(annotations[i]); // adds annotations
} //for loop closure
secWin.add(mapView);
navWin.openWindow(secWin); }; //closure for buildSecUI
In your loop you are referring to "this.dbArray[i]", it should be just "dbArray[i]". "this.dbArray" is probably undefined.

How to create a thumbnail of base64 encoded image in angularjs application

I have a application where the images are coming has base64 encoded string where i am decoding it and showing on the google map,but for few images only part of the image is displayed so can i create a thumbnail of the image and make it visible more properly
sample input of image data:
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
and i am decoding has
var iconResize = new google.maps.MarkerImage(
"data:image/png;base64,"+data.Photo, //url
new google.maps.Size(70, 70)//size
);
please say how to go about
In order to scale image, the scaledSize property of google.maps.MarkerImage object needs to be specified explicitly, for example:
var icon = new google.maps.MarkerImage();
icon.size = new google.maps.Size(128, 128);
icon.scaledSize = new google.maps.Size(128, 128);
icon.url = "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/...";
Working example
var iconScaling = function (base64) {
return {
url: base64,
scaledSize: new google.maps.Size(50, 50),
origin: new google.maps.Point(0, 0),
anchor: new google.maps.Point(0, 0)
};
};
var createMarker = function (info) {
var marker = new google.maps.Marker({
position: new google.maps.LatLng(info.Lat, info.Lon),
map: $scope.map,
animation: google.maps.Animation.NONE
});
marker.setIcon(iconScaling(info.icon_name));
/////----//////
createMarker({ Lat: value.LocationDetails.Lat, Lon: value.LocationDetails.Lon, icon_name: 'data:image/jpeg;base64,' + value.CustomerInfo.Photo, CustomerID: key });

Add markers to a Ext.Map in Sencha Touch

I am trying to make an application which displays a map with your current location marker and several markers related to data from the server which location is closed to your current location. So far I can render the map, show the current location and get the data related to this location. The problem arise when I try to add markers about the location of this data.
I´ve read through a lot of forums and pages but I found no solution.
I use this piece of code to add markers (to try to add them ..):
var marker = new google.maps.Marker({
map: map._map,
position: new google.maps.LatLng(bookletMarker[i].location[1],bookletMarker[i].location[0]),
title : bookletMarker[i].title,
draggable:false,
icon: "point.png"
});
//This code renders a map with 2 points and displays the route to travel from point A to point B
//On Map Render
onMapMaprender: function(map, gmap, eOpts) {
var record = Ext.getCmp('Panel').getData();
var map = Ext.ComponentQuery.query('#LocationMap')[0].getMap();
var polyline = new google.maps.Polyline();
var markerImage = new google.maps.MarkerImage(
'marker.png',
new google.maps.Size(32, 31),
new google.maps.Point(0, 0),
new google.maps.Point(16, 31)
);
var lat = record.data.latitude;
var lon = record.data.longitude;
console.log(lat,lon);
var destinationMarker = new google.maps.Marker({
icon: markerImage,
position: new google.maps.LatLng(lat,lon),
title : 'destination',
map: map,
})
var latSrc = localStorage.getItem('lat');
var lonSrc = localStorage.getItem('lon');
var sourceMarker = new google.maps.Marker({
icon: markerImage,
position: new google.maps.LatLng(latSrc,lonSrc),
title : 'source',
map: map,
})
function dir_callback(a,b){
g=a;
route_no=0;
if(b=="OK"){
var polyarr = a.routes[route_no].overview_path;
polyline.setPath(polyarr);
polyline.setMap(map);
}
}
var dirS = new google.maps.DirectionsService();
var req = {
origin: sourceMarker.getPosition(),
destination: destinationMarker.getPosition(),
travelMode: google.maps.DirectionsTravelMode.DRIVING,
provideRouteAlternatives : true
};
dirS.route(req,dir_callback);
},
//Setting the Map
var cr = new google.maps.LatLng(lat,lon);
Ext.getCmp('LocationMap').setMapCenter(cr);
You should be able to get the map instance from your map with getMap() and then add the pointer as described in the google maps api docs:
marker.setMap(map);
You can use map.getMap() to get the google map instance and use it when you create markers.
Here, you have directly added icon image path, instead use MarkerImage object as follow,
var imageIcon = new google.maps.MarkerImage(
"point.png",
new google.maps.Size(32, 32),
new google.maps.Point(0, 0),
new google.maps.Point(16, 31)
);
var marker = new google.maps.Marker({
map: map._map,
position: new google.maps.LatLng(bookletMarker[i].location[1],bookletMarker[i].location[0]),
title : bookletMarker[i].title,
draggable:false,
icon: imageIcon
});

Resources