Пример #1
0
    def test_entities_geocode(self):
        try:
            e = cesiumpy.Point(position='Los Angeles')
            exp = """{position : Cesium.Cartesian3.fromDegrees(-118.2436849, 34.0522342, 0.0), point : {pixelSize : 10.0, color : Cesium.Color.WHITE}}"""
            self.assertEqual(e.script, exp)

            e = cesiumpy.Label(position='Los Angeles', text='xxx')
            exp = """{position : Cesium.Cartesian3.fromDegrees(-118.2436849, 34.0522342, 0.0), label : {text : "xxx"}}"""
            self.assertEqual(e.script, exp)

            p = cesiumpy.Pin()
            e = cesiumpy.Billboard(position='Los Angeles', image=p)
            exp = """{position : Cesium.Cartesian3.fromDegrees(-118.2436849, 34.0522342, 0.0), billboard : {image : new Cesium.PinBuilder().fromColor(Cesium.Color.ROYALBLUE, 48.0)}}"""
            self.assertEqual(e.script, exp)

            e = cesiumpy.Box(position='Los Angeles', dimensions=(40e4, 30e4, 50e4))
            exp = """{position : Cesium.Cartesian3.fromDegrees(-118.2436849, 34.0522342, 0.0), box : {dimensions : new Cesium.Cartesian3(400000.0, 300000.0, 500000.0)}}"""
            self.assertEqual(e.script, exp)

            e = cesiumpy.Ellipse(position='Los Angeles', semiMinorAxis=25e4,
                                 semiMajorAxis=40e4)
            exp = """{position : Cesium.Cartesian3.fromDegrees(-118.2436849, 34.0522342, 0.0), ellipse : {semiMinorAxis : 250000.0, semiMajorAxis : 400000.0}}"""
            self.assertEqual(e.script, exp)

            e = cesiumpy.Cylinder(position='Los Angeles', length=100e4,
                                  topRadius=10e4, bottomRadius=10e4)
            exp = """{position : Cesium.Cartesian3.fromDegrees(-118.2436849, 34.0522342, 0.0), cylinder : {length : 1000000.0, topRadius : 100000.0, bottomRadius : 100000.0}}"""
            self.assertEqual(e.script, exp)

            e = cesiumpy.Polygon(hierarchy=['Los Angeles', 'Las Vegas', 'San Francisco'])
            exp = """{polygon : {hierarchy : Cesium.Cartesian3.fromDegreesArray([-118.2436849, 34.0522342, -115.1398296, 36.1699412, -122.4194155, 37.7749295])}}"""
            self.assertEqual(e.script, exp)

            # not supported, Unabel to create rectangle from single geolocation
            e = cesiumpy.Rectangle(coordinates=(-85, 40, -80, 45))

            e = cesiumpy.Ellipsoid(position='Los Angeles', radii=(20e4, 20e4, 30e4))
            exp = """{position : Cesium.Cartesian3.fromDegrees(-118.2436849, 34.0522342, 0.0), ellipsoid : {radii : new Cesium.Cartesian3(200000.0, 200000.0, 300000.0)}}"""
            self.assertEqual(e.script, exp)

            e = cesiumpy.Wall(positions=['Los Angeles', 'Las Vegas', 'San Francisco'],
                              maximumHeights=10e4, minimumHeights=0)
            exp = "{wall : {positions : Cesium.Cartesian3.fromDegreesArray([-118.2436849, 34.0522342, -115.1398296, 36.1699412, -122.4194155, 37.7749295]), maximumHeights : [100000.0, 100000.0, 100000.0], minimumHeights : [0, 0, 0]}}"
            self.assertEqual(e.script, exp)

            e = cesiumpy.Corridor(positions=['Los Angeles', 'Las Vegas', 'San Francisco'], width=2e5)
            exp = """{corridor : {positions : Cesium.Cartesian3.fromDegreesArray([-118.2436849, 34.0522342, -115.1398296, 36.1699412, -122.4194155, 37.7749295]), width : 200000.0}}"""
            self.assertEqual(e.script, exp)

            e = cesiumpy.Polyline(positions=['Los Angeles', 'Las Vegas', 'San Francisco'], width=0.5)
            exp = """{polyline : {positions : Cesium.Cartesian3.fromDegreesArray([-118.2436849, 34.0522342, -115.1398296, 36.1699412, -122.4194155, 37.7749295]), width : 0.5}}"""
            self.assertEqual(e.script, exp)

            e = cesiumpy.PolylineVolume(positions=['Los Angeles', 'Las Vegas', 'San Francisco'],
                                        shape=[-5e4, -5e4, 5e4, -5e4, 5e4, 5e4, -5e4, 5e4])
            exp = """{polylineVolume : {positions : Cesium.Cartesian3.fromDegreesArray([-118.2436849, 34.0522342, -115.1398296, 36.1699412, -122.4194155, 37.7749295]), shape : [new Cesium.Cartesian2(-50000.0, -50000.0), new Cesium.Cartesian2(50000.0, -50000.0), new Cesium.Cartesian2(50000.0, 50000.0), new Cesium.Cartesian2(-50000.0, 50000.0)]}}"""
            self.assertEqual(e.script, exp)
        except geopy.exc.GeocoderQuotaExceeded:
            raise nose.SkipTest("exceeded geocoder quota")
Пример #2
0
    def test_cylinder(self):
        e = cesiumpy.Cylinder(position=(-70, 40, 0),
                              length=10,
                              topRadius=100,
                              bottomRadius=200,
                              material=cesiumpy.color.AQUA)
        exp = "{position : Cesium.Cartesian3.fromDegrees(-70.0, 40.0, 0.0), cylinder : {length : 10.0, topRadius : 100.0, bottomRadius : 200.0, material : Cesium.Color.AQUA}}"
        self.assertEqual(e.script, exp)

        e = e.copy()
        self.assertEqual(e.script, exp)

        e = cesiumpy.Cylinder(position=(-70, 40, 0),
                              length=10,
                              topRadius=100,
                              bottomRadius=200)
        exp = "{position : Cesium.Cartesian3.fromDegrees(-70.0, 40.0, 0.0), cylinder : {length : 10.0, topRadius : 100.0, bottomRadius : 200.0}}"
        self.assertEqual(e.script, exp)

        e = e.copy()
        self.assertEqual(e.script, exp)
Пример #3
0
    def test_viewer(self):
        viewer = cesiumpy.Viewer(divid='viewertest')
        viewer.camera.flyTo((135, 30, 145, 45))
        result = viewer.to_html()

        exp = """<script src="https://cesiumjs.org/Cesium/Build/Cesium/Cesium.js"></script>
<link rel="stylesheet" href="https://cesiumjs.org/Cesium/Build/Cesium/Widgets/widgets.css" type="text/css">
<div id="viewertest" style="width:100%; height:100%;"><div>
<script type="text/javascript">
  var widget = new Cesium.Viewer("viewertest");
  widget.camera.flyTo({destination : Cesium.Rectangle.fromDegrees(135.0, 30.0, 145.0, 45.0)});
</script>"""
        self.assertEqual(result, exp)

        # add entity (doesn't change camera position)
        cyl = cesiumpy.Cylinder(position=(120, 35, 5000),
                                length=10000,
                                topRadius=10000,
                                bottomRadius=20000,
                                material='red')
        viewer.entities.add(cyl)
        result = viewer.to_html()

        exp = """<script src="https://cesiumjs.org/Cesium/Build/Cesium/Cesium.js"></script>
<link rel="stylesheet" href="https://cesiumjs.org/Cesium/Build/Cesium/Widgets/widgets.css" type="text/css">
<div id="viewertest" style="width:100%; height:100%;"><div>
<script type="text/javascript">
  var widget = new Cesium.Viewer("viewertest");
  widget.entities.add({position : Cesium.Cartesian3.fromDegrees(120.0, 35.0, 5000.0), cylinder : {length : 10000.0, topRadius : 10000.0, bottomRadius : 20000.0, material : Cesium.Color.RED}});
  widget.camera.flyTo({destination : Cesium.Rectangle.fromDegrees(135.0, 30.0, 145.0, 45.0)});
</script>"""
        self.assertEqual(result, exp)

        # we can pass entity with position to camera
        viewer.camera.flyTo(cyl)
        result = viewer.to_html()

        exp = """<script src="https://cesiumjs.org/Cesium/Build/Cesium/Cesium.js"></script>
<link rel="stylesheet" href="https://cesiumjs.org/Cesium/Build/Cesium/Widgets/widgets.css" type="text/css">
<div id="viewertest" style="width:100%; height:100%;"><div>
<script type="text/javascript">
  var widget = new Cesium.Viewer("viewertest");
  widget.entities.add({position : Cesium.Cartesian3.fromDegrees(120.0, 35.0, 5000.0), cylinder : {length : 10000.0, topRadius : 10000.0, bottomRadius : 20000.0, material : Cesium.Color.RED}});
  widget.camera.flyTo({destination : Cesium.Cartesian3.fromDegrees(120.0, 35.0, 5000.0)});
</script>"""
        self.assertEqual(result, exp)
Пример #4
0
    def bar(self, x, y, z, size=10e3, color=None, bottom=0.):
        """
        Plot cesiumpy.Cylinder like bar plot

        Parameters
        ----------

        x : list
            List of longitudes
        y : list
            List of latitudes
        z : list
            List of bar heights
        size : list or float, default 10e3
            Radius of cylinder
        color : list or Color
            Cylinder color
        bottom : list or float, default 0
            Bottom heights
        """
        x = com.validate_listlike(x, key='x')

        # for list validation (not allow scalar)
        y = com.validate_listlike(y, key='y')
        # for length validation
        y = self._fill_by(y, len(x), key='y')

        # z must be a list
        z = com.validate_listlike(z, key='z')
        z = self._fill_by(z, len(x), key='y')

        size = self._fill_by(size, len(x), key='size', default=10e3)
        color = self._fill_by(color, len(x), key='color')
        bottom = self._fill_by(bottom, len(x), key='bottom', default=0.)

        it = zip(x, y, z, size, color, bottom)
        for i, (_x, _y, _z, _size, _color, _bottom) in enumerate(it):
            p = cesiumpy.Cylinder(position=(_x, _y, _bottom + _z / 2.),
                                  length=_z,
                                  topRadius=_size,
                                  bottomRadius=_size,
                                  material=_color)
            self.widget.entities.add(p)
        return self.widget
Пример #5
0
    def test_viewer(self):
        try:
            viewer = cesiumpy.Viewer(divid='viewertest')
            cyl = cesiumpy.Cylinder(position='Los Angeles', length=30000, topRadius=10000,
                                    bottomRadius=10000, material='AQUA')
            viewer.entities.add(cyl)
            viewer.camera.flyTo('Los Angeles')
            result = viewer.to_html()

            exp = """<script src="https://cesiumjs.org/Cesium/Build/Cesium/Cesium.js"></script>
<link rel="stylesheet" href="https://cesiumjs.org/Cesium/Build/Cesium/Widgets/widgets.css" type="text/css">
<div id="viewertest" style="width:100%; height:100%;"><div>
<script type="text/javascript">
  var widget = new Cesium.Viewer("viewertest");
  widget.entities.add({position : Cesium.Cartesian3.fromDegrees(-118.2436849, 34.0522342, 0.0), cylinder : {length : 30000.0, topRadius : 10000.0, bottomRadius : 10000.0, material : Cesium.Color.AQUA}});
  widget.camera.flyTo({destination : Cesium.Cartesian3.fromDegrees(-118.2436849, 34.0522342, 100000.0)});
</script>"""
            self.assertEqual(result, exp)
        except geopy.exc.GeocoderQuotaExceeded:
            raise nose.SkipTest("exceeded geocoder quota")
Пример #6
0
    def test_add_cylinder(self):
        viewer = cesiumpy.Viewer(divid='viewertest', **self.options)
        cyl = cesiumpy.Cylinder(position=(-110, 50, 2000000),
                                length=4000000,
                                topRadius=100000,
                                bottomRadius=100000,
                                material=cesiumpy.color.AQUA,
                                name='x')
        viewer.entities.add(cyl)
        result = viewer.to_html()

        # entity name must come first
        exp = """<script src="https://cesiumjs.org/Cesium/Build/Cesium/Cesium.js"></script>
<link rel="stylesheet" href="https://cesiumjs.org/Cesium/Build/Cesium/Widgets/widgets.css" type="text/css">
<div id="viewertest" style="width:100%; height:100%;"><div>
<script type="text/javascript">
  var widget = new Cesium.Viewer("viewertest", {animation : true, baseLayerPicker : false, fullscreenButton : false, geocoder : false, homeButton : false, infoBox : false, sceneModePicker : true, selectionIndicator : false, timeline : false, navigationHelpButton : false, navigationInstructionsInitiallyVisible : false});
  widget.entities.add({name : "x", position : Cesium.Cartesian3.fromDegrees(-110.0, 50.0, 2000000.0), cylinder : {length : 4000000.0, topRadius : 100000.0, bottomRadius : 100000.0, material : Cesium.Color.AQUA}});
  widget.zoomTo(widget.entities);
</script>"""
        self.assertEqual(result, exp)
Пример #7
0
    def test_add_entities(self):
        viewer = cesiumpy.Viewer(divid="viewertest", **self.options)

        box = cesiumpy.Box(dimensions=(40e4, 30e4, 50e4),
                           material=cesiumpy.color.RED,
                           position=[-120, 40, 0])
        viewer.entities.add(box)

        ellipse = cesiumpy.Ellipse(semiMinorAxis=25e4,
                                   semiMajorAxis=40e4,
                                   material=cesiumpy.color.BLUE,
                                   position=[-110, 40, 0])
        viewer.entities.add(ellipse)

        cyl = cesiumpy.Cylinder(position=[-100, 40, 50e4],
                                length=100e4,
                                topRadius=10e4,
                                bottomRadius=10e4,
                                material=cesiumpy.color.AQUA)
        viewer.entities.add(cyl)

        pol = cesiumpy.Polygon([-90, 40, -95, 40, -95, 45, -90, 40],
                               material=cesiumpy.color.ORANGE)
        viewer.entities.add(pol)

        rect = cesiumpy.Rectangle(coordinates=(-85, 40, -80, 45),
                                  material=cesiumpy.color.GREEN)
        viewer.entities.add(rect)

        ellipsoid = cesiumpy.Ellipsoid(position=(-70, 40, 0),
                                       radii=(20e4, 20e4, 30e4),
                                       material=cesiumpy.color.GREEN)
        viewer.entities.add(ellipsoid)

        wall = cesiumpy.Wall(positions=[-60, 40, -65, 40, -65, 45, -60, 45],
                             maximumHeights=[10e4] * 4,
                             minimumHeights=[0] * 4,
                             material=cesiumpy.color.RED)
        viewer.entities.add(wall)

        corridor = cesiumpy.Corridor(positions=[-120, 30, -90, 35, -60, 30],
                                     width=2e5,
                                     material=cesiumpy.color.RED)
        viewer.entities.add(corridor)

        polyline = cesiumpy.Polyline(positions=[-120, 25, -90, 30, -60, 25],
                                     width=0.5,
                                     material=cesiumpy.color.BLUE)
        viewer.entities.add(polyline)
        polylinevolume = cesiumpy.PolylineVolume(
            positions=[-120, 20, -90, 25, -60, 20],
            shape=[
                cesiumpy.Cartesian2(-50000, -50000),
                cesiumpy.Cartesian2(50000, -50000),
                cesiumpy.Cartesian2(50000, 50000),
                cesiumpy.Cartesian2(-50000, 50000)
            ],
            material=cesiumpy.color.GREEN)
        viewer.entities.add(polylinevolume)
        result = viewer.to_html()

        exp = """<script src="https://cesiumjs.org/Cesium/Build/Cesium/Cesium.js"></script>
<link rel="stylesheet" href="https://cesiumjs.org/Cesium/Build/Cesium/Widgets/widgets.css" type="text/css">
<div id="viewertest" style="width:100%; height:100%;"><div>
<script type="text/javascript">
  var widget = new Cesium.Viewer("viewertest", {animation : true, baseLayerPicker : false, fullscreenButton : false, geocoder : false, homeButton : false, infoBox : false, sceneModePicker : true, selectionIndicator : false, timeline : false, navigationHelpButton : false, navigationInstructionsInitiallyVisible : false});
  widget.entities.add({position : Cesium.Cartesian3.fromDegrees(-120.0, 40.0, 0.0), box : {dimensions : new Cesium.Cartesian3(400000.0, 300000.0, 500000.0), material : Cesium.Color.RED}});
  widget.entities.add({position : Cesium.Cartesian3.fromDegrees(-110.0, 40.0, 0.0), ellipse : {semiMinorAxis : 250000.0, semiMajorAxis : 400000.0, material : Cesium.Color.BLUE}});
  widget.entities.add({position : Cesium.Cartesian3.fromDegrees(-100.0, 40.0, 500000.0), cylinder : {length : 1000000.0, topRadius : 100000.0, bottomRadius : 100000.0, material : Cesium.Color.AQUA}});
  widget.entities.add({polygon : {hierarchy : Cesium.Cartesian3.fromDegreesArray([-90, 40, -95, 40, -95, 45, -90, 40]), material : Cesium.Color.ORANGE}});
  widget.entities.add({rectangle : {coordinates : Cesium.Rectangle.fromDegrees(-85.0, 40.0, -80.0, 45.0), material : Cesium.Color.GREEN}});
  widget.entities.add({position : Cesium.Cartesian3.fromDegrees(-70.0, 40.0, 0.0), ellipsoid : {radii : new Cesium.Cartesian3(200000.0, 200000.0, 300000.0), material : Cesium.Color.GREEN}});
  widget.entities.add({wall : {positions : Cesium.Cartesian3.fromDegreesArray([-60, 40, -65, 40, -65, 45, -60, 45]), maximumHeights : [100000.0, 100000.0, 100000.0, 100000.0], minimumHeights : [0, 0, 0, 0], material : Cesium.Color.RED}});
  widget.entities.add({corridor : {positions : Cesium.Cartesian3.fromDegreesArray([-120, 30, -90, 35, -60, 30]), width : 200000.0, material : Cesium.Color.RED}});
  widget.entities.add({polyline : {positions : Cesium.Cartesian3.fromDegreesArray([-120, 25, -90, 30, -60, 25]), width : 0.5, material : Cesium.Color.BLUE}});
  widget.entities.add({polylineVolume : {positions : Cesium.Cartesian3.fromDegreesArray([-120, 20, -90, 25, -60, 20]), shape : [new Cesium.Cartesian2(-50000.0, -50000.0), new Cesium.Cartesian2(50000.0, -50000.0), new Cesium.Cartesian2(50000.0, 50000.0), new Cesium.Cartesian2(-50000.0, 50000.0)], material : Cesium.Color.GREEN}});
  widget.zoomTo(widget.entities);
</script>"""
        self.assertEqual(result, exp)

        # clear entities
        viewer.entities.clear()
        result = viewer.to_html()
        exp_clear = """<script src="https://cesiumjs.org/Cesium/Build/Cesium/Cesium.js"></script>
<link rel="stylesheet" href="https://cesiumjs.org/Cesium/Build/Cesium/Widgets/widgets.css" type="text/css">
<div id="viewertest" style="width:100%; height:100%;"><div>
<script type="text/javascript">
  var widget = new Cesium.Viewer("viewertest", {animation : true, baseLayerPicker : false, fullscreenButton : false, geocoder : false, homeButton : false, infoBox : false, sceneModePicker : true, selectionIndicator : false, timeline : false, navigationHelpButton : false, navigationInstructionsInitiallyVisible : false});
</script>"""
        self.assertEqual(result, exp_clear)

        # add multiple objects at once
        viewer = cesiumpy.Viewer(divid="viewertest", **self.options)
        objs = [
            box, ellipse, cyl, pol, rect, ellipsoid, wall, corridor, polyline,
            polylinevolume
        ]
        viewer.entities.add(objs)
        result = viewer.to_html()
        self.assertEqual(result, exp)

        viewer.entities.clear()
        result = viewer.to_html()
        self.assertEqual(result, exp_clear)
Пример #8
0
    def test_entities_repr(self):
        e = cesiumpy.Point(position=[-110, 40, 0])
        exp = "Point(-110.0, 40.0, 0.0)"
        self.assertEqual(repr(e), exp)

        e = cesiumpy.Label(position=[-110, 40, 0], text='xxx')
        exp = "Label(-110.0, 40.0, 0.0)"
        self.assertEqual(repr(e), exp)

        p = cesiumpy.Pin()
        e = cesiumpy.Billboard(position=(-110, 40, 0), image=p)
        exp = "Billboard(-110.0, 40.0, 0.0)"
        self.assertEqual(repr(e), exp)

        e = cesiumpy.Box(position=[-110, 40, 0], dimensions=(40e4, 30e4, 50e4))
        exp = "Box(-110.0, 40.0, 0.0)"
        self.assertEqual(repr(e), exp)

        e = cesiumpy.Ellipse(position=[-110, 40, 0],
                             semiMinorAxis=25e4,
                             semiMajorAxis=40e4)
        exp = "Ellipse(-110.0, 40.0, 0.0)"
        self.assertEqual(repr(e), exp)

        e = cesiumpy.Cylinder(position=[-110, 40, 100],
                              length=100e4,
                              topRadius=10e4,
                              bottomRadius=10e4)
        exp = "Cylinder(-110.0, 40.0, 100.0)"
        self.assertEqual(repr(e), exp)

        e = cesiumpy.Polygon(hierarchy=[-90, 40, -95, 40, -95, 45, -90, 40])
        exp = "Polygon([-90, 40, -95, 40, -95, 45, -90, 40])"
        self.assertEqual(repr(e), exp)

        e = cesiumpy.Rectangle(coordinates=(-85, 40, -80, 45))
        exp = "Rectangle(west=-85.0, south=40.0, east=-80.0, north=45.0)"
        self.assertEqual(repr(e), exp)

        e = cesiumpy.Ellipsoid(position=(-70, 40, 0), radii=(20e4, 20e4, 30e4))
        exp = "Ellipsoid(-70.0, 40.0, 0.0)"
        self.assertEqual(repr(e), exp)

        e = cesiumpy.Wall(positions=[-60, 40, -65, 40, -65, 45, -60, 45],
                          maximumHeights=[10e4] * 4,
                          minimumHeights=[0] * 4)
        exp = "Wall([-60, 40, -65, 40, -65, 45, -60, 45])"
        self.assertEqual(repr(e), exp)

        e = cesiumpy.Corridor(positions=[-120, 30, -90, 35, -60, 30],
                              width=2e5)
        exp = "Corridor([-120, 30, -90, 35, -60, 30])"
        self.assertEqual(repr(e), exp)

        e = cesiumpy.Polyline(positions=[-120, 25, -90, 30, -60, 25],
                              width=0.5)
        exp = "Polyline([-120, 25, -90, 30, -60, 25])"
        self.assertEqual(repr(e), exp)

        e = cesiumpy.PolylineVolume(
            positions=[-120, 20, -90, 25, -60, 20],
            shape=[-5e4, -5e4, 5e4, -5e4, 5e4, 5e4, -5e4, 5e4])
        exp = "PolylineVolume([-120, 20, -90, 25, -60, 20])"
        self.assertEqual(repr(e), exp)