route-me / route-me Goto Github PK
View Code? Open in Web Editor NEWOpen source map library for iOS
Open source map library for iOS
Apply on the simulator but should be the same on device.
I use the latest version of route-me.
I've been able to solve this issue by modifying the dealloc function of RMMarker :
In general, it is not a good practice to use customized setter in the dealloc. In this case, the
setLabel probably implies a release on the label variable with retain count equal to 0.
B.
What steps will reproduce the problem?
1.load simple map example
2.try to compile it with iphone sdk 3.1.2
3.error
What is the expected output? What do you see instead?
see screenshot
What subversion release are you using? Does the behavior occur on the
simulator, a real iPhone/iPod Touch, or both?
verion 0.5
Thanks
What steps will reproduce the problem?
Tracy wrote a patch a while ago to fix this:
see: http://groups.google.com/group/route-me-map/msg/722a84cf5ae14b52
The issue is that if you have a marker behind another marker, you can never
click on the marker in back.
If you change the RMMapContents' tile source, the caches aren't cleared.
This causes incorrect tiles to be displayed.
Passing a bogus key to RMCloudMadeMapSource's -initWithAccessKey:styleNumber: silently returns
a tile source without signaling an error. Test added to testObjectCreation:
STAssertThrows((myTilesource = [[RMCloudMadeMapSource alloc]
initWithAccessKey:@"0199bdee456e59ce950b0156029d693" styleNumber:999]),
@"bogus CloudMade key does not trigger error");
There are upper and lower bounds to the map, nothing north of the north
pole. nothing south of the south pole.
RouteMe does not have any way to keep a user from scrolling much further
south than the south pole/north than the north pole.
I would love if there was a way to keep a user from panning beyond the
upper and lower bounds of the map, like maps.app does.
M@nu posted this code to the mailing list in January. It should be incorporated, probably into
RMAbstractMercatorWebSource.
http://groups.google.com/group/route-me-
map/browse_thread/thread/b6aa3757d46055aa/c93e7b0c861973e5?
lnk=gst&q=LatLonToMeters%23c93e7b0c861973e5
Here are some patches I made to implement read-only databases.
The purpose is to package an iPhone app with a built-in resource, a
read-only map tile cache, which will be used as efficiently as possible
(i.e. no writing the last used date, or counting the number of items to see
if it needs purging), and then have another writable database for caching
tiles that aren't built into the app.
The routeme.plist defines three caches: a memory cache, my read-only cache
with useCachesDirectory false (so it comes from Documents), and a regular
database cache with useCachesDirectory true (so it comes from Caches).
I store the map cache as an app resource, and make a symbolic link from the
documents directory to the app resource, when the app starts up.
It would be nice to be able to configure the cache directories somehow in
the routeme.plist instead of messing around with symbolic links, but I
haven't done that yet.
One issue I'd like to understand better: Will the tiles from the read-only
cache trickle down into the writable cache, wasting space? Is there a way
to prevent that?
For some reason I had to put a cast of the id cfg to NSDictionary *, to
make it work, but I don't understand why...
// NSString* type = [cfg valueForKey:@"type"];
NSDictionary d = (NSDictionary *)cfg; // Don added this cast, which
makes it work!
NSString type = [d valueForKey:@"type"];
Here are the diffs for read-only databases.
bash-3.2$ svn diff
--- MapView/Map/RMTileCache.m (revision 577)
+++ MapView/Map/RMTileCache.m (working copy)
@@ -69,8 +69,10 @@
id newCache = nil;
@try {
+// NSString* type = [cfg valueForKey:@"type"];
NSDictionary *d = (NSDictionary *)cfg; // Don added this cast, which
NSString\* type = [d valueForKey:@"type"];
/// \bug magic string literals
if ([@"memory-cache" isEqualToString: type])
newCache = [self newMemoryCacheWithConfig: cfg];
NSNumber* capacityNumber = [cfg objectForKey:@"capacity"];
if (capacityNumber!=nil) {
NSInteger value = [capacityNumber intValue];
@@ -202,9 +205,15 @@
}
}
NSNumber* readOnlyNumber = [cfg objectForKey:@"readOnly"];
if (readOnlyNumber != nil) {
readOnly = [readOnlyNumber boolValue];
}
RMDatabaseCache* dbCache = [[RMDatabaseCache alloc]
initWithTileSource: theTileSource
usingCacheDir: useCacheDir
readOnly: readOnly
];
[dbCache setCapacity: capacity];
--- MapView/Map/RMDatabaseCache.h (revision 577)
+++ MapView/Map/RMDatabaseCache.h (working copy)
@@ -36,13 +36,14 @@
RMCachePurgeStrategy purgeStrategy;
NSUInteger capacity;
NSUInteger minimalPurge;
BOOL readOnly;
}
@Property (retain) NSString* databasePath;
-(void) setPurgeStrategy: (RMCachePurgeStrategy) theStrategy;
-(void) setCapacity: (NSUInteger) theCapacity;
--- MapView/Map/RMDatabaseCache.m (revision 577)
+++ MapView/Map/RMDatabaseCache.m (working copy)
@@ -78,8 +78,9 @@
return self;
}
--(id) initWithTileSource: (id) source usingCacheDir: (BOOL)
useCacheDir
+-(id) initWithTileSource: (id) source usingCacheDir: (BOOL)
useCacheDir readOnly: (BOOL) isReadOnly
{
@@ -109,6 +110,10 @@
-(void)addTile: (RMTile)tile WithImage: (RMTileImage*)image
{
return;
// The tile probably hasn't loaded any data yet... we must be patient.
// However, if the image is already loaded we probably don't need to
cache it.
@@ -124,6 +129,10 @@
-(void) addImageData: (NSNotification *)notification
{
return;
NSData data = [[notification userInfo] objectForKey:@"data"];
/// \bug magic string literals
RMTileImage *image = (RMTileImage)[notification object];
@@ -160,7 +169,7 @@
if (data == nil)
return nil;
if (capacity != 0 && purgeStrategy == RMCachePurgeStrategyLRU) {
if (!readOnly && capacity != 0 && purgeStrategy ==
@@ -189,6 +198,9 @@
-(void) removeAllCachedImages
{
return;
In present implementation, both the background image displayed during tile loading and the
default marker images are loaded from [NSBundle mainBundle], rather than from Route-me's
bundle. This requires app developers to copy these images into their project.
What steps will reproduce the problem?
What is the expected output? It should compile
What do you see instead? Error message duplicate symbol _aasin
What subversion release are you using? Does the behavior occur on the
simulator, a real iPhone/iPod Touch, or both?
Only when compiling to the device. If you compile to the simulator it works fine.
It occurs only with the SDK 4 compiler. The previous compiler ( 3.1.3) builds fine.
How to solve this specific problem? It happens when i try to add path into overlay
* Terminating app due to uncaught exception 'NSGenericException', reason: '* Collection
<CALayerArray: 0x1771d0> was mutated while being enumerated.'
What steps will reproduce the problem?
What is the expected output? What do you see instead?
If the distance you drag the marker is short enough, both the
DragMarkerPosition and TapOnMarker delegate methods are called.
If you drag it a longer distance, tapOnMarker is not called.
(You can easily tell which method is being called by the console output)
I am unsure if this is expected behavior, but it seems to me that a marker
These issues still exist with the changes made in Issue 63 , as those simply
remove an old call and replace it with a new one in the same place.
Two possible approaches:
(a) Direct drawing of a filled ellipse, or
(b) Introduce dependence on RMPath
Display an indication of the scale in the RMMapView.
This can be a simple line with the lenght in the real world below it (must be able to choose between
km and mile)
Or it can be one line with the length in Miles (yards) above (or below) and the length in Kilometers
(or meters) below (or above).
example attached.
You can put any layer on any position, decimal or fractional. When you put
something fractional the phone will try to do what it can.
For RMLayer subclasses this is probably a bad idea for the most part.
The suggested fix is as follows:
Putting this into RMMarker will mean that when a position comes back from
the projection and is translated into fractional screen units, the marker
will round to the best screen coordinate and then use that to set its own
position. The result is that you don't get random blurry markers.
What steps will reproduce the problem?
What is the expected output? What do you see instead?
I would assume the entire view hierarchy would be clickable
What version of the product are you using? On what operating system?
r192, 10.5
Please provide any additional information below.
the patch changes the touch handling in RMMapView.m to address this case
I really love that u can now accelerate the map. But it would be nice to inform the delegate as soon
as the map slowed down. In my opinion this is essential because if ure getting markers from a
server you have no possibility to detect the new bounds (afterMapMove: and afterMapTouch: are
fired earlier and the map is still moving).
-M
When a pinching action is going on depending on where the pinch releases or
where the pinch intersects various delegate methods related to the marker
will be called (such as should/didDragMarker and didtapOnMarker/label).
This shouldn't happen during a pinch.
There are two things to fix.
First, the API needs to change, similar to RMCloudMadeTileSource, to allow developer to pass in a
registered MS VE key.
Second, the generated HTTP requests need to append a token, obtained with a SOAP call from MS
VE based on the developer key, to the HTTP requests.
Links to more details are in the source code.
Panning the map in iPhone OS 4.0 causes tiles to freeze up.
Some tiles will move but some will stay frozen. Same happens with zooming.
RMMapContents has the following code in initwithView
boundingMask = RMMapMinWidthBound;
mercatorToScreenProjection = [[RMMercatorToScreenProjection alloc]
initFromProjection:[newTilesource projection] ToScreenBounds:[newView bounds]];
tileSource = nil;
projection = nil;
mercatorToTileProjection = nil;
renderer = nil;
imagesOnScreen = nil;
tileLoader = nil;
layer = [[newView layer] retain];
[self setTileSource:newTilesource];
[self setRenderer: [[[RMCoreAnimationRenderer alloc] initWithContent:self]
autorelease]];
imagesOnScreen = [[RMTileImageSet alloc] initWithDelegate:renderer];
RMTileImageSet needs to know about the renderer so that it send tilesAdded
and tilesRemoved messages. The line just above this also tries to set the
Renderer but imagesOnScreen is still nil. The code in setRenderer that sets
renderer on imagesOnScreen should be removed
(void) setRenderer: (RMMapRenderer*) newRenderer
{
if (renderer == newRenderer)
return;
[imagesOnScreen setDelegate:newRenderer];
This line is noop, as imagesOnScreen is nil at this point.
Also, the following code is not needed
markerManager = [[RMMarkerManager alloc] initWithContents:self];
because RMMarkerManager now uses the overlay (RMLayerSet) allocated in
initWithView for managing its markers.
When my application initializes, there is a very long pause, because it's add
a whole bunch of tiles at zooms that it doesn't need.
RMTileImageSet addTiles:ToDisplayIn: has a for (;;) loop that loops from
the zoom level passed in, down to [tileSource minZoom], adding tiles at
zooms that are not needed.
I can't figure out why it's doing this, but it really slows down my
application.
I fixed the code so that addTiles only adds the tiles at the current zoom,
and it's much faster, and it works just fine.
What is the reason it's doing this? Is there a way to disable it besides
hacking the code? The performance is horrible because of this behavior,
which seems totally unnecessary.
Steps to reproduce:
-just release the map view
Expected result:
-the map contents shoul be released also as the map view seems to have
ownership over it (if set from the outside it is retained/if not it is
allocated by the map view on the first call to contents)
Actual result:
-the map contents is not released/it's just set to nil
r627 added RMCountedSet.h/.m but that file was never added to the project file MapView.xcodeproj.
What steps will reproduce the problem?
-there is no simple solution for drawing a path over the 180 meridian.
(e.g. draw a line from latitude 179.9 to -179.9)
What is the expected output?
-I would expect the line to be the shortest possible:
(abs(latitude1 - latitude2) < 180)
What do you see instead?
-the line is drawn from -179.9 to 179.9 across the entire globe.
Other thoughts:
-I tried splitting the path in two segments:
(179.9 to 180.0 and -180.0 to -179.9)
This works OK but the size of the path layer is too big (its width is
practically 360 degrees (-180 to 180)) and it cannot be allocated.
I don't see a simple solution to this problem. I just wanted to bring it to
your attention. I also hope my explanation of the problem is clear enough.
Please let me know if I can be of any further assistance.
Thank you,
Andrei
Patch exists for declearation delegate calls
not sure the status of it, but it would certainly provide needed delegate
calls.
When I was trying to understand the number of new tiles loaded, i found
this piece of code in RMFractalTileProjection
First of all normaliseZoom returns a float and limitFromNormalisedZoom
accepts a float. And also, the method project:atZoom (just above this
method) does this properly. Casting to a int causes truncation. So, how
does this affect the rest of the code ? This affects the number of tiles
loaded. At this point, i don't know whether it is serious bug or not. I am
not able to beleive that this is intentional.
The way I tracked down is a little long story. The method computes the
tileRect width and height like this:
tileRect.size.width = aRect.size.width / bounds.size.width * limit;
tileRect.size.height = aRect.size.height / bounds.size.height * limit;
aRect.size.width is computed by multiplying screenBounds.width with scale.
If you substitute the equation for scale which is computed from this function
-(float) calculateScaleFromZoom: (float) zoom
{
return bounds.size.width / tileSideLength / exp2(zoom);
}
NOTE: This is the only place where exp2 is used and everywhere else it is
exp2f. FWIW, this should be fixed.
By substituting, you will figure out that
tileRect.size.width = screenBounds.size.width/tileSideLength;
This should result in the same number of tiles loaded irrespective of the
zoom. I don't know whether addTiles has other checks or not. The bug above
resulted in a different value for tileRect.size. Even after fixing this, it
is not same because exp2(zoom) and limit are not same because of the
roundf() in normalizeZoom.
What steps will reproduce the problem?
1.
2.
3.
What is the expected output? What do you see instead?
What subversion release are you using? Does the behavior occur on the
simulator, a real iPhone/iPod Touch, or both?
If you can reproduce your bug, please provide the source code for a
reproducing case. The best place to start is with the SampleMap project.
Please don't send patches/diffs. Post source code directly to the issue
tracker, noting your suggested revisions. If they are extensive, use a
branch in subversion with the same name as your issue number (e.g.
branches/issue59).
Please provide any additional information below.
What steps will reproduce the problem?
1.Use SampleMapwith following code in viewDidLoad:
[CODE]
// Set map view center coordinate
CLLocationCoordinate2D center;
center.latitude = 47.582;
center.longitude = -122.333;
slideLocation = center;
[mapView.contents moveToLatLong:center];
[mapView.contents setZoom:17.0f];
// Add 2 markers(start/end) and RMPath with 2 points
RMMarker *newMarker;
UIImage *startImage = [UIImage imageNamed:@"marker-blue.png"];
UIImage *finishImage = [UIImage imageNamed:@"marker-red.png"];
UIColor* routeColor = [[UIColor alloc] initWithRed:(27.0 /255) green:(88.0 /255) blue:(156.0 /255) alpha:0.75];
RMPath* routePath = [[RMPath alloc] initWithContents:mapView.contents];
[routePath setLineColor:routeColor];
[routePath setFillColor:routeColor];
[routePath setLineWidth:10.0f];
[routePath setDrawingMode:kCGPathStroke];
CLLocationCoordinate2D newLocation;
newLocation.latitude = 47.580;
newLocation.longitude = -122.333;
[routePath addLineToLatLong:newLocation];
newLocation.latitude = 47.599;
newLocation.longitude = -122.333;
[routePath addLineToLatLong:newLocation];
[[mapView.contents overlay] addSublayer:routePath];
newLocation.latitude = 47.580;
newLocation.longitude = -122.333;
newMarker = [[RMMarker alloc] initWithUIImage:startImage anchorPoint:CGPointMake(0.5, 1.0)];
[mapView.contents.markerManager addMarker:newMarker AtLatLong:newLocation];
[newMarker release];
newMarker = nil;
newLocation.latitude = 47.599;
newLocation.longitude = -122.333;
newMarker = [[RMMarker alloc] initWithUIImage:finishImage anchorPoint:CGPointMake(0.5, 1.0)];
[mapView.contents.markerManager addMarker:newMarker AtLatLong:newLocation];
[newMarker release];
newMarker = nil;
// Start moving map (after few moves path become invisible until user touch screen)
[NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(slide) userInfo:nil repeats:YES];
}
-(void)slide{
slideLocation.latitude = slideLocation.latitude + 0.0002;
[mapView moveToLatLong:slideLocation];
}
[/CODE]
What is the expected output?
Path visible all the way map moves on it.
What do you see instead?
Visible only initial part of route.
What subversion release are you using? Does the behavior occur on the
simulator, a real iPhone/iPod Touch, or both?
Both.
If you can reproduce your bug, please provide the source code for a
reproducing case. The best place to start is with the SampleMap project.
Please don't send patches/diffs. Post source code directly to the issue
tracker, noting your suggested revisions. If they are extensive, use a
branch in subversion with the same name as your issue number (e.g.
branches/issue59).
Please provide any additional information below.
What steps will reproduce the problem?
What is the expected output?
Map should zoom exactly to the current zoom level + 1.
What subversion release are you using?
r612
Does the behavior occur on the simulator, a real iPhone/iPod Touch, or
both?
Both
I have managed to circumvent this by modifying animatedZoomStep to
never exceed the targetZoom:
(void)animatedZoomStep:(NSTimer *)timer
{
.....
if ((zoomIncr > 0 && [self zoom] >= targetZoom) || (zoomIncr < 0 &&
[self zoom] <= targetZoom))
{
...
}
else
{
if (([self zoom] + zoomIncr) > targetZoom) {
zoomIncr = targetZoom - [self zoom];
}
float zoomFactorStep = exp2f(zoomIncr);
......
}
}
However I still don't understand the root of the problem i.e. why the
parameters passed to animatedZoomStep cause it to overstep the
targetZoom.
What steps will reproduce the problem?
-panning over the 180 meridian
What is the expected output?
-I would like to be able to disable circular horizontal panning
While this is a cool feature there are cases where it can be a handfull -
see issue 131
Thank you,
Andrei
What steps will reproduce the problem?
What is the expected output? What do you see instead?
No tiles should have a black edge.
What version of the product are you using? On what operating system?
Reproducible as of r76
I want to have two tilesources displayed at the same time on top of each other. I guess I want
RMMapContents to have a addTileSource, not setTileSource.
RMPath's dealloc method calls:
[self setLineColor:nil];
[self setFillColor:nil];
both of them call:
[self setNeedsDisplay];
This results in the message above being logged twice for the path. A
solution would be to call setNeedsDisplay only if the set color is not nil.
What steps will reproduce the problem?
What is the expected output? What do you see instead?
The expected output was a successful build, as in previous builds.
Error received: Libtool "/Users/iphonedevel/Desktop/SpeedcamProject
07.08/MapView/buid/Debug-iphonesimulator/libMapView.a" normal i386 (1 error)
/Developer/Platforms/iphoneSimulator.platform/Developer/usr/bin/libtool: -dynamic not
specified the following flags are invalid: -ObjC
/Developer/Platforms/iphoneSimulator.platform/Developer/usr/bin/libtool: object /Developer/Platforms/iphoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.1.sdk/usr/li
b/libsqlite3.dylib malformed object (unknown load command 5)
Command /Developer/Platforms/iphoneSimulator.platform/Developer/usr/bin/libtool failed with
exit code 1
What subversion release are you using? Does the behavior occur on the
simulator, a real iPhone/iPod Touch, or both?
iphone SDK 3.1 beta 3. The behavior occurred on the simulator build.
If you can reproduce your bug, please provide the source code for a
reproducing case. The best place to start is with the SampleMap project.
I have reproduced the bug on the SampleMap project, but the code signing identity won't work
on another computer.
The only changes to the original SampleMap project were setting the code signing identity and
the Info.plist bundle identifier to the info of the working certificate. The same error was
encountered.
Please provide any additional information below.
This project has been tested extensively with the simulator on 2.2.1 and 3.0 but no actual
device. Upgrade and compatibility to the 3.1 version was requested only recently but during the
course of working with the route-me MapView project no embedding problems were
encountered.
RMMapView has no accessors for enableDragging, enableZoom, deceleration, decelerationFactor.
Changing enableDragging does not change multitouchEnabled for the view.
RMMapView.contents is not deprecated, but it calls
RMapContents.initForView:self, which is.
What steps will reproduce the problem?
What is the expected output?
Marker should be dragged smoothly all the way from one point to another.
What do you see instead?
Marker is dragged for a short distance and after that it is dropped and map
scrolls instead
What subversion release are you using? Does the behavior occur on the
simulator, a real iPhone/iPod Touch, or both?
0.5, it happens both on the device and simulator.
It seems to be a problem of how touches are handled. Right now, when
touch moves, route-me checks if there is a marker layer on new position. If
there is something - corresponding marker is notified about move.
And when we have a thin or short image - delta between previous position
and current position can be bigger than corresponding image dimension.
So route-me doesn't find any marker on the new position and doesn't
notify marker about move.
I expect, it should handle drag'n'drop absolutely separately and then d'n'd
started it should remember marker on which it started and move it until
touch cancel/touch exit occurs or until any other touch detected.
What steps will reproduce the problem?
What is the expected output? What do you see instead?
NO
What subversion release are you using? Does the behavior occur on the
simulator, a real iPhone/iPod Touch, or both?
0.5, simulator
funny enough if you change the code to:
/// \deprecated violates Objective-C naming rules
iso indexOfObject, it does work, though i cannot explain why...
RMCloudMadeMapSource.m and other support one fix URL per source. But e.g. CloudeMade is
offering round-robin URLs:
The URLs for http://%@.tile.cloudmade.com/devid/1/%d/%d/%d/%d.png can be:
http://a.tile.cloudmade.com/devid/1/%d/%d/%d/%d.png
http://b.tile.cloudmade.com/devid/1/%d/%d/%d/%d.png
http://c.tile.cloudmade.com/devid/1/%d/%d/%d/%d.png
This should improve loading performance . Would be great to have support for that generalized.
A patch was created, though it wasn't complete.
See:
http://groups.google.com/group/route-me-map/browse_thread/thread/ec93b8402c268d34
route me 0.5 RMMarker.m:163
self.labelView = [aView retain];
should be
self.labelView = aView; // CNL: the . syntax already retains! it's a setter property
What steps will reproduce the problem?
The map replaces tiles with the loading image
It should store them until the new tile images are loaded.
Please animate moveToLatLong on the map view so it will enable smooth
scrolling through code.
Although the existence of RMCachedTileSource
(http://www.mobilegeographics.com/dev/routeme/interface_r_m_cached_tile_source.html)
could be extended to fit this purpose, there's currently no source that
could be leveraged to display imagery that stored locally to the device.
I'd imagine something similar to RMAbstractMercatorWebSource
(http://www.mobilegeographics.com/dev/routeme/interface_r_m_abstract_mercator_web_source.html)
but with support for a local store.
What steps will reproduce the problem?
In Code,
(void) tapOnLabelForMarker:(RMMarker *)marker onMap:(RMMapView *)map {
NSLog(@"Marker was tapped");
if (marker.label == nil) {
NSLog(@"Marker is Nil");
return;
}
if ([marker.label isHidden]) {
[marker showLabel];
} else {
[marker hideLabel];
}
}
What is the expected output? What do you see instead?
Tapping UIView Label should be treated similar to TextLabel.
What subversion release are you using? Does the behavior occur on the
simulator, a real iPhone/iPod Touch, or both?
Tested on simulator. Latest version.
If you can reproduce your bug, please provide the source code for a
reproducing case. The best place to start is with the SampleMap project.
Please don't send patches/diffs. Post source code directly to the issue
tracker, noting your suggested revisions. If they are extensive, use a
branch in subversion with the same name as your issue number (e.g.
branches/issue59).
Please provide any additional information below.
Move the map to
lat:-4.405479 lon:179.985939
Look at how the labels on the map do not match perfectly.
Its more obvious when zoomed out further, if you are zoomed in too close
then no labels bridge the gap.
What steps will reproduce the problem?
What is the expected output? What do you see instead?
A new sample application project.
What version of the product are you using? On what operating system?
NA
Please provide any additional information below.
What steps will reproduce the problem?
What version of the product are you using? On what operating system?
rev 163. This defect has been around for at least a month.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.