Iniciar sesión

Ver la versión completa : [Ayuda] [Java] Calcular area con coordenadas GPS



ChUKii
01/03/2011, 15:38
Hola peña!

No tendreis/conocereis alguna libreria/clase Java a la que le pases una lista de coordenadas y te devuelva el area...
Soy un negao para las matemáticas y no querría reinventar la rueda :D:D.

La idea es que la ultima posición se una con la primera para cerrar el area del poligono y así poder calcular el area...

He buscado por google y no he encontrado mucho :mad:

:brindis::brindis:

< - >
He encontrado una clase que tiene muy buena pinta... espero que me sirva, aunque el resultado del area no va a estar en hectareas :rolleyes: pero bueno convertirlo a metros^2 no sera mu complicado y de ahi a hectareas chupao :D



/************************************************** ***********************
* Compilation: javac Polygon.java
* Execution: java Polygon
*
* An immutable datat type for polygons, possibly intersecting.
*
* Centroid calculation assumes polygon is nonempty (o/w area = 0)
*
************************************************** ***********************/

public class Polygon {
private final int N; // number of points in the polygon
private final Point[] points; // the points, setting p[0] = p[N]

// defensive copy
public Polygon(Point[] points) {
N = points.length;
this.points = new Point[N+1];
for (int i = 0; i < N; i++)
this.points[i] = points[i];
this.points[N] = points[0];
}

// read from input stream
public Polygon(In in) {
N = in.readInt();
points = new Point[N+1];
for (int i = 0; i < N; i++)
points[i] = new Point(in);
points[N] = points[0];
}


// return size
public int size() { return N; }

// draw outline of polygon
public void draw() {
double[] x = new double[N+1];
double[] y = new double[N+1];
for (int i = 0; i <= N; i++) x[i] = points[i].x();
for (int i = 0; i <= N; i++) y[i] = points[i].y();
StdDraw.polygon(x, y);
}

// filled polygon
public void fill() {
double[] x = new double[N+1];
double[] y = new double[N+1];
for (int i = 0; i <= N; i++) x[i] = points[i].x();
for (int i = 0; i <= N; i++) y[i] = points[i].y();
StdDraw.filledPolygon(x, y);
}

// return the bounding box
public BoundingBox box() {
return new BoundingBox(points);
}

// return a random point inside the polygon
public Point sample() {
BoundingBox box = this.box();
Point p;
do {
p = box.sample();
} while (!this.contains(p));
return p;
}

// return area of polygon
public double area() { return Math.abs(signedArea()); }

// return signed area of polygon
public double signedArea() {
double sum = 0.0;
for (int i = 0; i < N; i++) {
sum = sum + (points[i].x() * points[i+1].y()) - (points[i].y() * points[i+1].x());
}
return 0.5 * sum;
}

// are vertices in counterclockwise order?
// assumes polygon does not intersect itself
public boolean isCCW() {
return signedArea() > 0;
}

// return the centroid of the polygon
public Point centroid() {
double cx = 0.0, cy = 0.0;
for (int i = 0; i < N; i++) {
cx = cx + (points[i].x() + points[i+1].x()) * (points[i].y() * points[i+1].x() - points[i].x() * points[i+1].y());
cy = cy + (points[i].y() + points[i+1].y()) * (points[i].y() * points[i+1].x() - points[i].x() * points[i+1].y());
}
cx /= (6 * area());
cy /= (6 * area());
return new Point(cx, cy);
}


// does this Polygon contain the point p?
// if p is on boundary then 0 or 1 is returned, and p is in exactly one point of every partition of plane
// Reference: http://exaflop.org/docs/cgafaq/cga2.html
public boolean contains(Point p0) {
int crossings = 0;
for (int i = 0; i < N; i++) {
double slope = (points[i+1].x() - points[i].x()) / (points[i+1].y() - points[i].y());
boolean cond1 = (points[i].y() <= p0.y()) && (p0.y() < points[i+1].y());
boolean cond2 = (points[i+1].y() <= p0.y()) && (p0.y() < points[i].y());
boolean cond3 = p0.x() < slope * (p0.y() - points[i].y()) + points[i].x();
if ((cond1 || cond2) && cond3) crossings++;
}
return (crossings % 2 != 0);
}

// return string representation of this polygon
public String toString() {
StringBuilder s = new StringBuilder();
s.append(N + "\n");
for (int i = 0; i < N; i++)
s.append(points[i] + "\n");
return s.toString();
}


// test client
public static void main(String[] args) {
int N = Integer.parseInt(args[0]);

// read polygon from stdin
In in = new In();
Polygon poly = new Polygon(in);
StdOut.println(poly);
StdOut.println(poly.box());
StdOut.println("area = " + poly.area());
StdOut.println("centroid = " + poly.centroid());

StdDraw.setXscale(-106.644936, -93.507957);
StdDraw.setYscale( +25.839756, +36.500549);

StdDraw.setPenColor(StdDraw.GRAY);
poly.fill();

// generate N random points in the polygon
for (int i = 0; i < N; i++) {
Point p = poly.sample();
if (StdRandom.bernoulli(.3)) StdDraw.setPenColor(StdDraw.WHITE);
else StdDraw.setPenColor(StdDraw.BLUE);
p.draw();
}
}
}



:brindis::brindis:

juanvvc
01/03/2011, 16:18
No sé para qué lo quieres, pero recuerda que el GPS da las coordenadas para el sistema WGS84, y no es tan trivial transformar una diferencia de latitudes/longitudes a metros. Nada, nada trivial. Las ecuaciones son tan largas como tu brazo.

El error que cometas puede ser muy importante.

ChUKii
01/03/2011, 17:17
No sé para qué lo quieres, pero recuerda que el GPS da las coordenadas para el sistema WGS84, y no es tan trivial transformar una diferencia de latitudes/longitudes a metros. Nada, nada trivial. Las ecuaciones son tan largas como tu brazo.

El error que cometas puede ser muy importante.

Arf tienes razon... he conseguido dar con una serie de librerias cartograficas que me podrán servir:

http://docs.geotools.org/stable/javadocs/

La putada es que ocupan demasiado... bueno a ver que sale de esto :rolleyes:.

Gracias Juanvvc :brindis::brindis: