GithubHelp home page GithubHelp logo

zakjan / cytoscape-mapbox-gl Goto Github PK

View Code? Open in Web Editor NEW
26.0 5.0 4.0 1.33 MB

Mapbox GL plugin for Cytoscape

Home Page: https://zakjan.github.io/cytoscape-mapbox-gl/

License: MIT License

JavaScript 100.00%

cytoscape-mapbox-gl's Introduction

cytoscape-mapbox-gl

Mapbox GL plugin for Cytoscape

Demo

Screenshot

Compatible with Mapbox GL v1.13 or earlier. Compatibility with v2 is not guaranteed due to license change. Compatibility with MapLibre fork is under consideration.

Compatible with Cytoscape plugins:

Incompatible with Cytoscape plugins:

  • cytoscape-panzoom
    • disable with cy.panzoom('destroy') after enabling cy.mapboxgl(...)
    • add map navigation control
    • enable with cy.panzoom() after calling cyMap.destroy()

Install

npm install mapbox-gl-js cytoscape-mapbox-gl

or

<script src="https://api.mapbox.com/mapbox-gl-js/v1.13.0/mapbox-gl.js"></script>
<link href="https://api.mapbox.com/mapbox-gl-js/v1.13.0/mapbox-gl.css" rel="stylesheet">
<script src="https://unpkg.com/[email protected]/dist/cytoscape-mapbox-gl.min.js"></script>

Usage

The plugin exposes a single function, which should be used to register the plugin to Cytoscape.js.

import cytoscape from 'cytoscape';
import cytoscapeMapboxgl from 'cytoscape-mapbox-gl';

cytoscape.use(cytoscapeMapboxgl);

Plain HTML/JS has the extension registered for you automatically.

API

export interface MapboxglHandlerOptions {
  getPosition: (node: cytoscape.NodeSingular) => mapboxgl.LngLatLike;
  setPosition?: (node: cytoscape.NodeSingular, lngLat: mapboxgl.LngLat) => void;
  animate?: boolean;
  animationDuration?: number;
}

const cyMap = cy.mapboxgl(mapboxOptions: mapboxgl.MapboxOptions, options: MapboxglHandlerOptions);
  • mapboxglOptions - see Mapbox GL JS docs for detailed documentation
  • options
    • getPosition - function, should return node position, required
    • setPosition - function, should save the node position
    • animate - animate the transition between graph and map mode
    • animateDuration - animation duration for the transition between graph and map mode

If no setPosition option is provided, it's important to disable node dragging with Cytoscape methods, e.g. with cy.autoungrabify(true).

If node dragging is kept enabled and no setPosition option is provided, or setPosition returns without saving, node position is reverted back to the original position after node dragging is finished. This behavior can be also used for cancelling.

Basic

cy.autoungrabify(true); // disable node dragging
const cyMap = cy.mapboxgl(..., {
  getPosition: (node) => {
    return [node.data('lng'), node.data('lat')];
  }
});

Node dragging enabled

const cyMap = cy.mapboxgl(..., {
  getPosition: (node) => {
    return [node.data('lng'), node.data('lat')];
  },
  setPosition: (node, lngLat) => {
    node.data('lng', lngLat.lng);
    node.data('lat', lngLat.lat);
  }
});

Use raster basemap layer

const cyMap = cy.mapboxgl({
  style: {
    'version': 8,
    'sources': {
      'raster-tiles': {
        'type': 'raster',
        'tiles': ['https://tile.openstreetmap.org/{z}/{x}/{y}.png'],
        'tileSize': 256,
        'attribution': '&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'
      }
    },
    'layers': [
      {
        'id': 'raster-tiles',
        'type': 'raster',
        'source': 'raster-tiles',
        'minzoom': 0,
        'maxzoom': 19
      }
    ]
  }
}, ...);

OpenStreetMap tiles are not recommended for heavy use. See OpenStreetMap Tile Usage Policy for details. See Tile servers at OpenStreetMap wiki for possible alternatives, or consider commercial alternatives such as Mapbox, Maptiler, or running your own tile server.

Use Mapbox vector basemap layer

const cyMap = cy.mapboxgl({
  accessToken: '...',
  style: 'mapbox://styles/mapbox/streets-v11'
}, ...);

This requires Mapbox access token.

Use Maptiler vector basemap layer

const cyMap = cy.mapboxgl({
  style: 'https://api.maptiler.com/maps/basic/style.json?key=...'
}, ...);

This requires Maptiler access token.

Fit map to nodes

cyMap.fit(nodes = this.cy.nodes(), options)
  • nodes - cytoscape.NodeCollection, the collection to fit to (default all nodes)
  • options - mapboxgl.FitBoundsOptions, see Mapbox GL JS docs for detailed documentation

Access Mapbox GL instance

cyMap.map

See Mapbox GL JS docs for detailed documentation.

Add map navigation control

cyMap.map.addControl(new mapboxgl.NavigationControl(), 'top-left');

Destroy

cy.autoungrabify(false); // enable node dragging, if node dragging was disabled earlier with `cy.autoungrabify(true)`
cyMap.destroy();

Sponsors

Graphlytic

Graphlytic is a customizable web application for collaborative graph visualization and analysis. There is a free version for Neo4j Desktop available.

cytoscape-mapbox-gl's People

Contributors

zakjan 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

Watchers

 avatar  avatar  avatar  avatar  avatar

cytoscape-mapbox-gl's Issues

Allow dragging nodes

Currently, node dragging is disabled.

Allow dragging nodes, and expose a callback to update node latitude/longitude.

Nodes are not showed in the right position on map [Angular 12]

Hello,
I need to implement this amazing extension with cytoscape.js in an Angular project and not having found any documentation or examples about it, I created a new project with Angular 12 from scratch and tried to implement it.
You can find my project at the following link.

I have installed the following cytoscape libraries:

"cytoscape": "^3.19.0",
"cytoscape-mapbox-gl": "^1.2.0",
"mapbox-gl": "^1.13.0"

If you want to see all project dependencies this is package.json.

My goal is to create two nodes corresponding to two cities, connected by an edge. (graph-data)

I am currently facing the following issues:

  • on first loading, the map displays only the edge that connects the two nodes, so it seems that the zoom is not correctly adjusted
    image
  • the nodes are not displayed in the right position on the map, not respecting the coordinates passed to the graph
    image
  • when you zoom in / out the nodes move, resulting in another point on the map, they do not maintain the initial position

Have you ever faced these problems before?
I think this kind of implementation can be useful for other developers too.
Thanks in advance

cytoscape-edgehandles

Hi @zakjan,
thanks for developing this wonderful code.
Is there a way to add an edge between nodes using cytoscape-edgehandles while in the leaflet map?
Thanks

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.