diff --git a/src/GeoView-Examples/GeoViewExamples.class.st b/src/GeoView-Examples/GeoViewExamples.class.st index d6a9284..4eb410b 100644 --- a/src/GeoView-Examples/GeoViewExamples.class.st +++ b/src/GeoView-Examples/GeoViewExamples.class.st @@ -346,19 +346,18 @@ GeoViewExamples class >> exampleGeoSegmentsProjected [ { #category : #'examples - tiles provider' } GeoViewExamples class >> exampleGeoViewWithCartoTilesLayerUsingGoogleHybrid [ "This example show a map layer (assuming an internet connection to default url of google" - + | element layer | element := GeoViewAeElement new. - - element maxScaleInMeters: element maxScaleInMeters * 8. - + + element maxScaleInMeters: element maxScale * 8. + "add carto layer" layer := GeoViewMapTilesLayer newWithGoogle name: 'Tiles Layer'. layer tilesProvider beHybridType. element addLayer: layer. ^ self openViewInWindow: element - ] { #category : #'examples - tiles provider' } @@ -505,29 +504,37 @@ GeoViewExamples class >> exampleGeoViewWithCartoTilesLayerUsingOSMWithSmallTileS { #category : #examples } GeoViewExamples class >> exampleGeoViewWithCartoTilesLayerWithUpdateCenter [ "This example show a map layer with update of map center every seconds (during 30s)" - - | element layer newCenter space circle| + + | element layer newCenter space circle | element := GeoViewUtils createGeoViewForGeoObjects. - - element maxScaleInMeters: element maxScaleInMeters * 8. - element scaleInMeters: 150000. - + + element maxScaleInMeters: element maxScale * 8. + element scale: 150000. + "add carto layer" element addLayerAtFirst: GeoViewMapTilesLayer new. - - circle := GeoCircle new key: 1; radiusInMeters: 2000; fillStyle: (Color red asSmockStrokeStyle); absoluteCoordinates: AbsoluteCoordinates frBrest. + + circle := GeoCircle new + key: 1; + radiusInMeters: 2000; + fillStyle: Color red asSmockStrokeStyle; + absoluteCoordinates: AbsoluteCoordinates frBrest. element addObject: circle. space := self openViewInWindow: element. newCenter := AbsoluteCoordinates frBrest copy. - [ (1 to: 30) do:[:i | 1 seconds wait. - newCenter := AbsoluteCoordinates latitudeInDegrees: (newCenter latitudeInDegrees + 0.05) longitudeInDegrees: (newCenter longitudeInDegrees + 0.05). - element geoCenter: newCenter. - circle absoluteCoordinates:newCenter. - element updateObjects: (OrderedCollection with: circle). - ] - ] forkAt: Processor userBackgroundPriority - + [ + (1 to: 30) do: [ :i | + 1 seconds wait. + newCenter := AbsoluteCoordinates + latitudeInDegrees: + newCenter latitudeInDegrees + 0.05 + longitudeInDegrees: + newCenter longitudeInDegrees + 0.05. + element geoCenter: newCenter. + circle absoluteCoordinates: newCenter. + element updateObjects: (OrderedCollection with: circle) ] ] + forkAt: Processor userBackgroundPriority ] { #category : #'examples - data' } diff --git a/src/GeoView-Molecule/GeoViewManagerImpl.class.st b/src/GeoView-Molecule/GeoViewManagerImpl.class.st index 777e0e7..57b2330 100644 --- a/src/GeoView-Molecule/GeoViewManagerImpl.class.st +++ b/src/GeoView-Molecule/GeoViewManagerImpl.class.st @@ -172,6 +172,12 @@ GeoViewManagerImpl >> getGlobalPointFromLocalPoint: aLocalPoint [ ^ self getView globalPointFromLocalPoint: aLocalPoint ] +{ #category : #'parameters - interactions' } +GeoViewManagerImpl >> getInteractionsStrategy [ + + ^ self getView interactionsStrategy +] + { #category : #'services - layer' } GeoViewManagerImpl >> getLayer: aKey [ @@ -208,6 +214,12 @@ GeoViewManagerImpl >> getObjectIndexAccessor [ ^ self view objectIndexAccessor ] +{ #category : #services } +GeoViewManagerImpl >> getScale [ + + ^ self view scale +] + { #category : #services } GeoViewManagerImpl >> getScaleFactor [ @@ -217,7 +229,11 @@ GeoViewManagerImpl >> getScaleFactor [ { #category : #services } GeoViewManagerImpl >> getScaleInMeters [ - ^ self view scaleInMeters + self + deprecated:'Use generic message' + transformWith: '`@receiver getScaleInMeters' -> '`@receiver getScale'. + + ^ self getScale ] { #category : #'component accessing' } @@ -449,6 +465,12 @@ GeoViewManagerImpl >> setGeoCenter: anAbsoluteCoordinates [ self view geoCenter: anAbsoluteCoordinates ] +{ #category : #'parameters - interactions' } +GeoViewManagerImpl >> setInteractionsStrategy: aStrategy [ + + self getView setInteractionsStrategy: aStrategy +] + { #category : #'services - map projection' } GeoViewManagerImpl >> setMapProjection: aMapProjection [ @@ -461,6 +483,12 @@ GeoViewManagerImpl >> setObjectIndexAccessor: aSymbol [ self getView objectIndexAccessor: aSymbol ] +{ #category : #services } +GeoViewManagerImpl >> setScale: aNumber [ + + self view scale: aNumber +] + { #category : #services } GeoViewManagerImpl >> setScaleFactor: aNumber [ @@ -470,7 +498,11 @@ GeoViewManagerImpl >> setScaleFactor: aNumber [ { #category : #services } GeoViewManagerImpl >> setScaleInMeters: aNumber [ - self view scaleInMeters: aNumber + self + deprecated:'Use generic message' + transformWith: '`@receiver setScaleInMeters: `@aNumber' -> '`@receiver setScale: `@aNumber'. + + self setScale: aNumber ] { #category : #'parameters - selection manager' } diff --git a/src/GeoView-Molecule/GeoViewManagerParameters.trait.st b/src/GeoView-Molecule/GeoViewManagerParameters.trait.st index 0148902..fbeccc6 100644 --- a/src/GeoView-Molecule/GeoViewManagerParameters.trait.st +++ b/src/GeoView-Molecule/GeoViewManagerParameters.trait.st @@ -12,6 +12,10 @@ Trait { GeoViewManagerParameters >> getDisplayToGraphicProjection [ ] +{ #category : #'parameters - interactions' } +GeoViewManagerParameters >> getInteractionsStrategy [ +] + { #category : #'parameters - objects' } GeoViewManagerParameters >> getObjectIndexAccessor [ ] @@ -24,6 +28,10 @@ GeoViewManagerParameters >> getViewInfos [ GeoViewManagerParameters >> setDisplayToGraphicProjection: aGeoView2DProjection [ ] +{ #category : #'parameters - interactions' } +GeoViewManagerParameters >> setInteractionsStrategy: aStrategy [ +] + { #category : #'parameters - objects' } GeoViewManagerParameters >> setObjectIndexAccessor: aSymbol [ ] diff --git a/src/GeoView-Molecule/GeoViewManagerServices.trait.st b/src/GeoView-Molecule/GeoViewManagerServices.trait.st index cdcfed3..a1b2b57 100644 --- a/src/GeoView-Molecule/GeoViewManagerServices.trait.st +++ b/src/GeoView-Molecule/GeoViewManagerServices.trait.st @@ -65,11 +65,11 @@ GeoViewManagerServices >> getMapProjection [ ] { #category : #services } -GeoViewManagerServices >> getScaleFactor [ +GeoViewManagerServices >> getScale [ ] { #category : #services } -GeoViewManagerServices >> getScaleInMeters [ +GeoViewManagerServices >> getScaleFactor [ ] { #category : #services } @@ -105,9 +105,9 @@ GeoViewManagerServices >> setMapProjection: aMapProjection [ ] { #category : #services } -GeoViewManagerServices >> setScaleFactor: aNumber [ +GeoViewManagerServices >> setScale: aNumber [ ] { #category : #services } -GeoViewManagerServices >> setScaleInMeters: aNumber [ +GeoViewManagerServices >> setScaleFactor: aNumber [ ] diff --git a/src/GeoView-Tests/AbstractGeoViewGraphicModelLayerTest.class.st b/src/GeoView-Tests/AbstractGeoViewGraphicModelLayerTest.class.st index 4ba146d..09cd20a 100644 --- a/src/GeoView-Tests/AbstractGeoViewGraphicModelLayerTest.class.st +++ b/src/GeoView-Tests/AbstractGeoViewGraphicModelLayerTest.class.st @@ -12,6 +12,7 @@ Class { { #category : #running } AbstractGeoViewGraphicModelLayerTest >> setUp [ + super setUp. layer := AbstractGeoViewGraphicModelLayer new @@ -144,6 +145,7 @@ AbstractGeoViewGraphicModelLayerTest >> testNeedToSortDatas [ AbstractGeoViewGraphicModelLayerTest >> testReachMaximumDisplayedObjects [ | objects | + layer graphicProjection: (GeoView2DProjection new resolution: (10 asPoint)). layer maximumDisplayedObjects: 50. objects := (1 to: 100) collect:[ :e | SmockDCircle new key: e; radius: 10; coordinates: 0@0; fillColor: Color red ]. diff --git a/src/GeoView-Tests/GeoView2DProjectionTest.class.st b/src/GeoView-Tests/GeoView2DProjectionTest.class.st index eec7a24..30baa53 100644 --- a/src/GeoView-Tests/GeoView2DProjectionTest.class.st +++ b/src/GeoView-Tests/GeoView2DProjectionTest.class.st @@ -18,17 +18,6 @@ GeoView2DProjectionTest >> setUp [ projection := GeoView2DProjection new ] -{ #category : #tests } -GeoView2DProjectionTest >> testAltitudeInMeters [ - - self assert: projection altitudeInMeters equals: (projection defaultAltitudeInMeters). - - projection altitudeInMeters: 1. - self assert: projection altitudeInMeters equals: 1. - - -] - { #category : #tests } GeoView2DProjectionTest >> testBoundsInPixels [ @@ -53,10 +42,10 @@ GeoView2DProjectionTest >> testExtentInPixels [ { #category : #tests } GeoView2DProjectionTest >> testMetersByPixel [ - self assert: projection metersByPixel equals: 0@0. + self assert: projection metersByPixel equals: 0. - projection metersByPixel: 1 asPoint. - self assert: projection metersByPixel equals: 1 asPoint. + projection resolution: 1 asPoint. + self assert: projection metersByPixel equals: 1. ] @@ -71,3 +60,42 @@ GeoView2DProjectionTest >> testOffsetInPixels [ ] + +{ #category : #tests } +GeoView2DProjectionTest >> testScale [ + + self assert: projection scale isNil. + + projection scale: 1. + self assert: projection scale equals: 1. + + +] + +{ #category : #tests } +GeoView2DProjectionTest >> testUpdateResolution [ + + "not supported values" + projection updateResolution: nil. + self assert: projection resolution equals: 0 asPoint. + + projection updateResolution: 1. + self assert: projection resolution equals: 0 asPoint. + + projection updateResolution: 100@100. + self assert: projection resolution equals: 0 asPoint. + + "setup a scale to update" + projection scale: 1000000. + + "not supported values" + projection updateResolution: nil. + self assert: projection resolution equals: 0 asPoint. + + projection updateResolution: 1. + self assert: projection resolution equals: 0 asPoint. + + "supported values" + projection updateResolution: 100@100. + self assert: projection resolution equals: (1/20000 asPoint). +] diff --git a/src/GeoView-Tests/GeoViewAbstractElementTest.class.st b/src/GeoView-Tests/GeoViewAbstractElementTest.class.st index 6ed08b8..0aa3cf2 100644 --- a/src/GeoView-Tests/GeoViewAbstractElementTest.class.st +++ b/src/GeoView-Tests/GeoViewAbstractElementTest.class.st @@ -204,12 +204,47 @@ GeoViewAbstractElementTest >> testInteractionsStrategy [ self assert: geoView interactionsStrategy class equals: GeoViewInteractionsStrategy ] +{ #category : #tests } +GeoViewAbstractElementTest >> testMaxScale [ + + self assert: geoView maxScale equals: 100000000. + + geoView maxScale: 10000000. + self assert: geoView maxScale equals: 10000000. +] + +{ #category : #tests } +GeoViewAbstractElementTest >> testMinScale [ + + self assert: geoView minScale equals: 100. + + geoView minScale: 500. + self assert: geoView minScale equals: 500. +] + { #category : #tests } GeoViewAbstractElementTest >> testNewInteractionsStrategy [ self assert: geoView newInteractionsStrategy class equals: GeoViewInteractionsStrategy. ] +{ #category : #tests } +GeoViewAbstractElementTest >> testNormalizeScale [ + + "Min" + self assert: (geoView normalizeScale: geoView minScale) equals: (geoView minScale). + self assert: (geoView normalizeScale: 100) equals: 100. + self assert: (geoView normalizeScale: 1) equals: 100. + + "Max" + self assert: (geoView normalizeScale: geoView maxScale) equals: (geoView maxScale). + self assert: (geoView normalizeScale: 100000000) equals: 100000000. + self assert: (geoView normalizeScale: 1000000000) equals: 100000000. + + "Middle" + self assert: (geoView normalizeScale: 10000) equals: 10000. +] + { #category : #tests } GeoViewAbstractElementTest >> testObjectIndexAccessor [ @@ -316,6 +351,38 @@ GeoViewAbstractElementTest >> testRemoveLayer [ self assert: (geoView getLayer: #test) isNil ] +{ #category : #tests } +GeoViewAbstractElementTest >> testScale [ + + self assert: geoView scale equals: geoView defaultScale. + + geoView scale: 100000. + self assert: geoView scale equals: 100000 +] + +{ #category : #tests } +GeoViewAbstractElementTest >> testScaleDown [ + + geoView scaleDown. + self assert: geoView scale equals: (geoView defaultScale * geoView scaleFactor). +] + +{ #category : #tests } +GeoViewAbstractElementTest >> testScaleFactor [ + + self assert: geoView scaleFactor equals: 1.5. + + geoView scaleFactor: 2. + self assert: geoView scaleFactor equals: 2 +] + +{ #category : #tests } +GeoViewAbstractElementTest >> testScaleUp [ + + geoView scaleUp. + self assert: geoView scale equals: (geoView defaultScale / geoView scaleFactor). +] + { #category : #tests } GeoViewAbstractElementTest >> testSetInteractionsStrategy [ diff --git a/src/GeoView-Tests/GeoViewAeElementTest.class.st b/src/GeoView-Tests/GeoViewAeElementTest.class.st index 500cb2f..3fc4240 100644 --- a/src/GeoView-Tests/GeoViewAeElementTest.class.st +++ b/src/GeoView-Tests/GeoViewAeElementTest.class.st @@ -171,7 +171,7 @@ GeoViewAeElementTest >> testCreateAndRemoveObjectOnHiddenLayer [ ] delay: 5 milliSeconds) start; yourself. "waiting here to simulate user interaction a lot of time" - 4 seconds wait. + 2 seconds wait. "stop tasks" updateTask kill. @@ -183,8 +183,8 @@ GeoViewAeElementTest >> testCreateAndRemoveObjectOnHiddenLayer [ uiTask stop. "waiting for last pulses" - 0.5 seconds wait. spacePulseTask stop. + 1 seconds wait. "test to compare list model and graphic model" self assert: (layer displayModel getDatas size) equals: 0. @@ -228,8 +228,8 @@ GeoViewAeElementTest >> testCreateUpdateRemoveObjects [ uiTask stop. "waiting for last pulses" - 0.5 seconds wait. spacePulseTask stop. + 1 seconds wait. "test to compare list model and graphic model" self assert: (layer displayModel getDatas size) equals: (list size). diff --git a/src/GeoView-Tests/GeoViewProjectionChangesTest.class.st b/src/GeoView-Tests/GeoViewProjectionChangesTest.class.st index da2d2ac..c6d5b9e 100644 --- a/src/GeoView-Tests/GeoViewProjectionChangesTest.class.st +++ b/src/GeoView-Tests/GeoViewProjectionChangesTest.class.st @@ -15,6 +15,5 @@ GeoViewProjectionChangesTest >> testInitialize [ self deny: changes isCenterChanged. self deny: changes isExtentChanged. self deny: changes isMapProjectionChange. - self deny: changes isResolutionChanged. self deny: changes isScaleChanged. ] diff --git a/src/GeoView/GeoView2DProjection.class.st b/src/GeoView/GeoView2DProjection.class.st index 1dce0ee..5259c94 100644 --- a/src/GeoView/GeoView2DProjection.class.st +++ b/src/GeoView/GeoView2DProjection.class.st @@ -9,9 +9,10 @@ Class { #classTraits : 'TGeoViewGraphicProjection classTrait', #instVars : [ 'cartesianCenter', - 'altitudeInMeters', 'metersByPixel', - 'offsetInPixels' + 'offsetInPixels', + 'scale', + 'resolution' ], #category : #'GeoView-Core' } @@ -19,14 +20,15 @@ Class { { #category : #accessing } GeoView2DProjection >> altitudeInMeters [ - ^ altitudeInMeters ifNil: [ - altitudeInMeters := self defaultAltitudeInMeters ] + self deprecated:'use scale'. + ^ self scale ] { #category : #accessing } GeoView2DProjection >> altitudeInMeters: aNumber [ - altitudeInMeters := aNumber + self deprecated:'use scale:'. + self scale: aNumber ] { #category : #accessing } @@ -48,10 +50,15 @@ GeoView2DProjection >> cartesianCenter: aCartesianCoordinates [ cartesianCenter := aCartesianCoordinates ] -{ #category : #initialization } -GeoView2DProjection >> defaultAltitudeInMeters [ +{ #category : #private } +GeoView2DProjection >> computeResolution: aNumber [ - ^ 1.4816e7 + | viewHeight mapHeight | + viewHeight := aNumber. + mapHeight := 2 * self scale. + mapHeight = 0 ifTrue: [ mapHeight := 1 ]. + + ^ (viewHeight / mapHeight) asPoint ] { #category : #accessing } @@ -60,17 +67,6 @@ GeoView2DProjection >> extentInPixels [ ^ self offsetInPixels * 2 ] -{ #category : #accessing } -GeoView2DProjection >> haveResolution: aViewSize [ - - | viewHeight mapHeight | - viewHeight := aViewSize y. - mapHeight := 2 * self altitudeInMeters. - mapHeight = 0 ifTrue:[ mapHeight := 1 ]. - - ^ self metersByPixel = (viewHeight / mapHeight) -] - { #category : #accessing } GeoView2DProjection >> key [ @@ -79,20 +75,15 @@ GeoView2DProjection >> key [ { #category : #accessing } GeoView2DProjection >> metersByPixel [ + "By default return x value of the resolution" - ^ metersByPixel ifNil: [ metersByPixel := 0 @ 0 ] -] - -{ #category : #accessing } -GeoView2DProjection >> metersByPixel: aNumber [ - - metersByPixel := aNumber + ^ self resolution x ] { #category : #accessing } GeoView2DProjection >> offsetInPixels [ - ^ offsetInPixels ifNil: [ offsetInPixels := 0 @ 0 ] + ^ offsetInPixels ifNil: [ offsetInPixels := 0 asPoint ] ] { #category : #accessing } @@ -111,7 +102,7 @@ GeoView2DProjection >> projCartToPixel: aCartesianCoordinates [ point := aCartesianCoordinates asPoint. geoCenter := self cartesianCenter asPoint. pixel := ((point x @ point y negated) - (geoCenter x @ geoCenter y negated)) - * self metersByPixel + * self resolution + self offsetInPixels. ^ pixel ] @@ -119,7 +110,7 @@ GeoView2DProjection >> projCartToPixel: aCartesianCoordinates [ { #category : #projection } GeoView2DProjection >> projPixelToCart: aPoint [ - | xCartesian yCartesian xOffset yOffset scale | + | xCartesian yCartesian xOffset yOffset resX resY | "Calculate the X offset from the center of the view" xOffset := aPoint x - self offsetInPixels x. @@ -127,27 +118,48 @@ GeoView2DProjection >> projPixelToCart: aPoint [ "Calculate the Y offset from the center of the view, reversing the Y direction" yOffset := self offsetInPixels y - aPoint y. - "Calculate the Cartesian coordinates based on the center of the view and the scale" - scale := self metersByPixel. - scale = 0 ifTrue:[ - xCartesian := xOffset + self cartesianCenter xInMeters. - yCartesian := yOffset + self cartesianCenter yInMeters. - ] ifFalse:[ - xCartesian := (xOffset / scale) + self cartesianCenter xInMeters. - yCartesian := (yOffset / scale) + self cartesianCenter yInMeters. - ]. + "Calculate the Cartesian coordinates based on the center of the view and the resolution" + resX := (self resolution x = 0 ifTrue:[ 1 ] ifFalse:[ self resolution x ]). + resY := (self resolution y = 0 ifTrue:[ 1 ] ifFalse:[ self resolution y ]). + + xCartesian := (xOffset / (resX)) + self cartesianCenter xInMeters. + yCartesian := (yOffset / (resY)) + self cartesianCenter yInMeters. ^ CartesianCoordinates xInMeters: xCartesian yInMeters: yCartesian ] { #category : #accessing } -GeoView2DProjection >> updateResolution: aPoint [ - | viewHeight mapHeight | - - self assert: [aPoint isNotNil] description: ['[GeoView] 2D projection view size cannot be nil.']. - viewHeight := aPoint y. - mapHeight := 2 * self altitudeInMeters. - mapHeight = 0 ifTrue:[ mapHeight := 1 ]. - - self metersByPixel: viewHeight / mapHeight. +GeoView2DProjection >> resolution [ + + ^ resolution ifNil: [ resolution := 0 asPoint ] +] + +{ #category : #accessing } +GeoView2DProjection >> resolution: aPoint [ + + resolution := aPoint +] + +{ #category : #accessing } +GeoView2DProjection >> scale [ + + ^ scale +] + +{ #category : #accessing } +GeoView2DProjection >> scale: aNumber [ + + scale := aNumber +] + +{ #category : #update } +GeoView2DProjection >> updateResolution: aViewSize [ + + | res | + aViewSize ifNil: [ ^ self ]. + aViewSize isPoint ifFalse:[ ^ self ]. + self scale ifNil:[ ^ self ]. + + res := self computeResolution: aViewSize y. + self resolution: res ] diff --git a/src/GeoView/GeoViewAbstractElement.class.st b/src/GeoView/GeoViewAbstractElement.class.st index 67472d4..a65bf51 100644 --- a/src/GeoView/GeoViewAbstractElement.class.st +++ b/src/GeoView/GeoViewAbstractElement.class.st @@ -7,16 +7,16 @@ Class { #instVars : [ 'geoCenter', 'scaleFactor', - 'maxScaleInMeters', - 'minScaleInMeters', - 'scaleInMeters', 'objectIndexAccessor', 'layers', 'displayToGraphicProjection', 'mapProjection', 'viewInfos', 'interactionsStrategy', - 'displayFilter' + 'displayFilter', + 'scale', + 'maxScale', + 'minScale' ], #category : #'GeoView-Core' } @@ -174,6 +174,13 @@ GeoViewAbstractElement >> createPickingResultAt: aGlobalPoint [ ^ pickingResult ] +{ #category : #'API -- scale and center' } +GeoViewAbstractElement >> defaultScale [ + "Default scale is 1:10 000 000" + + ^ 10000000 +] + { #category : #'API -- filters' } GeoViewAbstractElement >> displayFilter [ @@ -199,8 +206,8 @@ GeoViewAbstractElement >> displayToGraphicProjection: aGeoView2DProjection [ displayToGraphicProjection := aGeoView2DProjection. displayToGraphicProjection ifNil: [ ^ self ]. - - "change projection to layers" + + "inject the projection to all layers" self layers do:[ :l | l graphicProjection: displayToGraphicProjection ]. self updateDisplayToGraphicProjection @@ -213,19 +220,10 @@ GeoViewAbstractElement >> doPicking: aPickingResult [ self getLayers do: [ :l | l isVisible ifTrue: [ l populatePickingResult: aPickingResult ] ] ] -{ #category : #private } -GeoViewAbstractElement >> evaluateScale: aNumberInMeters [ - - aNumberInMeters < self minScaleInMeters ifTrue: [ ^ self minScaleInMeters ]. - aNumberInMeters > self maxScaleInMeters ifTrue: [ ^ self maxScaleInMeters ]. - ^ aNumberInMeters -] - { #category : #'API -- scale and center' } GeoViewAbstractElement >> geoCenter [ - geoCenter ifNil: [ geoCenter := AbsoluteCoordinates zero ]. - ^ geoCenter + ^ geoCenter ifNil: [ geoCenter := AbsoluteCoordinates zero ] ] { #category : #'API -- scale and center' } @@ -297,11 +295,18 @@ GeoViewAbstractElement >> haveObjectIndex: anIndex [ GeoViewAbstractElement >> initialize [ super initialize. - + + "Initialize default projection systems" self mapProjection: GeoViewMercatorProjection new. self displayToGraphicProjection: GeoView2DProjection new. + self scale: self defaultScale. + + "Initialize events handlers" + self initializeEventHandlers. + + "Bloc customization" self background: Color black. - self initializeEventHandlers + ] { #category : #initialization } @@ -407,28 +412,70 @@ GeoViewAbstractElement >> mapProjection: aMapProjection [ self dispatchEvent: geoViewEvent ] +{ #category : #'API -- scale and center' } +GeoViewAbstractElement >> maxScale [ + "Default maximum scale is 1:100 000 000" + + ^ maxScale ifNil: [ maxScale := 100000000 ] +] + +{ #category : #'API -- scale and center' } +GeoViewAbstractElement >> maxScale: aNumber [ + + maxScale := aNumber +] + { #category : #'API -- scale and center' } GeoViewAbstractElement >> maxScaleInMeters [ - ^ maxScaleInMeters ifNil: [ maxScaleInMeters := 1.5171584e7 ] + self + deprecated:'Use generic message' + transformWith: '`@receiver maxScaleInMeters' -> '`@receiver maxScale'. + + ^ self maxScale +] + +{ #category : #'API -- scale and center' } +GeoViewAbstractElement >> maxScaleInMeters: aNumber [ + + self + deprecated:'Use generic message' + transformWith: '`@receiver maxScaleInMeters: `@aNumber' -> '`@receiver maxScale: `@aNumber'. + + self maxScale: aNumber +] + +{ #category : #'API -- scale and center' } +GeoViewAbstractElement >> minScale [ + "Default minimum scale is 1:100" + + ^ minScale ifNil: [ minScale := 100 ] ] { #category : #'API -- scale and center' } -GeoViewAbstractElement >> maxScaleInMeters: anObject [ +GeoViewAbstractElement >> minScale: aNumber [ - maxScaleInMeters := anObject + minScale := aNumber ] { #category : #'API -- scale and center' } GeoViewAbstractElement >> minScaleInMeters [ + + self + deprecated:'Use generic message' + transformWith: '`@receiver minScaleInMeters' -> '`@receiver minScale'. - ^ minScaleInMeters ifNil: [ minScaleInMeters := 1852.0 ] + ^ self minScale ] { #category : #'API -- scale and center' } -GeoViewAbstractElement >> minScaleInMeters: anObject [ +GeoViewAbstractElement >> minScaleInMeters: aNumber [ + + self + deprecated:'Use generic message' + transformWith: '`@receiver minScaleInMeters: `@aNumber' -> '`@receiver minScale: `@aNumber'. - minScaleInMeters := anObject + self minScale: aNumber ] { #category : #'strategy management' } @@ -437,6 +484,14 @@ GeoViewAbstractElement >> newInteractionsStrategy [ ^ GeoViewInteractionsStrategy new ] +{ #category : #private } +GeoViewAbstractElement >> normalizeScale: aNumberInMeters [ + + aNumberInMeters < self minScale ifTrue: [ ^ self minScale ]. + aNumberInMeters > self maxScale ifTrue: [ ^ self maxScale ]. + ^ aNumberInMeters +] + { #category : #'API -- objects management' } GeoViewAbstractElement >> objectIndexAccessor [ @@ -566,16 +621,42 @@ GeoViewAbstractElement >> requestRepaint [ self invalidate ] +{ #category : #'API -- scale and center' } +GeoViewAbstractElement >> scale [ + + ^ scale +] + +{ #category : #'API -- scale and center' } +GeoViewAbstractElement >> scale: aNumber [ + + | newScale geoViewEvent | + newScale := self normalizeScale: aNumber. + + scale = newScale ifTrue:[ ^ self ]. + scale := newScale. + + self updateDisplayToGraphicProjection. + + "Send scale event" + geoViewEvent := GeoViewScaleChangedEvent new. + geoViewEvent scale: self scale. + self dispatchEvent: geoViewEvent. +] + { #category : #'API -- scale and center' } GeoViewAbstractElement >> scaleDown [ - self scaleInMeters: self scaleInMeters * self scaleFactor + self scale: (self scale * self scaleFactor) ] { #category : #'API -- scale and center' } GeoViewAbstractElement >> scaleFactor [ + "The scale factor is the multiplicator / diviser for default zoom up/down" - ^ scaleFactor ifNil: [ scaleFactor := 2 ] + (scaleFactor = 0 or: [ scaleFactor isNil ]) ifTrue: [ + scaleFactor := 1.5 ]. + ^ scaleFactor ] { #category : #'API -- scale and center' } @@ -587,30 +668,27 @@ GeoViewAbstractElement >> scaleFactor: aNumber [ { #category : #'API -- scale and center' } GeoViewAbstractElement >> scaleInMeters [ - ^ scaleInMeters ifNil: [ scaleInMeters := 1.4816e7 ] + self + deprecated:'Use generic message' + transformWith: '`@receiver scaleInMeters' -> '`@receiver scale'. + + ^ self scale ] { #category : #'API -- scale and center' } GeoViewAbstractElement >> scaleInMeters: aNumber [ - | scale geoViewEvent | - scale := self evaluateScale: aNumber. - scaleInMeters := scale. - - self displayToGraphicProjection altitudeInMeters: self scaleInMeters. - self displayToGraphicProjection updateResolution: self extent. - self updateModel: ((GeoViewProjectionChanges new) isScaleChanged: true; isResolutionChanged: true; yourself). - - "Send scale event" - geoViewEvent := GeoViewScaleChangedEvent new. - geoViewEvent scaleInMeters: self scaleInMeters. - self dispatchEvent: geoViewEvent. + self + deprecated:'Use generic message' + transformWith: '`@receiver scaleInMeters: `@aNumber' -> '`@receiver scale: `@aNumber'. + + self scale: aNumber ] { #category : #'API -- scale and center' } GeoViewAbstractElement >> scaleUp [ - self scaleInMeters: self scaleInMeters / self scaleFactor + self scale: (self scale / self scaleFactor) ] { #category : #'API -- selection' } @@ -644,19 +722,29 @@ GeoViewAbstractElement >> unconfigureLayer: aLayer [ { #category : #private } GeoViewAbstractElement >> updateDisplayToGraphicProjection [ - | extent offset | + | extent offset changes | + "cannot update when scale is not defined, initialize it before" + self scale ifNil:[ ^ self ]. extent := self viewInfos extent. + extent = (0@0) ifTrue:[ ^ self ]. offset := extent / 2. - (self displayToGraphicProjection offsetInPixels ~= offset or: [ - (self displayToGraphicProjection haveResolution: extent) not ]) - ifFalse: [ ^ self ]. - - self displayToGraphicProjection offsetInPixels: offset. - self displayToGraphicProjection updateResolution: extent. - self updateModel: (GeoViewProjectionChanges new - isExtentChanged: true; - isResolutionChanged: true) + changes := GeoViewProjectionChanges new. + + self displayToGraphicProjection offsetInPixels ~= offset ifTrue:[ + self displayToGraphicProjection offsetInPixels: offset. + changes isExtentChanged: true. + ]. + + "Check if need to update the scale of the graphic projection when scale are differents" + self scale ~= self displayToGraphicProjection scale ifTrue:[ + self displayToGraphicProjection scale: self scale. + self displayToGraphicProjection updateResolution: extent. + changes isScaleChanged: true. + ]. + + ( changes isExtentChanged or:[ changes isScaleChanged ]) ifFalse:[ ^ self ]. + self updateModel: changes ] { #category : #private } diff --git a/src/GeoView/GeoViewMapTilesLayer.class.st b/src/GeoView/GeoViewMapTilesLayer.class.st index b5f851c..b6ed8a5 100644 --- a/src/GeoView/GeoViewMapTilesLayer.class.st +++ b/src/GeoView/GeoViewMapTilesLayer.class.st @@ -150,7 +150,7 @@ GeoViewMapTilesLayer >> doLoadingTilesThread [ | centerGeoPoint level tilesXY tilesXYBuffer findAtLeastOneTile realLevel| - self previousScale: currentGraphicProjection altitudeInMeters. + self previousScale: currentGraphicProjection scale. self surfaceMap offcenter: self mapOffcenter. self surfaceMap scale: 1@1. diff --git a/src/GeoView/GeoViewProjectionChanges.class.st b/src/GeoView/GeoViewProjectionChanges.class.st index 43fbc81..499ba26 100644 --- a/src/GeoView/GeoViewProjectionChanges.class.st +++ b/src/GeoView/GeoViewProjectionChanges.class.st @@ -57,12 +57,20 @@ GeoViewProjectionChanges >> isProjectionChanges [ { #category : #accessing } GeoViewProjectionChanges >> isResolutionChanged [ + self + deprecated:'This is a scale changed' + transformWith: '`@receiver isResolutionChanged' -> '`@receiver isScaleChanged'. + ^ isResolutionChanged ifNil: [ isResolutionChanged := false ] ] { #category : #accessing } GeoViewProjectionChanges >> isResolutionChanged: anObject [ + self + deprecated:'This is a scale changed' + transformWith: '`@receiver isResolutionChanged: `@anObject' -> '`@receiver isScaleChanged: `@anObject'. + isResolutionChanged := anObject ] diff --git a/src/GeoView/GeoViewScaleChangedEvent.class.st b/src/GeoView/GeoViewScaleChangedEvent.class.st index 0b02d05..0882a64 100644 --- a/src/GeoView/GeoViewScaleChangedEvent.class.st +++ b/src/GeoView/GeoViewScaleChangedEvent.class.st @@ -2,21 +2,41 @@ Class { #name : #GeoViewScaleChangedEvent, #superclass : #GeoViewEvent, #instVars : [ - 'scaleInMeters' + 'scale' ], #category : #'GeoView-Events' } +{ #category : #accessing } +GeoViewScaleChangedEvent >> scale [ + + ^ scale +] + +{ #category : #accessing } +GeoViewScaleChangedEvent >> scale: aNumber [ + + scale := aNumber +] + { #category : #accessing } GeoViewScaleChangedEvent >> scaleInMeters [ - ^ scaleInMeters + self + deprecated:'Use generic message' + transformWith: '`@receiver scaleInMeters' -> '`@receiver scale'. + + ^ self scale ] { #category : #accessing } -GeoViewScaleChangedEvent >> scaleInMeters: anObject [ +GeoViewScaleChangedEvent >> scaleInMeters: aNumber [ + + self + deprecated:'Use generic message' + transformWith: '`@receiver scaleInMeters: `@aNumber' -> '`@receiver scale: `@aNumber'. - scaleInMeters := anObject + self scale: aNumber ] { #category : #sending }