Changeset 30280 in osm for applications/editors/josm/plugins/smed2
- Timestamp:
- 2014-02-14T19:49:05+01:00 (11 years ago)
- Location:
- applications/editors/josm/plugins/smed2/src/s57
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
applications/editors/josm/plugins/smed2/src/s57/S57dat.java
r30269 r30280 173 173 174 174 public static boolean more() { 175 return ( (offset < maxoff) && (buffer[offset] != 0x1e));175 return (offset < maxoff); 176 176 } 177 177 -
applications/editors/josm/plugins/smed2/src/s57/S57map.java
r30269 r30280 224 224 public FtrTab index; 225 225 226 public long ref; 226 227 private Feature feature; 227 228 private Edge edge; 228 private long ref;229 229 230 230 public S57map() { … … 307 307 308 308 public void endFile() { 309 sortGeom(); 309 for (long id : index.keySet()) { 310 Feature feature = index.get(id); 311 if ((feature.geom.prim == Pflag.LINE) || (feature.geom.prim == Pflag.AREA)) { 312 feature.geom.outers = 1; 313 feature.geom.inners = 0; 314 feature.geom.refs = new ArrayList<Comp>(); 315 Comp comp = new Comp(ref++, 0); 316 feature.geom.refs.add(comp); 317 ListIterator<S57map.Prim> ite = feature.geom.elems.listIterator(); 318 while (ite.hasNext()) { 319 Prim prim = ite.next(); 320 if (prim.outer) { 321 comp.size++; 322 323 } 324 } 325 } 326 } 310 327 for (long id : index.keySet()) { 311 328 Feature feature = index.get(id); … … 495 512 // Utility methods 496 513 497 public void sortGeom() {498 for (long id : index.keySet()) {499 feature = index.get(id);500 Geom sort = new Geom(feature.geom.prim);501 long first = 0;502 long last = 0;503 Comp comp = null;504 boolean next = true;505 if ((feature.geom.prim == Pflag.LINE) || (feature.geom.prim == Pflag.AREA)) {506 int sweep = feature.geom.elems.size();507 while (!feature.geom.elems.isEmpty()) {508 Prim prim = feature.geom.elems.remove(0);509 Edge edge = edges.get(prim.id);510 if (next == true) {511 next = false;512 if (prim.forward) {513 first = edge.first;514 last = edge.last;515 } else {516 first = edge.last;517 last = edge.first;518 }519 sort.elems.add(prim);520 if (prim.outer) {521 sort.outers++;522 } else {523 sort.inners++;524 }525 comp = new Comp(ref++, 1);526 sort.refs.add(comp);527 } else {528 if (prim.forward) {529 if (edge.first == last) {530 sort.elems.add(prim);531 last = edge.last;532 comp.size++;533 } else if (edge.last == first) {534 sort.elems.add(0, prim);535 first = edge.first;536 comp.size++;537 } else {538 feature.geom.elems.add(prim);539 }540 } else {541 if (edge.last == last) {542 sort.elems.add(prim);543 last = edge.first;544 comp.size++;545 } else if (edge.first == first) {546 sort.elems.add(0, prim);547 first = edge.last;548 comp.size++;549 } else {550 feature.geom.elems.add(prim);551 }552 }553 }554 if (--sweep == 0) {555 next = true;556 sweep = feature.geom.elems.size();557 }558 }559 if ((sort.prim == Pflag.LINE) && (sort.outers == 1) && (sort.inners == 0) && (first == last)) {560 sort.prim = Pflag.AREA;561 }562 feature.geom = sort;563 }564 if (feature.geom.prim == Pflag.AREA) {565 ArrayList<Prim> outers = new ArrayList<Prim>();566 ArrayList<Prim> inners = new ArrayList<Prim>();567 for (Prim prim : feature.geom.elems) {568 if (prim.outer) {569 outers.add(prim);570 } else {571 inners.add(prim);572 }573 }574 ArrayList<Prim> sorting = outers;575 ArrayList<Prim> closed = null;576 sort = new Geom(feature.geom.prim);577 sort.outers = feature.geom.outers;578 sort.inners = feature.geom.inners;579 sort.refs = feature.geom.refs;580 next = true;581 while (!sorting.isEmpty()) {582 Prim prim = sorting.remove(0);583 Edge edge = edges.get(prim.id);584 if (next == true) {585 next = false;586 closed = new ArrayList<Prim>();587 closed.add(prim);588 if (prim.forward) {589 first = edge.first;590 last = edge.last;591 } else {592 first = edge.last;593 last = edge.first;594 }595 } else {596 if (prim.forward) {597 if (edge.first == last) {598 last = edge.last;599 closed.add(prim);600 } else {601 sorting.add(0, prim);602 next = true;603 }604 } else {605 if (edge.last == last) {606 last = edge.first;607 closed.add(prim);608 } else {609 sorting.add(0, prim);610 next = true;611 }612 }613 }614 if (first == last) {615 sort.elems.addAll(closed);616 next = true;617 }618 if (sorting.isEmpty() && sorting == outers) {619 sorting = inners;620 next = true;621 }622 }623 feature.geom = sort;624 }625 }626 }627 628 514 public boolean cmpGeoms (Geom g1, Geom g2) { 629 515 return ((g1.prim == g2.prim) && (g1.outers == g2.outers) && (g1.inners == g2.inners) && (g1.elems.size() == g2.elems.size())); … … 684 570 Prim prim; 685 571 EdgeIterator eit; 686 ListIterator<S57map.Prim> it; 687 int cc, ec;572 ListIterator<S57map.Prim> ite; 573 ListIterator<Comp> itc; 688 574 Comp comp; 575 int ec; 689 576 long lastref; 690 577 691 578 public GeomIterator(Geom g) { 692 579 geom = g; 693 eit = null;694 cc = ec = 0;695 comp = null;696 580 lastref = 0; 697 if ((geom.prim != Pflag.NOSP) && (geom.prim != Pflag.POINT)) { 698 it = geom.elems.listIterator(); 699 } else { 700 it = null; 701 } 702 } 703 704 public boolean hasMore() { 705 return (cc < geom.refs.size()); 706 } 707 708 public long getMore() { 709 comp = geom.refs.get(cc++); 710 ec = 0; 581 ite = geom.elems.listIterator(); 582 itc = geom.refs.listIterator(); 583 } 584 585 public boolean hasComp() { 586 return (itc.hasNext()); 587 } 588 589 public long nextComp() { 590 comp = itc.next(); 591 ec = comp.size; 592 lastref = 0; 711 593 return comp.ref; 712 594 } 713 595 714 public boolean hasNext() { 715 if (eit == null) { 716 return (ec < comp.size); 717 } else { 718 return (eit.hasNext()); 719 } 596 public boolean hasEdge() { 597 return (ec > 0) && ite.hasNext(); 598 } 599 600 public long nextEdge() { 601 prim = ite.next(); 602 eit = new EdgeIterator(edges.get(prim.id), prim.forward); 603 ec--; 604 return prim.id; 605 } 606 607 public boolean hasNode() { 608 return (eit.hasNext()); 720 609 } 721 610 722 611 public long nextRef() { 723 if ((eit == null) && (ec < comp.size)) {724 prim = geom.elems.get(ec++);725 eit = new EdgeIterator(edges.get(prim.id), prim.forward);726 }727 612 long ref = eit.nextRef(); 728 613 if (ref == lastref) { … … 730 615 } 731 616 lastref = ref; 732 if (!eit.hasNext()) {733 eit = null;734 }735 617 return ref; 736 618 } … … 747 629 double sigma = 0; 748 630 GeomIterator it = new GeomIterator(geom); 749 it. getMore();750 while (it.hasN ext()) {631 it.nextComp(); 632 while (it.hasNode()) { 751 633 llon = lon; 752 634 llat = lat; … … 773 655 double sigma = 0; 774 656 GeomIterator it = new GeomIterator(geom); 775 it. getMore();776 if (it.hasN ext()) {657 it.nextComp(); 658 if (it.hasNode()) { 777 659 node = it.next(); 778 660 lat = node.lat; 779 661 lon = node.lon; 780 while (it.hasN ext()) {662 while (it.hasNode()) { 781 663 llon = lon; 782 664 llat = lat; … … 800 682 case LINE: 801 683 GeomIterator it = new GeomIterator(feature.geom); 802 it. getMore();803 while (it.hasN ext()) {684 it.nextComp(); 685 while (it.hasNode()) { 804 686 Snode node = it.next(); 805 687 lat = node.lat; … … 817 699 first = true; 818 700 it = new GeomIterator(feature.geom); 819 while (it.hasN ext()) {820 it. getMore();701 while (it.hasNode()) { 702 it.nextComp(); 821 703 Snode node = it.next(); 822 704 lat = node.lat; … … 836 718 case AREA: 837 719 GeomIterator bit = new GeomIterator(feature.geom); 838 bit. getMore();839 while (bit.hasN ext()) {720 bit.nextComp(); 721 while (bit.hasNode()) { 840 722 Snode node = bit.next(); 841 723 lat = node.lat;
Note:
See TracChangeset
for help on using the changeset viewer.