{"id":16099043,"url":"https://github.com/hellerve/detanglement","last_synced_at":"2025-10-23T10:30:26.119Z","repository":{"id":17609929,"uuid":"20413968","full_name":"hellerve/Detanglement","owner":"hellerve","description":"Big Data Visualization / Research at FKI/HTW Berlin","archived":true,"fork":false,"pushed_at":"2015-01-21T21:47:35.000Z","size":15048,"stargazers_count":2,"open_issues_count":0,"forks_count":2,"subscribers_count":3,"default_branch":"master","last_synced_at":"2024-12-19T05:30:27.269Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/hellerve.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2014-06-02T18:02:31.000Z","updated_at":"2024-02-13T10:01:38.000Z","dependencies_parsed_at":"2022-08-30T19:22:27.014Z","dependency_job_id":null,"html_url":"https://github.com/hellerve/Detanglement","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hellerve%2FDetanglement","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hellerve%2FDetanglement/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hellerve%2FDetanglement/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hellerve%2FDetanglement/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/hellerve","download_url":"https://codeload.github.com/hellerve/Detanglement/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":237807497,"owners_count":19369597,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-10-09T18:25:31.983Z","updated_at":"2025-10-23T10:30:23.357Z","avatar_url":"https://github.com/hellerve.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"Detanglement\n============\n\n![Version](http://img.shields.io/badge/version-0.3.0-yellow.svg)\n![License](http://img.shields.io/badge/license-GPL-blue.svg)\n\n**DISCLAIMER:** This repository is no longer maintained and somewhat\ndeprecated. If you still want to use it, tell me! Maybe we'll find a\nsolution.\n\nThis repo contains a research project I work on at FKI/HTW Berlin.\nAs with most of my repositories, this is a work-in-progress, more specifically,\nan alpha.\n\nIt is a tool that visualizes big amounts of geolocalized data on-demand.\nAt the moment, only a proof-of-concept plugin for WorldBanks' Indicator API\nis working with it, but it can theoretically be extended to work with many\ndifferent APIs; that is the goal, anyway.\n\nRight now, the application is updated to be a webapp using django. As soon\nas it is online, I will get you a link.\n\nTable of Contents\n-----------------\n1. **[Requirements](#requirements)**\n2. **[Usage](#usage)**\n3. **[Writing Plugins](#writing-plugins)**\n4. **[Contribute](#contribute)**\n\nRequirements\n------------\n\nThe tool requires a few additional python libraries to work, namely:\n\n```\nPyQt5\npygeoip\ngeopy\n```\n\nAdditionally, if you want the WorldBank plugin to work(which is the\nonly working plugin right now, so you might), you need to install\n`wbpy`.\nAlso, if you want to check out the nonworking plugin for Twitter(which\nadds markers to the map, but the data is not visualized), you need\nto install `TwitterAPI`.\n\nI have included all Javascript APIs you might need, hoping that no\nlicensing issues will emerge.\n\nUsage\n-----\n\nThere are many ways to invoke/use the application. I suggest you `git clone`\nthe repository first, change into the `src`directory and check out the \ncommand-line features(by invoking `./Tangle.py -h`). To wrap up what I \njust told you, it should look like this:\n\n```bash\ngit clone https://github.com/hellerve/Detanglement.git\ncd Detanglement/src\n./Tangle.py -h\n```\n\nAfter you have made yourself familiar with the main scripts' features, you \ncan explore the tool by typing:\n\n```bash\n./Tangle.py -f\n./Tangle.py -a WorldBank\n```\n\nWhich loads the script with WorldBanks' Indicator API and shows the tools\ncapabilities pretty well. Click around, make yourself at home.\n\n![This is what you should see](rc/Documentation/startup.png \"This is what you should see\")\n\n![Geolocation](rc/Documentation/geolocation.png \"If you want it to, the tool even geolocalizes you!\")\n\nSooner or later you will want to visualize something, because, you know,\nthat is what the tool is about. You can click any marker; a window will pop\nopen and ask you to apply filters. \n\n![You will be greeted by this window](rc/Documentation/filters.png \"You will be greeted by this window\")\n\nCertain filters will not be available for certain\nareas, but you will see that by experimenting. Other filters(like `Population\n(Total)`) will almost always be available. You can fiddle around, search them\nby the search bar or by hand(but that might be pretty unconformtable, because\nWorldBank provides well over 9000(no pun intended) filters. You can also supply it\nregular expressions. If those are not valid, it will try to search it literally.\n\n![Regexes! Yay!](rc/Documentation/regex.png \"Regexes! Yay!\")\n\nSooner or later you will find the filters you want to apply: Dragging them into\nthe second(empty) list will select them and if you click apply, a different window\nshould open and visualize the filters for you - except if you get a notification that\nthe filter did not provide any data.\n\n![Score! Visuals!](rc/Documentation/visuals.png \"Score! Visuals\")\n\nIf you click the settings icon(the little cogwheel in the toolbar), you will also\nhave the possibility to select an alternative map(Kartograph is not working right now,\nbecause it is based on Python 2.7 and we are using Python 3+, but we are working\non that). You can also toggle geolocation and APIs, although the API section should look\na bit... empty.\n\n\nWriting Plugins\n---------------\n\nYou have your own API that you want to visualize or want to contribute? Good for you!\nWith the plugin system, it should be fairly easy.\n\n**What your data needs to be***\n\nIn order for me to be able to visualize your data, it must be geolocalized and\nhave some sort of timeline. If your data does not meet these criteria, I fear this\ntool is not for you; at least not yet.\n\n**What your plugin needs to have**\n\nYour plugin needs to have a single file that needs to be called from outside,\nwith a single class(there can be more, but I need that one class) in it that \nneeds to meet the following criteria:\n\n    1. The constructor is either called without arguments or with the API\n       keys as arguments.\n    2. There is a public(no underscore) variable of type bool named \n       `requiresFilter` which is either set to true(the API needs filters) or\n       false(it does not).\n    3. There is a public method named `getLocations()` that takes no arguments\n       and returns a list of locations. Locations can either be country names\n       or city names.\n    4. If the API requires a Filter(`requiresFilter = True`), there must be a\n       method named `getFilters()` that returns a list of human-readable filters.\n    5. There is a public method named `getDataForLocation()` that takes a location,\n       a filter(both in the format provided by `getLocations()` and `getFilters()`\n       respectively) and a time range(two values in a single string seperated by commas,\n       e.g. \"2010:2012\" for a timeline from 2010 until 2012(both years included)).\n\nIf you are able to provide those features, you are ready to try them out. The easiest way\nis to provide the needed API keys and the API name to Detanglement via the database \nwindow(the dotted rectangle in the iconed bar of the main window) and then restart it.\n\n![The API adding window](master/rc/Documentation/addingapis.png \"You can provide up to ten keys to the database\")\n\nTo be completely sure that the API will be loaded, you can run `Tangle.py -a MyApiName`\nwhich will load your API if possible. If not, nothing will be loaded.\n\nContribute\n----------\n\nWhat needs to be done? Well, many things. I documented most of the bugs in a file\nin `rc` called `KNOWN_BUGS`. You can add to it or open an issue. There is also file\nin the directory called `PLANNED_FEATURES`, documenting what needs to be done.\nYou can also look at both files by invoking `./Tangle.py -d` or `./Tangle.py --devel`\nor, if you have installed it (kudos, you are likely to use Linux, because it is a pain\nto install it on any other platform at the moment) `Tangle -d`.\n\nI am currently working on making the whole application a web app. I am using Django\nfor that.\n\nAlso, the help file is a mess that needs to be cleaned up by someone who enjoys writing\nHTML files more than me. It is a non-informative mess.\n\nI suggest you code a plugin and see if it works. If it does not, we can look at what is\nthe problem and fix it together.\n\nRight now, the application is made into a webapp. I use django for that purpose, but I am\nstill a rookie in using it, so any help is appreciated.\n\nTechnical Rant\n--------------\n\nThis section makes understanding the code much easier. It must not be read; however,\nif you plan on contributing to this software, you might as well spend some time on\nlearning the philosophy behind it.\n\nI chose python for the job, because everything in Python is an object and I can theoretically\napply category theory to it to transform any type of data you provide into a plottable,\nquantifiable set. The problem with that approach is the (admittedly very hard) problem of\nidentifying the incoming data and what the significant bits to plot are. This is where\nphilosophy comes in; one might not always get the output he expected or hoped for because\nthe program applied the wrong filters. The basic problem boils down to this: identify the\nset, transform it, quantify it, plot it. The master branch of this program has only very basic \ncapabilities in identifiying the data and does not filter much of it. I am working on a more\nsophisticated mechanism that does the job, but it is very unstable, unreliable and not very \nsharable at the moment, so if you wish to extend the project, keep in mind that this is only\na rough sketch of what I wish to be possible.\n\nI tried to keep this intro as brief and high level as possible. If you have, questions, \nsuggestions or anything you want to talk to me about it, feel free to contact me.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhellerve%2Fdetanglement","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhellerve%2Fdetanglement","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhellerve%2Fdetanglement/lists"}