Ignore:
Timestamp:
2015-10-21T11:34:01+02:00 (10 years ago)
Author:
malcolmh
Message:

Multipolygon processing

File:
1 edited

Legend:

Unmodified
Added
Removed
  • TabularUnified applications/editors/josm/plugins/seachart/src/s57/S57map.java

    r31157 r31659  
    767767                feature.geom.area = 0;
    768768                if (feature.geom.prim == Pflag.POINT) {
    769                         feature.geom.centre = findCentroid(feature);
     769                        feature.geom.centre = nodes.get(feature.geom.elems.get(0).id);
    770770                        return true;
    771771                }       else {
     
    826826                }
    827827                if (feature.geom.prim == Pflag.AREA) {
    828                         if (signedArea(feature.geom) < 0.0) {
    829                                
    830                         };
    831                         feature.geom.area = calcArea(feature.geom);
     828                        int ie = 0;
     829                        int ic = 0;
     830                        while (ie < feature.geom.elems.size()) {
     831                                double area = calcArea(feature.geom, ic);
     832                                if (ie == 0) feature.geom.area = Math.abs(area) * 3444 * 3444;
     833                                if (((ie == 0) && (area < 0.0)) || ((ie > 0) && (area >= 0.0))) {
     834                                        ArrayList<Prim> tmp = new ArrayList<Prim>();
     835                                        for (int i = 0; i < feature.geom.comps.get(ic).size; i++) {
     836                                                Prim p = feature.geom.elems.remove(ie);
     837                                                p.forward = !p.forward;
     838                                                tmp.add(0, p);
     839                                        }
     840                                        feature.geom.elems.addAll(ie, tmp);
     841                                }
     842                                ie += feature.geom.comps.get(ic).size;
     843                                ic++;
     844                        }
    832845                }
    833846                feature.geom.length = calcLength(feature.geom);
    834                 feature.geom.centre = findCentroid(feature);
     847                feature.geom.centre = calcCentroid(feature);
    835848                return true;
    836849        }
     
    951964        }
    952965       
    953         double signedArea(Geom geom) {
     966        double calcArea(Geom geom, int comp) {
    954967                Snode node;
    955968                double lat, lon, llon, llat;
     
    957970                double sigma = 0;
    958971                GeomIterator git = new GeomIterator(geom);
    959                 if (git.hasComp()) {
    960                         git.nextComp();
    961                         while (git.hasEdge()) {
    962                                 git.nextEdge();
    963                                 while (git.hasNode()) {
    964                                         node = git.next();
    965                                         if (node == null) continue;
    966                                         llon = lon;
    967                                         llat = lat;
    968                                         lat = node.lat;
    969                                         lon = node.lon;
    970                                         sigma += (lon * Math.sin(llat)) - (llon * Math.sin(lat));
    971                                 }
     972                for (int i = 0; i <= comp; i++) {
     973                        if (git.hasComp()) {
     974                                git.nextComp();
     975                                while (git.hasEdge()) {
     976                                        git.nextEdge();
     977                                        while (git.hasNode()) {
     978                                                node = git.next();
     979                                                if (node == null)
     980                                                        continue;
     981                                                llon = lon;
     982                                                llat = lat;
     983                                                lat = node.lat;
     984                                                lon = node.lon;
     985                                                sigma += (lon * Math.sin(llat)) - (llon * Math.sin(lat));
     986                                        }
     987                                }
     988                                if (i != comp)
     989                                        sigma = lat = lon = llon = llat = 0;
    972990                        }
    973991                }
     
    975993        }
    976994
    977         public boolean handOfArea(Geom geom) {
    978                 return (signedArea(geom) < 0);
    979         }
    980 
    981         public double calcArea(Geom geom) {
    982                 return Math.abs(signedArea(geom)) * 3444 * 3444;
    983         }
    984 
    985         public double calcLength(Geom geom) {
     995        double calcLength(Geom geom) {
    986996                Snode node;
    987997                double lat, lon, llon, llat;
     
    10131023        }
    10141024
    1015         public Snode findCentroid(Feature feature) {
     1025        Snode calcCentroid(Feature feature) {
    10161026                double lat, lon, slat, slon, llat, llon;
    10171027                llat = llon = lat = lon = slat = slon = 0;
Note: See TracChangeset for help on using the changeset viewer.