forked from geodmms/xdgnjobs

Dennis Kao
2013-06-05 fc9880cd77a09dcfdea2791dee418f54f5721cf3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
package com.ximple.io.dgn7;
 
import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.GeometryFactory;
import com.vividsolutions.jts.geom.LineString;
import com.vividsolutions.jts.geom.LinearRing;
 
import java.util.Arrays;
import java.util.LinkedList;
 
public class ElementFactory {
    static final int DEFAULT_ELMHEAD_LENGTH = 28;
    static final int DEFAULT_DISPHEAD_LENGTH = 8;
    static final int MINIMAL_ELEMLENGTH = 18 * 2;
 
    static final int MAXINUM_LINESTRING_PTLEN = 100;
 
    private static ElementFactory elementFactory = new ElementFactory();
    private static GeometryFactory factory = new GeometryFactory();
 
    public static Element createLineString(LineString linestring) {
        Coordinate[] pts = linestring.getCoordinates();
        LineStringElement element = elementFactory.createLineStringElement(pts);
        element.setRange(linestring.getEnvelopeInternal());
        return element;
    }
 
    public static Element createShape(LinearRing ring) {
        Coordinate[] pts = ring.getCoordinates();
        int elmsize = MINIMAL_ELEMLENGTH + 2 + pts.length * 8;
        ShapeElement element = new ShapeElement(new byte[elmsize]);
        for (int i = 0; i < pts.length; i++) {
            element.setX(i, pts[i].x);
            element.setY(i, pts[i].y);
        }
        element.setVerticeSize(pts.length);
        element.setType(ElementType.SHAPE.id);
        element.setFollowLength((short) ((elmsize / 2) - 2));
        element.setRange(ring.getEnvelopeInternal());
        element.setLevelIndex(0);
        element.setColorIndex(0);
        element.setWeight(0);
        element.setLineStyle(0);
        return element;
    }
 
    private LineStringElement createLineStringElement(Coordinate[] pts) {
        int elmsize = MINIMAL_ELEMLENGTH + 2 + pts.length * 8;
        LineStringElement element = new LineStringElement(new byte[elmsize]);
        for (int i = 0; i < pts.length; i++) {
            element.setX(i, pts[i].x);
            element.setY(i, pts[i].y);
        }
        element.setVerticeSize(pts.length);
        element.setType(ElementType.LINESTRING.id);
        element.setFollowLength((short) ((elmsize / 2) - 2));
        element.setLevelIndex(0);
        element.setColorIndex(0);
        element.setWeight(0);
        element.setLineStyle(0);
        return element;
    }
 
    private ShapeElement createShapeElement(Coordinate[] pts) {
        int elmsize = MINIMAL_ELEMLENGTH + 2 + pts.length * 8;
        ShapeElement element = new ShapeElement(new byte[elmsize]);
        for (int i = 0; i < pts.length; i++) {
            element.setX(i, pts[i].x);
            element.setY(i, pts[i].y);
        }
        element.setVerticeSize(pts.length);
        element.setType(ElementType.SHAPE.id);
        element.setFollowLength((short) ((elmsize / 2) - 2));
        element.setLevelIndex(0);
        element.setColorIndex(0);
        element.setWeight(0);
        element.setLineStyle(0);
        return element;
    }
 
    public static Element createComplexChain(LineString linestring) {
        LinkedList<LineStringElement> elms = new LinkedList<LineStringElement>();
        Coordinate[] allpts = linestring.getCoordinates();
        int segsize = allpts.length / MAXINUM_LINESTRING_PTLEN;
        int currentpos = 0;
        int totalLength = 0;
        for (int seg = 0; seg < segsize; seg++) {
            Coordinate[] pts = Arrays.copyOfRange(allpts,
                    currentpos, currentpos + MAXINUM_LINESTRING_PTLEN + 1, Coordinate[].class);
            LineStringElement element = elementFactory.createLineStringElement(pts);
            currentpos += MAXINUM_LINESTRING_PTLEN;
            element.setRange(element.toGeometry(factory).getEnvelopeInternal());
            element.setComponentElement(true);
            element.setLevelIndex(0);
            totalLength += element.raw.length;
            elms.add(element);
        }
        int remain = allpts.length % MAXINUM_LINESTRING_PTLEN;
        Coordinate[] pts = Arrays.copyOfRange(allpts,
                currentpos, currentpos + remain, Coordinate[].class);
        LineStringElement element = elementFactory.createLineStringElement(pts);
        element.setRange(element.toGeometry(factory).getEnvelopeInternal());
        element.setComponentElement(true);
        element.setLevelIndex(0);
        elms.add(element);
        totalLength += element.raw.length;
 
        ComplexChainElement result = new ComplexChainElement(new byte[MINIMAL_ELEMLENGTH + 12]);
        result.addAll(elms);
        result.setRange(linestring.getEnvelopeInternal());
        result.setType(ElementType.COMPLEXCHAIN.id);
        result.setFollowLength((short) (((MINIMAL_ELEMLENGTH + 12) / 2) - 2));
        result.setNumOfElement((short) elms.size());
        totalLength += result.raw.length;
        totalLength -= 19;
        result.setTotalLength((short) totalLength);
        result.setLevelIndex(0);
        result.setColorIndex(0);
        result.setWeight(0);
        result.setLineStyle(0);
 
        return result;
    }
}