Coder Social home page Coder Social logo

laszip4j's People

Contributors

azure-pipelines[bot] avatar dependabot[bot] avatar jason-daly avatar mreutegg 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

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

laszip4j's Issues

Wavepacket13 not setting y and z correctly

Hi,
Noticed this typo in LASwavepacket13 class:

    public LASwavepacket13() {
        this.return_point = U32I32F32.wrap(slice(12, 4));
        this.x = U32I32F32.wrap(slice(16, 4));
        this.y = U32I32F32.wrap(slice(16, 4));
        this.z = U32I32F32.wrap(slice(16, 4));

Should y and z be set like this?:

        this.y = U32I32F32.wrap(slice(20, 4));
        this.z = U32I32F32.wrap(slice(24, 4));

Trouble extracting SwissTopo data

I'm happy to have found your tool, and am able to get a simple test program running to convert LAS->XYZ, but not able to use the jar on a las directly. The datafiles from SwissTopo are too big too work with in XYZ, so I'd like to try getting the Jar program working instead. Hoping you can help since you seem to have been looking at the same data :)

I've built the code (on OSX, java 17) with:

mvn package

which yields: laszip4j-0.9-SNAPSHOT.jar

And downloaded my target from SwissTopo, and extracted the single .las file:

544M    swisssurface3d_2019_2687-1169_2056_5728.las.zip
1.1G    2687_1169.las

Running:

java -jar target/laszip4j-0.9-SNAPSHOT.jar -oparse xyzc -i 2687_1169.las  -keep_class 3 4 5 6 10 -o out

I get:

pablo@top:~/laszip4j> java -jar target/laszip4j-0.9-SNAPSHOT.jar -oparse xyzc -i 2687_1169.las  -keep_class 3 4 5 6 10 -o out
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: begin -1, end 3, length 3
        at java.base/java.lang.String.checkBoundsBeginEnd(String.java:4601)
        at java.base/java.lang.String.substring(String.java:2704)
        at java.base/java.lang.String.substring(String.java:2677)
        at com.github.mreutegg.laszip4j.laslib.LASwriteOpener.set_file_name(LASwriteOpener.java:439)
        at com.github.mreutegg.laszip4j.laslib.LASwriteOpener.parse(LASwriteOpener.java:254)
        at com.github.mreutegg.laszip4j.lastools.Laszip.run(Laszip.java:91)
        at com.github.mreutegg.laszip4j.lastools.Laszip.main(Laszip.java:46)

btw, here's my LAS->XYZ program:

import java.io.File;
import com.github.mreutegg.laszip4j.LASReader;
import com.github.mreutegg.laszip4j.LASPoint;


class Test {
  public static void main(String [] args) throws Exception {
    LASReader reader = new LASReader(new File(args[0]));
    for (LASPoint p : reader.getPoints()) {
      // read something from point
      //p.getClassification();
      System.out.printf("%d %d %d\n", p.getX(), p.getY(), p.getZ());
    }
  }
}

LAZ 1.4

Hello,

while the access to Las 1.4 works fine, my implementation crashes with the compressed LAZ 1.4 format (while the compressed LAZ 1.2 works fine).

The error message is:

ERROR: compressor 3 not supported (LASzip v2.4r1)
please upgrade to the latest release of LAStools (with LASzip)
or contact '[email protected]' for assistance.

How to read 'Intensity'?

Hello,

I would like to know how I can use the library to read the intensity field from a las/laz file.

Potential for negative classifications

Hi,
I found a bug in some of the code I wrote last year...
In the LASreadItemRaw_POINT14 class, the classification byte is read into a signed byte (-127..127), but needs to be read as an unsigned byte (0..255).

I have a fix for it, and will submit a PR.

Regards,
Jason Daly

Create a Java wrapper laszip.dll

I'm trying to use JNA to make a wrapper. But I'm stuck.

This is my procedure:

laszip_create(&laszipReader);
laszip_open_reader(&laszipReader, "test.las", is_compressed=false);

But it's raised: "writer is already open"

Please see My code

and laszipdllexample

Points not written in output file

Hi,

I run the program in IDE with my inputs as:

`String[] myArgs = {"-oparse", "xyzc", "-keep_class", "3", "4", "5" ,"6", "10",
"-i", "path\to\my\lazfile",
"-o", "path\to\my\output.xyzk"};

Laszip.main(myArgs);`

output.xyzk is created but no data is dumped in it.
On debugging it seems following code on line 654 in Laszip.java is the cause:

while (lasreader.read_point()) { laswriter.write_point(lasreader.point); }

laswriter.write_point(lasreader.point) is never executed.
lasreader.read_point() does read points from .laz input file.

@mreutegg

input / output stream

It would be nice that a las can read by any InputStream and write to any OutputStream, because in my case I working with an S3 storage and so I don't h ave got any files, I have got streams only.

My goal is to convert an InputStream with a LAS into an OutputStream with LAZ, so need something like

try
(
    final las = new LasReader( myLASINputStream );
    final laz = new LazWriter( myLAZOutputStream ); 
)
{
    IOUtil.pipe( las, laz );
}

How to access EXTENDED VARIABLE LENGTH RECORDS (EVLR)?

Hi,
frist of all thank you for the lib. Accroding to the LAS specification 1.3 (and 1.4) there are EXTENDED VARIABLE LENGTH RECORDS (EVLR). How can I access them using your lib? I see only the following API:

  • LASReader#getHeader()
  • LASReader#getPoints()
  • LASHeader#getVariableLengthRecords()

I am missing something like getExtendedVariableLengthRecords().

Many thanks in advance.

Dawid

Can I use laszip4j to modify a lidar file content?

I have Java code that processes a lidar file and identifies anomalous sample points. I would like to be able to transcribe an existing file content, either removing the anomalous records or marking them as "withheld". I am also working on the ability to classify points.

Is there way to use laszip4j to handle the writing operations? If so, is there example code or documentation in the repository?

Ideally, I would like to be able to preserve header elements and other data such as VLR's so that I had a viable output file at the end of the process.

Thanks.

P.S. Sorry to have used a Github Issue to convey what is really just a question, but I didn't see any alternate means of contact.

Support random access of samples from file

As I've mentioned in the past, I am using laszip4j in an interactive application that allows the user to display lidar data (see https://github.com/gwlucastrig/Tinfour ). It is working quite well for me and I would like to do more with it.

One of the functions of the application is to allow the user to click on the display and obtain data for the particular lidar sample point at the indicated position. Due to the large number of samples in a lidar file and the limitations of memory, I only retain the bare minimum of elements in memory (x, y, z, classification, and sample record number). So when the user requests a full report on a sample, the application needs to re-read it from the source data file.

When the application is working with non-compressed LAS files, which have fixed-length records, the application can use the record number to compute a file position and extract a record at random. So when the user clicks on a sample, the application opens the file, reads the record of interest, and gives the user a full report of the data available for the sample (including GPS time, return number, intensity, scan angle rank, RGB, etc.). I would like to support doing the same thing for LAZ files (which do not have a fixed record length). To do so, I need a way to read a particular record at random.

Does laszip4j have an API that will allow me to do this? If so, do you have example code or documentation I can use to implement that function?

One way to accomplish this function, of course, is to simply re-read the entire data file when the user cIicks on the screen, and discard all except the sample of interest. That will work, but it would probably be too slow for an interactive application. I know that Martin Isenburg designed the laszip format so that samples would be compressed in blocks of 50000. So if the application knows the starting position of all the blocks, it should be possible to extract just the block that includes the sample of interest (reading a block of 50000 points should be a lot faster than reading several million). I know that there is a class that lets an application create an index for a LAZ file. So some of the pieces for accomplishing this function do exist. But I've looked through the code and don't see a mechanism for reading a single block. Is there a way to do so?

Thanks.

Give LASReader a method to close the InputStrea

In LASReader an internal LASreader is created.
The only way to close this ready is by iterrating all over the file until readNext() returns null

        private LASPoint readNext() {
            LASPoint p = r.read_point() ? new LASPoint(r.point) : null;
            if (p == null) {
                r.close();
                p = end;
            }
            return p;
        }

I think it would be beneficial to offer a method close(), that would close the reader directly.
In our case we have a very very large LAZ File and if something goes wrong we want to close the handle on the file directly and not read the file until its very end.

Is it possible to write las file from LasReader.insideRectangle ?

Hello, I am developing a tiling algorithm that needs to read a las/laz using .insideRectangle() from the LASReader and create a tile file from this region.
The following snippet does not work for me and I was wondering if this is expected or not :

val lasReader = LASReader(File(parentTilePath)).insideRectangle(xMin, yMin, xMax, yMax)

val childTileOutputFile = File(outputFolderAbsolutePath, "${UUID.randomUUID()}.laz")

val writer = LASWriter(lasReader)
writer.write(childTileOutputFile)

Stacktrace :

Conversion = 'l'
java.util.UnknownFormatConversionException: Conversion = 'l'
	at java.base/java.util.Formatter$FormatSpecifier.conversion(Formatter.java:2858)
	at java.base/java.util.Formatter$FormatSpecifier.<init>(Formatter.java:2884)
	at java.base/java.util.Formatter.parse(Formatter.java:2729)
	at java.base/java.util.Formatter.format(Formatter.java:2671)
	at java.base/java.io.PrintStream.format(PrintStream.java:1209)
	at java.base/java.io.PrintStream.printf(PrintStream.java:1105)
	at org.gradle.internal.io.LinePerThreadBufferingOutputStream.printf(LinePerThreadBufferingOutputStream.java:148)
	at com.github.mreutegg.laszip4j.clib.Cstdio.fprintf(Cstdio.java:39)
	at com.github.mreutegg.laszip4j.laslib.LASwriterLAS.close(LASwriterLAS.java:389)
	at com.github.mreutegg.laszip4j.laslib.LASwriter.close(LASwriter.java:35)
	at com.github.mreutegg.laszip4j.LASWriter.write(LASWriter.java:56)
	at com.mdai.core.datasources.pointcloud.PointCloudOnDiskDataSource.createChildTile(PointCloudOnDiskDataSource.kt:54)
	at com.mdai.core.datasources.pointcloud.PointCloudOnDiskDataSourceTest$1$1.invokeSuspend(PointCloudOnDiskDataSourceTest.kt:77)
	at com.mdai.core.datasources.pointcloud.PointCloudOnDiskDataSourceTest$1$1.invoke(PointCloudOnDiskDataSourceTest.kt)
	at com.mdai.core.datasources.pointcloud.PointCloudOnDiskDataSourceTest$1$1.invoke(PointCloudOnDiskDataSourceTest.kt)
	at io.kotest.core.spec.style.scopes.FreeSpecContainerScope$invoke$2.invokeSuspend(FreeSpecContainerScope.kt:33)
	at io.kotest.core.spec.style.scopes.FreeSpecContainerScope$invoke$2.invoke(FreeSpecContainerScope.kt)
	at io.kotest.core.spec.style.scopes.FreeSpecContainerScope$invoke$2.invoke(FreeSpecContainerScope.kt)
	at io.kotest.engine.test.TestCaseExecutor$execute$innerExecute$1.invokeSuspend(TestCaseExecutor.kt:83)
	at io.kotest.engine.test.TestCaseExecutor$execute$innerExecute$1.invoke(TestCaseExecutor.kt)
	at io.kotest.engine.test.TestCaseExecutor$execute$innerExecute$1.invoke(TestCaseExecutor.kt)
	at io.kotest.engine.test.interceptors.CoroutineDebugProbeInterceptor.intercept(CoroutineDebugProbeInterceptor.kt:29)
	at io.kotest.engine.test.TestCaseExecutor$execute$3$1.invokeSuspend(TestCaseExecutor.kt:92)
	at io.kotest.engine.test.TestCaseExecutor$execute$3$1.invoke(TestCaseExecutor.kt)
	at io.kotest.engine.test.TestCaseExecutor$execute$3$1.invoke(TestCaseExecutor.kt)
	at io.kotest.engine.test.interceptors.TestDispatcherInterceptor.intercept(TestDispatcherInterceptor.kt:34)
	at io.kotest.engine.test.TestCaseExecutor$execute$3$1.invokeSuspend(TestCaseExecutor.kt:92)
	at io.kotest.engine.test.TestCaseExecutor$execute$3$1.invoke(TestCaseExecutor.kt)
	at io.kotest.engine.test.TestCaseExecutor$execute$3$1.invoke(TestCaseExecutor.kt)
	at io.kotest.engine.test.interceptors.InvocationTimeoutInterceptor$intercept$3.invokeSuspend(InvocationTimeoutInterceptor.kt:43)
	at io.kotest.engine.test.interceptors.InvocationTimeoutInterceptor$intercept$3.invoke(InvocationTimeoutInterceptor.kt)
	at io.kotest.engine.test.interceptors.InvocationTimeoutInterceptor$intercept$3.invoke(InvocationTimeoutInterceptor.kt)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturnIgnoreTimeout(Undispatched.kt:100)
	at kotlinx.coroutines.TimeoutKt.setupTimeout(Timeout.kt:146)
	at kotlinx.coroutines.TimeoutKt.withTimeoutOrNull(Timeout.kt:103)
	at io.kotest.engine.test.interceptors.InvocationTimeoutInterceptor.intercept(InvocationTimeoutInterceptor.kt:42)
	at io.kotest.engine.test.TestCaseExecutor$execute$3$1.invokeSuspend(TestCaseExecutor.kt:92)
	at io.kotest.engine.test.TestCaseExecutor$execute$3$1.invoke(TestCaseExecutor.kt)
	at io.kotest.engine.test.TestCaseExecutor$execute$3$1.invoke(TestCaseExecutor.kt)
	at io.kotest.engine.test.TestInvocationInterceptor$intercept$2$3.invokeSuspend(TestInvocationInterceptor.kt:36)
	at io.kotest.engine.test.TestInvocationInterceptor$intercept$2$3.invoke(TestInvocationInterceptor.kt)
	at io.kotest.engine.test.TestInvocationInterceptor$intercept$2$3.invoke(TestInvocationInterceptor.kt)
	at io.kotest.mpp.ReplayKt.replay(replay.kt:18)
	at io.kotest.engine.test.TestInvocationInterceptor$intercept$2.invokeSuspend(TestInvocationInterceptor.kt:31)
	at io.kotest.engine.test.TestInvocationInterceptor$intercept$2.invoke(TestInvocationInterceptor.kt)
	at io.kotest.engine.test.TestInvocationInterceptor$intercept$2.invoke(TestInvocationInterceptor.kt)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturn(Undispatched.kt:89)
	at kotlinx.coroutines.CoroutineScopeKt.coroutineScope(CoroutineScope.kt:264)
	at io.kotest.engine.test.TestInvocationInterceptor.intercept(TestInvocationInterceptor.kt:30)
	at io.kotest.engine.test.TestCaseExecutor$execute$3$1.invokeSuspend(TestCaseExecutor.kt:92)
	at io.kotest.engine.test.TestCaseExecutor$execute$3$1.invoke(TestCaseExecutor.kt)
	at io.kotest.engine.test.TestCaseExecutor$execute$3$1.invoke(TestCaseExecutor.kt)
	at io.kotest.engine.test.interceptors.TimeoutInterceptor.intercept(TimeoutInterceptor.kt:33)
	at io.kotest.engine.test.TestCaseExecutor$execute$3$1.invokeSuspend(TestCaseExecutor.kt:92)
	at io.kotest.engine.test.TestCaseExecutor$execute$3$1.invoke(TestCaseExecutor.kt)
	at io.kotest.engine.test.TestCaseExecutor$execute$3$1.invoke(TestCaseExecutor.kt)

Dummy test laz file : Generated using python laspy.
Download it here

I also tried reading and/or writing a .las file but got the same error.
It only works when I remove .insideRectangle(xMin, yMin, xMax, yMax) but in my case I would need that since I only want the points from the region.
If this is expected behaviour then let me know.

Las 1.4

Hello,
while I was able to access LAS 1.2 files with laszip4j, it fails with LAS 1.4 files. Is it not implemented or did I something wrong in my implementation?

Thanks
Joachim

Request for example code or use information

First off, let me say that I am very pleased to see this project. I have been thinking about implementing a LAZ file decoder for months, and was daunted by the complexity of the implementation.

Would it be possible to post example code showing how to read data from an LAZ file? Perhaps it could go on the wiki page. I would like to integrate the LAZ library into an application that reads and displays lidar files. It already handles LAS files, but I would like to extend it to read LAZ files. I spent a couple of hours reading through your code, but am not sure of the best way to proceed.

Also, is there a discussion forum or group for this project?

Thanks again and good luck with your project.

Performance public LASReader(File file) vs public static Iterable<LASPoint> getPoints(InputStream is)

Today I noticed a heavy performance difference between parsing
via public LASReader(File file) and public static Iterable getPoints(InputStream is)

My File is a 2.1GB Large laz file in version 1.3 and has 400 Million Points. file.length is : 2156189931

With public static Iterable getPoints(InputStream is) parsing takes about 6 Minutes. This creates a simple BufferedInputStream from my FileInputStrean.

Parsing in ms: 353.620 ms

With public LASReader(File) it takes much longer. 3 hours 21 Minutes

Parsing in ms: 12.046.417 ms

Perhaps the difference lies in ByteStreamInFile:

private static RandomAccessDataInput createRandomAccessDataInput(RandomAccessFile file) {
        long length;
        try {
            length = file.length();
        } catch (IOException e) {
            throw new UncheckedIOException(e);
        }
        if (length > Integer.MAX_VALUE) {
            return new RandomAccessFileDataInput(file);
        } else {
            return new MMappedDataInput(file);
        }
    }

NullPointerException reading a LAZ file

I just had a user post an Issue on the Tinfour Github project page reporting a NullPointerException when reading a version 1.4 LAZ file. While Tinfour still uses your old version 0.5 API, I downloaded the latest version and got similar results.

This is the stack trace the user posted

ERROR: cannot open lasreaderlas with file name '/home/martin/fm/Tinfour/tile_-235000_-1227000.laz'
java.lang.NullPointerException: Cannot invoke "com.github.mreutegg.laszip4j.laslib.LASreader.inside_none()" because "reader" is null
at com.github.mreutegg.laszip4j.LASReader$None.apply(LASReader.java:160)
at com.github.mreutegg.laszip4j.LASReader.openReader(LASReader.java:108)
at com.github.mreutegg.laszip4j.LASReader.access$100(LASReader.java:32)
at com.github.mreutegg.laszip4j.LASReader$LASPointIterator.(LASReader.java:116)
at com.github.mreutegg.laszip4j.LASReader$LASPointIterator.(LASReader.java:112)
at com.github.mreutegg.laszip4j.LASReader.lambda$getPoints$3(LASReader.java:88)

He posted his LAZ file at
https://drive.google.com/file/d/1rvUUxoxtTovfVt68CDmwrMr99vlG-gd1/view?usp=sharing

The API I am using to read the file is
LASReader reader = new LASReader(file);
for (LASPoint p : reader.getPoints()) {
}

You can see the original issue report at gwlucastrig/Tinfour#89

Thank you for your attention in this matter.

Making LASreadItemCompressed implementations accessible

Hello,
Some implementations of the LASreadItemCompressed have package-private constructors and it's not possible to create an instance from them, I think it would be more useful if we would make their constructor public to make the API classes more accessible. If you agree with me, I can make the changes and create a PR for that.

Regards.

pom

how many plugin and dependency are can not download

Inverted Colours

Hello,

We've some LASzip files which we try to decompress by using laszip4j. But, when we read the data from the file, colours are inverted, if the original colour is 55, it gives 200, it returns 0 for white colours, 255 for blacks.

Have you ever faced such a this problem? Do you have any idea why could it be happening?

Here is output of lasinfo :

Here is output of lasinfo :

lasinfo file1.laz
lasinfo (180209) report for file1.laz
reporting all LAS header entries:
file signature: 'LASF'
file source ID: 0
global_encoding: 0
project ID GUID data 1-4: 00000000-0000-0000-0000-000000000000
version major.minor: 1.2
system identifier: 'libLAS'
generating software: 'libLAS 1.7.0'
file creation day/year: 304/2017
header size: 227
offset to point data: 227
number var. length records: 0
point data format: 2
point data record length: 26
number of point records: 155134505
number of points by return: 0 0 0 0 0
scale factor x y z: 0.001 0.001 0.001
offset x y z: 73812.5 165062.5 415.5
min x y z: 73750.000 165000.000 353.000
max x y z: 73875.000 165125.000 478.000
LASzip compression (version 2.4r1 c2 50000): POINT10 2 RGB12 2
reporting minimum and maximum for all LAS point record entries ...
X -62500 62500
Y -62500 62500
Z 21151 54218
intensity 0 0
return_number 0 0
number_of_returns 2 6
edge_of_flight_line 0 0
scan_direction_flag 0 0
classification 0 0
scan_angle_rank -128 127
user_data 0 254
point_source_ID 511 1050
Color R 0 65025
G 0 65025
B 0 65025
number of first returns: 155134505
number of intermediate returns: 0
number of last returns: 0
number of single returns: 0
WARNING: there are 155134505 points with return number 0
overview over number of returns of given pulse: 0 29575050 39620204 45023717 31206905 9708629 0
histogram of classification of points:
155134505 never classified (0)

Regards.

Maven Central Package

Hello,

is it possible to publish the library as package by Maven Central? In combination with #52 so it has got a clean API for library usage.

LASpoint not adjusted with x/y/z scale and offset values from LAZ file header

This is more a question than an issue report... When reading LASPoint data using the LASReader class, I noticed that the x/y/z points returned were not adjusted using the scale and offset values from the LAS/LAZ file header. I'm not sure whether this is a deliberate design choice or not, but I wanted to bring it to your attention. It does explain why the values I got when I accessed the Kanton of Zürich data were so large. Should I be making the adjustment in my application, or should this happen in the laszip4j API?

Error while running the jar

I cloned the repo, and created jar with 'mvn clean install' command.
Now when I execute the jar with:

java -jar laszip4j-0.6-SNAPSHOT.jar -oparse xyzc -keep_class 3 4 5 6 10 -i my_input.laz -o my_output.xyzk

I get error as:

Exception in thread "main" java.lang.NoClassDefFoundError: com/github/mreutegg/laszip4j/laslib/LAScriterionDropZBelow (wrong name: com/github/mreutegg/laszip4j/laslib/LAScriterionDropzBelow)

What can be the issue?

@mreutegg

How to make laz file to be a xyzk File

your project tools don't have java.doc and Related notes,that make me unknown how to use.
and your readme file don't have detail sample code, I can't known how to use the LASReader make
laz file to write a xyzk file, I see your project have many writer class, but they don't have about then
note,so can you help me how to use that? I hope your can writer about sample code。because
just the code and not uml or note 、description。that can't make people easy to usefully

Should laszip4j support Java 8?

I would like to ask if laszip4j should support Java 8?
It is compiled with class target: Java 8 but with Java >= 9.
Problem is with calling: buffer.rewind() in:
ByteStreamInDataInput.java
ByteStreamOutDataOutput.java
ByteStreamOutFile.java

In Java 8 buffer.rewind return Buffer type. For Java >= 9 rewind is redefined in ByteBuffer to return ByteBuffer type.
It means that laszip4j can't be run in Java 8 because different method descriptor.
Thank you

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.