-
Notifications
You must be signed in to change notification settings - Fork 47
/
MapPolygonProcessor.kt
102 lines (90 loc) · 4.03 KB
/
MapPolygonProcessor.kt
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
package jetbrains.livemap.obj2entity
import jetbrains.datalore.maps.livemap.entities.geometry.Renderers
import jetbrains.datalore.maps.livemap.entities.geometry.WorldGeometryComponent
import jetbrains.gis.geoprotocol.GeometryUtil
import jetbrains.livemap.core.ecs.EcsComponentManager
import jetbrains.livemap.core.rendering.layers.LayerManager
import jetbrains.livemap.entities.Entities
import jetbrains.livemap.entities.geometry.LonLatGeometry
import jetbrains.livemap.entities.geometry.WorldGeometry
import jetbrains.livemap.entities.placement.Components
import jetbrains.livemap.entities.rendering.*
import jetbrains.livemap.entities.scaling.ScaleComponent
import jetbrains.livemap.mapobjects.MapObject
import jetbrains.livemap.mapobjects.MapPolygon
import jetbrains.livemap.projections.MapProjection
import jetbrains.livemap.projections.ProjectionUtil
import jetbrains.livemap.projections.toWorldPoint
internal class MapPolygonProcessor(
componentManager: EcsComponentManager,
layerManager: LayerManager,
private val myMapProjection: MapProjection
) {
private val myFactory: Entities.MapEntityFactory
private val myLayerEntitiesComponent = LayerEntitiesComponent()
private val toMapProjection: (LonLatGeometry) -> WorldGeometry
init {
myFactory = Entities.MapEntityFactory(
componentManager
.createEntity("map_layer_polygon")
.addComponent(layerManager.createRenderLayerComponent("geom_polygon"))
.addComponent(myLayerEntitiesComponent)
)
toMapProjection = { geometry ->
geometry.asMultipolygon()
.run { ProjectionUtil.transformMultipolygon(this, myMapProjection::project) }
.run { WorldGeometry.create(this) }
}
}
fun process(mapObjects: List<MapObject>) {
createEntities(mapObjects)
}
private fun createEntities(mapObjects: List<MapObject>) {
for (`object` in mapObjects) {
val mapPolygon = `object` as MapPolygon
if (mapPolygon.geometry != null) {
createStaticEntity(mapPolygon)
} else if (mapPolygon.regionId != null) {
// createDynamicEntity(mapPolygon)
} else {
// do not create entities for empty geometries
}
}
}
private fun createStaticEntity(mapPolygon: MapPolygon) {
val geometry = toMapProjection(mapPolygon.geometry!!)
val bbox = GeometryUtil.bbox(geometry.asMultipolygon()) ?: error("")
val geometryEntity = myFactory
.createMapEntity(bbox.origin.toWorldPoint(), SIMPLE_RENDERER, "map_ent_spolygon")
.addComponent(WorldGeometryComponent().apply { this.geometry = geometry } )
.addComponent(Components.WorldDimensionComponent(bbox.dimension.toWorldPoint()))
.addComponent(ScaleComponent())
.addComponent(
StyleComponent().apply {
setFillColor(mapPolygon.fillColor)
setStrokeColor(mapPolygon.strokeColor)
setStrokeWidth(mapPolygon.strokeWidth)
}
)
myLayerEntitiesComponent.add(geometryEntity.id)
}
// private fun createDynamicEntity(mapPolygon: MapPolygon) {
// val regionEntity = myFactory
// .createDynamicMapEntity("map_ent_dpolygon_" + mapPolygon.regionId, FRAGMENTS_RENDERER)
// .addComponent(RegionComponent().apply { id = mapPolygon.regionId })
// .addComponent(
// StyleComponent().apply {
// setFillColor(mapPolygon.fillColor)
// setStrokeColor(mapPolygon.strokeColor)
// setStrokeWidth(mapPolygon.strokeWidth)
// }
// )
//
// regionEntity.get<ScreenLoopComponent>().origins = listOf(ZERO_CLIENT_POINT)
// myLayerEntitiesComponent.add(regionEntity.id)
// }
companion object {
private val SIMPLE_RENDERER = Renderers.PolygonRenderer()
// private val FRAGMENTS_RENDERER = RegionRenderer()
}
}