geovizpy 0.1.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,13 @@
1
+ Metadata-Version: 2.4
2
+ Name: geovizpy
3
+ Version: 0.1.1
4
+ Summary: A Python wrapper for the geoviz JavaScript library
5
+ Author: fbxyz
6
+ Classifier: Programming Language :: Python :: 3
7
+ Classifier: License :: OSI Approved :: MIT License
8
+ Classifier: Operating System :: OS Independent
9
+ Requires-Python: >=3.6
10
+ Dynamic: author
11
+ Dynamic: classifier
12
+ Dynamic: requires-python
13
+ Dynamic: summary
@@ -0,0 +1,27 @@
1
+ # geovizpy
2
+
3
+ A Python wrapper for the [geoviz](https://github.com/neocarto/geoviz) JavaScript library.
4
+ It allows you to create thematic maps using a simple Python API and render them to HTML.
5
+
6
+ ## Installation
7
+
8
+ ```bash
9
+ pip install git+https://github.com/yourusername/geovizpy.git
10
+ ```
11
+
12
+ ## Usage
13
+
14
+ ```python
15
+ from geovizpy import Geoviz
16
+ import json
17
+
18
+ # Load your GeoJSON data
19
+ with open("examples/world.json") as f:
20
+ world_data = json.load(f)
21
+
22
+ # Create a map
23
+ viz = Geoviz(projection="EqualEarth")
24
+ viz.outline()
25
+ viz.choro(data=world_data, var="gdppc")
26
+ viz.render_html("map.html")
27
+ ```
@@ -0,0 +1,253 @@
1
+ import json
2
+
3
+ class Geoviz:
4
+ """
5
+ A Python wrapper for the geoviz JavaScript library.
6
+ Allows creating maps by chaining commands and rendering them to an HTML file.
7
+ """
8
+ def __init__(self, **kwargs):
9
+ self.commands = []
10
+ self.commands.append({"name": "create", "args": kwargs})
11
+
12
+ def _add_command(self, name, args):
13
+ self.commands.append({"name": name, "args": args})
14
+ return self
15
+
16
+ # Marks
17
+ def outline(self, **kwargs):
18
+ return self._add_command("outline", kwargs)
19
+
20
+ def graticule(self, **kwargs):
21
+ return self._add_command("graticule", kwargs)
22
+
23
+ def path(self, **kwargs):
24
+ return self._add_command("path", kwargs)
25
+
26
+ def header(self, **kwargs):
27
+ return self._add_command("header", kwargs)
28
+
29
+ def footer(self, **kwargs):
30
+ return self._add_command("footer", kwargs)
31
+
32
+ def circle(self, **kwargs):
33
+ return self._add_command("circle", kwargs)
34
+
35
+ def square(self, **kwargs):
36
+ return self._add_command("square", kwargs)
37
+
38
+ def spike(self, **kwargs):
39
+ return self._add_command("spike", kwargs)
40
+
41
+ def text(self, **kwargs):
42
+ return self._add_command("text", kwargs)
43
+
44
+ def tile(self, **kwargs):
45
+ return self._add_command("tile", kwargs)
46
+
47
+ def scalebar(self, **kwargs):
48
+ return self._add_command("scalebar", kwargs)
49
+
50
+ def north(self, **kwargs):
51
+ return self._add_command("north", kwargs)
52
+
53
+ def plot(self, **kwargs):
54
+ return self._add_command("plot", kwargs)
55
+
56
+ def tissot(self, **kwargs):
57
+ return self._add_command("tissot", kwargs)
58
+
59
+ def rhumbs(self, **kwargs):
60
+ return self._add_command("rhumbs", kwargs)
61
+
62
+ def earth(self, **kwargs):
63
+ return self._add_command("earth", kwargs)
64
+
65
+ def empty(self, **kwargs):
66
+ return self._add_command("empty", kwargs)
67
+
68
+ def halfcircle(self, **kwargs):
69
+ return self._add_command("halfcircle", kwargs)
70
+
71
+ def symbol(self, **kwargs):
72
+ return self._add_command("symbol", kwargs)
73
+
74
+ def grid(self, **kwargs):
75
+ return self._add_command("grid", kwargs)
76
+
77
+ # Plot shortcuts (sugar syntax for plot({type: ...}))
78
+ def choro(self, **kwargs):
79
+ return self._add_command("plot", {"type": "choro", **kwargs})
80
+
81
+ def typo(self, **kwargs):
82
+ return self._add_command("plot", {"type": "typo", **kwargs})
83
+
84
+ def prop(self, **kwargs):
85
+ return self._add_command("plot", {"type": "prop", **kwargs})
86
+
87
+ def propchoro(self, **kwargs):
88
+ return self._add_command("plot", {"type": "propchoro", **kwargs})
89
+
90
+ def proptypo(self, **kwargs):
91
+ return self._add_command("plot", {"type": "proptypo", **kwargs})
92
+
93
+ def picto(self, **kwargs):
94
+ return self._add_command("plot", {"type": "picto", **kwargs})
95
+
96
+ def bertin(self, **kwargs):
97
+ return self._add_command("plot", {"type": "bertin", **kwargs})
98
+
99
+ # Legends
100
+ def legend_circles_nested(self, **kwargs):
101
+ return self._add_command("legend.circles_nested", kwargs)
102
+
103
+ def legend_circles(self, **kwargs):
104
+ return self._add_command("legend.circles", kwargs)
105
+
106
+ def legend_squares(self, **kwargs):
107
+ return self._add_command("legend.squares", kwargs)
108
+
109
+ def legend_squares_nested(self, **kwargs):
110
+ return self._add_command("legend.squares_nested", kwargs)
111
+
112
+ def legend_circles_half(self, **kwargs):
113
+ return self._add_command("legend.circles_half", kwargs)
114
+
115
+ def legend_spikes(self, **kwargs):
116
+ return self._add_command("legend.spikes", kwargs)
117
+
118
+ def legend_mushrooms(self, **kwargs):
119
+ return self._add_command("legend.mushrooms", kwargs)
120
+
121
+ def legend_choro_vertical(self, **kwargs):
122
+ return self._add_command("legend.choro_vertical", kwargs)
123
+
124
+ def legend_choro_horizontal(self, **kwargs):
125
+ return self._add_command("legend.choro_horizontal", kwargs)
126
+
127
+ def legend_typo_vertical(self, **kwargs):
128
+ return self._add_command("legend.typo_vertical", kwargs)
129
+
130
+ def legend_typo_horizontal(self, **kwargs):
131
+ return self._add_command("legend.typo_horizontal", kwargs)
132
+
133
+ def legend_symbol_vertical(self, **kwargs):
134
+ return self._add_command("legend.symbol_vertical", kwargs)
135
+
136
+ def legend_symbol_horizontal(self, **kwargs):
137
+ return self._add_command("legend.symbol_horizontal", kwargs)
138
+
139
+ def legend_box(self, **kwargs):
140
+ return self._add_command("legend.box", kwargs)
141
+
142
+ # Effects
143
+ def effect_blur(self, **kwargs):
144
+ return self._add_command("effect.blur", kwargs)
145
+
146
+ def effect_shadow(self, **kwargs):
147
+ return self._add_command("effect.shadow", kwargs)
148
+
149
+ def effect_radialGradient(self, **kwargs):
150
+ return self._add_command("effect.radialGradient", kwargs)
151
+
152
+ def effect_clipPath(self, **kwargs):
153
+ return self._add_command("effect.clipPath", kwargs)
154
+
155
+ def get_config(self):
156
+ """
157
+ Returns the configuration as a JSON-compatible list of commands.
158
+ """
159
+ def process_args(args):
160
+ new_args = {}
161
+ for k, v in args.items():
162
+ if isinstance(v, str) and (v.strip().startswith("(") or v.strip().startswith("function") or "=>" in v):
163
+ new_args[k] = {"__js_func__": v}
164
+ elif isinstance(v, dict):
165
+ new_args[k] = process_args(v)
166
+ else:
167
+ new_args[k] = v
168
+ return new_args
169
+
170
+ processed_commands = []
171
+ for cmd in self.commands:
172
+ processed_commands.append({"name": cmd["name"], "args": process_args(cmd["args"])})
173
+
174
+ return processed_commands
175
+
176
+ def to_json(self):
177
+ """
178
+ Returns the configuration as a JSON string.
179
+ """
180
+ return json.dumps(self.get_config())
181
+
182
+ def render_html(self, filename="map.html"):
183
+ """
184
+ Renders the map to an HTML file.
185
+ """
186
+ json_commands = self.to_json()
187
+
188
+ html_content = f"""
189
+ <!DOCTYPE html>
190
+ <html>
191
+ <head>
192
+ <meta charset="UTF-8" />
193
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Tangerine"/>
194
+ <script src="https://cdn.jsdelivr.net/npm/d3@7"></script>
195
+ <script src="https://cdn.jsdelivr.net/npm/geoviz@0.9.8"></script>
196
+ </head>
197
+ <body>
198
+ <script>
199
+ const commands = {json_commands};
200
+ let svg;
201
+
202
+ // Helper to revive functions
203
+ function revive(obj) {{
204
+ if (typeof obj === 'object' && obj !== null) {{
205
+ if (obj.hasOwnProperty('__js_func__')) {{
206
+ try {{
207
+ return eval(obj['__js_func__']);
208
+ }} catch (e) {{
209
+ console.error("Failed to eval function:", obj['__js_func__'], e);
210
+ return null;
211
+ }}
212
+ }} else {{
213
+ for (let key in obj) {{
214
+ obj[key] = revive(obj[key]);
215
+ }}
216
+ }}
217
+ }}
218
+ return obj;
219
+ }}
220
+
221
+ const revivedCommands = revive(commands);
222
+
223
+ revivedCommands.forEach(cmd => {{
224
+ if (cmd.name === "create") {{
225
+ svg = geoviz.create(cmd.args);
226
+ }} else {{
227
+ const parts = cmd.name.split(".");
228
+ if (parts.length === 1) {{
229
+ if (svg[parts[0]]) {{
230
+ svg[parts[0]](cmd.args);
231
+ }} else {{
232
+ console.warn("Method " + parts[0] + " not found");
233
+ }}
234
+ }} else if (parts.length === 2) {{
235
+ if (svg[parts[0]] && svg[parts[0]][parts[1]]) {{
236
+ svg[parts[0]][parts[1]](cmd.args);
237
+ }} else {{
238
+ console.warn("Method " + cmd.name + " not found");
239
+ }}
240
+ }}
241
+ }}
242
+ }});
243
+
244
+ if (svg) {{
245
+ document.body.appendChild(svg.render());
246
+ }}
247
+ </script>
248
+ </body>
249
+ </html>
250
+ """
251
+ with open(filename, "w") as f:
252
+ f.write(html_content)
253
+ print(f"Map saved to {filename}")
@@ -0,0 +1,13 @@
1
+ Metadata-Version: 2.4
2
+ Name: geovizpy
3
+ Version: 0.1.1
4
+ Summary: A Python wrapper for the geoviz JavaScript library
5
+ Author: fbxyz
6
+ Classifier: Programming Language :: Python :: 3
7
+ Classifier: License :: OSI Approved :: MIT License
8
+ Classifier: Operating System :: OS Independent
9
+ Requires-Python: >=3.6
10
+ Dynamic: author
11
+ Dynamic: classifier
12
+ Dynamic: requires-python
13
+ Dynamic: summary
@@ -0,0 +1,7 @@
1
+ README.md
2
+ setup.py
3
+ geovizpy/__init__.py
4
+ geovizpy.egg-info/PKG-INFO
5
+ geovizpy.egg-info/SOURCES.txt
6
+ geovizpy.egg-info/dependency_links.txt
7
+ geovizpy.egg-info/top_level.txt
@@ -0,0 +1 @@
1
+ geovizpy
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
@@ -0,0 +1,16 @@
1
+ from setuptools import setup, find_packages
2
+
3
+ setup(
4
+ name="geovizpy",
5
+ version="0.1.1",
6
+ description="A Python wrapper for the geoviz JavaScript library",
7
+ author="fbxyz",
8
+ packages=find_packages(),
9
+ install_requires=[],
10
+ classifiers=[
11
+ "Programming Language :: Python :: 3",
12
+ "License :: OSI Approved :: MIT License",
13
+ "Operating System :: OS Independent",
14
+ ],
15
+ python_requires='>=3.6',
16
+ )