NodedSegmentString.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. import SegmentNodeList from './SegmentNodeList'
  2. import WKTWriter from '../io/WKTWriter'
  3. import CoordinateArraySequence from '../geom/impl/CoordinateArraySequence'
  4. import Coordinate from '../geom/Coordinate'
  5. import Octant from './Octant'
  6. import ArrayList from '../../../../java/util/ArrayList'
  7. import NodableSegmentString from './NodableSegmentString'
  8. export default class NodedSegmentString {
  9. constructor() {
  10. NodedSegmentString.constructor_.apply(this, arguments)
  11. }
  12. static constructor_() {
  13. this._nodeList = new SegmentNodeList(this)
  14. this._pts = null
  15. this._data = null
  16. const pts = arguments[0], data = arguments[1]
  17. this._pts = pts
  18. this._data = data
  19. }
  20. static getNodedSubstrings() {
  21. if (arguments.length === 1) {
  22. const segStrings = arguments[0]
  23. const resultEdgelist = new ArrayList()
  24. NodedSegmentString.getNodedSubstrings(segStrings, resultEdgelist)
  25. return resultEdgelist
  26. } else if (arguments.length === 2) {
  27. const segStrings = arguments[0], resultEdgelist = arguments[1]
  28. for (let i = segStrings.iterator(); i.hasNext(); ) {
  29. const ss = i.next()
  30. ss.getNodeList().addSplitEdges(resultEdgelist)
  31. }
  32. }
  33. }
  34. getCoordinates() {
  35. return this._pts
  36. }
  37. size() {
  38. return this._pts.length
  39. }
  40. getCoordinate(i) {
  41. return this._pts[i]
  42. }
  43. isClosed() {
  44. return this._pts[0].equals(this._pts[this._pts.length - 1])
  45. }
  46. getSegmentOctant(index) {
  47. if (index === this._pts.length - 1) return -1
  48. return this.safeOctant(this.getCoordinate(index), this.getCoordinate(index + 1))
  49. }
  50. setData(data) {
  51. this._data = data
  52. }
  53. safeOctant(p0, p1) {
  54. if (p0.equals2D(p1)) return 0
  55. return Octant.octant(p0, p1)
  56. }
  57. getData() {
  58. return this._data
  59. }
  60. addIntersection() {
  61. if (arguments.length === 2) {
  62. const intPt = arguments[0], segmentIndex = arguments[1]
  63. this.addIntersectionNode(intPt, segmentIndex)
  64. } else if (arguments.length === 4) {
  65. const li = arguments[0], segmentIndex = arguments[1], geomIndex = arguments[2], intIndex = arguments[3]
  66. const intPt = new Coordinate(li.getIntersection(intIndex))
  67. this.addIntersection(intPt, segmentIndex)
  68. }
  69. }
  70. toString() {
  71. return WKTWriter.toLineString(new CoordinateArraySequence(this._pts))
  72. }
  73. getNodeList() {
  74. return this._nodeList
  75. }
  76. addIntersectionNode(intPt, segmentIndex) {
  77. let normalizedSegmentIndex = segmentIndex
  78. const nextSegIndex = normalizedSegmentIndex + 1
  79. if (nextSegIndex < this._pts.length) {
  80. const nextPt = this._pts[nextSegIndex]
  81. if (intPt.equals2D(nextPt))
  82. normalizedSegmentIndex = nextSegIndex
  83. }
  84. const ei = this._nodeList.add(intPt, normalizedSegmentIndex)
  85. return ei
  86. }
  87. addIntersections(li, segmentIndex, geomIndex) {
  88. for (let i = 0; i < li.getIntersectionNum(); i++)
  89. this.addIntersection(li, segmentIndex, geomIndex, i)
  90. }
  91. get interfaces_() {
  92. return [NodableSegmentString]
  93. }
  94. }