Lunarpedia talk:Autostub1 test 1

From Lunarpedia
Revision as of 22:51, 9 November 2006 by Bryce (talk | contribs)
Jump to: navigation, search

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)


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         = 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