A fast, offline reverse geocoder in Python

Overview

Reverse Geocoder

A Python library for offline reverse geocoding. It improves on an existing library called reverse_geocode developed by Richard Penman.

UPDATE (15-Sep-16): v1.5.1 released! See release notes below.

About

Ajay Thampi | @thampiman | opensignal.com | ajaythampi.com

Features

  1. Besides city/town and country code, this library also returns the nearest latitude and longitude and also administrative regions 1 and 2.
  2. This library also uses a parallelised implementation of K-D trees which promises an improved performance especially for large inputs.

By default, the K-D tree is populated with cities that have a population > 1000. The source of the data is GeoNames. You can also load a custom data source so long as it is a comma-separated file with header (like rg_cities1000.csv), containing the following columns:

  • lat: Latitude
  • lon: Longitude
  • name: Name of place
  • admin1: Admin 1 region
  • admin2: Admin 2 region
  • cc: ISO 3166-1 alpha-2 country code

For usage instructions, see below.

Installation

For first time installation,

$ pip install reverse_geocoder

Or upgrade an existing installation using,

$ pip install --upgrade reverse_geocoder

Package can be found on PyPI.

Dependencies

  1. scipy
  2. numpy

Release Notes

  1. v1.0 (27-Mar-15) - First version with support for only Python2
  2. v1.1 (28-Mar-15) - Fix for issue #1 by Brandon
  3. v1.2 (30-Mar-15) - Support for Python 3, conversion of Geodetic coordinates to ECEF for use in K-D trees to find nearest neighbour using the Euclidean distance function. This release fixes issues #2 and #8. Special thanks to David for his help in partly fixing #2.
  4. v1.3 (11-Apr-15) - This release fixes issues #9, #10, #11 and #12. License has been changed from MIT to LGPL (see #12).
  5. v1.4 (08-Jul-16) - Included numpy and scipy as dependencies in setup.
  6. v1.5 (15-Sep-16) - Support for custom data source and fixes for issues #16 and #24. Hat tip to Jason and Gregoire.
  7. v1.5.1 (15-Sep-16) - Fix for #26.

Usage

The library supports two modes:

  1. Mode 1: Single-threaded K-D Tree (similar to reverse_geocode)
  2. Mode 2: Multi-threaded K-D Tree (default)
import reverse_geocoder as rg

coordinates = (51.5214588,-0.1729636),(9.936033, 76.259952),(37.38605,-122.08385)

results = rg.search(coordinates) # default mode = 2

print results

The above code will output the following:

	[{'name': 'Bayswater', 
      'cc': 'GB', 
      'lat': '51.51116',
      'lon': '-0.18426', 
      'admin1': 'England', 
      'admin2': 'Greater London'}, 
     {'name': 'Cochin', 
      'cc': 'IN', 
      'lat': '9.93988',
      'lon': '76.26022', 
      'admin1': 'Kerala', 
      'admin2': 'Ernakulam'},
     {'name': 'Mountain View', 
      'cc': 'US', 
      'lat': '37.38605',
      'lon': '-122.08385', 
      'admin1': 'California', 
      'admin2': 'Santa Clara County'}]

If you'd like to use the single-threaded K-D tree, set mode = 1 as follows:

results = rg.search(coordinates,mode=1)

To use a custom data source for geocoding, you can load the file in-memory and pass it to the library as follows:

import io
import reverse_geocoder as rg

geo = rg.RGeocoder(mode=2, verbose=True, stream=io.StringIO(open('custom_source.csv', encoding='utf-8').read()))
coordinates = (51.5214588,-0.1729636),(9.936033, 76.259952),(37.38605,-122.08385)
results = geo.query(coordinates)

As mentioned above, the custom data source must be comma-separated with a header as rg_cities1000.csv.

Performance

The performance of modes 1 and 2 are plotted below for various input sizes.

Performance Comparison

Mode 2 runs ~2x faster for very large inputs (10M coordinates).

Acknowledgements

  1. Major inspiration is from Richard Penman's reverse_geocode library
  2. Parallelised implementation of K-D Trees is extended from this article by Sturla Molden
  3. Geocoded data is from GeoNames

License

Copyright (c) 2015 Ajay Thampi and contributors. This code is licensed under the LGPL License.

Comments
  • San Francisco shows up as San Ramon

    San Francisco shows up as San Ramon

    Hello, this might be in the hands of the CSV file, but it may also be a bug.

    I looked in the CSV file and found San Ramon,California and San Francisco,California. I also have my coordinates that come up as San Ramon, even though they are in San Francisco.

    37.78674,-122.39222,ME
    37.77493,-122.41942,San Francisco,California,San Francisco County,US
    37.77993,-121.97802,San Ramon,California,Contra Costa County,US
    

    The "ME" point is closer to San Francisco, it shows up as San Ramon. See this image:

    ME is blue. San Francisco is green. San Ramon is red.

    screen shot 2015-04-01 at 11 33 58 pm

    I understand that coordinates are not in a 2d space, but is there something about the math that is making ME show up as San Ramon?

    >>> reverse_geocoder.search([(37.78674,-122.39222)])
    [{'name': 'San Ramon', 'cc': 'US', 'lon': '-121.97802', 'admin1': 'California', 'admin2': 'Contra Costa County', 'lat': '37.77993'}]
    

    Thank you.

    opened by rchrd2 7
  • OverflowError: Python int too large to convert to C long

    OverflowError: Python int too large to convert to C long

    When I try to run the module in python 3.0 and up version, it will return an error:OverflowError: Python int too large to convert to C long. However, it should be fine when I run in python 2.0 and up 2.7 version.

    opened by DataMonk2017 4
  • creating rg_cities1000.csv

    creating rg_cities1000.csv

    Hi, thanks for this library. Is the script to create the data file from a GeoNames dump available? The one committed seems to be missing some United States cities e.g. this lookup for a point in NYC:

    >>> reverse_geocoder.search([(40.729177554196376,-73.99343490600586)])
    [{'name': 'Byram', 'cc': 'US', 'lon': '-73.65374', 'admin1': 'Connecticut', 'admin2': 'Fairfield County', 'lat': '41.00426'}]
    
    opened by bdon 3
  • Add requirements.txt

    Add requirements.txt

    Please add a requirements.txt file containing the depencies used otherwise we have to manually add them in our requirements file and it becomes tedious.

    scipy==0.17.1
    numpy==1.11.0
    

    Now I haz go to wait for 30 minutes for docker-compose to build my images again :+1: Thanks for the lib anways its really great and better than most revese geocoders I've seen

    opened by pyrossh 2
  • Scipy requirement not documented.

    Scipy requirement not documented.

       from scipy.spatial import cKDTree as KDTree
    ImportError: No module named scipy.spatial
    

    But even after installing scypi with pip, I still get the error.

    pip install scipy
    

    --Edit-- The pip install is failing on my vagrant. Investigating. numpy.distutils.system_info.NotFoundError: no lapack/blas resources found

    In either case, it would be useful for the need for scipy to be documented in the README or included in the setup.py.

    opened by rchrd2 2
  • Fix missing rows from GeoNames cities1000.txt.

    Fix missing rows from GeoNames cities1000.txt.

    This fixes the parsing of the geonames CSV, you can reproduce the problem like this

    import csv
    import sys
    csv.field_size_limit(sys.maxsize)
    count1 = 0
    count2 = 0
    count3 = 0
    for row in open('cities1000.txt','rb'):
      count1 = count1 + 1
    for row in csv.reader(open('cities1000.txt','rb'),delimiter='\t'):
      count2 = count2 + 1
    for row in csv.reader(open('cities1000.txt','rb'),delimiter='\t',quoting=csv.QUOTE_NONE):
      count3 = count3 + 1
    print count1, count2, count3
    

    outputs

    144348 138630 144348
    

    adding the quoting option corrects the 6000+ missing rows in the final csv.

    opened by bdon 2
  • Performing multiple queries without initialisation overhead.

    Performing multiple queries without initialisation overhead.

    Hi. I am using reverse_geocoder inside an Apache Spark job on a couple of million entries.

    Due to the nature of map reduce jobs, it will be a lot easier to call rg.search() on a single coordinate a million times, rather than calling it once with a list of million coordinates.

    However, due to the nature of how the Geocoder is initialised, the overhead from re-initialising makes it much slower (infeasibly so).

    While there are tricks to get around that, it is creating a lot of headaches, so my question is, it it possible to initialise and instance of the geocoder once and have it run N times on one entry with roughly the same performance it would if ran one time on N entries.

    If not, are there any plans for including that? Thanks!

    opened by malreynolds 1
  • Windows Python 3.5 freeze support issue

    Windows Python 3.5 freeze support issue

    mode=1 works ok.

    mode=2 RuntimeError: An attempt has been made to start a new process before the current process has finished its bootstrapping phase.

        This probably means that you are not using fork to start your
        child processes and you have forgotten to use the proper idiom
        in the main module:
    
            if __name__ == '__main__':
                freeze_support()
                ...
    
    opened by apiszcz 1
  • strange behaviour with reverse_geocode and requirement.txt

    strange behaviour with reverse_geocode and requirement.txt

    ok this is really strange for me, this is my requirements.txt file

    numpy
    scipy
    reverse_geocoder
    

    pip install -r throws this error

    Collecting numpy (from -r a.txt (line 1))
      Using cached numpy-1.11.1-cp27-cp27mu-manylinux1_x86_64.whl
    Collecting scipy (from -r a.txt (line 2))
      Using cached scipy-0.17.1-cp27-cp27mu-manylinux1_x86_64.whl
    Collecting reverse_geocoder (from -r a.txt (line 3))
      Using cached reverse_geocoder-1.4.tar.gz
        Complete output from command python setup.py egg_info:
        /tmp/easy_install-0Izs8j/scipy-0.18.0rc2/setup.py:322: UserWarning: Unrecognized setuptools command, proceeding with generating Cython sources and expanding templates
          warnings.warn("Unrecognized setuptools command, proceeding with "
        Traceback (most recent call last):
          File "<string>", line 1, in <module>
          File "/tmp/pip-build-CKf1DC/reverse-geocoder/setup.py", line 26, in <module>
            long_description=read('README.txt')
          File "/usr/lib/python2.7/distutils/core.py", line 111, in setup
            _setup_distribution = dist = klass(attrs)
          File "~/.virtualenvs/tmp-bc4c49e1bc2ee018/local/lib/python2.7/site-packages/setuptools/dist.py", line 348, in __init__
            self.fetch_build_eggs(attrs['setup_requires'])
          File "~/.virtualenvs/tmp-bc4c49e1bc2ee018/local/lib/python2.7/site-packages/setuptools/dist.py", line 394, in fetch_build_eggs
            replace_conflicting=True,
          File "~/.virtualenvs/tmp-bc4c49e1bc2ee018/local/lib/python2.7/site-packages/pkg_resources/__init__.py", line 826, in resolve
            dist = best[req.key] = env.best_match(req, ws, installer)
          File "~/.virtualenvs/tmp-bc4c49e1bc2ee018/local/lib/python2.7/site-packages/pkg_resources/__init__.py", line 1092, in best_match
            return self.obtain(req, installer)
          File "~/.virtualenvs/tmp-bc4c49e1bc2ee018/local/lib/python2.7/site-packages/pkg_resources/__init__.py", line 1104, in obtain
            return installer(requirement)
          File "~/.virtualenvs/tmp-bc4c49e1bc2ee018/local/lib/python2.7/site-packages/setuptools/dist.py", line 461, in fetch_build_egg
            return cmd.easy_install(req)
          File "~/.virtualenvs/tmp-bc4c49e1bc2ee018/local/lib/python2.7/site-packages/setuptools/command/easy_install.py", line 664, in easy_install
            return self.install_item(spec, dist.location, tmpdir, deps)
          File "~/.virtualenvs/tmp-bc4c49e1bc2ee018/local/lib/python2.7/site-packages/setuptools/command/easy_install.py", line 694, in install_item
            dists = self.install_eggs(spec, download, tmpdir)
          File "~/.virtualenvs/tmp-bc4c49e1bc2ee018/local/lib/python2.7/site-packages/setuptools/command/easy_install.py", line 875, in install_eggs
            return self.build_and_install(setup_script, setup_base)
          File "~/.virtualenvs/tmp-bc4c49e1bc2ee018/local/lib/python2.7/site-packages/setuptools/command/easy_install.py", line 1114, in build_and_install
            self.run_setup(setup_script, setup_base, args)
          File "~/.virtualenvs/tmp-bc4c49e1bc2ee018/local/lib/python2.7/site-packages/setuptools/command/easy_install.py", line 1100, in run_setup
            run_setup(setup_script, args)
          File "~/.virtualenvs/tmp-bc4c49e1bc2ee018/local/lib/python2.7/site-packages/setuptools/sandbox.py", line 249, in run_setup
            raise
          File "/usr/lib/python2.7/contextlib.py", line 35, in __exit__
            self.gen.throw(type, value, traceback)
          File "~/.virtualenvs/tmp-bc4c49e1bc2ee018/local/lib/python2.7/site-packages/setuptools/sandbox.py", line 197, in setup_context
            yield
          File "/usr/lib/python2.7/contextlib.py", line 35, in __exit__
            self.gen.throw(type, value, traceback)
          File "~/.virtualenvs/tmp-bc4c49e1bc2ee018/local/lib/python2.7/site-packages/setuptools/sandbox.py", line 168, in save_modules
            saved_exc.resume()
          File "~/.virtualenvs/tmp-bc4c49e1bc2ee018/local/lib/python2.7/site-packages/setuptools/sandbox.py", line 143, in resume
            six.reraise(type, exc, self._tb)
          File "~/.virtualenvs/tmp-bc4c49e1bc2ee018/local/lib/python2.7/site-packages/setuptools/sandbox.py", line 156, in save_modules
            yield saved
          File "~/.virtualenvs/tmp-bc4c49e1bc2ee018/local/lib/python2.7/site-packages/setuptools/sandbox.py", line 197, in setup_context
            yield
          File "~/.virtualenvs/tmp-bc4c49e1bc2ee018/local/lib/python2.7/site-packages/setuptools/sandbox.py", line 246, in run_setup
            DirectorySandbox(setup_dir).run(runner)
          File "~/.virtualenvs/tmp-bc4c49e1bc2ee018/local/lib/python2.7/site-packages/setuptools/sandbox.py", line 276, in run
            return func()
          File "~/.virtualenvs/tmp-bc4c49e1bc2ee018/local/lib/python2.7/site-packages/setuptools/sandbox.py", line 245, in runner
            _execfile(setup_script, ns)
          File "~/.virtualenvs/tmp-bc4c49e1bc2ee018/local/lib/python2.7/site-packages/setuptools/sandbox.py", line 47, in _execfile
            exec(code, globals, locals)
          File "/tmp/easy_install-0Izs8j/scipy-0.18.0rc2/setup.py", line 415, in <module>
    
          File "/tmp/easy_install-0Izs8j/scipy-0.18.0rc2/setup.py", line 395, in setup_package
    
        ImportError: No module named numpy.distutils.core
    
        ----------------------------------------
    Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-CKf1DC/reverse-geocoder/
    

    but when I install reverse-geocoder manually it works just fine :-|

    $ pip install numpy
    Collecting numpy
      Using cached numpy-1.11.1-cp27-cp27mu-manylinux1_x86_64.whl
    Installing collected packages: numpy
    Successfully installed numpy-1.11.1
    
    $ pip install scipy
    Collecting scipy
      Using cached scipy-0.17.1-cp27-cp27mu-manylinux1_x86_64.whl
    Installing collected packages: scipy
    Successfully installed scipy-0.17.1
    
    $ pip install reverse_geocoder
    Collecting reverse_geocoder
      Using cached reverse_geocoder-1.4.tar.gz
    Requirement already satisfied (use --upgrade to upgrade): numpy in ./lib/python2.7/site-packages (from reverse_geocoder)
    Requirement already satisfied (use --upgrade to upgrade): scipy in ./lib/python2.7/site-packages (from reverse_geocoder)
    Building wheels for collected packages: reverse-geocoder
      Running setup.py bdist_wheel for reverse-geocoder ... done
      Stored in directory: ~/.cache/pip/wheels/c8/57/b0/2fdff550c3ffa9f023792bd891b206e47c6d3b094a7562a122
    Successfully built reverse-geocoder
    Installing collected packages: reverse-geocoder
    Successfully installed reverse-geocoder-1.4
    

    extra info:

    Python 2.7.11+
    pip 8.1.2
    ubuntu 16.04
    
    Python 2.7.6
    pip 8.1.2
    ubuntu 14.04
    
    opened by aliva 1
  • Support for custom CSV datasource

    Support for custom CSV datasource

    I'm developing a project that requires me to be able to reverse geocode on different granularities (using the cities1000 dataset, plus a smaller dataset just of capital cities).

    For this, I've extended reverse_geocoder to allow me to specify a custom CSV datasource when instantiating the RGeocoder object.

    This has also required an extended @singleton decorator, that instantiates a single object per unique argument set (in this case, one per CSV input).

    It does not affect normal usage of the library.

    opened by ideoforms 1
  • Hello World Error

    Hello World Error

    After performing a "pip install"

    Open the python REPL and copy paste in the example in the README.md

    import reverse_geocoder as rg coords = (32.774185,-96.800618) results = rg.search(coords) Traceback (most recent call last): File "", line 1, in File "/Library/Python/2.7/site-packages/reverse_geocoder/init.py", line 194, in search return rg.query(geodetic_in_ecef(geo_coords)) File "/Library/Python/2.7/site-packages/reverse_geocoder/init.py", line 174, in geodetic_in_ecef lat = geo_coords[:,0] IndexError: too many indices

    opened by mooreed 1
  • `np.float` is a deprecated alias for the builtin `float`

    `np.float` is a deprecated alias for the builtin `float`

    Hi,

    In [1]: import numpy as np
    
    In [2]: np.__version__
    Out[2]: '1.24.0'
    
    In [3]: np.float(3)
    ---------------------------------------------------------------------------
    AttributeError                            Traceback (most recent call last)
    Cell In[3], line 1
    ----> 1 np.float(3)
    
    File ~/.pyenv/versions/3.10.6/lib/python3.10/site-packages/numpy/__init__.py:284, in __getattr__(attr)
        281     from .testing import Tester
        282     return Tester
    --> 284 raise AttributeError("module {!r} has no attribute "
        285                      "{!r}".format(__name__, attr))
    
    AttributeError: module 'numpy' has no attribute 'float'
    

    When we install the reverse-geocoder, we install the latest version of numpy. And unfortunately, we get an error. A simple solution to this is to change the requirements file pip install "numpy>=1.11.0, <1.24"

    In [2]: import numpy as np
    
    In [3]: np.__version__
    Out[3]: '1.23.5'
    
    In [4]: np.float(3)
    <ipython-input-4-8262e04d58e1>:1: DeprecationWarning: `np.float` is a deprecated alias for the builtin `float`. To silence this warning, use `float` by itself. Doing this will not modify any behavior and is safe. If you specifically wanted the numpy scalar type, use `np.float64` here.
    Deprecated in NumPy 1.20; for more details and guidance: https://numpy.org/devdocs/release/1.20.0-notes.html#deprecations
      np.float(3)
    Out[4]: 3.0
    
    opened by serhii73 0
  • Massive Error - Multiprocessing RunTime Error

    Massive Error - Multiprocessing RunTime Error

    I recently started working with a fresh install of reverse-geocoder, but every time I attempt to run a simple search of coordinates, it generates a massive traceback in console. It seems the error repeats several times before 'finishing' - by which I mean, the console spits out the location at the top of the location data file. I'm utilizing Python 3.10 in Spyder 5.2.2, all within Anaconda Navigator 2.2.0. My versions of scipy and numpy are 1.9.0 and 1.2.3.1, respectively.

    I appreciate any and all help or advice. Thank you in advance!

    [Loading formatted geocoded file...
    
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\multiprocessing\spawn.py", line 116, in spawn_main
        exitcode = _main(fd, parent_sentinel)
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\multiprocessing\spawn.py", line 125, in _main
        prepare(preparation_data)
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\multiprocessing\spawn.py", line 236, in prepare
        _fixup_main_from_path(data['init_main_from_path'])
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\multiprocessing\spawn.py", line 287, in _fixup_main_from_path
        main_content = runpy.run_path(main_path,
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\runpy.py", line 269, in run_path
        return _run_module_code(code, init_globals, run_name,
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\runpy.py", line 96, in _run_module_code
        _run_code(code, mod_globals, init_globals,
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\runpy.py", line 86, in _run_code
        exec(code, run_globals)
      File "C:\Users\USER1\Documents\Python Scripts\apis\tracker.py", line 102, in <module>
        x = rg.search((lon, lat))
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\site-packages\reverse_geocoder\__init__.py", line 293, in search
        return _rg.query(geo_coords)
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\site-packages\reverse_geocoder\__init__.py", line 127, in query
        _, indices = self.tree.pquery(coordinates, k=1)
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\site-packages\reverse_geocoder\cKDTree_MP.py", line 97, in pquery
        for p in pool: p.start()
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\multiprocessing\process.py", line 121, in start
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\multiprocessing\spawn.py", line 116, in spawn_main
        self._popen = self._Popen(self)
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\multiprocessing\context.py", line 224, in _Popen
        exitcode = _main(fd, parent_sentinel)
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\multiprocessing\spawn.py", line 125, in _main
        return _default_context.get_context().Process._Popen(process_obj)
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\multiprocessing\context.py", line 327, in _Popen
        prepare(preparation_data)
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\multiprocessing\spawn.py", line 236, in prepare
        return Popen(process_obj)
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\multiprocessing\popen_spawn_win32.py", line 45, in __init__
        _fixup_main_from_path(data['init_main_from_path'])
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\multiprocessing\spawn.py", line 287, in _fixup_main_from_path
        prep_data = spawn.get_preparation_data(process_obj._name)
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\multiprocessing\spawn.py", line 154, in get_preparation_data
        main_content = runpy.run_path(main_path,
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\runpy.py", line 269, in run_path
        _check_not_importing_main()
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\multiprocessing\spawn.py", line 134, in _check_not_importing_main
        return _run_module_code(code, init_globals, run_name,
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\runpy.py", line 96, in _run_module_code
        raise RuntimeError('''
    RuntimeError: 
            An attempt has been made to start a new process before the
            current process has finished its bootstrapping phase.
    
            This probably means that you are not using fork to start your
            child processes and you have forgotten to use the proper idiom
            in the main module:
    
                if __name__ == '__main__':
                    freeze_support()
                    ...
    
            The "freeze_support()" line can be omitted if the program
            is not going to be frozen to produce an executable.
        _run_code(code, mod_globals, init_globals,
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\runpy.py", line 86, in _run_code
        exec(code, run_globals)
      File "C:\Users\USER1\Documents\Python Scripts\apis\tracker.py", line 102, in <module>
        x = rg.search((lon, lat))
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\site-packages\reverse_geocoder\__init__.py", line 293, in search
        return _rg.query(geo_coords)
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\site-packages\reverse_geocoder\__init__.py", line 127, in query
        _, indices = self.tree.pquery(coordinates, k=1)
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\site-packages\reverse_geocoder\cKDTree_MP.py", line 97, in pquery
        for p in pool: p.start()
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\multiprocessing\process.py", line 121, in start
        self._popen = self._Popen(self)
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\multiprocessing\context.py", line 224, in _Popen
        return _default_context.get_context().Process._Popen(process_obj)
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\multiprocessing\context.py", line 327, in _Popen
        return Popen(process_obj)
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\multiprocessing\popen_spawn_win32.py", line 45, in __init__
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\multiprocessing\spawn.py", line 116, in spawn_main
        prep_data = spawn.get_preparation_data(process_obj._name)
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\multiprocessing\spawn.py", line 154, in get_preparation_data
        _check_not_importing_main()
        exitcode = _main(fd, parent_sentinel)
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\multiprocessing\spawn.py", line 134, in _check_not_importing_main
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\multiprocessing\spawn.py", line 125, in _main
        raise RuntimeError('''
    RuntimeError: 
            An attempt has been made to start a new process before the
            current process has finished its bootstrapping phase.
    
            This probably means that you are not using fork to start your
            child processes and you have forgotten to use the proper idiom
            in the main module:
    
                if __name__ == '__main__':
                    freeze_support()
                    ...
    
            The "freeze_support()" line can be omitted if the program
            is not going to be frozen to produce an executable.
        prepare(preparation_data)
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\multiprocessing\spawn.py", line 236, in prepare
        _fixup_main_from_path(data['init_main_from_path'])
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\multiprocessing\spawn.py", line 287, in _fixup_main_from_path
        main_content = runpy.run_path(main_path,
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\runpy.py", line 269, in run_path
        return _run_module_code(code, init_globals, run_name,
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\runpy.py", line 96, in _run_module_code
        _run_code(code, mod_globals, init_globals,
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\runpy.py", line 86, in _run_code
        exec(code, run_globals)
      File "C:\Users\USER1\Documents\Python Scripts\apis\tracker.py", line 102, in <module>
        x = rg.search((lon, lat))
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\site-packages\reverse_geocoder\__init__.py", line 293, in search
        return _rg.query(geo_coords)
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\site-packages\reverse_geocoder\__init__.py", line 127, in query
        _, indices = self.tree.pquery(coordinates, k=1)
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\site-packages\reverse_geocoder\cKDTree_MP.py", line 97, in pquery
        for p in pool: p.start()
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\multiprocessing\process.py", line 121, in start
        self._popen = self._Popen(self)
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\multiprocessing\context.py", line 224, in _Popen
        return _default_context.get_context().Process._Popen(process_obj)
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\multiprocessing\context.py", line 327, in _Popen
        return Popen(process_obj)
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\multiprocessing\popen_spawn_win32.py", line 45, in __init__
        prep_data = spawn.get_preparation_data(process_obj._name)
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\multiprocessing\spawn.py", line 154, in get_preparation_data
        _check_not_importing_main()
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\multiprocessing\spawn.py", line 134, in _check_not_importing_main
        raise RuntimeError('''
    RuntimeError: 
            An attempt has been made to start a new process before the
            current process has finished its bootstrapping phase.
    
            This probably means that you are not using fork to start your
            child processes and you have forgotten to use the proper idiom
            in the main module:
    
                if __name__ == '__main__':
                    freeze_support()
                    ...
    
            The "freeze_support()" line can be omitted if the program
            is not going to be frozen to produce an executable.
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\multiprocessing\spawn.py", line 116, in spawn_main
        exitcode = _main(fd, parent_sentinel)
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\multiprocessing\spawn.py", line 125, in _main
        prepare(preparation_data)
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\multiprocessing\spawn.py", line 236, in prepare
        _fixup_main_from_path(data['init_main_from_path'])
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\multiprocessing\spawn.py", line 287, in _fixup_main_from_path
        main_content = runpy.run_path(main_path,
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\runpy.py", line 269, in run_path
        return _run_module_code(code, init_globals, run_name,
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\runpy.py", line 96, in _run_module_code
        _run_code(code, mod_globals, init_globals,
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\runpy.py", line 86, in _run_code
        exec(code, run_globals)
      File "C:\Users\USER1\Documents\Python Scripts\apis\tracker.py", line 102, in <module>
        x = rg.search((lon, lat))
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\site-packages\reverse_geocoder\__init__.py", line 293, in search
        return _rg.query(geo_coords)
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\site-packages\reverse_geocoder\__init__.py", line 127, in query
        _, indices = self.tree.pquery(coordinates, k=1)
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\site-packages\reverse_geocoder\cKDTree_MP.py", line 97, in pquery
        for p in pool: p.start()
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\multiprocessing\process.py", line 121, in start
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\multiprocessing\spawn.py", line 116, in spawn_main
        self._popen = self._Popen(self)
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\multiprocessing\context.py", line 224, in _Popen
        exitcode = _main(fd, parent_sentinel)
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\multiprocessing\spawn.py", line 125, in _main
        return _default_context.get_context().Process._Popen(process_obj)
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\multiprocessing\context.py", line 327, in _Popen
        prepare(preparation_data)
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\multiprocessing\spawn.py", line 236, in prepare
        return Popen(process_obj)
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\multiprocessing\popen_spawn_win32.py", line 45, in __init__
        _fixup_main_from_path(data['init_main_from_path'])
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\multiprocessing\spawn.py", line 287, in _fixup_main_from_path
        prep_data = spawn.get_preparation_data(process_obj._name)
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\multiprocessing\spawn.py", line 154, in get_preparation_data
        main_content = runpy.run_path(main_path,
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\runpy.py", line 269, in run_path
        return _run_module_code(code, init_globals, run_name,
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\runpy.py", line 96, in _run_module_code
        _check_not_importing_main()
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\multiprocessing\spawn.py", line 134, in _check_not_importing_main
        _run_code(code, mod_globals, init_globals,
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\runpy.py", line 86, in _run_code
        raise RuntimeError('''
    RuntimeError: 
            An attempt has been made to start a new process before the
            current process has finished its bootstrapping phase.
    
            This probably means that you are not using fork to start your
            child processes and you have forgotten to use the proper idiom
            in the main module:
    
                if __name__ == '__main__':
                    freeze_support()
                    ...
    
            The "freeze_support()" line can be omitted if the program
            is not going to be frozen to produce an executable.
        exec(code, run_globals)
      File "C:\Users\USER1\Documents\Python Scripts\apis\tracker.py", line 102, in <module>
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\multiprocessing\spawn.py", line 116, in spawn_main
        x = rg.search((lon, lat))
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\site-packages\reverse_geocoder\__init__.py", line 293, in search
        exitcode = _main(fd, parent_sentinel)
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\multiprocessing\spawn.py", line 125, in _main
        return _rg.query(geo_coords)
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\site-packages\reverse_geocoder\__init__.py", line 127, in query
        prepare(preparation_data)
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\multiprocessing\spawn.py", line 236, in prepare
        _, indices = self.tree.pquery(coordinates, k=1)
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\site-packages\reverse_geocoder\cKDTree_MP.py", line 97, in pquery
        _fixup_main_from_path(data['init_main_from_path'])
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\multiprocessing\spawn.py", line 287, in _fixup_main_from_path
        for p in pool: p.start()
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\multiprocessing\process.py", line 121, in start
        self._popen = self._Popen(self)
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\multiprocessing\context.py", line 224, in _Popen
        main_content = runpy.run_path(main_path,
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\runpy.py", line 269, in run_path
        return _run_module_code(code, init_globals, run_name,
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\runpy.py", line 96, in _run_module_code
        return _default_context.get_context().Process._Popen(process_obj)
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\multiprocessing\context.py", line 327, in _Popen
        _run_code(code, mod_globals, init_globals,
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\runpy.py", line 86, in _run_code
        return Popen(process_obj)
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\multiprocessing\popen_spawn_win32.py", line 45, in __init__
        prep_data = spawn.get_preparation_data(process_obj._name)
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\multiprocessing\spawn.py", line 154, in get_preparation_data
        exec(code, run_globals)
      File "C:\Users\USER1\Documents\Python Scripts\apis\tracker.py", line 102, in <module>
        x = rg.search((lon, lat))
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\site-packages\reverse_geocoder\__init__.py", line 293, in search
        _check_not_importing_main()
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\multiprocessing\spawn.py", line 134, in _check_not_importing_main
        return _rg.query(geo_coords)
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\site-packages\reverse_geocoder\__init__.py", line 127, in query
        _, indices = self.tree.pquery(coordinates, k=1)
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\site-packages\reverse_geocoder\cKDTree_MP.py", line 97, in pquery
        raise RuntimeError('''
    RuntimeError: 
            An attempt has been made to start a new process before the
            current process has finished its bootstrapping phase.
    
            This probably means that you are not using fork to start your
            child processes and you have forgotten to use the proper idiom
            in the main module:
    
                if __name__ == '__main__':
                    freeze_support()
                    ...
    
            The "freeze_support()" line can be omitted if the program
            is not going to be frozen to produce an executable.
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\multiprocessing\spawn.py", line 116, in spawn_main
        for p in pool: p.start()
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\multiprocessing\process.py", line 121, in start
        exitcode = _main(fd, parent_sentinel)
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\multiprocessing\spawn.py", line 125, in _main
        self._popen = self._Popen(self)
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\multiprocessing\context.py", line 224, in _Popen
        prepare(preparation_data)
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\multiprocessing\spawn.py", line 236, in prepare
        return _default_context.get_context().Process._Popen(process_obj)
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\multiprocessing\context.py", line 327, in _Popen
        _fixup_main_from_path(data['init_main_from_path'])
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\multiprocessing\spawn.py", line 287, in _fixup_main_from_path
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\multiprocessing\spawn.py", line 116, in spawn_main
        return Popen(process_obj)
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\multiprocessing\popen_spawn_win32.py", line 45, in __init__
        main_content = runpy.run_path(main_path,
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\runpy.py", line 269, in run_path
        exitcode = _main(fd, parent_sentinel)
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\multiprocessing\spawn.py", line 125, in _main
        prep_data = spawn.get_preparation_data(process_obj._name)
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\multiprocessing\spawn.py", line 154, in get_preparation_data
        return _run_module_code(code, init_globals, run_name,
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\runpy.py", line 96, in _run_module_code
        prepare(preparation_data)
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\multiprocessing\spawn.py", line 236, in prepare
        _check_not_importing_main()
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\multiprocessing\spawn.py", line 134, in _check_not_importing_main
        _run_code(code, mod_globals, init_globals,
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\runpy.py", line 86, in _run_code
        _fixup_main_from_path(data['init_main_from_path'])
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\multiprocessing\spawn.py", line 287, in _fixup_main_from_path
        raise RuntimeError('''
    RuntimeError: 
            An attempt has been made to start a new process before the
            current process has finished its bootstrapping phase.
    
            This probably means that you are not using fork to start your
            child processes and you have forgotten to use the proper idiom
            in the main module:
    
                if __name__ == '__main__':
                    freeze_support()
                    ...
    
            The "freeze_support()" line can be omitted if the program
            is not going to be frozen to produce an executable.
        exec(code, run_globals)
      File "C:\Users\USER1\Documents\Python Scripts\apis\tracker.py", line 102, in <module>
        main_content = runpy.run_path(main_path,
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\runpy.py", line 269, in run_path
        x = rg.search((lon, lat))
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\site-packages\reverse_geocoder\__init__.py", line 293, in search
        return _run_module_code(code, init_globals, run_name,
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\runpy.py", line 96, in _run_module_code
        return _rg.query(geo_coords)
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\site-packages\reverse_geocoder\__init__.py", line 127, in query
        _run_code(code, mod_globals, init_globals,
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\runpy.py", line 86, in _run_code
        _, indices = self.tree.pquery(coordinates, k=1)
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\site-packages\reverse_geocoder\cKDTree_MP.py", line 97, in pquery
        exec(code, run_globals)
      File "C:\Users\USER1\Documents\Python Scripts\apis\tracker.py", line 102, in <module>
        for p in pool: p.start()
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\multiprocessing\process.py", line 121, in start
        x = rg.search((lon, lat))
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\site-packages\reverse_geocoder\__init__.py", line 293, in search
        self._popen = self._Popen(self)
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\multiprocessing\context.py", line 224, in _Popen
        return _rg.query(geo_coords)
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\site-packages\reverse_geocoder\__init__.py", line 127, in query
        return _default_context.get_context().Process._Popen(process_obj)
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\multiprocessing\context.py", line 327, in _Popen
        _, indices = self.tree.pquery(coordinates, k=1)
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\site-packages\reverse_geocoder\cKDTree_MP.py", line 97, in pquery
        return Popen(process_obj)
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\multiprocessing\popen_spawn_win32.py", line 45, in __init__
        for p in pool: p.start()
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\multiprocessing\process.py", line 121, in start
        prep_data = spawn.get_preparation_data(process_obj._name)
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\multiprocessing\spawn.py", line 154, in get_preparation_data
        self._popen = self._Popen(self)
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\multiprocessing\context.py", line 224, in _Popen
        _check_not_importing_main()
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\multiprocessing\spawn.py", line 134, in _check_not_importing_main
        return _default_context.get_context().Process._Popen(process_obj)
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\multiprocessing\context.py", line 327, in _Popen
        raise RuntimeError('''
    RuntimeError: 
            An attempt has been made to start a new process before the
            current process has finished its bootstrapping phase.
    
            This probably means that you are not using fork to start your
            child processes and you have forgotten to use the proper idiom
            in the main module:
    
                if __name__ == '__main__':
                    freeze_support()
                    ...
    
            The "freeze_support()" line can be omitted if the program
            is not going to be frozen to produce an executable.
        return Popen(process_obj)
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\multiprocessing\popen_spawn_win32.py", line 45, in __init__
        prep_data = spawn.get_preparation_data(process_obj._name)
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\multiprocessing\spawn.py", line 154, in get_preparation_data
        _check_not_importing_main()
      File "C:\Users\USER1\anaconda3\envs\bravo\lib\multiprocessing\spawn.py", line 134, in _check_not_importing_main
        raise RuntimeError('''
    RuntimeError: 
            An attempt has been made to start a new process before the
            current process has finished its bootstrapping phase.
    
            This probably means that you are not using fork to start your
            child processes and you have forgotten to use the proper idiom
            in the main module:
    
                if __name__ == '__main__':
                    freeze_support()
                    ...
    
            The "freeze_support()" line can be omitted if the program
            is not going to be frozen to produce an executable.
    
    Figure(1520x820)
    Loading formatted geocoded file...
    Figure(1520x820)
    Loading formatted geocoded file...
    Figure(1520x820)
    Loading formatted geocoded file...
    Figure(1520x820)
    Loading formatted geocoded file...
    Figure(1520x820)
    Loading formatted geocoded file...
    Figure(1520x820)
    Loading formatted geocoded file...
    Figure(1520x820)
    Loading formatted geocoded file...
    Figure(1520x820)
    Loading formatted geocoded file...
    [{'lat': '42.57952', 'lon': '1.65362', 'name': 'El Tarter', 'admin1': 'Canillo', 'admin2': '', 'cc': 'AD'}]]
    
    opened by teamcharliegithub 1
  • segfault

    segfault

    I sometimes get segfault using the included c++ lib:

    0x0000fffff7b7fa08 in PyUnicode_AsUTF8AndSize () from /lib/aarch64-linux-gnu/libpython3.8.so.1.0 (gdb) bt #0 0x0000fffff7b7fa08 in PyUnicode_AsUTF8AndSize () from /lib/aarch64-linux-gnu/libpython3.8.so.1.0 #1 0x0000aaaaaab0ed8c in ReverseGeocode::search[abi:cxx11](double, double) (this=0xfffffffff1b8, _lat=55.715805000000003, _lon=12.436966) at ReverseGeocode.cpp:73 #2 0x0000aaaaaaaaf540 in main () at tesla_cron.cpp:605 (gdb)

    (gdb) up #1 0x0000aaaaaab0ed8c in ReverseGeocode::search[abi:cxx11](double, double) (this=0xfffffffff1b8, _lat=55.715805000000003, _lon=12.436966) at ReverseGeocode.cpp:73 73 const char* s1 = PyUnicode_AsUTF8(value); (gdb) p value $1 = (PyObject *) 0xffffde03d600 (gdb) p *value $2 = {ob_refcnt = 281474406537808, ob_type = 0x0} (gdb)

    opened by jp-embedded 1
  • Can I use it for every country in the world?

    Can I use it for every country in the world?

    Hi! This library is AWESOME thanks a lot!! I don't even need the precision of getting cities, I am already okay with getting countries! Does this library work with EVERY country?

    thanks a lot!!! (because then I won't have to build stuff myself, thanks a lot!!!! https://www.reddit.com/r/webdev/comments/tlfq17/comment/i1vamqc/?utm_source=share&utm_medium=web2x&context=3 ) BTW: just out of interest: how good is the city coverage actually? Will cities in asia or africa with over 1000 population get shown too?

    opened by kokoskiwi 1
Releases(v1.5)
Owner
Ajay Thampi
Machine Learning Engineer at Facebook | PhD in Signal Processing & Wireless Communications
Ajay Thampi
A fast and stable reverse proxy for NAT traversal, written in Rust

rathole A fast and stable reverse proxy for NAT traversal, written in Rust rathole, like frp, can help to expose the service on the device behind the

Yujia Qiao 4.6k Dec 30, 2022
Hopper - Fast, configurable, lightweight Reverse Proxy for Minecraft

Hopper Hopper is a lightweight reverse proxy for minecraft. It allows you to connect multiple servers under the same IP and port, with additional func

Pietro 174 Jun 29, 2023
Utility for working with reverse DNS

RDNS RDNS is a small Rust CLI utility for performing single and bulk reverse DNS (PTR) lookups. Usage RDNS 0.1.0 Joe Banks <[email protected]> Utilities for

Joe Banks 2 Sep 22, 2021
RedLizard - A Rust TCP Reverse Shell with SSL

RedLizard - A Rust TCP Reverse Shell with SSL RedLizard Rust TCP Reverse Shell Server/Client This is a reverse shell in Rust called RedLizard, basical

Thanasis Tserpelis 105 Dec 24, 2022
A high performence Socks5 proxy server with bind/reverse support implementation by Rust.

rsocx A high performence Socks5 proxy server with bind/reverse support implementation by Rust Features Async-std No unsafe code Single executable Linu

b23r0 259 Jan 6, 2023
Interactive bind/reverse PTY shell with Windows&Linux support implementation by Rust.

Cliws Lightweight interactive bind/reverse PTY shell with Windows&Linux support implementation by Rust. Features WebSocket Full pty support: VIM, SSH,

b23r0 215 Dec 3, 2021
A firewall reverse proxy for preventing Log4J (Log4Shell aka CVE-2021-44228) attacks.

log4jail ??️ A fast firewall reverse proxy with TLS (HTTPS) and swarm support for preventing Log4J (Log4Shell aka CVE-2021-44228) attacks. ?? Table of

Mufeed VH 22 Dec 27, 2022
A lightweight Rust reverse proxy.

Brachyura A reverse proxy, which I am primarily using as a Rust / Hyper learning project. I utilize Nginx as part of my home lab providing reverse pro

William Howard 8 Jan 8, 2023
Reverse proxy for HTTP microservices and STDIO. Openfass watchdog which can run webassembly with wasmer-gpu written in rust.

The of-watchdog implements an HTTP server listening on port 8080, and acts as a reverse proxy for running functions and microservices. It can be used independently, or as the entrypoint for a container with OpenFaaS.

yanghaku 7 Sep 15, 2022
A minimal ngrok liked reverse proxy implemented in Rust.

rok A minimal ngrok implementation in Rust, for educational purpose. This work is largely based on rathole, especially the very first commit. Other ho

Kai 3 Jun 21, 2022
A multi-connection TCP reverse proxy server and client.

tprox A multi-connection TCP reverse proxy. The tprox server is able to proxy multiple incoming connections to the tprox client over a single TCP conn

Mohammed Ajmal Siddiqui 4 Sep 21, 2022
A TCP proxy using HTTP - Reach SSH behind a Nginx reverse proxy

?? TCP over HTTP ?? The Questions ?? What does it do? You can proxy TCP traffic over HTTP. A basic setup would be: [Your TCP target] <--TCP-- [Exit No

Julian 185 Dec 15, 2022
Super Fast Sub-domain Takeover Detection!

NtHiM - Super Fast Sub-domain Takeover Detection Installation Method 1: Using Pre-compiled Binaries The pre-compiled binaries for different systems ar

Binit Ghimire 326 Dec 31, 2022
Simple and fast layer 4 proxy in Rust

Fourth 这一波在第四层。 English Fourth是一个Rust实现的Layer 4代理,用于监听指定端口TCP流量,并根据规则转发到指定目标。 功能 监听指定端口代理到本地或远端指定端口 监听指定端口,通过TLS ClientHello消息中的SNI进行分流 安装方法 为了确保获得您架构

Rui Li 17 Nov 8, 2022
Fast User-Space TCP/UDP Stack

Catnip Catnip is a TCP/IP stack that focuses on being an embeddable, low-latency solution for user-space networking. Building and Running 1. Clone Thi

Demikernel 79 Sep 9, 2022
A fast, stable, efficient, and lightweight intranet penetration, port forwarding tool supports multiple connections, cascading proxy, and transmission encryption

A fast, stable, efficient, and lightweight intranet penetration, port forwarding tool supports multiple connections, cascading proxy, and transmission encryption

editso 1.3k Dec 30, 2022
RCProxy - a lightweight, fast but powerful Redis Cluster Proxy written in Rust

RCProxy - a lightweight, fast but powerful Redis Cluster Proxy written in Rust

Cris Liao 16 Dec 4, 2022
Fast Discord RPC Client written in Rust

Discord RPC Client Examples Big image, small image, details and one button discordrpc -c 942151169185316874 -d 'untypeable nickname' --button-1-text '

Oskar 10 Jan 1, 2023
Fast and easy-to-use event-driven network library.

message-io is a fast and easy-to-use event-driven network library. The library handles the OS socket internally and offers a simple event message API

Luis Enrique Muñoz Martín 830 Jan 3, 2023