Code Monkey home page Code Monkey logo

Comments (35)

jlpoolen avatar jlpoolen commented on July 19, 2024

Here's a small version of the file (4MBs)

http://napadata.net/projects/mbtiles-php/napa2.mbtiles

Here's a screenshot of the export from TileMill:

http://napadata.net/projects/mbtiles-php/napa2_v1_export.png

from mbtiles-php.

infostreams avatar infostreams commented on July 19, 2024

You are right. I can't get it to work either. It seems to be an issue with the .htaccess file, somehow - the tileserver.php script doesn't even seem to run. Very weird. I will investigate further at a later point, though -- I'm pretty much booked until the end of the week and it doesn't seem to be as quick of a fix as I thought. Very strange.

from mbtiles-php.

jlpoolen avatar jlpoolen commented on July 19, 2024

I'll work some more on this now that I have confirmation I'm not doing something patently wrong.

Just a warning, if you use the napa2 file, the zoom levels are different, so change the zoom in the index.html:

sqlite> select distinct(zoom_level) from tiles;
(zoom_level)
17
18
19
sqlite>

from mbtiles-php.

jlpoolen avatar jlpoolen commented on July 19, 2024

I run Gentoo and just saw in the apache error log that my installation PHP was missing the "pdo" functionality. Apparently "pdo" was default installation for PHP; however, in Gentoo, it is an option which is not activated by default, it has to be specifically included. I rebuilt dev-lang/php 5.5.2 withe the pdo option (in /etc/portage/package.use or the equivalent, add: dev-lang/php pdo is no existing entry for php exists, otherwise add "pdo" to the existing line). That hasn't solved the problem, but it's something to note.

Can php be made to error out in addition to error-log reports if the PDO module is not found? I don't know how I missed this, but I've been playing around with the htaccess file to ensure the redirects are occurring, so maybe the problem there prevented me from being aware of the missing pdo issue.

I'm still working on this, making progress slowly.

from mbtiles-php.

jlpoolen avatar jlpoolen commented on July 19, 2024

Here's where I am, I'm getting OKs for return of the PNGs, however, they are not rendering in my browser, I'm still getting gray screen.

I modified the .htaccess file by segregating the conditions, as the wording in Apache's mod_rewrite documentation suggests that all conditions above a rule have to be met (it's a logical impossibility to be a file AND a directory):

The RewriteCond directive defines a rule condition. One or more RewriteCond can precede a RewriteRule
directive. The following rule is then only used if both the current state of the URI matches its pattern, 
and if these conditions are met.

http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewriterule

I currently have my .htaccess with:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ tileserver.php [QSA,L]

RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.*)$ tileserver.php  [QSA,L]

My thinking was that when a URL comes back with a .png ending, that's a file that does not exist, therefore the condition option "-f" should be negated to "!-f" triggering the rewrite so the phantom url, i.e. "/mbtiles-php/napa2/17/21007/80650.png", gets sent to tileserver.php for handling.

It looks like the problem I am having now is that the returned PNGs are not rendering, so I must be doing something wrong with Leaf.

I also have a perl script which pulls the PNGs from the database and confirms that the SQLite database is what it is expected to be... I'm not seeing a file attachment option currently in this editing session or I would include it here.

from mbtiles-php.

jlpoolen avatar jlpoolen commented on July 19, 2024

Also, the root of the file name without the prefix should be used in the URL as tileserver.php will take inventory of the mbtile files in its directory and references same only by the root of the file name. So where I have napa2.mbtiles in the directory, the HTML should reference it as follows:

Bad:

   var url = 'http://themis/mbtiles-php/napa2.mbtiles/{z}/{x}/{y}.png';

Good:

  var url = 'http://themis/mbtiles-php/napa2/{z}/{x}/{y}.png';

from mbtiles-php.

jlpoolen avatar jlpoolen commented on July 19, 2024

I've determined that the PNG being transmitted back does not render as it should. For example, at zoom 17, Firefox Developer Tools - Inspector revealed that I had:

 <img class="leaflet-tile leaflet-tile-loaded" style="height: 256px; 
 width: 256px; transform: translate(956px, 1021px);" 
 src="http://themis/mbtiles-php/napa2/17/21010/80650.png"></img>

The console log shows:
2013-09-30 08_17_18-greenshot

The PNG pulled out of napa.mbtiles by my perl script displays correctly:
17_21010_80650

On my Linux laptop, themis, I queried the tileserver.php using wget and the PNG returned does not display:

themis tmp # wget http://themis/mbtiles-php/napa2/17/21010/80650.png
--2013-09-30 08:07:11--  http://themis/mbtiles-php/napa2/17/21010/80650.png
Resolving themis... 192.168.1.25
Connecting to themis|192.168.1.25|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 334 [image/png]
Saving to: â80650.pngâ

100%[=======================================================================================================>] 334         --.-K/s   in 0s

2013-09-30 08:07:11 (57.9 MB/s) - â80650.pngâ saved [334/334]

themis tmp # 

Here is a link to the mangled PNG pull by wget: http://napadata.net/projects/mbtiles-php/80650.png

So, it now looks like the problem is occurring between the fetch from the SQLite database and serving back to the caller requesting the resource, i.e. the Firefox session

Is there a method (I do not have chops for PHP, though I usually follow it since I'm know Perl) where I can invoke tileserver.php from a shell and feed it whatever parameters so it will return the PNG?

from mbtiles-php.

jlpoolen avatar jlpoolen commented on July 19, 2024

I isolated the SQLite component and created in a sibling directory, removing the .htaccess, the following php file:

    <?php

$dbname = 'napa2.mbtiles';

$db = new SQLite3($dbname);

if (!$db) die ($error);

$query = "select tile_data as t from tiles where zoom_level= '17' and tile_column= '21010' and tile_row='80650'";
$result = $db->querySingle($query);
if (!$result) die("Cannot execute query.");



// serve it up
header('Content-type: image/png');
print $result;

$db->close();
?>

Therefore, I'm concluding the last hurdle I'm facing is an incompatibility regarding SQLite vs. SQLite3. I'm guessing the Gentoo defaults to SQlite 3 for PHP 5.5.2, whereas an earlier version seems to have a dichotomy between "sqlite" and "sqlite2". Here's what I have installed (2 versions which are slotted):

    [I] dev-lang/php
    Available versions:
       (5.3)   5.3.27
       (5.4)   5.4.17 ~5.4.18 ~5.4.19 ~5.4.20
       (5.5)   5.5.2 ~5.5.3 ~5.5.3-r1 ~5.5.4
       {{apache2 bcmath berkdb bzip2 calendar cdb cgi cjk +cli crypt +ctype curl curlwrappers debug embed enchant exif +fileinfo +filter firebird flatfile fpm frontbase ftp gd gdbm gmp +hash +iconv imap inifile intl iodbc ipv6 +json kerberos ldap ldap-sasl libedit libmysqlclient mhash mssql mysql mysqli mysqlnd nls oci8-instant-client odbc +opcache pcntl pdo +phar +posix postgres qdbm readline recode selinux +session sharedmem +simplexml snmp soap sockets spell sqlite sqlite2 ssl sybase-ct systemd sysvipc threads tidy +tokenizer truetype unicode wddx +xml xmlreader xmlrpc xmlwriter xpm xslt zip zlib}}
    Installed versions:  5.4.17(5.4)(10:12:34 PM 07/24/2013)(apache2 berkdb bzip2 cli crypt ctype exif fileinfo filter gd gdbm hash iconv ipv6 json ldap mysql nls phar posix readline session simplexml spell ssl tokenizer truetype unicode xml zlib -bcmath -calendar -cdb -cgi -cjk -curl -curlwrappers -debug -embed -enchant -firebird -flatfile -fpm -frontbase -ftp -gmp -imap -inifile -intl -iodbc -kerberos -ldap-sasl -libedit -mhash -mssql -mysqli -mysqlnd -oci8-instant-client -odbc -pcntl -pdo -postgres -qdbm -recode -selinux -sharedmem -snmp -soap -sockets -sqlite -sybase-ct -sysvipc -threads -tidy -wddx -xmlreader -xmlrpc -xmlwriter -xpm -xslt -zip) 5.5.2(5.5)(07:26:32 AM 09/30/2013)(apache2 berkdb bzip2 cli crypt ctype exif fileinfo filter gd gdbm hash iconv ipv6 json ldap mysql nls opcache pdo phar posix postgres readline session simplexml spell sqlite ssl tokenizer truetype unicode xml zlib -bcmath -calendar -cdb -cgi -cjk -curl -debug -embed -enchant -firebird -flatfile -fpm -frontbase -ftp -gmp -imap -inifile -intl -iodbc -kerberos -ldap-sasl -libedit -libmysqlclient -mhash -mssql -mysqli -oci8-instant-client -odbc -pcntl -qdbm -recode -selinux -sharedmem -snmp -soap -sockets -sybase-ct -sysvipc -threads -tidy -wddx -xmlreader -xmlrpc -xmlwriter -xpm -xslt -zip)
    Homepage:            http://php.net/
    Description:         The PHP language runtime engine: CLI, CGI, FPM/FastCGI, Apache2 and embed SAPIs.

Lastly, I'll attempt to integrate SQLite3 into my tileserver.php -- I guess this effort is heading towards a branch of this project. I'll update this issue when I have completed the task.

from mbtiles-php.

jlpoolen avatar jlpoolen commented on July 19, 2024

If found the culprit at line near line 175 in function serveTile (I modified the php extensively for SQLite3 and error log debugging). I removed the negation which was causing the if clause to trigger since is_tms was assigned "false" at the outset.

    //if (!$this->is_tms) { // original
    if ($this->is_tms) {    // john test

What was happening is that the "y" values were being altered, so the correct y value of 80650 to 50421.
I do not knot what "is_tms" stands for or what purpose tracking this property serves. Can someone provide some insight on what the role of "is_tms" is? I'm guessing a different type of coordinate system.

from mbtiles-php.

infostreams avatar infostreams commented on July 19, 2024

Hey! Ok, wow, you've done a ton of work in tracking this down. Regarding some of the points you bring up:

  1. We should probably add a test for the PDO module before we try to run any SQL queries. That should have revealed your initial server configuration issue without you doing any kind of digging.
  2. That test should also check whether we're dealing with sqlite or sqlite2, and adjust the behavior accordingly.
  3. I want to update the code so you can also use 'http:///napa2.mbtiles/17/21010/80650.png' instead of just ''http:///napa2/17/21010/80650.png'. In other words: I think including ".mbtiles" in the name should not be considered such a grave mistake that the mapserver goes completely blank.
  4. You found a (very stupid) bug in the .htaccess file that prevented the whole system from working. I can't believe it was there in the first place. Mea culpa. This was the reason why I got the grey tiles. Basically the code, as you found it, was non-functional.
  5. Finally, the is_tms is indeed another coordinate system. It's used in the TileMapServiceController that implements the Tile Map Service specification. I basically inherited from the original code I forked. I'm not sure how it would apply to leaflet.js frontend-code, as the leaflet code uses a different coordinate system (basically the inverse).

If you have any code to share, please do. I'd gladly accept a pull request to make this project better. Thank you!

Ed

from mbtiles-php.

infostreams avatar infostreams commented on July 19, 2024

I changed the .htaccess file to address point #4. For the record, I still don't see your map. I will look into it tonight when I (hopefully) have some more time to track down the problem here. Also, I think your idea of an example/test page is a great one that I really want to add.

from mbtiles-php.

jlpoolen avatar jlpoolen commented on July 19, 2024

I've never forked a project before, so I guess this is as good a time as any to do so. I'm exploring a pretty sophisticated project (campaign map application) and am finding the mapping arena to be a minefield of technologies which takes a high degree of sophistication to traverse. Accordingly, I'm going to fork so I can capture and preserve the cavalcade of issues I'm encountering and how to deal with them; many of the issues exceed the purpose of this project and touch really upon mapping in general. I can see why wandering into the realm of mapping applications can be daunting and not for the feint of heart. Hopefully my effort will make it easier to jump in and get one's feet wet.

I should note that I came to this project because of my failure to get the mapbox related technology, tilestream , to work (see cutting-room-floor/tilestream#118). What concerned me was the suggestion of someone related to the mapbox project concluding I was posting to the incorrect area, to wit their Github project which was not accomplishing the task I had hoped it would, and suggesting I should move my issues into their private forum where they could provide assistance presumably according to their availability and interest. I obliged and posted to the mapbox private forum, as well, and nothing has happened since. As time has told, it was better for me to try this project where the technology stack was more amenable to me and make it work for me than to rely on someone else. Perhaps later I might return to tilestream as it is clearly more popular (mapbox sports some impressive features and adopters that I hope to harness), but that may be because people want an easy solution and are willing to pay for it with dollars rather than their time.

For now mbtiles-php has allowed me to move forward which, at the end of the day, is what really counts. Thank you creating this project.

from mbtiles-php.

yooperjb avatar yooperjb commented on July 19, 2024

Has anything been done to solve the issues from above? I'm trying to use the script and having the same issues - blank tiles with 404 File not found on the png files. Any luck in producing that example file to help guide noobs like myself?

Thanks a bunch.

from mbtiles-php.

infostreams avatar infostreams commented on July 19, 2024

I've just added an example to the repository. Perhaps this could help you out? You could try replacing the mbtiles file in the example with the one that is giving you empty PNGs, and see if it works. If the example displays and your own mbtiles file doesn't, then you know the problem is in your mbtiles file somewhere... Let me know how it goes.

from mbtiles-php.

yooperjb avatar yooperjb commented on July 19, 2024

Wow, thanks for the quick response. I'll check out the example and let you know how it goes. Excited to get this to work. Thanks!

from mbtiles-php.

yooperjb avatar yooperjb commented on July 19, 2024

Great! It works, but fyi there is no basemap in the server directory the example calls for. I replaced it with my mbtiles file and it works fine. I noticed that wax is deprecated and Mapbox now says to use the Mapbox.js instead. I'm more familiar with the Mapbox.js and is what I've been using to setup map options. Is it possible to get the same functionality in this example using the mapbox.js?

Thanks a bunch for the help.

from mbtiles-php.

yooperjb avatar yooperjb commented on July 19, 2024

Really loving the script, thanks.

I'm currently having issues trying to implement a layer control to switch between multiple layers. I've successfully got the leaflet layer control active and multiple layers showing, however it will not initiate the layers when selected. My code is:

$(document).ready(function () {
// initialize the map
wax.tilejson('server/EU.tilejson',
function (tilejson) {
var map = new L.Map('map',
{maxBounds:[[84,-360],[-80,360]],
})
.addLayer(new wax.leaf.connector(tilejson));
map.setView(new L.LatLng(30, 0), 2);

          L.control.layers({
            'EU Countries': L.tileLayer('server/EU.tilejson').addTo(map),
            'OPEC Countries': L.tileLayer('server/OPEC_countries.tilejson'),
            'NATO Countries': L.tileLayer('server/NATO_countries.tilejson'),
            'UN Countries': L.tileLayer('server/UN_countries.tilejson'),
            }).addTo(map);

          // Create map legend
          wax.leaf.legend(map, tilejson).appendTo(map._container);


          // add click & tooltip functionality
          wax.leaf.interaction()
                  .map(map)
                  .tilejson(tilejson)
                  .on(wax.tooltip().animate(true).parent(map._container).events());
        });

});

The example can be found at:
http://www.humboldtcartography.com/projects/sage/political_groups/

Any help with getting the layers to switch?

Thanks!

from mbtiles-php.

PennyBeames avatar PennyBeames commented on July 19, 2024

Hey!

I'm having similar troubles as yooperjb in that I'm trying to use Mapbox.js, and I'm just not getting anywhere. There's no basemap included in the directory to show how the example works, and even when I load my own mbtiles into your example, all I get is the div that contains your title, but no image.

I know I'm new, but I'm dying to get this to work.

from mbtiles-php.

yooperjb avatar yooperjb commented on July 19, 2024

@PennyBeames
The example worked perfectly for me using my own mbtiles file exported from Mapbox. What I'm stuck on is getting a layer control (switcher) to work using wax leaflet. In order to get the example to work you must change the name of the file in the index.html to your mbtiles file saved in the server folder. Those folders must up uploaded to your web server or local machine if set up as a server.

Hope this helps.

from mbtiles-php.

yooperjb avatar yooperjb commented on July 19, 2024

Greetings,
I'm wondering if it is possible to use the mbtiles-php script with the mapbox.js rather than deprecated wax. There just doesn't seem to be much support for wax since it has been replaced with the mapbox.js. Any info?

Thanks.

from mbtiles-php.

infostreams avatar infostreams commented on July 19, 2024

@PennyBeames I added the appropriate .mbtiles file to the repository (it was being ignored by the .gitignore file). If you re-download or pull then the example should work.

from mbtiles-php.

infostreams avatar infostreams commented on July 19, 2024

I will try to add a mapbox.js-based example with layers somewhere in the coming days/next week. The reason it's using wax now is that I based the example on some old code that I still had laying around. I realize it's outdated :-/

from mbtiles-php.

infostreams avatar infostreams commented on July 19, 2024

The example has been updated to work with mapbox.js. Please check if this now works for you.

from mbtiles-php.

yooperjb avatar yooperjb commented on July 19, 2024

Wow, thanks a bunch again for your work. I'll test the new sample and let you know. Cheers.

from mbtiles-php.

PennyBeames avatar PennyBeames commented on July 19, 2024

Thank you so much for responding so quickly and for putting the Mapbox.js example together.

I've got the example working now. This is such a huge help.

from mbtiles-php.

yooperjb avatar yooperjb commented on July 19, 2024

Example is working great, but I can't for the life of me get the mapbox.js Layer Control to work. I've got the code to work fine if pulling tilelayers from mapbox, but any mbtiles on my server will not work and the layer control box does not even show up. My code is simply:

L.mapbox.map('map','server/english_language.tilejson')
.setView([30, 0], 2);

L.control.layers({
'English': L.tileLayer('server/english_language.tilejson').addTo(map),
'Spanish': L.tileLayer('server/spanish_language.tilejson'),
}).addTo(map);

Is there something tricky I need to do in order to get the layer control and layers to work? Thanks a bunch.

from mbtiles-php.

yooperjb avatar yooperjb commented on July 19, 2024

I've finally got the mapbox.js Layer Control to show up by setting the map as a variable, however there is now no interactivity with the layers when I mouse over them. Any help in pulling the UTFgrid info from the layers?

var map = L.mapbox.map('map')
.setView([30, 0], 2);

L.control.layers({
'English': L.mapbox.tileLayer('server/english_language.tilejson').addTo(map),
'Spanish': L.mapbox.tileLayer('server/spanish_language.tilejson'),
}).addTo(map);

from mbtiles-php.

PennyBeames avatar PennyBeames commented on July 19, 2024

Have you worked with layer control outside of this mbtiles project?

I've been having a hell of a time getting layer control and UTF grid to
work together. The folks at Mapbox support gave me this:

http://bl.ocks.org/geografa/8589994

I haven't tried using it with mbtiles yet, though.

On Sat, Jan 25, 2014 at 1:19 PM, yooperjb [email protected] wrote:

I've finally got the mapbox.js Layer Control to show up by setting the map
as a variable, however there is now no interactivity with the layers when I
mouse over them. Any help in pulling the UTFgrid info from the layers?

var map = L.mapbox.map('map')

.setView([30, 0], 2);

L.control.layers({
'English':
L.mapbox.tileLayer('server/english_language.tilejson').addTo(map),
'Spanish': L.mapbox.tileLayer('server/spanish_language.tilejson'),
}).addTo(map);


Reply to this email directly or view it on GitHubhttps://github.com//issues/4#issuecomment-33295722
.

from mbtiles-php.

yooperjb avatar yooperjb commented on July 19, 2024

I've successfully got the layer control visible properly switching between layers, but have tried everything to get the info window to not show for inactive layers. I looked at the example you posted and the code looks really similar to what I'm using so it seems the info window would show for all layers, but I'll check it out. Thanks.

from mbtiles-php.

yooperjb avatar yooperjb commented on July 19, 2024

@PennyBeames I successfully got the example you posted to work for one of my projects. I kept most of the original text in the example and simply commented out anything I didn't need. Hope this helps you. Thanks a bunch for the example.

<script type='text/javascript'>
// add some base layers
//var english_base = L.mapbox.tileLayer('server/english_language.tilejson');
//var spanish = L.mapbox.tileLayer('server/spanish_language.tilejson');

//declare layer groups - for baselayers
var english = new L.LayerGroup(),
    spanish = new L.LayerGroup();

// declare tilelayers - that go into layer groups
var english_language = L.mapbox.tileLayer('server/english_language.tilejson').addTo(english);
//var english_language_default = L.mapbox.tileLayer('server/english_language.tilejson').addTo(map);
var spanish_language = L.mapbox.tileLayer('server/spanish_language.tilejson').addTo(spanish);

// declare gridlayer that correspond to tilelayers above
var englishGridLayer = L.mapbox.gridLayer('server/english_language.tilejson').addTo(english);
var spanishGridLayer = L.mapbox.gridLayer('server/spanish_language.tilejson').addTo(spanish);

// declare your map and settings
 var map = L.mapbox.map('map')
    .setView([30, 0], 2);


// add the gridControl for the gridLayers
map.addControl(L.mapbox.gridControl(englishGridLayer));
map.addControl(L.mapbox.gridControl(spanishGridLayer));

// create the baselayers (and overlays) for the layer control
var baseLayers = {
  "English": english.addTo(map),
  "Spanish": spanish
};
//var overlays = {
//  "Trees": trees,
//  "Buildings": bldgs
//};

// add the layer control
L.control.layers(baseLayers,null,{position:'topleft'}).addTo(map);

</script>

from mbtiles-php.

infostreams avatar infostreams commented on July 19, 2024

I've added an example of how to simply add layers to your map. The code you posted above is really quite complicated for what it is (but I'm happy that you got it to work). Please have a look and let me know what you think.

from mbtiles-php.

yooperjb avatar yooperjb commented on July 19, 2024

@infostreams Thanks for this example. This example, however, doesn't necessarily reflect the original issues being discussed previously. This is a great and simple method for generating the layer control, but doesn't utilize the interactivity with the utfgrid. The sample I posted above is a solution to dealing with multiple layers which have tooltip info windows. The main issue was getting those info windows not to appear when a different layer was active. The solution above shows how to pass the grid layer to a layergroup instead of the map so a particular layers info window is not displayed when the layer is inactive. It is rather quite complicated, but the only solution I've found that works so far. I'd love to know if there is an easier method, but haven't found one yet. Thanks again for the great work you've done.

from mbtiles-php.

infostreams avatar infostreams commented on July 19, 2024

Ok, I think I didn't catch that before. Thanks for the clarification!

The project I originally wrote this mbtiles-php project for had a similar issue, and I could only resolve it by digging deeply into the Leaflet.js code and eventually ended up manually intercepting the 'layeradd' and 'layerremove' events. Gah. But yeah, that was Leaflet.js and it's been deprecated and replaced with Mapbox.js so it doesn't really apply anymore. In any case, your code is much cleaner (and much shorter). I was struck at the time why this wouldn't be supported out of the box, since it's almost "expected behavior", and I'm actually a bit disappointed that apparently it's still an issue. Glad you got it to work though ;-)

from mbtiles-php.

davidsinjaya avatar davidsinjaya commented on July 19, 2024

Hi,
It is so good that we have nice discussion here.

@infostreams Anyway, I found a problem too to get the example working. I have just downloaded the latest project yesterday and example does not work for me. I followed the default project, then it returned:
GET http://localhost/mbtiles-php/example/server/basemap.tilejson 404 (Not Found) mapbox.js:1
could not load TileJSON at server/basemap.tilejson mapbox.js:7

Then, I tried to change into basemap.mbtiles on index.html, and it returned:
Uncaught SyntaxError: Unexpected token S mapbox.js:6

I made sure that 'basemap.mbtiles' is there. I tried to use my own mbtiles and returned the same.
Please help!

from mbtiles-php.

penguindragon avatar penguindragon commented on July 19, 2024

Hi there,

I have precisely the same issue here.
In my case firebug detects an unsuccessful attempt to get XML (on XMLhttprequest: responseXML = null).
Could you please help? Thanks a lot!

from mbtiles-php.

Related Issues (16)

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.