How are the three character IAU Minor Planet Center's Observatory Codes assigned? Why are some letters so popular? Answers to Latitude, longitude and altitude of Ckoirama Observatory; where can things like this be looked-up? point to https://www.minorplanetcenter.net/iau/lists/ObsCodesF.html which currently lists 2198 observatories. 

The first character of the three character codes has 36 possible alphanumeric values. and the second two are only digits. That allows for 36*10*10 = 3600 possible codes.

I plotted the ones that are currently used and the pattern is interesting. Why are some letter codes fully used (all 100 two digit suffixes are populated) whereas others are completely empty? I haven't noticed an alphabetical associations.

Y = 0 to 9 are the digits and 10 to 36 are A through Z: Shading means the code is used.

  

For some reason I can't stop comparing the data to the famous Arecibo message, a tiny 1-bit bitmapped image beamed to space containing DNA, amino acids, our solar system and other goodies:



import numpy as np
import matplotlib.pyplot as plt
# blob is the unformatted lines from https://www.minorplanetcenter.net/iau/lists/ObsCodes.html
threes = [line[:3] for line in blob.splitlines()]
key = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
a = [[x] for x in key]
for t in threes:
    a[key.find(t[0])].append(t)
b = np.zeros((36, 100))
for i, thing in enumerate(a):
    c = [int(x[1:]) for x in thing[1:]]
    for d in c:
        b[i, d] = 1
plt.imshow(-b, interpolation='nearest', cmap='gray')
plt.gca().set_aspect(2)
plt.show()
pairs = []
todegs = 180/np.pi
for line in blob.splitlines():
    try:
        cos, sin = [float(x) for x in (line[13:21], line[21:30])]
        lat = todegs * np.arctan2(sin, cos)
        lon = float(line[4:13])
        pairs.append([lon, lat])
    except:
        pass
print(len(pairs), len(blob.splitlines()), float(len(pairs))/len(blob.splitlines()) )
lon, lat = np.array(list(zip(*pairs)))
lon = np.mod(lon+180, 360) - 180
plt.figure()
plt.plot(lon, lat, 'ok', markersize=1)
plt.ylim(-90, 90)
plt.xlim(-180, 180)
plt.gca().set_aspect('equal')
plt.show()
I asked the at the minor planet center how the codes were decided, and the answer was


  Historically, the observatory codes were assigned ascending by longitude toward east (from prime meridian): 360 degrees were divided by numbers. When three digit numerical codes were not sufficient, letters plus two numbers were used again in bands toward the east. Some bands are already full (e.g. H**). New observatory code is assigned in the available letter+number band (based on its longitude).