Giter Club home page Giter Club logo

shapefile-js's Introduction

Shapefile.js

If you are having encoding issues in internet explorer please include this script as well.

Redoing all of this in modern JS. Promises, Typed Arrays, other hipster things, I wouldn't say it's based on RandomEtc's version as much as inspired by it as there is 0 code shared and I really only read the binary ajax part of his (hence why my function has the same name, they are otherwise not related). My sources were:

Demos

Usage

Fore use in rollup, node and where ever ESM modules are used we have a lovely package you can install via npm or yarn or whatever.

npm install shpjs --save

If you need a stand alone file to include in your webpage the old fasion when then you can grab the built version that's either included in the repo or you can use unpkg.

https://unpkg.com/shpjs@latest/dist/shp.js

API

Has a function shp which accepts a string which is the path the she shapefile minus the extension and returns a promise which resolves into geojson.

	import shp from 'shpjs';
	//for the shapefiles in the folder called 'files' with the name pandr.shp
	const geojson = await shp("files/pandr");

or you can call it on a .zip file which contains the shapefile

	//for the shapefiles in the files folder called pandr.shp
	const geojson = await shp("files/pandr.zip");
	//see bellow for whats here this internally call shp.parseZip()

or if you got the zip some other way (like the File API) then with the arrayBuffer you can call

const geojson = await shp(buffer);

If there is only one shp in the zipefile it returns geojson, if there are multiple then it will be an array. All of the geojson objects have an extra key fileName the value of which is the name of the shapefile minus the extension (I.E. the part of the name that's the same for all of them)

Advanced API

There are also a few internal methods that are exposed for if you have to do some more complicated stuff. These are named exports in the ESM version or properties on the main shp function in the bundled version.

  • parseShape: takes a buffer containing the contents of a .shp file and optionally a .prj STRING and returns geometries.
  • parseDbf: just a shortcut to parseDBF takes the same arguments, though will do some type coertion that the stand alone library won't.
  • combine: takes the results of the two aformentioned functions and combines them into a geojson document.
import {combine, parseShp, parseDbf} from shpjs;
combine([parseShp(shpBuffer, /*optional prj str*/),parseDbf(dbfBuffer)]);

LICENSE

Main library MIT license, original version was less permissive but there is 0 code shared. Included libraries are under their respective lisenses which are:

Dependency Status devDependency Status peerDependency Status

shapefile-js's People

Contributors

arjendk avatar arturandre avatar bryant1410 avatar calvinmetcalf avatar chaensel-agco avatar freekvw avatar jeff-tenhave avatar jholt456 avatar randometc avatar sainsb avatar stefanb avatar thataustin avatar wirk avatar yakomaru 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

shapefile-js's Issues

rawinflate.min.js.map 404 (Not Found)

This only happens when I use to beautified code (shp.js) and not the minified version (shp.min.js), I get a 404 error on rawinflate.min.js.map. Do I need to include this? How do I correct this?

Is it related to this issue? Stuk/jszip#75

Thanks for making this library!

Projection question

First of all, thanks for this stuff it's amazing!

I do have a question however, why when I provide a zip file which contains all the shape files (even prj) are all the features transformed to WGS. Is there any parameter I could provide to shp(buffer, ?) that would avoid reprojecting?

I could identify this line of code:
if (typeof toProj === 'undefined') { toProj = fromProj; fromProj = wgs84; single = true; }

So if I comment in the "fromProj = wgs84" then it will work as expected, but I'm curious whether there is any parameterized way to control this.

Also, I've noticed that the PROJ4 library is already embedded in shp.js/shp.min.js. I alredy have the amd repository for a standalone proj4 module. Any chance that you would split up the code so the proj4 would be optional?

Thank you

constructors

exist and you (me) should use them especially in the shp parsing code.

Parsing error with vertical projection information in PRJ file.

I have a shape file which has a PRJ file which defines a vertical projection. When trying to parse it, I get an error "Unexpected token ,".

The error appears to be from the first line this method, specifically the JSON.parse call.:

module.exports = function(wkt, self) {
  var lisp = JSON.parse(("," + wkt).replace(/\s*\,\s*([A-Z_0-9]+?)(\[)/g, ',["$1",').slice(1).replace(/\s*\,\s*([A-Z_0-9]+?)\]/g, ',"$1"]'));
  var type = lisp.shift();
  var name = lisp.shift();
  lisp.unshift(['name', name]);
  lisp.unshift(['type', type]);
  lisp.unshift('output');
  var obj = {};
  sExpr(lisp, obj);
  cleanWKT(obj.output);
  return extend(self, obj.output);
};

An example PRJ is:

PROJCS[
    "Custom_NAD_1983_UTM_Zone_17N",
    GEOGCS["GCS_North_American_1983",
        DATUM["D_North_American_1983",
            SPHEROID["GRS_1980",6378137.0,298.257222101]
        ],
        PRIMEM["Greenwich",0.0],
        UNIT["Degree",0.0174532925199433]
    ],
    PROJECTION["Transverse_Mercator"],
    PARAMETER["False_Easting",1640416.666666667],
    PARAMETER["False_Northing",0.0],
    PARAMETER["Central_Meridian",-81.0],
    PARAMETER["Scale_Factor",0.9996],
    PARAMETER["Latitude_Of_Origin",0.0],
    UNIT["Foot_US",0.3048006096012192]
],
VERTCS["NAVD_1988",
    VDATUM["North_American_Vertical_Datum_1988"],
    PARAMETER["Vertical_Shift",0.0],
    PARAMETER["Direction",1.0],
    UNIT["Meter",1.0]
]

Failure state?

If parsing fails, does this call the failure state handler specified in then, or does it return null, or an empty geojson featurecollection?

Generate geoJSON object from .shp file

Is it possible to generate the geoJSON object from the .shp file?

I think currently it's only possible to generate an array of geometries from the .shp file using: shp.parseShp(). It would be helpful to have a method that return the geoJSON object directly. It could be similar to the combine function but the .dbf file shouldn't be mandatory.

shp.combine = function(arr) {
    var out = {};
    out.type = 'FeatureCollection';
    out.features = [];
    var i = 0;
    var len = arr[0].length;
    while (i < len) {
        out.features.push({
            'type': 'Feature',
            'geometry': arr[0][i],
//          'properties': arr[1][i] <- it shouldn't be mandatory
        });
        i++;
    }
    return out;
};

Error parsing shapefile

When parsing the shapefile, occasionally the shapetype comes back as 1634038337. This is on a polyline shapefile. If I divide the shapefile into smaller section of about 100 features, it will work or work after several tries. It doesn't seem to be consistent. I have several other shapefiles where it works perfectly every time with several thousand features, so I don't think the feature count is actually the issue.

In addition, I have run into an issue where I may need to try once or twice to get the file read properly.

Local Shapefile

Can you reference how you fixed the local shapefile from only being able to open one shapefile to being able to add multiple?

local files

So is there any way how to use this with local files? I'm using AngularJS with File API to upload my files. I'd rather process it locally then upload it to my server, return the path and then process it.

or maybe use dataUrl?

local zip file stylesheet

Hello Calvin,

I was able to recreate your local zipfile example in my application unfortunately I was unable to get the program to read the properties fo the shapefile. In the info window for the shapefile it shows a color code but only black dots show up for shapefiles. If possible can you point me to where in your script the feature style is loaded I am guessing one of my files that is associated in the require.js is incorrect but I am not sure which file is causing this.

clean up

the parse functions should be public methods, we probably don't need the get methods and the make method should be called combine.

passing multiple parameter to style option of L.geojson

Pass extra parameter to style option of L.geojson.if i am using L.bind then custom parameter value is available but features gets undefined.but i want both of them. Reason for adding multiple parameters is i am having multiple divs with multiple maps . data is different for each map so that i can compare data and feature and apply style.

style: L.bind(style, this, mydata),

function style(mydata,features) {}

if it is not possible to get both values in L.bind .then how can i get current divid for which style function is executing.

Geometry in original projection

It would be useful for me to have the geojson output using the original geometry. Perhaps we could add the crs property on the geojson object.

Many .prj files unfortunately do not include an AUTHORITY string, so instead of adding the crs property perhaps just return the proj4 transformation function in a promise with the geojson.

This will reduce loss of precision, if the map already uses the original projection. In my case, there is a non-negligible loss between EPSG:27700 >> EPSG:4326 >> EPSG:27700

E.G. I want to do:

shp(arrayBuffer).then(function(geojson, proj) {
  // use the geojson AND projection function
});

Marker on geojsonlayer (shapefile)

hi,
I am loading map using L.geojson layer (shapefile) its working fine . but now i want to display markers on geojson layer for example circle,rectangle,icons etc. Pointtolayer event is not getting called because in feature object geometry type is polygon as shown in image3. so i used oneachfeature event to load markers. markers are getting loaded but they are getting displayed at background of layer see image 1. on mouseover marker it gets displayed blur at background of layer(image2) .I want to show marker,icons at front.code used to display marker in oneachfeature is shown in image4.
New folder.zip

Adding multiple shapes with ArrayBuffers always returns the first shape from cache

The hasOwnProperty check for cache hits uses the passed in object's toString method. So it always returns "[object ArrayBuffer]" as the cache key when using ArrayBuffers. When you try to load multiple ArrayBuffer shapes, it thinks they are all the same as the first (matching toString), so it just returns the first shape layer.

This can be solved by overriding the toString method each time with something like

var req = new XMLHttpRequest();
req.open('GET', urlToZipFile);
req.responseType = 'arraybuffer';
req.onload = function(event) {
    if (req.response) {
        req.response.toString = function() {
            return urlToZipFile;
        };
        var shapeLayer = L.shapefile(req.response);
        scope.addShapeToMap(shapeLayer);
    }
};
req.send(null);

but would prefer shapefile-js to use a hash or optional value as an object's key. If there is a preferred way, I can probably put in a PR with the change.
Like changing

function shp(base, whiteList) {
to

function shp(base, whiteList) {
  var hash = typeof base === 'string' ? base : SparkMD5.ArrayBuffer.hash(base);
    if (cache.has(hash)) {
        return Promise.resolve(cache.get(hash));
    }
    return shp.getShapefile(base, whiteList).then(function (resp) {
        cache.set(hash, resp);
        return resp;
    });
}

Wrong Caching Shapefiles

When using your library like that

convertSHP2GeoJSON: (buffer) ->
    shp(buffer).then (geoJSON) ->
        return geoJSON

the item (buffer) gets added to the cache. When using the shp function with another buffer, the already added but wrong item gets returned. Which is not the way it should work!

function shp(base, whiteList) {
    if (cache.has(base)) {
        return Promise.resolve(cache.get(base));
    }
    return shp.getShapefile(base, whiteList).then(function (resp) {
        cache.set(base, resp);
        return resp;
    });
}

We think there is a problem with the set and has logic inside that functions. Any suggestions?
Thanks for creating such a library!

Prime meridian information seems to be ignored in some cases

Hi,

I have been trying to process data in shapefile format with the attached .prj file in well-known text format (wkt).

test_case_prj.txt

The results I get are wrong: they are shifted to the West. With exactly the same input data, QGIS displays data correctly.

I soon became aware that 'long0' was not initialized, though it is used in the forward and inverse functions for Lambert Conformal Conic transformations.

If I set it to the value held in the prj file converted in radians in the initialization function associated to 'lcc':

          if (! this.long0) {
            this.long0 = 0.04079234433; // This is 2° 20' 14,025" East
          }

then I get the expected results.

I also noticed that the following lines were commented in function cleanWKT:

if (wkt.type === 'GEOGCS') {
	    geogcs = wkt;
	  }
	  if (geogcs) {
	    //if(wkt.GEOGCS.PRIMEM&&wkt.GEOGCS.PRIMEM.convert){
	    //  wkt.from_greenwich=wkt.GEOGCS.PRIMEM.convert*D2R;
	    //}
	    if (geogcs.DATUM) {

If I uncomment the three lines above instead of forcing the value of 'long0', then I also get the expected results.

It looks like the prime meridian information held in the prj file is simply ignored:

PROJCS["Lambert_Conformal_Conic",
GEOGCS["GCS_unnamed ellipse",
DATUM["D_unknown",SPHEROID["Unknown",6378249.2,293.466020999993]],
PRIMEM["Unknown",2.337229167],
UNIT["Degree",0.017453292519943295]],

Any help or insight would be highly appreciated.

Many thanks and kind regards.

Can't read shapefiles zipped up on mac.

Hello,
When trying to open the attached shapefile, or any that was zipped up on a Mac, I get an error:

Archive.zip
"Offset is outside the bounds of the DataView" (chrome)

It appears to be coming from code reading a dbf row header, but the error went away if i unzip/rezip on Windows, and has happened for multiple shape files.

file extension uppercase

When use a file with name name.DBF or name.PRJ or name.SHP, parseShp doesn't work. why this happen?

Conflict with Prototype 1.6.0.3

Kind of odd, but if the page has Prototype version 1.6.0.3, shp.js to load fails with "Uncaught WGS84"

shp.js:14153 Uncaught WGS84
Projection$1.callback @ shp.js:14153
Projection$1 @ shp.js:14163
Projection$1 @ shp.js:14149
(anonymous) @ shp.js:14629
(anonymous) @ shp.js:12805
54 @ shp.js:12808
s @ shp.js:1
(anonymous) @ shp.js:1
(anonymous) @ shp.js:22268
58../binaryajax @ shp.js:22422
s @ shp.js:1
e @ shp.js:1
(anonymous) @ shp.js:1
(anonymous) @ shp.js:1
(anonymous) @ shp.js:1

line where the failure is happening.
https://github.com/calvinmetcalf/shapefile-js/blob/gh-pages/dist/shp.js#L14153

Chrome Version 60.0.3112.90 (Official Build) (64-bit)

I'll be coding around it, but thought I'd post in case anyone else encounters this. I only tested 1.6.0.3, so it might not be an issue on newer versions.

Poor performance compared to examples

This library is working great, but I am seeing performance that is much slower than what I see in the examples, using the exact same Shape File.

Here is a simple shape file of Los Angeles county postal codes:
LA_Postal_Codes.zip

When I drag and drop the file on this sample page, http://leaflet.calvinmetcalf.com/#9/33.7540/-117.8174 , the results are added to the map in less than a second!

I created a very simple page to read this Shape File and it is consistently taking nearly 4 seconds to read the shape file. I can't seem to understand why there is such a discrepancy. I am using web workers, fwiw.

Here is fully functional plunkr with the simplest code I could come up with to reproduce these performance issues. http://plnkr.co/edit/JuEAGpzViRKym7Wh7rL6?p=preview

And here is the page source, but it would require some tweaks to point to script files to the correct locations.

<!DOCTYPE HTML>
<html>
    <head>
        <script type="text/javascript" src="./js/lib/shp.js"></script>
        <script type="text/javascript" src="./js/lib/catiline.js"></script>

        <style>
            body{
                margin: 0px;
                padding: 0px;
            }
            #fileDropDiv{
                width: 400px;
                height: 200px;
                background-color: #6BCC8A;
            }
        </style>
    </head>
    <body>
        <div id="fileDropDiv">
            Drag and Drop Zipped Shape File here!
        </div> 

        <script type="text/javascript">

            var worker = cw(function(data){
                importScripts('./js/lib/shp.js');
                return shp.parseZip(data);
            });

            //Setup the FileReader
            var reader = new FileReader();

            reader.onload = function(event) {

                var bufferArray = event.target.result;

                console.time('shp');
                worker.data(bufferArray).then(function(data){
                    console.timeEnd('shp');
                });
            };

            //Setup the drop div
            var fileDropDiv = document.getElementById('fileDropDiv');
            fileDropDiv.ondragover = function(){ return false; };
            fileDropDiv.ondragend = function(){ return false; };
            fileDropDiv.ondrop = function(e){

                e.preventDefault();

                //Only handle a single file for demo
                var files = e.dataTransfer.files;
                var file = files[0];

                //Read the shape file
                reader.readAsArrayBuffer(file);

                return false;
            };
        </script>

    </body>
</html>

Coding problem

There is a problem in Chinese;If the attribute value is Chinese, there will be a problem with the Chinese language

proj4 module resolution/usage confused

In an npm/webpack build, I cannot use shapefile-js. It appears that the proj4 module is not resolved correctly; shapefile-js throws with proj4 is not a function.

On line 57 of index.js,
zip[key.slice(0, -3) + key.slice(-3).toLowerCase()] = proj4(zip[key]);
should maybe be:
zip[key.slice(0, -3) + key.slice(-3).toLowerCase()] = proj4.default(zip[key]);

This works for me, but maybe it breaks some other build-tooling scenario. I've never seen this kind of problem before with published code.

If you need a "prj" shapefile to test against, grab a census shapefile from https://www.census.gov/geo/maps-data/data/cbf/cbf_sld.html .

Getting more done in GitHub with ZenHub

Hola! @joaosr has created a ZenHub account for the calvinmetcalf organization. ZenHub is the only project management tool integrated natively in GitHub – created specifically for fast-moving, software-driven teams.


How do I use ZenHub?

To get set up with ZenHub, all you have to do is download the browser extension and log in with your GitHub account. Once you do, you’ll get access to ZenHub’s complete feature-set immediately.

What can ZenHub do?

ZenHub adds a series of enhancements directly inside the GitHub UI:

  • Real-time, customizable task boards for GitHub issues;
  • Multi-Repository burndown charts, estimates, and velocity tracking based on GitHub Milestones;
  • Personal to-do lists and task prioritization;
  • Time-saving shortcuts – like a quick repo switcher, a “Move issue” button, and much more.

Add ZenHub to GitHub

Still curious? See more ZenHub features or read user reviews. This issue was written by your friendly ZenHub bot, posted by request from @joaosr.

ZenHub Board

Local Zipfile example in IE 10

It doesn't look like the local zipfile example works in IE 10. I tried both dragging and dropping a file as well as uploading it. I'm asking about this because I allow the user to drag a drop a zipfile containing a shapefile in my application. I am using this library to get the geojson. It works fine in IE 11, but in IE 10 it looks like the promise is never resolved.

I was hoping you could provide some insight. Thanks.

Support for Czech characters

Is there any possibility to add support for Czech national characters? I have some shapefiles in which are caracters Á, á, Č, č, Ď, ď, É, é, Ě, ě, Í, í, Ň, ň, Ó, ó, Ř, ř, Š, š, Ť, ť, Ú, ú, Ů, ů, Ý, ý, Ž and ž (the first table on http://esperanto.czechian.net/utf-8.html). I want to use leaflet.js for my bachelor's thesis, so it is very important for me. Im new in js, so i would be very grateful if there is any chance to add this on shapefile-js or giving me any advice where to start to do it. Thank You in advance.

Shapefile crossing the antimeridian converted incorrectly

I have a shapefile containing a polygon that crosses the antimeridian. Shapefiles determine the interior of a polygon by the order of vertices, specifically, the exterior ring vertices are in clockwise order. (http://www.esri.com/library/whitepapers/pdfs/shapefile.pdf page 8) GeoJSON doesn't follow any particular vertex ordering, thus to indicate antimeridian crossing, the polygon should be split on the 180 degree line. (https://tools.ietf.org/html/rfc7946#section-3.1.9)

example.zip

shapefile

geojson

File API support?

Hi!

Any plans to allow parse shp-files uploaded via File API?

Thanks!

Catiline worker promise not returning failed promise on bad files

Howdy,

Maybe this is the wrong place, so direct me if need be. Per this example, the worker adds features to the map upon parsing, and prints out the exception on fail

However, when parsing zips that do not contain valid shp files, an error is retrievable when not using a worker, and when using catiline, no error is thrown. It may be that I just don't know what I am doing, but I can't figure out if the shp file I am processing is failing.

var worker = cw({data:wfunc},2); worker.data(cw.makeUrl('../files/nj_muni.zip')).then(function(data){ geo.addData(data); },function(a){ console.log(a); }); worker.data(cw.makeUrl('../files/maSP.zip')).then(function(data){ geo.addData(data); },function(a){ console.log(a); });

My code is very similar.

`
var file = "actions/shape-files/view-file.php?name="+filename;

            var wfunc = function(base,cb){
                importScripts('../../dist/shapefile-js/dist/shp.min.js');
                shp(base).then(cb);
            }

            var worker = cw({data:wfunc},1);

            var worker_result = worker.data(cw.makeUrl(file));
            console.log(worker_result);

            worker_result.then(function(geojson){

                //do something with your geojson
                if(geojson == null){
                    $('#main-alert').html("<div class=\"alert alert-danger\"><i class=\"fa fa-thumbs-o-down\" aria-hidden=\"true\"></i> Failed to parse </div>");
                } else {
                    $('#console').val( $('#console').val() + 'Result: Passed\r\n');

                    if(checkType(geojson) === 'array'){
                        for(var i=0; i<geojson.length; i++){
                            $('#console').val( $('#console').val() + 'Shapefile : '+geojson[i].fileName+' - ['+geojson[i].type+']\r\n');
                        }
                        global_json = geojson;
                        process_data(global_json);
                    } else {
                        $('#console').val( $('#console').val() + 'Shapefile : '+geojson.fileName+' - ['+geojson.type+']\r\n');
                        global_json = [geojson];
                        process_data(global_json);
                    }

                    //console.log(geojson);
                }
            },function(a){console.log(a)});`

Local shapefile issue

When using the code for the local shapefile it only allows me to upload one shapefile and that is it.

lru cache should be optional

Cool library! Using this in node it is probably not ideal (memory could be huge even at just 20 items) to be using the LRU cache for long running applications. It would be nice if this was optional where it can be turned off entirely and or change the allowed cache size.

Projections

I saw this in your TODO list, and I was wondering if you looked at using the proj4js project to implement this.

I've made attempts in the past to make my own projection libraries, and the math is fascinating, but once I realized how many projections are out there, I decided gdal/ogr tools were good enough for me.

Error using shapefiles in EPSG:3995

I get the error below when I attempt to convert a shapefile in EPSG:3995 to geojson. The shapefile contains a single polygon and was created using QGIS Pisa.

RangeError: Invalid typed array length
at new Uint8Array (native)
at dbfRowHeader (http://localhost:8080/common/lib/shp/dist/shp.js:11964:43)
at module.exports (http://localhost:8080/common/lib/shp/dist/shp.js:12011:19)
at Function.shp.parseZip (http://localhost:8080/common/lib/shp/dist/shp.js:17562:58)
at http://localhost:8080/common/lib/shp/dist/shp.js:17622:16
at tryToUnwrap (http://localhost:8080/common/lib/shp/dist/shp.js:11491:5)
at tryCatch (http://localhost:8080/common/lib/shp/dist/shp.js:11515:17)
at Object.safelyResolveThenable as safely
at new Promise (http://localhost:8080/common/lib/shp/dist/shp.js:11326:21)
at Function.shp.getShapefile (http://localhost:8080/common/lib/shp/dist/shp.js:17621:10)

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.