{ "info": { "author": "Thomas Gilgenast", "author_email": "thomasgilgenast@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "Environment :: Console", "Intended Audience :: Developers", "Intended Audience :: Science/Research", "Operating System :: OS Independent", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Topic :: Multimedia :: Graphics :: Viewers", "Topic :: Scientific/Engineering :: Visualization" ], "description": "projectile\r\n==========\r\n\r\nA tile-on-demand tile server built with PIL and Tornado.\r\n\r\nMotivation\r\n----------\r\n\r\nWe want to store a high-resolution image in memory on the server as a numpy\r\narray. Then when a client requests a particular tile, we can make the PNG of the\r\nrequested tile by slicing the numpy array and using PIL to write the resulting\r\nPNG back to the client through a StringIO stream.\r\n\r\nThis is primarily intended for building interactive visualizations in research\r\nsettings where we might want to skip the time- and/or disk-intensive tile\r\ngeneration step required by typical tile servers.\r\n\r\nDemo\r\n----\r\n\r\nInstall projectile\r\n\r\n $ pip install projectile\r\n\r\nServe a test image from the [USC-SIPI Image Database](http://sipi.usc.edu/database/):\r\n\r\n $ projectile sanfran\r\n\r\nManually request a particular tile by navigating to .\r\n\r\nTry zooming and panning in the demo client by navigating to .\r\n\r\nServe one of your own images (any format readable by PIL) with\r\n\r\n $ projectile some_image.tiff\r\n\r\nor, if you have data in a numpy `.npy` file,\r\n\r\n $ projectile some_image.npy\r\n\r\nLoad an image in grayscale mode and apply a colormap:\r\n\r\n $ projectile --mode L --cmap viridis pentagon\r\n\r\nStress testing\r\n--------------\r\n\r\nTo test the performance limits of on-demand tiling, download this\r\n[high resolution map of Great Britain](https://commons.wikimedia.org/wiki/File:A_new_map_of_Great_Britain_according_to_the_newest_and_most_exact_observations_(8342715024).jpg)\r\n(8,150 \u00d7 13,086 pixels, file size: 102.74 MB) from Wikimedia Commons.\r\n\r\nGrayscale performance test:\r\n\r\n $ projectile britain.jpg -m L\r\n\r\nReducing tile resolution when running in color:\r\n\r\n $ projectile britain.jpg --tile_size 128\r\n\r\nDependencies\r\n------------\r\n\r\n - `numpy>=1.13.3`\r\n - `Pillow>=4.3.0`\r\n - `tornado>=4.5.2`\r\n - `matplotlib>=2.1.0`\r\n\r\nAPI\r\n---\r\n\r\n### URL scheme\r\n\r\nThe server will serve grayscale and RGB images in their original colors at\r\n\r\n ////.png\r\n\r\nwhere `` is the zoom level, `` and `` specify the coordinates of the\r\ntile at that zoom level (`0/0` is the top left tile), and `` specifies the\r\nimage tile resolution in pixels (must be a power of 2).\r\n\r\nThe server will serve colormapped versions of a grayscale image at\r\n\r\n ///////.png\r\n\r\nwhere `` is the name of a matplotlib colormap, and `` and ``\r\nspecify the range of image pixel values linearly interpolate against the\r\ncolormap (pixel values outside this range will be clipped).\r\n\r\n### Using a custom client\r\n\r\nIf you like the projectile backend but just want to use a simple custom client\r\ncontained in a single HTML file `custom_client.html`, you can run\r\n\r\n $ projectile array.npy --client custom_client.html\r\n\r\nto make projectile serve your client instead of the included demo client.\r\n\r\n### Using projectile in your existing Tornado web application\r\n\r\nThe core functionality is exposed in the `TileHandler` class defined in\r\n[server.py](projectile/server.py), which you can use in your own Tornado web\r\napplications:\r\n\r\n```python\r\nfrom tornado import web\r\nfrom projectile.server import TileHandler\r\n\r\n...\r\n\r\napp = web.Application([\r\n (r'/([0-9]+)/([0-9]+)/([0-9]+)/([0-9]+).png', TileHandler,\r\n dict(array=array)),\r\n ...\r\n])\r\n\r\n...\r\n```\r\n\r\n### Launching projectile from your own Python code\r\n\r\nYou can also launch a server from your own Python code with the `run()` function\r\ndefined in [server.py](projectile/server.py):\r\n\r\n```python\r\nfrom projectile.server import run\r\n\r\nrun(array)\r\n```\r\n\r\nCredits\r\n-------\r\n\r\nThe demo client is lifted from , with the\r\naddition of a small filtering check to prevent the client from requesting tiles\r\nwhich lie beyond the image boundaries.\r\n\r\n\r\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/sclabs/projectile", "keywords": "tileserver tile server on-demand tiling", "license": "", "maintainer": "", "maintainer_email": "", "name": "projectile", "package_url": "https://pypi.org/project/projectile/", "platform": "", "project_url": "https://pypi.org/project/projectile/", "project_urls": { "Homepage": "https://github.com/sclabs/projectile" }, "release_url": "https://pypi.org/project/projectile/0.0.5/", "requires_dist": [ "numpy (>=1.13.3)", "Pillow (>=4.3.0)", "tornado (>=4.5.2)", "six (>=1.11.0)", "matplotlib (>=2.1.1)" ], "requires_python": "", "summary": "A tile-on-demand tile server built with PIL and Tornado", "version": "0.0.5" }, "last_serial": 3696518, "releases": { "0.0.1": [ { "comment_text": "", "digests": { "md5": "ad40174327f701736ac0470349e7ed8d", "sha256": "7fd337af9b6b64f180132947e117c73fe64d19c898465617d4b71ebdcb9de633" }, "downloads": -1, "filename": "projectile-0.0.1-py2-none-any.whl", "has_sig": false, "md5_digest": "ad40174327f701736ac0470349e7ed8d", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 8212, "upload_time": "2017-12-15T07:39:57", "url": "https://files.pythonhosted.org/packages/a0/0e/3cb4717a9d82a19b27f773a479de64a2c50bddcadb63fb6d0a051c52fb8d/projectile-0.0.1-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "51e44b7fbd8b2f2b50100934fcfac6e4", "sha256": "1e373f294829eaa4ffc3d60f3ae102828be3fe6935a061148ea0a3f973ab998d" }, "downloads": -1, "filename": "projectile-0.0.1.tar.gz", "has_sig": false, "md5_digest": "51e44b7fbd8b2f2b50100934fcfac6e4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20717, "upload_time": "2017-12-15T07:39:59", "url": "https://files.pythonhosted.org/packages/3a/68/efeb82e9db81f1f1d6b2589086ff98ea04c7c9a9960aae8715acfc3a8d3d/projectile-0.0.1.tar.gz" } ], "0.0.2": [ { "comment_text": "", "digests": { "md5": "ef298190b56665feb7a49804279bbac8", "sha256": "c6823778a91743c847ad59d1dc1c469f60451a44bccee8eacd959437fcfc35a8" }, "downloads": -1, "filename": "projectile-0.0.2-py2-none-any.whl", "has_sig": false, "md5_digest": "ef298190b56665feb7a49804279bbac8", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 9149, "upload_time": "2017-12-15T07:53:52", "url": "https://files.pythonhosted.org/packages/b1/37/9e71e751fb9535fb8bd8882f8dd16fdf9b5c0c562900a5fece1f168e08e0/projectile-0.0.2-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1d86cbcbbdb4b5240f694c56e8e3895a", "sha256": "f2b27126971825c5dbf88268c4e99213fde22df87452fba9757482e15cbbd187" }, "downloads": -1, "filename": "projectile-0.0.2.tar.gz", "has_sig": false, "md5_digest": "1d86cbcbbdb4b5240f694c56e8e3895a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21484, "upload_time": "2017-12-15T07:53:53", "url": "https://files.pythonhosted.org/packages/b9/e4/26bfb3ac34f5a71629d5a79dd96368a5a2e3f3933f477044c456c2a9e714/projectile-0.0.2.tar.gz" } ], "0.0.3": [ { "comment_text": "", "digests": { "md5": "1641c7afce21b5e900febfa3a44101f1", "sha256": "9b533380eeaea6f4e648d59c63996a6aaf5a6fe9028000d9b4e515d5c7f14d70" }, "downloads": -1, "filename": "projectile-0.0.3-py2-none-any.whl", "has_sig": false, "md5_digest": "1641c7afce21b5e900febfa3a44101f1", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 10501, "upload_time": "2017-12-15T10:11:28", "url": "https://files.pythonhosted.org/packages/c4/30/7ba302aedb1bba1619365020f32d8d122135e048b8498a3784813a3f03eb/projectile-0.0.3-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5eb5cc0f62488409090d020c32f1b77c", "sha256": "9711d58bb91947f95da82c4a5c5a2f2da4ee95a54089928f2ebe19276861648a" }, "downloads": -1, "filename": "projectile-0.0.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "5eb5cc0f62488409090d020c32f1b77c", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 10504, "upload_time": "2017-12-15T10:19:55", "url": "https://files.pythonhosted.org/packages/98/80/bbeb092d4d8a7e8d2cee1c6fc71ce4a2ce59bdcb81eeee162a62e5a79356/projectile-0.0.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9299056323b7195f727c6a6fa5fde4a0", "sha256": "bcb6fe3ab57704a557e28f2a28262809de56a27ad0e450526e2232b4945235a5" }, "downloads": -1, "filename": "projectile-0.0.3.tar.gz", "has_sig": false, "md5_digest": "9299056323b7195f727c6a6fa5fde4a0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22587, "upload_time": "2017-12-15T10:11:30", "url": "https://files.pythonhosted.org/packages/6d/c2/0661c1745ffdd102483b242a57fa77c8c15b75f0816f51c6aee26b630fad/projectile-0.0.3.tar.gz" } ], "0.0.4": [ { "comment_text": "", "digests": { "md5": "2f6a7120f5992e8c00158d0bb21d1249", "sha256": "0ab9c09c768b6d6fff80af1f00b2da04565a3aa19c9fc0834c562deac1c1821d" }, "downloads": -1, "filename": "projectile-0.0.4-py2-none-any.whl", "has_sig": false, "md5_digest": "2f6a7120f5992e8c00158d0bb21d1249", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 12040, "upload_time": "2018-03-22T14:59:15", "url": "https://files.pythonhosted.org/packages/9f/21/0f87d2f34e3e5bfdafa8582c39d2988d8789c804b5179b718a10d0598d7d/projectile-0.0.4-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4e64be1b1326ac4403bd734684da8c88", "sha256": "03698eef6413a3b5176d1c6b8d802c12936b74384835ba4faceccc29b6107462" }, "downloads": -1, "filename": "projectile-0.0.4.tar.gz", "has_sig": false, "md5_digest": "4e64be1b1326ac4403bd734684da8c88", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23778, "upload_time": "2018-03-22T14:59:50", "url": "https://files.pythonhosted.org/packages/fb/58/acf9a4dd4efcc227e71f8e98bb32ea06ae6aeb924ae6925e6b5d3a3ea8b3/projectile-0.0.4.tar.gz" } ], "0.0.4a1": [ { "comment_text": "", "digests": { "md5": "e94f1df3a1d8aac915d35795ecfbe916", "sha256": "935fdbe21cc6967267f38f603032b079d364c827b9c22d53f917aae013b49e16" }, "downloads": -1, "filename": "projectile-0.0.4a1-py2-none-any.whl", "has_sig": false, "md5_digest": "e94f1df3a1d8aac915d35795ecfbe916", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 11091, "upload_time": "2018-01-29T05:47:37", "url": "https://files.pythonhosted.org/packages/09/41/4a8272fe0aa1f5db49ffb413fd3d2e5a97a11d99b213a2916a599270f15f/projectile-0.0.4a1-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5ebf02f08bc42b02c1df218558a1971f", "sha256": "1068a2ef92f737a8f628410f56a785fa20d0348c32f26d38cb1c0c524bfacf2a" }, "downloads": -1, "filename": "projectile-0.0.4a1.tar.gz", "has_sig": false, "md5_digest": "5ebf02f08bc42b02c1df218558a1971f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23099, "upload_time": "2018-01-29T05:48:15", "url": "https://files.pythonhosted.org/packages/a7/cb/45f689813a8736a3da0e59b11d1a3201d046be6af7988ba7b74316d25833/projectile-0.0.4a1.tar.gz" } ], "0.0.5": [ { "comment_text": "", "digests": { "md5": "67a8487484d7308e8a59178ef073a31a", "sha256": "fb972d9c8cd0276d170ec3b3dfaf8e6c9144aa84f6dae702e6f3dd336d1f634d" }, "downloads": -1, "filename": "projectile-0.0.5-py2-none-any.whl", "has_sig": false, "md5_digest": "67a8487484d7308e8a59178ef073a31a", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 12048, "upload_time": "2018-03-22T18:51:18", "url": "https://files.pythonhosted.org/packages/b5/ae/612d8f04a784f1f4d13d5e3ae67d2daf4ff4b417ee407c9399819bc543d1/projectile-0.0.5-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e40af3b8f737696ecb74f7d16cc259eb", "sha256": "b66fe76ba1b0920894d88c37e516bbcd48868846dd5c2e62127b0bf43cc63f00" }, "downloads": -1, "filename": "projectile-0.0.5-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "e40af3b8f737696ecb74f7d16cc259eb", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 12051, "upload_time": "2018-03-22T18:53:08", "url": "https://files.pythonhosted.org/packages/9d/74/971c845bb939daa7fd3e5138ac1fcf8497cac4f5bc239196a81685cbb252/projectile-0.0.5-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d9a9f6cb698934c8442e70c5c2e213e9", "sha256": "b41011fcca414d45d785df366b56812ada521c8f6dfe0cdec19d5396f557b0b4" }, "downloads": -1, "filename": "projectile-0.0.5.tar.gz", "has_sig": false, "md5_digest": "d9a9f6cb698934c8442e70c5c2e213e9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23783, "upload_time": "2018-03-22T18:51:19", "url": "https://files.pythonhosted.org/packages/22/00/2426b8539e52b49634826fbd8fb303dd0634ef0631df12045df1c73cc365/projectile-0.0.5.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "67a8487484d7308e8a59178ef073a31a", "sha256": "fb972d9c8cd0276d170ec3b3dfaf8e6c9144aa84f6dae702e6f3dd336d1f634d" }, "downloads": -1, "filename": "projectile-0.0.5-py2-none-any.whl", "has_sig": false, "md5_digest": "67a8487484d7308e8a59178ef073a31a", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 12048, "upload_time": "2018-03-22T18:51:18", "url": "https://files.pythonhosted.org/packages/b5/ae/612d8f04a784f1f4d13d5e3ae67d2daf4ff4b417ee407c9399819bc543d1/projectile-0.0.5-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e40af3b8f737696ecb74f7d16cc259eb", "sha256": "b66fe76ba1b0920894d88c37e516bbcd48868846dd5c2e62127b0bf43cc63f00" }, "downloads": -1, "filename": "projectile-0.0.5-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "e40af3b8f737696ecb74f7d16cc259eb", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 12051, "upload_time": "2018-03-22T18:53:08", "url": "https://files.pythonhosted.org/packages/9d/74/971c845bb939daa7fd3e5138ac1fcf8497cac4f5bc239196a81685cbb252/projectile-0.0.5-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d9a9f6cb698934c8442e70c5c2e213e9", "sha256": "b41011fcca414d45d785df366b56812ada521c8f6dfe0cdec19d5396f557b0b4" }, "downloads": -1, "filename": "projectile-0.0.5.tar.gz", "has_sig": false, "md5_digest": "d9a9f6cb698934c8442e70c5c2e213e9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23783, "upload_time": "2018-03-22T18:51:19", "url": "https://files.pythonhosted.org/packages/22/00/2426b8539e52b49634826fbd8fb303dd0634ef0631df12045df1c73cc365/projectile-0.0.5.tar.gz" } ] }