Saturday, April 27, 2024
 Popular · Latest · Hot · Upcoming
85
rated 0 times [  91] [ 6]  / answers: 1 / hits: 20720  / 15 Years ago, sun, june 28, 2009, 12:00:00

I would like to add an overlay image on a Google Map. The image is a SVG file I have generated (Python with SVGFig).



I am using the following code:



if (GBrowserIsCompatible()) {
var map = new GMap2(document.getElementById(map_canvas));
map.setCenter(new GLatLng(48.8, 2.4), 12);

    // ground overlay
    var boundaries = new GLatLngBounds(new GLatLng(48.283188032632829, 1.9675270369830129), new GLatLng(49.187215000000002, 2.7771877478303999));
    var oldmap = new GGroundOverlay(test.svg, boundaries);
map.addControl(new GSmallMapControl());
map.addControl(new GMapTypeControl());
map.addOverlay(oldmap);
}


Surprisingly, it works with Safari 4, but it doesn't work with Firefox (with Safari 3, the background is not transparent).



Does anyone have an idea on how I could overlay an SVG?



PS1: I read some works like this or the source code of swa.ethz.ch/googlemaps, but it seems that they have to use JavaScript code to parse the SVG and add one by one all the elements (but I did not understand all the source...).



PS2: The SVG is composed of different filled paths and circles, with transparency.
If there is no solution to overlay my SVG, I can use 2 alternative solutions:




  • rasterize the SVG

  • convert the paths and circles in GPolygons



But I do not really like the 1st solution because of the poor quality of the bitmap and the time to generate it with antialiasing.



And for the 2nd solution, the arcs, ellipses and circles will have to be decomposed into small polylines. A lot of them will be necessary for a good result. But I have around 3000 arcs and circles to draw, so...


More From » google-maps

 Answers
16

Here are some news (I hope it's better to put them here in an answer, instead of editing my questions or to create a new question. Please feel free to move it if needed, or to tell me, so as I can rectify):



My problem was the following:



var oldmap = new GGroundOverlay(test.svg, boundaries);
map.addOverlay(oldmap);


did not work on Safari 3, Firefox and Opera (IE is not enable to draw SVG).



In fact, this code produce the insertion (in a <div>) of the following element



<img src=test.svg style=.....>


And Safari 4 is able to draw a SVG file as an image, but this is not the way to do for the other browser. So the idea is now to create a custom overlay for the SVG, as explained here.



That's the reason why I asked for this question (I am sorry, but HTML/javascript are not my strongest points).



And since there is a small bug with Webkit for rendering a SVG with transparent background with <object>element, I need to use <object> or <img> accordingly to the browser (I don't like this, but... for the moment, it's still the quick-and-dirty experiments)



So I started with this code (still work in progress):



// create the object
function myOverlay(SVGurl, bounds)
{
this.url_ = SVGurl;
this.bounds_ = bounds;
}

// prototype
myOverlay.prototype = new GOverlay();

// initialize
myOverlay.prototype.initialize = function(map)
{
// create the div
var div = document.createElement(div);
div.style.position = absolute;
div.setAttribute('id',SVGdiv);
div.setAttribute('width',900px);
div.setAttribute('height',900px);

// add it with the same z-index as the map
this.map_ = map;
this.div_ = div;

//create new svg root element and set attributes
var svgRoot;
if (BrowserDetect.browser=='Safari')
{
// Bug in webkit: with <objec> element, Safari put a white background... :-(
svgRoot = document.createElement(img);
svgRoot.setAttribute(id, SVGelement);
svgRoot.setAttribute(type, image/svg+xml);
svgRoot.setAttribute(style,width:900px;height:900px);
svgRoot.setAttribute(src, test.svg);
}
else //if (BrowserDetect.browser=='Firefox')
{
svgRoot = document.createElement(object);
svgRoot.setAttribute(id, SVGelement);
svgRoot.setAttribute(type, image/svg+xml);
svgRoot.setAttribute(style,width:900px;height:900px;);
svgRoot.setAttribute(data, test.svg);
}


div.appendChild(svgRoot);
map.getPane(G_MAP_MAP_PANE).appendChild(div);

//this.redraw(true);
}

...


The draw function is not yet written.



I still have a problem (I progress slowly, thanks to what I read/learn everywhere, and also thanks to people who answer my questions).



Now, the problem is the following : with the <object> tag, the map is not draggable. All over the <object> element, the mouse pointer is not the hand icon to drag the map, but just the normal pointer.



And I did not find how to correct this. Should I add a new mouse event (I just saw mouse event when a click or a double-click append, but not for dragging the map...) ?



Or is there another way to add this layer so as to preserve the drag-ability ?



Thank you for your comments and answers.



PS: I also try to add one by one the elements of my SVG, but... in fact... I don't know how to add them in the DOM tree. In this example, the SVG is read and parsed with GXml.parse(), and all the elements with a given tag name are obtained (xml.documentElement.getElementsByTagName) and added to the SVG node (svgNode.appendChild(node)). But in my case, I need to add directly the SVG/XML tree (add all its elements), and there are different tags (<defs>, <g>, <circle>, <path>, etc.). It is may be simpler, but I don't know how to do.. :(


[#99226] Wednesday, June 24, 2009, 15 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
byrondonavanc

Total Points: 675
Total Questions: 107
Total Answers: 105

Location: Peru
Member since Fri, Oct 14, 2022
2 Years ago
byrondonavanc questions
;