Giter VIP home page Giter VIP logo

google / open-location-code Goto Github PK

View Code? Open in Web Editor NEW
4.0K 191.0 456.0 4.41 MB

Open Location Code is a library to generate short codes, called "plus codes", that can be used as digital addresses where street addresses don't exist.

Home Page: https://plus.codes

License: Apache License 2.0

HTML 5.06% CSS 0.25% JavaScript 15.85% Go 9.89% Dart 5.19% Java 25.55% Ruby 3.02% Python 4.97% C++ 8.26% Rust 4.07% Makefile 0.19% C 5.24% Shell 1.07% VBA 4.65% Starlark 1.39% PLpgSQL 3.74% Monkey C 1.59%
geo gps c cplusplus dart golang javascript java python ruby

open-location-code's Introduction

Open Location Code

Build Status CDNJS

Open Location Code is a technology that gives a way of encoding location into a form that is easier to use than latitude and longitude. The codes generated are called plus codes, as their distinguishing attribute is that they include a "+" character.

The technology is designed to produce codes that can be used as a replacement for street addresses, especially in places where buildings aren't numbered or streets aren't named.

Plus codes represent an area, not a point. As digits are added to a code, the area shrinks, so a long code is more precise than a short code.

Codes that are similar are located closer together than codes that are different.

A location can be converted into a code, and this (full) code can be converted back to a location completely offline, without any data tables to lookup or online services required.

Codes can be shortened for easier communication, in which case they can be used regionally or in combination with a reference location that all users of this short code need to be aware of. If the reference location is given in form of a location name, use of a geocoding service might be necessary to recover the original location.

Algorithms to

  • encode and decode full codes,
  • shorten them relative to a reference location, and
  • recover a location from a short code and a reference location given as latitude/longitude pair

are publicly available and can be used without restriction. Geocoding services are not a part of the Open Location Code technology.

Links

Description

Codes are made up of a sequence of digits chosen from a set of 20. The digits in the code alternate between latitude and longitude. The first four digits describe a one degree latitude by one degree longitude area, aligned on degrees. Adding two further digits to the code, reduces the area to 1/20th of a degree by 1/20th of a degree within the previous area. And so on - each pair of digits reduces the area to 1/400th of the previous area.

As an example, the Parliament Buildings in Nairobi, Kenya are located at 6GCRPR6C+24. 6GCR is the area from 2°S 36°E to 1°S 37°E. PR6C+24 is a 14 by 14 meter wide area within 6GCR.

A "+" character is used after eight digits, to break the code up into two parts and to distinguish codes from postal codes.

There will be locations where a 10-digit code is not sufficiently precise, but refining it by a factor of 20 is i) unnecessarily precise and ii) requires extending the code by two digits. Instead, after 10 digits, the area is divided into a 4x5 grid and a single digit used to identify the grid square. A single grid refinement step reduces the area to approximately 3.5x2.8 meters.

Codes can be shortened relative to a location. This reduces the number of digits that must be remembered, by using a location to identify an approximate area, and then generating the nearest matching code. Shortening a code, if possible, will drop four or more digits from the start of the code. The degree to which a code can be shortened depends on the proximity of the reference location.

If the reference location is derived from a town or city name, it is dependent on the accuracy of the geocoding service. Although one service may place "Zurich" close to the Google office, another may move it by a hundred meters or more, and this could be enough to prevent the original code being recovered. Rather than a large city size feature to generate the reference location, it is better to use smaller, neighbourhood features, that will not have as much variation in their geocode results.

Guidelines for shortening codes are in the wiki.

Recovering shortened codes works by providing the short code and a reference location. This does not need to be the same as the location used to shorten the code, but it does need to be nearby. Shortened codes always include the "+" character so it is simple to compute the missing component.

  • 8F+GG is missing six leading characters
  • 6C8F+GG is missing four leading characters

Example Code

The subdirectories contain sample implementations and tests for different languages. Each implementation provides the following functions:

  • Test a code to see if it is a valid sequence
  • Test a code to see if it is a valid full code (not all valid sequences are valid full codes)
  • Encode a latitude and longitude to a standard accuracy (14 meter by 14 meter) code
  • Encode a latitude and longitude to a code of any length
  • Decode a code to its coordinates: low, high and center
  • Shorten a full code relative to a location
  • Extend a short code relative to a location

open-location-code's People

Contributors

a14n avatar benno-p avatar bilst avatar bocops avatar buge avatar d023604 avatar drinckes avatar fintelia avatar fulldecent avatar gonzus avatar grah76 avatar jamesfysh avatar jirisemecky avatar joh12041 avatar jonmcpherson avatar jsoref avatar kant avatar mdakin avatar nyurik avatar phebehp avatar rjp44 avatar sonyaa avatar tcyrus avatar tgulacsi avatar viettaml avatar williamdenniss avatar wnameless avatar xopok avatar yuzurut avatar zongweil 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  avatar  avatar  avatar  avatar

Watchers

 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  avatar  avatar  avatar  avatar

open-location-code's Issues

Possible array out of bounds access

Not sure if that was intentional, but in the definition of DecodePairsSequence :

while (i * 2 + offset < code.length) {
      value += CODE_ALPHABET_.indexOf(code.charAt(i * 2 + offset)) *
          PAIR_RESOLUTIONS_[i];
      i += 1;
    }

If the code is long enough, i can get large enough to provoke an array out of bounds access as offset is either 0 or 1.
For example, with +7FG4.9QCJ2VXGJ

VBA code version: error in sub-subscript

LIne 601 (test suite):

MsgBox ("IsFull test " + CStr(i) + ", expected: " + CStr(validity(i)(2) = "true") + ", actual: " + CStr(f))

This ()SHOULD BE():

MsgBox ("IsFull test " + CStr(i) + ", expected: " + CStr(validity(i)(3) = "true") + ", actual: " + CStr(f))

(Notice: the sub-subscript "2" was copied from, presumably, line 597 and was not updated (line 600 was properly updated when copied from line 596).

Add travis test configs

The current travis config tests js, go, ruby, python and rust.

But cpp, dart, java, js/closure are not automatically tested. Also weirdly travis thinks it tests js three times and I don't know what's going on there.

The new travis.yml file uses matrix:include to set up a node.js and rust instance.

Travis has a language setting for dart.

cpp, java and js/closure are currently tested using bazel BUILD files. It may make sense to have a single configuration that tests all three to reduce the number of times bazel has to be fetched.

Extremely long codes can cause underflow errors

In a test C++ implementation, long codes were causing segmentation faults. This was due to the grid computation, where the size of the grid squares are computed in degrees latitude and degrees longitude. These start at 1/8000th of a degree, and with each step, divide by 4 (latitude) or 5 (longitude).

Fairly quickly these can get to the minimum values that can be represented as floats and cause underflow errors.

To avoid this happening, I propose to limit the length of OLC codes. This would avoid this problem while still allowing extremely precise codes. 16 digits gives roughly centimeter resolution, and with 32 digits the OLC area is only 7.86E-11 cm wide (this is in the order of a helium atom).

I don't think it matters a great deal what the limit is as long as we define one.

The changes required are:

  • To modify the isValid method to reject codes with more than 32 digits or with more than 24 digits after the separator
  • To limit the encode method to only return codes with a maximum of 32 digits.

Has anyone generated the grid(s) for use in GIS?

Do the grids exist in the form of a GIS dataset? shapefile, spatialite, geojson, etc.?

I would like to have a reference layer of the grids with my own data and was wondering if anyone generated this and made it available publicly.

image

Multiple occupancy buildings

From reading the specification I could not work out how to identify for example flats that are vertically stacked within a high-rise multiple occupancy building.

Supporting Apartment-Style Living

Food for thought, but I see a problem when it comes to apartment-style living, especially one with a lot of floors. It might be of interest to look into solutions when say a building has 6 floors and 12 different families live in it. With Open Location Code, they would all fall into the same precise square - yet need to somehow be made unique.

Findind nearest neighbour/shortest path and traversal

Hi All,

 I'm evaluating OLC for a hands on project to snap a grid cell based on a gps location. The proposal is to create Areas that are hashed for faster look ups on caches. Basically i'm playing around mapping a road network using OLC. There does not seem to be an API or a simple understanding of how to traverse the neighbours..

 The problem is: Supposing there are 100Meter by 100Meter precision areas mapping to different roads that pass through, I'm trying to find what is the traversal (algorithm) route to my destination.
 Any light on this is highly appreciated...

Best Regards
CVP

Not an issue

I created a Swift 3.x implementation based off your python/rust/C++ code and it is available as a cocoapod for people who want to use it in developing iOS applications. If you'd rather that I just give you the code (since it's 99% yours), I'd be more than happy to.

The cocoapod is here

Define how to render in right-to-left languages

I assume the plus code will be written unchanged (left-to-right) even in RTL languages, but it would be good to specify it. If English were RTL, this is what I'd expect:

.there weren't you but 23456789+23 to went I

Getting CORS Issue

Hi,
I am calling the api:
https://plus.codes/api?address=17.422066,78.338942&key=<api_key>
I have enabled GeoCodingAPI in developer console. While I am trrying to get the PlusCode for the above address, I am getting error: "No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost' is therefore not allowed access."
Please suggest if I am doing anything wrong.
Thanks in advance.

Plus codes aren’t shown in some countries.

Hello there,

In Google Maps help page it says that 'Plus codes aren’t shown in some countries.'

  • Where do we find this list of countries?
  • Is it just some country-based regulation, or some specific flaw / problem in the overall code / implementation?

Curious since I'm looking to support / utilise it in a precision service, thank you.

Including floors in open location code

In large cities, when description a store, a restaurant or a venue, most of time we need to also state our it's floor. If we could also add floor number to the end of open location code, we can even present location where coordinate cannot cover.

We can considering to add a '+/-' in the end to indicate the floor numbers (ground floor = '+0', minus represent underground floor ).

Code translation (other coding language)

Do you have a TCL version? If not, I have "translated" the code and the test suite passes successfully (VBA --> TCL)

Sorry for the bug report; I couldn't find a "contact" link for this project.

Fix segfault in c++ implementation

Encoding a code using a 90degree latitude and code length of 10 causes a segfault.

The problem is to reduce the latitude to be within the code area. If the latitude is 90 degrees, it needs to be reduced. One solution is to compute the resolution of the code, and reduce the latitude by a fraction of that amount.

If the code length is 10, the resolution should be 1/8000th of a degree. Instead it was computed as 8000 degrees. The latitude was reduced by the resolution / 20, which meant that instead of 90 being turned into 89.99999375 it was being turned into 90 - 80000 / 20 = -310.

If the code length was more than, or less than 10, the latitude is adjusted in a different code path that worked correctly.

encode and decode longitutde and latitude are not consistent

image
image
2.3.0 :020 > olc.encode(43.845825324701, 87.6474347905425) => "8MM9RJWW+8X" 2.3.0 :021 > [olc.decode('8MM9RJWW+8X').latitude_center, olc.decode('8MM9RJWW+8X').longitude_center] => [43.845812499999994, 87.6474375] 2.3.0 :022 > olc.decode('8MM9RJWW+8X') => #<PlusCodes::CodeArea:0x00000009ab8458 @south_latitude=43.845749999999995, @west_longitude=87.647375, @latitude_height=(1/8000), @longitude_width=(1/8000), @latitude_center=43.845812499999994, @longitude_center=87.6474375>

Convert the JS code to work with node.

I think its a good project that appeals with the travelling demographic as not all places actually have addresses.

Though would be good to get as many libraries up for this. Would love to see the JS code usable in node.js though (ideally as something you can install with npm)

Thoughts?

Suggestion: show full code in brackets on plus.codes

Hi, sharing an issue with plus codes that say a postal service or a database operating at the level of a country like India would experience:

  • I have one location in Pune city, which is in Maharashtra state of India: https://i.imgur.com/1xlxexM.png
  • I copy the plus-code given at the bottom. It is a shortened version, but an unfamiliar person wouldn't know.
  • I open maps.google.com and am looking at all of India. I type in the plus code : GRW4+7J . It takes me to another address in another state.
  • I search for "GRW4+7J, maharashtra". It still takes me to another address in the state.
  • I include two more letters from the left of the full plus code (note, at this point the lay person will have abandoned the search): CMGRW4+7J
  • I go back to all-India map, and search for it. It takes me to the ocean, somewhere near Myanmar.
  • It's only when I type the full code, 7JCMGRW4+7J that I get the correct location.

Can we make arrangements so the default display on plus.codes (that shows at the bottom of the page) shows the full code in small size in brackets to the right or something, or in a ?-tooltip advising the user to use the full code in case of searching over a large area like state or country? It's there when you click further, but it's not very intuitive to open that and doesn't always open.

Also, a copy-to-clipboard button would be great!

have a unique icon / graphic identifier for open-location-code

If you want to use open location codes (or plus codes) it would be great to have a logo/icon, so if you reference it on sites or even print material, then you have some (additional, besides the plus) identifier. Maybe something like a geo-pointer with a plus inside it (or since it's from google a "g+"?)

The string "+" passes as a valid code

"+" is the separator character, used to break the code between neighbourhood and building levels, and to help disambiguate OLC codes from postal codes.

On its own it has no meaning - it has to be either preceded, followed (or both) by valid OLC alphabet characters.

Currently the method that checks for validity passes. Adding a check that the code does not solely consist of "+", and returning false if it does, will solve this issue.

Non-Roman Scripts

Currently, Plus Codes only work with roman characters A-Z and arabic numerals 0-9. While this isn't an issue in any countries that use roman-scripted languages, it can be incredibly alienating to anyone whose primary or only languages use non-roman scripts. This can be a huge barrier to understanding and ease of use if users don't know or understand Roman script. What should Plus Codes do for non-Roman scripts? Should they just have character substitution or have a different system altogether?

Short code to full code recovery has a bug

In some cases, recovering a short code to a full code does not return the nearest match.

Calling recoverNearest('22+', 14.9333, -23.5125) returns 796RXF22+. This is not correct - the nearest match is 796RXG22+.

The problem seems to be with the step where the reference latitude and longitude are rounded down before generating the candidate code. In the above example, it should generate a code whose center is at most .05 degrees from the reference location, but due to the rounding down it is .08 degrees away.

It appears that removing the rounding down step entirely fixes this.

Python: recoverNearest implementation does not do what documentation says it does

While the documentation says it returns an unchanged code for full code input, it actually raises a ValueError instead.

 Returns:
   The nearest full Open Location Code to the reference location that matches
   the short code. If the passed code was not a valid short code, but was a
   valid full code, it is returned unchanged.
openlocationcode.recoverNearest("9FMC3QQP+29", 0.0, 0.0)
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "/home/shoeper/Documents/dev/jodelbot/libs/openlocationcode.py", line 285, in recoverNearest
    raise ValueError('Passed short code is not valid - ' + str(shortcode))
ValueError: Passed short code is not valid - 9FMC3QQP+29
# expected output would be 9FMC3QQP+29
openlocationcode.recoverNearest("3QQP+29", 0.0, 0.0)
'6CGX3QQP+29'

Code recovery within one degree of the poles can be incorrect

Codes missing leading digits can be recovered using a reference location. The general approach is:

  1. Take the reference location and generate a long code;
  2. Use the leading characters of that code as a prefix for the short code;
  3. If the latitude of the new code is more than half the resolution of the missing prefix north or south of the reference location, move the new code by one step in that direction (i.e., north or south).
  4. If the longitude of the new code is more than half the resolution of the missing prefix west or east of the reference location, move the new code by one step in that direction (i.e, west or east).

This can produce incorrect results when the reference latitude is closer to the pole than the desired recovered code as it moves the code to a latitude greater than 90 degrees, or less than -90 degrees.

Here are two examples:

  1. Short code is 2222+22, reference location is 89.6,0.0. We encode 89.6,0.0 and prefix the short code with the first four digits, giving CFX22222+22 with a center latitude of 89.0000625 degrees. The resolution of a four digit grid is 1 degree, and the latitude difference between the code center and 89.6 is 0.5999375 degrees. This is more than half a degree so we move the code north by one degree to 90.0000625 degrees latitude. Since that is invalid a bad code is returned.
  2. Short code is XXXXXX+XX, reference location is -81.0,0.0. We encode -81.0,0.0 and prefix the short code with the first two digits, giving 2CXXXXXX+XX with a center latitude of -70.0000625 degrees. The resolution of a four digit grid is 20 degrees, and the latitude difference between the code center and -81.0 is 10.9999375 degrees. This is more than 10 degrees so we move the code south by 20 degrees to -90.0000625 degrees latitude. Since that is invalid a bad code is returned.

These two test cases should be added to each implementation and then the implementations need to be modified to ensure they pass.

East/west adjustments across the 180 degree longitude line don't seem to exhibit this bug.

spelling error on website

The codes aren't case sensitive and don't include easily confused characters. We've selected the characters to make it difficult to impossible to spell words in any language.

should be

The codes aren't case sensitive and don't include easily confused characters. We've selected the characters to make it difficult to impossible to misspell words in any language.

encode method accepts invalid length value

#81 identifies an error in the encode method in python.

What it does is require the length parameter to be an even number, if it is less than the separator position (8). This is incorrect, it needs to be an even number if it is less than (or equal to) the pair code length (10).

The result is that encode can request a 9 digit code, which isn't valid. Currently I think implementations return a 10 digit code anyway, so the result of fixing this will not change the codes generated, but to throw an error when requesting a 9 digit code (invalid length).

Plus codes in Google Maps

Well, a couple of days back I noticed a nice feature (Plus Codes) in Google maps and immediately forwarded the screenshots and informed my friends to use it.

I checked again yesterday, it has disappeared..why what happened.

It would be nice if we could copy the code and send on social media messengers to locate our address.

Javascript library should do input validation

Passing values as strings instead of numbers will produce unexpected results, due to Javascript string handling.

The inputs (lat, lng, code length) should be coerced to numbers (using Number()) and if it produces NaN throw an exception.

While you're there, adding an exported constant for the code length e.g. OpenLocationCode.CODE_PRECISION_NORMAL and OpenLocationCode.CODE_PRECISION_EXTRA seems like a good idea.

Java implementation is hard to follow

The current Java implementation has a number of confusing code blocks that are hard to follow:

In addition, there other things to improve:

  • Fixed values being used that should be constants: 20 (the number base), 5 & 4 (the refinement grid rows and columns), 10 (default length), 8 (position of separator), 90, 180, 360 etc.
  • Use of the CHARACTER_TO_INDEX structure
  • LATITUDE_PRECISION variables are misleading and unnecessary - latitude and longitude have the same precision, and the values are divided by 4 for some unexplained reason.

Patent or licensing of the code

The implementation is Apache Licensed which makes patents put on the code of the implemention transferred to the user (automatically), which is good but still not enough, I think but not sure :)

E.g. the costs for using the open location code itself is unclear to me. Can you point me to a license part that guarantees that using this code in e.g. competitive maps or routing services will be free for the provider and its customers? Or is it automatically assumed that the "data"/outcome of the algorithm is free for anyone?

go-fuzz instructions are out-of-date

The method of calling go-fuzz has changed slightly, and there is also no longer a separate corpus directory and flag. The 'corpus extraction' code should be moved behind a test flag instead of running at init().

cc: @tgulacsi

rust setup breaking travis CI

The rust setup added in #71 has broken the travis CI build process:

$ sudo apt-get -y install libstd-rust-1.16 libstd-rust-dev rustc cargo
Reading package lists... Done
Building dependency tree       
Reading state information... Done
E: Unable to locate package libstd-rust-1.16
E: Couldn't find any package by glob 'libstd-rust-1.16'
E: Couldn't find any package by regex 'libstd-rust-1.16
The command "sudo apt-get -y install libstd-rust-1.16 libstd-rust-dev rustc cargo" failed and exited with 100 during .

Floating point errors can cause incorrect digits after position 10

Floating point errors can cause incorrect code to generate. This depends on the language, but as an example we noticed that encoding latitude 1, longitude 1 produces an X for the 11th digit.

The 10 digit code latitude and longitude ranges are the same - 1.0 to 1.000125. In the 11 digit sub-grid, the characters are assigned as:

Longitude 1.0 to 1.0003125 Longitude 1.0003125 to 1.000625 Longitude 1.000625 to 1.0009375 Longitude 1.0009375 to 1.000125
Latitude 1.0001 to 1.000125 R V W X
Latitude 1.000075 to 1.0001 J M P Q
Latitude 1.000050 to 1.000075 C F G H
Latitude 1.000025 to 1.000050 6 7 8 9
Latitude 1.0 to 1.000025 2 3 4 5

So for latitude 1.0, longitude 1.0 we want to get 2. But we are getting X.

This seems to be a problem in the encodeGrid functions where we try to work out which column the longitude is in by getting the remainder of dividing the longitude by the grid size (0.000125).

You can check this in Javascript by doing:
1.0 % 0.000125

It should be zero, but in my browser I'm seeing 0.00012499999999997919 which is nonsense.

Instead of directly comparing values in that function, we may need to use "close enough" comparisons, where if numbers are within 1E-10 of each other that's good enough.

Another strategy is instead of doing the remainder of 181.5 % 0.000125, we ditch the degrees and use 0.5 % 0.000125.

The solution in each case is probably language dependent.

Support for elevation or a building level planned?

How can an extension of open location code look with the elevation or a building level included?

E.g. if you want to meet it would be nice to know the building level of the room or if it is under or on a bridge :)

Implementation requirement to recover a full Open Location Code from a short code/global address at odds with "Works Offline" design requirement

Given MQPX9G Nairobi, Kenya, one cannot recover the full OLC without a network connection or gazetteer. This breaks the design requirements to work offline.

Suggested is a "level 0" implementation describing only full OLCs with no gazetteer requirement, as could be encoded/decoded by an embedded device with no network access.

(Short codes are also culturally sensitive. 845R+3C Stanley, East Falkland and 845R+3C Puerto Argentino, Islas Malvinas are the same place to different people. Perhaps best to quietly drop the "global address" term.)

I can't use my html page

hi

    it is really good thing. and i try to put my html page.but it can't show anything then i check console also. it shows some key problem. even i download and try githup fie also. but, it is not work.  

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.