Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added optional coordinateConversion method #5

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
27 changes: 20 additions & 7 deletions src/converter.js
@@ -1,12 +1,20 @@
//converter.js
var multi = require('multigeojson');
function getCoordString(coords,res,origin) {

function getCoordString(coords,res,origin,opt) {
//origin - svg image origin
var coordStr = coords.map(function(coord) {
if (opt.coordinateConversion) {
//CONVERT coords into meters
var newCoord = opt.coordinateConversion(coord[1], coord[0]);
var newOrigin = opt.coordinateConversion(origin.y, origin.x);
return (newCoord[0] - newOrigin[0])/res + ',' + (newOrigin[1] - newCoord[1])/res;
}
return (coord[0] - origin.x)/res + ',' + (origin.y - coord[1])/res;
});
return coordStr.join(' ');
}

function addAttributes(ele,attributes) {
var part = ele.split('/>')[0];
for(var key in attributes) {
Expand All @@ -19,25 +27,27 @@ function addAttributes(ele,attributes) {

function point(geom,res,origin,opt) {
var r = opt && opt.r ? opt.r : 1;
var path = 'M' + getCoordString([geom.coordinates],res,origin)
var path = 'M' + getCoordString([geom.coordinates],res,origin,opt)
+' m'+ -r+ ',0'+ ' a'+r+','+ r + ' 0 1,1 '+ 2*r + ','+0
+' a'+r+','+ r + ' 0 1,1 '+ -2*r + ','+0;
return [path];
}

function multiPoint(geom,res,origin,opt) {
var explode = opt && opt.hasOwnProperty('explode') ? opt.explode : false;
var paths = multi.explode(geom).map(function(single) {
return point(single,res,origin,opt)[0];
});
if(!explode) return [paths.join(' ')];
return paths;

}
function lineString(geom,res,origin,otp) {
var coords = getCoordString(geom.coordinates,res,origin);

function lineString(geom,res,origin,opt) {
var coords = getCoordString(geom.coordinates,res,origin,opt);
var path = 'M'+ coords;
return [path];
}

function multiLineString(geom,res,origin,opt) {
var explode = opt && opt.hasOwnProperty('explode') ? opt.explode : false;
var paths = multi.explode(geom).map(function(single) {
Expand All @@ -46,21 +56,23 @@ function multiLineString(geom,res,origin,opt) {
if(!explode) return [paths.join(' ')];
return paths;
}

function polygon(geom,res,origin,opt) {
var mainStr,holes,holeStr;
mainStr = getCoordString(geom.coordinates[0],res,origin);
mainStr = getCoordString(geom.coordinates[0],res,origin, opt);
if (geom.coordinates.length > 1) {
holes = geom.coordinates.slice(1,geom.coordinates.length);
}
var path = 'M'+ mainStr;
if(holes) {
for(var i=0;i<holes.length; i++) {
path += ' M' + getCoordString(holes[i],res,origin);
path += ' M' + getCoordString(holes[i],res,origin, opt);
}
}
path += 'Z';
return [path];
}

function multiPolygon(geom,res,origin,opt) {
var explode = opt.hasOwnProperty('explode') ? opt.explode : false;
var paths = multi.explode(geom).map(function(single) {
Expand All @@ -69,6 +81,7 @@ function multiPolygon(geom,res,origin,opt) {
if(!explode) return [paths.join(' ').replace(/Z/g,'') + 'Z'];
return paths;
}

module.exports = {
Point: point,
MultiPoint: multiPoint,
Expand Down
34 changes: 20 additions & 14 deletions src/instance.js
@@ -1,24 +1,31 @@
var extend = require('xtend'),
converter = require('./converter.js');



//g2svg as geojson2svg (shorthand)
var g2svg = function(viewportSize,options) {
if(!viewportSize) return;
this.viewportSize = viewportSize;
this.options = options || {};
this.mapExtent = this.options.mapExtent ||
{
left: -20037508.342789244,
right: 20037508.342789244,
bottom: -20037508.342789244,
top: 20037508.342789244
};
this.mapExtent = this.options.mapExtent
|| {'left':-180,'bottom':-90,'right':180,'top':90};
this.res = this.calResolution(this.mapExtent,this.viewportSize);
};
g2svg.prototype.calResolution = function(extent,size) {
var xres = (extent.right - extent.left)/size.width;
var yres = (extent.top - extent.bottom)/size.height;
return Math.max(xres,yres);
if(this.options.coordinateConversion) {
var newExtentNE = this.options.coordinateConversion(extent.top, extent.right);
var newExtentSW = this.options.coordinateConversion(extent.bottom, extent.left);
var xres = (newExtentNE[0] - newExtentSW[0])/size.width;
var yres = (newExtentNE[1] - newExtentSW[1])/size.height;
return Math.max(xres,yres);
} else{
var xres = (extent.right - extent.left)/size.width;
var yres = (extent.top - extent.bottom)/size.height;
return Math.max(xres,yres);
}


};
g2svg.prototype.convert = function(geojson,options) {
var opt = extend(extend({},this.options), options || {});
Expand Down Expand Up @@ -55,24 +62,23 @@ g2svg.prototype.convertFeature = function(feature,options) {
g2svg.prototype.convertGeometry = function(geom,options) {
if(converter[geom.type]) {
var opt = extend(extend({},this.options), options || {});
var output = opt.output || 'svg';
//var explode = opt.hasOwnProperty('explode') ? opt.explode : false;
var paths = converter[geom.type].call(this,geom,
this.res,
{x:this.mapExtent.left,y:this.mapExtent.top},
opt
);
var svgJsons,svgEles;
if (output.toLowerCase() == 'svg') {
if(opt.output && opt.output.toLowerCase() == 'svg') {
svgJsons = paths.map(function(path) {
return pathToSvgJson(path,geom.type,opt.attributes,opt);
});
svgEles = svgJsons.map(function(json) {
return jsonToSvgElement(json,geom.type);
});
return svgEles;
} else {
return paths;
}
return paths;
} else {
return;
}
Expand Down