{
 "cells": [
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "# Seminar 02",
   "id": "a27587eaf7bb7e17"
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": [
    "## I/O\n",
    "### Working with files "
   ],
   "id": "6b4691823c21fbc6"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2026-09-15T20:27:33.813242Z",
     "start_time": "2026-09-15T20:27:33.809337Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# \"w\" replaces contents; \"a\" appends; \"r\" reads text; \"rb\" reads bytes.\n",
    "# `with` closes the file automatically.\n",
    "\n",
    "with open(\"example.txt\", \"w\", encoding=\"utf-8\") as f:\n",
    "    f.write(\"Hello, files!\\n\")\n",
    "\n",
    "with open(\"example.txt\", \"a\", encoding=\"utf-8\") as f:\n",
    "    f.write(\"Another line.\\n\")\n",
    "\n",
    "with open(\"example.txt\", \"r\", encoding=\"utf-8\") as f:\n",
    "    print(f.read())  # str\n",
    "\n",
    "with open(\"example.txt\", \"rb\") as f:\n",
    "    print(f.read())  # bytes"
   ],
   "id": "24e32fe7c0c44c5",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Hello, files!\n",
      "Another line.\n",
      "\n",
      "b'Hello, files!\\nAnother line.\\n'\n"
     ]
    }
   ],
   "execution_count": 2
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2026-09-15T20:38:00.373152Z",
     "start_time": "2026-09-15T20:38:00.370500Z"
    }
   },
   "cell_type": "code",
   "source": [
    "%%writefile tmp_data.json\n",
    "{\n",
    "    \"a\": 6, \n",
    "    \"b\": 7\n",
    "}"
   ],
   "id": "a19eb6633f9c770b",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Overwriting tmp_data.json\n"
     ]
    }
   ],
   "execution_count": 9
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2026-09-15T20:38:00.744091Z",
     "start_time": "2026-09-15T20:38:00.741365Z"
    }
   },
   "cell_type": "code",
   "source": [
    "with open('tmp_data.json', 'r') as f:\n",
    "    print(f)\n",
    "    print(f\"{f.name=}, {f.mode=}, {f.encoding=}\")"
   ],
   "id": "9fdca943546ea5fa",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<_io.TextIOWrapper name='tmp_data.json' mode='r' encoding='UTF-8'>\n",
      "f.name='tmp_data.json', f.mode='r', f.encoding='UTF-8'\n"
     ]
    }
   ],
   "execution_count": 10
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2026-09-15T20:38:01.055034Z",
     "start_time": "2026-09-15T20:38:01.050616Z"
    }
   },
   "cell_type": "code",
   "source": [
    "with open('tmp_data.json', 'r') as f:\n",
    "    line = f.readline()\n",
    "    print(len(line))\n",
    "    line = f.readline()\n",
    "    print(len(line))\n",
    "    line = f.readline()\n",
    "    print(len(line))\n",
    "    line = f.readline()\n",
    "    print(len(line))\n",
    "    line = f.readline()\n",
    "    print(len(line))\n",
    "    line = f.readline()\n",
    "    print(len(line))\n",
    "    line = f.readline() # This can go indefinitely\n",
    "    print(len(line))"
   ],
   "id": "41b29f83f426193e",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2\n",
      "13\n",
      "11\n",
      "2\n",
      "0\n",
      "0\n",
      "0\n"
     ]
    }
   ],
   "execution_count": 11
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2026-09-15T20:38:02.134958Z",
     "start_time": "2026-09-15T20:38:02.132239Z"
    }
   },
   "cell_type": "code",
   "source": [
    "with open('tmp_data.json', 'r') as f:\n",
    "    while len(line := f.readline()) > 0:\n",
    "        print(line)"
   ],
   "id": "6c745884d94f1d9c",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{\n",
      "\n",
      "    \"a\": 6, \n",
      "\n",
      "    \"b\": 7\n",
      "\n",
      "}\n",
      "\n"
     ]
    }
   ],
   "execution_count": 12
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2026-09-15T20:38:13.575920Z",
     "start_time": "2026-09-15T20:38:13.572507Z"
    }
   },
   "cell_type": "code",
   "source": [
    "with open('tmp_data.json', 'r') as f:\n",
    "    for line in f.readlines():\n",
    "        print(line.replace('\\n', '\\\\n'))\n",
    "    \n",
    "    print('--------------------')\n",
    "    for line in f.readlines():\n",
    "        print('This will never be printed')\n",
    "        print(line)\n",
    "    f.seek(0)\n",
    "    for line in f.readlines():\n",
    "        print('Now this will be printed')\n",
    "        print(line)"
   ],
   "id": "fccd46d9cfaa511c",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{\\n\n",
      "    \"a\": 6, \\n\n",
      "    \"b\": 7\\n\n",
      "}\\n\n",
      "--------------------\n",
      "Now this will be printed\n",
      "{\n",
      "\n",
      "Now this will be printed\n",
      "    \"a\": 6, \n",
      "\n",
      "Now this will be printed\n",
      "    \"b\": 7\n",
      "\n",
      "Now this will be printed\n",
      "}\n",
      "\n"
     ]
    }
   ],
   "execution_count": 13
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "### Working with JSONs",
   "id": "10537bdeb522c3cd"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2026-09-15T20:40:12.152397Z",
     "start_time": "2026-09-15T20:40:12.149518Z"
    }
   },
   "cell_type": "code",
   "source": [
    "import json\n",
    "\n",
    "# Better way to load JSONs\n",
    "with open('tmp_data.json', 'r') as f:\n",
    "    data = json.load(f)\n",
    "print(data)"
   ],
   "id": "7ef434784645961a",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'a': 6, 'b': 7}\n"
     ]
    }
   ],
   "execution_count": 14
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2026-09-15T20:40:19.087331Z",
     "start_time": "2026-09-15T20:40:19.084376Z"
    }
   },
   "cell_type": "code",
   "source": [
    "with open('tmp_data.json', 'w') as f: # This erases the content of the file\n",
    "    pass\n",
    "\n",
    "with open('tmp_data.json', 'r') as f:\n",
    "    content = f.read()\n",
    "print(content)\n",
    "print(len(content))"
   ],
   "id": "4c27f41578e4e0ac",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "0\n"
     ]
    }
   ],
   "execution_count": 15
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2026-09-15T20:40:29.865951Z",
     "start_time": "2026-09-15T20:40:29.863272Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# This is how you can write arbitrary data to the file\n",
    "with open('tmp_data.json', 'w') as f:\n",
    "    f.write('{\\n')\n",
    "    f.write('    \"a\": \"6\",\\n')\n",
    "    f.write('    \"b\": \"7\"\\n')\n",
    "    f.write('}')"
   ],
   "id": "3d5c80ce8890c454",
   "outputs": [],
   "execution_count": 17
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2026-09-15T22:06:09.220613Z",
     "start_time": "2026-09-15T22:06:09.216035Z"
    }
   },
   "cell_type": "code",
   "source": [
    "import json\n",
    "\n",
    "# But for JSON files, you can make it more simple:\n",
    "data = {\n",
    "    \"a\": 6,\n",
    "    \"b\": 7\n",
    "}\n",
    "\n",
    "print('json.dumps(data)')\n",
    "print(json.dumps(data))\n",
    "print()\n",
    "print()\n",
    "\n",
    "with open('tmp_data.json', 'w') as f:\n",
    "    f.write(json.dumps(data)) # Acceptable\n",
    "\n",
    "with open('tmp_data.json', 'r') as f:\n",
    "    print(f.read())\n",
    "\n",
    "with open('tmp_data.json', 'w') as f:\n",
    "    json.dump(data, f) # More concise\n",
    "\n",
    "with open('tmp_data.json', 'r') as f:\n",
    "    print(f.read())\n",
    "\n",
    "# Notice that now it's all in 1 line"
   ],
   "id": "a455975246ecec01",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "json.dumps(data)\n",
      "{\"a\": 6, \"b\": 7}\n",
      "\n",
      "\n",
      "{\"a\": 6, \"b\": 7}\n",
      "{\"a\": 6, \"b\": 7}\n"
     ]
    }
   ],
   "execution_count": 62
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2026-09-15T22:06:09.570158Z",
     "start_time": "2026-09-15T22:06:09.566595Z"
    }
   },
   "cell_type": "code",
   "source": [
    "with open('tmp_data.json', 'r') as f:\n",
    "    data_loaded = json.load(f)\n",
    "data_loaded"
   ],
   "id": "683e1a7d9b94765d",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'a': 6, 'b': 7}"
      ]
     },
     "execution_count": 63,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 63
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2026-09-15T22:06:09.752344Z",
     "start_time": "2026-09-15T22:06:09.749237Z"
    }
   },
   "cell_type": "code",
   "source": [
    "data_str = json.dumps(data)\n",
    "data_new = json.loads(data_str)\n",
    "data_new"
   ],
   "id": "db860a8f836bdb3c",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'a': 6, 'b': 7}"
      ]
     },
     "execution_count": 64,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 64
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2026-09-15T22:06:10.190685Z",
     "start_time": "2026-09-15T22:06:10.187257Z"
    }
   },
   "cell_type": "code",
   "source": [
    "with open('tmp_data.json', 'a') as f:\n",
    "    f.write('\\n')\n",
    "    f.write(json.dumps({ 'c': 8, 'd': 9 }))\n",
    "\n",
    "with open('tmp_data.json', 'r') as f:\n",
    "    print(f.read())"
   ],
   "id": "a90498751c85cc04",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{\"a\": 6, \"b\": 7}\n",
      "{\"c\": 8, \"d\": 9}\n"
     ]
    }
   ],
   "execution_count": 65
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "### Exercise: Parsing Product Distributors Data",
   "id": "8bf7e1e2434085e4"
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": [
    "\n",
    "In this exercise, our goal is to parse distributor information from mayco-distributors.csv file.\n",
    "For each distributor, we need to parse:\n",
    "- title\n",
    "- street_number\n",
    "- street_name\n",
    "- city\n",
    "- state_province\n",
    "- country\n",
    "- postal_code\n",
    "- website\n",
    "- latitude\n",
    "- longitude\n",
    "\n",
    "Whenever parsing random data files from the internet, be aware that they might be malformed. Good parser should skip malformed distributors and still parse the correct ones. "
   ],
   "id": "56f78de9af38fb99"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2026-09-15T20:48:53.331023Z",
     "start_time": "2026-09-15T20:48:53.328198Z"
    }
   },
   "cell_type": "code",
   "source": [
    "import csv\n",
    "from typing import NamedTuple\n",
    "\n",
    "\n",
    "class Distributor(NamedTuple):\n",
    "    title: str | None\n",
    "    street_number: str | None\n",
    "    street_name: str | None\n",
    "    city: str | None\n",
    "    state_province: str | None\n",
    "    country: str | None\n",
    "    postal_code: str | None\n",
    "    website: str | None\n",
    "    latitude: float | None\n",
    "    longitude: float | None"
   ],
   "id": "e6fb94b6f4f3fd01",
   "outputs": [],
   "execution_count": 22
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2026-09-15T20:49:01.063967Z",
     "start_time": "2026-09-15T20:49:01.060068Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# Bad example\n",
    "def bad_parse_distributors(file_path: str) -> list[Distributor]:\n",
    "    result = []\n",
    "    \n",
    "    def parse_float(value: str) -> float | None:\n",
    "        value = value.strip()\n",
    "        try:\n",
    "            return float(value)\n",
    "        except ValueError:\n",
    "            return None\n",
    "    \n",
    "    \n",
    "    def parse_trimmed_string(value: str) -> str | None:\n",
    "        value = value.strip()\n",
    "        if value == \"\":\n",
    "            return None\n",
    "        return value\n",
    "    \n",
    "    with open(file_path, 'r') as f:\n",
    "        csv_reader = csv.reader(f)\n",
    "        header = next(csv_reader)\n",
    "        for row in csv_reader:\n",
    "            distributor = Distributor(\n",
    "                title=parse_trimmed_string(row[1]),\n",
    "                street_number=parse_trimmed_string(row[2]),\n",
    "                street_name=parse_trimmed_string(row[3]),\n",
    "                city=parse_trimmed_string(row[4]),\n",
    "                state_province=parse_trimmed_string(row[5]),\n",
    "                country=parse_trimmed_string(row[6]),\n",
    "                postal_code=parse_trimmed_string(row[7]),\n",
    "                website=parse_trimmed_string(row[8]),\n",
    "                latitude=parse_float(row[16]),\n",
    "                longitude=parse_float(row[17])\n",
    "            )\n",
    "            result.append(distributor)\n",
    "    return result"
   ],
   "id": "9a7a6c568c3a9581",
   "outputs": [],
   "execution_count": 23
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2026-09-15T20:49:06.264833Z",
     "start_time": "2026-09-15T20:49:06.261405Z"
    }
   },
   "cell_type": "code",
   "source": "distributors = bad_parse_distributors(\"mayco-distributors.csv\")",
   "id": "30a9c2041ee1c28e",
   "outputs": [],
   "execution_count": 24
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2026-09-15T20:49:11.110674Z",
     "start_time": "2026-09-15T20:49:11.107613Z"
    }
   },
   "cell_type": "code",
   "source": "distributors[0]",
   "id": "c03e321a104ff83e",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Distributor(title='Zeramics Importacao e Comercio', street_number=None, street_name=None, city='Sao Paulo', state_province=None, country='Brazil', postal_code='01457-060', website='https://www.zeramics.com.br/', latitude=-23.5736958, longitude=-46.6929462)"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 25
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2026-09-15T20:49:15.019883Z",
     "start_time": "2026-09-15T20:49:15.015603Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# Good example\n",
    "def good_parse_distributors(file_path: str) -> list[Distributor]:\n",
    "    result = []\n",
    "    with open(file_path, 'r') as f:\n",
    "        csv_reader = csv.reader(f)\n",
    "        next(csv_reader)\n",
    "        \n",
    "        def parse_string(index: int) -> str | None:\n",
    "            if len(row) <= index:\n",
    "                return None\n",
    "            value = row[index]\n",
    "            if len(value) == 0:\n",
    "                return None\n",
    "            return value.strip()\n",
    "        \n",
    "        def parse_float(index: int) -> float | None:\n",
    "            value_str = parse_string(index)\n",
    "            if value_str is None:\n",
    "                return None\n",
    "            try:\n",
    "                return float(value_str)\n",
    "            except ValueError:\n",
    "                return None\n",
    "        \n",
    "        for row in csv_reader:\n",
    "            distributor = Distributor(\n",
    "                title=parse_string(1),\n",
    "                street_number=parse_string(2),\n",
    "                street_name=parse_string(3),\n",
    "                city=parse_string(4),\n",
    "                state_province=parse_string(5),\n",
    "                country=parse_string(6),\n",
    "                postal_code=parse_string(7),\n",
    "                website=parse_string(8),\n",
    "                latitude=parse_float(16),\n",
    "                longitude=parse_float(17)\n",
    "            )\n",
    "            result.append(distributor)\n",
    "        \n",
    "    return result"
   ],
   "id": "7ef231225bbac5d0",
   "outputs": [],
   "execution_count": 26
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2026-09-15T20:49:20.347051Z",
     "start_time": "2026-09-15T20:49:20.342934Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# Bonus: really good example\n",
    "from typing import Generator\n",
    "\n",
    "def really_good_parse_distributors(file_path: str) -> Generator[Distributor, None, None]:\n",
    "    with open(file_path, 'r') as f:\n",
    "        csv_reader = csv.reader(f)\n",
    "        next(csv_reader)\n",
    "        \n",
    "        def parse_string(index: int) -> str | None:\n",
    "            if len(row) <= index:\n",
    "                return None\n",
    "            value = row[index]\n",
    "            if len(value) == 0:\n",
    "                return None\n",
    "            return value.strip()\n",
    "        \n",
    "        def parse_float(index: int) -> float | None:\n",
    "            value_str = parse_string(index)\n",
    "            if value_str is None:\n",
    "                return None\n",
    "            try:\n",
    "                return float(value_str)\n",
    "            except ValueError:\n",
    "                return None\n",
    "        \n",
    "        for row in csv_reader:\n",
    "            yield Distributor(\n",
    "                title=parse_string(1),\n",
    "                street_number=parse_string(2),\n",
    "                street_name=parse_string(3),\n",
    "                city=parse_string(4),\n",
    "                state_province=parse_string(5),\n",
    "                country=parse_string(6),\n",
    "                postal_code=parse_string(7),\n",
    "                website=parse_string(8),\n",
    "                latitude=parse_float(16),\n",
    "                longitude=parse_float(17)\n",
    "            )"
   ],
   "id": "b4baefb74b2c406f",
   "outputs": [],
   "execution_count": 27
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2026-09-15T20:49:25.443019Z",
     "start_time": "2026-09-15T20:49:25.438428Z"
    }
   },
   "cell_type": "code",
   "source": [
    "distributors = good_parse_distributors('mayco-distributors.csv')\n",
    "distributors[:3]"
   ],
   "id": "ee1f6a208c43468b",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[Distributor(title='Zeramics Importacao e Comercio', street_number=None, street_name=None, city='Sao Paulo', state_province=None, country='Brazil', postal_code='01457-060', website='https://www.zeramics.com.br/', latitude=-23.5736958, longitude=-46.6929462),\n",
       " Distributor(title='Your Ceramic Store', street_number='Silicon Oasis, SIT Tower, Office 602', street_name='P O Box 430090', city='Dubai', state_province=None, country='United Arab Emirates', postal_code=None, website='https://yourceramicstore.com/', latitude=25.11987, longitude=55.3867),\n",
       " Distributor(title='Yaro975', street_number=None, street_name=None, city='Montevideo', state_province=None, country='Uruguay', postal_code='11100', website='https://yaro975.com.uy', latitude=-34.90652, longitude=-56.19418)]"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 28
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2026-09-15T20:49:29.635931Z",
     "start_time": "2026-09-15T20:49:29.625078Z"
    }
   },
   "cell_type": "code",
   "source": [
    "for distributor in really_good_parse_distributors('mayco-distributors.csv'):\n",
    "    print(distributor)"
   ],
   "id": "32a484394d2d4692",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Distributor(title='Zeramics Importacao e Comercio', street_number=None, street_name=None, city='Sao Paulo', state_province=None, country='Brazil', postal_code='01457-060', website='https://www.zeramics.com.br/', latitude=-23.5736958, longitude=-46.6929462)\n",
      "Distributor(title='Your Ceramic Store', street_number='Silicon Oasis, SIT Tower, Office 602', street_name='P O Box 430090', city='Dubai', state_province=None, country='United Arab Emirates', postal_code=None, website='https://yourceramicstore.com/', latitude=25.11987, longitude=55.3867)\n",
      "Distributor(title='Yaro975', street_number=None, street_name=None, city='Montevideo', state_province=None, country='Uruguay', postal_code='11100', website='https://yaro975.com.uy', latitude=-34.90652, longitude=-56.19418)\n",
      "Distributor(title='West’s Ceramic Supply, Inc.', street_number=None, street_name=None, city='Highland', state_province='New York', country='United States', postal_code='12528', website='https://westsceramicsupply.com', latitude=41.7209267, longitude=-73.9601382)\n",
      "Distributor(title='Webster’s Works, Wood’s Ceramics', street_number=None, street_name=None, city='Lake View', state_province='New York', country='United States', postal_code='14085', website=None, latitude=42.7287133717062, longitude=-78.9167109535474)\n",
      "Distributor(title='Van Tuyl Kiln & Furnace', street_number='28 Van Der Bijl Street', street_name=None, city='Alrode South Alberton', state_province=None, country='South Africa', postal_code='1449', website='https://vantuyl.co.za/', latitude=-26.34891, longitude=28.12106)\n",
      "Distributor(title='Ulster Ceramics Plc', street_number=None, street_name=None, city='Maghera', state_province=None, country='United Kingdom', postal_code='BT46 5QE', website='http://www.ulsterceramicspotterysupplies.co.uk/', latitude=54.91354574837201, longitude=-6.661856872654075)\n",
      "Distributor(title='Tucker’s Pottery Supplies Inc.', street_number='15 West Pearce St #7', street_name=None, city='Richmond Hill', state_province='Ontario', country='Canada', postal_code='L4B 1H6', website='https://www.tuckerspottery.com', latitude=43.84808, longitude=-79.38445)\n",
      "Distributor(title='Trinity Ceramic Supply, Inc.', street_number=None, street_name=None, city='Dallas', state_province='Texas', country='United States', postal_code='75247', website='https://trinityceramic.com', latitude=32.8166692, longitude=-96.8833562)\n",
      "Distributor(title='Töpferstudio Alte Scheuer', street_number=None, street_name='Klosterstraße 12a', city='Bruchsal', state_province=None, country='Germany', postal_code='76646', website='https://mayco-glasuren.de/', latitude=49.12315180101692, longitude=8.603871883466947)\n",
      "Distributor(title='Third Branch Pottery Supply', street_number='15 North Main St, Unit 101', street_name=None, city='Randolph', state_province='Vermont', country='United States', postal_code='05060', website='https://www.thirdbranchpotterysupply.com/', latitude=43.92297, longitude=-72.66473)\n",
      "Distributor(title='Thien Minh Book Joint Stock co.', street_number='333 National Highway 13, Ward Hiep Binh Phuoc', street_name=None, city='Thu Duc, Ho Chi Minh', state_province=None, country='Vietnam', postal_code='700000', website='https://thegioigom.com/cua-hang/?filter_brand=mayco', latitude=10.860341, longitude=106.723881)\n",
      "Distributor(title='The Tilted Kiln', street_number=None, street_name=None, city='St. George', state_province='Utah', country='United States', postal_code='84770', website=None, latitude=37.1963372, longitude=-113.5966577)\n",
      "Distributor(title='The Potter’s Shop', street_number='1314', street_name='S West Ave.', city='Waukesha', state_province='Wisconsin', country='United States', postal_code='53186', website='https://www.pottersshop.com/', latitude=42.98952, longitude=-88.23776)\n",
      "Distributor(title='The Potter’s Center', street_number='110', street_name='Ellen St.', city='Garden City', state_province='Idaho', country='United States', postal_code='83714', website='https://thepotterscenter.com', latitude=43.63947, longitude=-116.26504)\n",
      "Distributor(title='Sunstone Pottery and Supply', street_number='217', street_name='S. Main', city='Coalville', state_province='Utah', country='United States', postal_code='84017', website='https://sunstonepotterysupply.com/', latitude=40.91113, longitude=-111.39564)\n",
      "Distributor(title='Suministros Marphil S.L.', street_number=None, street_name='Hermanos Machando 52', city='Madrid', state_province=None, country='Spain', postal_code='28017', website='https://www.marphil.com/', latitude=40.42988457471934, longitude=-3.6487611001096)\n",
      "Distributor(title='Sultan Selim Kir Ve Ortagi', street_number='Fatih Sultan Mehmet Mahallesi Bilgi Sok.', street_name=None, city='Istanbul', state_province=None, country='Turkey', postal_code='34470', website='https://www.ceramicartstore.com/', latitude=41.09099, longitude=29.05593)\n",
      "Distributor(title='Stone Leaf Pottery', street_number=None, street_name=None, city='Arvada', state_province='Colorado', country='United States', postal_code='80003', website='https://stoneleafpottery.com', latitude=39.8182494, longitude=-105.0674317)\n",
      "Distributor(title='Spectrum Educational Supplies Limited', street_number=None, street_name=None, city='Newmarket', state_province='Ontario', country='Canada', postal_code='L3Y 7B6', website='https://spectrumeducational.co.uk', latitude=44.0724418, longitude=-79.4303017)\n",
      "Distributor(title='Sounding Stone', street_number=None, street_name=None, city='Winnipeg', state_province='Manitoba', country='Canada', postal_code='R3T 3Y5', website='https://soundingstone.com', latitude=49.8269692, longitude=-97.1633807)\n",
      "Distributor(title='Solutions Céramiques', street_number='7 Rue des Cades', street_name=None, city=None, state_province=\"Saint-Georges-d'Orques\", country='France', postal_code='34680', website='https://www.solutions-ceramiques.com/', latitude=43.62967, longitude=3.76665)\n",
      "Distributor(title='Société Peter Lavem', street_number=None, street_name='31 rue Gay-Lussac', city='Chennevieres Sur Marne', state_province=None, country='France', postal_code='94430', website='https://www.peterlavem.fr/', latitude=48.794026163444286, longitude=2.5453764829544263)\n",
      "Distributor(title='Silver Sage Ceramics', street_number='3110 Old Faithful Rd', street_name=None, city='Cheyenne', state_province='Wyoming', country='United States', postal_code='82001', website='https://www.silversageceramics.com', latitude=41.13902, longitude=-104.77653)\n",
      "Distributor(title='Sial Poterie Ste. Catherine In', street_number=None, street_name=None, city='Laval, Quebec', state_province='Quebec', country='Canada', postal_code='H7L 3S1', website='https://sial-canada.com', latitude=45.5796725, longitude=-73.7476821)\n",
      "Distributor(title='Sheila’s Ceramics', street_number=None, street_name=None, city='Anchorage', state_province='Alaska', country='United States', postal_code='99503', website='https://www.facebook.com/Sheilas-Ceramics-Pottery-Supply-155498857821872/', latitude=61.191144, longitude=-149.8902415)\n",
      "Distributor(title='Sheffield Pottery Inc.', street_number=None, street_name=None, city='Sheffield', state_province='Massachusetts', country='United States', postal_code='1257', website='https://sheffield-pottery.com', latitude=42.0937726, longitude=-73.3944466)\n",
      "Distributor(title='Seattle Pottery LLC.', street_number=None, street_name=None, city='Seattle', state_province='Washington', country='United States', postal_code='98134', website='https://seattlepotterysupply.com', latitude=47.583863, longitude=-122.3406748)\n",
      "Distributor(title='School Specialty', street_number=None, street_name=None, city='Appleton', state_province='Wisconsin', country='United States', postal_code='54942', website='https://schoolspecialty.com', latitude=44.2953936, longitude=-88.5371958)\n",
      "Distributor(title='Sajo Ceramics', street_number=None, street_name=None, city='Kilsyth South', state_province='Victoria', country='Australia', postal_code='3137', website='https://sajoceramics.com', latitude=-37.8296238, longitude=145.3115843)\n",
      "Distributor(title='Runyan Pottery Supply', street_number=None, street_name=None, city='Clio', state_province='Michigan', country='United States', postal_code='48420', website='https://runyanpotterysupply.com', latitude=43.1775256, longitude=-83.7341274)\n",
      "Distributor(title='Rovin Ceramics', street_number='253', street_name='Dino Drive, Suite A', city='Ann Arbor', state_province='Michigan', country='United States', postal_code='48103', website='https://www.rovinceramics.com', latitude=42.288968, longitude=-83.880603)\n",
      "Distributor(title='Romina Rudy', street_number='Sierra de las Penas 458, B, San Isidro', street_name=None, city='Villa Allenda', state_province='Cordoba', country='Argentina', postal_code=None, website=None, latitude=-31.30571, longitude=-64.24748)\n",
      "Distributor(title='Rochester Ceramics, Inc', street_number=None, street_name=None, city='Webster', state_province='New York', country='United States', postal_code='14580', website='http://www.rochesterceramics.com/', latitude=43.22345, longitude=-77.38136)\n",
      "Distributor(title='RoadRunner Ceramics', street_number=None, street_name=None, city='San Antonio', state_province='Texas', country='United States', postal_code='78249', website='https://roadrunnerceramics.com', latitude=29.5676137, longitude=-98.6050736)\n",
      "Distributor(title='River Craft', street_number='817', street_name='Beersheba Hwy', city='McMinnville', state_province='Tennessee', country='United States', postal_code='37110', website='https://www.rivercraftceramics.com', latitude=35.6697, longitude=-85.75343)\n",
      "Distributor(title='Queen City Clay', street_number=None, street_name=None, city='Cincinnati', state_province='Ohio', country='United States', postal_code='45209', website='https://queencityclay.com', latitude=39.1511025, longitude=-84.4225186)\n",
      "Distributor(title='Productos Superiores S.A', street_number='Bulevard Andrews, Building 41CA  43-402', street_name=None, city='Albrook', state_province=None, country='Panama', postal_code='0616-07899', website='https://www.supropanama.com/', latitude=9.170691695319746, longitude=-79.62859616532738)\n",
      "Distributor(title='Potterycrafts', street_number=None, street_name=None, city='Stoke On Trent', state_province='Staffordshire', country='United Kingdom', postal_code='ST1 1AF', website='https://potterycrafts.co.uk', latitude=53.0219186, longitude=-2.2297826)\n",
      "Distributor(title='Pottery Supplies', street_number='51 Castlemaine St.', street_name=None, city='Milton', state_province='Queensland', country='Australia', postal_code='4064', website='https://www.potterysuppliesonline.com.au', latitude=-27.46468, longitude=153.00821)\n",
      "Distributor(title='Pottery Lane GR', street_number='401 Hall St SW, Suite 128B', street_name=None, city='Grand Rapids', state_province='Michigan', country='United States', postal_code='49503', website='https://www.potterylanegr.com', latitude=42.94286, longitude=-85.67837)\n",
      "Distributor(title='Pottershop', street_number=None, street_name=None, city='Cape Town', state_province=None, country='South Africa', postal_code='7975', website='https://www.thepottershop.co.za', latitude=-34.1418189, longitude=18.3860652)\n",
      "Distributor(title='Poterie du Vieux Bac', street_number='905 avenue des Nations unies', street_name=None, city=None, state_province='Bailleul', country='France', postal_code='59270', website='https://poterieduvieuxbac.com/', latitude=50.72777, longitude=2.7375)\n",
      "Distributor(title='Potclays, Ltd.', street_number=None, street_name=None, city='Stoke On Trent', state_province='Staffordshire', country='United Kingdom', postal_code='ST4 7BP', website='https://potclays.co.uk', latitude=53.0167996, longitude=-2.2033509)\n",
      "Distributor(title='Portland Pottery', street_number='118', street_name='Washington Ave.', city='Portland', state_province='Maine', country='United States', postal_code='4101', website='https://www.portlandpottery.com', latitude=43.66709, longitude=-70.25338)\n",
      "Distributor(title='Portland Pottery', street_number='87', street_name='Messina Dr', city='Braintree', state_province='Massachusetts', country='United States', postal_code='02184', website='https://www.portlandpottery.com/braintree/', latitude=42.19353, longitude=-71.03353)\n",
      "Distributor(title='Patty’s Ceramics', street_number=None, street_name=None, city='Provo', state_province='Utah', country='United States', postal_code='84601', website='https://www.pattysceramics.com', latitude=40.235119, longitude=-111.662193)\n",
      "Distributor(title='Paton Arts & Craft Production', street_number=None, street_name=None, city='Kwai Chung, Nt.', state_province=None, country='Hong Kong', postal_code=None, website='https://patonarts.com.hk', latitude=22.3668502, longitude=114.1302591)\n",
      "Distributor(title='Pappel Espanola S.L.', street_number=None, street_name=None, city='Madrid', state_province=None, country='Spain', postal_code='28947', website='https://pappel.com', latitude=40.2636452, longitude=-3.7485874)\n",
      "Distributor(title='P&H', street_number=None, street_name='308, 3, Sinjeong-ro 13-gil', city='Yangcheon-gu', state_province=None, country='South Korea', postal_code='08081', website='https://www.pnhart.co.kr', latitude=37.519828, longitude=126.865139)\n",
      "Distributor(title='Northern Rivers Pottery Supplies', street_number='58-62 Simpson Avenue', street_name='Warehouse 2, Wollongbar Shop/Centre', city='Wollongbar, NSW', state_province=None, country='Australia', postal_code='2481', website='https://nrpotterysupplies.com.au/', latitude=-28.82825, longitude=153.42089)\n",
      "Distributor(title='North Vancouver Ceramics', street_number='201-1305', street_name='Welch Street', city='North Vancouver', state_province='British Columbia', country='Canada', postal_code='V7P 1B3', website='https://www.nvceramics.com', latitude=49.31711, longitude=-122.11111)\n",
      "Distributor(title='New Mexico Clay', street_number=None, street_name=None, city='Albuquerque', state_province='New Mexico', country='United States', postal_code='87107', website='https://nmclay.com', latitude=35.11755, longitude=-106.6133)\n",
      "Distributor(title='Nellie Dog Pottery and Paints', street_number=None, street_name=None, city='Chillicothe', state_province='Ohio', country='United States', postal_code='45601', website='https://nelliedogpottery.com/', latitude=39.33497866060913, longitude=-82.9820773966436)\n",
      "Distributor(title='Nasco WI', street_number=None, street_name=None, city='Fort Atkinson', state_province='Wisconsin', country='United States', postal_code='53538', website='https://enasco.com', latitude=42.9288944, longitude=-88.8370509)\n",
      "Distributor(title='Nacho suministros ceramicos S.L.', street_number=None, street_name='Calle Cadiz, N 5', city='Valencia', state_province=None, country='Spain', postal_code='46006', website='http://www.nacho-sum.es/', latitude=39.46416429320049, longitude=-0.3749144578087148)\n",
      "Distributor(title='Mondo Ceramica S.r.l.', street_number=None, street_name='Via Circonvallazione Nord sc', city='Deruta', state_province=None, country='Italy', postal_code='6053', website='https://www.mondoceramica.net/', latitude=42.9834455963917, longitude=12.421576525488163)\n",
      "Distributor(title='MJG Studios Ltd', street_number='3', street_name='W Winter St', city='Delaware', state_province='Ohio', country='United States', postal_code='43015', website=None, latitude=40.29999, longitude=-83.068314)\n",
      "Distributor(title='Mishawaka United Art & Education Sup.Co.', street_number=None, street_name=None, city='Mishawaka', state_province='Indiana', country='United States', postal_code='46545', website='https://www.unitednow.com', latitude=41.77717393412595, longitude=-86.22638720568948)\n",
      "Distributor(title='Minnesota Clay Co', street_number='2960', street_name='Niagara Lane N', city='Plymouth', state_province='Minnesota', country='United States', postal_code='55447', website='https://www.mnclay.com', latitude=45.01408, longitude=-93.47139)\n",
      "Distributor(title='Minerco Industrial Minerals Co. Ltd.', street_number=None, street_name=None, city='Netanya', state_province=None, country='Israel', postal_code='4250210', website='http://minerco.co.il', latitude=32.2822293, longitude=34.8633457)\n",
      "Distributor(title='Midwest Ceramics LLC', street_number='217', street_name='E. South Street', city='Plano', state_province='Illinois', country='United States', postal_code='60545', website=None, latitude=41.66211, longitude=-88.53422)\n",
      "Distributor(title='Michigan Art Center', street_number='32129', street_name='Block Street', city='Garden City', state_province='Michigan', country='United States', postal_code='48136', website='https://michiganartcenter.com/', latitude=42.32948, longitude=-83.35778)\n",
      "Distributor(title='Michel Keramikbedarf', street_number=None, street_name='Lerchenhalde 73', city='Zürich', state_province=None, country='Switzerland', postal_code='8046', website='https://keramikbedarf.ch/', latitude=47.41602336951975, longitude=8.506974812339454)\n",
      "Distributor(title='Miami Ceramics and Clay Supplies, Inc.', street_number=None, street_name=None, city='Hialeah', state_province='Florida', country='United States', postal_code='33016', website='http://miaceramicsandclaysupplies.com/', latitude=25.8925211, longitude=-80.3352364)\n",
      "Distributor(title='Mei Sum Art & Design Ltd.', street_number='Unit L 20/F, Shield Industrial Centre', street_name='84-92 Chai Wan Kok Street', city='Tsuen Wan', state_province='Hong Kong', country='China', postal_code=None, website='http://www.meisum.com/', latitude=22.37211, longitude=114.10869)\n",
      "Distributor(title='Marjon Ceramics – Tucson', street_number='426', street_name='W Alturas', city='Tucson', state_province='Arizona', country='United States', postal_code='85705', website='https://marjonceramics.com', latitude=32.2680738, longitude=-110.9923904)\n",
      "Distributor(title='Marjon Ceramics – Phoenix', street_number='3434', street_name='W. Earll Dr ste #101', city='Phoenix', state_province='Arizona', country='United States', postal_code='85017', website='https://marjonceramics.com', latitude=33.514162, longitude=-112.1251372)\n",
      "Distributor(title='Marcellas Ceramics, Inc.', street_number=None, street_name=None, city='Beloit', state_province='Wisconsin', country='United States', postal_code='53511', website='https://www.facebook.com/MarcellasCeramics/', latitude=42.5083482, longitude=-89.0317765)\n",
      "Distributor(title='Mar-Lyn Ceramics', street_number=None, street_name=None, city='West Point', state_province='Mississippi', country='United States', postal_code='39773', website='https://marlynceramics.com', latitude=33.6076186, longitude=-88.6503254)\n",
      "Distributor(title='Manufacturas En Ceramica De Zapopan', street_number=None, street_name='Frias 571', city='Guadalajara', state_province=None, country='Mexico', postal_code='44200', website='https://www.manufacturasenceramica.com.mx', latitude=20.68589, longitude=-103.36012)\n",
      "Distributor(title='Luciana Thomaz Ateliê de Cerâmica', street_number=None, street_name=None, city='Vinhedo', state_province=None, country='Brazil', postal_code='13289-036', website='https://lucianathomaz.com.br/', latitude=-23.029806687822827, longitude=-46.98150291585529)\n",
      "Distributor(title='Les Cousins', street_number='160 Rue Des 4 Termes\\xa0 ZI Les Paluds - BP 1124', street_name=None, city='Aubagne', state_province='Cedex', country='France', postal_code='13400', website='http://www.lescousins.fr/', latitude=43.28749, longitude=5.59891)\n",
      "Distributor(title='Leim&Zwa', street_number=None, street_name='Dorpstraat 4a', city='Elsloo', state_province=None, country='Netherlands', postal_code='6181GX', website='https://leimenzwa.nl', latitude=50.94742, longitude=5.75973)\n",
      "Distributor(title='Lehmhuus AG', street_number=None, street_name='Neuhofweg 50', city='Aesch', state_province=None, country='Switzerland', postal_code='4147', website='http://www.lehmhuus.ch/', latitude=47.47919571498961, longitude=7.594080816906424)\n",
      "Distributor(title='Laboratoriya Keramiki LLC', street_number=None, street_name=None, city='Moscow', state_province=None, country='Russia', postal_code='129281', website='https://portalkeramiki.ru/', latitude=55.8001192398025, longitude=37.5850052443222)\n",
      "Distributor(title='Kuantum Yapi Kim-San Tic LTD STI', street_number=None, street_name='UQUR Mah. 849 Sok. No.4/C', city='Konak-Izmir', state_province=None, country='Turkey', postal_code='35180', website=None, latitude=38.40558, longitude=27.15985)\n",
      "Distributor(title='Krueger Pottery Supplies', street_number=None, street_name=None, city='Brentwood', state_province='Missouri', country='United States', postal_code='63144', website='https://kruegerpottery.com', latitude=38.6157474, longitude=-90.3513021)\n",
      "Distributor(title='Koch Ceramics', street_number=None, street_name=None, city='Johnstown', state_province='Pennsylvania', country='United States', postal_code='15902', website='https://www.kochceramics.com', latitude=40.30886, longitude=-78.88978)\n",
      "Distributor(title='Kiln Room', street_number=None, street_name=None, city='Columbus', state_province='Ohio', country='United States', postal_code=None, website='https://www.kilnroomcolumbus.com/', latitude=39.92038222361848, longitude=-82.9945287194743)\n",
      "Distributor(title='Kettles Pottery Supplies', street_number=None, street_name=None, city='Edinburgh', state_province=None, country='United Kingdom', postal_code='EH7 6UL', website='https://www.kettlespotterysupplies.com/', latitude=55.95668032321615, longitude=-3.1265623087467893)\n",
      "Distributor(title='Keraterm Franc Konjedič s.P.', street_number=None, street_name='Šiškovo Naselje 9', city='Kranj', state_province=None, country='Slovenia', postal_code='4000', website='https://www.keraterm.si/e-trgovina', latitude=46.238569419282335, longitude=14.345819046096723)\n",
      "Distributor(title='Kerasil Oy', street_number=None, street_name=None, city='Nurmijarvi', state_province=None, country='Finland', postal_code='01900', website=None, latitude=60.4646558, longitude=24.7945989)\n",
      "Distributor(title='Keramix Handels GMBH', street_number=None, street_name=None, city='Korneuburg', state_province=None, country='Austria', postal_code='2100', website='https://keramix.eu', latitude=48.34472, longitude=16.3314901)\n",
      "Distributor(title='Keramikfryd ApS', street_number=None, street_name='Praestegaards Alle 51', city='Broenshoej', state_province=None, country='Denmark', postal_code='2700', website='https://www.keramikfryd.dk/', latitude=55.82470136564219, longitude=12.446213137816171)\n",
      "Distributor(title='Keramikcenter-Art4Fun', street_number=None, street_name=None, city='Rydeback', state_province=None, country='Sweden', postal_code='257 30', website='https://art4fun.se', latitude=55.961809, longitude=12.787941)\n",
      "Distributor(title='Keramikbedarf Ing. Tripp & Partner OG', street_number=None, street_name='Hausmannstättener Straße 33', city='Fernitz b. Graz', state_province=None, country='Austria', postal_code='8072', website='http://www.keramikbedarf.net/', latitude=46.97726843510564, longitude=15.50162845405912)\n",
      "Distributor(title='Keramikbedarf Ing. Skokan GmbH.', street_number=None, street_name='Rauchgasse 33', city='Vienna', state_province=None, country='Austria', postal_code='1120', website='https://www.skokan.at/48.17828605868169, 16.33179218341015', latitude=48.17828605868169, longitude=16.33179218341015)\n",
      "Distributor(title='Keramika do skol', street_number=None, street_name='Cs. armady 676', city='Chudim', state_province=None, country='Czech Republic', postal_code='53701', website='https://www.keramikadoskol.cz/eshop/', latitude=49.9464, longitude=15.78989)\n",
      "Distributor(title='Keramik-Kraft – Zentrale', street_number=None, street_name='Industriestr. 28', city='Leinburg', state_province=None, country='Germany', postal_code='91227', website='https://www.keramik-kraft.com/', latitude=49.61032445791115, longitude=11.292597573235046)\n",
      "Distributor(title='Keramik-Kraft – Stuttgart', street_number=None, street_name='May-Eyth-Str. 33', city='Nürtingen', state_province=None, country='Germany', postal_code='72622', website='https://www.keramik-kraft.com/', latitude=52.364789465847146, longitude=10.652676020273377)\n",
      "Distributor(title='Keramik-Kraft – Österreich', street_number=None, street_name='Energiestraße 10', city='Bad Vöslau', state_province=None, country='Austria', postal_code='2540', website='https://www.keramik-kraft.com/', latitude=48.31012787770754, longitude=16.27346832576265)\n",
      "Distributor(title='Keramik-Kraft – Münster', street_number=None, street_name='Rudolf-Diesel Str.57', city='Münster', state_province=None, country='Germany', postal_code='48157', website='https://www.keramik-kraft.com/', latitude=51.9877074006877, longitude=7.66659298676536)\n",
      "Distributor(title='Keramik-Kraft – Kassel-Göttingen', street_number=None, street_name='Bahnhofstraße 3', city='Hardegsen', state_province=None, country='Germany', postal_code='37181', website='https://www.keramik-kraft.com/', latitude=51.74327893472171, longitude=9.740810800296753)\n",
      "Distributor(title='Keramik-Kraft – Hannover-Braunschweig', street_number=None, street_name='Im Moorbusche 10', city='Cremlingen', state_province=None, country='Germany', postal_code='38162', website='https://www.keramik-kraft.com/', latitude=52.41172473087784, longitude=10.630703364370323)\n",
      "Distributor(title='Keramik-Kraft – Hamburg', street_number=None, street_name='Moorburger Elbdeich 263', city='Hamburg', state_province=None, country='Germany', postal_code='21079', website='https://www.keramik-kraft.com/', latitude=53.65367946407714, longitude=9.971523687278788)\n",
      "Distributor(title='Keramik-Kraft – Frankfurt', street_number=None, street_name='Schießstraße 65', city='Bruckköbel', state_province=None, country='Germany', postal_code='63486', website='https://www.keramik-kraft.com/', latitude=50.3748479729601, longitude=8.990494751551491)\n",
      "Distributor(title='Keramik-Kraft – Chiemgau', street_number=None, street_name='Heutauer Straße 15', city='Siegsdorf', state_province=None, country='Germany', postal_code='83313', website='https://www.keramik-kraft.com/', latitude=48.031393347670985, longitude=12.75831682488311)\n",
      "Distributor(title='Keramik-Kraft – Aachen', street_number=None, street_name='Neuhausstraße 4', city='Aachen', state_province=None, country='Germany', postal_code='52078', website='https://www.keramik-kraft.com/', latitude=50.9076126198071, longitude=6.15378037412152)\n",
      "Distributor(title='Keramické Centrum', street_number=None, street_name='Kolbenova 24', city='Praha', state_province=None, country='Czech Republic', postal_code='190 00', website=None, latitude=50.1461540759934, longitude=14.504077628669481)\n",
      "Distributor(title='Kentucky Mudworks, Llc.', street_number=None, street_name=None, city='Lexington', state_province='Kentucky', country='United States', postal_code='40505', website='https://kymudworks.com', latitude=38.05414, longitude=-84.4540213)\n",
      "Distributor(title='Keane Ceramics', street_number='177', street_name='Debenham Road', city='Somersby', state_province='NSW', country='Australia', postal_code='2250', website='https://keaneceramics.com.au/', latitude=-33.42012, longitude=151.30689)\n",
      "Distributor(title='Karla Von Ceramics', street_number=None, street_name=None, city='Rockford', state_province='Michigan', country='United States', postal_code='49341', website='http://www.karlavonceramics.com/', latitude=43.117458, longitude=-85.532959)\n",
      "Distributor(title='Kamel Potteries', street_number='34', street_name='Ashfield Avenue', city='Durban, KZN', state_province=None, country='South Africa', postal_code='4001', website=None, latitude=-29.80774, longitude=31.00134)\n",
      "Distributor(title='Jackpot Pottery', street_number='220 North State Road', street_name='Inside Common Ground Warehouse', city='Medina', state_province='Ohio', country='United States', postal_code='44256', website='https://www.jack-potpottery.com/', latitude=41.141457, longitude=-81.878138)\n",
      "Distributor(title='Izoref (Head Office)', street_number=None, street_name=None, city='Atasehir', state_province='Istanbul', country='Turkey', postal_code='34888', website='https://www.izoref.com', latitude=40.97987, longitude=29.16569)\n",
      "Distributor(title='Izoref (Ankara Branch)', street_number='Ferhatpasa Mah Anadolu Cad No:55', street_name=None, city='Ostim', state_province='Ankara', country='Turkey', postal_code='06374', website='https://www.izoref.com', latitude=39.98321, longitude=32.7501)\n",
      "Distributor(title='Hyatt’s Graphic Supply Co.', street_number='1941', street_name='Elmwood Ave', city='Buffalo', state_province='New York', country='United States', postal_code='14207', website='https://www.hyatts.com/', latitude=42.950378, longitude=-78.876862)\n",
      "Distributor(title='Hus-10 Pottery Inc.', street_number='167-0022 3-15-8', street_name='Shimoigusa', city='Suginami-ku', state_province='Tokyo', country='Japan', postal_code=None, website='http://www.hus-10.com', latitude=35.700098, longitude=139.766845)\n",
      "Distributor(title='House Of Clay, Inc.', street_number=None, street_name=None, city='Oklahoma City', state_province='Oklahoma', country='United States', postal_code='73118', website='https://thehouseofclay.com', latitude=35.5220651, longitude=-97.5301397)\n",
      "Distributor(title='Hot Clay', street_number='3', street_name='Havyat Business Park', city='Havyatt Rd, Wrington', state_province='Bristol', country='United Kingdom', postal_code='BS40 5PA', website='https://www.hot-clay.com/', latitude=51.35232, longitude=-2.75838)\n",
      "Distributor(title='Hobi Seramik', street_number=None, street_name=None, city='Izmir', state_province=None, country='Turkey', postal_code='35030', website='https://www.hobiseramik.com', latitude=38.423733, longitude=27.142826)\n",
      "Distributor(title='Hobby World LLC', street_number='3243', street_name='Al Maadi St', city='Abdul Linjawi', state_province=None, country='Saudi Arabia', postal_code='21432', website='https://hwaiat.com', latitude=21.5154, longitude=39.16596)\n",
      "Distributor(title='Hobby Hut Ceramics', street_number=None, street_name=None, city='Canon City', state_province='Colorado', country='United States', postal_code='81215', website='https://hobbyhutceramics.com', latitude=38.4316757, longitude=-105.2459919)\n",
      "Distributor(title='Hobby Ceramicraft Limited', street_number=None, street_name=None, city='Grazeley', state_province='Berkshire', country='United Kingdom', postal_code='RG7 1JF', website='https://hobbyceramicraft.co.uk', latitude=51.3905507, longitude=-1.0081868)\n",
      "Distributor(title='Hilliard United Art & Education Sup.Co.', street_number=None, street_name=None, city='Hilliard', state_province='Ohio', country='United States', postal_code='43026', website='https://www.unitednow.com', latitude=40.04033795311261, longitude=-83.1091327530026)\n",
      "Distributor(title='Highwater Clays Of Florida', street_number=None, street_name=None, city='Clearwater', state_province='Florida', country='United States', postal_code='33762', website='https://highwaterclays.com', latitude=27.9006925, longitude=-82.6861446)\n",
      "Distributor(title='HEHO sklep dla ceramika', street_number=None, street_name='Na szancach 6', city='Poznan', state_province=None, country='Poland', postal_code='61-663', website='https://sklep.heho.pl/', latitude=52.42451439484282, longitude=16.94145588492933)\n",
      "Distributor(title='Hearty Ceramic Supply Co.', street_number=None, street_name=None, city='Tai Kok Tsui', state_province=None, country='Hong Kong', postal_code='999077', website='https://heartyceramic.com', latitude=22.3198474, longitude=114.1620857)\n",
      "Distributor(title='Glaser Ceramics Inc.', street_number=None, street_name=None, city='Lincoln', state_province='Nebraska', country='United States', postal_code='68521', website='https://glaserceramics.com', latitude=40.8541169, longitude=-96.7172907)\n",
      "Distributor(title='Georgies Ceramic & Clay Co.', street_number=None, street_name=None, city='Portland', state_province='Oregon', country='United States', postal_code='97211', website='https://georgies.com', latitude=45.5767359, longitude=-122.6386723)\n",
      "Distributor(title='Gem Ceramic Mold Co.', street_number=None, street_name=None, city='Denver', state_province='Pennsylvania', country='United States', postal_code='17517', website='https://gemceramic.com', latitude=40.2331483, longitude=-76.1371683)\n",
      "Distributor(title='Fuljoy Co., LTD.', street_number=None, street_name=None, city='Taipei', state_province=None, country='Taiwan', postal_code='10542', website='https://frema.com.tw', latitude=25.0329694, longitude=121.5654177)\n",
      "Distributor(title='Free Form Clay & Supply', street_number=None, street_name=None, city='National City', state_province='California', country='United States', postal_code='91950', website='https://freeformclay.com', latitude=32.6721599, longitude=-117.0970596)\n",
      "Distributor(title='Fort Wayne United Art & Education Sup.Co.', street_number=None, street_name=None, city='Fort Wayne', state_province='Indiana', country='United States', postal_code='46809', website='https://www.unitednow.com', latitude=41.0005907, longitude=-85.2101269)\n",
      "Distributor(title='Florida Clay Art', street_number=None, street_name=None, city='Sanford', state_province='Florida', country='United States', postal_code='32773', website='https://flclay.com', latitude=28.7405957, longitude=-81.2739073)\n",
      "Distributor(title='Fine Things Ltda.', street_number=None, street_name=None, city='Santiago', state_province=None, country='Chile', postal_code='8320000', website='https://www.finethings.cl/', latitude=-33.4488897, longitude=-70.6692655)\n",
      "Distributor(title='Fat Cat Pottery (Seaside)', street_number='1641', street_name='Seaside Rd SW', city='Ocean Isle Beach', state_province='North Carolina', country='United States', postal_code='28469', website='https://www.fatcatpottery.com', latitude=33.89939, longitude=-78.48793)\n",
      "Distributor(title='Fat Cat Pottery', street_number='2500', street_name='Blue Clay Rd', city='Wilmington', state_province='North Carolina', country='United States', postal_code='28405', website='https://www.fatcatpottery.com', latitude=34.28407, longitude=-77.91309)\n",
      "Distributor(title='Evans Ceramic Supply', street_number=None, street_name=None, city='Wichita', state_province='Kansas', country='United States', postal_code='67211', website='https://evansceramics.com', latitude=37.67231, longitude=-97.3138554)\n",
      "Distributor(title='Eurokermiki P.C.', street_number=None, street_name='Anatolikis Thrakis 4', city='Kalochori', state_province=None, country='Greece', postal_code='57009', website='http://www.eurokeramiki.gr/', latitude=40.64494310587962, longitude=22.867968925030137)\n",
      "Distributor(title='Esmaltes y colorantes de la Rambla, S.L.', street_number=None, street_name='Ronda 76', city='La Rambla', state_province=None, country='Spain', postal_code='14540', website='http://www.esmaltycolor.com/', latitude=37.60464185367193, longitude=-4.741429237480292)\n",
      "Distributor(title='Esmaltes para Ceramica', street_number='52786', street_name='Naucalpan de Juárez', city='San Fernando', state_province='Mexico City', country='Mexico', postal_code='11860', website='https://arteespacio.mx/', latitude=19.37987, longitude=-99.24725)\n",
      "Distributor(title='Eskiss/Coco Cadeaux SARL', street_number='183', street_name='Boulevard Pointe des Nègres', city='Fort-de-France', state_province='Martinique', country='France', postal_code='97200', website='https://www.eskiss972.com', latitude=14.60634, longitude=-61.08707)\n",
      "Distributor(title='Engels, Merkel & CIA', street_number='AV. Naciones Unidas 1820', street_name='Chacra Rios Norte', city='Lima', state_province='Lima', country='Peru', postal_code='15081', website='https://www.engelsmerkel.com.pe', latitude=-12.05566, longitude=-77.06185)\n",
      "Distributor(title='DVOE Ceramics', street_number='3A Usta Alima Street', street_name=None, city='Tashkent', state_province=None, country='Uzbekistan', postal_code='100128', website='https://www.instagram.com/dvoeceramics/', latitude=41.26465, longitude=69.21627)\n",
      "Distributor(title='Duygu Seramik', street_number='Barbaros mah', street_name=None, city='Kavaklıdere', state_province='Ankara', country='Turkey', postal_code='06680', website='https://www.duyguseramikboya.com', latitude=39.90088, longitude=32.85818)\n",
      "Distributor(title='Duygu Seramik', street_number='Camikebir mah', street_name='Izmir', city='Seferihisar', state_province='Izmir', country='Turkey', postal_code='35460', website='https://www.duyguseramikboya.com', latitude=38.22639, longitude=26.82799)\n",
      "Distributor(title='Dong Yong Ceramics', street_number=None, street_name=None, city='26, Dojayesul-ro 6beon-gil, Sindun-myeon', state_province='Icheon-si, Gyeonggi-do', country='South Korea', postal_code=None, website='https://doyoceramics.co.kr', latitude=37.29652, longitude=127.39001)\n",
      "Distributor(title='Dogwood Ceramic Supply Inc', street_number=None, street_name=None, city='Gulfport', state_province='Mississippi', country='United States', postal_code='39503', website='https://www.dogwoodceramics.com', latitude=30.45813, longitude=-89.106)\n",
      "Distributor(title='Distribuidora Glanaf Ltda', street_number=None, street_name='Calle 71 #12-37', city='Bogotá', state_province=None, country='Colombia', postal_code='110231', website='http://arteyhobby.com/', latitude=4.65703, longitude=-74.06079)\n",
      "Distributor(title='DiamondCore Tools', street_number='680', street_name='W. Bradley Ave', city='El Cajon', state_province='California', country='United States', postal_code='92020', website='https://diamondcoretools.com/', latitude=532.81729, longitude=-116.96981)\n",
      "Distributor(title='De Pottenbakster bv', street_number=None, street_name='Jellinghausstraat 10', city='5048 AZ Tilburg', state_province=None, country='Netherlands', postal_code=None, website='https://www.keramiekenglazuur.nl', latitude=51.59168, longitude=5.05036)\n",
      "Distributor(title='Dayton United Art & Education Sup.Co.', street_number=None, street_name=None, city='Centerville', state_province='Ohio', country='United States', postal_code='45459', website='https://www.unitednow.com', latitude=39.644173214723104, longitude=-84.18861339846937)\n",
      "Distributor(title='Davens Ceramic Center', street_number=None, street_name=None, city='Chamblee', state_province='Georgia', country='United States', postal_code='30341', website='https://davensceramiccenter.com', latitude=33.8992049, longitude=-84.3016021)\n",
      "Distributor(title='Dakota Potters Supply, LLC.', street_number=None, street_name=None, city='Sioux Falls', state_province='South Dakota', country='United States', postal_code='57104', website='https://dakotapotters.com', latitude=43.6032799, longitude=-96.7172907)\n",
      "Distributor(title='D&H Ceramics', street_number='6309 Grand Ave', street_name=None, city='Duluth', state_province='Minnesota', country='United States', postal_code=None, website='https://www.dandhceramics.com', latitude=46.733118, longitude=-92.177833)\n",
      "Distributor(title='D.B.I Pottery Supplies', street_number=None, street_name=None, city='Co. Cork', state_province=None, country='Ireland', postal_code='T12 PPN2', website='http://www.dbipottery.com/', latitude=52.22616010426224, longitude=-8.988040943818188)\n",
      "Distributor(title='Cromartie Hobbycraft', street_number=None, street_name='Park Hall Road, Longton', city='Stoke-On-Trent, Staffordshire', state_province=None, country='United Kingdom', postal_code='ST3 5AY', website='https://www.cromartiehobbycraft.co.uk', latitude=52.99221, longitude=-2.09883)\n",
      "Distributor(title='Creative Crafts, Inc.', street_number='9370', street_name='Florida Blvd', city='Baton Rouge', state_province='Louisiana', country='United States', postal_code='70815', website='https://http://www.creative-crafts.com', latitude=30.45438, longitude=-91.08452)\n",
      "Distributor(title='Creative Ceramics and Glass', street_number=None, street_name=None, city='Santa Rosa', state_province='California', country='United States', postal_code='95403', website='https://creativeceramicsandglass.com', latitude=38.4739555, longitude=-122.7520139)\n",
      "Distributor(title='Creative Arts Center', street_number=None, street_name=None, city='Brewer', state_province='Maine', country='United States', postal_code='4412', website='https://www.creativeartscenter.net', latitude=44.78725, longitude=-68.75418)\n",
      "Distributor(title='Creativa Arte & Hobby', street_number='928', street_name='Gabriel René Moreno', city='La Paz', state_province=None, country='Bolivia', postal_code='2826', website='https://www.facebook.com/Creativa.arte.y.hobby', latitude=-16.54315, longitude=-68.07999)\n",
      "Distributor(title='Creakor Bvba', street_number=None, street_name=None, city='Kortemark', state_province=None, country='Belguim', postal_code='8610', website='https://creakor.com', latitude=51.0258933, longitude=3.0076914)\n",
      "Distributor(title='Country Love Crafts', street_number='10', street_name='Curzon Road', city='Chilton Industrial Estate', state_province='Sudbury', country='United Kingdom', postal_code='CO10 2XW', website='http://www.countrylovecrafts.com', latitude=52.04138, longitude=0.74943)\n",
      "Distributor(title='Cornell Studio Supplies', street_number=None, street_name=None, city='Dayton', state_province='Ohio', country='United States', postal_code='45414', website='https://cornellstudiosupply.com/', latitude=39.851555750344026, longitude=-84.19841063296882)\n",
      "Distributor(title='Corby Kilns', street_number=None, street_name=None, city='Kettering', state_province='Northamptonshire', country='United Kingdom', postal_code='NN16 8PU', website='http://www.corbykilns.co.uk/', latitude=52.49156677222209, longitude=-0.7407274239820152)\n",
      "Distributor(title='Continental Clay Company – Minnesota', street_number='1101', street_name='Stinson Blvd NE', city='Minneapolis', state_province='Minnesota', country='United States', postal_code='55413', website='https://continentalclay.com', latitude=44.99529, longitude=-93.22692)\n",
      "Distributor(title='Continental Clay Company – Colorado', street_number='5303', street_name='East 47th Avenue', city='Denver', state_province='Colorado', country='United States', postal_code='80216', website='https://continentalclay.com', latitude=39.78146, longitude=-105.92645)\n",
      "Distributor(title='Columbus Clay', street_number=None, street_name=None, city='Columbus', state_province='Ohio', country='United States', postal_code='43212', website='https://columbusclay.com', latitude=39.9826396, longitude=-83.0415078)\n",
      "Distributor(title='CM Potteramics LLC', street_number='826 15th Ave', street_name=None, city='East Moline', state_province='Illinois', country='United States', postal_code='61244', website=None, latitude=41.515853, longitude=-88.441628)\n",
      "Distributor(title='ClayStation', street_number='10, Temple Tree Road, S.T. Bed Ext.', street_name=None, city=None, state_province='Bangalore, KN', country='India', postal_code='560047', website='https://online.claystation.in/', latitude=12.93486, longitude=77.63507)\n",
      "Distributor(title='Clayscapes Pottery, Inc.', street_number=None, street_name=None, city='Syracuse', state_province='New York', country='United States', postal_code='13204', website='https://clayscapespottery.com', latitude=43.0513668, longitude=-76.1841701)\n",
      "Distributor(title='Clay-King', street_number=None, street_name=None, city='Spartanburg', state_province='South Carolina', country='United States', postal_code='29307', website='https://clay-king.com', latitude=35.0140988, longitude=-81.8720881)\n",
      "Distributor(title='Clay Planet', street_number=None, street_name=None, city='Santa Clara', state_province='California', country='United States', postal_code='95050', website='https://shop.clay-planet.com/?gclid=Cj0KCQjwna2FBhDPARIsACAEc_V0nZ-aDFCB8TY9tonLt8o3B3ZKEiTbtJuoZCWfG4G3rrC17RO8ZqUaAq0DEALw_wcB', latitude=37.3708853, longitude=-122.0025719)\n",
      "Distributor(title='Clay People, Inc', street_number='623', street_name='South 32nd Street', city='Richmond', state_province='California', country='United States', postal_code='94804', website='https://claypeople.net/', latitude=37.92334, longitude=-122.33857)\n",
      "Distributor(title='Clay Arts Vegas, LLC.', street_number=None, street_name=None, city='Las Vegas', state_province='Nevada', country='United States', postal_code='89102', website='https://clayartsvegas.com', latitude=36.1462673, longitude=-115.1829873)\n",
      "Distributor(title='Clay Art Center', street_number=None, street_name=None, city='Tacoma', state_province='Washington', country='United States', postal_code='98404', website='https://clayartcenter.net', latitude=47.2111983, longitude=-122.4144869)\n",
      "Distributor(title='Clay and Pottery Supplies', street_number='2985 Haldimand Rd 9', street_name=None, city='York', state_province=None, country='Canada', postal_code='ON N0A 1R0', website='https://www.clayandpotterysupplies.com', latitude=43.051861, longitude=-79.754356)\n",
      "Distributor(title='Claudia’s Mud Hut', street_number=None, street_name=None, city='Pensacola', state_province='Florida', country='United States', postal_code='32506', website='https://claudiasmudhut.wixsite.com/mysite', latitude=30.3979028, longitude=-87.3711477)\n",
      "Distributor(title='Chesapeake Ceramics', street_number=None, street_name=None, city='Baltimore', state_province='Maryland', country='United States', postal_code='21227', website='https://chesapeakeceramics.com', latitude=39.2396095, longitude=-76.6816962)\n",
      "Distributor(title='Ceredel', street_number=None, street_name=None, city=None, state_province='Panazol', country='France', postal_code=None, website='https://www.ceradel.fr/fr/', latitude=45.84197, longitude=1.29271)\n",
      "Distributor(title='Ceraterre Distribution', street_number='40 Route De Mussidan Lieu Dit', street_name=None, city='Engauthier', state_province='Ribérac', country='France', postal_code='24600', website='https://http://www.ceraplus.com/', latitude=45.22838, longitude=0.35755)\n",
      "Distributor(title='Ceramics Canada', street_number=None, street_name=None, city='Calgary', state_province='Alberta', country='Canada', postal_code='T1X 0N2', website='https://ceramicscanada.net', latitude=51.0499949, longitude=-113.9913054)\n",
      "Distributor(title='CeramiCraft', street_number=None, street_name=None, city='Bibra Lake', state_province='Western Australia', country='Australia', postal_code='6163', website='https://ceramicraft.com.au', latitude=-32.062351, longitude=115.780899)\n",
      "Distributor(title='Ceramicart S.A.', street_number='Seminario 540', street_name=None, city='Providencia Santiago', state_province=None, country='Chile', postal_code=None, website='https://www.ceramicart.cl/documents/4.html', latitude=-33.44781, longitude=-70.62786)\n",
      "Distributor(title='Ceramicarma CIA. LTDA', street_number=None, street_name=None, city='Quito', state_province=None, country='Ecuador', postal_code='170513', website='https://ceramicarma.com/', latitude=-0.12913, longitude=-78.47637)\n",
      "Distributor(title='Ceramica, LLC.', street_number='8245', street_name='Chapel Hill Rd', city='Cary', state_province='North Carolina', country='United States', postal_code='27513', website='https://www.ceramicasupply.com', latitude=35.791793, longitude=-78.774384)\n",
      "Distributor(title='Ceramica Collet, S.A.', street_number=None, street_name=None, city='Esparreguera', state_province=None, country='Spain', postal_code='8292', website='https://www.sio-2.com/es/content/26-tienda-online', latitude=41.53907, longitude=1.87066)\n",
      "Distributor(title='Ceramic Supply, DMV, LLC', street_number=None, street_name=None, city='Baltimore', state_province='Maryland', country='United States', postal_code='21209', website='https://clayworkssupplies.com', latitude=39.370859, longitude=-76.6701475)\n",
      "Distributor(title='Ceramic Supply, DMV, LLC', street_number='5704-C', street_name='General Washington Drive', city='Alexandria', state_province='Virginia', country='United States', postal_code='22312', website='https://clayworkssupplies.com', latitude=38.79763, longitude=-77.16656)\n",
      "Distributor(title='Ceramic Supply Pittsburgh', street_number=None, street_name=None, city='Pittsburgh', state_province='Pennsylvania', country='United States', postal_code='15242', website='https://ceramicsupplypittsburgh.com', latitude=40.4313473, longitude=-80.0505401)\n",
      "Distributor(title='Ceramic Supply Inc.', street_number=None, street_name=None, city='Lodi', state_province='New Jersey', country='United States', postal_code='17644', website='https://ceramic-supply-inc.myshopify.com/', latitude=40.8823215, longitude=-74.0831971)\n",
      "Distributor(title='Ceramic Supply Chicago Inc.', street_number=None, street_name=None, city='Elk Grove Village', state_province='Illinois', country='United States', postal_code='60007', website='https://ceramicsupplychicago.com', latitude=42.0039178, longitude=-87.9703461)\n",
      "Distributor(title='Ceramic Store of Houston', street_number=None, street_name=None, city='Houston', state_province='Texas', country='United States', postal_code='77008', website='https://ceramicstoreinc.com', latitude=29.7995924, longitude=-95.4201377)\n",
      "Distributor(title='Ceramic Shop LLC.', street_number=None, street_name=None, city='Norristown', state_province='Pennsylvania', country='United States', postal_code='19401', website='https://theceramicshop.com', latitude=40.1270723, longitude=-75.3353875)\n",
      "Distributor(title='Ceramic Place, Trinidad', street_number=None, street_name=None, city='Trinidad', state_province=None, country='West Indies', postal_code='150110', website='https://theceramicplace.net', latitude=10.691803, longitude=-61.222503)\n",
      "Distributor(title='Ceramic Cottage', street_number='748', street_name='South Wheeling Ave', city='Tulsa', state_province='Oklahoma', country='United States', postal_code='74104', website='https://ceramic-cottage.com/', latitude=36.149893, longitude=95.964894)\n",
      "Distributor(title='Ceramic Arts & Pottery Supply', street_number=None, street_name=None, city='Burlington', state_province='Ontario', country='Canada', postal_code='L7M 1A1', website='https://ceramicarts.com', latitude=43.3589149, longitude=-79.8097128)\n",
      "Distributor(title='Ceramic Art Store', street_number=None, street_name=None, city='Istanbul', state_province=None, country='Turkey', postal_code='34000', website='https://ceramicartstore.com', latitude=41.0082376, longitude=28.9783589)\n",
      "Distributor(title='Ceram Decor 81', street_number=None, street_name='660 Route de Montastruc', city='Saint Agnan', state_province=None, country='France', postal_code='81500', website='http://www.ceram-decor.fr/', latitude=43.73065609132268, longitude=1.7298086543540832)\n",
      "Distributor(title='Ceram Decor 69', street_number=None, street_name='58 rue des Sources   Bâtiment B', city='Saint Genis Laval', state_province=None, country='France', postal_code='69230', website='http://www.ceram-decor.fr/', latitude=45.89168491557283, longitude=4.793588173319382)\n",
      "Distributor(title='Ceram Decor 25', street_number=None, street_name='Rue de terre rouge   ZA de terre rouge, bâtiment 9', city='Roche Lez Beaupré', state_province=None, country='France', postal_code='81500', website=None, latitude=47.316628686152654, longitude=6.097537443242702)\n",
      "Distributor(title='Ceradel Toulouse', street_number='22-24', street_name='Boulevard Thibaud', city='Toulouse', state_province=None, country='France', postal_code='31100', website='http://www.ceradel.fr/', latitude=43.55187270721698, longitude=1.4020280539256729)\n",
      "Distributor(title='Ceradel Lyon', street_number='8', street_name='rue Jean Élysée Dupuy', city=\"Champagne-au-Mont-d'Or\", state_province=None, country='France', postal_code='69410', website=None, latitude=45.801592239882, longitude=4.776985382828371)\n",
      "Distributor(title='Ceradel Aubervilliers', street_number='2', street_name='rue de la Motte', city='Auvilliers', state_province=None, country='France', postal_code='93300', website='http://www.ceradel.fr/', latitude=48.90844910851326, longitude=2.395065013609414)\n",
      "Distributor(title='Ceradel Antibes', street_number='370', street_name='rue des Cistes', city='Antibes', state_province=None, country='France', postal_code='06600', website='http://www.ceradel.fr/', latitude=43.60967348310645, longitude=7.073837025091896)\n",
      "Distributor(title='CCG Trading', street_number='2/25', street_name='Triton Drive', city='Rosedale', state_province='Auckland', country='New Zealand', postal_code='632', website='https://www.ccg.co.nz/craft', latitude=-36.73905, longitude=174.72159)\n",
      "Distributor(title='Casa Miriam Sa De Cv', street_number=None, street_name='Av. Sierra Nevada 619', city='San Salvador', state_province=None, country='El Salvador', postal_code='3222', website=None, latitude=13.65725, longitude=-89.16955)\n",
      "Distributor(title='Carolina Clay Connection, LLC.', street_number=None, street_name=None, city='Charlotte', state_province='North Carolina', country='United States', postal_code='28134', website='https://carolinaclay.com', latitude=35.2418, longitude=-80.8391)\n",
      "Distributor(title='C4C-Keramikstudio Annette.e.k', street_number=None, street_name=None, city='Leinburg', state_province=None, country='Germany', postal_code='91227', website=None, latitude=49.45588, longitude=11.28472)\n",
      "Distributor(title='Brookvale Ceramics', street_number=None, street_name=None, city='Sydney', state_province='New South Wales', country='Australia', postal_code='2100', website='https://brookvaleceramics.com.au', latitude=-33.7645979, longitude=151.2627078)\n",
      "Distributor(title='Brickyard Ceramics & Crafts', street_number=None, street_name=None, city='Indianapolis', state_province='Indiana', country='United States', postal_code='46254', website='https://brickyardceramics.com', latitude=39.8494377, longitude=-86.2666463)\n",
      "Distributor(title='Breezecolour', street_number=None, street_name=None, city='St. Petersburg, Novocherkassky', state_province=None, country='Russia', postal_code='187015', website='https://breezecolor.ru/', latitude=59.91688, longitude=30.31302)\n",
      "Distributor(title='Bracker’s Good Earth Clays', street_number=None, street_name=None, city='Lawrence', state_province='Kansas', country='United States', postal_code='66044', website='https://www.brackers.com/', latitude=38.951904, longitude=-95.2649576)\n",
      "Distributor(title='Borkheider Werkstatt für Keramik & Töpfern', street_number=None, street_name='In den langen Stücken 12', city='Borkheide', state_province=None, country='Germany', postal_code='14822', website='https://www.keramik-toepfern.de/', latitude=52.21614759373734, longitude=12.857464370175745)\n",
      "Distributor(title='Bluematchbox Potters Supplies', street_number='9XRV+38', street_name=None, city='Reading', state_province=None, country='United Kingdom', postal_code=None, website=None, latitude=51.390265080619336, longitude=-1.0067582912232784)\n",
      "Distributor(title='Blick Art Materials', street_number=None, street_name=None, city='Tempe', state_province='Arizona', country='United States', postal_code='85288', website='https://www.dickblick.com/', latitude=33.42315876, longitude=-111.9247198)\n",
      "Distributor(title='Blick Art Materials', street_number=None, street_name=None, city='Fort Lauderdale', state_province='Florida', country='United States', postal_code='33334', website='https://www.dickblick.com/', latitude=26.16741933, longitude=-80.13302897)\n",
      "Distributor(title='Blick Art Materials', street_number=None, street_name=None, city='Sacramento', state_province='California', country='United States', postal_code='95825', website='https://www.dickblick.com/', latitude=38.58246716, longitude=-121.4159753)\n",
      "Distributor(title='Blick Art Materials', street_number=None, street_name=None, city='Milwaukee', state_province='Wisconsin', country='United States', postal_code='53202', website='https://www.dickblick.com/', latitude=43.03180742, longitude=-87.90811807)\n",
      "Distributor(title='Blick Art Materials', street_number=None, street_name=None, city='Santa Monica', state_province='California', country='United States', postal_code='90405', website='https://www.dickblick.com/', latitude=34.00676168, longitude=-118.4763142)\n",
      "Distributor(title='Blick Art Materials', street_number=None, street_name=None, city='Brooklyn', state_province='New York', country='United States', postal_code='11205', website='https://www.dickblick.com/', latitude=40.69361557, longitude=-73.96336482)\n",
      "Distributor(title='Blick Art Materials', street_number=None, street_name=None, city='Salt Lake City', state_province='Utah', country='United States', postal_code='84106', website='https://www.dickblick.com/', latitude=40.72585861, longitude=-111.8616914)\n",
      "Distributor(title='Blick Art Materials', street_number=None, street_name=None, city='Beaverton', state_province='Oregon', country='United States', postal_code='97005', website='https://www.dickblick.com/', latitude=45.50031547, longitude=-122.8050452)\n",
      "Distributor(title='Blick Art Materials', street_number=None, street_name=None, city='Philadelphia', state_province='Pennsylvania', country='United States', postal_code='19107', website='https://www.dickblick.com/', latitude=39.95081891, longitude=-75.1630789)\n",
      "Distributor(title='Blick Art Materials', street_number=None, street_name=None, city='Omaha Dodge', state_province='Nebraska', country='United States', postal_code='68114', website='https://www.dickblick.com/', latitude=41.2589712, longitude=-96.03666344)\n",
      "Distributor(title='Blick Art Materials', street_number=None, street_name=None, city='Glendale', state_province='Arizona', country='United States', postal_code='85308', website='https://www.dickblick.com/', latitude=33.64658721, longitude=-112.2216547)\n",
      "Distributor(title='Blick Art Materials', street_number=None, street_name=None, city='Chicago', state_province='Illinois', country='United States', postal_code='60603', website='https://www.dickblick.com/', latitude=41.88478897, longitude=-87.62854532)\n",
      "Distributor(title='Blick Art Materials', street_number=None, street_name=None, city='Roseville', state_province='Minnesota', country='United States', postal_code='55113', website='https://www.dickblick.com/', latitude=45.01244104, longitude=-93.17802432)\n",
      "Distributor(title='Blick Art Materials', street_number=None, street_name=None, city='Allentown', state_province='Pennsylvania', country='United States', postal_code='18103', website='https://www.dickblick.com/', latitude=40.55613393, longitude=-75.49176015)\n",
      "Distributor(title='Blick Art Materials', street_number=None, street_name=None, city='Columbus', state_province='Ohio', country='United States', postal_code='43235', website='https://www.dickblick.com/', latitude=40.10089159, longitude=-83.09006119)\n",
      "Distributor(title='Blick Art Materials', street_number=None, street_name=None, city='Iowa City', state_province='Iowa', country='United States', postal_code='52240', website='https://www.dickblick.com/', latitude=41.65883046, longitude=-91.53503585)\n",
      "Distributor(title='Blick Art Materials', street_number=None, street_name=None, city='Rosewell', state_province='Georgia', country='United States', postal_code='30075', website='https://www.dickblick.com/', latitude=34.06297885, longitude=-84.39940357)\n",
      "Distributor(title='Blick Art Materials', street_number=None, street_name=None, city='Los Angeles', state_province='California', country='United States', postal_code='90025', website='https://www.dickblick.com/', latitude=34.04564243, longitude=-118.4529897)\n",
      "Distributor(title='Blick Art Materials', street_number=None, street_name=None, city='Wheaton', state_province='Illinois', country='United States', postal_code='60187', website='https://www.dickblick.com/', latitude=41.83087388, longitude=-88.10110905)\n",
      "Distributor(title='Blick Art Materials', street_number=None, street_name=None, city='Cleveland Heights', state_province='Ohio', country='United States', postal_code='44106', website='https://www.dickblick.com/', latitude=41.51115025, longitude=-81.58073566)\n",
      "Distributor(title='Blick Art Materials', street_number=None, street_name=None, city='Edina', state_province='Minnesota', country='United States', postal_code='55435', website='https://www.dickblick.com/', latitude=44.87040055, longitude=-93.3284675)\n",
      "Distributor(title='Blick Art Materials', street_number=None, street_name=None, city='Seattle', state_province='Washington', country='United States', postal_code='98122', website='https://www.dickblick.com/', latitude=47.61560149, longitude=-122.3207004)\n",
      "Distributor(title='Blick Art Materials', street_number=None, street_name=None, city='Galesburg', state_province='Illinois', country='United States', postal_code='61401', website='https://www.dickblick.com/', latitude=None, longitude=None)\n",
      "Distributor(title='Blick Art Materials', street_number=None, street_name=None, city='Atlanta', state_province='Georgia', country='United States', postal_code='30309', website='https://www.dickblick.com/', latitude=33.77890815, longitude=-84.3844186)\n",
      "Distributor(title='Blick Art Materials', street_number=None, street_name=None, city='Detroit', state_province='Michigan', country='United States', postal_code='48201', website='https://www.dickblick.com/', latitude=42.35381581, longitude=-83.06266027)\n",
      "Distributor(title='Blick Art Materials', street_number=None, street_name=None, city='Kansas', state_province='Missouri', country='United States', postal_code='64111', website='https://www.dickblick.com/', latitude=39.05094804, longitude=-94.58699328)\n",
      "Distributor(title='Blick Art Materials', street_number=None, street_name=None, city='Baltimore', state_province='Maryland', country='United States', postal_code='21201', website='https://www.dickblick.com/', latitude=39.30177363, longitude=-76.61921999)\n",
      "Distributor(title='Blick Art Materials', street_number=None, street_name=None, city='Miami', state_province='Florida', country='United States', postal_code='33143', website='https://www.dickblick.com/', latitude=25.6998343, longitude=-80.29421503)\n",
      "Distributor(title='Blick Art Materials', street_number=None, street_name=None, city='Royal Oak', state_province='Michigan', country='United States', postal_code='48067', website='https://www.dickblick.com/', latitude=42.5018473, longitude=-83.16997979)\n",
      "Distributor(title='Blick Art Materials', street_number=None, street_name=None, city='Galesburg', state_province='Illinois', country='United States', postal_code='61401', website='https://www.dickblick.com', latitude=40.9478158, longitude=-90.3712395)\n",
      "Distributor(title='Blick Art Materials', street_number=None, street_name=None, city='Pasadena', state_province='California', country='United States', postal_code='91105', website='https://www.dickblick.com/', latitude=34.14504486, longitude=-118.1486947)\n",
      "Distributor(title='Blick Art Materials', street_number=None, street_name=None, city='Oakland', state_province='California', country='United States', postal_code='94618', website='https://www.dickblick.com/', latitude=37.83761866, longitude=-122.2507885)\n",
      "Distributor(title='Blick Art Materials', street_number=None, street_name=None, city='San Diego', state_province='California', country='United States', postal_code='92101', website='https://www.dickblick.com/', latitude=32.72435563, longitude=-117.168756)\n",
      "Distributor(title='Blick Art Materials', street_number=None, street_name=None, city='Chicago', state_province='Illinois', country='United States', postal_code='60622', website='https://www.dickblick.com/', latitude=41.90985075, longitude=-87.65373103)\n",
      "Distributor(title='Blick Art Materials', street_number=None, street_name=None, city='Evanston', state_province='Illinois', country='United States', postal_code='60201', website='https://www.dickblick.com/', latitude=42.04975387, longitude=-87.68458502)\n",
      "Distributor(title='Blick Art Materials', street_number=None, street_name=None, city='New York', state_province='New York', country='United States', postal_code='10013', website='https://www.dickblick.com/', latitude=40.72066089, longitude=-74.00146929)\n",
      "Distributor(title='Blick Art Materials', street_number=None, street_name=None, city='New York', state_province='New York', country='United States', postal_code='10003', website='https://www.dickblick.com/', latitude=40.6951171, longitude=-73.7803838)\n",
      "Distributor(title='Blick Art Materials', street_number=None, street_name=None, city='Boston', state_province='Massachusetts', country='United States', postal_code='2215', website='https://www.dickblick.com/', latitude=42.3443331, longitude=-71.10301549)\n",
      "Distributor(title='Blick Art Materials', street_number=None, street_name=None, city='New York', state_province='New York', country='United States', postal_code='10027', website='https://www.dickblick.com/', latitude=40.8103686, longitude=-73.95024264)\n",
      "Distributor(title='Blick Art Materials', street_number=None, street_name=None, city='San Francisco', state_province='California', country='United States', postal_code='94103', website='https://www.dickblick.com/', latitude=37.78257138, longitude=-122.4096203)\n",
      "Distributor(title='Blick Art Materials', street_number=None, street_name=None, city='Carle Place', state_province='New York', country='United States', postal_code='11514', website='https://www.dickblick.com/', latitude=40.74572385, longitude=-73.61775567)\n",
      "Distributor(title='Blick Art Materials', street_number=None, street_name=None, city='Paramus', state_province='New Jersey', country='United States', postal_code='7652', website='https://www.dickblick.com/', latitude=40.92024448, longitude=-74.0658646)\n",
      "Distributor(title='Blick Art Materials', street_number=None, street_name=None, city='New York', state_province='New York', country='United States', postal_code='10002', website='https://www.dickblick.com/', latitude=40.74086095, longitude=-73.99395819)\n",
      "Distributor(title='Blick Art Materials', street_number=None, street_name=None, city='Dearborn', state_province='Michigan', country='United States', postal_code='48126', website='https://www.dickblick.com/', latitude=42.32027613, longitude=-83.1818243)\n",
      "Distributor(title='Blick Art Materials', street_number=None, street_name=None, city='Plainville', state_province='Connecticut', country='United States', postal_code='6062', website='https://www.dickblick.com/', latitude=41.69152363, longitude=-72.84594942)\n",
      "Distributor(title='Blick Art Materials', street_number=None, street_name=None, city='Brooklyn', state_province='New York', country='United States', postal_code='11217', website='https://www.dickblick.com/', latitude=40.68772896, longitude=-73.97958384)\n",
      "Distributor(title='Blick Art Materials', street_number=None, street_name=None, city='St. Louis', state_province='Missouri', country='United States', postal_code='63144', website='https://www.dickblick.com/', latitude=38.61767623, longitude=-90.33474795)\n",
      "Distributor(title='Blick Art Materials', street_number=None, street_name=None, city='Portland', state_province='Oregon', country='United States', postal_code='97209', website='https://www.dickblick.com/', latitude=45.52695005, longitude=-122.6825173)\n",
      "Distributor(title='Blick Art Materials', street_number=None, street_name=None, city='Schaumburg', state_province='Illinois', country='United States', postal_code='60173', website='https://www.dickblick.com/', latitude=42.051807, longitude=-88.0679306)\n",
      "Distributor(title='Blick Art Materials', street_number=None, street_name=None, city='Tampa', state_province='Florida', country='United States', postal_code='33607', website='https://www.dickblick.com/', latitude=27.95631251, longitude=-82.52441749)\n",
      "Distributor(title='Blick Art Materials', street_number=None, street_name=None, city='Savannah', state_province='Georgia', country='United States', postal_code='31401', website='https://www.dickblick.com/', latitude=32.07832078, longitude=-81.08800602)\n",
      "Distributor(title='Blick Art Materials', street_number=None, street_name=None, city='Las Vegas', state_province='Nevada', country='United States', postal_code='89146', website='https://www.dickblick.com/', latitude=36.15974205, longitude=-115.2310841)\n",
      "Distributor(title='Blick Art Materials', street_number=None, street_name=None, city='Berkeley', state_province='California', country='United States', postal_code='94702', website='https://www.dickblick.com/', latitude=37.87935397, longitude=-122.2970203)\n",
      "Distributor(title='Blick Art Materials', street_number=None, street_name=None, city='Cambridge', state_province='Massachusetts', country='United States', postal_code='2139', website='https://www.dickblick.com/', latitude=42.36551796, longitude=-71.10313564)\n",
      "Distributor(title='BKLYN CLAY LLC', street_number=None, street_name=None, city='Brooklyn', state_province='New York', country='United States', postal_code='11238', website='https://bklynclay.com', latitude=40.681282078075284, longitude=-73.97066263114012)\n",
      "Distributor(title='BKLYN CLAY LLC', street_number='535 Carlton Ave', street_name=None, city='Brooklyn', state_province='New York', country='United States', postal_code='11238', website='https://bklynclay.com', latitude=40.682339, longitude=-73.970619)\n",
      "Distributor(title='Bisque Imports', street_number=None, street_name=None, city='Belmont', state_province='North Carolina', country='United States', postal_code='28012', website='https://www.bisqueimports.com/', latitude=35.2429175, longitude=-81.037297)\n",
      "Distributor(title='Big Creek Clay', street_number='12021 Ravenna Rd', street_name=None, city='Cardon', state_province='Ohio', country='United States', postal_code='44024', website='https://www.bigcreekclay.com', latitude=41.54442, longitude=-81.19298)\n",
      "Distributor(title='Bercher Ceramic Supply, Inc', street_number=None, street_name=None, city='Oklahoma City', state_province='Oklahoma', country='United States', postal_code='73149', website='http://www.bercherceramicsupply.com/', latitude=35.37656, longitude=-97.49102)\n",
      "Distributor(title='Bendix, SA', street_number=None, street_name='Gremi di Ferrers, 48', city='Palma de Mallorca', state_province=None, country='Spain', postal_code='07009', website='http://bendix.net/', latitude=39.60368796234369, longitude=2.6740243961645542)\n",
      "Distributor(title='Bay Ceramics', street_number=None, street_name=None, city='Sochi', state_province='Krasnodar Territory', country='Russia', postal_code=None, website='https://bayceramics.ru/', latitude=45.03345, longitude=38.9802)\n",
      "Distributor(title='Bath Potters Supplies Ltd', street_number=None, street_name=None, city='Radstock', state_province=None, country='United Kingdom', postal_code=None, website='https://www.bathpotters.co.uk/', latitude=51.280673120113626, longitude=-2.466202601726868)\n",
      "Distributor(title='Bailey Ceramic Supply', street_number=None, street_name=None, city='Kingston', state_province='New York', country='United States', postal_code='12402', website='https://www.baileypottery.com', latitude=41.9274042, longitude=-74.0166785)\n",
      "Distributor(title='Atlantic Pottery Supply, Inc.', street_number='1904 Debarry Ave', street_name='Debarry Ave', city='Orange Park', state_province='Florida', country='United States', postal_code='32073', website='http://atlanticpotterysupply.com', latitude=30.16626, longitude=-81.7209)\n",
      "Distributor(title='Artesania Chopo S.L.', street_number='Colegiata 16', street_name=None, city=None, state_province='Madrid', country='Spain', postal_code='28012', website='https://www.artesaniachopo.com', latitude=40.41334, longitude=-3.70711)\n",
      "Distributor(title='Artea CR SA', street_number='Lagunilla de la sede de la', street_name='UNA 200 Norte', city='Heredia', state_province=None, country='Costa Rica', postal_code='106', website='https://www.arteacr.com', latitude=10.022687, longitude=-84.144042)\n",
      "Distributor(title='Art Supply Depo – Sylvania', street_number=None, street_name=None, city='Sylvania', state_province='Ohio', country=None, postal_code='43560', website='https://artsupplydepo.com/', latitude=41.718387145712164, longitude=-83.70350351735792)\n",
      "Distributor(title='Art Supply Depo – Bowling Green', street_number=None, street_name=None, city='Bowling Green', state_province='Ohio', country='United States', postal_code='43402', website='https://artsupplydepo.com/', latitude=41.375106378539726, longitude=-83.64486617133635)\n",
      "Distributor(title='Art d’Argile', street_number=None, street_name='Kristalweg 6', city='DA Herten', state_province=None, country='Netherlands', postal_code='6049', website='http://www.argile.nl/', latitude=51.20148230808922, longitude=5.967373816193607)\n",
      "Distributor(title='Art Craft Studio INC', street_number='1620', street_name='Commercial St', city='Waterloo', state_province='Iowa', country='United States', postal_code='50702', website='https://www.facebook.com/profile.php?id=100063707763795', latitude=42.487768688405446, longitude=-92.32857879646437)\n",
      "Distributor(title='Armadillo Clay', street_number=None, street_name=None, city='Austin', state_province='Texas', country='United States', postal_code='78702', website='http://armadilloclay.com', latitude=30.2603535, longitude=-97.7145152)\n",
      "Distributor(title='Argile et Création', street_number=None, street_name='Ch. Albert-Louis Chappuis 5', city='Vulliens', state_province=None, country='Switzerland', postal_code='1085', website='https://argilecreation.ch/', latitude=46.69824563815741, longitude=6.822265688257199)\n",
      "Distributor(title='Archie Bray Foundation Clay', street_number=None, street_name=None, city='Helena', state_province='Montana', country='United States', postal_code='59602', website='http://archiebrayclay.com', latitude=46.5891452, longitude=-112.0391057)\n",
      "Distributor(title='American Slip Company', street_number='4950', street_name='Co Road 1510', city='Pomona', state_province='Missouri', country='United States', postal_code='65789', website='https://learnfiredarts.com/', latitude=36.87671, longitude=-91.90647)\n",
      "Distributor(title='American Cer. Sup. Co.', street_number=None, street_name=None, city='Ft. Worth', state_province='Texas', country='United States', postal_code='76105', website='https://americanceramics.com', latitude=32.7274015, longitude=-97.2706807)\n",
      "Distributor(title='Alpha Fired Arts', street_number='4675 Aldona Lane', street_name='Aldona Lane', city='Sacramento', state_province='California', country='United States', postal_code='95841', website='http://www.alphafiredarts.com/', latitude=38.64977, longitude=-121.36081)\n",
      "Distributor(title='Allison Ceramic Supply, Inc.', street_number=None, street_name=None, city='Columbus', state_province='Georgia', country='United States', postal_code='31907', website='https://allisonceramicsupply.com', latitude=32.4559867, longitude=-84.8776392)\n",
      "Distributor(title='AlleyKat Ceramics', street_number=None, street_name=None, city='Gulfport', state_province='Mississippi', country='United States', postal_code='39507', website='https://alleykatceramics.com', latitude=30.3918615, longitude=-89.0322699)\n",
      "Distributor(title='Allen’s Ceramics', street_number='1747', street_name='Gibson Ave', city='Odgen', state_province='Utah', country='United States', postal_code='84404', website='https://www.facebook.com/allensceramics/', latitude=41.23575, longitude=-111.98492)\n",
      "Distributor(title='All Fired Up About Ceramics', street_number=None, street_name=None, city='Wilmington', state_province='Ohio', country='United States', postal_code='45177', website='http://www.allfiredupaboutceramics.com/', latitude=39.44426951832001, longitude=-83.82821765974136)\n",
      "Distributor(title='Alabama Art Supply, Inc.', street_number=None, street_name=None, city='Birmingham', state_province='Alabama', country='United States', postal_code='35205', website='https://alabamaart.com', latitude=33.489895, longitude=-86.8094808)\n",
      "Distributor(title='AFP de Figueiredo', street_number=None, street_name=None, city='Sao Paulo', state_province=None, country='Brazil', postal_code='01310-100', website=None, latitude=-23.5479458, longitude=-46.6358691)\n",
      "Distributor(title='Adonai Pottery Supply Inc.', street_number=None, street_name=None, city='Busan', state_province=None, country='South Korea', postal_code='48269', website=None, latitude=35.1795543, longitude=129.0756416)\n",
      "Distributor(title='Adobi Ceramics, Inc.', street_number=None, street_name=None, city='Columbus', state_province='Ohio', country='United States', postal_code='43219', website=None, latitude=40.0415191, longitude=-82.9178838)\n",
      "Distributor(title='Act 3 Pottery & Supplies', street_number=None, street_name=None, city='Connersville', state_province='Indiana', country='United States', postal_code='47331', website='https://www.act3pottery.com/', latitude=39.64963452464759, longitude=-85.13468759999998)\n",
      "Distributor(title='Aardvark Clay & Supply, Inc.', street_number=None, street_name=None, city='Santa Ana', state_province='California', country='United States', postal_code='92705', website='https://aardvarkclay.com', latitude=33.72456, longitude=-117.85188)\n",
      "Distributor(title='1240.Design', street_number='Al. Wyscigowa 14a/204', street_name=None, city=None, state_province='Warsaw', country='Poland', postal_code='02-681', website='https://www.1240.design', latitude=52.16737, longitude=21.01115)\n"
     ]
    }
   ],
   "execution_count": 29
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "### Exercise: Reducing the Number of Points in GeoJSON Polygon File.",
   "id": "3284263e9d475d5c"
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": [
    "\n",
    "In this exercise, your will be working with GeoJSON format.\n",
    "\n",
    "GeoJSON is a simple json, but for displaying some objects on the map.\n",
    "To display it, we will use folium package (display_folium function is already given, that does all the job).\n",
    "\n",
    "In order to reduce number of points, we will select only points from the convex hull (https://en.wikipedia.org/wiki/Convex_hull) of the polygon. This is also already implemented in get_convex_hull function\n",
    "\n",
    "So, we need to do the following:\n",
    "\n",
    "1) Understand the structure of the GeoJSON file and extract the coordinates of the polygon\n",
    "2) Compute the coordinates for the center of the polygon (required for visualization)\n",
    "3) Call get_convex_hull and save updated polygon to GeoJSON format, and visualize the result."
   ],
   "id": "f7ada645c7e8ea51"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2026-09-15T20:52:24.478936Z",
     "start_time": "2026-09-15T20:52:23.560970Z"
    }
   },
   "cell_type": "code",
   "source": [
    "import folium\n",
    "from scipy.spatial import ConvexHull\n",
    "import numpy as np\n",
    "\n",
    "def display_folium(\n",
    "        center_lat: float,\n",
    "        center_lng: float,\n",
    "        geojson_path: str\n",
    ") -> None:\n",
    "    m = folium.Map(\n",
    "        location=[center_lat, center_lng], \n",
    "        zoom_start=16,\n",
    "        zoom_control=False,\n",
    "        dragging=False,\n",
    "        touch_zoom=False,\n",
    "        scrollWheelZoom=False,\n",
    "        doubleClickZoom=False,\n",
    "        boxZoom=False\n",
    "    )\n",
    "    folium.GeoJson(\n",
    "        geojson_path\n",
    "    ).add_to(m)\n",
    "    return m\n",
    "\n",
    "\n",
    "def get_convex_hull(points: list[tuple[float, float]]) -> list[tuple[float, float]]:\n",
    "    points_np = np.array(points)\n",
    "    hull = ConvexHull(points_np)\n",
    "    return list(map(list, points_np[hull.vertices]))"
   ],
   "id": "e9bb129430af48bb",
   "outputs": [],
   "execution_count": 32
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2026-09-15T20:53:02.078971Z",
     "start_time": "2026-09-15T20:53:02.076107Z"
    }
   },
   "cell_type": "code",
   "source": [
    "import json\n",
    "\n",
    "with open('geo.json', 'r') as f:\n",
    "    geo = json.load(f)"
   ],
   "id": "e22ffe8baf13d0fc",
   "outputs": [],
   "execution_count": 33
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2026-09-15T20:53:05.954928Z",
     "start_time": "2026-09-15T20:53:05.950936Z"
    }
   },
   "cell_type": "code",
   "source": "geo",
   "id": "4780ea29dba6992c",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'type': 'FeatureCollection',\n",
       " 'features': [{'type': 'Feature',\n",
       "   'properties': {},\n",
       "   'geometry': {'coordinates': [[[8.650428389537126, 53.17119270803312],\n",
       "      [8.650295332158123, 53.17064769291278],\n",
       "      [8.650073570430777, 53.170102670466264],\n",
       "      [8.650095746603512, 53.16957093457904],\n",
       "      [8.649541342283413, 53.16963740192517],\n",
       "      [8.649053466482428, 53.1697038691683],\n",
       "      [8.648011186361344, 53.169730456037286],\n",
       "      [8.648011186361344, 53.16955764109747],\n",
       "      [8.647989010188638, 53.169025898455686],\n",
       "      [8.647745072287677, 53.16844097393982],\n",
       "      [8.64743460586854, 53.16780286537423],\n",
       "      [8.647212844141194, 53.1671381588618],\n",
       "      [8.64719066796846, 53.16663297502603],\n",
       "      [8.64714631562211, 53.16604801789262],\n",
       "      [8.64701325858573, 53.16548964228136],\n",
       "      [8.64714631562211, 53.164811604986795],\n",
       "      [8.64823294808869, 53.164864784769435],\n",
       "      [8.649474813765266, 53.164598885196625],\n",
       "      [8.651736783389254, 53.164439344662014],\n",
       "      [8.651936368944746, 53.16493125940511],\n",
       "      [8.652446420918466, 53.16495784923109],\n",
       "      [8.653399996348611, 53.16510409297652],\n",
       "      [8.654863623752505, 53.16477172010656],\n",
       "      [8.655706318657224, 53.16501102842997],\n",
       "      [8.656172018286355, 53.16538328379559],\n",
       "      [8.656504660877317, 53.16623414107889],\n",
       "      [8.656526837050933, 53.16681909567589],\n",
       "      [8.656172018286355, 53.16695203879067],\n",
       "      [8.655395852238087, 53.167018510193344],\n",
       "      [8.65461968619067, 53.16709827574067],\n",
       "      [8.65466403853614, 53.16735086566294],\n",
       "      [8.65484144791887, 53.16805545074675],\n",
       "      [8.655129738165328, 53.168440973536775],\n",
       "      [8.65526279520168, 53.16909236624355],\n",
       "      [8.654708390882405, 53.16907907261373],\n",
       "      [8.654242691253273, 53.16909236624355],\n",
       "      [8.65366611076135, 53.16914554072227],\n",
       "      [8.65335564434227, 53.16877331799026],\n",
       "      [8.652867768540347, 53.168799905435264],\n",
       "      [8.652202483357485, 53.168826492863815],\n",
       "      [8.651448493481922, 53.16885308027585],\n",
       "      [8.651404141136481, 53.169225302315965],\n",
       "      [8.651492845830973, 53.16995644335154],\n",
       "      [8.651381964966419, 53.170355242302065],\n",
       "      [8.651492845830973, 53.17123258694642],\n",
       "      [8.650428389537126, 53.17119270803312]]],\n",
       "    'type': 'Polygon'}}]}"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 34
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2026-09-15T20:53:11.427421Z",
     "start_time": "2026-09-15T20:53:11.424484Z"
    }
   },
   "cell_type": "code",
   "source": "points = geo['features'][0]['geometry']['coordinates'][0]",
   "id": "d97bed030860045b",
   "outputs": [],
   "execution_count": 35
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2026-09-15T20:53:14.979029Z",
     "start_time": "2026-09-15T20:53:14.975607Z"
    }
   },
   "cell_type": "code",
   "source": [
    "summ_lat = 0\n",
    "summ_lng = 0\n",
    "count = 0\n",
    "\n",
    "for lng, lat in points:\n",
    "    summ_lat += lat\n",
    "    summ_lng += lng\n",
    "    count += 1\n",
    "    \n",
    "center_lat = summ_lat / count\n",
    "center_lng = summ_lng / count\n",
    "\n",
    "center_lat, center_lng"
   ],
   "id": "8f423acae4b3d36b",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(53.1678519464429, 8.651655792326954)"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 36
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2026-09-15T20:53:18.720134Z",
     "start_time": "2026-09-15T20:53:18.710832Z"
    }
   },
   "cell_type": "code",
   "source": "display_folium(center_lat, center_lng, 'geo.json')",
   "id": "7e7a737c93957b0f",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<folium.folium.Map at 0x72a0502b9a50>"
      ],
      "text/html": [
       "<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><span style=\"color:#565656\">Make this Notebook Trusted to load map: File -> Trust Notebook</span><iframe srcdoc=\"&lt;!DOCTYPE html&gt;\n",
       "&lt;html&gt;\n",
       "&lt;head&gt;\n",
       "    \n",
       "    &lt;meta http-equiv=&quot;content-type&quot; content=&quot;text/html; charset=UTF-8&quot; /&gt;\n",
       "    \n",
       "        &lt;script&gt;\n",
       "            L_NO_TOUCH = false;\n",
       "            L_DISABLE_3D = false;\n",
       "        &lt;/script&gt;\n",
       "    \n",
       "    &lt;style&gt;html, body {width: 100%;height: 100%;margin: 0;padding: 0;}&lt;/style&gt;\n",
       "    &lt;style&gt;#map {position:absolute;top:0;bottom:0;right:0;left:0;}&lt;/style&gt;\n",
       "    &lt;script src=&quot;https://cdn.jsdelivr.net/npm/leaflet@1.9.3/dist/leaflet.js&quot;&gt;&lt;/script&gt;\n",
       "    &lt;script src=&quot;https://code.jquery.com/jquery-3.7.1.min.js&quot;&gt;&lt;/script&gt;\n",
       "    &lt;script src=&quot;https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/js/bootstrap.bundle.min.js&quot;&gt;&lt;/script&gt;\n",
       "    &lt;script src=&quot;https://cdnjs.cloudflare.com/ajax/libs/Leaflet.awesome-markers/2.0.2/leaflet.awesome-markers.js&quot;&gt;&lt;/script&gt;\n",
       "    &lt;link rel=&quot;stylesheet&quot; href=&quot;https://cdn.jsdelivr.net/npm/leaflet@1.9.3/dist/leaflet.css&quot;/&gt;\n",
       "    &lt;link rel=&quot;stylesheet&quot; href=&quot;https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/css/bootstrap.min.css&quot;/&gt;\n",
       "    &lt;link rel=&quot;stylesheet&quot; href=&quot;https://netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap-glyphicons.css&quot;/&gt;\n",
       "    &lt;link rel=&quot;stylesheet&quot; href=&quot;https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.2.0/css/all.min.css&quot;/&gt;\n",
       "    &lt;link rel=&quot;stylesheet&quot; href=&quot;https://cdnjs.cloudflare.com/ajax/libs/Leaflet.awesome-markers/2.0.2/leaflet.awesome-markers.css&quot;/&gt;\n",
       "    &lt;link rel=&quot;stylesheet&quot; href=&quot;https://cdn.jsdelivr.net/gh/python-visualization/folium/folium/templates/leaflet.awesome.rotate.min.css&quot;/&gt;\n",
       "    \n",
       "            &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width,\n",
       "                initial-scale=1.0, maximum-scale=1.0, user-scalable=no&quot; /&gt;\n",
       "            &lt;style&gt;\n",
       "                #map_25ac72b5bcfd90d6ceb0a40df0192e09 {\n",
       "                    position: relative;\n",
       "                    width: 100.0%;\n",
       "                    height: 100.0%;\n",
       "                    left: 0.0%;\n",
       "                    top: 0.0%;\n",
       "                }\n",
       "                .leaflet-container { font-size: 1rem; }\n",
       "            &lt;/style&gt;\n",
       "        \n",
       "&lt;/head&gt;\n",
       "&lt;body&gt;\n",
       "    \n",
       "    \n",
       "            &lt;div class=&quot;folium-map&quot; id=&quot;map_25ac72b5bcfd90d6ceb0a40df0192e09&quot; &gt;&lt;/div&gt;\n",
       "        \n",
       "&lt;/body&gt;\n",
       "&lt;script&gt;\n",
       "    \n",
       "    \n",
       "            var map_25ac72b5bcfd90d6ceb0a40df0192e09 = L.map(\n",
       "                &quot;map_25ac72b5bcfd90d6ceb0a40df0192e09&quot;,\n",
       "                {\n",
       "                    center: [53.1678519464429, 8.651655792326954],\n",
       "                    crs: L.CRS.EPSG3857,\n",
       "                    ...{\n",
       "  &quot;zoom&quot;: 16,\n",
       "  &quot;zoomControl&quot;: false,\n",
       "  &quot;preferCanvas&quot;: false,\n",
       "  &quot;dragging&quot;: false,\n",
       "  &quot;touchZoom&quot;: false,\n",
       "  &quot;scrollWheelZoom&quot;: false,\n",
       "  &quot;doubleClickZoom&quot;: false,\n",
       "  &quot;boxZoom&quot;: false,\n",
       "}\n",
       "\n",
       "                }\n",
       "            );\n",
       "\n",
       "            \n",
       "\n",
       "        \n",
       "    \n",
       "            var tile_layer_93b2b370d58ffcd5422bdca4d57ed8e7 = L.tileLayer(\n",
       "                &quot;https://tile.openstreetmap.org/{z}/{x}/{y}.png&quot;,\n",
       "                {\n",
       "  &quot;minZoom&quot;: 0,\n",
       "  &quot;maxZoom&quot;: 19,\n",
       "  &quot;maxNativeZoom&quot;: 19,\n",
       "  &quot;noWrap&quot;: false,\n",
       "  &quot;attribution&quot;: &quot;\\u0026copy; \\u003ca href=\\&quot;https://www.openstreetmap.org/copyright\\&quot;\\u003eOpenStreetMap\\u003c/a\\u003e contributors&quot;,\n",
       "  &quot;subdomains&quot;: &quot;abc&quot;,\n",
       "  &quot;detectRetina&quot;: false,\n",
       "  &quot;tms&quot;: false,\n",
       "  &quot;opacity&quot;: 1,\n",
       "}\n",
       "\n",
       "            );\n",
       "        \n",
       "    \n",
       "            tile_layer_93b2b370d58ffcd5422bdca4d57ed8e7.addTo(map_25ac72b5bcfd90d6ceb0a40df0192e09);\n",
       "        \n",
       "    \n",
       "\n",
       "        function geo_json_ab14df92ef954824a19bbbb04d105cc6_onEachFeature(feature, layer) {\n",
       "            layer.on({\n",
       "            });\n",
       "        };\n",
       "        var geo_json_ab14df92ef954824a19bbbb04d105cc6 = L.geoJson(null, {\n",
       "                onEachFeature: geo_json_ab14df92ef954824a19bbbb04d105cc6_onEachFeature,\n",
       "            \n",
       "            ...{\n",
       "}\n",
       "        });\n",
       "\n",
       "        function geo_json_ab14df92ef954824a19bbbb04d105cc6_add (data) {\n",
       "            geo_json_ab14df92ef954824a19bbbb04d105cc6\n",
       "                .addData(data);\n",
       "        }\n",
       "            geo_json_ab14df92ef954824a19bbbb04d105cc6_add({&quot;features&quot;: [{&quot;geometry&quot;: {&quot;coordinates&quot;: [[[8.650428389537126, 53.17119270803312], [8.650295332158123, 53.17064769291278], [8.650073570430777, 53.170102670466264], [8.650095746603512, 53.16957093457904], [8.649541342283413, 53.16963740192517], [8.649053466482428, 53.1697038691683], [8.648011186361344, 53.169730456037286], [8.648011186361344, 53.16955764109747], [8.647989010188638, 53.169025898455686], [8.647745072287677, 53.16844097393982], [8.64743460586854, 53.16780286537423], [8.647212844141194, 53.1671381588618], [8.64719066796846, 53.16663297502603], [8.64714631562211, 53.16604801789262], [8.64701325858573, 53.16548964228136], [8.64714631562211, 53.164811604986795], [8.64823294808869, 53.164864784769435], [8.649474813765266, 53.164598885196625], [8.651736783389254, 53.164439344662014], [8.651936368944746, 53.16493125940511], [8.652446420918466, 53.16495784923109], [8.653399996348611, 53.16510409297652], [8.654863623752505, 53.16477172010656], [8.655706318657224, 53.16501102842997], [8.656172018286355, 53.16538328379559], [8.656504660877317, 53.16623414107889], [8.656526837050933, 53.16681909567589], [8.656172018286355, 53.16695203879067], [8.655395852238087, 53.167018510193344], [8.65461968619067, 53.16709827574067], [8.65466403853614, 53.16735086566294], [8.65484144791887, 53.16805545074675], [8.655129738165328, 53.168440973536775], [8.65526279520168, 53.16909236624355], [8.654708390882405, 53.16907907261373], [8.654242691253273, 53.16909236624355], [8.65366611076135, 53.16914554072227], [8.65335564434227, 53.16877331799026], [8.652867768540347, 53.168799905435264], [8.652202483357485, 53.168826492863815], [8.651448493481922, 53.16885308027585], [8.651404141136481, 53.169225302315965], [8.651492845830973, 53.16995644335154], [8.651381964966419, 53.170355242302065], [8.651492845830973, 53.17123258694642], [8.650428389537126, 53.17119270803312]]], &quot;type&quot;: &quot;Polygon&quot;}, &quot;properties&quot;: {}, &quot;type&quot;: &quot;Feature&quot;}], &quot;type&quot;: &quot;FeatureCollection&quot;});\n",
       "        geo_json_ab14df92ef954824a19bbbb04d105cc6.setStyle(function(feature) {return feature.properties.style;});\n",
       "\n",
       "        \n",
       "    \n",
       "            geo_json_ab14df92ef954824a19bbbb04d105cc6.addTo(map_25ac72b5bcfd90d6ceb0a40df0192e09);\n",
       "        \n",
       "&lt;/script&gt;\n",
       "&lt;/html&gt;\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 37
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2026-09-15T20:53:23.491105Z",
     "start_time": "2026-09-15T20:53:23.479413Z"
    }
   },
   "cell_type": "code",
   "source": [
    "import copy\n",
    "\n",
    "new_geo = copy.deepcopy(geo)\n",
    "\n",
    "new_points = get_convex_hull(points)\n",
    "new_points = list(map(lambda p: [float(p[0]), float(p[1])], new_points))\n",
    "new_geo['features'][0]['geometry']['coordinates'][0] = new_points\n",
    "new_geo"
   ],
   "id": "7bbf182387499914",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'type': 'FeatureCollection',\n",
       " 'features': [{'type': 'Feature',\n",
       "   'properties': {},\n",
       "   'geometry': {'coordinates': [[[8.656526837050933, 53.16681909567589],\n",
       "      [8.65526279520168, 53.16909236624355],\n",
       "      [8.651492845830973, 53.17123258694642],\n",
       "      [8.650428389537126, 53.17119270803312],\n",
       "      [8.648011186361344, 53.169730456037286],\n",
       "      [8.647212844141194, 53.1671381588618],\n",
       "      [8.64701325858573, 53.16548964228136],\n",
       "      [8.64714631562211, 53.164811604986795],\n",
       "      [8.649474813765266, 53.164598885196625],\n",
       "      [8.651736783389254, 53.164439344662014],\n",
       "      [8.654863623752505, 53.16477172010656],\n",
       "      [8.655706318657224, 53.16501102842997],\n",
       "      [8.656172018286355, 53.16538328379559],\n",
       "      [8.656504660877317, 53.16623414107889]]],\n",
       "    'type': 'Polygon'}}]}"
      ]
     },
     "execution_count": 38,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 38
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2026-09-15T20:53:28.038477Z",
     "start_time": "2026-09-15T20:53:28.036072Z"
    }
   },
   "cell_type": "code",
   "source": [
    "with open('geo_new.json', 'w') as f:\n",
    "    json.dump(new_geo, f)"
   ],
   "id": "26fbd15764949d28",
   "outputs": [],
   "execution_count": 39
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2026-09-15T20:53:32.550757Z",
     "start_time": "2026-09-15T20:53:32.540404Z"
    }
   },
   "cell_type": "code",
   "source": "display_folium(center_lat, center_lng, 'geo_new.json')",
   "id": "41f97200c5035f2",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<folium.folium.Map at 0x729fd2d47f40>"
      ],
      "text/html": [
       "<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><span style=\"color:#565656\">Make this Notebook Trusted to load map: File -> Trust Notebook</span><iframe srcdoc=\"&lt;!DOCTYPE html&gt;\n",
       "&lt;html&gt;\n",
       "&lt;head&gt;\n",
       "    \n",
       "    &lt;meta http-equiv=&quot;content-type&quot; content=&quot;text/html; charset=UTF-8&quot; /&gt;\n",
       "    \n",
       "        &lt;script&gt;\n",
       "            L_NO_TOUCH = false;\n",
       "            L_DISABLE_3D = false;\n",
       "        &lt;/script&gt;\n",
       "    \n",
       "    &lt;style&gt;html, body {width: 100%;height: 100%;margin: 0;padding: 0;}&lt;/style&gt;\n",
       "    &lt;style&gt;#map {position:absolute;top:0;bottom:0;right:0;left:0;}&lt;/style&gt;\n",
       "    &lt;script src=&quot;https://cdn.jsdelivr.net/npm/leaflet@1.9.3/dist/leaflet.js&quot;&gt;&lt;/script&gt;\n",
       "    &lt;script src=&quot;https://code.jquery.com/jquery-3.7.1.min.js&quot;&gt;&lt;/script&gt;\n",
       "    &lt;script src=&quot;https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/js/bootstrap.bundle.min.js&quot;&gt;&lt;/script&gt;\n",
       "    &lt;script src=&quot;https://cdnjs.cloudflare.com/ajax/libs/Leaflet.awesome-markers/2.0.2/leaflet.awesome-markers.js&quot;&gt;&lt;/script&gt;\n",
       "    &lt;link rel=&quot;stylesheet&quot; href=&quot;https://cdn.jsdelivr.net/npm/leaflet@1.9.3/dist/leaflet.css&quot;/&gt;\n",
       "    &lt;link rel=&quot;stylesheet&quot; href=&quot;https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/css/bootstrap.min.css&quot;/&gt;\n",
       "    &lt;link rel=&quot;stylesheet&quot; href=&quot;https://netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap-glyphicons.css&quot;/&gt;\n",
       "    &lt;link rel=&quot;stylesheet&quot; href=&quot;https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.2.0/css/all.min.css&quot;/&gt;\n",
       "    &lt;link rel=&quot;stylesheet&quot; href=&quot;https://cdnjs.cloudflare.com/ajax/libs/Leaflet.awesome-markers/2.0.2/leaflet.awesome-markers.css&quot;/&gt;\n",
       "    &lt;link rel=&quot;stylesheet&quot; href=&quot;https://cdn.jsdelivr.net/gh/python-visualization/folium/folium/templates/leaflet.awesome.rotate.min.css&quot;/&gt;\n",
       "    \n",
       "            &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width,\n",
       "                initial-scale=1.0, maximum-scale=1.0, user-scalable=no&quot; /&gt;\n",
       "            &lt;style&gt;\n",
       "                #map_fcc34cd4c36c9b237d523dcc340ef887 {\n",
       "                    position: relative;\n",
       "                    width: 100.0%;\n",
       "                    height: 100.0%;\n",
       "                    left: 0.0%;\n",
       "                    top: 0.0%;\n",
       "                }\n",
       "                .leaflet-container { font-size: 1rem; }\n",
       "            &lt;/style&gt;\n",
       "        \n",
       "&lt;/head&gt;\n",
       "&lt;body&gt;\n",
       "    \n",
       "    \n",
       "            &lt;div class=&quot;folium-map&quot; id=&quot;map_fcc34cd4c36c9b237d523dcc340ef887&quot; &gt;&lt;/div&gt;\n",
       "        \n",
       "&lt;/body&gt;\n",
       "&lt;script&gt;\n",
       "    \n",
       "    \n",
       "            var map_fcc34cd4c36c9b237d523dcc340ef887 = L.map(\n",
       "                &quot;map_fcc34cd4c36c9b237d523dcc340ef887&quot;,\n",
       "                {\n",
       "                    center: [53.1678519464429, 8.651655792326954],\n",
       "                    crs: L.CRS.EPSG3857,\n",
       "                    ...{\n",
       "  &quot;zoom&quot;: 16,\n",
       "  &quot;zoomControl&quot;: false,\n",
       "  &quot;preferCanvas&quot;: false,\n",
       "  &quot;dragging&quot;: false,\n",
       "  &quot;touchZoom&quot;: false,\n",
       "  &quot;scrollWheelZoom&quot;: false,\n",
       "  &quot;doubleClickZoom&quot;: false,\n",
       "  &quot;boxZoom&quot;: false,\n",
       "}\n",
       "\n",
       "                }\n",
       "            );\n",
       "\n",
       "            \n",
       "\n",
       "        \n",
       "    \n",
       "            var tile_layer_803ed4c60705477eea0aec67fad33886 = L.tileLayer(\n",
       "                &quot;https://tile.openstreetmap.org/{z}/{x}/{y}.png&quot;,\n",
       "                {\n",
       "  &quot;minZoom&quot;: 0,\n",
       "  &quot;maxZoom&quot;: 19,\n",
       "  &quot;maxNativeZoom&quot;: 19,\n",
       "  &quot;noWrap&quot;: false,\n",
       "  &quot;attribution&quot;: &quot;\\u0026copy; \\u003ca href=\\&quot;https://www.openstreetmap.org/copyright\\&quot;\\u003eOpenStreetMap\\u003c/a\\u003e contributors&quot;,\n",
       "  &quot;subdomains&quot;: &quot;abc&quot;,\n",
       "  &quot;detectRetina&quot;: false,\n",
       "  &quot;tms&quot;: false,\n",
       "  &quot;opacity&quot;: 1,\n",
       "}\n",
       "\n",
       "            );\n",
       "        \n",
       "    \n",
       "            tile_layer_803ed4c60705477eea0aec67fad33886.addTo(map_fcc34cd4c36c9b237d523dcc340ef887);\n",
       "        \n",
       "    \n",
       "\n",
       "        function geo_json_c63217bb9f349e3dc8a10ba78d6e1c0c_onEachFeature(feature, layer) {\n",
       "            layer.on({\n",
       "            });\n",
       "        };\n",
       "        var geo_json_c63217bb9f349e3dc8a10ba78d6e1c0c = L.geoJson(null, {\n",
       "                onEachFeature: geo_json_c63217bb9f349e3dc8a10ba78d6e1c0c_onEachFeature,\n",
       "            \n",
       "            ...{\n",
       "}\n",
       "        });\n",
       "\n",
       "        function geo_json_c63217bb9f349e3dc8a10ba78d6e1c0c_add (data) {\n",
       "            geo_json_c63217bb9f349e3dc8a10ba78d6e1c0c\n",
       "                .addData(data);\n",
       "        }\n",
       "            geo_json_c63217bb9f349e3dc8a10ba78d6e1c0c_add({&quot;features&quot;: [{&quot;geometry&quot;: {&quot;coordinates&quot;: [[[8.656526837050933, 53.16681909567589], [8.65526279520168, 53.16909236624355], [8.651492845830973, 53.17123258694642], [8.650428389537126, 53.17119270803312], [8.648011186361344, 53.169730456037286], [8.647212844141194, 53.1671381588618], [8.64701325858573, 53.16548964228136], [8.64714631562211, 53.164811604986795], [8.649474813765266, 53.164598885196625], [8.651736783389254, 53.164439344662014], [8.654863623752505, 53.16477172010656], [8.655706318657224, 53.16501102842997], [8.656172018286355, 53.16538328379559], [8.656504660877317, 53.16623414107889]]], &quot;type&quot;: &quot;Polygon&quot;}, &quot;properties&quot;: {}, &quot;type&quot;: &quot;Feature&quot;}], &quot;type&quot;: &quot;FeatureCollection&quot;});\n",
       "        geo_json_c63217bb9f349e3dc8a10ba78d6e1c0c.setStyle(function(feature) {return feature.properties.style;});\n",
       "\n",
       "        \n",
       "    \n",
       "            geo_json_c63217bb9f349e3dc8a10ba78d6e1c0c.addTo(map_fcc34cd4c36c9b237d523dcc340ef887);\n",
       "        \n",
       "&lt;/script&gt;\n",
       "&lt;/html&gt;\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
      ]
     },
     "execution_count": 40,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 40
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "## Modules",
   "id": "eb2d07f5717006cc"
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "A module is a Python file containing code you can import into another file or notebook. Here are three notebook cells you can use:",
   "id": "9281c527e018aa5b"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2026-09-15T21:02:43.276030Z",
     "start_time": "2026-09-15T21:02:43.273135Z"
    }
   },
   "cell_type": "code",
   "source": [
    "%%writefile helpers.py\n",
    "def double(x):\n",
    "    return 2 * x\n",
    "\n",
    "def greet(name):\n",
    "    return f\"Hello, {name}!\""
   ],
   "id": "913b7560e1e3c80d",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Writing helpers.py\n"
     ]
    }
   ],
   "execution_count": 44
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2026-09-15T21:03:06.552542Z",
     "start_time": "2026-09-15T21:03:06.549864Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# Import the whole module: use its functions through the module name.\n",
    "import helpers\n",
    "\n",
    "print(helpers.double(5))\n",
    "print(helpers.greet(\"World\"))"
   ],
   "id": "8d6b0bed50945eff",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "10\n",
      "Hello, World!\n"
     ]
    }
   ],
   "execution_count": 46
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2026-09-15T21:03:13.283583Z",
     "start_time": "2026-09-15T21:03:13.280974Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# Or import specific names directly.\n",
    "from helpers import double, greet\n",
    "\n",
    "print(double(5))\n",
    "print(greet(\"World\"))"
   ],
   "id": "8ff2a24860cc8959",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "10\n",
      "Hello, World!\n"
     ]
    }
   ],
   "execution_count": 47
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "helpers.py must be in the notebook’s working directory (or elsewhere on Python’s import path). If you edit it after importing, restart the kernel to see the changes.",
   "id": "837d390fcf73c20a"
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "Circular imports are bad practice because they make modules tightly coupled and can fail depending on the order in which Python executes them.",
   "id": "1859ddbf1de684a8"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2026-09-15T21:05:07.585483Z",
     "start_time": "2026-09-15T21:05:07.582650Z"
    }
   },
   "cell_type": "code",
   "source": [
    "%%writefile a.py\n",
    "from b import function_b\n",
    "\n",
    "def function_a():\n",
    "    return \"A\""
   ],
   "id": "b501575153e8fc68",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Writing a.py\n"
     ]
    }
   ],
   "execution_count": 48
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2026-09-15T21:05:12.556644Z",
     "start_time": "2026-09-15T21:05:12.553866Z"
    }
   },
   "cell_type": "code",
   "source": [
    "%%writefile b.py\n",
    "from a import function_a\n",
    "\n",
    "def function_b():\n",
    "    return \"B\""
   ],
   "id": "acad1a8eb9ca9291",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Writing b.py\n"
     ]
    }
   ],
   "execution_count": 49
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2026-09-15T21:05:17.128619Z",
     "start_time": "2026-09-15T21:05:17.109809Z"
    }
   },
   "cell_type": "code",
   "source": "import a  # ImportError: a is only partially initialized when b imports it",
   "id": "a36f5ba8b51f883a",
   "outputs": [
    {
     "ename": "ImportError",
     "evalue": "cannot import name 'function_a' from partially initialized module 'a' (most likely due to a circular import) (/home/fullfix/Documents/Msu/DataSpell/PythonSeminars/newsem2/a.py)",
     "output_type": "error",
     "traceback": [
      "\u001B[0;31m---------------------------------------------------------------------------\u001B[0m",
      "\u001B[0;31mImportError\u001B[0m                               Traceback (most recent call last)",
      "Cell \u001B[0;32mIn[50], line 1\u001B[0m\n\u001B[0;32m----> 1\u001B[0m \u001B[38;5;28;01mimport\u001B[39;00m \u001B[38;5;21;01ma\u001B[39;00m  \u001B[38;5;66;03m# ImportError: a is only partially initialized when b imports it\u001B[39;00m\n",
      "File \u001B[0;32m~/Documents/Msu/DataSpell/PythonSeminars/newsem2/a.py:1\u001B[0m\n\u001B[0;32m----> 1\u001B[0m \u001B[38;5;28;01mfrom\u001B[39;00m \u001B[38;5;21;01mb\u001B[39;00m \u001B[38;5;28;01mimport\u001B[39;00m function_b\n\u001B[1;32m      3\u001B[0m \u001B[38;5;28;01mdef\u001B[39;00m \u001B[38;5;21mfunction_a\u001B[39m():\n\u001B[1;32m      4\u001B[0m     \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mA\u001B[39m\u001B[38;5;124m\"\u001B[39m\n",
      "File \u001B[0;32m~/Documents/Msu/DataSpell/PythonSeminars/newsem2/b.py:1\u001B[0m\n\u001B[0;32m----> 1\u001B[0m \u001B[38;5;28;01mfrom\u001B[39;00m \u001B[38;5;21;01ma\u001B[39;00m \u001B[38;5;28;01mimport\u001B[39;00m function_a\n\u001B[1;32m      3\u001B[0m \u001B[38;5;28;01mdef\u001B[39;00m \u001B[38;5;21mfunction_b\u001B[39m():\n\u001B[1;32m      4\u001B[0m     \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mB\u001B[39m\u001B[38;5;124m\"\u001B[39m\n",
      "\u001B[0;31mImportError\u001B[0m: cannot import name 'function_a' from partially initialized module 'a' (most likely due to a circular import) (/home/fullfix/Documents/Msu/DataSpell/PythonSeminars/newsem2/a.py)"
     ]
    }
   ],
   "execution_count": 50
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "## HTTP",
   "id": "af8499106d56dfcd"
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": [
    "HTTP (HyperText Transfer Protocol) is a protocol that allows you to receive various resources. Initially, as the name suggests, for documents, but now for the transfer of arbitrary data. It is the basis for data exchange on the Web.\n",
    "\n",
    "This is a client-server interaction protocol, which means that requests to the server are initiated by the recipient himself. The final document can consist of various parts: text, audio/video files, scripts. Interaction is carried out by exchanging single messages: request-response.\n",
    "\n",
    "Utilities for working with HTTP are available in any popular programming language. Web development is based on it, which consists of a backend and frontend part. The backend provides an HTTP API, and the frontend accesses it and visualizes."
   ],
   "id": "7417213c810a27a7"
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": [
    "> Python: The requests library is widely used for making HTTP requests. Python also has built-in libraries like urllib and http.client for this purpose.\n",
    ">\n",
    "> JavaScript (Node.js): Libraries like axios, fetch (in browser environments), and the built-in http and https modules are commonly used.\n",
    ">\n",
    "> Java: Libraries such as HttpURLConnection, OkHttp, and Apache HttpClient are popular choices.\n",
    ">\n",
    "> C# (.NET): The HttpClient class is commonly used for making HTTP requests.\n",
    ">\n",
    "> Ruby: The Net::HTTP library is built-in, and Faraday is a popular third-party library.\n",
    ">\n",
    "> PHP: The cURL extension and the Guzzle library are widely used.\n",
    ">\n",
    "> Go: The net/http package is part of the standard library and is used for making HTTP requests.\n",
    ">\n",
    "> Swift: Libraries like URLSession and third-party libraries like Alamofire are commonly used.\n",
    ">\n",
    "> Kotlin/Java (Android): Libraries like Retrofit and OkHttp are popular for making HTTP requests.\n",
    ">\n",
    "> Rust: The reqwest crate is commonly used for making HTTP requests."
   ],
   "id": "ccdf572da70883b"
  },
  {
   "metadata": {},
   "cell_type": "code",
   "outputs": [],
   "execution_count": null,
   "source": "### Example with REST CPython git repo",
   "id": "6f1f2c2f5ba24bb5"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2026-09-15T21:23:15.628511Z",
     "start_time": "2026-09-15T21:23:15.254819Z"
    }
   },
   "cell_type": "code",
   "source": [
    "import requests\n",
    "\n",
    "url = \"https://api.open-meteo.com/v1/forecast\"\n",
    "params = {\n",
    "    \"latitude\": 53.08,       # Bremen\n",
    "    \"longitude\": 8.80,\n",
    "    \"current\": \"temperature_2m\",\n",
    "    \"timezone\": \"Europe/Berlin\",\n",
    "}\n",
    "\n",
    "response = requests.get(url, params=params, timeout=10)\n",
    "response.raise_for_status()\n",
    "\n",
    "data = response.json()\n",
    "data"
   ],
   "id": "b78878df8c837519",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'latitude': 53.08,\n",
       " 'longitude': 8.799999,\n",
       " 'generationtime_ms': 0.030040740966796875,\n",
       " 'utc_offset_seconds': 7200,\n",
       " 'timezone': 'Europe/Berlin',\n",
       " 'timezone_abbreviation': 'GMT+2',\n",
       " 'elevation': 16.0,\n",
       " 'current_units': {'time': 'iso8601',\n",
       "  'interval': 'seconds',\n",
       "  'temperature_2m': '°C'},\n",
       " 'current': {'time': '2026-09-15T23:15',\n",
       "  'interval': 900,\n",
       "  'temperature_2m': 19.1}}"
      ]
     },
     "execution_count": 59,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 59
  },
  {
   "metadata": {},
   "cell_type": "code",
   "outputs": [],
   "execution_count": null,
   "source": [
    "2**, 4**, 5**\n",
    "\n",
    "400 - Bad Request\n",
    "404 - Not found\n",
    "403 - Forbidden\n",
    "401 - Unauthorized"
   ],
   "id": "f587d6dcb25f2568"
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": [
    "### `Request Structure`\n",
    "\n",
    "- HTTP method: GET, POST, OPTIONS, etc., defining the operation the client wants to perform\n",
    "- Resource path\n",
    "- HTTP protocol version\n",
    "- Headers (optional)\n",
    "- Body (for some methods, such as POST)"
   ],
   "id": "dab509ecf422a275"
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": [
    "### `Response Structure`\n",
    "\n",
    "- HTTP protocol version\n",
    "- HTTP status code, indicating the success of the request or the reason for failure\n",
    "- Status message — a brief description of the status code\n",
    "- HTTP headers\n",
    "- Optionally: a body containing the requested resource"
   ],
   "id": "ef2f2889fbfba666"
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": [
    "### `Request Types (HTTP Methods)`\n",
    "\n",
    "Request types are, to some extent, simply an agreement on semantics. Nothing prevents using only one type. But globally, the types are designed to define what is required when accessing the same resource. Each specific resource may only support a subset of methods.\n",
    "\n",
    "- GET — requests a representation of the resource. Requests using this method can only retrieve data.\n",
    "- HEAD — requests the resource in the same way as the GET method, but without a response body.\n",
    "- POST — used to send entities to a specific resource. Often causes a change in state or side effects on the server.\n",
    "- PUT — replaces all current representations of the target resource with the request payload.\n",
    "- DELETE — deletes the specified resource.\n",
    "- CONNECT — establishes a tunnel to the server identified by the target resource.\n",
    "- OPTIONS — used to describe the communication options for the target resource.\n",
    "- TRACE — performs a message loop-back test along the path to the target resource (e.g., for debugging).\n",
    "- PATCH — used to apply partial modifications to a resource."
   ],
   "id": "1597cde843f176ce"
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": [
    "### `Headers`\n",
    "\n",
    "- Authentication (WWW/Proxy-Authenticate, Authorization, Proxy-Authorization)\n",
    "- Caching (Cache-control, Age, Expires)\n",
    "- Client hints\n",
    "- Conditionals\n",
    "- Connection management (Connection, Keep-Alive)\n",
    "- Cookies\n",
    "- Message body information (Content-Length, Content-Type, Content-Encoding)\n",
    "- Request context (Host, Referer, User-Agent)\n",
    "- Response context\n",
    "- Security (Referrer-Policy)\n",
    "- WebSockets"
   ],
   "id": "2e38c5efebbc8e14"
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": [
    "### Exercise: Update a weather JSON file\n",
    "\n",
    "Every 5 seconds, request the current temperature in Bremen and overwrite `weather.json` with:\n",
    "\n",
    "- `checked_at`: the time your program made the request;\n",
    "- `forecast_time`: the timestamp returned by the API;\n",
    "- `temperature_c`: the temperature returned by the API.\n",
    "\n",
    "Make 6 requests, then stop. Use `requests`, `json`, `datetime`, and `time`. Check the HTTP response before reading its JSON."
   ],
   "id": "b3abaa66f5b0ce80"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2026-09-15T22:04:29.455712Z",
     "start_time": "2026-09-15T22:04:01.518958Z"
    }
   },
   "cell_type": "code",
   "source": [
    "import json\n",
    "import time\n",
    "from datetime import datetime\n",
    "from zoneinfo import ZoneInfo\n",
    "\n",
    "import requests\n",
    "\n",
    "url = \"https://api.open-meteo.com/v1/forecast\"\n",
    "params = {\n",
    "    \"latitude\": 53.08,\n",
    "    \"longitude\": 8.80,\n",
    "    \"current\": \"temperature_2m\",\n",
    "    \"timezone\": \"Europe/Berlin\",\n",
    "}\n",
    "\n",
    "for i in range(6): # will be while True in the real app\n",
    "    response = requests.get(url, params=params, timeout=10)\n",
    "    response.raise_for_status()\n",
    "    current = response.json()[\"current\"]\n",
    "\n",
    "    weather = {\n",
    "        \"checked_at\": datetime.now(ZoneInfo(\"Europe/Berlin\")).isoformat(),\n",
    "        \"forecast_time\": current[\"time\"],\n",
    "        \"temperature_c\": current[\"temperature_2m\"],\n",
    "    }\n",
    "\n",
    "    with open(\"weather.json\", \"w\", encoding=\"utf-8\") as f:\n",
    "        json.dump(weather, f, indent=2)\n",
    "\n",
    "    print(weather)\n",
    "    time.sleep(5)"
   ],
   "id": "805d240dbdbf7c70",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'checked_at': '2026-09-16T00:04:02.102080+02:00', 'forecast_time': '2026-09-16T00:00', 'temperature_c': 18.9}\n",
      "{'checked_at': '2026-09-16T00:04:07.436800+02:00', 'forecast_time': '2026-09-16T00:00', 'temperature_c': 18.9}\n",
      "{'checked_at': '2026-09-16T00:04:13.159901+02:00', 'forecast_time': '2026-09-16T00:00', 'temperature_c': 18.9}\n",
      "{'checked_at': '2026-09-16T00:04:18.505072+02:00', 'forecast_time': '2026-09-16T00:00', 'temperature_c': 18.9}\n",
      "{'checked_at': '2026-09-16T00:04:24.028312+02:00', 'forecast_time': '2026-09-16T00:00', 'temperature_c': 18.9}\n",
      "{'checked_at': '2026-09-16T00:04:29.454120+02:00', 'forecast_time': '2026-09-16T00:00', 'temperature_c': 18.9}\n"
     ]
    }
   ],
   "execution_count": 60
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
