GeometryCollection.js 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. import TreeSet from '../../../../java/util/TreeSet'
  2. import Geometry from './Geometry'
  3. import Arrays from '../../../../java/util/Arrays'
  4. import CoordinateFilter from './CoordinateFilter'
  5. import hasInterface from '../../../../hasInterface'
  6. import IllegalArgumentException from '../../../../java/lang/IllegalArgumentException'
  7. import GeometryComponentFilter from './GeometryComponentFilter'
  8. import Dimension from './Dimension'
  9. import ArrayList from '../../../../java/util/ArrayList'
  10. import GeometryFilter from './GeometryFilter'
  11. import CoordinateSequenceFilter from './CoordinateSequenceFilter'
  12. import Envelope from './Envelope'
  13. import Assert from '../util/Assert'
  14. export default class GeometryCollection extends Geometry {
  15. constructor() {
  16. super()
  17. GeometryCollection.constructor_.apply(this, arguments)
  18. }
  19. static constructor_() {
  20. this._geometries = null
  21. if (arguments.length === 0) {} else if (arguments.length === 2) {
  22. let geometries = arguments[0], factory = arguments[1]
  23. Geometry.constructor_.call(this, factory)
  24. if (geometries === null)
  25. geometries = []
  26. if (Geometry.hasNullElements(geometries))
  27. throw new IllegalArgumentException('geometries must not contain null elements')
  28. this._geometries = geometries
  29. }
  30. }
  31. computeEnvelopeInternal() {
  32. const envelope = new Envelope()
  33. for (let i = 0; i < this._geometries.length; i++)
  34. envelope.expandToInclude(this._geometries[i].getEnvelopeInternal())
  35. return envelope
  36. }
  37. getGeometryN(n) {
  38. return this._geometries[n]
  39. }
  40. getCoordinates() {
  41. const coordinates = new Array(this.getNumPoints()).fill(null)
  42. let k = -1
  43. for (let i = 0; i < this._geometries.length; i++) {
  44. const childCoordinates = this._geometries[i].getCoordinates()
  45. for (let j = 0; j < childCoordinates.length; j++) {
  46. k++
  47. coordinates[k] = childCoordinates[j]
  48. }
  49. }
  50. return coordinates
  51. }
  52. getArea() {
  53. let area = 0.0
  54. for (let i = 0; i < this._geometries.length; i++)
  55. area += this._geometries[i].getArea()
  56. return area
  57. }
  58. copyInternal() {
  59. const geometries = new Array(this._geometries.length).fill(null)
  60. for (let i = 0; i < geometries.length; i++)
  61. geometries[i] = this._geometries[i].copy()
  62. return new GeometryCollection(geometries, this._factory)
  63. }
  64. equalsExact() {
  65. if (arguments.length === 2 && (typeof arguments[1] === 'number' && arguments[0] instanceof Geometry)) {
  66. const other = arguments[0], tolerance = arguments[1]
  67. if (!this.isEquivalentClass(other))
  68. return false
  69. const otherCollection = other
  70. if (this._geometries.length !== otherCollection._geometries.length)
  71. return false
  72. for (let i = 0; i < this._geometries.length; i++)
  73. if (!this._geometries[i].equalsExact(otherCollection._geometries[i], tolerance))
  74. return false
  75. return true
  76. } else {
  77. return super.equalsExact.apply(this, arguments)
  78. }
  79. }
  80. normalize() {
  81. for (let i = 0; i < this._geometries.length; i++)
  82. this._geometries[i].normalize()
  83. Arrays.sort(this._geometries)
  84. }
  85. getCoordinate() {
  86. if (this.isEmpty()) return null
  87. return this._geometries[0].getCoordinate()
  88. }
  89. getBoundaryDimension() {
  90. let dimension = Dimension.FALSE
  91. for (let i = 0; i < this._geometries.length; i++)
  92. dimension = Math.max(dimension, this._geometries[i].getBoundaryDimension())
  93. return dimension
  94. }
  95. reverseInternal() {
  96. const numGeometries = this._geometries.length
  97. const reversed = new ArrayList(numGeometries)
  98. for (let i = 0; i < numGeometries; i++)
  99. reversed.add(this._geometries[i].reverse())
  100. return this.getFactory().buildGeometry(reversed)
  101. }
  102. getTypeCode() {
  103. return Geometry.TYPECODE_GEOMETRYCOLLECTION
  104. }
  105. getDimension() {
  106. let dimension = Dimension.FALSE
  107. for (let i = 0; i < this._geometries.length; i++)
  108. dimension = Math.max(dimension, this._geometries[i].getDimension())
  109. return dimension
  110. }
  111. getLength() {
  112. let sum = 0.0
  113. for (let i = 0; i < this._geometries.length; i++)
  114. sum += this._geometries[i].getLength()
  115. return sum
  116. }
  117. getNumPoints() {
  118. let numPoints = 0
  119. for (let i = 0; i < this._geometries.length; i++)
  120. numPoints += this._geometries[i].getNumPoints()
  121. return numPoints
  122. }
  123. getNumGeometries() {
  124. return this._geometries.length
  125. }
  126. compareToSameClass() {
  127. if (arguments.length === 1) {
  128. const o = arguments[0]
  129. const theseElements = new TreeSet(Arrays.asList(this._geometries))
  130. const otherElements = new TreeSet(Arrays.asList(o._geometries))
  131. return this.compare(theseElements, otherElements)
  132. } else if (arguments.length === 2) {
  133. const o = arguments[0], comp = arguments[1]
  134. const gc = o
  135. const n1 = this.getNumGeometries()
  136. const n2 = gc.getNumGeometries()
  137. let i = 0
  138. while (i < n1 && i < n2) {
  139. const thisGeom = this.getGeometryN(i)
  140. const otherGeom = gc.getGeometryN(i)
  141. const holeComp = thisGeom.compareToSameClass(otherGeom, comp)
  142. if (holeComp !== 0) return holeComp
  143. i++
  144. }
  145. if (i < n1) return 1
  146. if (i < n2) return -1
  147. return 0
  148. }
  149. }
  150. apply() {
  151. if (hasInterface(arguments[0], CoordinateFilter)) {
  152. const filter = arguments[0]
  153. for (let i = 0; i < this._geometries.length; i++)
  154. this._geometries[i].apply(filter)
  155. } else if (hasInterface(arguments[0], CoordinateSequenceFilter)) {
  156. const filter = arguments[0]
  157. if (this._geometries.length === 0) return null
  158. for (let i = 0; i < this._geometries.length; i++) {
  159. this._geometries[i].apply(filter)
  160. if (filter.isDone())
  161. break
  162. }
  163. if (filter.isGeometryChanged()) this.geometryChanged()
  164. } else if (hasInterface(arguments[0], GeometryFilter)) {
  165. const filter = arguments[0]
  166. filter.filter(this)
  167. for (let i = 0; i < this._geometries.length; i++)
  168. this._geometries[i].apply(filter)
  169. } else if (hasInterface(arguments[0], GeometryComponentFilter)) {
  170. const filter = arguments[0]
  171. filter.filter(this)
  172. for (let i = 0; i < this._geometries.length; i++)
  173. this._geometries[i].apply(filter)
  174. }
  175. }
  176. getBoundary() {
  177. Geometry.checkNotGeometryCollection(this)
  178. Assert.shouldNeverReachHere()
  179. return null
  180. }
  181. getGeometryType() {
  182. return Geometry.TYPENAME_GEOMETRYCOLLECTION
  183. }
  184. isEmpty() {
  185. for (let i = 0; i < this._geometries.length; i++)
  186. if (!this._geometries[i].isEmpty())
  187. return false
  188. return true
  189. }
  190. }