Lunarpedia talk:Autostub1 test 1
Erratum
- Category tag for 'Location' should have been 'Locations'
-- Strangelv 18:27, 4 November 2006 (PST)
Problems
- How to tie the satellite crater articles to the main crater articles when the USGS database doesn't link them?
- What is the area of each sector in km**2?
- How might the script determine if a given feature is in a given sector? If we treat each item as a perfect circle, how do we determine which sectors include portions of that circle?
- Can we automatically do maps for features near the poles?
-- Strangelv 18:13, 4 November 2006 (PST)
To Do
- Sector areas
- Match sectors and features (not just centers)
- Match sattelite craters with their central craters
- Border case handling for when feature center is on the boundary of two or four sectors
- Automatically load and parse tab delimited CSV
- Automatically output articles in XML for bulk import
- Automatically generate map files for suitably large features
- Automatically generate sector articles and maps
-- Strangelv 18:13, 4 November 2006 (PST)
Bonus Points
Is there a public domain database of rille?- Are there other public domain databases of use that we might be able to merge into this to add details to sectors and features (such as surface samples)?
-- Strangelv 18:13, 4 November 2006 (PST)
The precise coordinates of the Apollo sites are available on the web link provided on that page. Charles F. Radley 17:50, 16 January 2007 (PST)
- Is there a public domain database that represents non-circular features in a non-circular manner?
-- Strangelv 16:25, 27 December 2006 (PST)
How about approximating them to ellipses? Standard geometry equations. Charles F. Radley 17:49, 16 January 2007 (PST)
Source Code
Warning: this was getting mauled in a few places. I've tinkered with the formatting to make it work.
And yes, the code is really rough in a few places (like where reinventing the wheel is faster than rembering where the wheel is). The language is Python. 2.4 and later should work; earlier may require replacing my '//' division with integer coersion.
#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%# # # # Feature Autostub Generator # # # # Licence pending # # # #%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#
def dostub(thisentry):
"""Create stub article from database
"""
#
# Set up variables to generate article stub
#
#%#%#%#%#%#%#%#%#%#%#%#%#%#%%#%#%#%#%#
#
name = thisentry[2] # name of feature
mapname = makemapname(name, None) # filename for this feature's
# automatically generated
# map from Clementine data
Lat = float(thisentry[3]) # USGS latitude
lat = do_lat(Lat) # string with proper latitude
me_long = poslong(thisentry[4]) # longitude (Mean Earth)
mo_long = me2mo(me_long) # longitude (Mare Orientale)
me_coord = coordstr(me_long, lat) # Mean Earth coordinate string
mo_coord = coordstr(mo_long, lat) # Mare Orientale coordinate string
origin = thisentry[24] # 'Origin' column in database
# warning: this seems to
# be almost anything
featuretype = thisentry[23] # Is this a mare, a crater, other?
dia = thisentry[10] # feature diameter, if applicable
approvalStat = thisentry[18] # year approval information
approvalYear = thisentry[19] # year of approval (if approved)
reference = thisentry[21] # 'reference' column in database
inSector = isinsector(mo_long, Lat) # what sector is this feature
# centered in?
sectors = sectorlist(mo_long, lat, dia)
# -----what sectors include it?
typecat = dotypecat(featuretype) # simplified category type
domap(mapname, mo_long, lat, dia) # create the map
localeDescr = descrlocale(mo_long, Lat, typecat)
# -----text description of location
approvalStr = doapproval(approvalStat, approvalYear)
# -----text description of approval,
# if approved.
#%#%#%#%#%#%#%#%#%#%#%#%#%#%%#%#%#%#%#
#
# start generating the article here:
#
to_out = []
to_out += ["{{Circular Feature "]
to_out += ["name = "+name]
to_out += ["featuretype = "+typecat]
to_out += ["origin = "+origin]
to_out += ["map = [[Image:"+mapname+"|240px]]"]
to_out += ["mo_coord = "+mo_coord]
to_out += ["me_coord = "+me_coord]
to_out += ["dia = "+dia]
to_out += ["approval = "+approvalStr]
# Tidily install pipes for the table
to_out = tidypipes(to_out)
to_out += ["}}"]
to_out += ["'''"+name+"''' "+localeDescr]
to_out += ["<BR/><BR/>\n\n"]
# if inSector !="AAAAAAAAA!":
to_out += ["The center of "+name+" is in sector [[Sector_"+inSector+"]]"]
# else:
# inSectors = something()
to_out += ["<BR/><BR/>\n\n"]
to_out += ["==See Also=="]
for q in sectors:
to_out += ["[["+q+"]]"]
to_out += ["<BR/><BR/>\n\n"]
to_out += ["==References=="]
to_out += [refbreak(reference)]
to_out += ["{{Autostub}}"]
to_out += ["[[Category:Location]]"]
to_out += ["[[Category:"+typecat+"]]"]
to_out += [""]
return to_out
# def main(): # # load database # didxml = templatetop() # for q in database: didxml += dostub(q) + templatemid(); print ".", # didxml += templatefin() # # save didxml
def makemapname(name, other):
"""
"""
name2=""
for q in name:
if q == " ": name2 += "_"
else: name2 += q
if other: name2 += "_"+other
name2 += ".png"
return name2
def poslong(long_):
"""convert string of possibly noncompliant Mean Earth longitude into float or fixed of compliant Mean Earth longitude
"""
long_ = float(long_)
if long_ < 0 : long_ += 360
return long_
def me2mo(me_long):
"""
"""
mo_long=float(me_long)-267.2
if mo_long <0: mo_long += 360.0
#print "me_long == "+str(me_long)
return mo_long
def coordstr(long_,lat):
""" temporary implementation
"""
return str(lat)+" "+str(long_)
def descrlocale(long_, lat, what):
"""quickie hack
"""
if lat > 5: vert = "a northern"
elif lat < 5: vert = "a southern"
else: vert = "an equatorial"
if long_ <= 165 and long_ >= 15: side = "near side"
elif long_ <= 195 and long_ >= 345: side = "far side"
elif long_ >= 165 and long_ <= 195: side = "east edge"
else: side = "west edge"
return "is "+vert+" "+what+" on the "+side+" of Luna."
def isinsector(long_,lat):
"""can we determinewhat sector you're in?
"""
# special case handling?
def AAAAAAAAA():
# border case handling
return "AAAAAAAAA!"
# find latitude part or bust
if lat == 0.0: LT="E" # this is equatorial
else:
if lat > 0: LTH = "N"
else:
lat = -lat
LTH = "S"
if ((lat+7.5)//15) == ((lat+7.5)/15.0): return AAAAAAAAA()
LT = str(int(((lat+7.5)//15)*15)) + LTH
if LT == "90": return LTH # this is a polar sector
# find longitude part or bust
if long_ < 7.5 or long_ > 352.5: LG = "000" # prime meridian sector
else:
if ((long_+7.5)//15) == ((long_+7.5)/15.0): return AAAAAAAAA()
LG = str(int(((long_+7.5)//15)*15))
if len(LG)<3: LG = "0"+LG
# return the result!
return LT+LG
def dotypecat(stringie):
"""
"""
if stringie == "Rima, rimae": return "rima"
# Most definitely need to list the complete set
return stringie
def sectorlist(long_,lat,dia):
"""
"""
return ["sectorlist() not implemented"]
def domap(mapname,long_,lat,dia):
"""
"""
return "domap() not implemented"
def doapproval(approvalStat, approvalYear):
"""temporary hack; needs to acconut for unapproved
"""
return approvalStat+" in "+approvalYear
def tidypipes(table):
"""takes a list oy strings, finds the longest one, and tidily adds pipes to the right of each line.
maxlen: maximum length
table: input list of strings
table2: output list of strings
"""
maxlen = 0
for q in table:
if len(q)>maxlen: maxlen = len(q)
table2 = []
for q in table:
qq = q
while (len(qq)<maxlen):
qq += " "
table2 += [qq+" |"]
return table2
def do_lat(lat):
"""returns string for latitude
"""
if lat > 0: return str(lat)+"N"
if lat == 0: return "E"
return str(-lat)+"S"
def replacer(stringie, old, new):
"""
"""
name2=""
for q in stringie:
if q == old: name2 += new
else: name2 += q
return name2
def refbreak(ref):
"""
"""
return replacer(ref,";",";<BR/>")
##def (): ## """ ## """ ## return "() not implemented" ## ##def (): ## """ ## """ ## return "() not implemented"
#Item = ["Earth","Moon","Rima Diophantus","29.0","-33.0"," "," "," "," ","east","150.0","EU","Europe","GR","Greek","LTO39B2","LTO-39B2","5","Adopted by IAU","1985","0","null","RI","Rima, rimae","Named from nearby crater."] Item = ["Earth","Moon","Rima Cardanus","11.4","-71.5"," "," "," "," ","east","175.0","EU","Europe","IT","Italy","LOC-1","LOC-1","5","Adopted by IAU","1964","67","The System of Lunar Craters, Quadrants I, II, III, IV; by D. W. G. Arthur and others; Communications of the Lunar and Planetary Laboratory, vol. 2, no. 30, 1963; vol. 3, no. 40, 1964; vol. 3, no. 50, 1965; vol. 5, no. 70, 1966.","RI","Rima, rimae","Named from nearby crater."]
What=dostub(Item) for q in What: print q





