Giter Site home page Giter Site logo

giscience / orstools-qgis-plugin Goto Github PK

View Code? Open in Web Editor NEW
96.0 11.0 31.0 1.72 MB

Plugin for QGIS with a set of tools to use openrouteservice API´s, based on openstreetmap

Home Page: https://plugins.qgis.org/plugins/ORStools/

License: MIT License

Python 98.25% HTML 0.03% QMake 0.05% QML 1.68%
routing qgis-plugin qgis-processing-provider qgis3-plugin qgis3 isochrones openrouteservice

orstools-qgis-plugin's Introduction

ORS Tools QGIS plugin

Testing Ruff

ORS Tools

Set of tools for QGIS to use the openrouteservice (ORS) API.

ORS Tools gives you easy access to the following API's:

The wiki offers a tutorial on usage.

In case of issues/bugs, please use the issue tracker.

For general questions, please ask in our forum.

See also:

Functionalities

General

Use QGIS to generate input for routing, isochrones and matrix calculations powered by ORS.

You'll have to create an openrouteservice account and get a free API key first: https://openrouteservice.org/sign-up. After you have received your key, add it to the default openrouteservice provider via WebORS ToolsProvider Settings or click the settings button in the ORS Tools dialog.

The plugin offers either a GUI in the Web menu and toolbar of QGIS to interactively use the ORS API from the map canvas.

For batch operations you can find an ORS Tools folder in the Processing Toolbox.

Customization

Additionally, you can register other ORS providers, e.g. if you're hosting a custom ORS backend.

Configuration takes place either from the Web menu entry ORS ToolsProvider settings. Or from the Config button in the GUI.

Getting Started

Requirements

QGIS version: v3.4 or above

ORS API key

Installation

In the QGIS menu bar click PluginsManage and Install Plugins....

Then search for openrouteservice and install ORS Tools.

Alternatively, install the plugin manually:

  • Download ZIP file from GitHub
  • Unzip folder contents and copy ORStools folder to:
    • Linux: ~/.local/share/QGIS/QGIS3/profiles/default/python/plugins
    • Windows: C:\Users\USER\AppData\Roaming\QGIS\QGIS3\profiles\default\python\plugins
    • Mac OS: Library/Application Support/QGIS/QGIS3/profiles/default/python/plugins

Development Setup

Requirements:

  • QGIS-LTR (3.16)

    Recommended plugins:

  • PyCharm or similar IDE

Clone repository

On PyCharm startup create a new project with Get From VHS and paste the repository url https://github.com/GIScience/orstools-qgis-plugin

or clone manually and open the folder with your IDE

# clone the repository
git clone https://github.com/GIScience/orstools-qgis-plugin.git

Set up environment and python interpreter

Use the Python from your QGIS installation as interpreter in a new virtual environment

  1. PyCharmPreferencesProjectPython Interpreter
  2. click cogwheel and choose Add...
  3. select Virtualenv Environment(default)
  4. set env folder to e.g. ~/Workspaces/qgis (this environment can be used for multiple QGIS plugins if needed)
  5. set Base interpreter to the one QGIS uses (QGISPreferencesSystemCurrent environment variablesPYTHONHOME + bin/python3.8)
    • (Mac) /Applications/QGIS-LTR.app/Contents/MacOS/bin/python3.8
    • (Linux) might work with the system python (See QGIS cookbook)
    • (Windows) to be determined (Best also use the cookbook)
  6. check Inherit global site-packages and if you want Make available to all projects
  7. click Ok
  8. in the overview of project interpreters, select the just created one (qgis) and click the last button showing interpreter paths
  9. add the binary folder inside QGIS contents to the environment path, to expose cli commands like pyuic5, pyrcc5, ogr2ogr and more:
    • (Mac) /Applications/QGIS-LTR.app/Contents/MacOS/bin
    • (Linux) to be determined
    • (Windows) to be determined

Link plugin to QGIS

To not copy around files all the time, create a symlink in the QGIS plugin folder to the ORStools folder of the repository

ln -s ORStools <qgis_plugins_path>

where <qgis_plugins_path> is one of:

  • Linux: ~/.local/share/QGIS/QGIS3/profiles/default/python/plugins/ORStools
  • Windows: C:\Users\USER\AppData\Roaming\QGIS\QGIS3\profiles\default\python\plugins\ORStools
  • Mac OS: Library/Application Support/QGIS/QGIS3/profiles/default/python/plugins/ORStools

CI

Testing

The repository tests on the QGis Versions 3.16, 3.22 and the latest version. Until now, it's only possible to test one version at a time.

Linux

On linux machines you can run the tests with your local QGIS installation.

  1. Install QGIS and make sure it's available in your currently activated environment.

You will need an ORS-API key. Either set it as an environment variable or do export ORS_API_KEY=[Your API key here] before you run the tests.

To run the tests do:

cd orstools-qgis-plugin
pytest

Windows

Do all the following steps in a WSL. To run tests locally you can use a conda installation of the QGis version you want to test. You will also have to install xvfb to run the tests on involving an interface. Lastly, we need Pytest to run tests in general.

To do the above run use these commands:

  1. Install a version of anaconda, preferrably miniforge.

  2. Create and prepare the environment.

# create environment
conda create --name qgis_test
# activate environment
conda activate qgis_test
# install pip
conda install pip
  1. Install QGis using mamba.
conda install -c conda-forge qgis=[3.16, 3.22, latest] # choose one
  1. Install xvfb
sudo apt-get update
sudo apt install xvfb
  1. Install Pytest using pip in testing environment.
pip install -U pytest

To run the tests you will need an ORS-API key:

cd orstools-qgis-plugin
export ORS_API_KEY=[Your API key here] && xvfb-run pytest

Debugging

In the PyCharm community edition you will have to use logging and printing to inspect elements. The First Aid QGIS plugin can probably also be used additionally.

The professional PyCharm edition offers remote debugging with breakpoints which lets you inspect elements during runtime, and step through the code execution.

To use the debugger create a new run configuration:

  1. click the dropdown next to the run button

  2. select Edit configurations

  3. click + and select Python Debug Server

  4. give the configuration a name and set the Port to 53100 and leave the IDE host name at localhost

  5. copy the command to connect to the debug server (2.)

  6. remember the version number of the pydevd-pycharm you will need (1.)

  7. click ok

  8. install the exact version package in the interpreter package list (PyCharmPreferencesProjectPython Interpreter+)

    or install from the terminal

    # replace the version with the one listed in the run configuration
    pip install pydevd-pycharm~=211.7142.13
  9. create a live template to quickly insert break points (PyCharmPreferencesEditorLive Templates)

    • collapse Python and click +
    • set abbreviation to e.g. br add description and set Template text to
    import pydevd_pycharm
    pydevd_pycharm.settrace('localhost', port=53100, stdoutToServer=True, stderrToServer=True)
  10. create a debug branch and commit that loads the pydev-pycharm code

    # create debug branch
    git checkout -b debug

    add in ORStools/ORStoolsPlugin.py before all imports and adjust path with your user and app location if PyCharm was not installed via JetBrains toolbox

    DEBUG = True
    
    if DEBUG:
        import sys
        sys.path.append('/Users/{your_user}/Library/Application Support/JetBrains/Toolbox/apps/PyCharm-P/ch-0/211.7142.13/PyCharm.app/Contents/debug-eggs/pydevd-pycharm.egg')
        # add breakpoints like:
        import pydevd_pycharm
        pydevd_pycharm.settrace('localhost', port=53100, stdoutToServer=True, stderrToServer=True)

    avoid raising exceptions in ORStools/gui/ORStoolsDialog.py to not crash QGIS every time one is raised

    # below other imports
    from ..ORStoolsPlugin import DEBUG
    
    # surround raise with if block around run_gui_control()
    if not DEBUG:
        raise

    commit changes

     git add . && git commit -m "Debug commit"

Important: When using the remote debugger of PyCharm you have to disable the First Aid plugin, as it interferes with the remote debugger.

Workflow

To debug you now only need to cherry-pick the debug commit to the branch you are working on and place any changes on top.

# this will cherry pick the last commit of the debug branch
git cherry-pick debug

Make sure the local debug branch is up to date with the main branch by rebasing regularly

# you will be on debug branch afterwards
git rebase main debug

Before starting QGIS, you need to run the "QGIS debug" configuration you created.
Afterwards you can open QGIS and press the plugin reloader button (configured to reload ORStools). It should break at the breakpoint introduced in the debug commit.

In general, you can now use normal breakpoints of the IDE with left click in the gutter (or ctrl/cmd + F8).

If you are debugging the processing algorithms, which run in another thread, you will have to add another manual breakpoint in e.g. ORStools/proc/isochrones_layer_proc.py by typing br (or whatever you configured in your live template), pressing enter and reload the plugin in QGIS.

In short: Use IDE breakpoints if they work, if not use manual and IDE breakpoints afterwards.

Once you finalized your changes, remove the manual breakpoints again and drop the debug commit.

You can do this with one of the following

  • pressing alt/option + 9 and right-click the debug commit on your branch and choose Drop Commit
  • git stash && git reset --hard HEAD^ && git stash pop
  • commit your changes and git rebase -i HEAD^^, prepend the debug commit with a d and save

Interface development

For designing the Dialog the Qt designer shipping with qgis is used. It has relevant classes such as QgsMapLayerComboBox already imported properly.

Mac

  • use /Applications/QGIS-LTR.app/Contents/MacOS/bin/designer instead of /Applications/QGIS-LTR.app/Contents/MacOS/Designer.app (trying to get other Qt Designer or Qt Creator installations to use the correct QGIS classes was unsuccessful)
  • if you want a shortcut in Applications do
    cd /Applications
    ln -s QGIS-LTR.app/Contents/MacOS/bin/designer "Qt Designer.app"

Windows

  • should create you a shortcut to the Qt Designer with the installation

Linux

Workflow

Proceed similar for other .ui files:

  1. open the ORStools/gui/ORStoolsDialogUI.ui file in the Designer and save your changes after editing.
  2. convert the .ui file to .py file by using pyuic5 (which should also be accessible as command from your terminal if PyCharm uses the qgis env but using it as a module makes sure the correct one is used in case you have other PyQt installations on your machine)
    # make sure you are in the gui folder
    cd ORStools/gui
    # convert to .py and set correct import
    python -m PyQt5.uic.pyuic --import-from . -o ORStoolsDialogUI.py ORStoolsDialogUI.ui
  3. in case you edit resources such as images you also need to convert the resources.qrc file
    # also within the gui folder
    python -m PyQt5.pyrcc_main -o resources_rc.py resources.qrc
  4. if you edited or added new widgets you will have to change or include them in ORStools/gui/directions_gui.py as well

Translation

Translation uses the QT Linguist for translating GUI and source code strings. All translation-related content resides in ORStools/i18n. Translation is controlled by ORStools/gui/translate.pro, stating all UI-forms and sourcefiles that include strings to be translated. To add a translation, add orstools_<LANGUAGE_TAG>.ts to the list of translation in this file.

Workflow

  1. Generate the .ts-files (Translation Source) from translate.pro via
    pylupdate5 -noobsolete -verbose translate.pro
    Note that this will drop obsolete strings, skip -noobsolete if you want to keep them.
  2. Inspect the changes this has on the existing *.ts-files. pylupdate5 will remove translation comments and might restructure the translation.
  3. Translate the *.ts-files using QT Linguist via
    linguist orstools_<LANGUAGE_TAG>.ts
  4. Compile the *.ts-file to a *.qm Qt Translation file via
    lrelease orstools_<LANGUAGE_tag>.ts

License

This project is published under the GPLv3 license, see LICENSE.md for details.

By using this plugin, you also agree to the terms and conditions of openrouteservice.

Acknowledgements

This project was first started by Nils Nolde.

orstools-qgis-plugin's People

Contributors

jannefleischer avatar kcrkor avatar koebi avatar m-kuhn avatar merydian avatar nilsnolde avatar thegreatrefrigerator avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

orstools-qgis-plugin's Issues

Map is blank after isochrone calculation

Hi,

I am trying to make some isochrones and I tried using the OSM tools. When I click to make the isochrones, the whole map becomes blank white, even though the new layers show on the layers list. Even if I delete the isochrone layers, the map remains blank white. Could you help me with this?

Thank you,

Panos

IOError: [Errno 9] Bad file descriptor

When running in batch mode I received some errors in the python log. Yet the routing finished with success. Here is the error/warning:

Python Console 
Use iface to access QGIS API interface or Type help(iface) for more info
Traceback (most recent call last):
  File "C:\OSGEO4~1\apps\Python27\lib\logging\__init__.py", line 875, in emit
    self.flush()
  File "C:\OSGEO4~1\apps\Python27\lib\logging\__init__.py", line 835, in flush
    self.stream.flush()
IOError: [Errno 9] Bad file descriptor
Logged from file connectionpool.py, line 788
Traceback (most recent call last):
  File "C:\OSGEO4~1\apps\Python27\lib\logging\__init__.py", line 875, in emit
    self.flush()
  File "C:\OSGEO4~1\apps\Python27\lib\logging\__init__.py", line 835, in flush
    self.stream.flush()
IOError: [Errno 9] Bad file descriptor
Logged from file connectionpool.py, line 788
Traceback (most recent call last):
  File "C:\OSGEO4~1\apps\Python27\lib\logging\__init__.py", line 875, in emit
    self.flush()
  File "C:\OSGEO4~1\apps\Python27\lib\logging\__init__.py", line 835, in flush
    self.stream.flush()
IOError: [Errno 9] Bad file descriptor
Logged from file connectionpool.py, line 788
Traceback (most recent call last):
  File "C:\OSGEO4~1\apps\Python27\lib\logging\__init__.py", line 875, in emit
    self.flush()
  File "C:\OSGEO4~1\apps\Python27\lib\logging\__init__.py", line 835, in flush
    self.stream.flush()
IOError: [Errno 9] Bad file descriptor
Logged from file connectionpool.py, line 788
Traceback (most recent call last):
  File "C:\OSGEO4~1\apps\Python27\lib\logging\__init__.py", line 875, in emit
    self.flush()
  File "C:\OSGEO4~1\apps\Python27\lib\logging\__init__.py", line 835, in flush
    self.stream.flush()
IOError: [Errno 9] Bad file descriptor
Logged from file connectionpool.py, line 788
Traceback (most recent call last):
  File "C:\OSGEO4~1\apps\Python27\lib\logging\__init__.py", line 875, in emit
    self.flush()
  File "C:\OSGEO4~1\apps\Python27\lib\logging\__init__.py", line 835, in flush
    self.stream.flush()
IOError: [Errno 9] Bad file descriptor
Logged from file connectionpool.py, line 788

ConnectionError

Plugin times out and nothing appears. Below is the error I get.

ConnectionError: HTTPSConnectionPool(host='api.openrouteservice.org', port=443): Max retries exceeded with url: /isochrones?api_key=58d904a497c67e00015b45fc6a689c6e3eb642b17542516ec88c1c4e&range_type=time&range=600.0&interval=300.0&profile=driving-car&location_type=start&locations=-6.22484,53.44515%7C-6.23635,53.28606 (Caused by NewConnectionError('<requests.packages.urllib3.connection.VerifiedHTTPSConnection object at 0x000000001FD59F98>: Failed to establish a new connection: [Errno 10060] A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond',))

Color ramp for isochrones fails for more than 10 isochrones

When using a multi-point layer to calculate isochrones, the hard-coded color scheme incrementally adds another color from the ramp, instead of defaulting to color(0) for each new point.

Also, script fails when more than 10 isochrones are calculated in total during one operation.

@noerw

python no module named yaml

when installing on mint 18 I get python no module named yaml but it seems I have yaml on the system.
It's qgis 2 point someaught not 3 so is that the problem ; )

OSM Tools window to big

Dear Nils,

when using the tools on my Mint Laptop 13" 1366x768 the tool's window is to large to see the lower part of it. Therefore the routing cannot be started. Unfortunately the windows isn't resizable. Any idea?
image

Overlap option can crash code when driving radius is too long

Gives a
TypeError: arguments did not match any overloaded call: QgsPoint(): too many arguments QgsPoint(QgsPoint): argument 1 has unexpected type 'list' QgsPoint(float, float): argument 1 has unexpected type 'list' QgsPoint(QPointF): argument 1 has unexpected type 'list' QgsPoint(QPoint): argument 1 has unexpected type 'list'

Smth to do with too many overlaps...

Problems

I have used OSM tools for a few days, and I like it very much. But all of a sudden it stoped working. I have reinstalled both QGIS and OSM Tools several times, but the problems are still there. The problems are:

When I make a layer with Points and store it with CRS EPSG 4326 and run the accessibility analyse I get a message saying "TypeError: 'NoneType' object is not iterable".

When I starts the accessibility analyse and click "Map Now!" button and make a point on the map (regardless CRS, have tried several times with both EPSG 4326 and others) I allways get a message saying that the request is not valid because the coordinates can't be more than 1 km from a road. The point is placed in the senter of the roads. I have tried with both OSM and other map layers that have worked before.

qgsmapcanvas.maprenderer deprecated

QGIS Version 2.18.4
OSM Tools v.0.3.1
'QuickMapServices' v.0.18.7

Open up QGIS > Add Google Roads Layer from QuickMapServices > CRS = WGS / Pseudo Mercator EPSG:3857 > Open up OSM Tools plugin and add API key > Select Default settings for 'Accessibility Areas' > Select 'Map now!' and pick place on map > Nothing happens

Below is the warning I get from the Log Messages Panel

image

'NoneType' object is not iterable

Hi Niels, thanks for your work.
Some python issues here. Any tips? thanks
2017-12-08T18:35:18 1 Traceback (most recent call last):
File "/Users/Peter/.qgis2/python/plugins/OSMtools/osm_tools.py", line 245, in run
with open(os.path.join(self.script_dir, "apikey.txt")) as key:
AttributeError: 'NoneType' object has no attribute 'path'

2017-12-08T18:45:44 1 Traceback (most recent call last):
File "/Users/Peter/.qgis2/python/plugins/OSMtools/osm_tools.py", line 262, in run
self.access_anal.iterAnalysis()
File "/Users/Peter/.qgis2/python/plugins/OSMtools/osm_tools_access.py", line 382, in iterAnalysis
feat_list, isochrone_list = self.accRequest(feat_in_list)
TypeError: 'NoneType' object is not iterable

Error 500 : Unable to find appropriate routing profile

Hey,

I have a problem when i try to build a time-matrix from a point layer. I get the message : 500 (Unable to find appropriate routing profile). I try to change the profile, to select only 3 points but nothing have worked.
(I have used OSMtools to build isochrone based on point layer with some problem but then i acheived to make it work after some research on the resolved issue in OSMtools repository.)

Error when running Accessibility Area from point file

Hello,
I love the plugin. However when I try to run it from a point file containing 7 points for a distance on .4 km.
I get this error:
2018-02-15T15:17:49 1 Traceback (most recent call last):
File "C:/Users/BG/.qgis2/python/plugins\OSMtools\osm_tools.py", line 262, in run
self.access_anal.iterAnalysis()
File "C:/Users/BG/.qgis2/python/plugins\OSMtools\osm_tools_access.py", line 382, in iterAnalysis
feat_list, isochrone_list = self.accRequest(feat_in_list)
File "C:/Users/BG/.qgis2/python/plugins\OSMtools\osm_tools_access.py", line 165, in accRequest
root = json.loads(response.text)
File "C:\PROGRA1\QGIS21.18\apps\Python27\lib\json_init_.py", line 338, in loads
return _default_decoder.decode(s)
File "C:\PROGRA1\QGIS21.18\apps\Python27\lib\json\decoder.py", line 365, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "C:\PROGRA1\QGIS21.18\apps\Python27\lib\json\decoder.py", line 383, in raw_decode
raise ValueError("No JSON object could be decoded")
ValueError: No JSON object could be decoded
Any ideas?
And thanks.

rename plugin for consistency

While you're refactoring for QGIS3;
afaik QGIS3 will use a separate plugin repository. You might use the opportunity to rename the plugin from "OSM Tools" to "ORS Tools"? I had trouble finding the plugin the first time..

Join fields from source point table to isochrones

Would it be possible for isochrones to have joined data from the points used to create the #isochrones?

For example, if you create isochrones around points in a layer containing many points then you get a table containing many isochrones but nothing to indicate which one applies to which point in the source table. The only way is to eyeball them but this makes additional analysis difficult if there are a large number of points and is difficult to tell which point the isochrone is for if you have a large isochrone that could be one of two points that are close together.

Few to-dos

  • Programmatically avoid server limitations of 40 req/minute
  • Finally get rid of 'Bad file descriptor' error for 'print req' in all modules
  • Also get rid of 'overlap' option: too time intense to incorporate and not of much use

OSMTools via Proxy?!

It looks like OSMTools don't work in a proxy server environment.
Would it be possible for the plugin to use the proxy settings configured in the QGIS Network Settings?
Or is there already a workaround?

Maybe one of the following is useful?
https://qgis.org/api/classQgsNetworkAccessManager.html
https://geogear.wordpress.com/2014/04/12/setting-proxy-parameter-in-qgis-plugins-how-to/

Error Message:
"...requests.exceptions.ConnectionError: HTTPSConnectionPool(host='api.openrouteservice.org', port=443): Max retries exceeded with url: /geocoding?location=9.16237%2C48.77638&api_key=[XXX] (Caused by NewConnectionError('<urllib3.connection.VerifiedHTTPSConnection object at 0x00000000056724E0>: Failed to establish a new connection: [Errno 11004] getaddrinfo failed',))..."

Invalid coordinates for geocoding

Hi
Can someone explain why I'm getting the python error 'invalid coordinates for geo-referencing' please?
I'm using an easting/northing such as 293427, 91642. The error message is below.
i'm using OSM Tools 3.1 in QGIS 3.0.2
Thanks in advance for any help.
David

An error has occurred while executing Python code:

ValueError: Your input coordinates are invalid for geocoding.
Traceback (most recent call last):
File "C:\PROGRA1\QGIS31.0\apps\Python36\lib\site-packages\urllib3\connection.py", line 141, in _new_conn
(self.host, self.port), self.timeout, **extra_kw)
File "C:\PROGRA1\QGIS31.0\apps\Python36\lib\site-packages\urllib3\util\connection.py", line 83, in create_connection
raise err
File "C:\PROGRA1\QGIS31.0\apps\Python36\lib\site-packages\urllib3\util\connection.py", line 73, in create_connection
sock.connect(sa)
TimeoutError: [WinError 10060] A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "C:\PROGRA1\QGIS31.0\apps\Python36\lib\site-packages\urllib3\connectionpool.py", line 601, in urlopen
chunked=chunked)
File "C:\PROGRA1\QGIS31.0\apps\Python36\lib\site-packages\urllib3\connectionpool.py", line 346, in _make_request
self._validate_conn(conn)
File "C:\PROGRA1\QGIS31.0\apps\Python36\lib\site-packages\urllib3\connectionpool.py", line 850, in _validate_conn
conn.connect()
File "C:\PROGRA1\QGIS31.0\apps\Python36\lib\site-packages\urllib3\connection.py", line 284, in connect
conn = self._new_conn()
File "C:\PROGRA1\QGIS31.0\apps\Python36\lib\site-packages\urllib3\connection.py", line 150, in _new_conn
self, "Failed to establish a new connection: %s" % e)
urllib3.exceptions.NewConnectionError: : Failed to establish a new connection: [WinError 10060] A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "C:\PROGRA1\QGIS31.0\apps\Python36\lib\site-packages\requests\adapters.py", line 440, in send
timeout=timeout
File "C:\PROGRA1\QGIS31.0\apps\Python36\lib\site-packages\urllib3\connectionpool.py", line 639, in urlopen
_stacktrace=sys.exc_info()[2])
File "C:\PROGRA1\QGIS31.0\apps\Python36\lib\site-packages\urllib3\util\retry.py", line 388, in increment
raise MaxRetryError(_pool, url, error or ResponseError(cause))
urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='api.openrouteservice.org', port=443): Max retries exceeded with url: /geocoding?location=298938.05073099415%2C92780.57010551741&api_key=58d904a497c67e00015b45fc8bbc42b08cd34a23a92f5f00a69e3383 (Caused by NewConnectionError(': Failed to establish a new connection: [WinError 10060] A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond',))

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "C:/Users/lewisd/AppData/Roaming/QGIS/QGIS3\profiles\default/python/plugins\OSMtools\geocode.py", line 17, in reverse_geocode
response = client.request('/geocoding', params)['features'][0]
File "C:/Users/lewisd/AppData/Roaming/QGIS/QGIS3\profiles\default/python/plugins\OSMtools\client.py", line 148, in request
**final_requests_kwargs)
File "C:\PROGRA1\QGIS31.0\apps\Python36\lib\site-packages\requests\sessions.py", line 521, in get
return self.request('GET', url, **kwargs)
File "C:\PROGRA1\QGIS31.0\apps\Python36\lib\site-packages\requests\sessions.py", line 508, in request
resp = self.send(prep, **send_kwargs)
File "C:\PROGRA1\QGIS31.0\apps\Python36\lib\site-packages\requests\sessions.py", line 618, in send
r = adapter.send(request, **kwargs)
File "C:\PROGRA1\QGIS31.0\apps\Python36\lib\site-packages\requests\adapters.py", line 508, in send
raise ConnectionError(e, request=request)
requests.exceptions.ConnectionError: HTTPSConnectionPool(host='api.openrouteservice.org', port=443): Max retries exceeded with url: /geocoding?location=298938.05073099415%2C92780.57010551741&api_key=58d904a497c67e00015b45fc8bbc42b08cd34a23a92f5f00a69e3383 (Caused by NewConnectionError(': Failed to establish a new connection: [WinError 10060] A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond',))

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "C:/Users/lewisd/AppData/Roaming/QGIS/QGIS3\profiles\default/python/plugins\OSMtools\dialog.py", line 284, in _writeCoordinateLabel
point)
File "C:/Users/lewisd/AppData/Roaming/QGIS/QGIS3\profiles\default/python/plugins\OSMtools\geocode.py", line 19, in reverse_geocode
raise ValueError("Your input coordinates are invalid for geocoding.")
ValueError: Your input coordinates are invalid for geocoding.

Python version: 3.6.0 (v3.6.0:41df79263a11, Dec 23 2016, 07:18:10) [MSC v.1900 32 bit (Intel)]
QGIS version: 3.0.2-Girona Girona, 307d082e3d

Python Path:
C:/PROGRA1/QGIS31.0/apps/qgis/./python
C:/Users/lewisd/AppData/Roaming/QGIS/QGIS3\profiles\default/python
C:/Users/lewisd/AppData/Roaming/QGIS/QGIS3\profiles\default/python/plugins
C:/PROGRA1/QGIS31.0/apps/qgis/./python/plugins
C:\Program Files\QGIS 3.0\bin\python36.zip
C:\PROGRA1\QGIS31.0\apps\Python36\DLLs
C:\PROGRA1\QGIS31.0\apps\Python36\lib
C:\Program Files\QGIS 3.0\bin
C:\PROGRA1\QGIS31.0\apps\Python36
C:\PROGRA1\QGIS31.0\apps\Python36\lib\site-packages
C:\PROGRA1\QGIS31.0\apps\Python36\lib\site-packages\win32
C:\PROGRA1\QGIS31.0\apps\Python36\lib\site-packages\win32\lib
C:\PROGRA1\QGIS31.0\apps\Python36\lib\site-packages\Pythonwin
C:/Users/lewisd/AppData/Roaming/QGIS/QGIS3\profiles\default/python
C:\Users\lewisd\AppData\Roaming\QGIS\QGIS3\profiles\default\python\plugins
C:\Users\lewisd\AppData\Roaming\QGIS\QGIS3\profiles\default\python\plugins
N:/Delivery - Contracting and BI/Information/Urgent Care/QGIS/Projects/MIU attendances

Isochrones Ranges

I'd like to create isochrones from point layer for foot-walking distances with less than 1 km - e.g. 600m

I get an error with 0.6 and 0,6 creates 6km isochromes, cause the comma is used as a seperator.

How do can I do it correctly?

Thanks
Sebastian

IndexError: list index out of range

Hi,
performing an accessibility calculation I always get a python error. It happens if I use the 'Map now!' (with a sligthly different error msg) and when using a point layer.

As the error's result one gets a broken dissolve layer with one entry only.

If you need further clearification please let me know.
BR

`Ein Fehler trat bei der Ausführung von Python-Code auf:

IndexError: list index out of range
Traceback (most recent call last):
File "C:/Users/USERNAME/.qgis2/python/plugins\OSMtools\osm_tools_access.py", line 243, in pointAnalysis
self.dissolveFields(layer_out, fields_diss)
File "C:/Users/USERNAME/.qgis2/python/plugins\OSMtools\osm_tools_access.py", line 308, in dissolveFields
layer_dissolved = QgsMapLayerRegistry.instance().mapLayersByName("Dissolved")[-1]
IndexError: list index out of range

Python-Version: 2.7.5 (default, May 15 2013, 22:44:16) [MSC v.1500 64 bit (AMD64)]
QGIS-Version: 2.18.6 Las Palmas, 5f369b0 `

OSM tools not working - Python Error

Hi there,

OSM tools hasn't been working for me and my colleagues for some time recently. I get the following error. Could you help me with that? I tried to run OSM tools in different versions of QGIS (2.14, 2.18 and 3.2).

Thank you,

Panos

2018-07-02T16:30:55 WARNING Traceback (most recent call last):
File "C:/Users/Panos Floros/AppData/Roaming/QGIS/QGIS3\profiles\default/python/plugins\OSMtools\geocode.py", line 17, in reverse_geocode
response = client.request('/geocoding', params)['features'][0]
File "C:/Users/Panos Floros/AppData/Roaming/QGIS/QGIS3\profiles\default/python/plugins\OSMtools\client.py", line 162, in request
result = self._get_body(response)
File "C:/Users/Panos Floros/AppData/Roaming/QGIS/QGIS3\profiles\default/python/plugins\OSMtools\client.py", line 185, in get_body
body = response.json()
File "C:\PROGRA1\QGIS31.2\apps\Python36\lib\site-packages\requests\models.py", line 892, in json
return complexjson.loads(self.text, **kwargs)
File "C:\PROGRA1\QGIS31.2\apps\Python36\lib\site-packages\simplejson_init
.py", line 516, in loads
return _default_decoder.decode(s)
File "C:\PROGRA1\QGIS31.2\apps\Python36\lib\site-packages\simplejson\decoder.py", line 377, in decode
raise JSONDecodeError("Extra data", s, end, len(s))
simplejson.scanner.JSONDecodeError: Extra data: line 1 column 5 - line 2 column 1 (char 4 - 19)

         During handling of the above exception, another exception occurred:
         
         Traceback (most recent call last):
          File "C:/Users/Panos Floros/AppData/Roaming/QGIS/QGIS3\profiles\default/python/plugins\OSMtools\dialog.py", line 284, in _writeCoordinateLabel
          point)
          File "C:/Users/Panos Floros/AppData/Roaming/QGIS/QGIS3\profiles\default/python/plugins\OSMtools\geocode.py", line 19, in reverse_geocode
          raise ValueError("Your input coordinates are invalid for geocoding.")
         ValueError: Your input coordinates are invalid for geocoding.

ORS Routing seems to result in Python Error

I ve tried running on a number of machines with different versions of QGIS (2.18.16 and QGIS 3.0.0), but this seems to crash out.

2018-03-16T12:09:46 1 Traceback (most recent call last):
File "C:/Users/Ian/.qgis2/python/plugins\OSMtools\osm_tools.py", line 144, in run
route.directions_calc()
File "C:/Users/Ian/.qgis2/python/plugins\OSMtools\directions.py", line 137, in directions_calc
layer_out = self._addLine(responses, values_list)
File "C:/Users/Ian/.qgis2/python/plugins\OSMtools\directions.py", line 183, in _addLine
values_list[i][0],
IndexError: list index out of range

python errors since upgraded tool to current version

First of all many thanks for introducing this very useful tool. Since about a week or two I get python errors when using the tool. Before I upgraded the tool to the currenr version it worked like a charm. I get errors not always but most times. Im now on QGIS 2.18.14, as it happened at 2.18.13,. I also tried long term QGIS release 2.14.20, same thing. As I recently upgraded OSM Tools from 0.3 to 0.3.4 I also tried to downgrade to various versions, no change, it still happens.

Here the trace:
2017-10-30T14:07:11 1 Traceback (most recent call last):

File "C:/Users/User/.qgis2/python/plugins\OSMtools\osm_tools.py", line 265, in run
self.route_anal.route()
File "C:/Users/User/.qgis2/python/plugins\OSMtools\osm_tools_routing.py", line 223, in route
loc_dict = point_geo.reverseGeocode(point_geom)
File "C:/Users/User/.qgis2/python/plugins\OSMtools\osm_tools_geocode.py", line 38, in reverseGeocode
root = json.loads(response.text)
File "C:\PROGRA1\QGIS21.18\apps\Python27\lib\json_init
.py", line 338, in loads
return _default_decoder.decode(s)
File "C:\PROGRA1\QGIS21.18\apps\Python27\lib\json\decoder.py", line 365, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "C:\PROGRA1\QGIS21.18\apps\Python27\lib\json\decoder.py", line 383, in raw_decode
raise ValueError("No JSON object could be decoded")
ValueError: No JSON object could be decoded

I appreciate your help. What else can I do to fix the issue?
Thanks again and best regards from Germany.

Provide error logs and prevent freezing system for ORS internal errors

Hi. I really like this API, thanks!

I'm trying to use the route (row to row) between 1000 points that are in a city, so not that far away from each others.
When opting for driving and walking regular, the fastest and the shortest, runs with no problem.
When I choose cycling regular (fastest or shortest), it starts to run, and then it gets stuck forever in the message "Requesting analysis from ORS...", at 16%.
I can see it using the quota of 40/min on my user dashboard, every time I refresh it ads more, but it gets stuck at 362.
It is not a quota problem, I'm waiting more than 1 day to run it.

Do you know what it may be, if that transportation mode has another requirements different than car or walk?

Routing output Lat/Long missing

First of all thanks for the new version! After upgrade from v.0.3.4 to 2.1 the last 4 output fields (old version) are missing: FROM_LAT;FROM-LONG;TO_LAT and TO_LONG.
I realized the 4 Lines of code in previous osm_tools_routing.py are missing in current directions.py.

Is this change intentionally and possibly related to the "new" behaviour in FROM_ID and TO_ID ?

FROM_ID und TO_ID are now obviously set to a location. However, the given locations dont seem to be correct, as they are not related to the "from map" clicked coordinates.

I'm currently still on QGIS 2.x

Is this change intentionally? Thanks.

Reproject in case of file CRS != WGS84

Current: warning is printed to QGIS message bar and program terminates if input point files have a CRS different from WGS84

Improvement: Reproject geometries to WGS84 and continue program

Implement accessibility areas by distance

Hello,
will it be possible to get accessibility areas calculated by distance in the future too? One could plan trips like me for example for my kids: what children playgrounds do I reach within 5/10/15 km radius?

Best Regards,

Visualising isochrones layers from result

Hi Nils,
Thanks for developing the tool. Is it possible for you to outline how to format the resulting .shp file which gives the distance to end up with distinct banding. I've tried adding in columns by concatenating the integer value with another field to create a label for the band but I'm not sure if its the best way and if it can then be used to intersect with other point layers

Routing Error OSM tools

Hi Nils!!! Greetings from Mexico!

I´m using the OSM TOOLS plugin in QGIS and I want to calculate the routes between a layer whith 125 origins and a layer with 125 destinations (both layers are points and the fields are: id, lat, long) but when I run the task it appears the next warning:

"IndexError: list index out of range
Traceback (most recent call last):
File "C:/Users/josue.gonzalez/.qgis2/python/plugins\OSMtools\osm_tools.py", line 144, in run
route.directions_calc()
File "C:/Users/josue.gonzalez/.qgis2/python/plugins\OSMtools\directions.py", line 137, in directions_calc
layer_out = self._addLine(responses, values_list)
File "C:/Users/josue.gonzalez/.qgis2/python/plugins\OSMtools\directions.py", line 183, in _addLine
values_list[i][0],
IndexError: list index out of range"

How can I solve this? Thank you very much!!!

Baruc

IndexError: list index out of range

Hallo,
I've got my own API. When I am doing accessibility areas there appear an error:

2017-05-19T13:11:00 1 Traceback (most recent call last):
File "C:/Users/Sonia/.qgis2/python/plugins\OSMtools\osm_tools_access.py", line 243, in pointAnalysis
self.dissolveFields(layer_out, fields_diss)
File "C:/Users/Sonia/.qgis2/python/plugins\OSMtools\osm_tools_access.py", line 308, in dissolveFields
layer_dissolved = QgsMapLayerRegistry.instance().mapLayersByName("Dissolved")[-1]
IndexError: list index out of range

What does it mean? Despite this, accessibility areas are on the map.

Corrupt Extension

When I want to install the extension, the following message appears : "No module named shapely.geometry"

Isochrone measurement to allow the use of non-integer

When selecting the Isochrone unit (time or distance), I’ve tried to select distance and use 0.4km to reflect a 400m walk catchment but the plugin freezes - I understand that this is because it requires integer values (i.e. at least 1 minute or 1km). For example it would be great to be able to use 0.4km to reflect a 400m walk distance.
Thanks

provide processing algorithms

Is there a way to use this plugin (fetch isochrones) from other python code?

If not, the cleanest way would be to encapsulate the API-fetch and data transformation in an processing provider.
I would do this myself, but I do not understand the program flow yet:
The request logic seems to be in accRequest(), which is called from iterAnalysis(). Can accRequest() be called with any list of QgsGeometry, or are there additional preconditions?

ValueError: could not convert string to float: Long

Tried to open the menu, received this error:
configuration: QGIS 2.16.2
windows 7, 64bit
just one layer:

  1. Layer called cities (attributes: ID, name)

Project was in CRS 4326

Traceback (most recent call last):
File "C:/Users/rikl/.qgis2/python/plugins\OSMtools\osm_tools.py", line 233, in run
self.route_anal.route()
File "C:/Users/rikl/.qgis2/python/plugins\OSMtools\osm_tools_routing.py", line 228, in route
point_list = [float(x) for x in start_features[0].split(",")]
ValueError: could not convert string to float: Long

But I was not able te replicate the error.

QGIS python error

I'm using the tool via QGIS, and I'm getting this error. any insights on this? thx
Traceback (most recent call last):
File "C:/-----/.qgis2/python/plugins\OSMtools\osm_tools.py", line 262, in run
self.access_anal.iterAnalysis()
File "C:/----/.qgis2/python/plugins\OSMtools\osm_tools_access.py", line 382, in iterAnalysis
feat_list, isochrone_list = self.accRequest(feat_in_list)
TypeError: 'NoneType' object is not iterable

intervals are not part of the attributes list

Hi Nils,

first: great job! Unfortunately your isochrone analysis does not reflect intervals in the polygon layer. I would assume to see a polygon for each intervall. At the moment it is just one single polygon.
grafik

distinct isochrones for multiple points

When requesting isochrones of more than one center point, they may overlap.
Most notably, areas with a low timecost may be "shadowed" by areas with a higher cost from a different point. This makes the data unusable for further analysis.

To solve this I manually ran the following process, but it would be better if this was automated and enabled by default:

  • split the layer into multiple layers grouped by AA_MIN column
  • calculate geometric difference between each resulting layer, resulting in non-overlapping polygons
  • dissolve each resulting layer to merge adjacent polygons
  • merge those layers back into one

edit: I believe this is what was requested in #26 as well.

empty toolbar

At least in the QGIS 2 version, an "OSMtools" toolbar is created, but the plugin button is added to the standard "plugins" toolbar.
screenshot from 2018-03-14 11-07-53

idk about best practices with qgis toolbars, but creating one toolbar for each plugin seems not optimal anyway, maybe consider the "web" or "plugins" toolbar?

Extra data error when trying routing.

An error has occurred while executing Python code:

JSONDecodeError: Extra data: line 1 column 5 - line 2 column 1 (char 4 - 19)
Traceback (most recent call last):
File "C:/Users/Ian Kirk-Ellis/.qgis2/python/plugins\OSMtools\osm_tools.py", line 144, in run
route.directions_calc()
File "C:/Users/Ian Kirk-Ellis/.qgis2/python/plugins\OSMtools\directions.py", line 88, in directions_calc
route_dict = self._selectInput()
File "C:/Users/Ian Kirk-Ellis/.qgis2/python/plugins\OSMtools\directions.py", line 235, in _selectInput
response_dict = geocode.reverse_geocode(self.client, *point_geom)
File "C:/Users/Ian Kirk-Ellis/.qgis2/python/plugins\OSMtools\geocode.py", line 17, in reverse_geocode
response = client.request('/geocoding', params)['features'][0]
File "C:/Users/Ian Kirk-Ellis/.qgis2/python/plugins\OSMtools\client.py", line 162, in request
result = self._get_body(response)
File "C:/Users/Ian Kirk-Ellis/.qgis2/python/plugins\OSMtools\client.py", line 185, in get_body
body = response.json()
File "C:\PROGRA1\QGIS21.18\apps\Python27\lib\site-packages\requests\models.py", line 892, in json
return complexjson.loads(self.text, **kwargs)
File "C:\PROGRA1\QGIS21.18\apps\Python27\lib\site-packages\simplejson_init.py", line 488, in loads
return _default_decoder.decode(s)
File "C:\PROGRA1\QGIS21.18\apps\Python27\lib\site-packages\simplejson\decoder.py", line 373, in decode
raise JSONDecodeError("Extra data", s, end, len(s))
JSONDecodeError: Extra data: line 1 column 5 - line 2 column 1 (char 4 - 19)

Python version: 2.7.5 (default, May 15 2013, 22:44:16) [MSC v.1500 64 bit (AMD64)]
QGIS version: 2.18.17 Las Palmas, 98e769f70e

Python Path:
C:/PROGRA1/QGIS21.18/apps/qgis-ltr/./python/plugins\processing
C:/PROGRA1/QGIS21.18/apps/qgis-ltr/./python
C:/Users/Ian Kirk-Ellis/.qgis2/python
C:/Users/Ian Kirk-Ellis/.qgis2/python/plugins
C:/PROGRA1/QGIS21.18/apps/qgis-ltr/./python/plugins
C:\PROGRA1\QGIS21.18\bin\python27.zip
C:\PROGRA1\QGIS21.18\apps\Python27\DLLs
C:\PROGRA1\QGIS21.18\apps\Python27\lib
C:\PROGRA1\QGIS21.18\apps\Python27\lib\plat-win
C:\PROGRA1\QGIS21.18\apps\Python27\lib\lib-tk
C:\PROGRA1\QGIS21.18\bin
C:\PROGRA1\QGIS21.18\apps\Python27
C:\PROGRA1\QGIS21.18\apps\Python27\lib\site-packages
C:\PROGRA1\QGIS21.18\apps\Python27\lib\site-packages\jinja2-2.7.2-py2.7.egg
C:\PROGRA1\QGIS21.18\apps\Python27\lib\site-packages\markupsafe-0.23-py2.7-win-amd64.egg
C:\PROGRA1\QGIS21.18\apps\Python27\lib\site-packages\win32
C:\PROGRA1\QGIS21.18\apps\Python27\lib\site-packages\win32\lib
C:\PROGRA1\QGIS21.18\apps\Python27\lib\site-packages\Pythonwin
C:\PROGRA1\QGIS21.18\apps\Python27\lib\site-packages\Shapely-1.2.18-py2.7-win-amd64.egg
C:\PROGRA1\QGIS21.18\apps\Python27\lib\site-packages\wx-2.8-msw-unicode
C:\PROGRA1\QGIS21.18\apps\Python27\lib\site-packages\xlrd-0.9.2-py2.7.egg
C:\PROGRA1\QGIS21.18\apps\Python27\lib\site-packages\xlwt-0.7.5-py2.7.egg
C:/Users/Ian Kirk-Ellis/.qgis2//python
C:/Users/Pedro/.qgis2/python/plugins/AequilibraE/
C:\Users\Ian Kirk-Ellis.qgis2\python\plugins\AequilibraE
C:\Users\Ian Kirk-Ellis.qgis2\python\plugins\AequilibraE
C:\Users\Ian Kirk-Ellis.qgis2\python\plugins\AequilibraE
C:\Users\Ian Kirk-Ellis.qgis2\python\plugins\AequilibraE\paths_procedures/aequilibrae/
C:/Users/Ian Kirk-Ellis/.qgis2/python/plugins\NNJoin
C:\Users\Ian Kirk-Ellis.qgis2\python\plugins\SelectTools/tools
C:/Users/Ian Kirk-Ellis/Dropbox (ADC Infrastructure)/!!! ADC Projects/ADC1739 Litecast, Ansley Common/Calculations/GIS

Problems with OSM tools when using point files as input

Hi Nils,

I've been trying to use the OSM tools plugin to calculate accessibility areas around points in a point shapefile. The tool works perfectly if I pick the "map now" option and choose a single location. If I put in a point shapefile I get the following error message:

2017-06-20T21:53:44 1 Traceback (most recent call last):
File "C:/Users/Smiths/.qgis2/python/plugins\OSMtools\osm_tools.py", line 231, in run
self.access_anal.iterAnalysis()
File "C:/Users/Smiths/.qgis2/python/plugins\OSMtools\osm_tools_access.py", line 350, in iterAnalysis
feat_list, isochrone_list = self.accRequest(feat_in_list)
File "C:/Users/Smiths/.qgis2/python/plugins\OSMtools\osm_tools_access.py", line 170, in accRequest
print req
IOError: [Errno 9] Bad file descriptor

Similarly, the routing tool works fine if I use the tool to plot start and finish locations, but if I put in a point shapefile as the origin or destination I get the following error:

HTTP status 500: ('internal_server_error', 'server_error', '/o\', '\xe2\x9c\x97')
Get request: https://api.openrouteservice.org/directions?api_key=58d904a497c67e00015b45fcc61ee17f1da9474f716f988437760160&coordinates=-1.82524,54.93755|-6.30889033497,49.9126357934&profile=driving-car&preference=fastest&instructions=False&geometry_format=geojson&units=m

Cheers, Jo

Multiple runs Issue: ZeroDivisionError: float division by zero

I am trying to determine the accessibility isochrones of several points in QGIS, either at the same time or one at a time, but every time I try and do this, I get the following error:
Traceback (most recent call last):
File "/Users/[username]/.qgis2/python/plugins/OSMtools/osm_tools_access.py", line 91, in valueChanged
self.iso_amount = ceil(self.dlg.iso_max.value()/self.dlg.iso_int.value())
ZeroDivisionError: float division by zero

I am able to use OSM tools to determine the isochrones of points, but only if I close out of my map and reopen it after each point. Is there a way to analyse multiple points more efficiently without having to reopen the programme after each run?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.