Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import re
- class Geohash36:
- def __init__(self, code: str, alfabet="23456789bBCdDFgGhHjJKlLMnNPqQrRtTVWX"):
- self.alfabet = alfabet
- # alfabet controle
- if not re.match("^[A-Za-z0-9]*$", self.alfabet):
- raise AssertionError("ongeldig alfabet")
- if not isinstance(alfabet, str) or len(alfabet) != 36 or len(alfabet) != len(set(alfabet)):
- raise AssertionError("ongeldig alfabet")
- #code controle
- if code[-2] == "-":
- self.code = code[:-2]
- self.controle_getal = code[-1]
- else:
- self.code = code
- self.controle_getal = "abcdefghijklmnopqrstuvwxyz"[self.get_calculate_controlegetal()]
- for letter in self.code:
- if not alfabet.__contains__(letter):
- raise AssertionError("ongeldige code")
- if self.controle_getal != None:
- letter_van_alfabet = "abcdefghijklmnopqrstuvwxyz".find(self.controle_getal)
- if self.get_calculate_controlegetal() != letter_van_alfabet:
- raise AssertionError("ongeldige code")
- def get_calculate_controlegetal(self):
- totale_som = 0
- for i, letter in enumerate(self.code):
- index_alfa = self.alfabet.find(letter)
- totale_som += index_alfa * (len(self.code) - i)
- return totale_som % 26
- def __repr__(self):
- if self.alfabet == "23456789bBCdDFgGhHjJKlLMnNPqQrRtTVWX":
- return f"Geohash36('{self.code}-{self.controle_getal}')"
- return f"Geohash36('{self.code}-{self.controle_getal}', alfabet='{self.alfabet}')"
- def __str__(self):
- return f"{self.code}-{self.controle_getal}"
- def checksum(self):
- return self.controle_getal
- def positie(self, t: str):
- if self.alfabet.__contains__(t):
- t_id = self.alfabet.find(t)
- rij = 6-(t_id//6)-1
- kolom = t_id % 6
- return (rij,kolom)
- else:
- raise AssertionError("ongeldig teken")
- def lengtegraad(self):
- l = -180
- u = 180
- for letter in self.code:
- k = self.positie(letter).__getitem__(1)
- new_l = l + k * ((u - l)/6)
- new_u = l + (k + 1) * ((u - l)/6)
- l = new_l
- u = new_u
- return (l,u)
- def breedtegraad(self):
- l = -90
- u = 90
- for letter in self.code:
- r = self.positie(letter).__getitem__(0)
- new_l = l + r * ((u - l)/6)
- new_u = l + (r + 1) * ((u - l)/6)
- l = new_l
- u = new_u
- return (l,u)
- def coordinaat(self):
- lengtegraad = self.lengtegraad()
- lengte = (lengtegraad.__getitem__(1) - lengtegraad.__getitem__(0))/2+lengtegraad.__getitem__(0)
- breedtegraad = self.breedtegraad()
- breedte = (breedtegraad.__getitem__(1) - breedtegraad.__getitem__(0))/2+breedtegraad.__getitem__(0)
- return (lengte,breedte)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement