рдкрд┐рдЫрд▓реЗ рдПрдХ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВрдиреЗ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдмрдбрд╝реЗ рднреВ-рдбреЗрдЯрд╛рд╕реЗрдЯ рдХреА рдХрд▓реНрдкрдирд╛ рдФрд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП рдирдП рдУрдкрди рд╕реЛрд░реНрд╕ рдЯреВрд▓ kepler.gl рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХреА рдереАред

рдЪрд┐рддреНрд░ 1. kepler.gl рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдП рдЧрдП рдорд╛рдирдЪрд┐рддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд▓реНрдк (Uber рджреНрд╡рд╛рд░рд╛)
рдпрд╣ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЖрдкрдХреЛ рдПрдХ рд╕реВрдЪрдирд╛рддреНрдордХ, рдФрд░ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг, рд░рдВрдЧреАрди рдЗрдВрдЯрд░реЗрдХреНрдЯрд┐рд╡ рдорд╛рдирдЪрд┐рддреНрд░ рдмрдирд╛рддрд╛ рд╣реИ рдЬреЛ рдХреБрдЫ рд╣реА рдорд┐рдирдЯреЛрдВ рдореЗрдВ рднреВ-рдбреЗрдЯрд╛ рдХреЗ рдордирдорд╛рдиреЗ рд╕реЗрдЯ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╕рд╡рд╛рд▓ рдЙрдарддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рд╕рд╛рде рдЖрдЧреЗ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ? рд╕рд╣рдХрд░реНрдорд┐рдпреЛрдВ, рдорд┐рддреНрд░реЛрдВ рдпрд╛ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЗ рд╕рд╛рде рдкрд░рд┐рдгрд╛рдо рдХреИрд╕реЗ рд╕рд╛рдЭрд╛ рдХрд░реЗрдВ?
рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВ
Kepler.gl рдХрд╛ рд╕рднреА "рдореИрдЬрд┐рдХ" рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЖрдкрдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рджреВрд╕рд░реЛрдВ рдХреЗ рд╕рд╛рде рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рдХреЗрд╡рд▓ 2 рддрд░реАрдХреЗ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ:
- рд╕реНрдереИрддрд┐рдХ рдЫрд╡рд┐ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЛ рд╕рд╣реЗрдЬреЗрдВ (рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдЦреЛрдиреЗ рдХреЗ рджреМрд░рд╛рди)
- рдмрдирд╛рдИ рдЧрдИ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдФрд░ рдбреЗрдЯрд╛ рдХреЛ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд░реНрдпрд╛рдд рдХрд░реЗрдВ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рдирд┐рд░реНрджреЗрд╢ рдХреЗ рд╕рд╛рде рд╕рднреА рдЗрдЪреНрдЫреБрдХ рдкрд╛рд░реНрдЯрд┐рдпреЛрдВ рдХреЛ рднреЗрдЬ рджреЗрдВред
рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, kepler.gl рди рдХреЗрд╡рд▓ рдПрдХ рд╡реЗрдм рдЯреВрд▓ рд╣реИ, рдмрд▓реНрдХрд┐ рдПрдХ рд░рд┐рдПрдХреНрдЯ рдШрдЯрдХ рднреА рд╣реИ, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдЖрдк рдЬрд▓реНрджреА рд╕реЗ рдЕрдкрдиреЗ рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рд╕рд╛рде рдбреЗрдореЛ рд╕рд╛рдЗрдЯ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдЙрдиреНрд╣реЗрдВ рдореМрдЬреВрджрд╛ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдПрдХреАрдХреГрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдиреЛрдЯред рдлрд╝реНрд▓рд╛рдИ рдкрд░ рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рдФрд░ рдПрдХрддреНрд░ рдХрд░рдирд╛, kepler.gl рдХреЛ рдЕрдХреНрд╕рд░ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЖрдкрдХреЛ рдореЛрдмрд╛рдЗрд▓ рдХреЗ рдЕрдиреБрд░реВрдк рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдЗрд╕реЗ рдПрдХреАрдХреГрдд рдХрд░рддреЗ рд╕рдордп рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рд╛рд╡рдзрд╛рди рд░рд╣рдирд╛ рдЪрд╛рд╣рд┐рдПред
Kepler.gl рдХреЗ рд▓рд┐рдП рдпрд╣ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛:
- рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рджреЗрдЦрдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЬрдЯрд┐рд▓ рди рдХрд░реЗрдВ (рдмрд╕ рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдХрд╛ рд▓рд┐рдВрдХ рднреЗрдЬреЗрдВ)
- рдПрдХ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рдореЗрдВ рдореВрд▓ рдбреЗрдЯрд╛ рд╕реЗрдЯ рддрдХ рдкрд╣реБрдВрдЪ рди рджреЗрдВ (рдЬреИрд╕рд╛ рдХрд┐ 2 рдЖрдзрд╛рд░ рдорд╛рдорд▓реЗ рджреНрд╡рд╛рд░рд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ)
- рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рд╕реБрд▓рдн рдкреНрд░рд╛рд░реВрдк рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░реЗрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдлрд╝рд┐рд▓реНрдЯрд░ рдпрд╛ рдбреЗрдЯрд╛ рдкреНрд░рджрд░реНрд╢рди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕реНрд╡-рдЯреНрдпреВрдирд┐рдВрдЧ рдкрд░ рд░реЛрдХ)
- рдХрд╛рд░реНрдб (рдЯреВрд▓рдЯрд┐рдк, рдЬрд╝реВрдо, рд╕реНрд╡рд┐рдЪ рдореИрдк рдореЛрдб, рдЖрджрд┐) рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рд╡рд╛рдВрдЫрд┐рдд рдкреНрд░рд╛рд░реВрдк рд╕рд╣реЗрдЬреЗрдВред
рд╡рд┐рдЪрд╛рд░ рдХрд┐рдП рдЧрдП рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рд╕реЗ рдЕрдВрддрд┐рдо рдХреЛ рднреВ-рджреГрд╢реНрдп рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдкрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рдпрд╛рд╕реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдФрд░ рдЖрдк рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рдмрд┐рдирд╛ рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд▓реНрдж рд╣реА рджреЗрдЦреЗрдВрдЧреЗ, рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рднреА рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИред
рдбреЗрдореЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдПрдВ
рдпрд╣ рд╕рд┐рджреНрдзрд╛рдВрдд рд╕реЗ рдЕрднреНрдпрд╛рд╕ рдХреА рдУрд░ рдмрдврд╝рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдХреЛрдб рдореЗрдВ kepler.gl рдХреЛ рдПрдХреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рдореВрд▓ рдЪрд░рдгреЛрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдХрд░рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдПрдХ рдЫреЛрдЯрд╛ рдбреЗрдореЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдпрд╛ред
рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдПрдХ рдпрд╛ рджреЛ рдореЛрдб рдореЗрдВ рднреБрдЧрддрд╛рди рдХрд┐рдП рдЧрдП рдореЙрд╕реНрдХреЛ рдкрд╛рд░реНрдХрд┐рдВрдЧ рд▓реЙрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рджреЗрдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ - рд╕рд╛рдорд╛рдиреНрдп рдпрд╛ рдПрдХрддреНрд░рд┐рддред рдЙрд╕реА рд╕рдордп, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗрд╡рд▓ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИ рдЧрдИ рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЛ рджреЗрдЦрдиреЗ, рдЙрдирдХреЗ рдмреАрдЪ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдФрд░ рдореИрдк рдХреЗ рд╕рд╛рде рд░реАрдб-рдУрдирд▓реА рдореЛрдб рдореЗрдВ рдХрд╛рдо рдХрд░рдирд╛ рд╕рдВрднрд╡ рдмрдирд╛рддрд╛ рд╣реИред рд╕рднреА рд╕реНрд░реЛрдд рдХреЛрдб рдФрд░ рд▓рд╛рдЗрд╡ рд╕рдВрд╕реНрдХрд░рдг GitHub рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИ ред

рдЪрд┐рддреНрд░ 2. рдбреЗрдореЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рджреЛ рдорд╛рдирдЪрд┐рддреНрд░ рджреГрд╢реНрдп рдореЛрдб
рдЗрд╕ рдбреЗрдореЛ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрджрд┐ рдЖрдк рдЦреБрдж рд╣реА kepler.gl рд╕реЗ рдЦреЗрд▓рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдкрдХреА рдЕрднреА рднреА рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдЖрдк create-react-app рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдЬреЛ рдЖрдкрдХреЗ рднрд╡рд┐рд╖реНрдп рдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рдиреАрдВрд╡ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рдордп рдХреЛ рдХрд╛рдлреА рдХрдо рдХрд░ рджреЗрдЧрд╛ред
рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ kepler.gl рдЬреЛрдбрд╝реЗрдВ
Kepler.gl рдПрдХ рд░рд┐рдПрдХреНрдЯ рдШрдЯрдХ рд╣реИ рдЬреЛ рдЕрдкрдиреЗ рд░рд╛рдЬреНрдп рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдФрд░ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Redux рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЗрд╕реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ рдЙрдкрдпреБрдХреНрдд npm-package рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:
npm install --save kepler.gl
рдЗрд╕ npm рдкреИрдХреЗрдЬ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:
- UI рдШрдЯрдХреЛрдВ рдФрд░ рдХрд╛рд░рдЦрд╛рдиреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рдЬреЛ рдЙрдиреНрд╣реЗрдВ рдЕрдкрдиреЗ рдШрдЯрдХреЛрдВ рдХреЗ рд╕рд╛рде рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ
- рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рдХреЛ рдЬреЛрдбрд╝рдиреЗ / рдмрджрд▓рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рддрд░реАрдХреЗ
- рдЙрдирдХреЗ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ Redux Reducer
Kipler.gl рдХреЗ рд▓рд┐рдП Redux рд╕рдВрдЧреНрд░рд╣рдг рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛
рдореИрдк рдмрдирд╛рдиреЗ рдФрд░ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЕрдкрдиреЗ рд░рд╛рдЬреНрдп рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрдкреНрд▓рд░.рд▓рдЧ Redux рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдХреЗрдкреНрд▓рд░рдЧреНрд▓ рдШрдЯрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд░рд┐рдбреНрдпреВрд╕рд░ рдореЗрдВ рдЙрдкрдпреБрдХреНрдд рд░реЗрдбреНрдпреВрд╕рд░ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред
import { combineReducers } from 'redux'; import keplerGlReducer from 'kepler.gl/reducers'; import appReducer from './appReducer'; const reducers = combineReducers({ keplerGl: mapReducer, app: appReducer, }); export default reducers;
рдпрд╣ рдпрд╛рдж рд░рдЦрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдХреЗрдкреНрд▓рд░рдЧрд▓ рдШрдЯрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╕реНрд╡рдпрдВ-рд╕рдВрдкрд╛рджрди, рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ, рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдФрд░ рдбреЗрдЯрд╛ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╕рднреА рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рджрд╛рди рдХрд░реЗрдЧрд╛ред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЕрдиреБрдордд рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рд╕реЗрдЯ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЕрд╡рд╕реНрдерд╛ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдореЗрдВ рдореИрдк рдореЛрдб (рдкрдврд╝рдиреЗ рдпрд╛ рд╕рдВрдкрд╛рджрди рдХреЗ рд▓рд┐рдП) рдФрд░ рдЙрдкрд▓рдмреНрдз рдореИрдк рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
const mapReducer = keplerGlReducer .initialState({ uiState: { readOnly: true, mapControls: { visibleLayers: { show: false }, toggle3d: { show: false }, splitMap: { show: true }, mapLegend: { show: true, active: false } } } });
рд╣рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд╣рдереЗрд▓реА рднреА рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЬреЛ рдХрд┐ kepler.gl рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯреНрд╕ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕ npm рдкреИрдХреЗрдЬ рд╕реЗ рдЕрдкрдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ Redux рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ taskMiddleware рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ:
import {createStore, applyMiddleware, compose} from 'redux'; import {taskMiddleware} from 'react-palm'; import reducers from './reducers'; const initialState = { }; const middlewares = [ taskMiddleware ]; const enhancers = [applyMiddleware(...middlewares)]; export default createStore( reducers, initialState, compose(...enhancers) );
рдиреЛрдЯред рд╡рд░реНрддрдорд╛рди рдореЗрдВ, рдЙрдмреЗрд░ рдЗрдВрдЬреАрдирд┐рдпрд░рд┐рдВрдЧ рдЯреАрдо рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ kepler.gl рдХреЗ рдПрдХ рдирдП рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣реА рд╣реИ рдЬреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд╣рдереЗрд▓реА рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, kepler.gl рдЕрдкрдиреЗ рд░рд╛рдЬреНрдп рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдкреВрд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рд╢реАрд░реНрд╖ рд╕реНрддрд░ рдкрд░ рд╕реНрдерд┐рдд рд╣реЛрдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реИ рдФрд░ keplerGl рдирд╛рдо рд╕реЗ рд╕реБрд▓рдн рд╣реИред рдпрджрд┐ Redux рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХрд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдЕрдкреЗрдХреНрд╖рд┐рдд рд╕реЗ рднрд┐рдиреНрди рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╕рдВрдмрдВрдзрд┐рдд рд░рд┐рдПрдХреНрдЯ рдШрдЯрдХ рдХреЗ рд╕рд╣реА рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдпрд╣ getState рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрджрд╛рдиреБрдХреНрд░рдо рдореЗрдВ рдЕрдкрдиреЗ рд░рд╛рдЬреНрдп рдХреЗ рд╕реНрдерд╛рди рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред
рдХреЗрдкреНрд▓рд░Gl рд░рд┐рдПрдХреНрдЯ рдШрдЯрдХ рдХреЛ рдПрдореНрдмреЗрдб рдХрд░реЗрдВ
рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рддрддреНрд╡реЛрдВ (рд▓рд╛рдЦреЛрдВ-рдЬрд┐рдпреЛ-рдкреЙрдЗрдВрдЯ рддрдХ!) рдХреЗ рддреЗрдЬрд╝ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдХреЗрдкреНрд▓рд░.рд▓рдЧ рдбреЗрд╕реНрдХ.рд▓рдЧ - рдбреЗрдЯрд╛ рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рд▓рд┐рдП рд╡реЗрдмрд▓реЙрдЧ рдлреНрд░реЗрдорд╡рд░реНрдХ, рдФрд░ рдореИрдкрдмреЙрдХреНрд╕ - рдУрдкрди рд╕реЛрд░реНрд╕ рдЬрд┐рдпреЛ-рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдирд┐рд░реНрдорд┐рдд рдирдХреНрд╢реЗ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдПрдкреАрдЖрдИ рдФрд░ рд╡реНрдпрд╛рдкрдХ рд╕рдВрднрд╛рд╡рдирд╛рдПрдВ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред ред рдЗрд╕рд▓рд┐рдП, рдХреЗрдкреНрд▓реЗрд░рдЧрд▓ рдШрдЯрдХ рдХреЛ рдкрд╛рд░рд┐рдд рдЖрд╡рд╢реНрдпрдХ рдорд╛рдкрджрдВрдбреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдореИрдкрдмреЙрдХреНрд╕ рд╕реЗрд╡рд╛ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдкреАрдЖрдИ рдЯреЛрдХрди рд╣реИред
рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╕рд╛рдЗрдЯ www.mapbox.com рдкрд░ рдкрдВрдЬреАрдХрд░рдг рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдореИрдкрдмреЙрдХреНрд╕ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЯреИрд░рд┐рдл рдпреЛрдЬрдирд╛рдУрдВ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЫреЛрдЯреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП, рдкреНрд░рддрд┐ рдорд╛рд╣ 50,000 рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдореБрдлреНрдд рд╕рдВрд╕реНрдХрд░рдг рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛ред
рдЦрд╛рддрд╛ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдЯреЛрдХрди рдЕрдиреБрднрд╛рдЧ рдкрд░ рдЬрд╛рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рд╕реЗрд╡рд╛ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреБрдВрдЬреА рдЙрддреНрдкрдиреНрди рдХрд░рдиреА рд╣реЛрдЧреАред
рдкреНрд░рд╛рдкреНрдд рдЯреЛрдХрди рдХреЛ рдЙрдкрдпреБрдХреНрдд рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдкрд░ рд╕реЗрдЯ рдХрд░реЗрдВ:
export MapboxAccessToken=<your_mapBox_token>
рдЕрдм рдЖрдк рднреБрдЧрддрд╛рди рдХрд┐рдП рдЧрдП рдкрд╛рд░реНрдХрд┐рдВрдЧ рд╕реНрдерд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдШрдЯрдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдХреЗрдкреНрд▓рд░рдЧреНрд▓ рдШрдЯрдХ рдкрд░ рд╕рд┐рд░реНрдл рдПрдХ рдЖрд╡рд░рдг рд╣реЛрдЧрд╛, рдЬреЛ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рдЖрдпрд╛рдореЛрдВ рдХреЛ рд▓реЗрддрд╛ рд╣реИ:
import React from 'react'; import KeplerGl from 'kepler.gl'; const mapboxAccessToken = process.env.MapboxAccessToken; const ParkingMap = (props) => ( <KeplerGl id="parking_map" mapboxApiAccessToken={mapboxAccessToken} width={ props.width } height={ props.height } /> ); export default ParkingMap;
рдРрдк рдореЗрдВ рдкрд╛рд░реНрдХрд┐рдВрдЧ рдореИрдк рдЬреЛрдбрд╝реЗрдВред рдЗрд╕ рд╕реНрддрд░ рдкрд░, рдкрд╛рд░реНрдХрд┐рдВрдЧ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рдмрдЬрд╛рдп, рдХрд┐рд╕реА рднреА рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рдмрд┐рдирд╛ рдХреЗрд╡рд▓ рдПрдХ рдирдХреНрд╢рд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдордиреЗ рдЕрднреА рддрдХ рдЙрд╕ рдбреЗрдЯрд╛ рдХреЛ рдкреНрд░реЗрд╖рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╣рдорд╛рд░реЗ рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред
рдбреЗрдЯрд╛ рдФрд░ рдореИрдк рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ
рдирдХреНрд╢реЗ рдкрд░ рдЕрдкрдирд╛ рдбреЗрдЯрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХреЗрдкреНрд▓рд░ рдХреЛ рдЙрд╕ рдбреЗрдЯрд╛ рд╕реЗрдЯ рдкрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬрд┐рд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдирдХреНрд╢рд╛ рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдЕрдВрддрд┐рдо рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХрд╛ рд╡рд╛рдВрдЫрд┐рдд рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рдиред рдпрд╣ рджреЛ рддрд░реАрдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - AddDataToMap рдпрд╛ updateVisDataред
рдкрд╣рд▓реА рд╡рд┐рдзрд┐ рдЖрдкрдХреЛ рди рдХреЗрд╡рд▓ рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рд╕реЗрдЯ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдФрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реЗрдЯ рдХрд░рдиреЗ / рдХреЗрдкреНрд▓рд░рдЧреНрд▓ рдШрдЯрдХ рдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рдЙрджрд╛рд╣рд░рдг рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ / рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рд╕реЗрдЯрд┐рдВрдЧреНрд╕ (рд╡рд┐рдЬрд╝рд╕реНрдЯреЗрдЯ) рдФрд░ рдореИрдк (рдореИрдкрд╕реНрдЯреЗрдЯ), рд╕рд╛рде рд╣реА рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдореИрдк (рд╕реНрдЯрд╛рдЗрд▓рд╕рд╛рдЗрд▓) рдХреА рд╢реИрд▓реА рднреА рд╢рд╛рдорд┐рд▓ рд╣реИред
AddDataToMap рд╡рд┐рдзрд┐ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬрд╛рдирдХрд╛рд░реА рдпреБрдХреНрдд рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ:
рдиреЛрдЯред рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рдбреЗрдЯрд╛ рд╣рдореЗрд╢рд╛ рд╡рд┐рдХрд▓реНрдк рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдкрд╛рд░рд┐рдд рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдкрд░ рдкреВрд░реНрд╡рддрд╛ рд▓реЗрддрд╛ рд╣реИред
UpdateVisData рд╡рд┐рдзрд┐ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдШрдЯрдХ рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмрджрд▓рдиреЗ рдХреЗ рдмрд┐рдирд╛ рдХреЗрд╡рд▓ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛рд╕реЗрдЯ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ, рдпрд╣, рдкрд╣рд▓реА рд╡рд┐рдзрд┐ рдХреА рддрд░рд╣, рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рд▓реЗрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдирдпрд╛ рд╕реЗрдЯ рдпрд╛ рдбреЗрдЯрд╛ рд╕реЗрдЯ рдФрд░ рдХреБрдЫ рдореИрдк рдбрд┐рд╕реНрдкреНрд▓реЗ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП "рд╡рд┐рдХрд▓реНрдк" рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрддреА рд╣реИред
рдорд╛рдирдЪрд┐рддреНрд░ рдЖрд░рдВрднреАрдХрд░рдг
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдбреЗрдЯрд╛ рд▓реЛрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ AddDataToMap рд╡рд┐рдзрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдмрдирд╛рдП рдЬрд╛ рд░рд╣реЗ рдбреЗрдореЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ, рдореЙрд╕реНрдХреЛ рдореЗрдВ рдкреЗрдб рдкрд╛рд░реНрдХрд┐рдВрдЧ рдХрд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рддрдм рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдкрд╣рд▓реА рдмрд╛рд░ рдПрдХ рдЕрд▓рдЧ рдЕрдиреБрд░реЛрдз рджреНрд╡рд╛рд░рд╛ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкрд░рд┐рдгрд╛рдореА рд╕реНрд░реЛрдд рдбреЗрдЯрд╛ рдХреЗрдкреНрд▓рд░ рдХреЛ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдХреЗ рд▓рд┐рдП, рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдкреНрд░реЛрд╕реЗрд╕рд░ рдореЗрдВ рд╕реЗ рдПрдХ рдЬреЛ рдХрд┐ рдХреЗрдкрд▓рд░ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рдбреЗрдЯрд╛ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд╕реАрдПрд╕рд╡реА / рдЬреЛрдВрд╕ рдбреЗрдЯрд╛ рдХреЛ рдкреЛрд░реНрдЯ рдХрд░рддрд╛ рд╣реИ, рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред
export function loadParkingData(mapMode) { return (dispatch) => { dispatch( requestParkingData() ); fetch(demoDataUrl) .then(response => response.text()) .then(source => { dispatch( getParkingData() ); const data = Processors.processCsvData(source); const config = getMapConfig(mapMode); const datasets = [{ info, data }]; dispatch( wrapTo('parking_map', addDataToMap({ datasets, config }) )); }); }; }
рдореЛрдб рдХреЗ рдмреАрдЪ рд╕реНрд╡рд┐рдЪ рдХрд░реЗрдВ
рдорд╛рдирдЪрд┐рддреНрд░ рджреГрд╢реНрдп рдореЛрдб рдХреЗ рдмреАрдЪ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рдФрд░ рдПрдХреНрд╢рди рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рдХреЗрдкреНрд▓рд░рдЧреНрд▓ рдХреЗ рдореМрдЬреВрджрд╛ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ рдХреЗрд╡рд▓ рдирдХреНрд╢реЗ рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдмрджрд▓рдиреЗ рдХрд╛ рдХреЛрдИ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореЛрдб рдХреЗ рдмреАрдЪ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП addDataToMap рд╡рд┐рдзрд┐ рднреА рд╕рдмрд╕реЗ рдЙрдкрдпреБрдХреНрдд рддрд░реАрдХрд╛ рд╣реЛрдЧрд╛:
export function toggleMapMode(mode) { return (dispatch, getState) => { const config = getMapConfig( mode ); const datasets = getDatasets(getState()); dispatch( wrapTo('parking_map', addDataToMap({ datasets, config }) )); dispatch( setMapMode(mode) ); }; }
рдбреЗрдЯрд╛рд╕реЗрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП, рд╣рд░ рдмрд╛рд░ рдЬрдм рд╣рдо рдореИрдк рд╡реНрдпреВ рдореЛрдб рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░ рд▓реЛрдб рдХрд┐рдП рдЧрдП рдореВрд▓ рдбреЗрдЯрд╛ рд╕реЗрдЯ рдХреЛ рдлрд┐рд░ рд╕реЗ рднреЗрдЬ рджреЗрдВрдЧреЗред рдХрд╛рд░реНрдб рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреА рдЬрд╛рдирдХрд╛рд░реА рд╣рд░ рдмрд╛рд░ рдЕрдкрдбреЗрдЯ рдХреА рдЬрд╛рдПрдЧреАред рдЗрд╕ рдЖрд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдЗрд╕ рдмрд╛рдд рдкрд░ рдзреНрдпрд╛рди рдирд╣реАрдВ рджреВрдВрдЧрд╛ рдХрд┐ рдХреИрд╕реЗ getMapConfig рдФрд░ getDatasets рд╕рд╣рд╛рдпрдХ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕ рд╕реНрд░реЛрдд рдХреЛрдб рд╕реЗ рдЖрдк рдЦреБрдж рдХреЛ GitHub рдкрд░ рдкрд░рд┐рдЪрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдиреЛрдЯред рд╡рд░реНрддрдорд╛рди рдореЗрдВ, рдХреЗрдкреНрд▓рд░рдЧрд▓ рдПрдкреАрдЖрдИ рдмрд╣реБрдд рд╕реАрдорд┐рдд рдорд╛рдорд▓реЛрдВ (рдбреЗрдЯрд╛ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдФрд░ рдЕрджреНрдпрддрди рдХрд░рдиреЗ) рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕реАрдорд┐рдд рдФрд░ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЙрд╕реА рд╕рдордп, рдбреЗрд╡рд▓рдкрд░реНрд╕ рдЦреБрдж рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдг рдХреЗрд╡рд▓ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдпрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рдбреЗрдЯрд╛ рдЕрдкрдбреЗрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рднрд╛рд╡реА рддрд░реАрдХрд╛ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдордд рднреВрд▓реЛ рдХрд┐ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕рдХреНрд░рд┐рдп рд╡рд┐рдХрд╛рд╕ рдХреЗ рддрд╣рдд рд╣реИ рдФрд░ рдЗрд╕рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рд╢реАрдШреНрд░ рд╡рд┐рд╕реНрддрд╛рд░ рдХреА рдЙрдореНрдореАрдж рд╣реИред
рдорд╛рдирдЪрд┐рддреНрд░ рддрддреНрд╡реЛрдВ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░реЗрдВ
рдХреЗрдкреНрд▓рд░рдЧрд▓ рдореЗрдВ рди рдХреЗрд╡рд▓ рдЬрд┐рдпреЛ-рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рд╡рд╛рд▓рд╛ рдПрдХ рдХрдВрдЯреЗрдирд░ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдмрд▓реНрдХрд┐ рдореИрдк рдХрдВрдЯреНрд░реЛрд▓, рдЯреВрд▓рдЯрд┐рдк, рдкреНрд░рджрд░реНрд╢рд┐рдд рдбреЗрдЯрд╛ рдХреЗ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдЗрдб рдкреИрдирд▓, рд╕реАрдПрд╕рд╡реА рдореЗрдВ рдбреЗрдЯрд╛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдбрд╛рдпрд▓реЙрдЧ рдмреЙрдХреНрд╕, рдЬреЛрд╕рди рдпрд╛ рдЬрд┐рдпреЛрдЬреЛрди рдлреЙрд░реНрдореЗрдЯ рдЖрджрд┐ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдЙрд╕реА рд╕рдордп, рдкреНрд░рддреНрдпреЗрдХ рд╕реВрдЪреАрдмрджреНрдз рдШрдЯрдХреЛрдВ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди рдкреНрд░рдгрд╛рд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЕрдкрдиреЗ рдЕрдиреБрдХреВрд▓рд┐рдд рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рдЖрдзрд╛рд░ рдШрдЯрдХ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ:
- рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдШрдЯрдХ рдХрд╛рд░рдЦрд╛рдирд╛ рдЖрдпрд╛рдд рдХрд░реЗрдВ
- рдПрдХ рдирдпрд╛ рдШрдЯрдХ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ рдЬреЛ рдПрдХ рдХрд╕реНрдЯрдо рдШрдЯрдХ рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ
- рдЗрдВрдЬреЗрдХреНрдЯрдкреЙрдЗрдВрдЯрд░реНрд╕ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдирдпрд╛ рдХрд╛рд░рдЦрд╛рдирд╛ рдПрдореНрдмреЗрдб рдХрд░реЗрдВ
рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдбреЗрдореЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ, рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рдореЛрдб рдХреЛ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ, рдореМрдЬреВрджрд╛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдиреЗ рдпрд╛ рдирдП рдбреЗрдЯрд╛ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рдирд╣реАрдВ рджреЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ рдХрд┐ рдХреЗрдкреНрд▓рд░рдЧреНрд▓ рдШрдЯрдХ рдХреЗрд╡рд▓ рд░реАрдб рдореЛрдб рдореЗрдВ рд╣реИ, рдЬреЛ рдХреЗрд╡рд▓ 0.0.27 рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рднреА, рд╕рднреА рдирд┐рдпрдВрддреНрд░рдг рдЕрднреА рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХреБрдЫ рдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рд╣реА рдЫрд┐рдкрддреЗ рд╣реИрдВред рдЗрд╕рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЕрд╡рд╛рдВрдЫрд┐рдд рдШрдЯрдХреЛрдВ рдХреЛ рдЗрдВрдЬреЗрдХреНрд╢рди рдХрдореНрдкреЛрдиреЗрдВрдЯрд░реНрд╕ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдЕрд╢рдХреНрдд рдШрдЯрдХ рд╕реЗ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ:
import React from 'react'; import { injectComponents, ModalContainerFactory, SidePanelFactory, } from 'kepler.gl/components';
рдЖрд╕рд╛рдиреА рд╕реЗ, рдХреЗрдкреНрд▓рд░рдЧреНрд▓ рди рдХреЗрд╡рд▓ рдЖрдкрдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдШрдЯрдХреЛрдВ рдХреЗ рд╕рд╛рде рдмреБрдирд┐рдпрд╛рджреА рдШрдЯрдХреЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ withState рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдк рдирдП рдШрдЯрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рд░реНрдпреЛрдВ рдФрд░ рд░рд╛рдЬреНрдп рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред
рдПрдХ рд╕рд╛рде рдХрдИ рдХрд╛рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ
рдпрджрд┐ рдЖрдк рдПрдХ рд╣реА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рднреАрддрд░ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХреЗрдкреНрд▓рд░реЗрд▓ рдШрдЯрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЛ рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рдЖрдИрдбреА рдХреЗ рд╕рд╛рде рдорд╛рдкрджрдВрдбреЛрдВ рдореЗрдВ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рд░реНрдб рдХреЗ рдбреЗрдЯрд╛ рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдЬреЛрдбрд╝рдиреЗ / рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ:
const wrapToParking = wrapTo(' parking_map'); dispatch( wrapToParking( addDataToMap({ datasets, config }) ));
рдПрдХ рд╡рд┐рдХрд▓реНрдк Redux рд╕реЗ рдХрдиреЗрдХреНрдЯ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдФрд░ kepler.gl рд╕реЗ рдлрд╝реЙрд░рд╡рд░реНрдбреЛ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рдВрдмрдВрдзрд┐рдд рдбрд┐рд╕реНрдкреИрдЪрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕рдВрдЧрдд рдХрд╛рд░реНрдб рдХреА рдЖрдИрдбреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╕рд░рд▓ рд╣реИ:
import KeplerGl from 'kepler.gl'; import { forwardTo, toggleFullScreen } from 'kepler.gl/actions'; import {connect} from 'react-redux'; const MapContainer = props => ( <div> <button onClick=() => props.keplerGlDispatch(toggleFullScreen())/> <KeplerGl id="foo" /> </div> ) const mapStateToProps = state => state const mapDispatchToProps = (dispatch, props) => ({ dispatch, keplerGlDispatch: forwardTo('foo', dispatch) });
рдирд┐рд╖реНрдХрд░реНрд╖
рдХреЗрдкреНрд▓рд░рдЧрд▓ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рд░рд┐рдПрдХреНрдЯ-рдЖрдзрд╛рд░рд┐рдд рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рд░рдВрдЧреАрди рдЗрдВрдЯрд░реЗрдХреНрдЯрд┐рд╡ рдорд╛рдирдЪрд┐рддреНрд░ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдбреЗрд╕реНрдХ.рд▓реЙрдЧ рдШрдЯрдХ рдврд╛рдВрдЪреЗ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдпрд╣ рдЖрд╕рд╛рдиреА рд╕реЗ рдЙрдиреНрд╣реЗрдВ рджреЗрдЦрдиреЗ рдФрд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд▓рд╛рдЦреЛрдВ рдЬрд┐рдпреЛ-рдкреЙрдЗрдВрдЯ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдХрд╕реНрдЯрдорд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреА рд╡реНрдпрд╛рдкрдХ рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдиреЗ рди рдХреЗрд╡рд▓ рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдмрдирд╛рдпрд╛, рдмрд▓реНрдХрд┐ рдореИрдк рд╢реИрд▓рд┐рдпреЛрдВ, рд╕рд╛рде рд╣реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдкреНрд░рд╛рд░реВрдк, рдЬрдЯрд┐рд▓ рдХрд╛рд░реНрдЯреЛрдЧреНрд░рд╛рдлрд┐рдХ рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдФрд░ рдбреИрд╢рдмреЛрд░реНрдб рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрдкреНрд▓рд░рдЧреНрд▓ рдХреЛ рдПрдХ рдмрд╣реБрдд рд╣реА рдЖрдХрд░реНрд╖рдХ рдЙрдкрдХрд░рдг рдмрдирд╛рддреЗ рд╣реИрдВред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХреЗрд╡рд▓ рдмреБрдирд┐рдпрд╛рджреА рдПрдкреАрдЖрдИ рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рддрдХ рд╕реАрдорд┐рдд рд╣реИ, рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рдбреЗрдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдореИрдкрдмреЙрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕реА рдЕрдиреНрдп рдорд╛рдирдЪрд┐рддреНрд░ рд╕реНрд░реЛрдд рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЗ рдмрд┐рдирд╛, рдЙрди рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдХрдо рдХрд░реЗрдВ рдЬрд┐рдирдХреЗ рд▓рд┐рдП рдЗрд╕ рдЙрдкрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рдпрд╣ рдордд рднреВрд▓реЛ рдХрд┐ рдЖрдЬ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдЕрднреА рднреА рдмрд╣реБрдд рдпреБрд╡рд╛ рд╣реИ рдФрд░ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд╕рдХреНрд░рд┐рдп рдЪрд░рдг рдореЗрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрдирдореЗрдВ рд╕реЗ рдХрдИ рдХрдорд┐рдпрд╛рдВ рдирд┐рдХрдЯ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЕрдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред
рдЙрдкрдпреЛрдЧреА рд▓рд┐рдВрдХ
- рдкреВрд░реНрдг рдбреЗрдореЛ рдХреЛрдб
- рдХреЗрдкрд▓рд░ рдкрд░ рдкрд░рд┐рдЪрдпрд╛рддреНрдордХ рд▓реЗрдЦ
- рдЧрд┐рдердм рдкрд░ рдХреЗрдкреНрд▓рд░.рдЧреНрд▓ рд░рд┐рдкреЛрдЬрд┐рдЯрд░реА
- Kepler.gl рдХреЗ рд▓рд┐рдП рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬ
- Vis.Academy рдкрд░ Kepler.gl рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ [en]