forked from geodmms/xdgnjobs

?? ?
2009-05-04 8062b71a50590bff18ace076f1fc6e4bb34b26c3
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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
package com.ximple.io.dgn7;
 
//~--- non-JDK imports --------------------------------------------------------
 
import org.apache.log4j.Logger;
 
import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.geom.GeometryFactory;
 
import com.ximple.util.DgnUtility;
 
/**
 * LineStringElement
 *
 * @author Ulysses
 * @version 0.1
 * @since 2006/5/18 下午 02:48:58
 */
public class LineStringElement extends Element implements GeometryConverter {
    private static final Logger logger = Logger.getLogger(LineStringElement.class);
 
    public LineStringElement(byte[] raw) {
        super(raw);
    }
 
    public Coordinate getCentroid(double dTolerance) {
        return null;
    }
 
    public Coordinate getEndPoint() {
        return new Coordinate(getX(getVerticeSize() - 1), getY(getVerticeSize() - 1));
    }
 
    public Coordinate getNormal() {
        return null;
    }
 
    public Coordinate getOrigin() {
        return null;
    }
 
    public Coordinate getStartPoint() {
        return new Coordinate(getX(0), getY(0));
    }
 
    public Coordinate getVertex(int index) {
        return (index == 0)
            ? getStartPoint()
            : getEndPoint();
    }
 
    public int getVerticeSize() {
        return raw[18] & 0x0000ffff;
    }
 
    public double getLength() {
        double result = 0.0;
        Coordinate[] vset = getVertices();
 
        for (int i = 1; i < getVerticeSize(); i++) {
            Coordinate p1 = vset[i - 1];
            Coordinate p2 = vset[i];
 
            result += DgnUtility.getLength(p1.x, p1.y, p2.x, p2.y);
        }
 
        return result;
    }
 
    public Coordinate pointAtDistance(double dDistance, double dTolerance) {
        return null;
    }
 
    public Coordinate[] getVertices() {
        Coordinate[] result = new Coordinate[getVerticeSize()];
 
        for (int i = 0; i < getVerticeSize(); i++) {
            result[i] = new Coordinate(getX(i), getY(i));
        }
 
        return result;
    }
 
    public Geometry toGeometry(GeometryFactory factory) {
        return factory.createLineString(getVertices());
    }
 
    protected double getX(int index) {
        if ((index < 0) || (index > getVerticeSize())) {
            return -1;
        }
 
        int x = ((raw[19 + (4 * index)] << 16) & 0xffff0000);
 
        x += (raw[20 + (4 * index)] & 0x0000ffff);
 
        return DgnUtility.converUnitToCoord(x);
    }
 
    protected void setX(int index, double dx) {
        int newVal = DgnUtility.converCoordToUnit(dx);
 
        raw[19 + (4 * index)] = (short) (newVal >> 16 & 0x0000ffff);
        raw[20 + (4 * index)] = (short) (newVal & 0x0000ffff);
    }
 
    protected double getY(int index) {
        if ((index < 0) || (index > getVerticeSize())) {
            return -1;
        }
 
        int y = ((raw[21 + (4 * index)] << 16) & 0xffff0000);
        y = y + (raw[22 + (4 * index)] & 0x0000ffff);
 
        return DgnUtility.converUnitToCoord(y);
    }
 
    protected void setY(int index, double dy) {
        int newVal = DgnUtility.converCoordToUnit(dy);
 
        raw[21 + (4 * index)] = (short) ((newVal >> 16) & 0x0000ffff);
        raw[22 + (4 * index)] = (short) (newVal & 0x0000ffff);
    }
 
    public static class ElementHandler extends Element.ElementHandler {
        private static ElementHandler instance = null;
 
        public ElementHandler() {
            super(ElementType.LINESTRING);
        }
 
        public static IElementHandler getInstance() {
            if (instance == null) {
                instance = new ElementHandler();
            }
 
            return instance;
        }
 
        protected Element createElement(byte[] raw) {
            return new LineStringElement(raw);
        }
    }
}