Repository: BengbuGuards/StarLocator Branch: main Commit: c77b13043946 Files: 126 Total size: 677.5 KB Directory structure: gitextract__0euzy7k/ ├── .gitattributes ├── .github/ │ └── workflows/ │ └── format-check.yml ├── .gitignore ├── .prettierignore ├── .prettierrc ├── .python-version ├── LICENSE ├── NOTICE.md ├── README.md ├── docs/ │ ├── CONTRIBUTING.md │ └── INSTALLATION.md ├── eslint.config.mjs ├── examples/ │ └── image_coords.csv ├── package.json ├── pnpm-workspace.yaml ├── prototype/ │ ├── README.md │ ├── config.py │ ├── core/ │ │ ├── __init__.py │ │ ├── astro_coord/ │ │ │ ├── calc.py │ │ │ ├── data.py │ │ │ ├── remote.py │ │ │ ├── stellarium.COPYING │ │ │ └── utils.py │ │ ├── astrometry/ │ │ │ ├── client.py │ │ │ ├── extract.py │ │ │ └── solve.py │ │ ├── moon_time/ │ │ │ ├── calc.py │ │ │ └── utils.py │ │ ├── positioning/ │ │ │ ├── __init__.py │ │ │ ├── calc.py │ │ │ ├── find_z/ │ │ │ │ ├── README.md │ │ │ │ ├── benchmark.py │ │ │ │ ├── methods/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── bi_mean.py │ │ │ │ │ ├── fix_refraction.py │ │ │ │ │ ├── north_len.py │ │ │ │ │ └── trisect.py │ │ │ │ └── utils/ │ │ │ │ └── math.py │ │ │ ├── latitude/ │ │ │ │ ├── benchmark.py │ │ │ │ ├── constants.py │ │ │ │ ├── method/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── bisect_formular.py │ │ │ │ │ ├── bisect_tabular.py │ │ │ │ │ ├── naive.py │ │ │ │ │ ├── series.py │ │ │ │ │ └── series2.py │ │ │ │ ├── readme.md │ │ │ │ └── series_model.py │ │ │ ├── locator/ │ │ │ │ ├── README.md │ │ │ │ ├── benchmark.py │ │ │ │ ├── methods/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── bi_median.py │ │ │ │ │ └── matrix_inverse.py │ │ │ │ └── utils/ │ │ │ │ └── math.py │ │ │ └── top_point/ │ │ │ ├── README.md │ │ │ ├── __init__.py │ │ │ ├── benchmark.py │ │ │ ├── experiment.py │ │ │ ├── methods/ │ │ │ │ ├── __init__.py │ │ │ │ ├── least_square.py │ │ │ │ ├── matrix_inverse.py │ │ │ │ ├── matrix_inverse_normalized.py │ │ │ │ ├── median.py │ │ │ │ ├── median2.py │ │ │ │ ├── nearest_l2.py │ │ │ │ ├── optim.py │ │ │ │ ├── sphere.py │ │ │ │ └── square_weight.py │ │ │ └── utils/ │ │ │ └── plane.py │ │ └── stellarium/ │ │ ├── readme.md │ │ └── screenshot.py │ ├── main.py │ ├── requirements-dev.txt │ ├── requirements.txt │ ├── routers/ │ │ ├── __init__.py │ │ ├── astro_coord.py │ │ ├── astrometry.py │ │ ├── bmap.py │ │ ├── limiter.py │ │ ├── moon_time.py │ │ └── positioning.py │ ├── schemas/ │ │ ├── __init__.py │ │ ├── astro_coord.py │ │ ├── astrometry/ │ │ │ ├── extract_stars.py │ │ │ ├── recognize.py │ │ │ └── submit.py │ │ ├── base.py │ │ ├── moon_time.py │ │ └── positioning.py │ └── tests/ │ ├── __init__.py │ ├── test_astro_coord.py │ ├── test_astrometry/ │ │ ├── test_extract_stars.py │ │ ├── test_recognize.py │ │ └── test_submit.py │ ├── test_moon_time.py │ ├── test_positioning.py │ └── test_utils.py ├── pyproject.toml ├── src/ │ ├── config.js │ ├── css/ │ │ └── site.css │ ├── help.html │ ├── index.html │ ├── index.js │ └── interface/ │ ├── classes/ │ │ ├── EventManager.js │ │ ├── TouchEventAdapter.js │ │ └── interact.js │ ├── elements/ │ │ ├── Baseclass.js │ │ ├── CelestialBody.js │ │ ├── PlumbLine.js │ │ └── Rectangle.js │ ├── functions/ │ │ ├── AutoComplete.js │ │ ├── Calc.js │ │ ├── CeleCoord.js │ │ ├── CeleRecognition.js │ │ ├── Default.js │ │ ├── ImageChange.js │ │ ├── MoonTime.js │ │ ├── PickCele.js │ │ ├── PickPL.js │ │ └── SelectStars.js │ ├── init.js │ ├── starZH2EN.js │ └── utils.js ├── webpack.common.js ├── webpack.dev.js └── webpack.prod.js ================================================ FILE CONTENTS ================================================ ================================================ FILE: .gitattributes ================================================ # Auto detect text files and perform LF normalization * text=auto ================================================ FILE: .github/workflows/format-check.yml ================================================ name: Format Check on: pull_request: # 在每次提交 PR 时运行 branches: - main # 针对 main 分支运行 - dev # 针对 dev 分支运行 jobs: format-check: runs-on: ubuntu-latest steps: - name: Checkout repository uses: actions/checkout@v4 - name: Install pnpm 📦 uses: pnpm/action-setup@v4 with: version: "10" run_install: false - name: Install and Build 🔧 run: pnpm install --frozen-lockfile - name: lint run: pnpm run lintfix - name: format run: pnpm run format - name: Ensure no format changes run: | git diff --exit-code || (echo "Code formatting issues detected" && exit 1) ================================================ FILE: .gitignore ================================================ *.code-workspace .idea/ .vscode/ .DS_Store node_modules/ dist/ package-lock.json .pytest_cache/ __pycache__/ ================================================ FILE: .prettierignore ================================================ *.md *.json *.yml *.yaml *.html *.css node_modules/ ================================================ FILE: .prettierrc ================================================ { "semi": true, "trailingComma": "es5", "singleQuote": true, "printWidth": 120, "tabWidth": 4, "useTabs": false } ================================================ FILE: .python-version ================================================ 3.12 ================================================ FILE: LICENSE ================================================ GNU AFFERO GENERAL PUBLIC LICENSE Version 3, 19 November 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU Affero General Public License is a free, copyleft license for software and other kinds of works, specifically designed to ensure cooperation with the community in the case of network server software. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, our General Public Licenses are intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. Developers that use our General Public Licenses protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License which gives you legal permission to copy, distribute and/or modify the software. A secondary benefit of defending all users' freedom is that improvements made in alternate versions of the program, if they receive widespread use, become available for other developers to incorporate. Many developers of free software are heartened and encouraged by the resulting cooperation. However, in the case of software used on network servers, this result may fail to come about. The GNU General Public License permits making a modified version and letting the public access it on a server without ever releasing its source code to the public. The GNU Affero General Public License is designed specifically to ensure that, in such cases, the modified source code becomes available to the community. It requires the operator of a network server to provide the source code of the modified version running there to the users of that server. Therefore, public use of a modified version, on a publicly accessible server, gives the public access to the source code of the modified version. An older license, called the Affero General Public License and published by Affero, was designed to accomplish similar goals. This is a different license, not a version of the Affero GPL, but Affero has released a new version of the Affero GPL which permits relicensing under this license. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU Affero General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Remote Network Interaction; Use with the GNU General Public License. Notwithstanding any other provision of this License, if you modify the Program, your modified version must prominently offer all users interacting with it remotely through a computer network (if your version supports such interaction) an opportunity to receive the Corresponding Source of your version by providing access to the Corresponding Source from a network server at no charge, through some standard or customary means of facilitating copying of software. This Corresponding Source shall include the Corresponding Source for any work covered by version 3 of the GNU General Public License that is incorporated pursuant to the following paragraph. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the work with which it is combined will remain governed by version 3 of the GNU General Public License. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU Affero General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU Affero General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU Affero General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU Affero General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. StarLocator - A web program for photo positioning based on stars Copyright (C) 2024 BengbuGuards, Hiroshi1993, cheanus, zhdbk3, 薛定谔的按钮, hanran, Charmian This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If your software can interact with users remotely through a computer network, you should also make sure that it provides a way for users to get its source. For example, if your program is a web application, its interface could display a "Source" link that leads users to an archive of the code. There are many ways you could offer source, and different solutions will be better for different programs; see section 13 for the specific requirements. You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU AGPL, see . ================================================ FILE: NOTICE.md ================================================ This project uses the following open source projects and follows their respective license terms: frontend: - [Fabric](https://github.com/fabric/fabric):Custom License - [fuzzysort](https://github.com/farzher/fuzzysort): MIT License backend: - [numpy](https://numpy.org/): Custom License - [scipy](https://scipy.org/): BSD 3-Clause License - [fastapi](https://fastapi.tiangolo.com/): MIT License - [uvicorn](https://www.uvicorn.org/): BSD 3-Clause license - [python-multipart](https://github.com/Kludex/python-multipart): Apache-2.0 License - [astronomy-engine](https://github.com/astronomy/astronomy):MIT License - [httpx](https://github.com/projectdiscovery/httpx): MIT License - [async-lru](https://github.com/aio-libs/async-lru): MIT License - [slowapi](https://github.com/laurents/slowapi): MIT License - [sep](http://github.com/kbarbary/sep): LGPL-3.0 License - [astropy](https://www.astropy.org/): BSD 3-Clause License - [astrometry.net](https://astrometry.net): Custom License. The [client.py](./prototype/core/star_recognition/client.py) file of this project contains some content from astrometry and has been modified based on it, mainly integrating the star recognition function. data: - [SIMBAD](https://simbad.u-strasbg.fr/simbad/): This project has made use of the SIMBAD database, operated at CDS, Strasbourg, France - [stellarium](https://github.com/Stellarium/stellarium): GPL-2.0 license. The [data.py](./prototype/core/astro_coord/data.py) and [starZH2EN.js](./src/interface/starZH2EN.js) files of this project contains some content from stellarium and has been modified based on it, mainly integrating the Chinese and English star name tables. ================================================ FILE: README.md ================================================ # StarLocator 💬加入StarLocator交流群 | 🌎最新版链接 | ℹ️使用帮助 > StarLocator 是什么 | WHAT IS STARLOCATOR StarLocator是一款天文定位应用,主要基于一种已经应用了数个世纪的航海导航技术。该应用使用夜空照片及其精确拍摄时间为源数据,计算照片拍摄地在地球上的大致位置。该过程类似以相机对图中的天体高度角进行测量代替17世纪以来的水手使用六分仪的测量,与占星术、玄学和心灵感应无关。 StarLocator is a celestial positioning application mainly based on a maritime navigation technique that has been applied for centuries. In this app, a photo of night sky and the exact time when it was taken were used as source information to calculate the rough position of the photo taker was on the earth. The process is quite like using the camera as a sextant to measure the elevation of celestial bodies in the image just as sailors did since 17th century, and there is NOTHING to do with astrology, metaphysics and telepathy. [![Star History Chart](https://api.star-history.com/svg?repos=BengbuGuards/StarLocator&type=Timeline)](https://star-history.com/#BengbuGuards/StarLocator&Timeline) ## 特点 | FEATURES - ✨**自动识星**:通过拍摄的星空照片,自动识别照片中的星星,无需手动辨识。 - 😀**交互简单**:标星、标铅垂线、设置拍摄时间,然后就是点击按钮的事了,熟练掌握后整个过程不到**5分钟**。原本的耗时步骤,如查询天体天文数据,已被API和按钮所实现。 - 🔒**隐私友好**:项目采用前后端分离架构,服务器后端只在核心计算时获取必要信息,并在结束计算后删除。 - 🎯**精度良好**:我们在各个模块中采用了强稳健性的算法,对环境噪声、标记误差有良好的抗噪能力,误差通常可稳定在**30km**以下。 - ✅**完全开源**:我们使用AGPL v3开源,目的是为尽可能地使该方法透明,同时欢迎社区共建。 - ✨**Automatic star recognition**: By capturing starry sky photos, stars in the photos can be automatically recognized without the need for manual recognition. - 😀**Simple interaction**: Marking stars and plumblines, setting the time and then simply click a button. Can finish within **5 minutes** when familiar. All time-consuming steps, like searching for data of celestial bodies, have been achieved with API and buttons. - 🔒**Privacy friendly**: The project adopts a front-end and back-end separation architecture, where the server backend only retrieves necessary information during core computing and deletes it after the computation is completed. - 🎯**Good accuracy**: We applied robust algorithms in modules, making it resilient to environmental noises and marking errors. The error can usually be limited to **30km**. - ✅**Fully open sourced**: AGPL v3 open source protocol adopted. Aiming to make the approach as transparent as possible and to welcome community contributions. ## 安装 | INSTALLATION 见[INSTALLATION.md](./docs/INSTALLATION.md) ## 使用方法 | HOW TO USE 见使用帮助 ## 贡献 | CONTRIBUTING 见[CONTRIBUTING.md](./docs/CONTRIBUTING.md) ## 致谢 | CREDITS ### 开源项目 | OPEN SOURCE PROJECTS 见[NOTICE.md](./NOTICE.md) ### 开发团队 | DEVELOPERS 按加入时间排序 - 小流汗黄豆 | BengbuGuards - 鬼蝉 | Hiroshi1993 - 无限远点的辩证法 | cheanus - 着火的冰块nya | zhdbk3 - 薛定谔的按钮 - hanran - Charmian - Yisan5772156 ================================================ FILE: docs/CONTRIBUTING.md ================================================ # 如何贡献本项目 ## 实时交流、闲聊 or 长期贡献 建议加入我们的QQ群:[**StarLocator交流群**](https://qm.qq.com/q/nlFqV4jVfO),在群里你可以得到关于本项目的**最新消息**,参与**长期贡献**,或者让我们帮你解决本项目相关的任何**问题**,包括和群友们**闲聊**! *你甚至可以让我们帮你认识照片上的星星⭐* ## 发现bug? 1. 请先在 [Issues](https://github.com/BengbuGuards/StarLocator/issues) 中搜索是否有人已经提出了相同的问题。 2. 如果没有,请新建一个 Issue,描述清楚你遇到的问题,我们非常希望你能提供尽可能详细的信息,例如: - 详细的问题描述 - 操作系统(Windows/Linux/MacOS/Android/iOS) - 你的浏览器类型及其版本(Chrome/Firefox/Safari/Edge) - 按下F12,打开DevTools,显示Console中的报错信息 - 复现步骤 ## 提交代码 如果你想为本项目贡献代码,你可以按照以下步骤进行: 1. Fork 本项目,切换到dev分支(我们的主要开发分支)。 2. 为你的提交创建一个新的分支。 3. 在新分支上进行你的修改。 4. 提交你的修改,并新建一个 Pull Request。 5. 等待我们的 Review。 请尽可能规范你的代码,例如: - 使用`pnpm format`格式化你的代码 - 使用eslint检查并修复你的代码,例如使用命令`pnpm lintfix` - 尽可能添加详细注释,因为你的代码可能会被其他人阅读和修改 - 为变量名、函数名等添加有意义的名字 ## 最后 我们诚挚地欢迎你的贡献! ================================================ FILE: docs/INSTALLATION.md ================================================ # 安装 1. 克隆仓库,安装Node.js、pnpm和Python(版本尽量较新)。 2. 前端构建 自定义前端配置文件[config.js](../src/config.js)。其中,百度地图API key申请见[百度地图开放平台](https://lbsyun.baidu.com/),Astrometry.net API key申请见[Astrometry.net](https://nova.astrometry.net/api_help)。 安装依赖: ```bash pnpm install ``` 构建前端: ```bash pnpm build ``` 运行前端: ```bash pnpm serve ``` 前端已在`http://localhost:6974`运行。 (Optional)如果你想在开发模式下运行项目,可以使用 ```bash pnpm dev ``` 3. 后端构建 进入`prototype`目录: ```bash cd prototype ``` 自定义后端配置文件[config.py](../prototype/config.py)。 **注意:** 本项目的地图显示功能由百度地图API提供,在`config.py`中填写百度地图API的AK后可正常使用,使用时请注意百度地图API的使用条款。此外也可不填写AK,最终计算结果将以文本形式显示。 新建虚拟环境: ```bash conda create -n starlocator conda activate starlocator ``` 安装依赖: ```bash pip install -r requirements.txt ``` (Optional)安装开发依赖: ```bash pip install -r requirements-dev.txt ``` 运行后端: ```bash python main.py ``` 后端已在`http://localhost:6975`运行。 ================================================ FILE: eslint.config.mjs ================================================ import globals from 'globals'; import pluginJs from '@eslint/js'; import prettierPlugin from 'eslint-plugin-prettier'; import prettierConfig from 'eslint-config-prettier'; export default [ { ignores: ['dist/'], }, { languageOptions: { globals: globals.browser, }, plugins: { prettier: prettierPlugin, }, rules: { ...prettierConfig.rules, 'prettier/prettier': 'error', }, }, pluginJs.configs.recommended, prettierConfig, ]; ================================================ FILE: examples/image_coords.csv ================================================ 478.34,269.082 2346.32,608.375 2585.44,661.47 2115.17,1160.88 1956.64,1741.5 2926.1,352.348 1641.82,1688.24 2656.49,1047.16 1857.68,1642.87 1944.03,1771.55 2548.21,811.345 1800.26,1588.15 2384.24,1172.82 2349.49,1368.01 1273,1719.53 962.393,1750.06 2480.19,509.987 1969.51,1564.65 1983.36,1251.26 915.162,1744.99 1466.91,1203.06 1258.82,1413.02 672.213,1685.7 2940.92,1222.72 2933.61,549.482 1653.75,511.518 2096.31,1518.75 2882.1,447.267 1848.01,643.511 1293.78,1205.3 2466.59,1333.23 2355.67,1837.05 2713.29,1809.44 35.3399,701.494 2023.67,925.331 1875.74,1705.86 432.494,1580.5 2494.76,1593.51 2399.22,1375.47 1802.91,1560.76 1300.96,1645.96 1764,660 511.52,1130.51 1659.53,1109.51 2553.93,1195.34 2750.29,1430.13 1485,1779 2269.42,1572.67 1622.3,782.654 1480.82,1357.61 2357.8,1450.6 2872,1655 ================================================ FILE: package.json ================================================ { "name": "starlocator", "version": "2.1.0", "description": "", "private": true, "scripts": { "test": "echo \"Error: no test specified\" && exit 1", "build": "webpack --config webpack.prod.js", "dev": "webpack-dev-server --config webpack.dev.js", "serve": "http-server ./dist -p 6974 -s", "lintfix": "eslint . --fix", "format": "prettier --write '**/*.js'" }, "keywords": [], "author": "", "license": "AGPL-3.0-only", "dependencies": { "fabric": "^6.4.3", "fuzzysort": "^3.1.0" }, "devDependencies": { "@eslint/js": "^9.13.0", "css-loader": "^7.1.2", "css-minimizer-webpack-plugin": "^7.0.0", "eslint": "^9.13.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-prettier": "^5.2.1", "globals": "^15.11.0", "handlebars": "^4.7.8", "html-loader": "^5.1.0", "html-webpack-plugin": "^5.6.3", "http-server": "^14.1.1", "mini-css-extract-plugin": "^2.9.2", "prettier": "^3.3.3", "style-loader": "^4.0.0", "webpack": "^5.95.0", "webpack-cli": "^5.1.4", "webpack-dev-server": "^5.1.0" } } ================================================ FILE: pnpm-workspace.yaml ================================================ onlyBuiltDependencies: - canvas ================================================ FILE: prototype/README.md ================================================ # 后端 ## 安装 1. 命令行进入本文件夹 2. 安装依赖 ```bash pip install -r requirements.txt ``` ## 后端 ### 运行 1. 进入本文件夹 2. 自定义config.py中的配置 3. 运行 ```bash python main.py ``` 开发时可使用reload模式 ```bash uvicorn main:app --port 6975 --reload ``` ## 单元测试 ### 结构 - core - Find_z: 焦距计算 - stellarium: 生成星图以供算法测试 - top_point: 灭点计算 - routers: FastAPI的路由 - schemas: FastAPI的数据模型 - tests: 单元测试 - main.py: FastAPI的入口 - config.py: 配置文件 - requirements.txt: 依赖 ### 运行 尽量写好单元测试。单元测试的运行方式是进入本文件夹,运行 ```bash pytest tests ``` 注意需先启动后端。 ================================================ FILE: prototype/config.py ================================================ # 前端服务的基础URL FRONTEND_BASEURL = "http://localhost:6974" # 后端服务的基础URL BACKEND_BASEURL = "http://localhost:6975" BACKEND_API_BASEURL = BACKEND_BASEURL + "/api" # 缓存天体坐标的数量 CACHE_SIZE = 1000 # 远程异步请求最大并发数 MAX_CONNECTIONS = 5 # 一次请求最多处理的天体数量 MAX_NUM_OF_STARS = 20 # 一次请求最多处理的直线数量 MAX_NUM_OF_LINES = 20 # 标月定时的最大时间搜索范围(天) MAX_MOON_SEARCH_RANGE = 365 ### 限制上传图片的大小 MAX_UPLOAD_SIZE = 10 * 1024 * 1024 # 日志等级:debug, info, warning, error, critical LOG_LEVEL = "info" # API_KEY ## 百度地图 JS API KEY BMAP_API_KEY = "******" ## astrometry API_KEY ASTROMETRY_API_KEY = "******" # 网络请求是否限流 RATE_LIMIT = False ## 只提供代理的,没有较大的并发需求,不限流 ## 轻量:存在少量的计算资源消耗 LIGHT_RATE_LIMIT = "5/second" ## 中等:存在一定的计算资源消耗,且有一定的并发需求 MEDIUM_RATE_LIMIT = "1/3second" ## 重度:存在较大的计算资源消耗,或且有较大的并发需求 HEAVY_RATE_LIMIT = "1/6second" # CORS CORS_ALLOW_ORIGIN = [ FRONTEND_BASEURL, BACKEND_BASEURL, "https://api.map.baidu.com", ] ================================================ FILE: prototype/core/__init__.py ================================================ ================================================ FILE: prototype/core/astro_coord/calc.py ================================================ import asyncio import astronomy as ast from .data import starZH2EN, solar_bodies from .remote import get_RaDecs_by_names from .utils import stamp2ast_time def get_HaDec_by_RaDec( raDec: tuple[float | None, float | None], date: ast.Time, observer: ast.Observer = ast.Observer(0, 0, 0), ) -> tuple[float | None, float | None]: """ 根据J2000赤经赤纬获取时角和赤纬 Params: raDec: 赤经赤纬J2000 date: 日期 observer: 观测者地理坐标 Returns: haDec: 时角和赤纬(角度) """ if raDec[0] is None or raDec[1] is None: return (None, None) ast.DefineStar(ast.Body.Star1, raDec[0], raDec[1], 1000) equ_ofdate = ast.Equator(ast.Body.Star1, date, observer, True, True) hour_angle = ast.HourAngle(ast.Body.Star1, date, observer) return (hour_angle, equ_ofdate.dec) def get_HaDec_in_solar( star_name: str, date: ast.Time, observer: ast.Observer = ast.Observer(0, 0, 0) ) -> tuple[float | None, float | None]: """ 根据太阳系天体名称和日期获取其时角和赤纬 Params: starName: 天体名称 date: 日期 observer: 观察者地理坐标 Returns: haDec: 时角和赤纬(角度) """ # 将name第一个字母大写,其他字母小写 star_name = star_name.capitalize() star_body = getattr(ast.Body, star_name) equ_ofdate = ast.Equator(star_body, date, observer, True, True) hour_angle = ast.HourAngle(star_body, date, observer) return (hour_angle, equ_ofdate.dec) def get_HaDecs_by_names( star_names: list[str], timestamp: float, observer: ast.Observer = ast.Observer(0, 0, 0), ) -> tuple[dict[str, tuple[float | None, float | None]], str]: """ 根据恒星名称数组获取其时角和赤纬 Params: star_names: 恒星名称数组 timestamp: 时间戳 observer: 观察者地理坐标 Returns: haDec: 时角和赤纬字典(角度) is_success: 是否成功获取恒星赤经赤纬 """ ha_desc = dict() # 时角和赤纬数组(角度) fixed_star_names = dict() # 太阳系外要查询的恒星名(查询名: 操作名) solar_star_names = dict() # 太阳系内要查询的天体名(查询名: 操作名) detail = "success" # 是否成功获取恒星赤经赤纬 ast_time = stamp2ast_time(timestamp) for star_name in star_names: operate_name = star_name # 如果匹配到汉英对照星表,则转换为英文名 if operate_name in starZH2EN: operate_name = starZH2EN[operate_name] operate_name = operate_name.lower() if operate_name in solar_bodies: solar_star_names[star_name] = operate_name else: fixed_star_names[star_name] = operate_name # 异步获取恒星的赤经和赤纬 ra_decs = asyncio.run(get_RaDecs_by_names(list(fixed_star_names.values()))) # 同步计算天体的时角和赤纬 # 计算太阳系外天体的时角和赤纬 for star_name in fixed_star_names.keys(): ha_desc[star_name] = get_HaDec_by_RaDec( ra_decs[fixed_star_names[star_name]], ast_time, observer ) # 计算太阳系内天体的时角和赤纬 for star_name, operate_name in solar_star_names.items(): ha_desc[star_name] = get_HaDec_in_solar(operate_name, ast_time, observer) # 检查是否成功获取恒星赤经赤纬 for star_name in star_names: if ha_desc[star_name][0] is None or ha_desc[star_name][1] is None: detail = "fail" break return ha_desc, detail ================================================ FILE: prototype/core/astro_coord/data.py ================================================ solar_bodies = [ "sun", "moon", "mercury", "venus", "mars", "jupiter", "saturn", "uranus", "neptune", "pluto", ] solar_body_mags = { "sun": -26.74, "moon": -3.27, "mercury": -1.62, "venus": -3.91, "mars": 0.44, "jupiter": -2.47, "saturn": 0.66, "uranus": 5.69, "neptune": 7.69, "pluto": 14.42, } starZH2EN = { "太阳": "sun", "日": "sun", "月球": "moon", "月": "moon", "月亮": "moon", "水星": "mercury", "金星": "venus", "火星": "mars", "木星": "jupiter", "土星": "saturn", "天王星": "uranus", "海王星": "neptune", "冥王星": "pluto", "垒壁阵十": "29 psc", "垒壁阵十二": "30 psc", "壁宿增五": "85 peg", "土公增一": "31 psc", "土公一": "c psc", "八魁二": "2 cet", "王良增三": "9 cas", "八魁四": "3 cet", "垒壁阵十一": "33 psc", "壁宿增十": "86 peg", "王良增二": "10 cas", "垒壁阵增六": "4 cet", "垒壁阵增七": "5 cet", "壁宿二": "alf and", "壁宿增十八": "87 peg", "王良一": "bet cas", "火鸟四": "eps phe", "土公增二": "34 psc", "螣蛇增十九": "22 and", "螣蛇增十一": "22 and", "八魁一": "6 cet", "壁宿一": "gam peg", "天厩增一": "23 and", "壁宿增十九": "chi peg", "八魁六": "7 cet", "土公增三": "35 psc", "土公增四": "36 psc", "壁宿增十一": "37 psc", "天厩一": "tet and", "壁宿增十七": "39 psc", "天厩三": "sig and", "天仓一": "iot cet", "壁宿增十六": "40 psc", "鸟喙六": "zet tuc", "土公增五": "d psc", "天厩二": "rho and", "壁宿增十二": "42 psc", "八魁五": "9 cet", "壁宿增十三": "43 psc", "王良增四": "12 cas", "土公增七": "44 psc", "蛇尾一": "bet hyi", "土公二": "45 psc", "火鸟五": "kap phe", "火鸟六": "alf phe", "土公增八": "10 cet", "壁宿增廿一": "46 psc", "壁宿增廿": "47 psc", "壁宿增十五": "48 psc", "土公增九": "11 cet", "天溷增一": "12 cet", "奎宿增一": "28 and", "壁宿增十四": "49 psc", "火鸟八": "lam1 phe", "传舍增一": "13 cas", "鸟喙四": "bet1 tuc", "王良五": "lam cas", "土公增六": "51 psc", "壁宿增廿二": "52 psc", "壁宿增廿三": "52 psc", "王良二": "kap cas", "传舍二": "16 cas", "天溷增二": "13 cet", "土公增十": "14 cet", "奎宿六": "pi. and", "附路": "zet cas", "土公增十一": "15 cet", "奎宿四": "eps and", "奎宿五": "del and", "奎宿增三": "54 psc", "奎宿增二": "55 psc", "王良四": "alf cas", "奎宿增廿二": "32 and", "火鸟七": "mu. phe", "阁道增二": "ksi cas", "鸟喙五": "rho tuc", "水委三": "eta phe", "阁道增一": "pi. cas", "土司空": "bet cet", "天溷四": "phi1 cet", "阁道六": "omi cas", "天溷三": "18 cet", "少丞增一": "21 cas", "奎宿增四": "59 psc", "奎宿二": "zet and", "外屏增九": "60 psc", "少丞": "23 cas", "紫微左垣八": "23 cas", "外屏增八": "62 psc", "外屏一": "del psc", "阁道五": "nu. cas", "奎宿增五": "64 psc", "王良三": "eta cas", "奎宿七": "nu. and", "奎宿三": "i psc", "天溷增六": "phi2 cet", "天溷增三": "20 cet", "天溷一": "21 cet", "奎宿增六": "66 psc", "奎宿增九": "36 and", "奎宿增十": "k psc", "天溷二": "phi3 cet", "王良增五": "ups2 cas", "策": "gam cas", "奎宿八": "mu. and", "奎宿一": "eta and", "奎宿增十一": "h psc", "天溷增五": "phi4 cet", "外屏增七": "70 psc", "奎宿增十五": "sig psc", "奎宿增廿": "39 and", "外屏二": "eps psc", "天溷增四": "25 cet", "外屏增十": "26 cet", "外屏增六": "73 psc", "外屏增一": "72 psc", "天仓增十四": "27 cet", "奎宿十六": "psi1 psc", "外屏增五": "77 psc", "天仓增十三": "28 cet", "火鸟九": "bet phe", "奎宿十": "76 psc", "外屏增二": "75 psc", "天仓增十二": "30 cet", "奎宿增八": "psi2 psc", "外屏增十一": "29 cet", "奎宿增十九": "41 and", "奎宿增十四": "78 psc", "外屏增四": "e psc", "水委二": "zet phe", "天仓二": "eta cet", "勾陈五": "2 umi", "军南门": "phi and", "奎宿九": "bet and", "奎宿增七": "psi3 psc", "天仓增十一": "32 cet", "奎宿增十八": "44 and", "外屏增十二": "33 cet", "华盖四": "31 cas", "阁道四": "tet cas", "奎宿增十三": "g psc", "奎宿增十六": "45 and", "奎宿十五": "chi psc", "奎宿十一": "tau psc", "传舍四": "32 cas", "天仓增四": "34 cet", "外屏增十三": "35 cet", "天仓增十": "36 cet", "外屏三": "zet psc", "奎宿十四": "phi psc", "天仓增九": "37 cet", "外屏增三": "88 psc", "天仓增三": "38 cet", "华盖三": "hip 5926", "天仓增六": "39 cet", "天仓增五": "40 cet", "天仓增八": "41 cet", "外屏增十四": "f psc", "奎宿十三": "ups psc", "奎宿增廿三": "ups psc", "天仓增二": "42 cet", "阁道增三": "phi cas", "奎宿十二": "l psc", "天大将军增二": "ksi and", "天大将军增一": "ksi and", "天仓增一": "43 cet", "奎宿增十七": "47 and", "天仓三": "tet cet", "天仓增七": "44 cet", "天仓增十五": "46 cet", "阁道三": "del cas", "华盖五": "psi cas", "右更一": "rho psc", "右更增一": "94 psc", "天仓增十六": "47 cet", "天大将军增三": "ome and", "火鸟十": "gam phe", "𫓧锧一": "48 cet", "天大将军四": "49 and", "外屏四": "mu. psc", "杠九": "38 cas", "天园一": "del phe", "右更二": "eta psc", "阁道增四": "chi cas", "天仓增十八": "49 cet", "右更增四": "100 psc", "右更增二": "101 psc", "天仓增十七": "50 cet", "天大将军六": "ups and", "右更三": "pi. psc", "水委一": "alf eri", "天大将军三": "51 and", "华盖二": "40 cas", "右更五": "104 psc", "天大将军五": "chi and", "天大将军七": "tau and", "天大将军增四": "tau and", "外屏五": "nu. psc", "奎宿增十二": "1 tri", "华盖六": "43 cas", "娄宿增三": "107 psc", "杠八": "42 cas", "阁道增五": "44 cas", "天大将军二": "phi per", "天仓五": "tau cet", "右更四": "omi psc", "娄宿增二": "3 ari", "天仓增廿一": "chi cet", "右更增三": "54 cet", "天仓四": "zet cet", "大陵增四": "1 per", "天大将军增十六": "2 per", "娄宿增六": "alf tri", "天大将军增十一": "55 and", "娄宿二": "gam1 ari", "外屏六": "ksi psc", "阁道二": "eps cas", "娄宿一": "bet ari", "蛇腹四": "eta2 hyi", "天园二": "chi eri", "华盖七": "ome cas", "天大将军八": "56 and", "𫓧锧五": "56 cet", "娄宿增一": "iot ari", "娄宿增五": "lam ari", "天囷增二": "58 cet", "天大将军增十五": "3 per", "蛇首一": "alf hyi", "天仓六": "57 cet", "𫓧锧四": "ups cet", "外屏增十五": "112 psc", "杠七": "a cas", "外屏七": "alf psc", "大陵增五": "g per", "天大将军增五": "eps tri", "天囷增四": "60 cet", "杠五": "50 cas", "娄宿增七": "10 ari", "天囷增三": "61 cet", "天大将军一": "gam1 and", "天庾一": "nu. for", "五帝内座二": "47 cas", "五帝内座增一": "47 cas", "杠三": "49 cas", "杠四": "51 cas", "娄宿增十一": "kap ari", "娄宿增八": "11 ari", "娄宿三": "alf ari", "天大将军增九": "58 and", "杠六": "54 cas", "天囷增一": "62 cet", "娄宿增九": "14 ari", "天大将军九": "bet tri", "娄宿增十四": "15 ari", "天大将军增十": "59 and", "天囷增六": "64 cet", "大陵增三": "h per", "天囷十二": "63 cet", "天大将军增六": "iot tri", "天囷十三": "66 cet", "娄宿增十二": "eta ari", "天囷五": "ksi1 cet", "娄宿增十五": "19 ari", "天大将军增十二": "b and", "大陵增六": "6 per", "传舍五": "55 cas", "娄宿增十": "20 ari", "天大将军增七": "7 tri", "天园三": "phi eri", "刍藁三": "67 cet", "天大将军十一": "del tri", "天大将军十": "gam tri", "大陵增二": "8 per", "大陵增一": "chi per", "娄宿增十三": "tet ari", "胃宿增一": "10 tri", "天大将军增十三": "c and", "刍藁增二": "omi cet", "大陵增七": "63 and", "蛇腹三": "del hyi", "天囷增五": "69 cet", "天囷十一": "70 cet", "大陵一": "i per", "大陵增八": "64 and", "天囷增七": "ksi ari", "刍藁四": "71 cet", "大陵增九": "65 and", "刍藁一": "rho cet", "天园四": "kap eri", "大陵增十": "66 and", "天囷六": "ksi2 cet", "胃宿增二": "12 tri", "阁道一": "iot cas", "左更增一": "26 ari", "北极星": "alf umi", "勾陈一": "alf umi", "天苑增九": "sig cet", "天大将军增八": "14 tri", "天大将军增十七": "14 tri", "天囷十": "75 cet", "天庾二": "ome for", "刍藁二": "77 cet", "刍藁增三": "79 cet", "天囷七": "nu. cet", "刍藁增五": "80 cet", "天囷增八": "31 ari", "刍藁增四": "81 cet", "左更一": "nu. ari", "天囷九": "del cet", "刍藁六": "eps cet", "蛇腹二": "eps hyi", "天园五": "s eri", "天园增一": "iot eri", "胃宿增五": "33 ari", "天囷增廿": "84 cet", "大陵八": "12 per", "左更二": "mu. ari", "天囷增九": "85 cet", "天囷八": "gam cet", "胃宿一": "35 ari", "大陵增十四": "14 per", "天苑七": "pi. cet", "大陵增十三": "tet per", "左更三": "omi ari", "天囷四": "mu. cet", "天苑八": "tau1 eri", "天苑增八": "tau1 eri", "蛇腹一": "zet hyi", "胃宿二": "39 ari", "左更增二": "40 ari", "天庾三": "bet for", "左更五": "pi. ari", "胃宿三": "c ari", "附白二": "nu. hyi", "大陵七": "16 per", "天船一": "eta per", "天苑九": "tau2 eri", "左更四": "sig ari", "大陵增十六": "17 per", "大陵增十五": "20 per", "大陵二": "tau per", "大陵增十一": "tau per", "左更增三": "rho1 ari", "左更增五": "rho2 ari", "传舍六": "hd 223274", "天苑六": "eta eri", "左更增四": "rho ari", "胃宿增三": "21 per", "天苑增六": "4 eri", "左更增六": "47 ari", "天苑增五": "6 eri", "天园六": "tet1 eri", "左更增七": "eps ari", "天囷增十九": "5 eri", "天囷三": "lam cet", "天囷增十八": "7 eri", "天苑增十": "rho1 eri", "天囷一": "alf cet", "天囷增十": "93 cet", "天苑十": "tau3 eri", "天苑增十一": "rho2 eri", "天苑增十二": "rho3 eri", "天船二": "gam per", "大陵六": "rho per", "胃宿增四": "52 ari", "五帝内座一": "hip 14417", "大陵五": "bet per", "天阴增一": "54 ari", "大陵三": "iot per", "大陵四": "kap per", "大陵增廿一": "ome per", "大陵增十八": "ome per", "天阴四": "del ari", "天阴增六": "del ari", "天苑增三": "alf for", "天苑增十七": "alf for", "天苑增四": "alf for", "天囷增十七": "94 cet", "天阴二": "zet ari", "天苑五": "zet eri", "天苑增十三": "14 eri", "大陵增廿": "30 per", "天苑增二": "15 eri", "天囷增十六": "95 cet", "天船增一": "29 per", "天船增二": "31 per", "天囷增十一": "kap1 cet", "天苑十一": "tau4 eri", "天园增三": "e eri", "紫微右垣七": "bk cam", "五帝内座四": "47 cas", "天囷二": "kap2 cet", "大陵增十九": "l per", "天阿": "62 ari", "天阴三": "tau2 ari", "天阴增二": "64 ari", "天船三": "alf per", "天廪四": "omi tau", "天廪三": "ksi tau", "天阴五": "66 ari", "传舍七": "cs cam", "天船增三": "34 per", "传舍九": "ce cam", "天廪二": "s tau", "天廪增三": "s tau", "天船增四": "sig per", "天苑增十四": "v eri", "天廪一": "f tau", "天船增五": "36 per", "天廪增一": "t tau", "天苑四": "eps eri", "天苑十二": "tau5 eri", "昴宿增二": "7 tau", "卷舌增一": "ix per", "天苑增一": "20 eri", "天船四": "psi per", "天囷增廿一": "v711 tau", "天囷增十五": "10 tau", "昴宿增三": "9 tau", "天园增四": "y eri", "天苑增十五": "21 eri", "天囷增十二": "12 tau", "天苑增十六": "22 eri", "昴宿增一": "11 tau", "天阴增三": "13 tau", "卷舌六": "o per", "天园七": "h eri", "天船五": "del per", "天苑三": "del eri", "天阴增四": "14 tau", "蛇首二": "bet ret", "卷舌五": "omi per", "卷舌增七": "omi per", "天囷增十四": "24 eri", "昴宿增九": "16 tau", "昴宿一": "17 tau", "天囷增十三": "25 eri", "昴宿增八": "18 tau", "卷舌一": "nu. per", "昴宿二": "q tau", "天廪增二": "u tau", "昴宿四": "20 tau", "昴宿三": "21 tau", "上丞增二": "hip 17587", "天苑二": "pi. eri", "昴宿五": "23 tau", "天苑十三": "tau6 eri", "附白一": "gam hyi", "昴宿六": "eta tau", "天苑十四": "tau7 eri", "毕宿增一": "e tau", "天园八": "f eri", "昴宿增十一": "26 tau", "昴宿七": "27 tau", "昴宿增十二": "28 tau", "天园九": "g eri", "天谗": "n per", "杠一": "gam cam", "毕宿增二": "31 tau", "九州殊口增三": "29 eri", "九州殊口增四": "30 eri", "九州殊口增五": "30 eri", "天园增五": "i eri", "天苑十五": "tau8 eri", "卷舌四": "zet per", "九州殊口增二": "w eri", "昴宿增五": "32 tau", "传舍增二": "16 cas", "卷舌二": "eps per", "天苑一": "gam eri", "卷舌三": "ksi per", "天苑十六": "tau9 eri", "毕宿八": "lam tau", "九州殊口增一": "35 eri", "毕宿增三": "nu. tau", "毕宿增四": "40 tau", "月(室宿)": "a1 tau", "月增一": "a2 tau", "砺石一": "psi tau", "卷舌增四": "49 per", "卷舌增五": "50 per", "天船六": "c per", "天街增一": "ome1 tau", "五帝内座五": "hip 19461", "九州殊口增六": "37 eri", "砺石二": "p tau", "毕宿增五": "45 tau", "九州殊口二": "omi1 eri", "毕宿增六": "46 tau", "毕宿增十四": "46 tau", "毕宿增八": "47 tau", "天园增六": "alf hor", "九州殊口一": "a eri", "夹白二": "alf ret a", "卷舌增六": "f per", "天船七": "mu. per", "九州殊口增七": "omi2 eri", "九州殊口增十一": "omi2 eri", "毕宿增七": "mu. tau", "毕宿增九": "48 tau", "金鱼一": "gam dor", "天船九": "hip 19949", "天街二": "ome tau", "天园十": "ups4 eri", "天船增十": "b per", "毕宿四": "gam tau", "天节三": "h tau", "砺石四": "phi tau", "卷舌增三": "54 per", "毕宿增十": "58 tau", "少卫增一": "79 dra", "天船增六": "d per", "砺石三": "chi tau", "毕宿三": "del1 tau", "毕宿增十一": "63 tau", "九州殊口三": "ksi eri", "天节八": "r tau", "天园十一": "ups3 eri", "毕宿增十二": "del2 tau", "卷舌增二": "55 per", "天街增二": "kap1 tau", "天街一": "kap2 tau", "毕宿二": "del3 tau", "天街增三": "ups tau", "毕宿七": "71 tau", "天节一": "pi. tau", "天街增四": "72 tau", "九斿增一": "44 eri", "毕宿六": "tet1 tau", "毕宿一": "eps tau", "毕宿增十三": "tet2 tau", "天节四": "b tau", "毕宿增十五": "hip 21029", "毕宿增十六": "hip 21053", "毕宿增十七": "85 tau", "九斿增二": "45 eri", "天船增九": "1 cam", "五车增二": "m per", "天园十三": "ups1 eri", "天节二": "rho tau", "九州殊口增九": "46 eri", "金鱼二": "alf dor", "九州殊口增八": "47 eri", "天园十二": "ups2 eri", "天节七": "d tau", "毕宿五": "alf tau", "九州殊口四": "nu. eri", "五车增三": "e per", "九斿一": "49 eri", "九州殊口增十": "c eri", "附耳增二": "89 tau", "附耳增三": "89 tau", "天节五": "c tau", "九斿增四": "l eri", "附耳增一": "sig1 tau", "附耳": "sig2 tau", "附耳增四": "sig2 tau", "天船增七": "3 cam", "天船增八": "2 cam", "天节六": "93 tau a", "九斿八": "54 eri", "诸王六": "tau tau", "五车增一": "59 per", "诸王增一": "95 tau", "九州殊口六": "55 eri", "九州殊口五": "56 eri", "九斿二": "mu. eri", "九斿七": "58 eri", "八谷增一": "4 cam", "九斿增五": "59 eri", "参旗增一": "96 tau", "参旗六": "pi.3 ori", "五车增七": "1 aur", "九斿六": "60 eri", "参旗五": "pi.2 ori", "参旗七": "pi.4 ori", "天高二": "i tau", "参旗一": "omi1 ori", "五车增八": "2 aur", "九斿三": "ome eri", "参旗增十一": "5 ori", "紫微右垣六": "alf cam", "参旗八": "pi.5 ori", "参旗增十二": "pi.5 ori", "参旗三": "g ori", "参旗四": "pi.1 ori", "八谷增三": "5 cam", "参旗二": "omi2 ori", "九斿增三": "b eri", "八谷增二": "6 cam", "五车一": "iot aur", "八谷五": "7 cam", "诸王五": "99 tau", "诸王增二": "k tau", "参旗九": "pi.6 ori", "五车增六": "ome aur", "参旗增三": "101 tau", "九斿四": "63 eri", "九斿五": "64 eri", "五车增五": "5 aur", "五车增四": "6 aur", "玉井二": "psi eri", "九斿九": "1 lep", "天高一": "iot tau", "八谷增十四": "bet cam", "九斿增七": "hip 23554", "参旗增四": "11 ori", "屏二": "eps lep", "八谷七": "11 cam", "八谷增十三": "12 cam", "八谷六": "9 aur", "八谷增四": "9 aur", "玉井增一": "66 eri", "天高增一": "m tau", "参旗增八": "13 ori", "参旗增九": "13 ori", "天高增二": "l tau a", "玉井三": "bet eri", "参旗增十": "i ori", "天高增三": "105 tau", "诸王四": "103 tau", "玉井增二": "68 eri", "天高三": "107 tau", "玉井一": "lam eri", "参旗增七": "h ori", "参旗增五": "15 ori", "军井一": "iot lep", "屏一": "mu. lep", "军井二": "kap lep", "参宿增九": "rho ori", "天潢五": "mu. aur", "八谷四": "14 cam", "夹白一": "tet dor", "参宿七": "bet ori", "天潢三": "14 aur", "参旗增六": "18 ori", "五车二": "alf aur", "参宿增卅八": "tau ori", "玉井四": "tau ori", "天潢增一": "16 aur", "天潢增二": "17 aur", "咸池三": "lam aur", "参宿增八": "21 ori", "天高四": "n tau", "八谷增十二": "15 cam", "军井三": "lam lep", "军井四": "nu. lep", "天潢一": "19 aur", "参宿增卅九": "hip 25028", "参宿增五": "o ori", "咸池一": "rho aur", "六甲六": "k cam", "参宿增十": "m ori", "八谷增十一": "16 cam", "军井增一": "8 lep", "参宿增卅七": "e ori", "参宿增三": "eta ori", "参宿增四": "p ori", "天潢四": "sig aur", "参宿增六": "psi1 ori", "参宿增七": "psi1 ori", "参宿五": "gam ori", "天关增一": "113 tau", "五车五": "bet tau", "参宿增十一": "psi ori", "天高增四": "o tau", "天潢二": "phi aur", "厕二": "bet lep", "诸王三": "118 tau", "参宿增二": "31 ori", "咸池二": "hip 25810", "参宿增十三": "a ori", "厕增一": "10 lep", "丈人二": "eps col", "参宿增十二": "n1 ori", "参宿增卅六": "ups ori", "参宿三": "del ori", "八谷增十": "18 cam", "厕一": "alf lep", "金鱼三": "bet dor", "参宿增十四": "n2 ori", "觜宿二": "phi1 ori", "觜宿一": "lam ori", "伐增二": "tet1 ori", "伐二": "tet2 ori", "伐一": "c ori", "伐三": "iot ori", "诸王增三": "121 tau", "伐增一": "45 ori", "参宿二": "eps ori", "觜宿三": "phi2 ori", "八谷增十五": "19 cam", "天关": "zet tau", "参宿增一": "sig ori", "参宿增卅五": "d ori", "参宿增十五": "ome ori", "丈人一": "alf col", "诸王二": "125 tau", "八谷增十六": "21 cam", "参宿一": "zet ori", "天关增二": "126 tau", "厕增八": "12 lep", "厕增二": "12 lep", "参宿增十六": "b ori", "天关增六": "127 tau", "八谷增九": "24 cam", "八谷增十七": "23 cam", "厕三": "gam lep", "金鱼四": "del dor", "天关增三": "128 tau", "五车增十七": "omi aur", "屎": "mu. col", "八谷三": "26 cam", "天关增四": "129 tau", "八谷增八": "28 cam", "厕增七": "zet lep", "水府增二": "131 tau", "老人增四": "bet pic", "天关增五": "130 tau", "水府增一": "133 tau", "参宿六": "kap ori", "参宿增十七": "52 ori", "诸王增四": "132 tau", "水府增三": "135 tau", "八谷增七": "29 cam", "子二": "bet col", "厕四": "del lep", "参宿增卅四": "55 ori", "八谷增十八": "30 cam", "水府增四": "137 tau", "水府增五": "137 tau", "参宿增廿二": "56 ori", "子一": "lam col", "诸王一": "136 tau", "司怪四": "chi1 ori", "八谷二": "ksi aur", "八谷增六": "ksi aur", "司怪增三": "57 ori", "八谷八": "31 cam", "参宿四": "alf ori", "厕增六": "eta lep", "子增一": "gam col", "司怪一": "139 tau", "参宿增廿一": "59 ori", "参宿增卅三": "1 mon", "参宿增卅二": "2 mon", "老人增三": "eta col", "八谷一": "del aur", "五车三": "bet aur", "五车四": "tet aur", "八谷增五": "34 cam", "五车增十六": "pi. aur", "司怪增一": "140 tau", "五车增十五": "36 aur", "司怪增二": "141 tau", "参宿增卅一": "3 mon", "参宿增十八": "mu. ori", "五车增十": "38 aur", "司怪增四": "64 ori", "司怪三": "chi2 ori", "司怪二": "1 gem", "参宿增十九": "63 ori", "参宿增廿": "66 ori", "厕增四": "17 lep", "五车增十一": "39 aur", "厕增五": "tet lep", "五车增九": "40 aur", "孙二": "tet col", "水府一": "nu. ori", "厕增三": "19 lep", "参宿增卅": "4 mon", "金鱼五": "nu. dor", "八谷增十九": "37 cam", "五车增十四": "41 aur", "水府二": "ksi ori", "司怪增五": "68 ori", "水府四": "f1 ori", "司怪增六": "71 ori", "参宿增廿八": "gam mon", "钺": "eta gem", "井宿增一": "kap aur", "水府三": "f2 ori", "八谷增廿": "40 cam", "水府增六": "73 ori", "水府增七": "k ori", "孙一": "kap col", "钺增一": "9 gem", "水府增八": "l ori", "五车增十三": "42 aur", "参宿增廿九": "6 mon", "八谷增廿一": "1 lyn", "五车增十二": "43 aur", "上卫增二": "11 cep", "八谷增廿六": "2 lyn", "参宿增廿七": "7 mon", "孙增一": "zet cma", "八谷增卅四": "45 aur", "八谷增廿五": "4 lyn", "孙增三": "del col", "孙增四": "del col", "八谷增廿二": "3 lyn", "军市一": "bet cma", "井宿一": "mu. gem", "四渎四": "eps mon", "老人": "alf car", "座旗增一": "psi1 aur", "八谷增廿七": "5 lyn", "参宿增廿四": "9 mon", "四渎增五": "77 ori", "四渎增六": "78 ori", "参宿增廿五": "10 mon", "孙增二": "lam cma", "井宿增二": "48 aur", "参宿增廿六": "bet mon", "井宿二": "nu. gem", "座旗增二": "47 aur", "八谷增廿八": "6 lyn", "军市六": "ksi1 cma", "四渎增三": "12 mon", "四渎三": "13 mon", "四渎增八": "14 mon", "井宿增九": "w gem", "军市增二": "ksi2 cma", "井宿增六": "49 aur", "井宿增八": "23 gem", "八谷增卅三": "9 lyn", "军市增一": "nu.1 cma", "野鸡": "nu.2 cma", "八谷增卅二": "11 lyn", "八谷增廿三": "8 lyn", "井宿三": "gam gem", "老人增二": "nu. pup", "军市二": "nu.3 cma", "井宿增三": "53 aur", "八谷增廿四": "10 lyn", "座旗八": "51 aur", "座旗七": "psi3 aur", "座旗五": "psi2 aur", "井宿增五": "54 aur", "四渎增一": "15 mon", "井宿增七": "26 gem", "座旗三": "psi4 aur", "井宿五": "eps gem", "井宿增十": "30 gem", "井宿增十八": "30 gem", "弧矢增一": "10 cma", "井宿增四": "28 gem", "天狼": "alf cma", "井宿四": "ksi gem", "井宿增十九": "ksi gem", "井宿增十一": "32 gem", "六甲一": "hip 32439", "四渎增二": "16 mon", "座旗四": "psi5 aur", "八谷增卅一": "13 lyn", "天狼增一": "11 cma", "军市增三": "12 cma", "四渎二": "17 mon", "座旗一": "psi6 aur", "阙丘一": "18 mon", "金鱼增一": "alf pic", "弧矢八": "kap cma", "老人增一": "tau pup", "井宿增十二": "35 gem", "座旗六": "psi7 aur", "井宿六": "d gem", "座旗九": "59 aur", "八谷增廿九": "14 lyn", "座旗增三": "60 aur", "军市三": "15 cma", "紫微右垣五": "43 cam", "座旗增四": "psi8 aur", "军市五": "omi1 cma", "天狼增二": "tet cma", "天狼增六": "tet cma", "井宿增十三": "e gem", "军市四": "17 cma", "天樽增一": "37 gem", "军市增六": "pi. cma", "军市增七": "pi. cma", "军市增四": "pi. cma", "天狼增三": "mu. cma", "天狼增五": "iot cma", "八谷增卅": "15 lyn", "座旗二": "psi10 aur", "弧矢七": "eps cma", "座旗增五": "62 aur", "天樽增二": "40 gem", "井宿增十四": "41 gem", "弧矢增二": "sig cma", "天樽三": "ome gem", "阙丘增四": "19 mon", "军市增五": "omi2 cma", "天狼增四": "gam cma", "井宿七": "zet gem", "天樽增六": "44 gem", "弧矢增廿五": "fv cma", "井宿增十五": "45 gem", "弧矢一": "del cma", "飞鱼二": "gam2 vol", "阙丘增五": "20 mon", "天樽增三": "47 gem", "阙丘二": "21 mon", "座旗增六": "63 aur", "阙丘增三": "del mon", "弧矢增五": "26 cma", "天樽增五": "48 gem", "井宿增十六": "hip 34858", "阙丘增二": "23 mon", "井宿增十七": "51 gem", "弧矢增四": "27 cma", "天樽增四": "52 gem", "弧矢增三": "ome cma", "阙丘增一": "24 mon", "内阶增二": "18 lyn", "飞鱼五": "del vol", "弧矢九": "pi. pup", "座旗增七": "64 aur", "井宿八": "lam gem", "弧矢增七": "29 cma", "弧矢增六": "tau cma", "天樽二": "del gem", "天樽增七": "56 gem", "座旗增十一": "20 lyn", "内阶增一": "19 lyn", "天樽一": "a gem", "弧矢二": "eta cma", "座旗增八": "66 aur", "水位增一": "1 cmi", "南河一": "eps cmi", "座旗增九": "21 lyn", "天樽增八": "61 gem", "南河二": "bet cmi", "天樽增九": "63 gem", "南河增二": "eta cmi", "南河增一": "gam cmi", "北河一": "rho gem", "弧矢增廿四": "sig pup", "水位一": "6 cmi", "座旗增十": "22 lyn", "南河增五": "del1 cmi", "南河增四": "del2 cmi", "水位增二": "68 gem", "南河增三": "del3 cmi", "北河二": "alf gem", "阙丘增六": "25 mon", "北河增一": "70 gem", "弧矢六": "k pup", "北河增二": "omi gem", "南河三": "alf cmi", "弧矢增廿": "d1 pup", "水位增三": "f gem", "阙丘增七": "alf mon", "飞鱼六": "zet vol", "内阶增三": "24 lyn", "北河增四": "sig gem", "弧矢增十九": "l pup", "积薪增一": "c gem", "积薪": "kap gem", "弧矢三": "c pup", "北河三": "bet gem", "弧矢增八": "2 pup", "弧矢增九": "4 pup", "水位增四": "g gem", "水位二": "11 cmi", "北河增三": "pi. gem", "弧矢增十": "5 pup", "弧矢五": "omi pup", "积薪增二": "82 gem", "弧矢增十七": "ksi pup", "弧矢增十二": "6 pup", "南河增六": "zet cmi", "弧矢增廿三": "a pup", "弧矢增十一": "10 pup", "弧矢增廿一": "b pup", "积薪增三": "84 gem", "上台增三": "25 lyn", "上台增二": "26 lyn", "水位增五": "85 gem", "天社增一": "chi car", "弧矢增十五": "j pup", "水位增九": "1 cnc", "弧矢四": "chi pup", "南河增七": "14 cmi", "弧矢增卅一": "12 pup", "弧矢增十六": "12 pup", "南河增十": "27 mon", "水位增七": "3 cnc", "爟增二": "ome1 cnc", "南河增九": "28 mon", "水位增八": "5 cnc", "爟增一": "ome2 cnc", "南河增八": "13 pup", "爟增三": "chi gem", "弧矢增廿二": "zet pup", "弧矢增十四": "14 pup", "六甲三": "vz cam", "水位三": "8 cnc", "弧矢增卅二": "rho pup", "水位增六": "mu. cnc", "上台增一": "27 lyn", "外厨增一": "zet mon", "水位增十一": "12 cnc", "爟增四": "11 cnc", "弧矢增十三": "16 pup", "天社一": "gam vel", "爟增五": "psi1 cnc", "爟一": "psi cnc", "外厨增十四": "18 pup", "外厨增十六": "19 pup", "水位四": "zet1 cnc", "爟四": "15 cnc", "外厨增十三": "20 pup", "柳宿增十": "bet cnc", "外厨增十一": "21 pup", "内阶增五": "29 lyn", "小斗增一": "alf cha", "飞鱼四": "kap1 vol", "爟增六": "chi cnc", "内阶增四": "30 lyn", "爟二": "lam cnc", "小斗八": "tet cha", "海石一": "eps car", "外厨增十七": "22 pup d", "上台增四": "31 lyn", "鬼宿增二": "d1 cnc", "柳宿增九": "21 cnc", "外厨增二": "1 hya", "外厨增三": "c hya", "飞鱼三": "bet vol", "鬼宿增三": "d2 cnc", "鬼宿增十九": "d2 cnc", "外厨一": "2 hya", "爟三": "phi1 cnc", "爟增七": "phi1 cnc", "爟增九": "24 cnc", "鬼宿增五": "27 cnc", "爟增八": "phi2 cnc", "爟增十": "28 cnc", "鬼宿增四": "29 cnc", "内阶一": "omi uma", "爟增十一": "ups1 cnc", "鬼宿一": "tet cnc", "柳宿增八": "34 cnc", "鬼宿二": "eta cnc", "内阶增八": "a uma", "轩辕增八": "33 lyn", "鬼宿增一": "35 cnc", "外厨增四": "3 hya", "柳宿增七": "c cnc", "天狗一": "e vel", "柳宿一": "del hya", "柳宿增六": "37 cnc", "柳宿二": "sig hya", "内阶增九": "pi.1 uma", "轩辕增十": "2 lmi", "轩辕增九": "3 lmi", "外厨增八": "a hya a", "天狗四": "bet pyx", "内阶增七": "pi.2 uma", "天社二": "b vel", "外厨增十": "9 hya", "鬼宿增六": "a1 cnc", "柳宿三": "eta hya", "鬼宿三": "gam cnc", "天狗五": "alf pyx", "外厨二": "f hya", "天狗二": "d vel", "鬼宿四": "del cnc", "天社三": "del vel", "柳宿增五": "b cnc", "柳宿增一": "10 hya", "轩辕增十一": "46 cnc", "天社增二": "a vel", "外厨增九": "d hya", "轩辕增廿二": "iot cnc", "柳宿五": "eps hya", "鬼宿增七": "a2 cnc", "柳宿四": "rho hya", "外厨三": "14 hya", "天狗六": "gam pyx", "鬼宿增八": "54 cnc", "鬼宿增九": "52 cnc", "外厨增六": "15 hya", "上台增五": "35 lyn", "轩辕增廿一": "53 cnc", "轩辕增七": "sig1 cnc", "轩辕增廿": "rho1 cnc", "轩辕增十九": "rho1 cnc", "内阶五": "b uma", "轩辕增十二": "57 cnc", "海石增二": "c car", "柳宿六": "zet hya", "外厨增七": "17 hya", "天狗七": "del pyx", "轩辕增十八": "rho2 cnc", "柳宿增十二": "60 cnc", "柳宿增四": "60 cnc", "内阶三": "6 uma", "轩辕增六": "sig2 cnc", "鬼宿增十": "omi1 cnc", "鬼宿增十一": "omi2 cnc", "轩辕增十三": "61 cnc", "柳宿增三": "alf cnc", "柳宿增十三": "alf cnc", "三台一": "iot uma", "上台一": "iot uma", "轩辕增五": "sig3 cnc", "轩辕一": "10 uma", "轩辕增四": "66 cnc", "鬼宿增十二": "68 cnc", "轩辕增十七": "67 cnc", "飞鱼一": "alf vol", "三师一": "rho uma", "轩辕增廿三": "nu. cnc", "三台二": "kap uma", "上台二": "kap uma", "天社增三": "c vel", "轩辕增十六": "70 cnc", "鬼宿增十三": "71 cnc", "柳宿七": "ome hya", "柳宿增二": "kap cnc", "天记": "lam vel", "轩辕增十四": "tau cnc", "三师三": "sig1 uma", "星宿增四": "19 hya", "轩辕增十五": "75 cnc", "文昌五": "f uma", "鬼宿增十四": "78 cnc", "轩辕增廿四": "ksi cnc", "星宿增三": "20 hya", "轩辕增五八": "79 cnc", "三师增一": "sig2 uma", "内阶增十": "tau uma", "海石增一": "a car", "海石增三": "i car", "鬼宿增十八": "pi.1 cnc", "星宿增五": "21 hya", "南船五": "bet car", "上台增六": "36 lyn", "内阶二": "c uma", "柳宿八": "tet hya", "鬼宿增十六": "pi. cnc", "轩辕增三": "19 uma", "内阶六": "17 uma", "文昌六": "e uma", "星宿增二": "24 hya", "星宿增六": "23 hya", "海石二": "iot car", "轩辕三": "38 lyn", "鬼宿增十五": "83 cnc", "星宿六": "26 hya", "星宿五": "p hya", "文昌增五": "37 ly", "轩辕四": "alf lyn", "天社五": "kap vel", "文昌增六": "39 lyn", "轩辕增廿五": "6 lmi", "小斗六": "iot cha", "轩辕七": "kap leo", "星宿增七": "28 hya", "文昌增三": "21 uma", "星宿增一": "29 hya", "星宿一": "alf hya", "酒旗三": "ome leo", "酒旗增五": "3 leo", "上台增七": "41 lyn", "星宿二": "tau1 hya", "天记增一": "psi vel", "轩辕增二": "7 lmi", "天社六": "n vel", "内阶四": "h uma", "轩辕增一": "8 lmi", "轩辕八": "lam leo", "酒旗二": "ksi leo", "酒旗增四": "6 leo", "星宿三": "tau2 hya", "文昌四": "tet uma", "内平增五": "9 lmi", "小斗五": "zet cha", "内平增六": "10 lmi", "海石三": "h car", "少辅": "d uma", "紫微右垣四": "d uma", "星宿增八": "a hya", "文昌增四": "26 uma", "内平增七": "11 lmi", "酒旗增二": "7 leo", "酒旗增一": "8 leo", "轩辕增四五": "10 leo", "轩辕增廿六": "9 leo", "星宿增十五": "34 hya", "酒旗增三": "11 leo", "内平增四": "42 lyn", "轩辕增四六": "2 sex", "星宿增十三": "37 hya", "星宿四": "iot hya", "张宿五": "kap hya", "轩辕十五": "omi leo", "轩辕增五九": "omi leo", "轩辕增廿七": "13 leo", "内平增三": "43 lyn", "内平三": "13 lmi", "少辅增一": "27 uma", "轩辕六": "f leo", "酒旗一": "psi leo", "海石四": "l car", "轩辕九": "eps leo", "文昌增一": "28 uma", "轩辕增四四": "18 leo", "文昌增二": "44 lyn", "海石五": "ups car", "星宿增十": "3 sex", "轩辕增廿九": "20 leo", "内平增二": "16 lmi", "轩辕增四八": "4 sex", "星宿增十一": "5 sex", "文昌二": "ups uma", "轩辕增四三": "23 leo", "星宿增九": "6 sex", "张宿一": "ups1 hya", "轩辕增廿八": "g leo", "文昌三": "phi uma", "轩辕增四七": "7 sex", "内平增一": "17 lmi", "星宿增十二": "gam sex", "轩辕十": "mu. leo", "轩辕增四九": "9 sex", "文昌增七": "31 uma", "轩辕增四十": "10 sex", "内平四": "18 lmi", "中台增二": "19 lmi", "轩辕增卅九": "11 sex", "轩辕增四二": "nu. leo", "轩辕增五十": "12 sex", "轩辕增卅八": "pi. leo", "内平增九": "20 lmi", "张宿四": "hip 49321", "轩辕增五一": "13 sex", "张宿增一": "ups2 hya", "轩辕增五二": "14 sex", "轩辕十三": "eta leo", "内平二": "21 lmi", "轩辕十七": "31 leo", "御女": "31 leo", "轩辕十四": "alf leo", "天相一": "17 sex", "张宿二": "lam hya", "轩辕增卅四": "33 leo", "天相增一": "18 sex", "轩辕增卅七": "34 leo", "轩辕增五三": "19 sex", "轩辕增五四": "19 sex", "南船四": "ome car", "天相增三": "20 sex", "天相增二": "21 sex", "天记增二": "q vel", "内平一": "22 lmi", "内平增十": "23 lmi", "内平增十一": "24 lmi", "轩辕增卅": "35 leo", "轩辕增卅六": "37 leo", "轩辕十一": "zet leo", "南船一": "q car", "三台三": "lam uma", "中台一": "lam uma", "轩辕增卅一": "39 leo", "天相三": "eps sex", "天枢增一": "32 uma", "轩辕增卅二": "40 leo", "轩辕增卅三": "40 leo", "轩辕十二": "gam1 leo", "长垣增四": "23 sex", "中台增三": "25 lmi", "轩辕增卅五": "42 leo", "三台四": "mu. uma", "中台二": "mu. uma", "轩辕增五五": "43 leo", "势增六": "26 lmi", "势增七": "27 lmi", "势增十七": "27 lmi", "天相增四": "25 sex", "天相增八": "24 sex", "势增八": "28 lmi", "势增十八": "28 lmi", "南船增一": "i car", "轩辕增五六": "44 leo", "势增五": "29 lmi", "势增九": "30 lmi", "势增十九": "30 lmi", "张宿三": "mu. hya", "天相增九": "26 sex", "天相增五": "27 sex", "轩辕增五七": "45 leo", "海山一": "s car", "势增四": "bet lmi", "天相增六": "del sex", "四辅二": "hip 51384", "天枢增二": "35 uma", "势增三": "32 lmi", "天相增十": "bet sex", "长垣增五": "31 sex", "天璇增一": "36 uma", "四辅三": "hip 51502", "势二": "h lmi", "南船二": "p car", "长垣一": "46 leo", "长垣增三": "32 sex", "张宿增二": "phi1 hya", "轩辕十六": "rho leo", "势一": "34 lmi", "张宿增四": "44 hya", "阴德二": "hd 91114", "长垣四": "48 leo", "长垣增二": "49 leo", "天璇增二": "37 uma", "小斗三": "gam cha", "张宿增三": "phi2 hya", "势增一": "35 lmi", "海山增一": "p vel", "势增十": "36 lmi", "张宿六": "phi hya", "势增十一": "37 lmi", "长垣增一": "50 leo", "势增二": "38 lmi", "少微增一": "39 lmi", "天相增十一": "33 sex", "天枢增三": "38 uma", "长垣增六": "34 sex", "南船三": "tet car", "少微增二": "40 lmi", "长垣增七": "35 sex", "少微三": "41 lmi", "天璇增五": "39 uma", "灵台增二": "36 sex", "小斗四": "del2 cha", "势三": "42 lmi", "天璇增六": "40 uma", "长垣增八": "37 sex", "天璇增四": "41 uma", "少微四": "m leo", "长垣二": "k leo", "海山增二": "mu. vel", "翼宿增三": "b1 hya", "长垣增九": "38 sex", "势增十四": "43 lmi", "翼宿增二": "39 sex", "长垣三": "l leo", "天相增十二": "40 sex", "翼宿五": "nu. hya", "势增十六": "44 lmi", "势增十五": "44 lmi", "翼宿增一": "41 sex", "翼宿增四": "5 crt", "天璇增七": "43 uma", "天璇增三": "42 uma", "势四": "o lmi", "翼宿增五": "b3 hya", "天璇增八": "44 uma", "天牢一": "ome uma", "少微增三": "48 lmi", "势增十二": "47 lmi", "少微二": "54 leo", "少微增九": "54 leo", "灵台增三": "55 leo", "势增十三": "46 uma", "少微增八": "49 lmi", "灵台增一": "56 leo", "灵台增四": "57 leo", "少微增四": "50 lmi", "天牢三": "47 uma", "翼宿一": "alf crt", "灵台三": "d leo", "灵台二": "c leo", "天牢五": "49 uma", "灵台增五": "p2 leo", "北斗二": "bet uma", "天璇": "bet uma", "西上相增一": "b leo", "翼宿增六": "8 crt", "灵台增七": "p3 leo", "北斗一": "alf uma", "天枢": "alf uma", "灵台一": "chi leo", "少微增五": "51 lmi", "翼宿廿": "chi1 hya", "灵台增八": "p4 leo", "少微一": "52 lmi", "少微增七": "64 leo", "翼宿增七": "10 crt", "少微增六": "67 leo", "灵台增六": "66 leo", "太尊": "psi uma", "翼宿十六": "bet crt", "明堂增五": "p5 leo", "太微右垣五": "del leo", "西上相": "del leo", "太微右垣四": "tet leo", "西次相": "tet leo", "虎贲": "72 leo", "西次相增三": "n leo", "明堂增六": "phi leo", "明堂增四": "75 leo", "三台六": "ksi uma", "下台二": "ksi uma", "三台五": "nu. uma", "下台一": "nu. uma", "天牢增二": "55 uma", "翼宿七": "del crt", "太微右垣二": "sig leo", "西上将": "sig leo", "天牢六": "56 uma", "翼宿四": "lam crt", "太微右垣三": "iot leo", "西次将": "iot leo", "明堂增三": "79 leo", "翼宿十": "eps crt", "翼宿二": "gam crt", "西次相增二": "81 leo", "明堂增二": "80 leo", "翼宿九": "kap crt", "明堂一": "tau leo", "天牢二": "57 uma", "五帝座增二": "85 leo", "明堂三": "e leo", "明堂增七": "e leo", "西上相增二": "86 leo", "天牢四": "58 uma", "上辅": "lam dra", "紫微右垣三": "lam dra", "五帝座增三": "88 leo", "青丘三": "n hya", "青丘四": "18 crt", "青丘五": "ksi hya", "明堂增一": "89 leo", "青丘六": "20 crt", "五帝座增一": "90 leo", "海山五": "lam cen", "上辅增一": "2 dra", "青丘增三": "22 crt", "翼宿十三": "tet crt", "明堂二": "ups leo", "青丘增二": "23 crt", "天牢增一": "59 uma", "内屏增一": "ome vir", "太阳守增一": "60 uma", "翼宿八": "iot crt", "青丘七": "omi hya", "下台增一": "61 uma", "下台增二": "62 uma", "青丘增一": "26 crt", "上辅增二": "3 dra", "翼宿三": "zet crt", "五帝座三": "hip 57320", "内屏一": "ksi vir", "海山六": "lam mus", "内屏二": "nu. vir", "太阳守": "chi uma", "内屏增二": "a1 vir", "太子": "gam umi", "翼宿十四": "hip 57587", "五帝座一": "bet leo", "太微右垣一": "bet vir", "右执法": "bet vir", "五帝座五": "hip 57779", "青丘一": "bet hya", "北斗三": "gam uma", "天玑": "gam uma", "内屏增三": "a2 vir", "青丘二": "29 crt", "五帝座四": "o leo", "天理三": "66 uma", "翼宿六": "eta crt", "小斗二": "eps cha", "内屏增六": "b vir", "轸宿增三": "31 crt", "内屏三": "pi. vir", "常陈七": "67 uma", "郎位十五": "2 com", "内屏四": "omi vir", "马尾三": "del cen", "右辖": "alf crv", "谒者增一": "10 vir", "内屏增五": "11 vir", "轸宿二": "eps crv", "轸宿增四": "3 crv", "马尾二": "rho cen", "郎位增三": "4 com", "郎位十四": "5 com", "内屏增四": "12 vir", "相增一": "1 cvn", "十字架四": "del cru", "北斗四": "del uma", "天权": "del uma", "轸宿一": "gam crv", "常陈六": "2 cvn", "郎位十": "7 com", "小斗一": "bet cha", "左执法增一": "13 vir", "轸宿增二": "14 vir", "郎位增二": "9 com", "相增二": "3 cvn", "郎位增一": "10 com", "太微左垣一": "eta vir", "左执法": "eta vir", "谒者": "c vir", "长沙": "zet crv", "天权增二": "70 uma", "郎位七": "12 com", "谒者增二": "17 vir", "轸宿增五": "6 crv", "常陈增一": "4 cvn", "相": "5 cvn", "郎位六": "13 com", "常陈五": "6 cvn", "郎位三": "14 com", "马尾一": "g cen", "十字架二": "alf1 cru", "郎位一": "gam com", "郎位四": "16 com", "天权增三": "73 uma", "库楼十": "sig cen", "郎位五": "17 com", "郎位九": "18 com", "郎位十三": "20 com", "轸宿三": "del crv", "天权增一": "74 uma", "少尉增二": "4 dra", "郎位八": "21 com", "十字架一": "gam cru", "左辖": "eta crv", "蜜蜂二": "gam mus", "九卿增八": "20 vir", "九卿增九": "20 vir", "少尉": "kap dra", "紫微右垣二": "kap dra", "常陈四": "bet cvn", "轸宿增一": "q vir", "轸宿四": "bet crv", "少尉增一": "6 dra", "郎位十一": "23 com", "进贤增九": "f vir", "蜜蜂三": "alf mus", "库楼八": "tau cen", "常陈三": "9 cvn", "郎位十二": "26 com", "进贤增八": "chi vir", "库楼七": "gam cen", "内厨增二": "76 uma", "九卿增五": "27 vir", "东上相": "gam vir", "太微左垣二": "gam vir", "九卿一": "rho vir", "进贤增七": "28 vir", "常陈二": "10 cvn", "九卿二": "d2 vir", "蜜蜂一": "bet mus", "九卿增六": "33 vir", "九卿增四": "34 vir", "内厨一": "7 dra", "十字架三": "bet cru", "九卿增三": "28 com", "相增三": "11 cvn", "九卿增二": "29 com", "九卿增一": "29 com", "北极五": "hip 62561", "郎将增一": "30 com", "东次相增一": "37 vir", "郎将": "31 com", "进贤增一": "38 vir", "东次将增一": "41 vir", "北斗五": "eps uma", "玉衡": "eps uma", "进贤增五": "psi vir", "内厨二": "8 dra", "东次相": "del vir", "太微左垣三": "del vir", "常陈一": "alf2 cvn", "进贤": "k vir", "进贤增二": "k vir", "内厨增一": "9 dra", "周鼎二": "37 com", "进贤增三": "46 vir", "东次将": "eps vir", "太微左垣四": "eps vir", "蜜蜂四": "del mus", "进贤增四": "48 vir", "库楼六": "f cen", "周鼎三": "41 com", "角宿增十五": "49 vir", "平增一": "psi hya", "常陈增五": "15 cvn", "角宿增十四": "50 vir", "平道一": "tet vir", "东上将": "alf com", "太微左垣五": "alf com", "常陈增四": "16 cvn", "常陈增六": "17 cvn", "常陈增二": "18 cvn", "周鼎一": "bet com", "天门一": "53 vir", "天门增三": "54 vir", "天门增二": "55 vir", "角宿增十二": "56 vir", "角宿增十三": "56 vir", "天门增一": "57 vir", "东次将增三": "e vir", "角宿增十一": "58 vir", "常陈增三": "20 cvn", "三公三": "21 cvn", "天门增四": "61 vir", "平一": "gam hya", "角宿增十": "62 vir", "天门增五": "63 vir", "角宿增一": "65 vir", "北斗六": "zet uma", "开阳": "zet uma", "角宿增十六": "66 vir", "角宿一": "alf vir", "辅": "g uma", "开阳增一": "g uma", "角宿增九": "i vir", "天门二": "69 vir", "东上将增一": "70 vir", "东上将增二": "71 vir", "角宿增二": "72 vir", "库楼五": "d cen", "角宿增三": "l vir", "天门增十一": "73 vir", "天门增六": "75 vir", "角宿增八": "h vir", "三公二": "24 cvn", "角宿二": "zet vir", "角宿增四": "80 vir", "角宿增五": "81 vir", "开阳增二": "82 uma", "东上将增四": "hip 66640", "南门一": "eps cen", "右摄提增三": "1 boo", "辅增一": "83 uma", "右摄提增二": "2 boo", "平道二": "m vir", "天门增七": "83 vir", "天门增八": "85 vir", "角宿增七": "86 vir", "辅增二": "84 uma", "帝席增一": "3 boo", "右摄提二": "tau boo", "右摄提增五": "tau boo", "天门增十": "87 vir", "北斗七": "eta uma", "摇光": "eta uma", "角宿增六": "88 vir", "库楼四": "g cen", "右摄提三": "ups boo", "衡一": "nu. cen", "衡二": "mu. cen", "右摄提增一": "e boo", "天门增九": "89 vir", "天乙": "i dra", "右摄提增六": "7 boo", "辅增三": "86 uma", "右摄提一": "eta boo", "库楼一": "zet cen", "帝席三": "9 boo", "衡三": "phi cen", "平增二": "47 hya", "平增四": "47 hya", "平增三": "48 hya", "帝席二": "11 boo", "马腹一": "bet cen", "右枢": "alf dra", "紫微右垣一": "alf dra", "衡四": "chi cen", "亢宿增一": "94 vir", "平二": "pi. hya", "库楼三": "tet cen", "亢宿增二": "95 vir", "庶子增二": "3 umi", "天枪增一": "13 boo", "北极四": "4 umi", "后宫": "4 umi", "亢宿增三": "96 vir", "帝席一": "d boo", "亢宿增四": "97 vir", "折威一": "50 hya", "折威增一": "50 hya", "亢宿一": "kap vir", "天枪一": "kap1 boo", "亢池三": "14 boo", "大角": "alf boo", "亢宿二": "iot vir", "天枪二": "iot boo", "玄戈": "lam boo", "异雀七": "eta aps", "亢宿四": "lam vir", "亢池四": "18 boo", "亢宿增十二": "ups vir", "亢池一": "20 boo", "亢宿增十一": "103 vir", "异雀九": "eps aps", "折威增二": "k hya", "天枪三": "tet boo", "大角增一": "f boo", "异雀五": "del oct", "亢宿增六": "104 vir", "北极三": "5 umi", "庶子": "5 umi", "亢宿三": "phi vir", "天枪增二": "g boo", "亢宿增五": "106 vir", "梗河三": "rho boo", "招摇": "gam boo", "车骑三": "sig lup", "梗河二": "sig boo", "库楼二": "eta cen", "车骑二": "rho lup", "玄戈增一": "33 boo", "折威三": "3 lib", "南门二": "alf1 cen", "左摄提二": "pi.1 boo", "左摄提三": "zet boo", "左摄提增三": "31 boo", "左摄提增二": "32 boo", "骑官十": "alf lup", "阳门一": "b cen", "南门增二": "alf cir", "亢宿增七": "mu. vir", "折威四": "4 lib", "折威五": "4 lib", "梗河增五": "34 boo", "阳门二": "c1 cen", "梗河一": "eps boo", "左摄提一": "omi boo", "亢宿增九": "108 vir", "天床六": "6 umi", "氐宿增六": "5 lib", "折威增三": "m hya", "亢宿增十": "109 vir", "折威增四": "55 hya", "折威增五": "56 hya", "异雀八": "alf aps", "折威增七": "57 hya", "玄戈增二": "h boo", "氐宿增五": "mu. lib", "天枪增三": "39 boo", "阵车一": "e hya", "阵车增一": "e hya", "氐宿增七": "alf1 lib", "北极二": "bet umi", "帝": "bet umi", "氐宿一": "alf2 lib", "亢宿增八": "11 lib", "左摄提增一": "ksi boo", "骑官九": "omi lup", "氐宿增八": "10 lib", "折威六": "12 lib", "氐宿增四": "ksi1 lib", "氐宿增三": "ksi2 lib", "氐宿增廿九": "16 lib", "折威增六": "14 lib", "氐宿增卅": "17 lib", "骑官四": "bet lup", "阵车增二": "59 hya", "氐宿增二": "18 lib", "骑官三": "kap cen", "七公增六": "40 boo", "天床增一": "9 umi", "氐宿增一": "del lib", "氐宿增廿八": "2 ser", "七公增五": "bet boo", "阵车二": "60 hya", "梗河增四": "ome boo", "氐宿增廿七": "110 vir", "天枪增四": "i boo", "折威七": "sig lib", "梗河增一": "psi boo", "骑官八": "pi. lup", "庶子增三": "10 umi", "氐宿增十": "nu. lib", "氐宿增九": "22 lib", "梗河增三": "c boo", "梗河增二": "b boo", "骑官五": "lam lup", "骑阵将军": "kap1 lup", "氐宿二": "iot1 lib", "车骑一": "zet lup", "氐宿增十一": "iot2 lib", "贯索增一": "chi boo", "氐宿增十二": "26 lib", "顿顽二": "i lup", "蜀增二": "3 ser", "七公七": "del boo", "氐宿增廿六": "4 ser", "氐宿四": "bet lib", "天床增二": "11 umi", "阵车三": "f lup", "骑官七": "mu. lup", "三角形一": "gam tra", "氐宿增廿四": "5 ser", "贯索增二": "omi crb", "北极一": "gam umi", "氐宿增十三": "28 lib", "氐宿增十七": "omi lib", "氐宿增廿五": "6 ser", "骑官二": "del lup", "顿顽一": "phi1 lup", "骑官六": "eps lup", "氐宿增十八": "30 lib", "顿顽增一": "phi2 lup", "贯索增三": "eta crb", "氐宿增廿": "eps lib", "七公六": "mu.1 boo", "紫微左垣一": "iot dra", "左枢": "iot dra", "周增一": "tau1 ser", "贯索三": "bet crb", "氐宿增十六": "zet1 lib", "氐宿增廿三": "10 ser", "氐宿增十五": "zet3 lib", "七公五": "nu.1 boo", "勾陈增七": "tet umi", "三角形增三": "kap1 aps", "七公增九": "nu.2 boo", "氐宿增十四": "zet lib", "贯索二": "tet crb", "氐宿增廿一": "a1 ser", "氐宿增十九": "37 lib", "天辐增一": "36 lib", "贯索四": "alf crb", "秦": "del ser", "天市右垣六": "del ser", "骑官一": "gam lup", "七公增八": "mu. crb", "氐宿三": "gam lib", "周增五": "tau3 ser", "周增二": "tau4 ser", "周增三": "tau5 ser", "秦增二": "16 ser", "氐宿增廿二": "14 ser", "三角形增二": "eps tra", "天辐一": "ups lib", "七公增十": "phi boo", "天辐二": "tau lib", "日增一": "41 lib", "七公增七": "zet1 crb", "从官增一": "psi1 lup", "房宿增三": "42 lib", "三角形增四": "kap2 aps", "周增四": "tau6 ser", "周增七": "iot ser", "周增十四": "chi ser", "周增六": "tau7 ser", "日(室宿)": "kap lib", "从官一": "psi2 lup", "贯索五": "gam crb", "贯索一": "pi. crb", "巴增一": "psi ser", "勾陈四": "zet umi", "西咸四": "eta lib", "蜀": "alf ser", "天市右垣七": "alf ser", "周增九": "tau8 ser", "天乳增一": "a2 ser", "天市右垣五": "bet ser", "周": "bet ser", "周增十一": "29 ser", "蜀增一": "lam ser", "周增十二": "ups ser", "周增十五": "ups ser", "周增八": "kap ser", "天乳增三": "30 ser", "天乳增四": "30 ser", "贯索六": "del crb", "天乳": "mu. ser", "巴增二": "ome ser", "巴": "eps ser", "天市右垣八": "eps ser", "从官二": "chi lup", "房宿增四": "b sco", "贯索增四": "kap crb", "巴增五": "b ser", "天乳增二": "b ser", "贯索增十三": "rho ser", "七公四": "chi her", "周增十三": "39 ser", "房宿增二": "lam lib", "房宿增一": "lam lib", "房宿增五": "a sco", "西咸三": "tet lib", "七公增十二": "2 her", "三角形二": "bet tra", "房宿增六": "4 sco", "七公增十一": "4 her", "贯索增五": "lam crb", "天市右垣四": "gam ser", "房宿二": "rho sco", "贯索七": "eps crb", "西咸二": "48 lib", "房宿一": "pi. sco", "积卒二": "eta lup", "积卒增一": "eta lup", "罚三": "49 lib", "房宿三": "del sco", "西咸增一": "50 lib", "巴增三": "3 her", "贯索九": "rho crb", "晋增一": "r her", "贯索八": "iot crb", "上宰": "tet dra", "紫微左垣二": "tet dra", "贯索增十二": "pi. ser", "七公增四": "ups her", "巴增四": "43 ser", "西咸一": "ksi sco", "房宿四": "bet1 sco", "积卒一": "tet lup", "钩钤一": "ome1 sco", "积卒增二": "hip 18970", "钩钤二": "ome2 sco", "罚二": "11 sco", "斗增四": "45 ser", "天市右垣三": "kap her", "晋增五": "7 her", "斗增三": "46 ser", "斗增五": "47 ser", "七公三": "phi her", "晋增二": "8 her", "晋增四": "8 her", "贯索增六": "tau crb", "七公增十三": "14 her", "勾陈增八": "19 umi", "晋增三": "q her", "贯索增十一": "10 her", "键闭": "nu. sco", "罚增二": "psi sco", "罚增一": "16 sco", "心宿增一": "c1 sco", "心宿增二": "c2 sco", "勾陈增十": "20 umi", "斗增七": "9 her b", "斗二": "49 ser", "罚增三": "chi sco", "梁": "del oph", "天市右垣九": "del oph", "贯索增七": "sig crb", "斗增六": "12 her", "斗三": "13 her", "三角形增一": "del tra", "河间增一": "16 her", "罚一": "18 sco", "斗增二": "15 her", "贯索增十": "17 her", "贯索增八": "ups crb", "勾陈增九": "eta umi", "天市右垣十": "eps oph", "贯索增九": "19 her", "七公二": "tau her", "异雀六": "del1 aps", "心宿增三": "omi sco", "心宿一": "sig sco", "河间": "gam her", "天市右垣二": "gam her", "列肆一": "sig ser", "天纪一": "ksi crb", "天纪增三": "nu.1 crb", "天纪增四": "23 her", "少宰": "eta dra", "紫微左垣三": "eta dra", "东咸三": "psi oph", "斗增九": "o her", "天纪增二": "25 her", "斗一": "ome her", "斗增一": "ome her", "心宿增九": "rho oph", "心宿增四": "rho oph", "东咸二": "chi oph", "车肆一": "ups oph", "天纪增五": "26 her", "尚书二": "a dra", "七公增十四": "g her", "大火": "alf sco", "心宿二": "alf sco", "七公增三": "34 her", "心宿增五": "i sco", "河中": "bet her", "天市右垣一": "bet her", "列肆二": "lam oph", "东咸一": "phi oph", "东咸四": "ome oph", "东咸增二": "ome oph", "斗增十": "n her", "斗增十一": "n her", "斗四": "h her", "异雀四": "gam aps", "天纪增六": "32 her", "七公增十五": "sig her", "心宿三": "tau sco", "七公增二": "16 dra", "七公增一": "17 dra", "列肆增四": "12 oph", "斗五": "33 her", "天市右垣十一": "zet oph", "七公一": "42 her", "斛增五": "36 her", "斛增六": "m her", "尚书三": "g dra", "天纪二": "zet her", "斛增四": "38 her", "东咸增一": "24 sco", "天纪增七": "39 her", "列肆增三": "14 oph", "天纪增一": "eta her", "异雀三": "bet aps", "斛增二": "41 her", "天纪增八": "46 her", "心宿增六": "15 oph", "列肆增二": "16 oph", "斛四": "43 her", "斛增一": "43 her", "勾陈三": "eps umi", "心宿增八": "25 sco", "斛增三": "45 her", "三角形三": "alf tra", "七公增十六": "52 her", "天纪增十": "48 her", "龟四": "eta ara", "车肆二": "20 oph", "尾宿二": "eps sco", "斛三": "k her", "天纪增九": "50 her", "列肆增一": "21 oph", "魏增一": "51 her", "尾宿一": "mu.1 sco", "宦者增三": "49 her", "尾宿增二": "mu.2 sco", "天纪增十一": "53 her", "尾宿三": "zet1 sco", "斛一": "iot oph", "车肆增一": "23 oph", "魏增二": "56 her", "宦者增二": "54 her", "宦者增一": "54 her", "尚书五": "h dra", "尚书增二": "20 dra", "尾宿增一": "27 sco", "魏增三": "57 her", "斛二": "kap oph", "龟五": "zet ara", "龟一": "eps1 ara", "天江增九": "26 oph", "天纪三": "eps her", "车肆增二": "30 oph", "天纪四": "d her", "宋增二": "29 oph", "宦者一": "32 oph", "天纪五": "61 her", "宦者二": "33 oph", "宦者增四": "34 oph", "天江增十": "28 oph", "天江增十一": "31 oph", "天棓增九": "mu. dra", "宦者三": "60 her", "天江增八": "28 sco", "魏增五": "62 her", "上弼": "zet dra", "紫微左垣四": "zet dra", "宋": "eta oph", "天市左垣十一": "eta oph", "尾宿四": "eta sco", "宦者四": "37 oph", "天江一": "29 sco", "帝座": "alf1 her", "天市左垣一": "del her", "女床一": "pi. her", "天江二": "a oph", "天江增三": "30 sco", "宗正增三": "41 oph", "勾陈增五": "lam umi", "天纪六": "u her", "天江增二": "38 oph", "女床二": "e her", "天江增六": "omi oph", "宦者增五": "e oph", "天棓增七": "74 her", "天纪增十三": "w her", "市楼四": "nu. ser", "市楼增一": "nu. ser", "魏增六": "70 her", "魏增七": "70 her", "天江增七": "ksi oph", "天江增四": "32 sco", "异雀一": "zet aps", "天江三": "tet oph", "异雀二": "iot aps", "天江增一": "43 oph", "女床三": "rho her", "魏增八": "73 her", "天纪增十五": "hip 85181", "天江增五": "191 oph", "龟二": "gam ara", "天江四": "b oph", "宗正增二": "sig oph", "天棓增八": "x her", "糠": "d oph", "天棓三": "bet dra", "天市左垣二": "lam her", "尾宿九": "ups sco", "勾陈增六": "24 umi", "天籥增一": "50 oph", "龟三": "del ara", "天籥六": "c oph", "赵增一": "78 her", "尚书一": "f dra", "天棓增一": "nu.1 dra", "勾陈二": "del umi", "天棓二": "nu.2 dra", "御女三": "29 dra", "尾宿八": "lam sco", "候增三": "54 oph", "候增五": "f oph", "候": "alf oph", "天棓增十": "26 dra", "候增四": "56 oph", "天籥五": "52 oph", "尾宿增三": "q sco", "天棓增四": "y her", "尚书增一": "ome dra", "尾宿五": "tet sco", "赵增二": "79 her", "南海": "ksi ser", "天市左垣十": "ksi ser", "市楼一": "mu. oph", "天棓五": "iot her", "市楼二": "omi ser", "女史增一": "psi1 dra", "尾宿七": "kap sco", "赵增三": "84 her", "天籥三": "58 oph", "宗正一": "bet oph", "宗正增一": "61 oph", "孔雀一": "eta pav", "九河": "mu. her", "天市左垣三": "mu. her", "天籥八": "2 sgr", "尾宿六": "iot1 sco", "宗正二": "gam oph", "九河增一": "87 her", "天棓增二": "30 dra", "天柱增六": "35 dra", "傅说": "g sco", "天棓增三": "z her", "天纪增十四": "f her", "天棓一": "ksi dra", "天籥一": "63 oph", "女史": "psi2 dra", "天纪九": "tet her", "天棓四": "gam dra", "中山增一": "ksi her", "中山增二": "nu. her", "天市左垣九": "nu. oph", "燕": "zet cap", "天籥增二": "4 sgr", "天柱五": "40 dra", "帛度增三": "93 her", "天柱增五": "41 dra", "天籥增三": "5 sgr", "宗人一": "66 oph", "东海增一": "zet ser", "宗人二": "67 oph", "斗宿增一": "6 sgr", "帛度一": "95 her", "宗人三": "68 oph", "帛度增一": "96 her", "屠肆增一": "97 her", "天籥增四": "7 sgr", "市楼三": "tau oph", "宗人四": "p oph", "箕宿一": "gam sgr", "屠肆二": "98 her", "中山增三": "b her", "宗人增二": "71 oph", "宗人增一": "72 oph", "天市左垣四": "omi her", "中山": "omi her", "中山增七": "100 her", "孔雀二": "pi. pav", "帛度二": "102 her", "帛度增二": "101 her", "宗人增三": "73 oph", "中山增四": "a her", "斗宿三": "mu. sgr", "扶筐增一": "36 dra", "斗宿增二": "15 sgr", "斗宿增五": "15 sgr", "柱史增二": "37 dra", "柱史增一": "38 dra", "箕宿四": "eta sgr", "屠肆增二": "105 her", "织女增四": "kap lyr", "屠肆增三": "106 her", "柱史": "phi dra", "宗人增四": "74 oph", "中山增五": "108 her", "箕宿二": "del sgr", "中山增六": "t her", "御女四": "chi dra", "东海": "eta ser", "天市左垣八": "eta ser", "孔雀增二": "ksi pav", "屠肆一": "109 her", "扶筐三": "b dra", "箕宿三": "eps sgr", "织女增三": "mu. lyr", "斗宿增三": "21 sgr", "扶筐增二": "42 dra", "鳖一": "alf tel", "东海增二": "d ser", "斗宿二": "lam sgr", "东海增四": "c ser", "孔雀三": "nu. pav", "东海增三": "61 ser", "扶筐二": "d dra", "鳖十": "kap2 cra", "鳖十一": "tet cra", "天弁一": "alf sct", "织女": "alf lyr", "织女一": "alf lyr", "斗宿增四": "26 sgr", "天弁二": "del sct", "扶筐一": "c dra b", "孔雀八": "zet pav", "天弁三": "eps sct", "农丈人": "hip 91918", "织女二": "eps1 lyr", "织女增二": "eps2 lyr", "织女三": "zet1 lyr", "织女增一": "zet2 lyr", "徐增一": "4 aql", "斗宿一": "phi sgr", "宗一": "110 her", "御女二": "50 dra", "天弁增一": "5 aql", "宗二": "111 her", "天弁四": "bet sct", "鳖二": "eta1 cra", "建增一": "29 sgr", "渐台增六": "nu.1 lyr", "渐台增五": "nu. lyr", "渐台二": "bet lyr", "建增五": "30 sgr", "天弁增二": "7 aql", "扶筐四": "omi dra", "天弁增三": "8 aql", "建增四": "31 sgr", "孔雀四": "lam pav", "天市左垣五": "112 her", "渐台增一": "del1 lyr", "建增三": "33 sgr", "建增六": "nu.1 sgr", "少弼": "ups dra", "紫微左垣五": "ups dra", "渐台一": "del2 lyr", "齐增一": "113 her", "建增七": "nu.2 sgr", "斗宿四": "sig sgr", "辇道一": "13 lyr", "徐增二": "62 ser", "天市左垣七": "tet1 ser", "徐": "tet1 ser", "扶筐五": "48 dra", "孔雀五": "kap pav", "天弁五": "eta sct", "徐增四": "64 ser", "建增二": "ksi1 sgr", "建一": "ksi2 sgr", "孔雀增三": "ome pav", "鳖八": "eps cra", "吴越增二": "10 aql", "渐台三": "gam lyr", "吴越增三": "11 aql", "吴越增一": "eps aql", "渐台增四": "lam lyr", "扶筐六": "49 dra", "辇道增一": "16 lyr", "天弁六": "i aql", "斗宿六": "zet sgr", "天弁九": "g aql", "鳖三": "zet cra", "建二": "omi sgr", "扶筐七": "51 dra", "天弁八": "h aql", "天市左垣六": "zet aql", "吴越": "zet aql", "天弁七": "lam aql", "鳖七": "gam cra", "斗宿五": "tau sgr", "吴越增四": "18 aql", "渐台四": "iot lyr", "渐台增三": "17 lyr", "鳖四": "del cra", "徐增三": "19 aql", "天柱四": "59 dra", "天柱增一": "59 dra", "鳖六": "alf cra", "天厨增一": "55 dra", "建三": "pi. sgr", "鳖五": "bet cra", "扶筐增四": "53 dra", "天厨一": "del dra", "天弁增四": "20 aql", "右旗增二": "21 aql", "辇道二": "eta lyr", "辇道增二": "eta lyr", "扶筐增三": "54 dra", "齐增二": "1 sge", "狗增六": "psi sgr", "御女一": "tau dra", "齐增三": "1 vul", "辇道三": "tet lyr", "右旗增一": "22 aql", "奚仲一": "kap cyg", "建四": "d sgr", "建增九": "hip 94823", "齐增四": "2 vul", "吴越增五": "ome1 aql", "建增十": "hip 94859", "吴越增六": "a aql", "天弁增五": "f aql", "右旗增三": "d aql", "天厨六": "pi. dra", "建五": "rho1 sgr", "建六": "ups sgr", "建增八": "rho2 sgr", "天渊二": "bet1 sgr", "齐增八": "3 vul", "天渊一": "bet2 sgr", "天渊三": "alf sgr", "辇道增八": "2 cyg", "左旗增三": "2 sge", "左旗增二": "3 sge", "吴越增七": "b aql", "狗二": "chi1 sgr", "狗增五": "chi2 sgr", "齐增七": "3 cyg", "左旗增四": "4 vul", "右旗三": "del aql", "狗增七": "chi3 sgr", "狗增四": "chi3 sgr", "辇道四": "4 cyg", "左旗增五": "5 vul", "狗增三": "50 sgr", "右旗四": "nu. aql", "奚仲增一": "iot1 cyg", "齐增五": "alf vul", "齐增十一": "8 vul", "右旗增四": "c aql", "左旗增六": "7 vul", "奚仲二": "iot cyg", "右旗增八": "e aql", "右旗增七": "e aql", "辇道增七": "bet1 cyg", "辇道增九": "8 cyg", "天厨二": "sig dra", "右旗一": "mu. aql", "左旗增七": "9 vul", "右旗增十": "37 aql", "辇道增三": "11 cyg", "右旗六": "hip 96392", "狗增一": "h1 sgr", "奚仲三": "tet cyg", "狗一": "h2 sgr", "右旗五": "iot aql", "右旗增六": "iot aql", "右旗八": "kap aql", "左旗增一": "eps sge", "右旗七": "42 aql", "右旗二": "sig aql", "辇道增六": "phi cyg", "天津增一": "14 cyg", "狗增二": "53 sgr", "左旗一": "alf sge", "右旗增五": "45 aql", "天鸡增一": "e1 sgr", "左旗二": "bet sge", "奚仲四": "c cyg", "河鼓增二": "46 aql", "天鸡一": "e2 sgr", "河鼓增三": "chi aql", "左旗增八": "10 vul", "辇道增四": "15 cyg", "河鼓增一": "psi aql", "天津二": "del cyg", "河鼓增九": "ups aql", "河鼓三": "gam aql", "天鸡二": "f sgr", "辇道五": "17 cyg", "左旗三": "del sge", "天厨三": "eps dra", "河鼓增四": "pi. aql", "左旗四": "zet sge", "天津增二": "19 cyg", "奚仲增二": "d cyg", "河鼓二": "alf aql", "牛郎": "alf aql", "右旗增十一": "51 aql", "河鼓增五": "omi aql", "左旗增十八": "12 vul", "天鸡增二": "57 sgr", "左旗增廿九": "9 sge", "天桴四": "eta aql", "奚仲增六": "23 cyg", "奚仲增七": "23 cyg", "左旗增十七": "13 vul", "右旗九": "56 aql", "河鼓增八": "ksi aql", "右旗增十二": "57 aql", "天桴三": "58 aql", "天渊增一": "iot sgr", "河鼓一": "bet aql", "狗国一": "ome sgr", "天津增三": "22 cyg", "左旗增廿八": "10 sge", "河鼓增六": "phi aql", "辇道增五": "eta cyg", "狗国四": "b sgr", "左旗七": "11 sge", "天鸡增三": "g sgr", "左旗五": "gam sge", "狗国二": "a sgr", "左旗增十九": "14 vul", "天柱三": "69 dra", "天渊增二": "tet1 sgr", "狗国增二": "tet2 sgr", "天津增四": "25 cyg", "左旗六": "13 sge", "孔雀九": "eps pav", "左旗增十": "15 vul", "奚仲增三": "e cyg", "天厨五": "e dra", "牛宿增一": "63 sgr", "左旗增十六": "16 vul", "天厨增二": "65 dra", "狗国三": "c sgr", "天厨四": "rho dra", "左旗八": "14 sge", "左旗增廿七": "15 sge", "河鼓增七": "tau aql", "狗国增一": "hip 98842", "天桴二": "62 aql", "牛宿增三": "64 sgr", "左旗增廿六": "eta sge", "牛宿增二": "65 sgr", "天钩增一": "66 dra", "天津增五": "b1 cyg", "左旗增廿": "17 vul", "天桴增一": "64 aql", "孔雀六": "del pav", "天柱增二": "kap cep", "天津增六": "b2 cyg", "左旗增廿五": "tet sge", "左旗增十三": "18 vul", "狗国增三": "hip 99461", "天桴一": "tet aql", "天钩增二": "68 dra", "左旗增十四": "19 vul", "牛宿增四": "ksi1 cap", "左旗增十五": "20 vul", "牛宿三": "ksi cap", "天桴增二": "66 aql", "天津三": "30 cyg", "奚仲增四": "33 cyg", "天津增卅八": "omi1 cyg", "左旗增十一": "21 vul", "左旗九": "rho aql", "天津增七": "b3 cyg", "天津增卅七": "omi2 cyg", "左旗增廿三": "22 vul", "左旗增十二": "23 vul", "左旗增廿四": "18 sge", "牛宿增五": "3 cap", "左旗增廿一": "24 vul", "牛宿增六": "alf1 cap", "天津增九": "p cyg", "牛宿增九": "4 cap", "牛宿二": "alf2 cap", "天津增八": "36 cyg", "天津增十四": "35 cyg", "牛宿增八": "sig cap", "天钩增三": "71 dra", "天钩增四": "71 dra", "牛宿增七": "nu. cap", "牛宿增十一": "nu. cap", "牛宿增十二": "bet2 cap", "牛宿一": "bet cap", "左旗增廿二": "25 vul", "天津一": "gam cyg", "天津增十五": "39 cyg", "孔雀十一": "alf pav", "天津增卅六": "43 cyg", "牛宿四": "pi. cap", "牛宿增十三": "pi. cap", "天津增十": "40 cyg", "天柱增四": "75 dra", "离珠增一": "68 aql", "牛宿六": "rho cap", "天津增十二": "42 cyg", "天津增十六": "41 cyg", "天柱增三": "74 dra", "天钩三": "tet cep", "离珠四": "69 aql", "牛宿五": "omi cap", "天津增卅五": "ome1 cyg", "败瓜增一": "1 del", "天津增十一": "44 cyg", "天津增卅四": "ome2 cyg", "紫微左垣六": "73 dra", "败瓜一": "eps del", "天津增十三": "47 cyg", "败瓜二": "eta del", "瓠瓜五": "zet del", "天津增廿一": "26 vul", "离珠一": "70 aql", "天津增廿": "27 vul", "罗堰增一": "tau1 cap", "天津增十七": "48 cyg", "瓠瓜四": "bet del", "波斯二": "alf ind", "败瓜四": "iot del", "离珠二": "l aql", "瓠瓜增五": "29 vul", "天津增廿二": "28 vul", "败瓜三": "tet del", "瓠瓜增六": "hip 101909", "败瓜五": "kap del", "罗堰一": "tau cap", "离珠三": "1 aqr", "瓠瓜一": "alf del", "罗堰二": "ups cap", "天津增十八": "49 cyg", "瓠瓜增一": "10 del", "天津四": "alf cyg", "车府增一": "51 cyg", "天柱一": "76 dra", "天钩一": "4 cep", "瓠瓜三": "del del", "天津增廿三": "30 vul", "孔雀七": "bet pav", "天钩四": "eta cep", "天津增十九": "52 cyg", "罗堰三": "17 cap", "天津九": "eps cyg", "瓠瓜二": "gam2 del", "瓠瓜增七": "gam2 del", "天津增卅九": "t cyg", "天津增四十": "t cyg", "天津增卅": "lam cyg", "女宿一": "eps aqr", "女宿四": "k aqr", "败瓜增三": "13 del", "天津增卅三": "55 cyg", "瓠瓜增二": "15 del", "败瓜增二": "14 del", "天津增卅一": "56 cyg", "女宿三": "4 aqr", "波斯十一": "iot ind", "天津增廿四": "31 vul", "女宿增一": "5 aqr", "女宿二": "mu. aqr", "天津增卅二": "57 cyg", "天津增廿五": "32 vul", "越": "19 cap", "孔雀增四": "bet ind", "瓠瓜增八": "17 del", "瓠瓜增四": "17 del", "瓠瓜增三": "16 del", "女宿增五": "7 aqr", "天津五": "nu. cyg", "人增一": "33 vul", "司非增二": "18 del", "虚宿增四": "eps equ", "车府五": "f1 cyg", "天垒城九": "8 aqr", "女宿增三": "10 aqr", "女宿增二": "11 aqr", "周二": "21 cap", "天垒城八": "9 aqr", "车府增二": "60 cyg", "离瑜增一": "gam mic", "虚宿增一": "lam equ", "女宿增四": "12 aqr", "周一": "eta cap", "虚宿增三": "3 equ", "蛇尾四": "alf oct", "车府六": "ksi cyg", "虚宿增二": "4 equ", "天柱二": "77 dra", "秦一": "tet cap", "离瑜增二": "2 psa", "车府增三": "f2 cyg", "天津增廿九": "61 cyg", "赵一": "26 cap", "赵二": "27 cap", "天垒城十": "nu. aqr", "天垒城增二": "nu. aqr", "司非一": "gam equ", "司非增三": "6 equ", "司非增一": "6 equ", "九坎二": "η mic", "天津八": "zet cyg", "司非二": "del equ", "天津六": "tau cyg", "天垒城七": "29 cap", "虚宿二": "alf equ", "天垒城十一": "14 aqr", "天津增廿八": "sig cyg", "天津七": "ups cyg", "离瑜二": "eps mic", "秦二": "30 cap", "虚宿增五": "15 aqr", "天钩五": "alf cep", "天钩增六": "6 cep", "天钩增五": "6 cep", "虚宿增六": "16 aqr", "司危二": "9 equ", "人二": "1 peg", "代一": "iot cap", "司危一": "bet equ", "天垒城十二": "17 aqr", "天垒城六": "18 aqr", "虚宿增八": "20 aqr", "天垒城十三": "19 aqr", "虚宿增七": "21 aqr", "天津增廿六": "69 cyg", "孔雀十": "gam pav", "天津增廿七": "70 cyg", "天钩增七": "7 cep", "离瑜三": "5 psa", "车府增四": "g cyg", "人一": "2 peg", "虚宿一": "bet aqr", "离瑜增三": "6 psa", "车府四": "rho cyg", "车府增八": "72 cyg", "代增一": "37 cap", "代二": "38 cap", "天钱增三": "8 psa", "天钱增四": "7 psa", "车府七": "74 cyg", "垒壁阵二": "eps cap", "危宿增一": "3 peg", "天垒城一": "ksi aqr", "人增三": "5 peg", "天钩增十": "9 cep", "危宿增二": "4 peg", "螣蛇七": "hip 106886", "司命一": "24 aqr", "司禄二": "d aqr", "司禄增二": "d aqr", "垒壁阵三": "gam cap", "车府增五": "75 cyg", "蛇尾三": "nu. oct", "哭增一": "42 cap", "车府增七": "76 cyg", "代增二": "41 cap", "螣蛇四": "pi.1 cyg", "司命二": "26 aqr", "危宿增三": "7 peg", "车府增六": "77 cyg", "垒壁阵一": "kap cap", "哭增二": "44 cap", "造父四": "mu. cep", "哭增三": "45 cap", "臼一": "mu.1 cyg", "危宿三": "eps peg", "人四": "9 peg", "臼二": "kap peg", "天钱三": "iot psa", "天垒城二": "c cap", "造父五": "nu. cep", "造父增五": "nu. cep", "人三": "12 peg", "天垒城三": "47 cap", "天垒城四": "lam cap", "天垒城五": "50 cap", "螣蛇三": "pi.2 cyg", "垒壁阵四": "del cap", "司禄一": "11 peg", "司禄增一": "11 peg", "造父增四": "12 cep", "天钱二": "tet psa", "臼增一": "14 peg", "人增四": "13 peg", "臼增二": "15 peg", "臼增三": "16 peg", "哭一": "mu. cap", "败臼一": "gam gru", "螣蛇八": "13 cep", "危宿增十三": "17 peg", "危宿增十一": "17 peg", "少卫增二": "16 cep", "天钱增二": "11 psa", "危宿增七": "18 peg", "天钱增一": "eta psa", "危宿增四": "28 aqr", "危宿增十": "20 peg", "危宿增八": "19 peg", "造父增一": "14 cep", "羽林军一": "29 aqr", "泣增一": "30 aqr", "盖屋一": "omi aqr", "危宿增九": "21 peg", "天钩六": "ksi cep", "天钩增十三": "18 cep", "造父增三": "15 cep", "天钱一": "13 psa", "盖屋二": "32 aqr", "天钩增十二": "20 cep", "天钩增十七": "20 cep", "天钩增十八": "19 cep", "天钩增十一": "19 cep", "杵三": "23 peg", "危宿增六": "nu. peg", "危宿一": "alf aqr", "败臼二": "lam gru", "垒壁阵五": "iot aqr", "臼三": "iot peg", "臼增四": "25 peg", "鹤一": "alf gru", "天钱四": "mu. psa", "羽林军二": "35 aqr", "泣增二": "36 aqr", "少卫增三": "24 cep", "天钱五": "tau psa", "危宿二": "tet peg", "少卫增四": "80 dra", "臼增五": "28 peg", "哭增四": "37 aqr", "哭二": "e aqr", "造父二": "zet cep", "造父三": "lam cep", "羽林军三": "41 aqr", "羽林军六": "lam psa", "螣蛇九": "eps cep", "鹤十二": "mu.1 gru", "鹤增一": "mu.2 gru", "泣二": "tet aqr", "虚梁一": "44 aqr", "蛇尾二": "psi oct", "天钩增十四": "25 cep", "鸟喙一": "alf tuc", "羽林军十八": "45 aqr", "泣一": "rho aqr", "危宿增五": "30 peg", "车府三": "2 lac", "臼四": "32 peg", "土公吏一": "31 peg", "羽林军四": "47 aqr", "坟墓二": "gam aqr", "羽林军五": "49 aqr", "螣蛇十": "bet lac", "离宫增一": "33 peg", "虚梁二": "51 aqr", "羽林军十七": "50 aqr", "螣蛇二": "4 lac", "坟墓四": "pi. aqr", "羽林军十五": "f aqr", "坟墓增一": "34 peg", "垒壁阵增一": "54 aqr", "天钩七": "26 cep", "鸟喙二": "del tuc", "坟墓增二": "35 peg", "鹤十": "nu. gru", "坟墓一": "zet1 aqr", "土公吏二": "36 peg", "造父一": "del cep", "鹤增二": "del1 gru", "车府增十九": "5 lac", "鹤十一": "del2 gru", "少卫增七": "rho cep", "坟墓增三": "37 peg", "羽林军十六": "56 aqr", "车府增九": "6 lac", "垒壁阵六": "sig aqr", "螣蛇一": "alf lac", "败臼增一": "bet psa", "羽林军十九": "58 aqr", "离宫增二": "39 peg", "坟墓增四": "60 aqr", "羽林军十一": "ups aqr", "坟墓三": "eta aqr", "少卫增六": "31 cep", "少卫增五": "31 cep", "羽林军十四": "61 aqr", "车府增十": "8 lac", "螣蛇十五": "9 lac", "虚梁三": "kap aqr", "天钩增十六": "30 cep", "离宫增三": "40 peg", "车府增十一": "10 lac", "羽林军廿": "64 aqr", "离宫增四": "41 peg", "车府二": "11 lac", "羽林军八": "eps psa", "雷电一": "zet peg", "车府增十二": "12 lac", "离宫三": "omi peg", "败臼四": "19 psa", "鹤二": "bet gru", "离宫四": "eta peg", "羽林军廿一": "65 aqr", "垒壁阵增二": "67 aqr", "鹤九": "rho gru", "羽林军十三": "g1 aqr", "车府增十三": "13 lac", "离宫增五": "45 peg", "羽林军十": "20 psa a", "鹤四": "eta gru", "离宫一": "lam peg", "雷电二": "ksi peg", "勾陈增一": "hip 112519", "羽林军十二": "g2 aqr", "羽林军廿五": "tau1 aqr", "羽林军廿二": "70 aqr", "鹤三": "eps gru", "羽林军廿四": "tau aqr", "天钩八": "iot cep", "离宫二": "mu. peg", "车府增十四": "14 lac", "羽林军九": "21 psa", "车府一": "15 lac", "雷电三": "sig peg", "败臼三": "gam psa", "垒壁阵七": "lam aqr", "羽林军廿三": "74 aqr", "垒壁阵增三": "78 aqr", "羽林军廿六": "del aqr", "羽林军廿七": "77 aqr", "雷电增二": "rho peg", "天纲": "del psa", "车府增十五": "16 lac", "室宿增一": "51 peg", "北落师门": "alf psa", "雷电增一": "52 peg", "霹雳增二": "2 psc", "霹雳增一": "3 psc", "鹤六": "zet gru", "车府增廿": "omi and", "车府增十六": "omi and", "车府增十七": "2 and", "室宿二": "bet peg", "霹雳一": "bet psc", "螣蛇十六": "3 and", "室宿一": "alf peg", "羽林军四二": "h aqr", "羽林军四一": "85 aqr", "螣蛇增十三": "1 cas", "羽林军卅": "c1 aqr", "鹤八": "tet gru", "雷电四": "55 peg", "室宿增二": "56 peg", "羽林军四十": "87 aqr", "螣蛇增四": "4 and", "螣蛇增二": "5 and", "紫微左垣七": "pi. cep", "霹雳增三": "a psc", "羽林军廿八": "c2 aqr", "雷电增三": "57 peg", "螣蛇增十六": "2 cas", "螣蛇增十五": "2 cas", "羽林军廿九": "c3 aqr", "雷电增五": "58 peg", "鹤七": "iot gru", "车府增十八": "6 and", "雷电增四": "59 peg", "室宿增三": "60 peg", "螣蛇十七": "7 and", "垒壁阵八": "phi aqr", "室宿增四": "61 peg", "羽林军卅九": "psi1 aqr", "羽林军四三": "chi aqr", "霹雳二": "gam psc", "鹤五": "gam tuc", "螣蛇十八": "8 and", "羽林军卅八": "psi2 aqr", "螣蛇增七": "9 and", "天钩九": "omi cep", "羽林军卅七": "psi3 aqr", "羽林军卅六": "94 aqr", "螣蛇增三": "11 and", "螣蛇增十七": "hip 115171", "螣蛇增六": "10 and", "霹雳增四": "b psc", "离宫五": "tau peg", "室宿增五": "63 peg", "螣蛇增八": "12 and", "室宿增六": "64 peg", "羽林军卅五": "97 aqr", "离宫增六": "65 peg", "羽林军卅四": "b1 aqr", "雷电五": "66 peg", "螣蛇增十四": "4 cas", "室宿增七": "67 peg", "离宫六": "ups peg", "羽林军卅三": "b2 aqr", "云雨一": "kap psc", "螣蛇增五": "13 and", "云雨增四": "9 psc", "离宫增八": "69 peg", "霹雳三": "tet psc", "雷电六": "70 peg", "云雨增一": "11 psc", "云雨二": "12 psc", "螣蛇十四": "ar cas", "螣蛇增九": "14 and", "羽林军卅二": "100 aqr", "云雨增三": "13 psc", "火鸟一": "bet scl", "羽林军卅一": "b3 aqr", "离宫增七": "71 peg", "壁宿增二": "72 peg", "云雨增二": "14 psc", "螣蛇增十": "15 and", "壁宿增一": "73 peg", "火鸟二": "iot phe", "云雨增五": "15 psc", "云雨增六": "16 psc", "螣蛇十九": "lam and", "雷电增七": "75 peg", "螣蛇廿二": "iot and", "螣蛇增十二": "18 and", "少卫增八": "gam cep", "羽林军四四": "ome1 aqr", "霹雳四": "iot psc", "螣蛇廿一": "kap and", "𫓧钺一": "a1 aqr", "𫓧钺增三": "a2 aqr", "𫓧钺增一": "a2 aqr", "云雨四": "lam psc", "羽林军四五": "ome2 aqr", "雷电增八": "76 peg", "霹雳增五": "77 peg", "壁宿增三": "78 peg", "𫓧钺二": "i1 aqr", "𫓧钺增二": "i2 aqr", "螣蛇廿": "psi and", "云雨增七": "19 psc", "螣蛇十三": "tau cas", "垒壁阵增四": "20 psc", "王良增一": "6 cas", "云雨三": "21 psc", "云雨增十": "21 psc", "壁宿增四": "79 peg", "霹雳增七": "80 peg", "𫓧钺三": "i3 aqr", "云雨增八": "22 psc", "壁宿增八": "23 psc", "壁宿增九": "phi peg", "霹雳增六": "82 peg", "壁宿增七": "83 peg", "垒壁阵增五": "24 psc", "云雨增九": "25 psc", "螣蛇十二": "rho cas", "霹雳增八": "26 psc", "鸟喙三": "hip 118092", "鸟喙增一": "eta tuc", "壁宿增六": "psi peg", "八魁三": "1 cet", "垒壁阵九": "27 psc", "螣蛇十一": "sig cas", "霹雳五": "ome psc", "鸟喙七": "eps tuc", "仙女座 α": "alf and", "仙女座 22": "22 and", "仙女座 β": "bet and", "仙女座 γ1": "gam1 and", "仙女座 γ2": "gam2 and", "仙女座 δ": "del and", "仙女座 ε": "eps and", "仙女座 ζ": "zet and", "仙女座 η": "eta and", "仙女座 θ": "tet and", "仙女座 ι": "iot and", "仙女座 κ": "kap and", "仙女座 λ": "lam and", "仙女座 μ": "mu. and", "仙女座 ν": "nu. and", "仙女座 ξ": "ksi and", "仙女座 ο": "omi and", "仙女座 π": "pi. and", "仙女座 ρ": "rho and", "仙女座 σ": "sig and", "仙女座 τ": "tau and", "仙女座 υ": "ups and", "仙女座 φ": "phi and", "仙女座 χ": "chi and", "仙女座 ψ": "psi and", "仙女座 ω": "ome and", "仙女座 b": "b and", "仙女座 c": "c and", "仙女座 A": "a and", "仙女座 1": "1 and", "仙女座 2": "2 and", "仙女座 3": "3 and", "仙女座 4": "4 and", "仙女座 5": "5 and", "仙女座 6": "6 and", "仙女座 7": "7 and", "仙女座 8": "8 and", "仙女座 9": "9 and", "仙女座 10": "10 and", "仙女座 11": "11 and", "仙女座 12": "12 and", "仙女座 13": "13 and", "仙女座 14": "14 and", "仙女座 15": "15 and", "仙女座 16": "16 and", "仙女座 17": "17 and", "仙女座 18": "18 and", "仙女座 19": "19 and", "仙女座 20": "20 and", "仙女座 21": "21 and", "仙女座 23": "23 and", "仙女座 24": "24 and", "仙女座 25": "25 and", "仙女座 26": "26 and", "仙女座 27": "27 and", "仙女座 28": "28 and", "仙女座 29": "29 and", "仙女座 30": "30 and", "仙女座 31": "31 and", "仙女座 32": "32 and", "仙女座 34": "34 and", "仙女座 35": "35 and", "仙女座 36": "36 and", "仙女座 37": "37 and", "仙女座 38": "38 and", "仙女座 39": "39 and", "仙女座 41": "41 and", "仙女座 42": "42 and", "仙女座 43": "43 and", "仙女座 44": "44 and", "仙女座 45": "45 and", "仙女座 46": "46 and", "仙女座 47": "47 and", "仙女座 48": "48 and", "仙女座 49": "49 and", "仙女座 50": "50 and", "仙女座 51": "51 and", "仙女座 52": "52 and", "仙女座 53": "53 and", "仙女座 55": "55 and", "仙女座 56": "56 and", "仙女座 57": "57 and", "仙女座 58": "58 and", "仙女座 59": "59 and", "仙女座 60": "60 and", "仙女座 61": "61 and", "仙女座 62": "62 and", "仙女座 63": "63 and", "仙女座 64": "64 and", "仙女座 65": "65 and", "仙女座 66": "66 and", "唧筒座 α": "alf ant", "唧筒座 δ": "del ant", "唧筒座 ε": "eps ant", "唧筒座 ζ1": "zet1 ant", "唧筒座 ζ2": "zet2 ant", "唧筒座 η": "eta ant", "唧筒座 θ": "tet ant", "唧筒座 ι": "iot ant", "天燕座 α": "alf aps", "天燕座 β": "bet aps", "天燕座 γ": "gam aps", "天燕座 δ1": "del1 aps", "天燕座 δ2": "del2 aps", "天燕座 ε": "eps aps", "天燕座 ζ": "zet aps", "天燕座 η": "eta aps", "天燕座 θ": "tet aps", "天燕座 ι": "iot aps", "天燕座 κ1": "kap1 aps", "天燕座 κ2": "kap2 aps", "宝瓶座 α": "alf aqr", "宝瓶座 β": "bet aqr", "宝瓶座 γ": "gam aqr", "宝瓶座 δ": "del aqr", "宝瓶座 ε": "eps aqr", "宝瓶座 ζ1": "zet1 aqr", "宝瓶座 ζ2": "zet2 aqr", "宝瓶座 η": "eta aqr", "宝瓶座 θ": "tet aqr", "宝瓶座 ι": "iot aqr", "宝瓶座 κ": "kap aqr", "宝瓶座 λ": "lam aqr", "宝瓶座 μ": "mu. aqr", "宝瓶座 ν": "nu. aqr", "宝瓶座 ξ": "ksi aqr", "宝瓶座 ο": "omi aqr", "宝瓶座 π": "pi. aqr", "宝瓶座 ρ": "rho aqr", "宝瓶座 σ": "sig aqr", "宝瓶座 τ": "tau aqr", "宝瓶座 τ1": "tau1 aqr", "宝瓶座 τ2": "tau2 aqr", "宝瓶座 υ": "ups aqr", "宝瓶座 φ": "phi aqr", "宝瓶座 χ": "chi aqr", "宝瓶座 ψ1": "psi1 aqr", "宝瓶座 ψ2": "psi2 aqr", "宝瓶座 ψ3": "psi3 aqr", "宝瓶座 ω1": "ome1 aqr", "宝瓶座 ω2": "ome2 aqr", "宝瓶座 b1": "b1 aqr", "宝瓶座 b2": "b2 aqr", "宝瓶座 b3": "b3 aqr", "宝瓶座 c1": "c1 aqr", "宝瓶座 c2": "c2 aqr", "宝瓶座 c3": "c3 aqr", "宝瓶座 d": "d aqr", "宝瓶座 e": "e aqr", "宝瓶座 f": "f aqr", "宝瓶座 g1": "g1 aqr", "宝瓶座 g2": "g2 aqr", "宝瓶座 h": "h aqr", "宝瓶座 i1": "i1 aqr", "宝瓶座 i2": "i2 aqr", "宝瓶座 i3": "i3 aqr", "宝瓶座 k": "k aqr", "宝瓶座 A1": "a1 aqr", "宝瓶座 A2": "a2 aqr", "宝瓶座 1": "1 aqr", "宝瓶座 2": "2 aqr", "宝瓶座 3": "3 aqr", "宝瓶座 4": "4 aqr", "宝瓶座 5": "5 aqr", "宝瓶座 6": "6 aqr", "宝瓶座 7": "7 aqr", "宝瓶座 8": "8 aqr", "宝瓶座 9": "9 aqr", "宝瓶座 10": "10 aqr", "宝瓶座 11": "11 aqr", "宝瓶座 12": "12 aqr", "宝瓶座 13": "13 aqr", "宝瓶座 14": "14 aqr", "宝瓶座 15": "15 aqr", "宝瓶座 16": "16 aqr", "宝瓶座 17": "17 aqr", "宝瓶座 18": "18 aqr", "宝瓶座 19": "19 aqr", "宝瓶座 20": "20 aqr", "宝瓶座 21": "21 aqr", "宝瓶座 22": "22 aqr", "宝瓶座 23": "23 aqr", "宝瓶座 24": "24 aqr", "宝瓶座 25": "25 aqr", "宝瓶座 26": "26 aqr", "宝瓶座 28": "28 aqr", "宝瓶座 29": "29 aqr", "宝瓶座 30": "30 aqr", "宝瓶座 31": "31 aqr", "宝瓶座 32": "32 aqr", "宝瓶座 33": "33 aqr", "宝瓶座 34": "34 aqr", "宝瓶座 35": "35 aqr", "宝瓶座 36": "36 aqr", "宝瓶座 37": "37 aqr", "宝瓶座 38": "38 aqr", "宝瓶座 39": "39 aqr", "宝瓶座 40": "40 aqr", "宝瓶座 41": "41 aqr", "宝瓶座 42": "42 aqr", "宝瓶座 43": "43 aqr", "宝瓶座 44": "44 aqr", "宝瓶座 45": "45 aqr", "宝瓶座 46": "46 aqr", "宝瓶座 47": "47 aqr", "宝瓶座 48": "48 aqr", "宝瓶座 49": "49 aqr", "宝瓶座 50": "50 aqr", "宝瓶座 51": "51 aqr", "宝瓶座 52": "52 aqr", "宝瓶座 53": "53 aqr", "宝瓶座 54": "54 aqr", "宝瓶座 55": "55 aqr", "宝瓶座 56": "56 aqr", "宝瓶座 57": "57 aqr", "宝瓶座 58": "58 aqr", "宝瓶座 59": "59 aqr", "宝瓶座 60": "60 aqr", "宝瓶座 61": "61 aqr", "宝瓶座 62": "62 aqr", "宝瓶座 63": "63 aqr", "宝瓶座 64": "64 aqr", "宝瓶座 65": "65 aqr", "宝瓶座 66": "66 aqr", "宝瓶座 67": "67 aqr", "宝瓶座 68": "68 aqr", "宝瓶座 69": "69 aqr", "宝瓶座 70": "70 aqr", "宝瓶座 71": "71 aqr", "宝瓶座 72": "72 aqr", "宝瓶座 73": "73 aqr", "宝瓶座 74": "74 aqr", "宝瓶座 75": "75 aqr", "宝瓶座 76": "76 aqr", "宝瓶座 77": "77 aqr", "宝瓶座 78": "78 aqr", "宝瓶座 81": "81 aqr", "宝瓶座 82": "82 aqr", "宝瓶座 83": "83 aqr", "宝瓶座 84": "84 aqr", "宝瓶座 85": "85 aqr", "宝瓶座 86": "86 aqr", "宝瓶座 87": "87 aqr", "宝瓶座 88": "88 aqr", "宝瓶座 89": "89 aqr", "宝瓶座 90": "90 aqr", "宝瓶座 91": "91 aqr", "宝瓶座 92": "92 aqr", "宝瓶座 93": "93 aqr", "宝瓶座 94": "94 aqr", "宝瓶座 95": "95 aqr", "宝瓶座 96": "96 aqr", "宝瓶座 97": "97 aqr", "宝瓶座 98": "98 aqr", "宝瓶座 99": "99 aqr", "宝瓶座 100": "100 aqr", "宝瓶座 101": "101 aqr", "宝瓶座 102": "102 aqr", "宝瓶座 103": "103 aqr", "宝瓶座 104": "104 aqr", "宝瓶座 105": "105 aqr", "宝瓶座 106": "106 aqr", "宝瓶座 107": "107 aqr", "宝瓶座 108": "108 aqr", "天鹰座 α": "alf aql", "天鹰座 β": "bet aql", "天鹰座 γ": "gam aql", "天鹰座 δ": "del aql", "天鹰座 ε": "eps aql", "天鹰座 ζ": "zet aql", "天鹰座 η": "eta aql", "天鹰座 θ": "tet aql", "天鹰座 ι": "iot aql", "天鹰座 κ": "kap aql", "天鹰座 λ": "lam aql", "天鹰座 μ": "mu. aql", "天鹰座 ν": "nu. aql", "天鹰座 ξ": "ksi aql", "天鹰座 ο": "omi aql", "天鹰座 π": "pi. aql", "天鹰座 ρ": "rho aql", "天鹰座 σ": "sig aql", "天鹰座 τ": "tau aql", "天鹰座 υ": "ups aql", "天鹰座 φ": "phi aql", "天鹰座 χ": "chi aql", "天鹰座 ψ": "psi aql", "天鹰座 ω1": "ome1 aql", "天鹰座 ω2": "ome2 aql", "天鹰座 b": "b aql", "天鹰座 c": "c aql", "天鹰座 d": "d aql", "天鹰座 e": "e aql", "天鹰座 f": "f aql", "天鹰座 g": "g aql", "天鹰座 h": "h aql", "天鹰座 i": "i aql", "天鹰座 l": "l aql", "天鹰座 A": "a aql", "天鹰座 4": "4 aql", "天鹰座 5": "5 aql", "天鹰座 7": "7 aql", "天鹰座 8": "8 aql", "天鹰座 10": "10 aql", "天鹰座 11": "11 aql", "天鹰座 12": "12 aql", "天鹰座 13": "13 aql", "天鹰座 14": "14 aql", "天鹰座 15": "15 aql", "天鹰座 16": "16 aql", "天鹰座 17": "17 aql", "天鹰座 18": "18 aql", "天鹰座 19": "19 aql", "天鹰座 20": "20 aql", "天鹰座 21": "21 aql", "天鹰座 22": "22 aql", "天鹰座 23": "23 aql", "天鹰座 24": "24 aql", "天鹰座 25": "25 aql", "天鹰座 26": "26 aql", "天鹰座 27": "27 aql", "天鹰座 28": "28 aql", "天鹰座 29": "29 aql", "天鹰座 30": "30 aql", "天鹰座 31": "31 aql", "天鹰座 32": "32 aql", "天鹰座 35": "35 aql", "天鹰座 36": "36 aql", "天鹰座 37": "37 aql", "天鹰座 38": "38 aql", "天鹰座 39": "39 aql", "天鹰座 41": "41 aql", "天鹰座 42": "42 aql", "天鹰座 44": "44 aql", "天鹰座 45": "45 aql", "天鹰座 46": "46 aql", "天鹰座 47": "47 aql", "天鹰座 48": "48 aql", "天鹰座 49": "49 aql", "天鹰座 50": "50 aql", "天鹰座 51": "51 aql", "天鹰座 52": "52 aql", "天鹰座 53": "53 aql", "天鹰座 54": "54 aql", "天鹰座 55": "55 aql", "天鹰座 56": "56 aql", "天鹰座 57": "57 aql", "天鹰座 58": "58 aql", "天鹰座 59": "59 aql", "天鹰座 60": "60 aql", "天鹰座 61": "61 aql", "天鹰座 62": "62 aql", "天鹰座 63": "63 aql", "天鹰座 64": "64 aql", "天鹰座 65": "65 aql", "天鹰座 66": "66 aql", "天鹰座 67": "67 aql", "天鹰座 68": "68 aql", "天鹰座 69": "69 aql", "天鹰座 70": "70 aql", "天鹰座 71": "71 aql", "天坛座 α": "alf ara", "天坛座 β": "bet ara", "天坛座 γ": "gam ara", "天坛座 δ": "del ara", "天坛座 ε1": "eps1 ara", "天坛座 ε2": "eps2 ara", "天坛座 ζ": "zet ara", "天坛座 η": "eta ara", "天坛座 θ": "tet ara", "天坛座 ι": "iot ara", "天坛座 κ": "kap ara", "天坛座 λ": "lam ara", "天坛座 μ": "mu. ara", "天坛座 υ1": "ups1 ara", "天坛座 υ2": "ups2 ara", "天坛座 π": "pi. ara", "天坛座 σ": "sig ara", "白羊座 α": "alf ari", "白羊座 β": "bet ari", "白羊座 γ1": "gam1 ari", "白羊座 γ2": "gam2 ari", "白羊座 δ": "del ari", "白羊座 ε": "eps ari", "白羊座 ζ": "zet ari", "白羊座 η": "eta ari", "白羊座 θ": "tet ari", "白羊座 ι": "iot ari", "白羊座 κ": "kap ari", "白羊座 λ": "lam ari", "白羊座 μ": "mu. ari", "白羊座 ν": "nu. ari", "白羊座 ξ": "ksi ari", "白羊座 ο": "omi ari", "白羊座 π": "pi. ari", "白羊座 ρ": "rho ari", "白羊座 ρ1": "rho1 ari", "白羊座 ρ2": "rho2 ari", "白羊座 ρ3": "rho3 ari", "白羊座 σ": "sig ari", "白羊座 τ1": "tau1 ari", "白羊座 τ2": "tau2 ari", "白羊座 c": "c ari", "白羊座 1": "1 ari", "白羊座 3": "3 ari", "白羊座 4": "4 ari", "白羊座 5": "5 ari", "白羊座 6": "6 ari", "白羊座 7": "7 ari", "白羊座 8": "8 ari", "白羊座 9": "9 ari", "白羊座 10": "10 ari", "白羊座 11": "11 ari", "白羊座 12": "12 ari", "白羊座 13": "13 ari", "白羊座 14": "14 ari", "白羊座 15": "15 ari", "白羊座 16": "16 ari", "白羊座 17": "17 ari", "白羊座 19": "19 ari", "白羊座 20": "20 ari", "白羊座 21": "21 ari", "白羊座 22": "22 ari", "白羊座 23": "23 ari", "白羊座 24": "24 ari", "白羊座 25": "25 ari", "白羊座 26": "26 ari", "白羊座 27": "27 ari", "白羊座 29": "29 ari", "白羊座 30": "30 ari", "白羊座 31": "31 ari", "白羊座 32": "32 ari", "白羊座 33": "33 ari", "白羊座 34": "34 ari", "白羊座 35": "35 ari", "白羊座 36": "36 ari", "白羊座 37": "37 ari", "白羊座 38": "38 ari", "白羊座 39": "39 ari", "白羊座 40": "40 ari", "白羊座 41": "41 ari", "白羊座 42": "42 ari", "白羊座 43": "43 ari", "白羊座 44": "44 ari", "白羊座 45": "45 ari", "白羊座 46": "46 ari", "白羊座 47": "47 ari", "白羊座 48": "48 ari", "白羊座 49": "49 ari", "白羊座 50": "50 ari", "白羊座 51": "51 ari", "白羊座 52": "52 ari", "白羊座 53": "53 ari", "白羊座 54": "54 ari", "白羊座 55": "55 ari", "白羊座 56": "56 ari", "白羊座 57": "57 ari", "白羊座 58": "58 ari", "白羊座 59": "59 ari", "白羊座 60": "60 ari", "白羊座 61": "61 ari", "白羊座 62": "62 ari", "白羊座 63": "63 ari", "白羊座 64": "64 ari", "白羊座 65": "65 ari", "白羊座 66": "66 ari", "御夫座 α": "alf aur", "御夫座 β": "bet aur", "御夫座 δ": "del aur", "御夫座 ε": "eps aur", "御夫座 ζ": "zet aur", "御夫座 η": "eta aur", "御夫座 θ": "tet aur", "御夫座 ι": "iot aur", "御夫座 κ": "kap aur", "御夫座 λ": "lam aur", "御夫座 μ": "mu. aur", "御夫座 ν": "nu. aur", "御夫座 ξ": "ksi aur", "御夫座 ο": "omi aur", "御夫座 π": "pi. aur", "御夫座 ρ": "rho aur", "御夫座 σ": "sig aur", "御夫座 τ": "tau aur", "御夫座 υ": "ups aur", "御夫座 φ": "phi aur", "御夫座 χ": "chi aur", "御夫座 ψ1": "psi1 aur", "御夫座 ψ2": "psi2 aur", "御夫座 ψ3": "psi3 aur", "御夫座 ψ4": "psi4 aur", "御夫座 ψ5": "psi5 aur", "御夫座 ψ6": "psi6 aur", "御夫座 ψ7": "psi7 aur", "御夫座 ψ8": "psi8 aur", "御夫座 ψ9": "psi9 aur", "御夫座 ψ10": "psi10 aur", "御夫座 ω": "ome aur", "御夫座 1": "1 aur", "御夫座 2": "2 aur", "御夫座 3": "3 aur", "御夫座 4": "4 aur", "御夫座 5": "5 aur", "御夫座 6": "6 aur", "御夫座 7": "7 aur", "御夫座 8": "8 aur", "御夫座 9": "9 aur", "御夫座 10": "10 aur", "御夫座 11": "11 aur", "御夫座 13": "13 aur", "御夫座 14": "14 aur", "御夫座 15": "15 aur", "御夫座 16": "16 aur", "御夫座 17": "17 aur", "御夫座 18": "18 aur", "御夫座 19": "19 aur", "御夫座 20": "20 aur", "御夫座 21": "21 aur", "御夫座 22": "22 aur", "御夫座 24": "24 aur", "御夫座 25": "25 aur", "御夫座 26": "26 aur", "御夫座 27": "27 aur", "御夫座 28": "28 aur", "御夫座 29": "29 aur", "御夫座 30": "30 aur", "御夫座 31": "31 aur", "御夫座 32": "32 aur", "御夫座 33": "33 aur", "御夫座 34": "34 aur", "御夫座 35": "35 aur", "御夫座 36": "36 aur", "御夫座 37": "37 aur", "御夫座 38": "38 aur", "御夫座 39": "39 aur", "御夫座 40": "40 aur", "御夫座 41": "41 aur", "御夫座 42": "42 aur", "御夫座 43": "43 aur", "御夫座 44": "44 aur", "御夫座 45": "45 aur", "御夫座 46": "46 aur", "御夫座 47": "47 aur", "御夫座 48": "48 aur", "御夫座 49": "49 aur", "御夫座 50": "50 aur", "御夫座 51": "51 aur", "御夫座 52": "52 aur", "御夫座 53": "53 aur", "御夫座 54": "54 aur", "御夫座 55": "55 aur", "御夫座 56": "56 aur", "御夫座 57": "57 aur", "御夫座 58": "58 aur", "御夫座 59": "59 aur", "御夫座 60": "60 aur", "御夫座 61": "61 aur", "御夫座 62": "62 aur", "御夫座 63": "63 aur", "御夫座 64": "64 aur", "御夫座 65": "65 aur", "御夫座 66": "66 aur", "牧夫座 α": "alf boo", "牧夫座 β": "bet boo", "牧夫座 γ": "gam boo", "牧夫座 δ": "del boo", "牧夫座 ε": "eps boo", "牧夫座 ζ": "zet boo", "牧夫座 η": "eta boo", "牧夫座 θ": "tet boo", "牧夫座 ι": "iot boo", "牧夫座 κ1": "kap1 boo", "牧夫座 κ2": "kap2 boo", "牧夫座 λ": "lam boo", "牧夫座 μ1": "mu.1 boo", "牧夫座 μ2": "mu.2 boo", "牧夫座 ν1": "nu.1 boo", "牧夫座 ν2": "nu.2 boo", "牧夫座 ξ": "ksi boo", "牧夫座 ο": "omi boo", "牧夫座 π1": "pi.1 boo", "牧夫座 π2": "pi.2 boo", "牧夫座 ρ": "rho boo", "牧夫座 σ": "sig boo", "牧夫座 τ": "tau boo", "牧夫座 υ": "ups boo", "牧夫座 φ": "phi boo", "牧夫座 χ": "chi boo", "牧夫座 ψ": "psi boo", "牧夫座 ω": "ome boo", "牧夫座 b": "b boo", "牧夫座 c": "c boo", "牧夫座 d": "d boo", "牧夫座 e": "e boo", "牧夫座 f": "f boo", "牧夫座 g": "g boo", "牧夫座 h": "h boo", "牧夫座 i": "i boo", "牧夫座 k": "k boo", "牧夫座 A": "a boo", "牧夫座 1": "1 boo", "牧夫座 2": "2 boo", "牧夫座 3": "3 boo", "牧夫座 4": "4 boo", "牧夫座 5": "5 boo", "牧夫座 6": "6 boo", "牧夫座 7": "7 boo", "牧夫座 8": "8 boo", "牧夫座 9": "9 boo", "牧夫座 10": "10 boo", "牧夫座 11": "11 boo", "牧夫座 12": "12 boo", "牧夫座 13": "13 boo", "牧夫座 14": "14 boo", "牧夫座 15": "15 boo", "牧夫座 16": "16 boo", "牧夫座 17": "17 boo", "牧夫座 18": "18 boo", "牧夫座 19": "19 boo", "牧夫座 20": "20 boo", "牧夫座 21": "21 boo", "牧夫座 22": "22 boo", "牧夫座 23": "23 boo", "牧夫座 24": "24 boo", "牧夫座 25": "25 boo", "牧夫座 26": "26 boo", "牧夫座 27": "27 boo", "牧夫座 28": "28 boo", "牧夫座 29": "29 boo", "牧夫座 30": "30 boo", "牧夫座 31": "31 boo", "牧夫座 32": "32 boo", "牧夫座 33": "33 boo", "牧夫座 34": "34 boo", "牧夫座 35": "35 boo", "牧夫座 36": "36 boo", "牧夫座 37": "37 boo", "牧夫座 38": "38 boo", "牧夫座 39": "39 boo", "牧夫座 40": "40 boo", "牧夫座 41": "41 boo", "牧夫座 42": "42 boo", "牧夫座 43": "43 boo", "牧夫座 44": "44 boo", "牧夫座 45": "45 boo", "牧夫座 46": "46 boo", "牧夫座 47": "47 boo", "牧夫座 48": "48 boo", "牧夫座 49": "49 boo", "牧夫座 50": "50 boo", "牧夫座 51": "51 boo", "牧夫座 52": "52 boo", "牧夫座 53": "53 boo", "牧夫座 54": "54 boo", "雕具座 α": "alf cae", "雕具座 β": "bet cae", "雕具座 γ1": "gam1 cae", "雕具座 γ2": "gam2 cae", "雕具座 δ": "del cae", "雕具座 ζ": "zet cae", "雕具座 λ": "lam cae", "雕具座 ν": "nu. cae", "鹿豹座 α": "alf cam", "鹿豹座 β": "bet cam", "鹿豹座 γ": "gam cam", "鹿豹座 1": "1 cam", "鹿豹座 2": "2 cam", "鹿豹座 3": "3 cam", "鹿豹座 4": "4 cam", "鹿豹座 5": "5 cam", "鹿豹座 6": "6 cam", "鹿豹座 7": "7 cam", "鹿豹座 8": "8 cam", "鹿豹座 9": "9 cam", "鹿豹座 10": "10 cam", "鹿豹座 11": "11 cam", "鹿豹座 12": "12 cam", "鹿豹座 14": "14 cam", "鹿豹座 15": "15 cam", "鹿豹座 16": "16 cam", "鹿豹座 17": "17 cam", "鹿豹座 18": "18 cam", "鹿豹座 19": "19 cam", "鹿豹座 20": "20 cam", "鹿豹座 21": "21 cam", "鹿豹座 22": "22 cam", "鹿豹座 23": "23 cam", "鹿豹座 24": "24 cam", "鹿豹座 25": "25 cam", "鹿豹座 26": "26 cam", "鹿豹座 28": "28 cam", "鹿豹座 29": "29 cam", "鹿豹座 30": "30 cam", "鹿豹座 31": "31 cam", "鹿豹座 32": "32 cam", "鹿豹座 33": "33 cam", "鹿豹座 34": "34 cam", "鹿豹座 35": "35 cam", "鹿豹座 36": "36 cam", "鹿豹座 37": "37 cam", "鹿豹座 38": "38 cam", "鹿豹座 39": "39 cam", "鹿豹座 40": "40 cam", "鹿豹座 41": "41 cam", "鹿豹座 42": "42 cam", "鹿豹座 43": "43 cam", "鹿豹座 44": "44 cam", "鹿豹座 45": "45 cam", "鹿豹座 46": "46 cam", "鹿豹座 47": "47 cam", "鹿豹座 48": "48 cam", "鹿豹座 49": "49 cam", "鹿豹座 50": "50 cam", "鹿豹座 51": "51 cam", "鹿豹座 52": "52 cam", "鹿豹座 53": "53 cam", "鹿豹座 54": "54 cam", "鹿豹座 55": "55 cam", "鹿豹座 56": "56 cam", "鹿豹座 57": "57 cam", "巨蟹座 α": "alf cnc", "巨蟹座 β": "bet cnc", "巨蟹座 γ": "gam cnc", "巨蟹座 δ": "del cnc", "巨蟹座 ε": "eps cnc", "巨蟹座 ζ1": "zet1 cnc", "巨蟹座 ζ2": "zet2 cnc", "巨蟹座 η": "eta cnc", "巨蟹座 θ": "tet cnc", "巨蟹座 ι": "iot cnc", "巨蟹座 κ": "kap cnc", "巨蟹座 λ": "lam cnc", "巨蟹座 μ": "mu. cnc", "巨蟹座 μ1": "mu.1 cnc", "巨蟹座 μ2": "mu.2 cnc", "巨蟹座 ν": "nu. cnc", "巨蟹座 ξ": "ksi cnc", "巨蟹座 ο1": "omi1 cnc", "巨蟹座 ο2": "omi2 cnc", "巨蟹座 π": "pi. cnc", "巨蟹座 π1": "pi.1 cnc", "巨蟹座 π2": "pi.2 cnc", "巨蟹座 ρ1": "rho1 cnc", "巨蟹座 ρ2": "rho2 cnc", "巨蟹座 σ1": "sig1 cnc", "巨蟹座 σ2": "sig2 cnc", "巨蟹座 σ3": "sig3 cnc", "巨蟹座 τ": "tau cnc", "巨蟹座 υ1": "ups1 cnc", "巨蟹座 υ2": "ups2 cnc", "巨蟹座 φ1": "phi1 cnc", "巨蟹座 φ2": "phi2 cnc", "巨蟹座 χ": "chi cnc", "巨蟹座 ψ": "psi cnc", "巨蟹座 ψ1": "psi1 cnc", "巨蟹座 ψ2": "psi2 cnc", "巨蟹座 ω1": "ome1 cnc", "巨蟹座 ω2": "ome2 cnc", "巨蟹座 b": "b cnc", "巨蟹座 c": "c cnc", "巨蟹座 d1": "d1 cnc", "巨蟹座 d2": "d2 cnc", "巨蟹座 A1": "a1 cnc", "巨蟹座 A2": "a2 cnc", "巨蟹座 1": "1 cnc", "巨蟹座 2": "2 cnc", "巨蟹座 3": "3 cnc", "巨蟹座 4": "4 cnc", "巨蟹座 5": "5 cnc", "巨蟹座 7": "7 cnc", "巨蟹座 8": "8 cnc", "巨蟹座 9": "9 cnc", "巨蟹座 10": "10 cnc", "巨蟹座 11": "11 cnc", "巨蟹座 12": "12 cnc", "巨蟹座 13": "13 cnc", "巨蟹座 14": "14 cnc", "巨蟹座 15": "15 cnc", "巨蟹座 16": "16 cnc", "巨蟹座 17": "17 cnc", "巨蟹座 18": "18 cnc", "巨蟹座 19": "19 cnc", "巨蟹座 20": "20 cnc", "巨蟹座 21": "21 cnc", "巨蟹座 22": "22 cnc", "巨蟹座 23": "23 cnc", "巨蟹座 24": "24 cnc", "巨蟹座 25": "25 cnc", "巨蟹座 27": "27 cnc", "巨蟹座 28": "28 cnc", "巨蟹座 29": "29 cnc", "巨蟹座 30": "30 cnc", "巨蟹座 31": "31 cnc", "巨蟹座 32": "32 cnc", "巨蟹座 33": "33 cnc", "巨蟹座 34": "34 cnc", "巨蟹座 35": "35 cnc", "巨蟹座 36": "36 cnc", "巨蟹座 37": "37 cnc", "巨蟹座 38": "38 cnc", "巨蟹座 39": "39 cnc", "巨蟹座 40": "40 cnc", "巨蟹座 41": "41 cnc", "巨蟹座 42": "42 cnc", "巨蟹座 43": "43 cnc", "巨蟹座 44": "44 cnc", "巨蟹座 45": "45 cnc", "巨蟹座 46": "46 cnc", "巨蟹座 47": "47 cnc", "巨蟹座 48": "48 cnc", "巨蟹座 49": "49 cnc", "巨蟹座 50": "50 cnc", "巨蟹座 51": "51 cnc", "巨蟹座 52": "52 cnc", "巨蟹座 53": "53 cnc", "巨蟹座 54": "54 cnc", "巨蟹座 55": "55 cnc", "巨蟹座 57": "57 cnc", "巨蟹座 58": "58 cnc", "巨蟹座 59": "59 cnc", "巨蟹座 60": "60 cnc", "巨蟹座 61": "61 cnc", "巨蟹座 62": "62 cnc", "巨蟹座 63": "63 cnc", "巨蟹座 64": "64 cnc", "巨蟹座 65": "65 cnc", "巨蟹座 66": "66 cnc", "巨蟹座 67": "67 cnc", "巨蟹座 68": "68 cnc", "巨蟹座 69": "69 cnc", "巨蟹座 70": "70 cnc", "巨蟹座 71": "71 cnc", "巨蟹座 72": "72 cnc", "巨蟹座 75": "75 cnc", "巨蟹座 76": "76 cnc", "巨蟹座 77": "77 cnc", "巨蟹座 78": "78 cnc", "巨蟹座 79": "79 cnc", "巨蟹座 80": "80 cnc", "巨蟹座 81": "81 cnc", "巨蟹座 82": "82 cnc", "巨蟹座 83": "83 cnc", "猎犬座 α1": "alf1 cvn", "猎犬座 α2": "alf2 cvn", "猎犬座 β": "bet cvn", "猎犬座 1": "1 cvn", "猎犬座 2": "2 cvn", "猎犬座 3": "3 cvn", "猎犬座 4": "4 cvn", "猎犬座 5": "5 cvn", "猎犬座 6": "6 cvn", "猎犬座 7": "7 cvn", "猎犬座 8": "8 cvn", "猎犬座 9": "9 cvn", "猎犬座 10": "10 cvn", "猎犬座 11": "11 cvn", "猎犬座 12": "12 cvn", "猎犬座 14": "14 cvn", "猎犬座 15": "15 cvn", "猎犬座 16": "16 cvn", "猎犬座 17": "17 cvn", "猎犬座 18": "18 cvn", "猎犬座 19": "19 cvn", "猎犬座 20": "20 cvn", "猎犬座 21": "21 cvn", "猎犬座 23": "23 cvn", "猎犬座 24": "24 cvn", "猎犬座 25": "25 cvn", "大犬座 α": "alf cma", "大犬座 β": "bet cma", "大犬座 γ": "gam cma", "大犬座 δ": "del cma", "大犬座 ε": "eps cma", "大犬座 ζ": "zet cma", "大犬座 η": "eta cma", "大犬座 θ": "tet cma", "大犬座 ι": "iot cma", "大犬座 κ": "kap cma", "大犬座 λ": "lam cma", "大犬座 μ": "mu. cma", "大犬座 ν1": "nu.1 cma", "大犬座 ν2": "nu.2 cma", "大犬座 ν3": "nu.3 cma", "大犬座 ξ1": "ksi1 cma", "大犬座 ξ2": "ksi2 cma", "大犬座 ο1": "omi1 cma", "大犬座 ο2": "omi2 cma", "大犬座 π": "pi. cma", "大犬座 σ": "sig cma", "大犬座 τ": "tau cma", "大犬座 ω": "ome cma", "大犬座 1": "1 cma", "大犬座 2": "2 cma", "大犬座 4": "4 cma", "大犬座 5": "5 cma", "大犬座 6": "6 cma", "大犬座 7": "7 cma", "大犬座 8": "8 cma", "大犬座 9": "9 cma", "大犬座 10": "10 cma", "大犬座 11": "11 cma", "大犬座 12": "12 cma", "大犬座 13": "13 cma", "大犬座 14": "14 cma", "大犬座 15": "15 cma", "大犬座 16": "16 cma", "大犬座 17": "17 cma", "大犬座 18": "18 cma", "大犬座 19": "19 cma", "大犬座 20": "20 cma", "大犬座 21": "21 cma", "大犬座 22": "22 cma", "大犬座 23": "23 cma", "大犬座 24": "24 cma", "大犬座 25": "25 cma", "大犬座 26": "26 cma", "大犬座 27": "27 cma", "大犬座 28": "28 cma", "大犬座 29": "29 cma", "大犬座 30": "30 cma", "大犬座 31": "31 cma", "大犬座 145": "145 cma", "小犬座 α": "alf cmi", "小犬座 β": "bet cmi", "小犬座 γ": "gam cmi", "小犬座 δ1": "del1 cmi", "小犬座 δ2": "del2 cmi", "小犬座 δ3": "del3 cmi", "小犬座 ε": "eps cmi", "小犬座 ζ": "zet cmi", "小犬座 η": "eta cmi", "小犬座 1": "1 cmi", "小犬座 2": "2 cmi", "小犬座 3": "3 cmi", "小犬座 4": "4 cmi", "小犬座 5": "5 cmi", "小犬座 6": "6 cmi", "小犬座 7": "7 cmi", "小犬座 8": "8 cmi", "小犬座 9": "9 cmi", "小犬座 10": "10 cmi", "小犬座 11": "11 cmi", "小犬座 13": "13 cmi", "小犬座 14": "14 cmi", "摩羯座 α1": "alf1 cap", "摩羯座 α2": "alf2 cap", "摩羯座 β": "bet cap", "摩羯座 β1": "bet1 cap", "摩羯座 β2": "bet2 cap", "摩羯座 γ": "gam cap", "摩羯座 δ": "del cap", "摩羯座 ε": "eps cap", "摩羯座 ζ": "zet cap", "摩羯座 η": "eta cap", "摩羯座 θ": "tet cap", "摩羯座 ι": "iot cap", "摩羯座 κ": "kap cap", "摩羯座 λ": "lam cap", "摩羯座 μ": "mu. cap", "摩羯座 ν": "nu. cap", "摩羯座 ξ": "ksi cap", "摩羯座 ξ1": "ksi1 cap", "摩羯座 ξ2": "ksi2 cap", "摩羯座 ο": "omi cap", "摩羯座 π": "pi. cap", "摩羯座 ρ": "rho cap", "摩羯座 σ": "sig cap", "摩羯座 τ": "tau cap", "摩羯座 τ1": "tau1 cap", "摩羯座 τ2": "tau2 cap", "摩羯座 υ": "ups cap", "摩羯座 φ": "phi cap", "摩羯座 χ": "chi cap", "摩羯座 ψ": "psi cap", "摩羯座 ω": "ome cap", "摩羯座 b": "b cap", "摩羯座 c": "c cap", "摩羯座 A": "a cap", "摩羯座 1": "1 cap", "摩羯座 2": "2 cap", "摩羯座 3": "3 cap", "摩羯座 4": "4 cap", "摩羯座 5": "5 cap", "摩羯座 6": "6 cap", "摩羯座 7": "7 cap", "摩羯座 8": "8 cap", "摩羯座 9": "9 cap", "摩羯座 10": "10 cap", "摩羯座 11": "11 cap", "摩羯座 12": "12 cap", "摩羯座 13": "13 cap", "摩羯座 14": "14 cap", "摩羯座 15": "15 cap", "摩羯座 16": "16 cap", "摩羯座 17": "17 cap", "摩羯座 18": "18 cap", "摩羯座 19": "19 cap", "摩羯座 20": "20 cap", "摩羯座 21": "21 cap", "摩羯座 22": "22 cap", "摩羯座 23": "23 cap", "摩羯座 24": "24 cap", "摩羯座 25": "25 cap", "摩羯座 26": "26 cap", "摩羯座 27": "27 cap", "摩羯座 28": "28 cap", "摩羯座 29": "29 cap", "摩羯座 30": "30 cap", "摩羯座 31": "31 cap", "摩羯座 32": "32 cap", "摩羯座 33": "33 cap", "摩羯座 34": "34 cap", "摩羯座 35": "35 cap", "摩羯座 36": "36 cap", "摩羯座 37": "37 cap", "摩羯座 38": "38 cap", "摩羯座 39": "39 cap", "摩羯座 40": "40 cap", "摩羯座 41": "41 cap", "摩羯座 42": "42 cap", "摩羯座 43": "43 cap", "摩羯座 44": "44 cap", "摩羯座 45": "45 cap", "摩羯座 46": "46 cap", "摩羯座 47": "47 cap", "摩羯座 48": "48 cap", "摩羯座 49": "49 cap", "摩羯座 50": "50 cap", "摩羯座 51": "51 cap", "船底座 α": "alf car", "船底座 β": "bet car", "船底座 ε": "eps car", "船底座 θ": "tet car", "船底座 ι": "iot car", "船底座 υ": "ups car", "船底座 χ": "chi car", "船底座 ω": "ome car", "船底座 a": "a car", "船底座 b1": "b1 car", "船底座 b2": "b2 car", "船底座 c": "c car", "船底座 d": "d car", "船底座 e1": "e1 car", "船底座 e2": "e2 car", "船底座 f": "f car", "船底座 g": "g car", "船底座 h": "h car", "船底座 i": "i car", "船底座 k": "k car", "船底座 l": "l car", "船底座 m": "m car", "船底座 p": "p car", "船底座 q": "q car", "船底座 r": "r car", "船底座 s": "s car", "船底座 t1": "t1 car", "船底座 t2": "t2 car", "船底座 u": "u car", "船底座 w": "w car", "船底座 x": "x car", "船底座 y": "y car", "船底座 z": "z car", "船底座 z1": "z1 car", "船底座 z2": "z2 car", "船底座 A": "a car", "船底座 B": "b car", "船底座 C": "c car", "船底座 D": "d car", "船底座 E": "e car", "船底座 G": "g car", "船底座 H": "h car", "船底座 I": "i car", "船底座 K": "k car", "船底座 L": "l car", "船底座 M": "m car", "船底座 N": "n car", "船底座 O": "o car", "船底座 P": "p car", "船底座 Q": "q car", "仙后座 α": "alf cas", "仙后座 β": "bet cas", "仙后座 γ": "gam cas", "仙后座 δ": "del cas", "仙后座 ε": "eps cas", "仙后座 ζ": "zet cas", "仙后座 η": "eta cas", "仙后座 θ": "tet cas", "仙后座 ι": "iot cas", "仙后座 κ": "kap cas", "仙后座 λ": "lam cas", "仙后座 μ": "mu. cas", "仙后座 ν": "nu. cas", "仙后座 ξ": "ksi cas", "仙后座 ο": "omi cas", "仙后座 π": "pi. cas", "仙后座 ρ": "rho cas", "仙后座 σ": "sig cas", "仙后座 τ": "tau cas", "仙后座 υ1": "ups1 cas", "仙后座 υ2": "ups2 cas", "仙后座 φ": "phi cas", "仙后座 χ": "chi cas", "仙后座 ψ": "psi cas", "仙后座 ω": "ome cas", "仙后座 A": "a cas", "仙后座 1": "1 cas", "仙后座 2": "2 cas", "仙后座 4": "4 cas", "仙后座 5": "5 cas", "仙后座 6": "6 cas", "仙后座 7": "7 cas", "仙后座 8": "8 cas", "仙后座 9": "9 cas", "仙后座 10": "10 cas", "仙后座 11": "11 cas", "仙后座 12": "12 cas", "仙后座 13": "13 cas", "仙后座 14": "14 cas", "仙后座 15": "15 cas", "仙后座 16": "16 cas", "仙后座 17": "17 cas", "仙后座 18": "18 cas", "仙后座 19": "19 cas", "仙后座 20": "20 cas", "仙后座 21": "21 cas", "仙后座 22": "22 cas", "仙后座 23": "23 cas", "仙后座 24": "24 cas", "仙后座 25": "25 cas", "仙后座 26": "26 cas", "仙后座 27": "27 cas", "仙后座 28": "28 cas", "仙后座 30": "30 cas", "仙后座 31": "31 cas", "仙后座 32": "32 cas", "仙后座 33": "33 cas", "仙后座 34": "34 cas", "仙后座 35": "35 cas", "仙后座 36": "36 cas", "仙后座 37": "37 cas", "仙后座 38": "38 cas", "仙后座 39": "39 cas", "仙后座 40": "40 cas", "仙后座 42": "42 cas", "仙后座 43": "43 cas", "仙后座 44": "44 cas", "仙后座 45": "45 cas", "仙后座 46": "46 cas", "仙后座 47": "47 cas", "仙后座 48": "48 cas", "仙后座 49": "49 cas", "仙后座 50": "50 cas", "仙后座 51": "51 cas", "仙后座 52": "52 cas", "仙后座 53": "53 cas", "仙后座 54": "54 cas", "仙后座 55": "55 cas", "半人马座 α": "alf cen", "半人马座 α1": "alf1 cen", "半人马座 α2": "alf2 cen", "半人马座 β": "bet cen", "半人马座 γ": "gam cen", "半人马座 δ": "del cen", "半人马座 ε": "eps cen", "半人马座 ζ": "zet cen", "半人马座 η": "eta cen", "半人马座 θ": "tet cen", "半人马座 ι": "iot cen", "半人马座 κ": "kap cen", "半人马座 λ": "lam cen", "半人马座 μ": "mu. cen", "半人马座 ν": "nu. cen", "半人马座 ξ1": "ksi1 cen", "半人马座 ξ2": "ksi2 cen", "半人马座 ο1": "omi1 cen", "半人马座 ο2": "omi2 cen", "半人马座 π": "pi. cen", "半人马座 ρ": "rho cen", "半人马座 σ": "sig cen", "半人马座 τ": "tau cen", "半人马座 υ1": "ups1 cen", "半人马座 υ2": "ups2 cen", "半人马座 φ": "phi cen", "半人马座 χ": "chi cen", "半人马座 ψ": "psi cen", "半人马座 a": "a cen", "半人马座 b": "b cen", "半人马座 c1": "c1 cen", "半人马座 c2": "c2 cen", "半人马座 d": "d cen", "半人马座 e": "e cen", "半人马座 f": "f cen", "半人马座 g": "g cen", "半人马座 h": "h cen", "半人马座 i": "i cen", "半人马座 j": "j cen", "半人马座 k": "k cen", "半人马座 l": "l cen", "半人马座 m": "m cen", "半人马座 n": "n cen", "半人马座 p": "p cen", "半人马座 r": "r cen", "半人马座 u": "u cen", "半人马座 v": "v cen", "半人马座 w": "w cen", "半人马座 x1": "x1 cen", "半人马座 x2": "x2 cen", "半人马座 y": "y cen", "半人马座 z": "z cen", "半人马座 A": "a cen", "半人马座 B": "b cen", "半人马座 C1": "c1 cen", "半人马座 C2": "c2 cen", "半人马座 C3": "c3 cen", "半人马座 D": "d cen", "半人马座 E": "e cen", "半人马座 F": "f cen", "半人马座 G": "g cen", "半人马座 H": "h cen", "半人马座 J": "j cen", "半人马座 K": "k cen", "半人马座 M": "m cen", "半人马座 N": "n cen", "半人马座 Q": "q cen", "半人马座 1": "1 cen", "半人马座 2": "2 cen", "半人马座 3": "3 cen", "半人马座 4": "4 cen", "半人马座 5": "5 cen", "仙王座 α": "alf cep", "仙王座 β": "bet cep", "仙王座 γ": "gam cep", "仙王座 δ": "del cep", "仙王座 ε": "eps cep", "仙王座 ζ": "zet cep", "仙王座 η": "eta cep", "仙王座 θ": "tet cep", "仙王座 ι": "iot cep", "仙王座 κ": "kap cep", "仙王座 λ": "lam cep", "仙王座 μ": "mu. cep", "仙王座 ν": "nu. cep", "仙王座 ξ": "ksi cep", "仙王座 ο": "omi cep", "仙王座 π": "pi. cep", "仙王座 ρ": "rho cep", "仙王座 ρ1": "rho1 cep", "仙王座 ρ2": "rho2 cep", "仙王座 1": "1 cep", "仙王座 2": "2 cep", "仙王座 3": "3 cep", "仙王座 4": "4 cep", "仙王座 5": "5 cep", "仙王座 6": "6 cep", "仙王座 7": "7 cep", "仙王座 8": "8 cep", "仙王座 9": "9 cep", "仙王座 10": "10 cep", "仙王座 11": "11 cep", "仙王座 12": "12 cep", "仙王座 13": "13 cep", "仙王座 14": "14 cep", "仙王座 15": "15 cep", "仙王座 16": "16 cep", "仙王座 17": "17 cep", "仙王座 18": "18 cep", "仙王座 19": "19 cep", "仙王座 20": "20 cep", "仙王座 21": "21 cep", "仙王座 22": "22 cep", "仙王座 23": "23 cep", "仙王座 24": "24 cep", "仙王座 25": "25 cep", "仙王座 26": "26 cep", "仙王座 27": "27 cep", "仙王座 28": "28 cep", "仙王座 29": "29 cep", "仙王座 30": "30 cep", "仙王座 31": "31 cep", "仙王座 32": "32 cep", "仙王座 33": "33 cep", "仙王座 34": "34 cep", "仙王座 35": "35 cep", "鲸鱼座 α": "alf cet", "鲸鱼座 β": "bet cet", "鲸鱼座 γ": "gam cet", "鲸鱼座 δ": "del cet", "鲸鱼座 ε": "eps cet", "鲸鱼座 ζ": "zet cet", "鲸鱼座 η": "eta cet", "鲸鱼座 θ": "tet cet", "鲸鱼座 ι": "iot cet", "鲸鱼座 κ1": "kap1 cet", "鲸鱼座 κ2": "kap2 cet", "鲸鱼座 λ": "lam cet", "鲸鱼座 μ": "mu. cet", "鲸鱼座 ν": "nu. cet", "鲸鱼座 ξ1": "ksi1 cet", "鲸鱼座 ξ2": "ksi2 cet", "鲸鱼座 ο": "omi cet", "鲸鱼座 π": "pi. cet", "鲸鱼座 ρ": "rho cet", "鲸鱼座 σ": "sig cet", "鲸鱼座 τ": "tau cet", "鲸鱼座 υ": "ups cet", "鲸鱼座 φ1": "phi1 cet", "鲸鱼座 φ2": "phi2 cet", "鲸鱼座 φ3": "phi3 cet", "鲸鱼座 φ4": "phi4 cet", "鲸鱼座 χ": "chi cet", "鲸鱼座 ψ": "psi cet", "鲸鱼座 1": "1 cet", "鲸鱼座 2": "2 cet", "鲸鱼座 3": "3 cet", "鲸鱼座 4": "4 cet", "鲸鱼座 5": "5 cet", "鲸鱼座 6": "6 cet", "鲸鱼座 7": "7 cet", "鲸鱼座 8": "8 cet", "鲸鱼座 9": "9 cet", "鲸鱼座 10": "10 cet", "鲸鱼座 11": "11 cet", "鲸鱼座 12": "12 cet", "鲸鱼座 13": "13 cet", "鲸鱼座 14": "14 cet", "鲸鱼座 15": "15 cet", "鲸鱼座 16": "16 cet", "鲸鱼座 17": "17 cet", "鲸鱼座 18": "18 cet", "鲸鱼座 19": "19 cet", "鲸鱼座 20": "20 cet", "鲸鱼座 21": "21 cet", "鲸鱼座 22": "22 cet", "鲸鱼座 23": "23 cet", "鲸鱼座 25": "25 cet", "鲸鱼座 26": "26 cet", "鲸鱼座 27": "27 cet", "鲸鱼座 28": "28 cet", "鲸鱼座 29": "29 cet", "鲸鱼座 30": "30 cet", "鲸鱼座 31": "31 cet", "鲸鱼座 32": "32 cet", "鲸鱼座 33": "33 cet", "鲸鱼座 34": "34 cet", "鲸鱼座 35": "35 cet", "鲸鱼座 36": "36 cet", "鲸鱼座 37": "37 cet", "鲸鱼座 38": "38 cet", "鲸鱼座 39": "39 cet", "鲸鱼座 40": "40 cet", "鲸鱼座 41": "41 cet", "鲸鱼座 42": "42 cet", "鲸鱼座 43": "43 cet", "鲸鱼座 44": "44 cet", "鲸鱼座 45": "45 cet", "鲸鱼座 46": "46 cet", "鲸鱼座 47": "47 cet", "鲸鱼座 48": "48 cet", "鲸鱼座 49": "49 cet", "鲸鱼座 50": "50 cet", "鲸鱼座 52": "52 cet", "鲸鱼座 53": "53 cet", "鲸鱼座 54": "54 cet", "鲸鱼座 55": "55 cet", "鲸鱼座 56": "56 cet", "鲸鱼座 57": "57 cet", "鲸鱼座 58": "58 cet", "鲸鱼座 59": "59 cet", "鲸鱼座 60": "60 cet", "鲸鱼座 61": "61 cet", "鲸鱼座 62": "62 cet", "鲸鱼座 63": "63 cet", "鲸鱼座 64": "64 cet", "鲸鱼座 65": "65 cet", "鲸鱼座 66": "66 cet", "鲸鱼座 67": "67 cet", "鲸鱼座 68": "68 cet", "鲸鱼座 69": "69 cet", "鲸鱼座 70": "70 cet", "鲸鱼座 71": "71 cet", "鲸鱼座 72": "72 cet", "鲸鱼座 73": "73 cet", "鲸鱼座 75": "75 cet", "鲸鱼座 76": "76 cet", "鲸鱼座 77": "77 cet", "鲸鱼座 78": "78 cet", "鲸鱼座 79": "79 cet", "鲸鱼座 80": "80 cet", "鲸鱼座 81": "81 cet", "鲸鱼座 82": "82 cet", "鲸鱼座 83": "83 cet", "鲸鱼座 84": "84 cet", "鲸鱼座 85": "85 cet", "鲸鱼座 86": "86 cet", "鲸鱼座 87": "87 cet", "鲸鱼座 88": "88 cet", "鲸鱼座 89": "89 cet", "鲸鱼座 91": "91 cet", "鲸鱼座 92": "92 cet", "鲸鱼座 93": "93 cet", "鲸鱼座 94": "94 cet", "鲸鱼座 95": "95 cet", "鲸鱼座 96": "96 cet", "鲸鱼座 97": "97 cet", "蝘蜓座 α": "alf cha", "蝘蜓座 β": "bet cha", "蝘蜓座 γ": "gam cha", "蝘蜓座 δ1": "del1 cha", "蝘蜓座 δ2": "del2 cha", "蝘蜓座 ε": "eps cha", "蝘蜓座 ζ": "zet cha", "蝘蜓座 η": "eta cha", "蝘蜓座 θ": "tet cha", "蝘蜓座 ι": "iot cha", "蝘蜓座 κ": "kap cha", "蝘蜓座 λ": "lam cha", "蝘蜓座 μ": "mu. cha", "蝘蜓座 μ1": "mu.1 cha", "蝘蜓座 μ2": "mu.2 cha", "蝘蜓座 ν": "nu. cha", "蝘蜓座 π": "pi. cha", "圆规座 α": "alf cir", "圆规座 β": "bet cir", "圆规座 γ": "gam cir", "圆规座 δ": "del cir", "圆规座 ε": "eps cir", "圆规座 ζ": "zet cir", "圆规座 η": "eta cir", "圆规座 θ": "tet cir", "天鸽座 α": "alf col", "天鸽座 β": "bet col", "天鸽座 γ": "gam col", "天鸽座 δ": "del col", "大犬座 3": "3 cma", "天鸽座 ε": "eps col", "天鸽座 η": "eta col", "天鸽座 θ": "tet col", "天鸽座 κ": "kap col", "天鸽座 λ": "lam col", "天鸽座 μ": "mu. col", "天鸽座 ν1": "nu.1 col", "天鸽座 ν2": "nu.2 col", "天鸽座 ξ": "ksi col", "天鸽座 ο": "omi col", "天鸽座 π1": "pi.1 col", "天鸽座 π2": "pi.2 col", "天鸽座 σ": "sig col", "天鸽座 3": "3 col", "天鸽座 72": "72 col", "后发座 α": "alf com", "后发座 β": "bet com", "后发座 γ": "gam com", "后发座 1": "1 com", "后发座 2": "2 com", "后发座 3": "3 com", "后发座 4": "4 com", "后发座 5": "5 com", "后发座 6": "6 com", "后发座 7": "7 com", "后发座 8": "8 com", "后发座 9": "9 com", "后发座 10": "10 com", "后发座 11": "11 com", "后发座 12": "12 com", "后发座 13": "13 com", "后发座 14": "14 com", "后发座 15": "15 com", "后发座 16": "16 com", "后发座 17": "17 com", "后发座 18": "18 com", "后发座 20": "20 com", "后发座 21": "21 com", "后发座 22": "22 com", "后发座 23": "23 com", "后发座 24": "24 com", "后发座 25": "25 com", "后发座 26": "26 com", "后发座 27": "27 com", "后发座 28": "28 com", "后发座 29": "29 com", "后发座 30": "30 com", "后发座 31": "31 com", "后发座 32": "32 com", "后发座 33": "33 com", "后发座 35": "35 com", "后发座 36": "36 com", "后发座 37": "37 com", "猎犬座 13": "13 cvn", "后发座 38": "38 com", "后发座 39": "39 com", "后发座 40": "40 com", "后发座 41": "41 com", "后发座 42": "42 com", "后发座 43": "43 com", "南冕座 α": "alf cra", "南冕座 β": "bet cra", "南冕座 γ": "gam cra", "南冕座 δ": "del cra", "南冕座 ε": "eps cra", "南冕座 ζ": "zet cra", "南冕座 η1": "eta1 cra", "南冕座 η2": "eta2 cra", "南冕座 θ": "tet cra", "南冕座 κ1": "kap1 cra", "南冕座 κ2": "kap2 cra", "南冕座 λ": "lam cra", "南冕座 μ": "mu. cra", "北冕座 α": "alf crb", "北冕座 β": "bet crb", "北冕座 γ": "gam crb", "北冕座 δ": "del crb", "北冕座 ε": "eps crb", "北冕座 ζ1": "zet1 crb", "北冕座 ζ2": "zet2 crb", "北冕座 η": "eta crb", "北冕座 θ": "tet crb", "北冕座 ι": "iot crb", "北冕座 κ": "kap crb", "北冕座 λ": "lam crb", "北冕座 μ": "mu. crb", "北冕座 ν1": "nu.1 crb", "北冕座 ν2": "nu.2 crb", "北冕座 ξ": "ksi crb", "北冕座 ο": "omi crb", "北冕座 π": "pi. crb", "北冕座 ρ": "rho crb", "北冕座 σ": "sig crb", "北冕座 τ": "tau crb", "北冕座 υ": "ups crb", "北冕座 1": "1 crb", "北冕座 2": "2 crb", "北冕座 3": "3 crb", "北冕座 4": "4 crb", "北冕座 5": "5 crb", "北冕座 6": "6 crb", "北冕座 7": "7 crb", "北冕座 8": "8 crb", "北冕座 9": "9 crb", "北冕座 10": "10 crb", "北冕座 11": "11 crb", "北冕座 12": "12 crb", "北冕座 13": "13 crb", "北冕座 14": "14 crb", "北冕座 15": "15 crb", "北冕座 16": "16 crb", "北冕座 17": "17 crb", "北冕座 18": "18 crb", "北冕座 19": "19 crb", "北冕座 20": "20 crb", "北冕座 21": "21 crb", "乌鸦座 α": "alf crv", "乌鸦座 β": "bet crv", "乌鸦座 γ": "gam crv", "乌鸦座 δ": "del crv", "乌鸦座 ε": "eps crv", "乌鸦座 ζ": "zet crv", "乌鸦座 η": "eta crv", "乌鸦座 1": "1 crv", "乌鸦座 2": "2 crv", "乌鸦座 3": "3 crv", "乌鸦座 4": "4 crv", "乌鸦座 5": "5 crv", "乌鸦座 6": "6 crv", "乌鸦座 7": "7 crv", "乌鸦座 8": "8 crv", "乌鸦座 9": "9 crv", "巨爵座 α": "alf crt", "巨爵座 β": "bet crt", "巨爵座 γ": "gam crt", "巨爵座 δ": "del crt", "巨爵座 ε": "eps crt", "巨爵座 ζ": "zet crt", "巨爵座 η": "eta crt", "巨爵座 θ": "tet crt", "巨爵座 ι": "iot crt", "巨爵座 κ": "kap crt", "巨爵座 λ": "lam crt", "巨爵座 ψ": "psi crt", "巨爵座 5": "5 crt", "巨爵座 7": "7 crt", "巨爵座 8": "8 crt", "巨爵座 10": "10 crt", "巨爵座 11": "11 crt", "巨爵座 12": "12 crt", "巨爵座 13": "13 crt", "巨爵座 14": "14 crt", "巨爵座 15": "15 crt", "巨爵座 16": "16 crt", "长蛇座 N": "n hya", "巨爵座 17": "17 crt", "巨爵座 18": "18 crt", "巨爵座 20": "20 crt", "巨爵座 21": "21 crt", "巨爵座 22": "22 crt", "巨爵座 23": "23 crt", "巨爵座 24": "24 crt", "巨爵座 26": "26 crt", "巨爵座 27": "27 crt", "巨爵座 29": "29 crt", "巨爵座 30": "30 crt", "巨爵座 31": "31 crt", "南十字座 α1": "alf1 cru", "南十字座 α2": "alf2 cru", "南十字座 β": "bet cru", "南十字座 γ": "gam cru", "南十字座 δ": "del cru", "南十字座 ε": "eps cru", "南十字座 ζ": "zet cru", "南十字座 η": "eta cru", "南十字座 θ1": "tet1 cru", "南十字座 θ2": "tet2 cru", "南十字座 ι": "iot cru", "南十字座 κ": "kap cru", "南十字座 λ": "lam cru", "南十字座 μ1": "mu.1 cru", "南十字座 μ2": "mu.2 cru", "南十字座 35": "35 cru", "南十字座 39": "39 cru", "天鹅座 α": "alf cyg", "天鹅座 β1": "bet1 cyg", "天鹅座 β2": "bet2 cyg", "天鹅座 γ": "gam cyg", "天鹅座 δ": "del cyg", "天鹅座 ε": "eps cyg", "天鹅座 ζ": "zet cyg", "天鹅座 η": "eta cyg", "天鹅座 θ": "tet cyg", "天鹅座 ι": "iot cyg", "天鹅座 ι1": "iot1 cyg", "天鹅座 ι2": "iot2 cyg", "天鹅座 κ": "kap cyg", "天鹅座 λ": "lam cyg", "天鹅座 μ1": "mu.1 cyg", "天鹅座 μ2": "mu.2 cyg", "天鹅座 ν": "nu. cyg", "天鹅座 ξ": "ksi cyg", "天鹅座 ο1": "omi1 cyg", "天鹅座 ο2": "omi2 cyg", "天鹅座 π1": "pi.1 cyg", "天鹅座 π2": "pi.2 cyg", "天鹅座 ρ": "rho cyg", "天鹅座 σ": "sig cyg", "天鹅座 τ": "tau cyg", "天鹅座 υ": "ups cyg", "天鹅座 φ": "phi cyg", "天鹅座 χ": "chi cyg", "天鹅座 ψ": "psi cyg", "天鹅座 ω1": "ome1 cyg", "天鹅座 ω2": "ome2 cyg", "天鹅座 b1": "b1 cyg", "天鹅座 b2": "b2 cyg", "天鹅座 b3": "b3 cyg", "天鹅座 c": "c cyg", "天鹅座 d": "d cyg", "天鹅座 e": "e cyg", "天鹅座 f1": "f1 cyg", "天鹅座 f2": "f2 cyg", "天鹅座 g": "g cyg", "天鹅座 A": "a cyg", "天鹅座 P": "p cyg", "天鹅座 1": "1 cyg", "天鹅座 2": "2 cyg", "天鹅座 3": "3 cyg", "天鹅座 4": "4 cyg", "天鹅座 6": "6 cyg", "天鹅座 7": "7 cyg", "天鹅座 8": "8 cyg", "天鹅座 9": "9 cyg", "天鹅座 10": "10 cyg", "天鹅座 11": "11 cyg", "天鹅座 12": "12 cyg", "天鹅座 13": "13 cyg", "天鹅座 14": "14 cyg", "天鹅座 15": "15 cyg", "天鹅座 16": "16 cyg", "天鹅座 17": "17 cyg", "天鹅座 18": "18 cyg", "天鹅座 19": "19 cyg", "天鹅座 20": "20 cyg", "天鹅座 21": "21 cyg", "天鹅座 22": "22 cyg", "天鹅座 23": "23 cyg", "天鹅座 24": "24 cyg", "天鹅座 25": "25 cyg", "天鹅座 26": "26 cyg", "天鹅座 27": "27 cyg", "天鹅座 28": "28 cyg", "天鹅座 29": "29 cyg", "天鹅座 30": "30 cyg", "天鹅座 31": "31 cyg", "天鹅座 32": "32 cyg", "天鹅座 33": "33 cyg", "天鹅座 34": "34 cyg", "天鹅座 35": "35 cyg", "天鹅座 36": "36 cyg", "天鹅座 37": "37 cyg", "天鹅座 39": "39 cyg", "天鹅座 40": "40 cyg", "天鹅座 41": "41 cyg", "天鹅座 42": "42 cyg", "天鹅座 43": "43 cyg", "天鹅座 44": "44 cyg", "天鹅座 45": "45 cyg", "天鹅座 46": "46 cyg", "天鹅座 47": "47 cyg", "天鹅座 48": "48 cyg", "天鹅座 49": "49 cyg", "天鹅座 50": "50 cyg", "天鹅座 51": "51 cyg", "天鹅座 52": "52 cyg", "天鹅座 53": "53 cyg", "天鹅座 54": "54 cyg", "天鹅座 55": "55 cyg", "天鹅座 56": "56 cyg", "天鹅座 57": "57 cyg", "天鹅座 58": "58 cyg", "天鹅座 59": "59 cyg", "天鹅座 60": "60 cyg", "天鹅座 61": "61 cyg", "天鹅座 62": "62 cyg", "天鹅座 63": "63 cyg", "天鹅座 64": "64 cyg", "天鹅座 65": "65 cyg", "天鹅座 66": "66 cyg", "天鹅座 67": "67 cyg", "天鹅座 68": "68 cyg", "天鹅座 69": "69 cyg", "天鹅座 70": "70 cyg", "天鹅座 71": "71 cyg", "天鹅座 72": "72 cyg", "天鹅座 73": "73 cyg", "天鹅座 74": "74 cyg", "天鹅座 75": "75 cyg", "天鹅座 76": "76 cyg", "天鹅座 77": "77 cyg", "天鹅座 78": "78 cyg", "天鹅座 79": "79 cyg", "天鹅座 80": "80 cyg", "天鹅座 81": "81 cyg", "天鹅座 T": "t cyg", "海豚座 α": "alf del", "海豚座 β": "bet del", "海豚座 γ1": "gam1 del", "海豚座 γ2": "gam2 del", "海豚座 δ": "del del", "海豚座 ε": "eps del", "海豚座 ζ": "zet del", "海豚座 η": "eta del", "海豚座 θ": "tet del", "海豚座 ι": "iot del", "海豚座 κ": "kap del", "海豚座 1": "1 del", "海豚座 2": "2 del", "海豚座 3": "3 del", "海豚座 4": "4 del", "海豚座 5": "5 del", "海豚座 6": "6 del", "海豚座 7": "7 del", "海豚座 8": "8 del", "海豚座 9": "9 del", "海豚座 10": "10 del", "海豚座 11": "11 del", "海豚座 12": "12 del", "海豚座 13": "13 del", "海豚座 14": "14 del", "海豚座 15": "15 del", "海豚座 16": "16 del", "海豚座 17": "17 del", "海豚座 18": "18 del", "剑鱼座 α": "alf dor", "剑鱼座 β": "bet dor", "剑鱼座 γ": "gam dor", "剑鱼座 δ": "del dor", "剑鱼座 ε": "eps dor", "剑鱼座 ζ": "zet dor", "剑鱼座 η1": "eta1 dor", "剑鱼座 η2": "eta2 dor", "剑鱼座 θ": "tet dor", "剑鱼座 κ": "kap dor", "剑鱼座 λ": "lam dor", "剑鱼座 ν": "nu. dor", "剑鱼座 π1": "pi.1 dor", "剑鱼座 π2": "pi.2 dor", "天龙座 α": "alf dra", "天龙座 β": "bet dra", "天龙座 γ": "gam dra", "天龙座 δ": "del dra", "天龙座 ε": "eps dra", "天龙座 ζ": "zet dra", "天龙座 η": "eta dra", "天龙座 θ": "tet dra", "天龙座 ι": "iot dra", "天龙座 κ": "kap dra", "天龙座 λ": "lam dra", "天龙座 μ": "mu. dra", "天龙座 ν1": "nu.1 dra", "天龙座 ν2": "nu.2 dra", "天龙座 ξ": "ksi dra", "天龙座 ο": "omi dra", "天龙座 π": "pi. dra", "天龙座 ρ": "rho dra", "天龙座 σ": "sig dra", "天龙座 τ": "tau dra", "天龙座 υ": "ups dra", "天龙座 φ": "phi dra", "天龙座 χ": "chi dra", "天龙座 ψ1": "psi1 dra", "天龙座 ψ2": "psi2 dra", "天龙座 ω": "ome dra", "天龙座 b": "b dra", "天龙座 c": "c dra", "天龙座 d": "d dra", "天龙座 e": "e dra", "天龙座 f": "f dra", "天龙座 g": "g dra", "天龙座 h": "h dra", "天龙座 i": "i dra", "天龙座 A": "a dra", "天龙座 1": "1 dra", "天龙座 2": "2 dra", "天龙座 3": "3 dra", "天龙座 4": "4 dra", "天龙座 5": "5 dra", "天龙座 6": "6 dra", "天龙座 7": "7 dra", "天龙座 8": "8 dra", "天龙座 9": "9 dra", "天龙座 10": "10 dra", "天龙座 11": "11 dra", "天龙座 12": "12 dra", "天龙座 13": "13 dra", "天龙座 14": "14 dra", "天龙座 15": "15 dra", "天龙座 16": "16 dra", "天龙座 17": "17 dra", "天龙座 18": "18 dra", "天龙座 19": "19 dra", "天龙座 20": "20 dra", "天龙座 21": "21 dra", "天龙座 22": "22 dra", "天龙座 23": "23 dra", "天龙座 24": "24 dra", "天龙座 25": "25 dra", "天龙座 26": "26 dra", "天龙座 27": "27 dra", "天龙座 28": "28 dra", "天龙座 29": "29 dra", "天龙座 30": "30 dra", "天龙座 31": "31 dra", "天龙座 32": "32 dra", "天龙座 33": "33 dra", "天龙座 34": "34 dra", "天龙座 35": "35 dra", "天龙座 36": "36 dra", "天龙座 37": "37 dra", "天龙座 38": "38 dra", "天龙座 39": "39 dra", "天龙座 40": "40 dra", "天龙座 41": "41 dra", "天龙座 42": "42 dra", "天龙座 43": "43 dra", "天龙座 44": "44 dra", "天龙座 45": "45 dra", "天龙座 46": "46 dra", "天龙座 47": "47 dra", "天龙座 48": "48 dra", "天龙座 49": "49 dra", "天龙座 50": "50 dra", "天龙座 51": "51 dra", "天龙座 52": "52 dra", "天龙座 53": "53 dra", "天龙座 54": "54 dra", "天龙座 55": "55 dra", "天龙座 57": "57 dra", "天龙座 58": "58 dra", "天龙座 59": "59 dra", "天龙座 60": "60 dra", "天龙座 61": "61 dra", "天龙座 63": "63 dra", "天龙座 64": "64 dra", "天龙座 65": "65 dra", "天龙座 66": "66 dra", "天龙座 67": "67 dra", "天龙座 68": "68 dra", "天龙座 69": "69 dra", "天龙座 71": "71 dra", "天龙座 72": "72 dra", "天龙座 73": "73 dra", "天龙座 74": "74 dra", "天龙座 75": "75 dra", "天龙座 76": "76 dra", "天龙座 77": "77 dra", "天龙座 78": "78 dra", "天龙座 79": "79 dra", "天龙座 80": "80 dra", "小马座 α": "alf equ", "小马座 β": "bet equ", "小马座 γ": "gam equ", "小马座 δ": "del equ", "小马座 ε": "eps equ", "小马座 λ": "lam equ", "小马座 1": "1 equ", "小马座 2": "2 equ", "小马座 3": "3 equ", "小马座 4": "4 equ", "小马座 5": "5 equ", "小马座 6": "6 equ", "小马座 7": "7 equ", "小马座 8": "8 equ", "小马座 9": "9 equ", "小马座 10": "10 equ", "波江座 α": "alf eri", "波江座 β": "bet eri", "波江座 γ": "gam eri", "波江座 δ": "del eri", "波江座 ε": "eps eri", "波江座 ζ": "zet eri", "波江座 η": "eta eri", "波江座 θ1": "tet1 eri", "波江座 θ2": "tet2 eri", "波江座 ι": "iot eri", "波江座 κ": "kap eri", "波江座 λ": "lam eri", "波江座 μ": "mu. eri", "波江座 ν": "nu. eri", "波江座 ξ": "ksi eri", "波江座 ο1": "omi1 eri", "波江座 ο2": "omi2 eri", "波江座 π": "pi. eri", "波江座 ρ1": "rho1 eri", "波江座 ρ2": "rho2 eri", "波江座 ρ3": "rho3 eri", "波江座 τ1": "tau1 eri", "波江座 τ2": "tau2 eri", "波江座 τ3": "tau3 eri", "波江座 τ4": "tau4 eri", "波江座 τ5": "tau5 eri", "波江座 τ6": "tau6 eri", "波江座 τ7": "tau7 eri", "波江座 τ8": "tau8 eri", "波江座 τ9": "tau9 eri", "波江座 υ1": "ups1 eri", "波江座 υ2": "ups2 eri", "波江座 υ3": "ups3 eri", "波江座 υ4": "ups4 eri", "波江座 φ": "phi eri", "波江座 χ": "chi eri", "波江座 ψ": "psi eri", "波江座 ω": "ome eri", "波江座 b": "b eri", "波江座 c": "c eri", "波江座 d": "d eri", "波江座 e": "e eri", "波江座 f": "f eri", "波江座 g": "g eri", "波江座 h": "h eri", "波江座 i": "i eri", "波江座 l": "l eri", "波江座 p": "p eri", "波江座 q1": "q1 eri", "波江座 q2": "q2 eri", "波江座 r": "r eri", "波江座 s": "s eri", "波江座 u": "u eri", "波江座 v": "v eri", "波江座 w": "w eri", "波江座 y": "y eri", "波江座 z": "z eri", "波江座 A": "a eri", "波江座 1": "1 eri", "鲸鱼座 90": "90 cet", "波江座 2": "2 eri", "波江座 3": "3 eri", "波江座 4": "4 eri", "波江座 5": "5 eri", "波江座 6": "6 eri", "波江座 7": "7 eri", "波江座 8": "8 eri", "波江座 9": "9 eri", "波江座 10": "10 eri", "波江座 11": "11 eri", "波江座 13": "13 eri", "波江座 14": "14 eri", "波江座 15": "15 eri", "波江座 16": "16 eri", "波江座 17": "17 eri", "波江座 18": "18 eri", "波江座 19": "19 eri", "波江座 20": "20 eri", "波江座 21": "21 eri", "波江座 22": "22 eri", "波江座 23": "23 eri", "波江座 24": "24 eri", "波江座 25": "25 eri", "波江座 26": "26 eri", "波江座 27": "27 eri", "波江座 28": "28 eri", "波江座 29": "29 eri", "波江座 30": "30 eri", "波江座 32": "32 eri", "波江座 33": "33 eri", "波江座 34": "34 eri", "波江座 35": "35 eri", "波江座 36": "36 eri", "波江座 37": "37 eri", "波江座 38": "38 eri", "波江座 39": "39 eri", "波江座 40": "40 eri", "波江座 41": "41 eri", "波江座 42": "42 eri", "波江座 43": "43 eri", "波江座 44": "44 eri", "波江座 45": "45 eri", "波江座 46": "46 eri", "波江座 47": "47 eri", "波江座 48": "48 eri", "波江座 49": "49 eri", "波江座 50": "50 eri", "波江座 51": "51 eri", "波江座 52": "52 eri", "波江座 53": "53 eri", "波江座 54": "54 eri", "波江座 55": "55 eri", "波江座 56": "56 eri", "波江座 57": "57 eri", "波江座 58": "58 eri", "波江座 59": "59 eri", "波江座 60": "60 eri", "波江座 61": "61 eri", "波江座 62": "62 eri", "波江座 63": "63 eri", "波江座 64": "64 eri", "波江座 65": "65 eri", "波江座 66": "66 eri", "波江座 67": "67 eri", "波江座 68": "68 eri", "波江座 69": "69 eri", "波江座 82": "82 eri", "天炉座 α": "alf for", "波江座 12": "12 eri", "天炉座 β": "bet for", "天炉座 γ1": "gam1 for", "天炉座 γ2": "gam2 for", "天炉座 δ": "del for", "天炉座 ε": "eps for", "天炉座 ζ": "zet for", "天炉座 η1": "eta1 for", "天炉座 η2": "eta2 for", "天炉座 η3": "eta3 for", "天炉座 ι1": "iot1 for", "天炉座 ι2": "iot2 for", "天炉座 κ": "kap for", "天炉座 λ1": "lam1 for", "天炉座 λ2": "lam2 for", "天炉座 μ": "mu. for", "天炉座 ν": "nu. for", "天炉座 π": "pi. for", "天炉座 ρ": "rho for", "天炉座 σ": "sig for", "天炉座 τ": "tau for", "天炉座 φ": "phi for", "天炉座 χ1": "chi1 for", "天炉座 χ2": "chi2 for", "天炉座 χ3": "chi3 for", "天炉座 ψ": "psi for", "天炉座 ω": "ome for", "双子座 α": "alf gem", "双子座 β": "bet gem", "双子座 γ": "gam gem", "双子座 δ": "del gem", "双子座 ε": "eps gem", "双子座 ζ": "zet gem", "双子座 η": "eta gem", "双子座 θ": "tet gem", "双子座 ι": "iot gem", "双子座 κ": "kap gem", "双子座 λ": "lam gem", "双子座 μ": "mu. gem", "双子座 ν": "nu. gem", "双子座 ξ": "ksi gem", "双子座 ο": "omi gem", "双子座 π": "pi. gem", "双子座 ρ": "rho gem", "双子座 σ": "sig gem", "双子座 τ": "tau gem", "双子座 υ": "ups gem", "双子座 φ": "phi gem", "双子座 χ": "chi gem", "巨蟹座 6": "6 cnc", "双子座 ω": "ome gem", "双子座 b": "b gem", "双子座 c": "c gem", "双子座 d": "d gem", "双子座 e": "e gem", "双子座 f": "f gem", "双子座 g": "g gem", "双子座 A": "a gem", "双子座 1": "1 gem", "双子座 2": "2 gem", "双子座 3": "3 gem", "双子座 4": "4 gem", "双子座 5": "5 gem", "双子座 6": "6 gem", "双子座 7": "7 gem", "双子座 8": "8 gem", "双子座 9": "9 gem", "双子座 10": "10 gem", "双子座 11": "11 gem", "双子座 12": "12 gem", "双子座 13": "13 gem", "双子座 14": "14 gem", "双子座 15": "15 gem", "双子座 16": "16 gem", "双子座 18": "18 gem", "双子座 19": "19 gem", "双子座 20": "20 gem", "双子座 22": "22 gem", "双子座 23": "23 gem", "双子座 24": "24 gem", "双子座 25": "25 gem", "双子座 26": "26 gem", "双子座 27": "27 gem", "双子座 28": "28 gem", "双子座 30": "30 gem", "双子座 31": "31 gem", "双子座 32": "32 gem", "双子座 33": "33 gem", "双子座 34": "34 gem", "双子座 35": "35 gem", "双子座 36": "36 gem", "双子座 37": "37 gem", "双子座 38": "38 gem", "双子座 39": "39 gem", "双子座 40": "40 gem", "双子座 41": "41 gem", "双子座 42": "42 gem", "双子座 43": "43 gem", "双子座 44": "44 gem", "双子座 45": "45 gem", "双子座 46": "46 gem", "双子座 47": "47 gem", "双子座 48": "48 gem", "双子座 49": "49 gem", "双子座 51": "51 gem", "双子座 52": "52 gem", "双子座 53": "53 gem", "双子座 54": "54 gem", "双子座 55": "55 gem", "双子座 56": "56 gem", "双子座 57": "57 gem", "双子座 58": "58 gem", "双子座 59": "59 gem", "双子座 60": "60 gem", "双子座 61": "61 gem", "双子座 62": "62 gem", "双子座 63": "63 gem", "双子座 64": "64 gem", "双子座 65": "65 gem", "双子座 66": "66 gem", "双子座 67": "67 gem", "双子座 68": "68 gem", "双子座 69": "69 gem", "双子座 70": "70 gem", "双子座 71": "71 gem", "双子座 74": "74 gem", "双子座 75": "75 gem", "双子座 76": "76 gem", "双子座 77": "77 gem", "双子座 78": "78 gem", "双子座 79": "79 gem", "双子座 80": "80 gem", "双子座 81": "81 gem", "双子座 82": "82 gem", "双子座 83": "83 gem", "双子座 84": "84 gem", "双子座 85": "85 gem", "双子座 87": "87 gem", "天鹤座 α": "alf gru", "天鹤座 β": "bet gru", "天鹤座 γ": "gam gru", "天鹤座 δ1": "del1 gru", "天鹤座 δ2": "del2 gru", "天鹤座 ε": "eps gru", "天鹤座 ζ": "zet gru", "天鹤座 η": "eta gru", "天鹤座 θ": "tet gru", "天鹤座 ι": "iot gru", "天鹤座 κ": "kap gru", "天鹤座 λ": "lam gru", "天鹤座 μ1": "mu.1 gru", "天鹤座 μ2": "mu.2 gru", "天鹤座 ν": "nu. gru", "天鹤座 ξ": "ksi gru", "天鹤座 ο": "omi gru", "天鹤座 π1": "pi.1 gru", "天鹤座 π2": "pi.2 gru", "天鹤座 ρ": "rho gru", "天鹤座 σ1": "sig1 gru", "天鹤座 σ2": "sig2 gru", "天鹤座 τ1": "tau1 gru", "天鹤座 τ2": "tau2 gru", "天鹤座 τ3": "tau3 gru", "天鹤座 υ": "ups gru", "天鹤座 φ": "phi gru", "武仙座 α1": "alf1 her", "武仙座 α2": "alf2 her", "武仙座 β": "bet her", "武仙座 γ": "gam her", "武仙座 δ": "del her", "武仙座 ε": "eps her", "武仙座 ζ": "zet her", "武仙座 η": "eta her", "武仙座 θ": "tet her", "武仙座 ι": "iot her", "武仙座 κ": "kap her", "武仙座 λ": "lam her", "武仙座 μ": "mu. her", "武仙座 ν": "nu. her", "武仙座 ξ": "ksi her", "武仙座 ο": "omi her", "武仙座 π": "pi. her", "武仙座 ρ": "rho her", "武仙座 σ": "sig her", "武仙座 τ": "tau her", "武仙座 υ": "ups her", "武仙座 φ": "phi her", "武仙座 χ": "chi her", "武仙座 ψ2": "psi2 her", "武仙座 ω": "ome her", "武仙座 b": "b her", "武仙座 c": "c her", "武仙座 d": "d her", "武仙座 e": "e her", "武仙座 f": "f her", "武仙座 g": "g her", "武仙座 h": "h her", "武仙座 i": "i her", "武仙座 k": "k her", "武仙座 l": "l her", "武仙座 m": "m her", "武仙座 n": "n her", "武仙座 o": "o her", "武仙座 q": "q her", "武仙座 r": "r her", "武仙座 s": "s her", "武仙座 t": "t her", "武仙座 u": "u her", "武仙座 w": "w her", "武仙座 x": "x her", "武仙座 y": "y her", "武仙座 z": "z her", "武仙座 A": "a her", "武仙座 1": "1 her", "武仙座 2": "2 her", "武仙座 3": "3 her", "武仙座 4": "4 her", "武仙座 5": "5 her", "武仙座 6": "6 her", "武仙座 7": "7 her", "武仙座 8": "8 her", "武仙座 9": "9 her", "武仙座 10": "10 her", "武仙座 11": "11 her", "武仙座 12": "12 her", "武仙座 13": "13 her", "武仙座 14": "14 her", "武仙座 15": "15 her", "武仙座 16": "16 her", "武仙座 17": "17 her", "武仙座 18": "18 her", "武仙座 19": "19 her", "武仙座 20": "20 her", "武仙座 21": "21 her", "武仙座 22": "22 her", "武仙座 23": "23 her", "武仙座 24": "24 her", "武仙座 25": "25 her", "武仙座 26": "26 her", "武仙座 27": "27 her", "武仙座 28": "28 her", "武仙座 29": "29 her", "武仙座 30": "30 her", "武仙座 31": "31 her", "武仙座 32": "32 her", "武仙座 33": "33 her", "武仙座 34": "34 her", "武仙座 35": "35 her", "武仙座 36": "36 her", "武仙座 37": "37 her", "武仙座 38": "38 her", "武仙座 39": "39 her", "武仙座 40": "40 her", "武仙座 41": "41 her", "武仙座 42": "42 her", "武仙座 43": "43 her", "武仙座 44": "44 her", "武仙座 45": "45 her", "武仙座 46": "46 her", "武仙座 47": "47 her", "武仙座 48": "48 her", "武仙座 49": "49 her", "武仙座 50": "50 her", "武仙座 51": "51 her", "武仙座 52": "52 her", "武仙座 53": "53 her", "武仙座 54": "54 her", "武仙座 56": "56 her", "武仙座 57": "57 her", "武仙座 58": "58 her", "武仙座 59": "59 her", "武仙座 60": "60 her", "武仙座 61": "61 her", "武仙座 62": "62 her", "武仙座 63": "63 her", "武仙座 64": "64 her", "武仙座 65": "65 her", "武仙座 67": "67 her", "武仙座 68": "68 her", "武仙座 69": "69 her", "武仙座 70": "70 her", "武仙座 72": "72 her", "武仙座 73": "73 her", "武仙座 74": "74 her", "武仙座 75": "75 her", "武仙座 76": "76 her", "武仙座 77": "77 her", "武仙座 78": "78 her", "武仙座 79": "79 her", "武仙座 82": "82 her", "武仙座 83": "83 her", "武仙座 84": "84 her", "武仙座 85": "85 her", "武仙座 86": "86 her", "武仙座 87": "87 her", "武仙座 88": "88 her", "武仙座 89": "89 her", "武仙座 90": "90 her", "武仙座 91": "91 her", "武仙座 92": "92 her", "武仙座 93": "93 her", "武仙座 94": "94 her", "武仙座 95": "95 her", "武仙座 96": "96 her", "武仙座 97": "97 her", "武仙座 98": "98 her", "武仙座 99": "99 her", "武仙座 100": "100 her", "武仙座 101": "101 her", "武仙座 102": "102 her", "武仙座 103": "103 her", "武仙座 104": "104 her", "武仙座 105": "105 her", "武仙座 106": "106 her", "武仙座 107": "107 her", "武仙座 108": "108 her", "武仙座 109": "109 her", "武仙座 110": "110 her", "武仙座 111": "111 her", "武仙座 112": "112 her", "武仙座 113": "113 her", "时钟座 α": "alf hor", "时钟座 β": "bet hor", "时钟座 γ": "gam hor", "时钟座 δ": "del hor", "时钟座 ζ": "zet hor", "时钟座 η": "eta hor", "时钟座 ι": "iot hor", "时钟座 λ": "lam hor", "时钟座 μ": "mu. hor", "时钟座 ν": "nu. hor", "长蛇座 α": "alf hya", "长蛇座 β": "bet hya", "巨爵座 28": "28 crt", "长蛇座 γ": "gam hya", "长蛇座 δ": "del hya", "长蛇座 ε": "eps hya", "长蛇座 ζ": "zet hya", "长蛇座 η": "eta hya", "长蛇座 θ": "tet hya", "长蛇座 ι": "iot hya", "长蛇座 κ": "kap hya", "长蛇座 λ": "lam hya", "长蛇座 μ": "mu. hya", "长蛇座 ν": "nu. hya", "巨爵座 4": "4 crt", "长蛇座 ξ": "ksi hya", "巨爵座 19": "19 crt", "长蛇座 ο": "omi hya", "巨爵座 25": "25 crt", "长蛇座 π": "pi. hya", "长蛇座 ρ": "rho hya", "长蛇座 σ": "sig hya", "长蛇座 τ1": "tau1 hya", "长蛇座 τ2": "tau2 hya", "长蛇座 υ1": "ups1 hya", "长蛇座 υ2": "ups2 hya", "长蛇座 φ": "phi hya", "长蛇座 φ1": "phi1 hya", "长蛇座 φ2": "phi2 hya", "巨爵座 1": "1 crt", "长蛇座 φ3": "phi3 hya", "巨爵座 2": "2 crt", "长蛇座 χ1": "chi1 hya", "巨爵座 9": "9 crt", "长蛇座 χ2": "chi2 hya", "长蛇座 ψ": "psi hya", "长蛇座 ω": "ome hya", "长蛇座 a": "a hya", "长蛇座 b1": "b1 hya", "巨爵座 3": "3 crt", "长蛇座 b3": "b3 hya", "巨爵座 6": "6 crt", "长蛇座 k": "k hya", "长蛇座 l": "l hya", "长蛇座 m": "m hya", "长蛇座 A": "a hya", "长蛇座 C": "c hya", "长蛇座 D": "d hya", "长蛇座 E": "e hya", "长蛇座 F": "f hya", "长蛇座 G": "g hya", "长蛇座 I": "i hya", "长蛇座 P": "p hya", "长蛇座 1": "1 hya", "长蛇座 2": "2 hya", "长蛇座 3": "3 hya", "长蛇座 4": "4 hya", "长蛇座 5": "5 hya", "长蛇座 6": "6 hya", "长蛇座 7": "7 hya", "长蛇座 9": "9 hya", "长蛇座 10": "10 hya", "长蛇座 11": "11 hya", "长蛇座 12": "12 hya", "长蛇座 13": "13 hya", "长蛇座 14": "14 hya", "长蛇座 15": "15 hya", "长蛇座 16": "16 hya", "长蛇座 17": "17 hya", "长蛇座 18": "18 hya", "长蛇座 19": "19 hya", "长蛇座 20": "20 hya", "长蛇座 21": "21 hya", "长蛇座 22": "22 hya", "长蛇座 23": "23 hya", "长蛇座 24": "24 hya", "长蛇座 25": "25 hya", "长蛇座 26": "26 hya", "长蛇座 27": "27 hya", "长蛇座 28": "28 hya", "长蛇座 29": "29 hya", "长蛇座 30": "30 hya", "长蛇座 31": "31 hya", "长蛇座 32": "32 hya", "长蛇座 33": "33 hya", "长蛇座 34": "34 hya", "长蛇座 35": "35 hya", "长蛇座 37": "37 hya", "长蛇座 38": "38 hya", "长蛇座 39": "39 hya", "长蛇座 40": "40 hya", "长蛇座 41": "41 hya", "长蛇座 42": "42 hya", "长蛇座 43": "43 hya", "长蛇座 44": "44 hya", "长蛇座 45": "45 hya", "长蛇座 46": "46 hya", "长蛇座 47": "47 hya", "长蛇座 48": "48 hya", "长蛇座 49": "49 hya", "长蛇座 50": "50 hya", "长蛇座 51": "51 hya", "长蛇座 52": "52 hya", "长蛇座 54": "54 hya", "长蛇座 55": "55 hya", "长蛇座 56": "56 hya", "长蛇座 57": "57 hya", "长蛇座 58": "58 hya", "长蛇座 59": "59 hya", "长蛇座 60": "60 hya", "水蛇座 α": "alf hyi", "水蛇座 β": "bet hyi", "水蛇座 γ": "gam hyi", "水蛇座 δ": "del hyi", "水蛇座 ε": "eps hyi", "水蛇座 ζ": "zet hyi", "水蛇座 η1": "eta1 hyi", "水蛇座 η2": "eta2 hyi", "水蛇座 θ": "tet hyi", "水蛇座 ι": "iot hyi", "水蛇座 κ": "kap hyi", "水蛇座 λ": "lam hyi", "水蛇座 μ": "mu. hyi", "水蛇座 ν": "nu. hyi", "水蛇座 π1": "pi.1 hyi", "水蛇座 π2": "pi.2 hyi", "水蛇座 σ": "sig hyi", "水蛇座 τ1": "tau1 hyi", "水蛇座 τ2": "tau2 hyi", "印第安座 α": "alf ind", "印第安座 β": "bet ind", "印第安座 γ": "gam ind", "印第安座 δ": "del ind", "印第安座 ε": "eps ind", "印第安座 ζ": "zet ind", "印第安座 η": "eta ind", "印第安座 θ": "tet ind", "印第安座 ι": "iot ind", "印第安座 κ1": "kap1 ind", "印第安座 κ2": "kap2 ind", "印第安座 μ": "mu. ind", "印第安座 ν": "nu. ind", "印第安座 ο": "omi ind", "印第安座 π": "pi. ind", "印第安座 ρ": "rho ind", "蝎虎座 α": "alf lac", "蝎虎座 β": "bet lac", "蝎虎座 1": "1 lac", "蝎虎座 2": "2 lac", "蝎虎座 3": "3 lac", "蝎虎座 4": "4 lac", "蝎虎座 5": "5 lac", "蝎虎座 6": "6 lac", "蝎虎座 7": "7 lac", "蝎虎座 8": "8 lac", "蝎虎座 9": "9 lac", "蝎虎座 10": "10 lac", "蝎虎座 11": "11 lac", "蝎虎座 12": "12 lac", "蝎虎座 13": "13 lac", "蝎虎座 14": "14 lac", "蝎虎座 15": "15 lac", "蝎虎座 16": "16 lac", "狮子座 α": "alf leo", "狮子座 β": "bet leo", "狮子座 γ1": "gam1 leo", "狮子座 γ2": "gam2 leo", "狮子座 δ": "del leo", "狮子座 ε": "eps leo", "狮子座 ζ": "zet leo", "狮子座 η": "eta leo", "狮子座 θ": "tet leo", "狮子座 ι": "iot leo", "狮子座 κ": "kap leo", "狮子座 λ": "lam leo", "狮子座 μ": "mu. leo", "狮子座 ν": "nu. leo", "狮子座 ξ": "ksi leo", "狮子座 ο": "omi leo", "狮子座 π": "pi. leo", "狮子座 ρ": "rho leo", "狮子座 σ": "sig leo", "狮子座 τ": "tau leo", "狮子座 υ": "ups leo", "狮子座 φ": "phi leo", "狮子座 χ": "chi leo", "狮子座 ψ": "psi leo", "狮子座 ω": "ome leo", "狮子座 b": "b leo", "狮子座 c": "c leo", "狮子座 d": "d leo", "狮子座 e": "e leo", "狮子座 f": "f leo", "狮子座 g": "g leo", "狮子座 k": "k leo", "狮子座 l": "l leo", "狮子座 m": "m leo", "狮子座 n": "n leo", "狮子座 o": "o leo", "狮子座 p1": "p1 leo", "狮子座 p2": "p2 leo", "狮子座 p3": "p3 leo", "狮子座 p4": "p4 leo", "狮子座 p5": "p5 leo", "狮子座 1": "1 leo", "狮子座 2": "2 leo", "狮子座 3": "3 leo", "狮子座 4": "4 leo", "狮子座 5": "5 leo", "狮子座 6": "6 leo", "狮子座 7": "7 leo", "狮子座 8": "8 leo", "狮子座 9": "9 leo", "狮子座 10": "10 leo", "狮子座 11": "11 leo", "狮子座 12": "12 leo", "狮子座 13": "13 leo", "狮子座 14": "14 leo", "狮子座 15": "15 leo", "狮子座 16": "16 leo", "狮子座 17": "17 leo", "狮子座 18": "18 leo", "狮子座 19": "19 leo", "狮子座 20": "20 leo", "狮子座 21": "21 leo", "狮子座 22": "22 leo", "狮子座 23": "23 leo", "狮子座 24": "24 leo", "狮子座 26": "26 leo", "狮子座 27": "27 leo", "狮子座 29": "29 leo", "狮子座 30": "30 leo", "狮子座 31": "31 leo", "狮子座 32": "32 leo", "狮子座 33": "33 leo", "狮子座 34": "34 leo", "狮子座 35": "35 leo", "狮子座 36": "36 leo", "狮子座 37": "37 leo", "狮子座 39": "39 leo", "狮子座 40": "40 leo", "狮子座 41": "41 leo", "狮子座 42": "42 leo", "狮子座 43": "43 leo", "狮子座 44": "44 leo", "狮子座 45": "45 leo", "狮子座 46": "46 leo", "狮子座 47": "47 leo", "狮子座 48": "48 leo", "狮子座 49": "49 leo", "狮子座 50": "50 leo", "狮子座 51": "51 leo", "狮子座 52": "52 leo", "狮子座 53": "53 leo", "狮子座 54": "54 leo", "狮子座 55": "55 leo", "狮子座 56": "56 leo", "狮子座 57": "57 leo", "狮子座 58": "58 leo", "狮子座 59": "59 leo", "狮子座 60": "60 leo", "狮子座 61": "61 leo", "狮子座 62": "62 leo", "狮子座 63": "63 leo", "狮子座 64": "64 leo", "狮子座 65": "65 leo", "狮子座 66": "66 leo", "狮子座 67": "67 leo", "狮子座 68": "68 leo", "狮子座 69": "69 leo", "狮子座 70": "70 leo", "狮子座 71": "71 leo", "狮子座 72": "72 leo", "狮子座 73": "73 leo", "狮子座 74": "74 leo", "狮子座 75": "75 leo", "狮子座 76": "76 leo", "狮子座 77": "77 leo", "狮子座 78": "78 leo", "狮子座 79": "79 leo", "狮子座 80": "80 leo", "狮子座 81": "81 leo", "狮子座 82": "82 leo", "狮子座 83": "83 leo", "狮子座 84": "84 leo", "狮子座 85": "85 leo", "狮子座 86": "86 leo", "狮子座 87": "87 leo", "狮子座 88": "88 leo", "狮子座 89": "89 leo", "狮子座 90": "90 leo", "狮子座 91": "91 leo", "狮子座 92": "92 leo", "狮子座 93": "93 leo", "狮子座 94": "94 leo", "狮子座 95": "95 leo", "小狮座 β": "bet lmi", "小狮座 h": "h lmi", "小狮座 o": "o lmi", "小狮座 1": "1 lmi", "小狮座 2": "2 lmi", "小狮座 3": "3 lmi", "小狮座 4": "4 lmi", "小狮座 5": "5 lmi", "小狮座 6": "6 lmi", "小狮座 7": "7 lmi", "小狮座 8": "8 lmi", "小狮座 9": "9 lmi", "小狮座 10": "10 lmi", "小狮座 11": "11 lmi", "小狮座 13": "13 lmi", "小狮座 14": "14 lmi", "小狮座 15": "15 lmi", "小狮座 16": "16 lmi", "小狮座 17": "17 lmi", "小狮座 18": "18 lmi", "小狮座 19": "19 lmi", "小狮座 20": "20 lmi", "小狮座 21": "21 lmi", "小狮座 22": "22 lmi", "小狮座 23": "23 lmi", "小狮座 24": "24 lmi", "小狮座 25": "25 lmi", "小狮座 26": "26 lmi", "小狮座 27": "27 lmi", "小狮座 28": "28 lmi", "小狮座 29": "29 lmi", "小狮座 30": "30 lmi", "小狮座 31": "31 lmi", "小狮座 32": "32 lmi", "小狮座 33": "33 lmi", "小狮座 34": "34 lmi", "小狮座 35": "35 lmi", "小狮座 36": "36 lmi", "小狮座 37": "37 lmi", "小狮座 38": "38 lmi", "小狮座 39": "39 lmi", "小狮座 40": "40 lmi", "小狮座 41": "41 lmi", "小狮座 42": "42 lmi", "小狮座 43": "43 lmi", "小狮座 44": "44 lmi", "小狮座 45": "45 lmi", "小狮座 46": "46 lmi", "小狮座 47": "47 lmi", "小狮座 48": "48 lmi", "小狮座 49": "49 lmi", "小狮座 50": "50 lmi", "小狮座 51": "51 lmi", "小狮座 52": "52 lmi", "小狮座 53": "53 lmi", "天兔座 α": "alf lep", "天兔座 β": "bet lep", "天兔座 γ": "gam lep", "天兔座 δ": "del lep", "天兔座 ε": "eps lep", "天兔座 ζ": "zet lep", "天兔座 η": "eta lep", "天兔座 θ": "tet lep", "天兔座 ι": "iot lep", "天兔座 κ": "kap lep", "天兔座 λ": "lam lep", "天兔座 μ": "mu. lep", "天兔座 ν": "nu. lep", "天兔座 1": "1 lep", "天兔座 2": "2 lep", "天兔座 3": "3 lep", "天兔座 4": "4 lep", "天兔座 5": "5 lep", "天兔座 6": "6 lep", "天兔座 7": "7 lep", "天兔座 8": "8 lep", "天兔座 9": "9 lep", "天兔座 10": "10 lep", "天兔座 11": "11 lep", "天兔座 12": "12 lep", "天兔座 13": "13 lep", "天兔座 14": "14 lep", "天兔座 15": "15 lep", "天兔座 16": "16 lep", "天兔座 17": "17 lep", "天兔座 18": "18 lep", "天兔座 19": "19 lep", "天秤座 α1": "alf1 lib", "天秤座 α2": "alf2 lib", "天秤座 β": "bet lib", "天秤座 γ": "gam lib", "天秤座 δ": "del lib", "天秤座 ε": "eps lib", "天秤座 ζ": "zet lib", "天秤座 ζ1": "zet1 lib", "天秤座 ζ3": "zet3 lib", "天秤座 ζ4": "zet4 lib", "天秤座 η": "eta lib", "天秤座 θ": "tet lib", "天秤座 ι1": "iot1 lib", "天秤座 ι2": "iot2 lib", "天秤座 κ": "kap lib", "天秤座 λ": "lam lib", "天秤座 μ": "mu. lib", "天秤座 ν": "nu. lib", "天秤座 ξ1": "ksi1 lib", "天秤座 ξ2": "ksi2 lib", "天秤座 ο": "omi lib", "天秤座 σ": "sig lib", "天秤座 τ": "tau lib", "天秤座 υ": "ups lib", "天秤座 2": "2 lib", "天秤座 3": "3 lib", "天秤座 4": "4 lib", "长蛇座 53": "53 hya", "天秤座 5": "5 lib", "天秤座 6": "6 lib", "天秤座 7": "7 lib", "天秤座 8": "8 lib", "天秤座 9": "9 lib", "天秤座 10": "10 lib", "天秤座 11": "11 lib", "天秤座 12": "12 lib", "天秤座 13": "13 lib", "天秤座 14": "14 lib", "天秤座 15": "15 lib", "天秤座 16": "16 lib", "天秤座 17": "17 lib", "天秤座 18": "18 lib", "天秤座 19": "19 lib", "天秤座 20": "20 lib", "天秤座 21": "21 lib", "天秤座 22": "22 lib", "天秤座 23": "23 lib", "天秤座 24": "24 lib", "天秤座 25": "25 lib", "天秤座 26": "26 lib", "天秤座 27": "27 lib", "天秤座 28": "28 lib", "天秤座 29": "29 lib", "天秤座 30": "30 lib", "天秤座 31": "31 lib", "天秤座 32": "32 lib", "天秤座 33": "33 lib", "天秤座 34": "34 lib", "天秤座 35": "35 lib", "天秤座 36": "36 lib", "天秤座 37": "37 lib", "天秤座 38": "38 lib", "天秤座 39": "39 lib", "天秤座 40": "40 lib", "天秤座 41": "41 lib", "天秤座 42": "42 lib", "天秤座 43": "43 lib", "天秤座 44": "44 lib", "天秤座 45": "45 lib", "天秤座 46": "46 lib", "天秤座 47": "47 lib", "天秤座 48": "48 lib", "天秤座 49": "49 lib", "天秤座 50": "50 lib", "豺狼座 α": "alf lup", "豺狼座 β": "bet lup", "豺狼座 γ": "gam lup", "豺狼座 δ": "del lup", "豺狼座 ε": "eps lup", "豺狼座 ζ": "zet lup", "豺狼座 η": "eta lup", "豺狼座 θ": "tet lup", "豺狼座 ι": "iot lup", "豺狼座 κ1": "kap1 lup", "豺狼座 κ2": "kap2 lup", "豺狼座 λ": "lam lup", "豺狼座 μ": "mu. lup", "豺狼座 ν1": "nu.1 lup", "豺狼座 ν2": "nu.2 lup", "豺狼座 ξ1": "ksi1 lup", "豺狼座 ξ2": "ksi2 lup", "豺狼座 ο": "omi lup", "豺狼座 π": "pi. lup", "豺狼座 ρ": "rho lup", "豺狼座 σ": "sig lup", "豺狼座 τ1": "tau1 lup", "豺狼座 τ2": "tau2 lup", "豺狼座 υ": "ups lup", "豺狼座 φ1": "phi1 lup", "豺狼座 φ2": "phi2 lup", "豺狼座 χ": "chi lup", "豺狼座 ψ1": "psi1 lup", "豺狼座 ψ2": "psi2 lup", "豺狼座 ω": "ome lup", "豺狼座 a": "a lup", "豺狼座 b": "b lup", "豺狼座 c": "c lup", "豺狼座 d": "d lup", "豺狼座 e": "e lup", "豺狼座 f": "f lup", "豺狼座 g": "g lup", "豺狼座 h": "h lup", "豺狼座 i": "i lup", "豺狼座 k": "k lup", "豺狼座 1": "1 lup", "豺狼座 2": "2 lup", "豺狼座 3": "3 lup", "豺狼座 4": "4 lup", "豺狼座 5": "5 lup", "天猫座 α": "alf lyn", "天猫座 1": "1 lyn", "天猫座 2": "2 lyn", "天猫座 3": "3 lyn", "天猫座 4": "4 lyn", "天猫座 5": "5 lyn", "天猫座 6": "6 lyn", "天猫座 7": "7 lyn", "天猫座 8": "8 lyn", "天猫座 9": "9 lyn", "天猫座 10": "10 lyn", "天猫座 11": "11 lyn", "天猫座 12": "12 lyn", "天猫座 13": "13 lyn", "天猫座 14": "14 lyn", "天猫座 15": "15 lyn", "天猫座 16": "16 lyn", "天猫座 17": "17 lyn", "天猫座 18": "18 lyn", "天猫座 19": "19 lyn", "天猫座 20": "20 lyn", "天猫座 21": "21 lyn", "天猫座 22": "22 lyn", "天猫座 23": "23 lyn", "天猫座 24": "24 lyn", "天猫座 25": "25 lyn", "天猫座 26": "26 lyn", "天猫座 27": "27 lyn", "天猫座 28": "28 lyn", "天猫座 29": "29 lyn", "天猫座 30": "30 lyn", "鹿豹座 58": "58 cam", "天猫座 31": "31 lyn", "天猫座 32": "32 lyn", "天猫座 33": "33 lyn", "天猫座 34": "34 lyn", "天猫座 35": "35 lyn", "天猫座 36": "36 lyn", "天猫座 37": "37 lyn", "天猫座 38": "38 lyn", "天猫座 39": "39 lyn", "天猫座 40": "40 lyn", "天猫座 41": "41 lyn", "天猫座 42": "42 lyn", "天猫座 43": "43 lyn", "天猫座 44": "44 lyn", "天琴座 α": "alf lyr", "天琴座 β": "bet lyr", "天琴座 γ": "gam lyr", "天琴座 δ1": "del1 lyr", "天琴座 δ2": "del2 lyr", "天琴座 ε1": "eps1 lyr", "天琴座 ε2": "eps2 lyr", "天琴座 ζ1": "zet1 lyr", "天琴座 ζ2": "zet2 lyr", "天琴座 η": "eta lyr", "天琴座 θ": "tet lyr", "天琴座 ι": "iot lyr", "天琴座 κ": "kap lyr", "天琴座 λ": "lam lyr", "天琴座 μ": "mu. lyr", "天琴座 ν": "nu. lyr", "天琴座 ν1": "nu.1 lyr", "天琴座 ν2": "nu.2 lyr", "天琴座 1": "1 lyr", "天琴座 2": "2 lyr", "天琴座 3": "3 lyr", "天琴座 4": "4 lyr", "天琴座 5": "5 lyr", "天琴座 6": "6 lyr", "天琴座 7": "7 lyr", "天琴座 8": "8 lyr", "天琴座 9": "9 lyr", "天琴座 10": "10 lyr", "天琴座 11": "11 lyr", "天琴座 12": "12 lyr", "天琴座 13": "13 lyr", "天琴座 14": "14 lyr", "天琴座 15": "15 lyr", "天琴座 16": "16 lyr", "天琴座 17": "17 lyr", "天琴座 18": "18 lyr", "天琴座 19": "19 lyr", "天琴座 20": "20 lyr", "天琴座 21": "21 lyr", "山案座 α": "alf men", "山案座 β": "bet men", "山案座 γ": "gam men", "山案座 δ": "del men", "山案座 ε": "eps men", "山案座 ζ": "zet men", "山案座 η": "eta men", "山案座 θ": "tet men", "山案座 ι": "iot men", "山案座 κ": "kap men", "山案座 λ": "lam men", "山案座 μ": "mu. men", "山案座 ν": "nu. men", "山案座 ξ": "ksi men", "山案座 π": "pi. men", "山案座 31": "31 men", "显微镜座 α": "alf mic", "显微镜座 β": "bet mic", "显微镜座 γ": "gam mic", "显微镜座 δ": "del mic", "显微镜座 ε": "eps mic", "显微镜座 ζ": "zet mic", "显微镜座 η": "eta mic", "显微镜座 θ1": "tet1 mic", "显微镜座 θ2": "tet2 mic", "显微镜座 ι": "iot mic", "显微镜座 ν": "nu. mic", "麒麟座 α": "alf mon", "麒麟座 β": "bet mon", "麒麟座 γ": "gam mon", "麒麟座 δ": "del mon", "麒麟座 ε": "eps mon", "麒麟座 ζ": "zet mon", "麒麟座 1": "1 mon", "麒麟座 2": "2 mon", "麒麟座 3": "3 mon", "麒麟座 4": "4 mon", "麒麟座 5": "5 mon", "麒麟座 6": "6 mon", "麒麟座 7": "7 mon", "麒麟座 8": "8 mon", "麒麟座 9": "9 mon", "麒麟座 10": "10 mon", "麒麟座 11": "11 mon", "麒麟座 12": "12 mon", "麒麟座 13": "13 mon", "麒麟座 14": "14 mon", "麒麟座 15": "15 mon", "麒麟座 16": "16 mon", "麒麟座 17": "17 mon", "麒麟座 18": "18 mon", "麒麟座 19": "19 mon", "麒麟座 20": "20 mon", "麒麟座 21": "21 mon", "麒麟座 22": "22 mon", "麒麟座 23": "23 mon", "麒麟座 24": "24 mon", "麒麟座 25": "25 mon", "麒麟座 26": "26 mon", "麒麟座 27": "27 mon", "麒麟座 28": "28 mon", "麒麟座 29": "29 mon", "麒麟座 30": "30 mon", "麒麟座 31": "31 mon", "苍蝇座 α": "alf mus", "苍蝇座 β": "bet mus", "苍蝇座 γ": "gam mus", "苍蝇座 δ": "del mus", "苍蝇座 ε": "eps mus", "苍蝇座 ζ1": "zet1 mus", "苍蝇座 ζ2": "zet2 mus", "苍蝇座 η": "eta mus", "苍蝇座 θ": "tet mus", "苍蝇座 ι1": "iot1 mus", "苍蝇座 ι2": "iot2 mus", "苍蝇座 λ": "lam mus", "苍蝇座 μ": "mu. mus", "矩尺座 γ1": "gam1 nor", "矩尺座 γ2": "gam2 nor", "矩尺座 δ": "del nor", "矩尺座 ε": "eps nor", "矩尺座 ζ": "zet nor", "矩尺座 η": "eta nor", "矩尺座 θ": "tet nor", "矩尺座 ι1": "iot1 nor", "矩尺座 ι2": "iot2 nor", "矩尺座 κ": "kap nor", "矩尺座 λ": "lam nor", "矩尺座 μ": "mu. nor", "南极座 α": "alf oct", "南极座 β": "bet oct", "南极座 γ1": "gam1 oct", "南极座 γ2": "gam2 oct", "南极座 γ3": "gam3 oct", "南极座 δ": "del oct", "南极座 ε": "eps oct", "南极座 ζ": "zet oct", "南极座 η": "eta oct", "南极座 θ": "tet oct", "南极座 ι": "iot oct", "南极座 κ": "kap oct", "南极座 λ": "lam oct", "南极座 μ1": "mu.1 oct", "南极座 μ2": "mu.2 oct", "南极座 ν": "nu. oct", "南极座 ξ": "ksi oct", "南极座 π1": "pi.1 oct", "南极座 π2": "pi.2 oct", "南极座 ρ": "rho oct", "南极座 σ": "sig oct", "南极座 τ": "tau oct", "南极座 υ": "ups oct", "南极座 φ": "phi oct", "南极座 χ": "chi oct", "南极座 ψ": "psi oct", "南极座 ω": "ome oct", "蛇夫座 α": "alf oph", "蛇夫座 β": "bet oph", "蛇夫座 γ": "gam oph", "蛇夫座 δ": "del oph", "蛇夫座 ε": "eps oph", "蛇夫座 ζ": "zet oph", "蛇夫座 η": "eta oph", "蛇夫座 θ": "tet oph", "蛇夫座 ι": "iot oph", "蛇夫座 κ": "kap oph", "蛇夫座 λ": "lam oph", "蛇夫座 μ": "mu. oph", "蛇夫座 ν": "nu. oph", "蛇夫座 ξ": "ksi oph", "蛇夫座 ο": "omi oph", "蛇夫座 ρ": "rho oph", "蛇夫座 σ": "sig oph", "蛇夫座 τ": "tau oph", "蛇夫座 υ": "ups oph", "蛇夫座 φ": "phi oph", "蛇夫座 χ": "chi oph", "蛇夫座 ψ": "psi oph", "蛇夫座 ω": "ome oph", "蛇夫座 b": "b oph", "蛇夫座 c": "c oph", "蛇夫座 d": "d oph", "蛇夫座 e": "e oph", "武仙座 66": "66 her", "蛇夫座 f": "f oph", "蛇夫座 p": "p oph", "蛇夫座 A": "a oph", "蛇夫座 1": "1 oph", "蛇夫座 2": "2 oph", "蛇夫座 3": "3 oph", "蛇夫座 4": "4 oph", "蛇夫座 5": "5 oph", "蛇夫座 7": "7 oph", "蛇夫座 8": "8 oph", "蛇夫座 9": "9 oph", "蛇夫座 10": "10 oph", "蛇夫座 11": "11 oph", "蛇夫座 12": "12 oph", "蛇夫座 13": "13 oph", "蛇夫座 14": "14 oph", "蛇夫座 15": "15 oph", "蛇夫座 16": "16 oph", "蛇夫座 17": "17 oph", "蛇夫座 19": "19 oph", "蛇夫座 20": "20 oph", "蛇夫座 21": "21 oph", "蛇夫座 22": "22 oph", "蛇夫座 23": "23 oph", "蛇夫座 24": "24 oph", "蛇夫座 25": "25 oph", "蛇夫座 26": "26 oph", "蛇夫座 27": "27 oph", "蛇夫座 28": "28 oph", "蛇夫座 29": "29 oph", "蛇夫座 30": "30 oph", "蛇夫座 31": "31 oph", "蛇夫座 32": "32 oph", "蛇夫座 33": "33 oph", "蛇夫座 34": "34 oph", "蛇夫座 35": "35 oph", "蛇夫座 36": "36 oph", "蛇夫座 37": "37 oph", "蛇夫座 38": "38 oph", "蛇夫座 39": "39 oph", "蛇夫座 40": "40 oph", "蛇夫座 41": "41 oph", "蛇夫座 42": "42 oph", "蛇夫座 43": "43 oph", "蛇夫座 44": "44 oph", "蛇夫座 45": "45 oph", "蛇夫座 47": "47 oph", "蛇夫座 49": "49 oph", "蛇夫座 50": "50 oph", "蛇夫座 51": "51 oph", "蛇夫座 52": "52 oph", "蛇夫座 53": "53 oph", "蛇夫座 54": "54 oph", "蛇夫座 55": "55 oph", "蛇夫座 56": "56 oph", "蛇夫座 57": "57 oph", "蛇夫座 58": "58 oph", "蛇夫座 60": "60 oph", "蛇夫座 61": "61 oph", "蛇夫座 62": "62 oph", "蛇夫座 63": "63 oph", "蛇夫座 64": "64 oph", "蛇夫座 66": "66 oph", "蛇夫座 67": "67 oph", "蛇夫座 68": "68 oph", "蛇夫座 69": "69 oph", "蛇夫座 70": "70 oph", "蛇夫座 71": "71 oph", "蛇夫座 72": "72 oph", "蛇夫座 73": "73 oph", "蛇夫座 74": "74 oph", "蛇夫座 191": "191 oph", "猎户座 α": "alf ori", "猎户座 β": "bet ori", "猎户座 γ": "gam ori", "猎户座 δ": "del ori", "猎户座 ε": "eps ori", "猎户座 ζ": "zet ori", "猎户座 η": "eta ori", "猎户座 θ1": "tet1 ori", "猎户座 θ2": "tet2 ori", "猎户座 ι": "iot ori", "猎户座 κ": "kap ori", "猎户座 λ": "lam ori", "猎户座 μ": "mu. ori", "猎户座 ν": "nu. ori", "猎户座 ξ": "ksi ori", "猎户座 ο1": "omi1 ori", "猎户座 ο2": "omi2 ori", "猎户座 π1": "pi.1 ori", "猎户座 π2": "pi.2 ori", "猎户座 π3": "pi.3 ori", "猎户座 π4": "pi.4 ori", "猎户座 π5": "pi.5 ori", "猎户座 π6": "pi.6 ori", "猎户座 ρ": "rho ori", "猎户座 σ": "sig ori", "猎户座 τ": "tau ori", "猎户座 υ": "ups ori", "猎户座 φ1": "phi1 ori", "猎户座 φ2": "phi2 ori", "猎户座 χ1": "chi1 ori", "猎户座 χ2": "chi2 ori", "猎户座 ψ": "psi ori", "猎户座 ψ1": "psi1 ori", "猎户座 ψ2": "psi2 ori", "猎户座 ω": "ome ori", "猎户座 b": "b ori", "猎户座 c": "c ori", "猎户座 d": "d ori", "猎户座 e": "e ori", "猎户座 f1": "f1 ori", "猎户座 f2": "f2 ori", "猎户座 g": "g ori", "猎户座 h": "h ori", "猎户座 i": "i ori", "猎户座 k": "k ori", "猎户座 l": "l ori", "猎户座 m": "m ori", "猎户座 n1": "n1 ori", "猎户座 n2": "n2 ori", "猎户座 o": "o ori", "猎户座 p": "p ori", "猎户座 A": "a ori", "猎户座 1": "1 ori", "猎户座 2": "2 ori", "猎户座 3": "3 ori", "猎户座 4": "4 ori", "猎户座 5": "5 ori", "猎户座 6": "6 ori", "猎户座 7": "7 ori", "猎户座 8": "8 ori", "猎户座 9": "9 ori", "猎户座 10": "10 ori", "猎户座 11": "11 ori", "猎户座 13": "13 ori", "猎户座 14": "14 ori", "猎户座 15": "15 ori", "猎户座 16": "16 ori", "猎户座 17": "17 ori", "猎户座 18": "18 ori", "猎户座 19": "19 ori", "猎户座 20": "20 ori", "猎户座 21": "21 ori", "猎户座 22": "22 ori", "猎户座 23": "23 ori", "猎户座 24": "24 ori", "猎户座 25": "25 ori", "猎户座 27": "27 ori", "猎户座 28": "28 ori", "猎户座 29": "29 ori", "猎户座 30": "30 ori", "猎户座 31": "31 ori", "猎户座 32": "32 ori", "猎户座 33": "33 ori", "猎户座 34": "34 ori", "猎户座 35": "35 ori", "猎户座 36": "36 ori", "猎户座 37": "37 ori", "猎户座 38": "38 ori", "猎户座 39": "39 ori", "猎户座 40": "40 ori", "猎户座 41": "41 ori", "猎户座 42": "42 ori", "猎户座 43": "43 ori", "猎户座 44": "44 ori", "猎户座 45": "45 ori", "猎户座 46": "46 ori", "猎户座 47": "47 ori", "猎户座 48": "48 ori", "猎户座 49": "49 ori", "猎户座 50": "50 ori", "猎户座 51": "51 ori", "猎户座 52": "52 ori", "猎户座 53": "53 ori", "猎户座 54": "54 ori", "猎户座 55": "55 ori", "猎户座 56": "56 ori", "猎户座 57": "57 ori", "猎户座 58": "58 ori", "猎户座 59": "59 ori", "猎户座 60": "60 ori", "猎户座 61": "61 ori", "猎户座 62": "62 ori", "猎户座 63": "63 ori", "猎户座 64": "64 ori", "猎户座 66": "66 ori", "猎户座 67": "67 ori", "猎户座 68": "68 ori", "猎户座 69": "69 ori", "猎户座 70": "70 ori", "猎户座 71": "71 ori", "猎户座 72": "72 ori", "猎户座 73": "73 ori", "猎户座 74": "74 ori", "猎户座 75": "75 ori", "猎户座 77": "77 ori", "猎户座 78": "78 ori", "孔雀座 α": "alf pav", "孔雀座 β": "bet pav", "孔雀座 γ": "gam pav", "孔雀座 δ": "del pav", "孔雀座 ε": "eps pav", "孔雀座 ζ": "zet pav", "孔雀座 η": "eta pav", "孔雀座 θ": "tet pav", "孔雀座 ι": "iot pav", "孔雀座 κ": "kap pav", "孔雀座 λ": "lam pav", "孔雀座 μ1": "mu.1 pav", "孔雀座 μ2": "mu.2 pav", "孔雀座 ν": "nu. pav", "孔雀座 ξ": "ksi pav", "孔雀座 ο": "omi pav", "孔雀座 π": "pi. pav", "孔雀座 ρ": "rho pav", "孔雀座 σ": "sig pav", "孔雀座 τ": "tau pav", "孔雀座 υ": "ups pav", "孔雀座 φ1": "phi1 pav", "孔雀座 φ2": "phi2 pav", "孔雀座 ω": "ome pav", "飞马座 α": "alf peg", "飞马座 β": "bet peg", "飞马座 γ": "gam peg", "飞马座 δ": "del peg", "飞马座 ε": "eps peg", "飞马座 ζ": "zet peg", "飞马座 η": "eta peg", "飞马座 θ": "tet peg", "飞马座 ι": "iot peg", "飞马座 κ": "kap peg", "飞马座 λ": "lam peg", "飞马座 μ": "mu. peg", "飞马座 ν": "nu. peg", "飞马座 ξ": "ksi peg", "飞马座 ο": "omi peg", "飞马座 π": "pi. peg", "飞马座 π1": "pi.1 peg", "飞马座 π2": "pi.2 peg", "飞马座 ρ": "rho peg", "飞马座 σ": "sig peg", "飞马座 τ": "tau peg", "飞马座 υ": "ups peg", "飞马座 φ": "phi peg", "飞马座 χ": "chi peg", "飞马座 ψ": "psi peg", "飞马座 1": "1 peg", "飞马座 2": "2 peg", "飞马座 3": "3 peg", "飞马座 4": "4 peg", "飞马座 5": "5 peg", "飞马座 6": "6 peg", "飞马座 7": "7 peg", "飞马座 8": "8 peg", "飞马座 9": "9 peg", "飞马座 10": "10 peg", "飞马座 11": "11 peg", "宝瓶座 27": "27 aqr", "飞马座 12": "12 peg", "飞马座 13": "13 peg", "飞马座 14": "14 peg", "飞马座 15": "15 peg", "飞马座 16": "16 peg", "飞马座 17": "17 peg", "飞马座 18": "18 peg", "飞马座 19": "19 peg", "飞马座 20": "20 peg", "飞马座 21": "21 peg", "飞马座 22": "22 peg", "飞马座 23": "23 peg", "飞马座 24": "24 peg", "飞马座 25": "25 peg", "飞马座 26": "26 peg", "飞马座 27": "27 peg", "飞马座 28": "28 peg", "飞马座 29": "29 peg", "飞马座 30": "30 peg", "飞马座 31": "31 peg", "飞马座 32": "32 peg", "飞马座 33": "33 peg", "飞马座 34": "34 peg", "飞马座 35": "35 peg", "飞马座 36": "36 peg", "飞马座 37": "37 peg", "飞马座 38": "38 peg", "飞马座 39": "39 peg", "飞马座 40": "40 peg", "飞马座 41": "41 peg", "飞马座 42": "42 peg", "飞马座 43": "43 peg", "飞马座 44": "44 peg", "飞马座 45": "45 peg", "飞马座 46": "46 peg", "飞马座 47": "47 peg", "飞马座 48": "48 peg", "飞马座 49": "49 peg", "飞马座 50": "50 peg", "飞马座 51": "51 peg", "飞马座 52": "52 peg", "飞马座 53": "53 peg", "飞马座 54": "54 peg", "飞马座 55": "55 peg", "飞马座 56": "56 peg", "飞马座 57": "57 peg", "飞马座 58": "58 peg", "飞马座 59": "59 peg", "飞马座 60": "60 peg", "飞马座 61": "61 peg", "飞马座 62": "62 peg", "飞马座 63": "63 peg", "飞马座 64": "64 peg", "飞马座 65": "65 peg", "飞马座 66": "66 peg", "飞马座 67": "67 peg", "飞马座 68": "68 peg", "飞马座 69": "69 peg", "飞马座 70": "70 peg", "飞马座 71": "71 peg", "飞马座 72": "72 peg", "飞马座 73": "73 peg", "飞马座 74": "74 peg", "飞马座 75": "75 peg", "飞马座 76": "76 peg", "飞马座 77": "77 peg", "飞马座 78": "78 peg", "飞马座 79": "79 peg", "飞马座 80": "80 peg", "飞马座 81": "81 peg", "飞马座 82": "82 peg", "飞马座 83": "83 peg", "飞马座 84": "84 peg", "飞马座 85": "85 peg", "飞马座 86": "86 peg", "飞马座 87": "87 peg", "飞马座 88": "88 peg", "飞马座 89": "89 peg", "英仙座 α": "alf per", "英仙座 β": "bet per", "英仙座 γ": "gam per", "英仙座 δ": "del per", "英仙座 ε": "eps per", "英仙座 ζ": "zet per", "英仙座 η": "eta per", "英仙座 θ": "tet per", "英仙座 ι": "iot per", "英仙座 κ": "kap per", "英仙座 λ": "lam per", "英仙座 μ": "mu. per", "英仙座 ν": "nu. per", "英仙座 ξ": "ksi per", "英仙座 ο": "omi per", "英仙座 π": "pi. per", "英仙座 ρ": "rho per", "英仙座 σ": "sig per", "英仙座 τ": "tau per", "英仙座 υ": "ups per", "英仙座 φ": "phi per", "仙女座 54": "54 and", "英仙座 χ": "chi per", "英仙座 ψ": "psi per", "英仙座 ω": "ome per", "英仙座 b": "b per", "英仙座 c": "c per", "英仙座 d": "d per", "英仙座 e": "e per", "英仙座 f": "f per", "英仙座 g": "g per", "英仙座 h": "h per", "英仙座 i": "i per", "英仙座 k": "k per", "英仙座 l": "l per", "英仙座 m": "m per", "英仙座 n": "n per", "英仙座 o": "o per", "英仙座 A": "a per", "英仙座 1": "1 per", "英仙座 2": "2 per", "英仙座 3": "3 per", "英仙座 4": "4 per", "英仙座 5": "5 per", "英仙座 6": "6 per", "英仙座 7": "7 per", "英仙座 8": "8 per", "英仙座 9": "9 per", "英仙座 10": "10 per", "英仙座 11": "11 per", "英仙座 12": "12 per", "英仙座 13": "13 per", "英仙座 14": "14 per", "英仙座 15": "15 per", "英仙座 16": "16 per", "英仙座 17": "17 per", "英仙座 18": "18 per", "英仙座 20": "20 per", "英仙座 21": "21 per", "英仙座 22": "22 per", "英仙座 23": "23 per", "英仙座 24": "24 per", "英仙座 25": "25 per", "英仙座 26": "26 per", "英仙座 27": "27 per", "英仙座 28": "28 per", "英仙座 29": "29 per", "英仙座 30": "30 per", "英仙座 31": "31 per", "英仙座 32": "32 per", "英仙座 33": "33 per", "英仙座 34": "34 per", "英仙座 35": "35 per", "英仙座 36": "36 per", "英仙座 37": "37 per", "英仙座 38": "38 per", "英仙座 39": "39 per", "英仙座 40": "40 per", "英仙座 41": "41 per", "英仙座 42": "42 per", "英仙座 43": "43 per", "英仙座 44": "44 per", "英仙座 45": "45 per", "英仙座 46": "46 per", "英仙座 47": "47 per", "英仙座 48": "48 per", "英仙座 49": "49 per", "英仙座 50": "50 per", "英仙座 51": "51 per", "英仙座 52": "52 per", "英仙座 53": "53 per", "英仙座 54": "54 per", "英仙座 55": "55 per", "英仙座 56": "56 per", "英仙座 57": "57 per", "英仙座 58": "58 per", "英仙座 59": "59 per", "凤凰座 α": "alf phe", "凤凰座 β": "bet phe", "凤凰座 γ": "gam phe", "凤凰座 δ": "del phe", "凤凰座 ε": "eps phe", "凤凰座 ζ": "zet phe", "凤凰座 η": "eta phe", "凤凰座 θ": "tet phe", "凤凰座 ι": "iot phe", "凤凰座 κ": "kap phe", "凤凰座 λ1": "lam1 phe", "凤凰座 λ2": "lam2 phe", "凤凰座 μ": "mu. phe", "凤凰座 ν": "nu. phe", "凤凰座 ξ": "ksi phe", "凤凰座 π": "pi. phe", "凤凰座 ρ": "rho phe", "凤凰座 σ": "sig phe", "凤凰座 τ": "tau phe", "凤凰座 υ": "ups phe", "凤凰座 φ": "phi phe", "凤凰座 χ": "chi phe", "凤凰座 ψ": "psi phe", "凤凰座 ω": "ome phe", "凤凰座 120": "120 phe", "绘架座 α": "alf pic", "绘架座 β": "bet pic", "绘架座 γ": "gam pic", "绘架座 δ": "del pic", "绘架座 ζ": "zet pic", "绘架座 η1": "eta1 pic", "绘架座 η2": "eta2 pic", "绘架座 θ": "tet pic", "绘架座 ι": "iot pic", "绘架座 κ": "kap pic", "绘架座 λ": "lam pic", "绘架座 μ": "mu. pic", "绘架座 ν": "nu. pic", "绘架座 61": "61 pic", "双鱼座 α": "alf psc", "双鱼座 β": "bet psc", "双鱼座 γ": "gam psc", "双鱼座 δ": "del psc", "双鱼座 ε": "eps psc", "双鱼座 ζ": "zet psc", "双鱼座 η": "eta psc", "双鱼座 θ": "tet psc", "双鱼座 ι": "iot psc", "双鱼座 κ": "kap psc", "双鱼座 λ": "lam psc", "双鱼座 μ": "mu. psc", "双鱼座 ν": "nu. psc", "双鱼座 ξ": "ksi psc", "双鱼座 ο": "omi psc", "双鱼座 π": "pi. psc", "双鱼座 ρ": "rho psc", "双鱼座 σ": "sig psc", "双鱼座 τ": "tau psc", "双鱼座 υ": "ups psc", "双鱼座 φ": "phi psc", "双鱼座 χ": "chi psc", "双鱼座 ψ1": "psi1 psc", "双鱼座 ψ2": "psi2 psc", "双鱼座 ψ3": "psi3 psc", "双鱼座 ω": "ome psc", "双鱼座 b": "b psc", "双鱼座 c": "c psc", "双鱼座 d": "d psc", "双鱼座 e": "e psc", "双鱼座 f": "f psc", "双鱼座 g": "g psc", "双鱼座 h": "h psc", "双鱼座 i": "i psc", "双鱼座 k": "k psc", "双鱼座 l": "l psc", "双鱼座 A": "a psc", "双鱼座 1": "1 psc", "双鱼座 2": "2 psc", "双鱼座 3": "3 psc", "双鱼座 4": "4 psc", "双鱼座 5": "5 psc", "双鱼座 6": "6 psc", "双鱼座 7": "7 psc", "双鱼座 8": "8 psc", "双鱼座 9": "9 psc", "双鱼座 10": "10 psc", "双鱼座 11": "11 psc", "双鱼座 12": "12 psc", "双鱼座 13": "13 psc", "双鱼座 14": "14 psc", "双鱼座 15": "15 psc", "双鱼座 16": "16 psc", "双鱼座 17": "17 psc", "双鱼座 18": "18 psc", "双鱼座 19": "19 psc", "双鱼座 20": "20 psc", "双鱼座 21": "21 psc", "双鱼座 22": "22 psc", "双鱼座 23": "23 psc", "双鱼座 24": "24 psc", "双鱼座 25": "25 psc", "双鱼座 26": "26 psc", "双鱼座 27": "27 psc", "双鱼座 28": "28 psc", "双鱼座 29": "29 psc", "双鱼座 30": "30 psc", "双鱼座 31": "31 psc", "双鱼座 32": "32 psc", "双鱼座 33": "33 psc", "双鱼座 34": "34 psc", "双鱼座 35": "35 psc", "双鱼座 36": "36 psc", "双鱼座 37": "37 psc", "双鱼座 38": "38 psc", "双鱼座 39": "39 psc", "双鱼座 40": "40 psc", "双鱼座 41": "41 psc", "双鱼座 42": "42 psc", "双鱼座 43": "43 psc", "双鱼座 44": "44 psc", "双鱼座 45": "45 psc", "双鱼座 46": "46 psc", "双鱼座 47": "47 psc", "双鱼座 48": "48 psc", "双鱼座 49": "49 psc", "双鱼座 51": "51 psc", "双鱼座 52": "52 psc", "双鱼座 53": "53 psc", "双鱼座 54": "54 psc", "双鱼座 55": "55 psc", "双鱼座 57": "57 psc", "双鱼座 58": "58 psc", "双鱼座 59": "59 psc", "双鱼座 60": "60 psc", "双鱼座 61": "61 psc", "双鱼座 62": "62 psc", "双鱼座 63": "63 psc", "双鱼座 64": "64 psc", "双鱼座 65": "65 psc", "双鱼座 66": "66 psc", "双鱼座 67": "67 psc", "双鱼座 68": "68 psc", "双鱼座 69": "69 psc", "仙女座 40": "40 and", "双鱼座 70": "70 psc", "双鱼座 71": "71 psc", "双鱼座 72": "72 psc", "双鱼座 73": "73 psc", "双鱼座 74": "74 psc", "双鱼座 75": "75 psc", "双鱼座 76": "76 psc", "双鱼座 77": "77 psc", "双鱼座 78": "78 psc", "双鱼座 79": "79 psc", "双鱼座 80": "80 psc", "双鱼座 81": "81 psc", "双鱼座 82": "82 psc", "双鱼座 83": "83 psc", "双鱼座 84": "84 psc", "双鱼座 85": "85 psc", "双鱼座 86": "86 psc", "双鱼座 87": "87 psc", "双鱼座 88": "88 psc", "双鱼座 89": "89 psc", "双鱼座 90": "90 psc", "双鱼座 91": "91 psc", "双鱼座 92": "92 psc", "双鱼座 93": "93 psc", "双鱼座 94": "94 psc", "双鱼座 95": "95 psc", "双鱼座 96": "96 psc", "双鱼座 97": "97 psc", "双鱼座 98": "98 psc", "双鱼座 99": "99 psc", "双鱼座 100": "100 psc", "双鱼座 101": "101 psc", "双鱼座 102": "102 psc", "双鱼座 103": "103 psc", "双鱼座 104": "104 psc", "双鱼座 105": "105 psc", "双鱼座 106": "106 psc", "鲸鱼座 51": "51 cet", "双鱼座 107": "107 psc", "白羊座 2": "2 ari", "双鱼座 109": "109 psc", "双鱼座 110": "110 psc", "双鱼座 111": "111 psc", "双鱼座 112": "112 psc", "双鱼座 113": "113 psc", "南鱼座 α": "alf psa", "南鱼座 β": "bet psa", "南鱼座 γ": "gam psa", "南鱼座 δ": "del psa", "南鱼座 ε": "eps psa", "南鱼座 ζ": "zet psa", "南鱼座 η": "eta psa", "南鱼座 θ": "tet psa", "南鱼座 ι": "iot psa", "南鱼座 λ": "lam psa", "南鱼座 μ": "mu. psa", "南鱼座 π": "pi. psa", "南鱼座 τ": "tau psa", "南鱼座 υ": "ups psa", "南鱼座 1": "1 psa", "南鱼座 2": "2 psa", "南鱼座 3": "3 psa", "南鱼座 4": "4 psa", "南鱼座 5": "5 psa", "南鱼座 6": "6 psa", "南鱼座 7": "7 psa", "南鱼座 8": "8 psa", "南鱼座 9": "9 psa", "南鱼座 10": "10 psa", "南鱼座 11": "11 psa", "南鱼座 12": "12 psa", "南鱼座 13": "13 psa", "南鱼座 14": "14 psa", "南鱼座 15": "15 psa", "南鱼座 16": "16 psa", "南鱼座 17": "17 psa", "南鱼座 18": "18 psa", "南鱼座 19": "19 psa", "南鱼座 20": "20 psa", "南鱼座 21": "21 psa", "南鱼座 22": "22 psa", "南鱼座 23": "23 psa", "南鱼座 24": "24 psa", "宝瓶座 79": "79 aqr", "船尾座 ζ": "zet pup", "船尾座 ν": "nu. pup", "船尾座 ξ": "ksi pup", "船尾座 ο": "omi pup", "船尾座 π": "pi. pup", "船尾座 ρ": "rho pup", "船尾座 σ": "sig pup", "船尾座 τ": "tau pup", "船尾座 χ": "chi pup", "船尾座 a": "a pup", "船尾座 b": "b pup", "船尾座 c": "c pup", "船尾座 d1": "d1 pup", "船尾座 d2": "d2 pup", "船尾座 d3": "d3 pup", "船尾座 d4": "d4 pup", "船尾座 e": "e pup", "船尾座 f": "f pup", "船尾座 h1": "h1 pup", "船尾座 h2": "h2 pup", "船尾座 j": "j pup", "船尾座 k": "k pup", "船尾座 l": "l pup", "船尾座 m": "m pup", "船尾座 n": "n pup", "船尾座 p": "p pup", "船尾座 q": "q pup", "船尾座 r": "r pup", "船尾座 t": "t pup", "船尾座 v1": "v1 pup", "船尾座 v2": "v2 pup", "船尾座 w": "w pup", "船尾座 x": "x pup", "船尾座 y": "y pup", "船尾座 y1": "y1 pup", "船尾座 y2": "y2 pup", "船尾座 y3": "y3 pup", "船尾座 z": "z pup", "船尾座 A": "a pup", "船尾座 C": "c pup", "船尾座 D": "d pup", "船尾座 E": "e pup", "船尾座 F": "f pup", "船尾座 G": "g pup", "船尾座 H": "h pup", "船尾座 I": "i pup", "船尾座 J": "j pup", "船尾座 L1": "l1 pup", "船尾座 L2": "l2 pup", "船尾座 M": "m pup", "船尾座 N": "n pup", "船尾座 O": "o pup", "船尾座 P": "p pup", "船尾座 Q": "q pup", "船尾座 1": "1 pup", "船尾座 2": "2 pup", "船尾座 3": "3 pup", "船尾座 4": "4 pup", "船尾座 5": "5 pup", "船尾座 6": "6 pup", "船尾座 7": "7 pup", "船尾座 8": "8 pup", "船尾座 9": "9 pup", "船尾座 10": "10 pup", "船尾座 11": "11 pup", "船尾座 12": "12 pup", "船尾座 13": "13 pup", "船尾座 14": "14 pup", "船尾座 15": "15 pup", "船尾座 16": "16 pup", "船尾座 18": "18 pup", "船尾座 19": "19 pup", "船尾座 20": "20 pup", "船尾座 21": "21 pup", "船尾座 22": "22 pup", "船尾座 59": "59 pup", "船尾座 61": "61 pup", "船尾座 70": "70 pup", "船尾座 71": "71 pup", "船尾座 72": "72 pup", "船尾座 138": "138 pup", "船尾座 140": "140 pup", "船尾座 142": "142 pup", "船尾座 171": "171 pup", "船尾座 188": "188 pup", "船尾座 212": "212 pup", "罗盘座 α": "alf pyx", "罗盘座 β": "bet pyx", "罗盘座 γ": "gam pyx", "罗盘座 δ": "del pyx", "罗盘座 ε": "eps pyx", "罗盘座 ζ": "zet pyx", "罗盘座 η": "eta pyx", "罗盘座 θ": "tet pyx", "罗盘座 κ": "kap pyx", "罗盘座 λ": "lam pyx", "网罟座 α": "alf ret", "网罟座 β": "bet ret", "网罟座 γ": "gam ret", "网罟座 δ": "del ret", "网罟座 ε": "eps ret", "网罟座 ζ1": "zet1 ret", "网罟座 ζ2": "zet2 ret", "网罟座 η": "eta ret", "网罟座 θ": "tet ret", "网罟座 ι": "iot ret", "网罟座 κ": "kap ret", "天箭座 α": "alf sge", "天箭座 β": "bet sge", "天箭座 γ": "gam sge", "天箭座 δ": "del sge", "天箭座 ε": "eps sge", "天箭座 ζ": "zet sge", "天箭座 η": "eta sge", "天箭座 θ": "tet sge", "天箭座 1": "1 sge", "天箭座 2": "2 sge", "天箭座 3": "3 sge", "天箭座 4": "4 sge", "天箭座 5": "5 sge", "天箭座 6": "6 sge", "天箭座 7": "7 sge", "天箭座 8": "8 sge", "天箭座 9": "9 sge", "天箭座 10": "10 sge", "天箭座 11": "11 sge", "天箭座 12": "12 sge", "天箭座 13": "13 sge", "天箭座 14": "14 sge", "天箭座 15": "15 sge", "天箭座 16": "16 sge", "天箭座 17": "17 sge", "天箭座 18": "18 sge", "人马座 α": "alf sgr", "人马座 β1": "bet1 sgr", "人马座 β2": "bet2 sgr", "人马座 γ": "gam sgr", "人马座 γ1": "gam1 sgr", "人马座 γ2": "gam2 sgr", "人马座 δ": "del sgr", "人马座 ε": "eps sgr", "人马座 ζ": "zet sgr", "人马座 η": "eta sgr", "人马座 θ1": "tet1 sgr", "人马座 θ2": "tet2 sgr", "人马座 ι": "iot sgr", "人马座 κ1": "kap1 sgr", "人马座 κ2": "kap2 sgr", "人马座 λ": "lam sgr", "人马座 μ": "mu. sgr", "人马座 ν1": "nu.1 sgr", "人马座 ν2": "nu.2 sgr", "人马座 ξ1": "ksi1 sgr", "人马座 ξ2": "ksi2 sgr", "人马座 ο": "omi sgr", "人马座 π": "pi. sgr", "人马座 ρ1": "rho1 sgr", "人马座 ρ2": "rho2 sgr", "人马座 σ": "sig sgr", "人马座 τ": "tau sgr", "人马座 υ": "ups sgr", "人马座 φ": "phi sgr", "人马座 χ1": "chi1 sgr", "人马座 χ2": "chi2 sgr", "人马座 χ3": "chi3 sgr", "人马座 ψ": "psi sgr", "人马座 ω": "ome sgr", "人马座 b": "b sgr", "人马座 c": "c sgr", "人马座 d": "d sgr", "人马座 e1": "e1 sgr", "人马座 e2": "e2 sgr", "人马座 f": "f sgr", "人马座 g": "g sgr", "人马座 h1": "h1 sgr", "人马座 h2": "h2 sgr", "人马座 A": "a sgr", "人马座 1": "1 sgr", "人马座 2": "2 sgr", "人马座 3": "3 sgr", "人马座 4": "4 sgr", "人马座 5": "5 sgr", "人马座 6": "6 sgr", "人马座 7": "7 sgr", "人马座 9": "9 sgr", "人马座 10": "10 sgr", "人马座 11": "11 sgr", "人马座 12": "12 sgr", "人马座 13": "13 sgr", "人马座 14": "14 sgr", "人马座 15": "15 sgr", "人马座 16": "16 sgr", "人马座 17": "17 sgr", "人马座 18": "18 sgr", "人马座 19": "19 sgr", "人马座 20": "20 sgr", "人马座 21": "21 sgr", "人马座 22": "22 sgr", "人马座 23": "23 sgr", "人马座 24": "24 sgr", "人马座 25": "25 sgr", "人马座 26": "26 sgr", "人马座 27": "27 sgr", "人马座 28": "28 sgr", "人马座 29": "29 sgr", "人马座 30": "30 sgr", "人马座 31": "31 sgr", "人马座 32": "32 sgr", "人马座 33": "33 sgr", "人马座 34": "34 sgr", "人马座 35": "35 sgr", "人马座 36": "36 sgr", "人马座 37": "37 sgr", "人马座 38": "38 sgr", "人马座 39": "39 sgr", "人马座 40": "40 sgr", "人马座 41": "41 sgr", "人马座 42": "42 sgr", "人马座 43": "43 sgr", "人马座 44": "44 sgr", "人马座 45": "45 sgr", "人马座 46": "46 sgr", "人马座 47": "47 sgr", "人马座 48": "48 sgr", "人马座 49": "49 sgr", "人马座 50": "50 sgr", "人马座 51": "51 sgr", "人马座 52": "52 sgr", "人马座 53": "53 sgr", "人马座 54": "54 sgr", "人马座 55": "55 sgr", "人马座 56": "56 sgr", "人马座 57": "57 sgr", "人马座 58": "58 sgr", "人马座 59": "59 sgr", "人马座 60": "60 sgr", "人马座 61": "61 sgr", "人马座 62": "62 sgr", "人马座 63": "63 sgr", "人马座 64": "64 sgr", "人马座 65": "65 sgr", "人马座 70": "70 sgr", "天蝎座 α": "alf sco", "天蝎座 β1": "bet1 sco", "天蝎座 β2": "bet2 sco", "天蝎座 δ": "del sco", "天蝎座 ε": "eps sco", "天蝎座 ζ1": "zet1 sco", "天蝎座 ζ2": "zet2 sco", "天蝎座 η": "eta sco", "天蝎座 θ": "tet sco", "天蝎座 ι1": "iot1 sco", "天蝎座 ι2": "iot2 sco", "天蝎座 κ": "kap sco", "天蝎座 λ": "lam sco", "天蝎座 μ1": "mu.1 sco", "天蝎座 μ2": "mu.2 sco", "天蝎座 ν": "nu. sco", "天蝎座 ξ": "ksi sco", "天蝎座 ο": "omi sco", "天蝎座 π": "pi. sco", "天蝎座 ρ": "rho sco", "天蝎座 σ": "sig sco", "天蝎座 τ": "tau sco", "天蝎座 υ": "ups sco", "天蝎座 χ": "chi sco", "天蝎座 ψ": "psi sco", "天蝎座 ω1": "ome1 sco", "天蝎座 ω2": "ome2 sco", "天蝎座 b": "b sco", "天蝎座 c1": "c1 sco", "天蝎座 c2": "c2 sco", "天蝎座 d": "d sco", "天蝎座 i": "i sco", "天蝎座 k": "k sco", "天蝎座 A": "a sco", "天蝎座 G": "g sco", "天蝎座 H": "h sco", "天蝎座 N": "n sco", "天蝎座 Q": "q sco", "天蝎座 1": "1 sco", "天蝎座 2": "2 sco", "天蝎座 3": "3 sco", "天蝎座 4": "4 sco", "天蝎座 5": "5 sco", "天蝎座 6": "6 sco", "天蝎座 7": "7 sco", "天蝎座 8": "8 sco", "天蝎座 9": "9 sco", "天蝎座 10": "10 sco", "天蝎座 11": "11 sco", "天蝎座 12": "12 sco", "天蝎座 13": "13 sco", "天蝎座 14": "14 sco", "天蝎座 15": "15 sco", "天蝎座 16": "16 sco", "天蝎座 17": "17 sco", "天蝎座 18": "18 sco", "天蝎座 19": "19 sco", "天蝎座 20": "20 sco", "天蝎座 21": "21 sco", "天蝎座 22": "22 sco", "天蝎座 23": "23 sco", "天蝎座 24": "24 sco", "天蝎座 25": "25 sco", "天蝎座 26": "26 sco", "天蝎座 27": "27 sco", "天蝎座 28": "28 sco", "天蝎座 29": "29 sco", "天蝎座 30": "30 sco", "天蝎座 31": "31 sco", "天蝎座 32": "32 sco", "天蝎座 33": "33 sco", "天蝎座 34": "34 sco", "天蝎座 35": "35 sco", "玉夫座 α": "alf scl", "玉夫座 β": "bet scl", "玉夫座 γ": "gam scl", "玉夫座 δ": "del scl", "玉夫座 ε": "eps scl", "玉夫座 ζ": "zet scl", "玉夫座 η": "eta scl", "玉夫座 θ": "tet scl", "玉夫座 ι": "iot scl", "玉夫座 κ1": "kap1 scl", "玉夫座 κ2": "kap2 scl", "玉夫座 λ1": "lam1 scl", "玉夫座 λ2": "lam2 scl", "玉夫座 μ": "mu. scl", "玉夫座 ξ": "ksi scl", "玉夫座 π": "pi. scl", "玉夫座 σ": "sig scl", "玉夫座 τ": "tau scl", "盾牌座 α": "alf sct", "天鹰座 1": "1 aql", "盾牌座 β": "bet sct", "天鹰座 6": "6 aql", "盾牌座 γ": "gam sct", "盾牌座 δ": "del sct", "天鹰座 2": "2 aql", "盾牌座 ε": "eps sct", "天鹰座 3": "3 aql", "盾牌座 ζ": "zet sct", "盾牌座 η": "eta sct", "天鹰座 9": "9 aql", "巨蛇座 α": "alf ser", "巨蛇座 β": "bet ser", "巨蛇座 γ": "gam ser", "巨蛇座 δ": "del ser", "巨蛇座 ε": "eps ser", "巨蛇座 ζ": "zet ser", "巨蛇座 η": "eta ser", "巨蛇座 θ1": "tet1 ser", "巨蛇座 θ2": "tet2 ser", "巨蛇座 ι": "iot ser", "巨蛇座 κ": "kap ser", "巨蛇座 λ": "lam ser", "巨蛇座 μ": "mu. ser", "巨蛇座 ν": "nu. ser", "巨蛇座 ξ": "ksi ser", "巨蛇座 ο": "omi ser", "巨蛇座 π": "pi. ser", "巨蛇座 ρ": "rho ser", "巨蛇座 σ": "sig ser", "巨蛇座 τ1": "tau1 ser", "巨蛇座 τ2": "tau2 ser", "巨蛇座 τ3": "tau3 ser", "巨蛇座 τ4": "tau4 ser", "巨蛇座 τ5": "tau5 ser", "巨蛇座 τ6": "tau6 ser", "巨蛇座 τ7": "tau7 ser", "巨蛇座 τ8": "tau8 ser", "巨蛇座 υ": "ups ser", "巨蛇座 φ": "phi ser", "巨蛇座 χ": "chi ser", "巨蛇座 ψ": "psi ser", "巨蛇座 ω": "ome ser", "巨蛇座 b": "b ser", "巨蛇座 c": "c ser", "巨蛇座 d": "d ser", "巨蛇座 e": "e ser", "巨蛇座 A1": "a1 ser", "巨蛇座 A2": "a2 ser", "巨蛇座 1": "1 ser", "巨蛇座 2": "2 ser", "巨蛇座 3": "3 ser", "巨蛇座 4": "4 ser", "巨蛇座 5": "5 ser", "巨蛇座 6": "6 ser", "巨蛇座 7": "7 ser", "巨蛇座 8": "8 ser", "巨蛇座 9": "9 ser", "巨蛇座 10": "10 ser", "巨蛇座 11": "11 ser", "巨蛇座 12": "12 ser", "巨蛇座 13": "13 ser", "巨蛇座 14": "14 ser", "巨蛇座 15": "15 ser", "巨蛇座 16": "16 ser", "巨蛇座 17": "17 ser", "巨蛇座 18": "18 ser", "巨蛇座 19": "19 ser", "巨蛇座 20": "20 ser", "巨蛇座 21": "21 ser", "巨蛇座 22": "22 ser", "巨蛇座 23": "23 ser", "巨蛇座 24": "24 ser", "巨蛇座 25": "25 ser", "巨蛇座 26": "26 ser", "巨蛇座 27": "27 ser", "巨蛇座 28": "28 ser", "巨蛇座 29": "29 ser", "巨蛇座 30": "30 ser", "巨蛇座 31": "31 ser", "巨蛇座 32": "32 ser", "巨蛇座 34": "34 ser", "巨蛇座 35": "35 ser", "巨蛇座 36": "36 ser", "巨蛇座 37": "37 ser", "巨蛇座 38": "38 ser", "巨蛇座 39": "39 ser", "巨蛇座 40": "40 ser", "巨蛇座 41": "41 ser", "巨蛇座 43": "43 ser", "巨蛇座 44": "44 ser", "巨蛇座 45": "45 ser", "巨蛇座 46": "46 ser", "巨蛇座 47": "47 ser", "巨蛇座 48": "48 ser", "巨蛇座 49": "49 ser", "巨蛇座 50": "50 ser", "巨蛇座 51": "51 ser", "巨蛇座 53": "53 ser", "巨蛇座 55": "55 ser", "巨蛇座 56": "56 ser", "巨蛇座 57": "57 ser", "巨蛇座 58": "58 ser", "巨蛇座 59": "59 ser", "巨蛇座 60": "60 ser", "巨蛇座 61": "61 ser", "巨蛇座 62": "62 ser", "巨蛇座 63": "63 ser", "巨蛇座 64": "64 ser", "六分仪座 α": "alf sex", "六分仪座 β": "bet sex", "六分仪座 γ": "gam sex", "六分仪座 δ": "del sex", "六分仪座 ε": "eps sex", "六分仪座 1": "1 sex", "六分仪座 2": "2 sex", "六分仪座 3": "3 sex", "六分仪座 4": "4 sex", "六分仪座 5": "5 sex", "六分仪座 6": "6 sex", "六分仪座 7": "7 sex", "六分仪座 8": "8 sex", "六分仪座 9": "9 sex", "六分仪座 10": "10 sex", "六分仪座 11": "11 sex", "六分仪座 12": "12 sex", "六分仪座 13": "13 sex", "六分仪座 14": "14 sex", "六分仪座 15": "15 sex", "六分仪座 16": "16 sex", "六分仪座 17": "17 sex", "六分仪座 18": "18 sex", "六分仪座 19": "19 sex", "六分仪座 20": "20 sex", "六分仪座 21": "21 sex", "六分仪座 22": "22 sex", "六分仪座 23": "23 sex", "六分仪座 24": "24 sex", "六分仪座 25": "25 sex", "六分仪座 26": "26 sex", "六分仪座 27": "27 sex", "六分仪座 29": "29 sex", "六分仪座 30": "30 sex", "六分仪座 31": "31 sex", "六分仪座 32": "32 sex", "六分仪座 33": "33 sex", "六分仪座 34": "34 sex", "六分仪座 35": "35 sex", "六分仪座 36": "36 sex", "六分仪座 37": "37 sex", "六分仪座 38": "38 sex", "六分仪座 39": "39 sex", "六分仪座 40": "40 sex", "六分仪座 41": "41 sex", "金牛座 α": "alf tau", "金牛座 β": "bet tau", "金牛座 γ": "gam tau", "金牛座 δ1": "del1 tau", "金牛座 δ2": "del2 tau", "金牛座 δ3": "del3 tau", "金牛座 ε": "eps tau", "金牛座 ζ": "zet tau", "金牛座 η": "eta tau", "金牛座 θ1": "tet1 tau", "金牛座 θ2": "tet2 tau", "金牛座 ι": "iot tau", "金牛座 κ1": "kap1 tau", "金牛座 κ2": "kap2 tau", "金牛座 λ": "lam tau", "金牛座 μ": "mu. tau", "金牛座 ν": "nu. tau", "金牛座 ξ": "ksi tau", "金牛座 ο": "omi tau", "金牛座 π": "pi. tau", "金牛座 ρ": "rho tau", "金牛座 σ1": "sig1 tau", "金牛座 σ2": "sig2 tau", "金牛座 τ": "tau tau", "金牛座 υ": "ups tau", "金牛座 φ": "phi tau", "金牛座 χ": "chi tau", "金牛座 ψ": "psi tau", "金牛座 ω": "ome tau", "金牛座 ω1": "ome1 tau", "金牛座 ω2": "ome2 tau", "金牛座 b": "b tau", "金牛座 c": "c tau", "金牛座 d": "d tau", "金牛座 e": "e tau", "金牛座 f": "f tau", "金牛座 g": "g tau", "金牛座 h": "h tau", "金牛座 i": "i tau", "金牛座 k": "k tau", "金牛座 l": "l tau", "金牛座 m": "m tau", "金牛座 n": "n tau", "金牛座 o": "o tau", "金牛座 p": "p tau", "金牛座 q": "q tau", "金牛座 r": "r tau", "金牛座 s": "s tau", "金牛座 t": "t tau", "金牛座 u": "u tau", "金牛座 A1": "a1 tau", "金牛座 A2": "a2 tau", "金牛座 1": "1 tau", "金牛座 2": "2 tau", "金牛座 4": "4 tau", "金牛座 5": "5 tau", "金牛座 6": "6 tau", "金牛座 7": "7 tau", "金牛座 9": "9 tau", "金牛座 10": "10 tau", "金牛座 11": "11 tau", "金牛座 12": "12 tau", "金牛座 13": "13 tau", "金牛座 14": "14 tau", "金牛座 16": "16 tau", "金牛座 17": "17 tau", "金牛座 18": "18 tau", "金牛座 19": "19 tau", "金牛座 20": "20 tau", "金牛座 21": "21 tau", "金牛座 22": "22 tau", "金牛座 23": "23 tau", "金牛座 25": "25 tau", "金牛座 26": "26 tau", "金牛座 27": "27 tau", "金牛座 28": "28 tau", "金牛座 29": "29 tau", "金牛座 30": "30 tau", "金牛座 31": "31 tau", "金牛座 32": "32 tau", "金牛座 33": "33 tau", "金牛座 35": "35 tau", "金牛座 36": "36 tau", "金牛座 37": "37 tau", "金牛座 38": "38 tau", "金牛座 39": "39 tau", "金牛座 40": "40 tau", "金牛座 41": "41 tau", "金牛座 42": "42 tau", "金牛座 43": "43 tau", "金牛座 44": "44 tau", "金牛座 45": "45 tau", "金牛座 46": "46 tau", "金牛座 47": "47 tau", "金牛座 48": "48 tau", "金牛座 49": "49 tau", "金牛座 50": "50 tau", "金牛座 51": "51 tau", "金牛座 52": "52 tau", "金牛座 53": "53 tau", "金牛座 54": "54 tau", "金牛座 55": "55 tau", "金牛座 56": "56 tau", "金牛座 57": "57 tau", "金牛座 58": "58 tau", "金牛座 59": "59 tau", "金牛座 60": "60 tau", "金牛座 61": "61 tau", "金牛座 62": "62 tau", "金牛座 63": "63 tau", "金牛座 64": "64 tau", "金牛座 65": "65 tau", "金牛座 66": "66 tau", "金牛座 67": "67 tau", "金牛座 68": "68 tau", "金牛座 69": "69 tau", "金牛座 70": "70 tau", "金牛座 71": "71 tau", "金牛座 72": "72 tau", "金牛座 73": "73 tau", "金牛座 74": "74 tau", "金牛座 75": "75 tau", "金牛座 76": "76 tau", "金牛座 77": "77 tau", "金牛座 78": "78 tau", "金牛座 79": "79 tau", "金牛座 80": "80 tau", "金牛座 81": "81 tau", "金牛座 83": "83 tau", "金牛座 84": "84 tau", "金牛座 85": "85 tau", "金牛座 86": "86 tau", "金牛座 87": "87 tau", "金牛座 88": "88 tau", "金牛座 89": "89 tau", "金牛座 90": "90 tau", "金牛座 91": "91 tau", "金牛座 92": "92 tau", "金牛座 93": "93 tau", "金牛座 94": "94 tau", "金牛座 95": "95 tau", "金牛座 96": "96 tau", "金牛座 97": "97 tau", "金牛座 98": "98 tau", "金牛座 99": "99 tau", "金牛座 101": "101 tau", "金牛座 102": "102 tau", "金牛座 103": "103 tau", "金牛座 104": "104 tau", "金牛座 105": "105 tau", "金牛座 106": "106 tau", "金牛座 107": "107 tau", "金牛座 108": "108 tau", "金牛座 109": "109 tau", "金牛座 110": "110 tau", "金牛座 111": "111 tau", "金牛座 112": "112 tau", "御夫座 γ": "gam aur", "御夫座 23": "23 aur", "金牛座 113": "113 tau", "金牛座 114": "114 tau", "金牛座 115": "115 tau", "金牛座 116": "116 tau", "金牛座 117": "117 tau", "金牛座 118": "118 tau", "金牛座 119": "119 tau", "金牛座 120": "120 tau", "金牛座 121": "121 tau", "金牛座 122": "122 tau", "金牛座 123": "123 tau", "金牛座 125": "125 tau", "金牛座 126": "126 tau", "金牛座 127": "127 tau", "金牛座 128": "128 tau", "金牛座 129": "129 tau", "金牛座 130": "130 tau", "金牛座 131": "131 tau", "金牛座 132": "132 tau", "金牛座 133": "133 tau", "金牛座 134": "134 tau", "金牛座 135": "135 tau", "金牛座 136": "136 tau", "金牛座 137": "137 tau", "金牛座 139": "139 tau", "金牛座 140": "140 tau", "金牛座 141": "141 tau", "望远镜座 α": "alf tel", "望远镜座 δ1": "del1 tel", "望远镜座 δ2": "del2 tel", "望远镜座 ε": "eps tel", "望远镜座 ζ": "zet tel", "望远镜座 η": "eta tel", "望远镜座 ι": "iot tel", "望远镜座 κ": "kap tel", "望远镜座 λ": "lam tel", "望远镜座 μ": "mu. tel", "望远镜座 ν": "nu. tel", "望远镜座 ξ": "ksi tel", "望远镜座 ρ": "rho tel", "三角座 α": "alf tri", "三角座 β": "bet tri", "三角座 γ": "gam tri", "三角座 δ": "del tri", "三角座 ε": "eps tri", "三角座 ι": "iot tri", "三角座 1": "1 tri", "三角座 2": "2 tri", "三角座 3": "3 tri", "三角座 4": "4 tri", "三角座 5": "5 tri", "三角座 6": "6 tri", "三角座 7": "7 tri", "三角座 8": "8 tri", "三角座 9": "9 tri", "三角座 10": "10 tri", "三角座 11": "11 tri", "三角座 12": "12 tri", "三角座 13": "13 tri", "三角座 14": "14 tri", "三角座 15": "15 tri", "三角座 16": "16 tri", "南三角座 α": "alf tra", "南三角座 β": "bet tra", "南三角座 γ": "gam tra", "南三角座 δ": "del tra", "南三角座 ε": "eps tra", "南三角座 ζ": "zet tra", "南三角座 η1": "eta1 tra", "南三角座 θ": "tet tra", "南三角座 ι": "iot tra", "南三角座 κ": "kap tra", "杜鹃座 α": "alf tuc", "杜鹃座 β1": "bet1 tuc", "杜鹃座 β2": "bet2 tuc", "杜鹃座 γ": "gam tuc", "杜鹃座 δ": "del tuc", "杜鹃座 ε": "eps tuc", "杜鹃座 ζ": "zet tuc", "杜鹃座 η": "eta tuc", "杜鹃座 θ": "tet tuc", "杜鹃座 ι": "iot tuc", "杜鹃座 κ": "kap tuc", "杜鹃座 λ": "lam tuc", "杜鹃座 λ1": "lam1 tuc", "杜鹃座 λ2": "lam2 tuc", "杜鹃座 ν": "nu. tuc", "杜鹃座 π": "pi. tuc", "杜鹃座 ρ": "rho tuc", "大熊座 α": "alf uma", "大熊座 β": "bet uma", "大熊座 γ": "gam uma", "大熊座 δ": "del uma", "大熊座 ε": "eps uma", "大熊座 ζ": "zet uma", "大熊座 η": "eta uma", "大熊座 θ": "tet uma", "大熊座 ι": "iot uma", "大熊座 κ": "kap uma", "大熊座 λ": "lam uma", "大熊座 μ": "mu. uma", "大熊座 ν": "nu. uma", "大熊座 ξ": "ksi uma", "大熊座 ο": "omi uma", "大熊座 π1": "pi.1 uma", "大熊座 π2": "pi.2 uma", "大熊座 ρ": "rho uma", "大熊座 σ1": "sig1 uma", "大熊座 σ2": "sig2 uma", "大熊座 τ": "tau uma", "大熊座 υ": "ups uma", "大熊座 φ": "phi uma", "大熊座 χ": "chi uma", "大熊座 ψ": "psi uma", "大熊座 ω": "ome uma", "大熊座 b": "b uma", "大熊座 c": "c uma", "大熊座 d": "d uma", "大熊座 e": "e uma", "大熊座 f": "f uma", "大熊座 g": "g uma", "大熊座 h": "h uma", "大熊座 A": "a uma", "大熊座 1": "1 uma", "大熊座 2": "2 uma", "大熊座 3": "3 uma", "大熊座 4": "4 uma", "大熊座 5": "5 uma", "大熊座 6": "6 uma", "大熊座 8": "8 uma", "大熊座 9": "9 uma", "大熊座 10": "10 uma", "大熊座 11": "11 uma", "大熊座 12": "12 uma", "大熊座 13": "13 uma", "大熊座 14": "14 uma", "大熊座 15": "15 uma", "大熊座 16": "16 uma", "大熊座 17": "17 uma", "大熊座 18": "18 uma", "大熊座 19": "19 uma", "大熊座 20": "20 uma", "大熊座 21": "21 uma", "大熊座 22": "22 uma", "大熊座 23": "23 uma", "大熊座 24": "24 uma", "大熊座 25": "25 uma", "大熊座 26": "26 uma", "大熊座 27": "27 uma", "大熊座 28": "28 uma", "大熊座 29": "29 uma", "大熊座 30": "30 uma", "大熊座 31": "31 uma", "大熊座 32": "32 uma", "大熊座 33": "33 uma", "大熊座 35": "35 uma", "大熊座 34": "34 uma", "大熊座 36": "36 uma", "大熊座 37": "37 uma", "大熊座 38": "38 uma", "大熊座 39": "39 uma", "大熊座 40": "40 uma", "大熊座 41": "41 uma", "大熊座 42": "42 uma", "大熊座 43": "43 uma", "大熊座 44": "44 uma", "大熊座 45": "45 uma", "大熊座 46": "46 uma", "大熊座 47": "47 uma", "大熊座 48": "48 uma", "大熊座 49": "49 uma", "大熊座 50": "50 uma", "大熊座 51": "51 uma", "大熊座 52": "52 uma", "大熊座 53": "53 uma", "大熊座 54": "54 uma", "大熊座 55": "55 uma", "大熊座 56": "56 uma", "大熊座 57": "57 uma", "大熊座 58": "58 uma", "大熊座 59": "59 uma", "大熊座 60": "60 uma", "大熊座 61": "61 uma", "大熊座 62": "62 uma", "大熊座 63": "63 uma", "大熊座 64": "64 uma", "大熊座 65": "65 uma", "大熊座 66": "66 uma", "大熊座 67": "67 uma", "大熊座 68": "68 uma", "大熊座 69": "69 uma", "大熊座 70": "70 uma", "大熊座 71": "71 uma", "大熊座 72": "72 uma", "大熊座 73": "73 uma", "大熊座 74": "74 uma", "大熊座 75": "75 uma", "大熊座 76": "76 uma", "大熊座 77": "77 uma", "大熊座 78": "78 uma", "大熊座 79": "79 uma", "大熊座 80": "80 uma", "大熊座 81": "81 uma", "大熊座 82": "82 uma", "大熊座 83": "83 uma", "大熊座 84": "84 uma", "大熊座 85": "85 uma", "大熊座 86": "86 uma", "大熊座 87": "87 uma", "小熊座 α": "alf umi", "小熊座 β": "bet umi", "小熊座 γ": "gam umi", "小熊座 δ": "del umi", "小熊座 ε": "eps umi", "小熊座 ζ": "zet umi", "小熊座 η": "eta umi", "小熊座 θ": "tet umi", "小熊座 λ": "lam umi", "小熊座 π1": "pi.1 umi", "小熊座 π2": "pi.2 umi", "小熊座 1": "1 umi", "小熊座 2": "2 umi", "小熊座 3": "3 umi", "小熊座 4": "4 umi", "小熊座 5": "5 umi", "小熊座 6": "6 umi", "小熊座 7": "7 umi", "小熊座 8": "8 umi", "小熊座 9": "9 umi", "小熊座 10": "10 umi", "小熊座 11": "11 umi", "小熊座 12": "12 umi", "小熊座 13": "13 umi", "小熊座 14": "14 umi", "小熊座 15": "15 umi", "小熊座 16": "16 umi", "小熊座 17": "17 umi", "小熊座 18": "18 umi", "小熊座 19": "19 umi", "小熊座 20": "20 umi", "小熊座 21": "21 umi", "小熊座 22": "22 umi", "小熊座 23": "23 umi", "小熊座 24": "24 umi", "船帆座 γ": "gam vel", "船帆座 γ2": "gam2 vel", "船帆座 δ": "del vel", "船帆座 κ": "kap vel", "船帆座 λ": "lam vel", "船帆座 μ": "mu. vel", "船帆座 ο": "omi vel", "船帆座 φ": "phi vel", "船帆座 ψ": "psi vel", "船帆座 a": "a vel", "船帆座 b": "b vel", "船帆座 c": "c vel", "船帆座 d": "d vel", "船帆座 e": "e vel", "船帆座 f": "f vel", "船帆座 g": "g vel", "船帆座 h": "h vel", "船帆座 i": "i vel", "船帆座 k": "k vel", "船帆座 k1": "k1 vel", "船帆座 l": "l vel", "船帆座 m": "m vel", "船帆座 n": "n vel", "船帆座 p": "p vel", "船帆座 q": "q vel", "船帆座 r": "r vel", "船帆座 s": "s vel", "船帆座 t": "t vel", "船帆座 u": "u vel", "船帆座 w": "w vel", "船帆座 x": "x vel", "船帆座 y": "y vel", "船帆座 z": "z vel", "船帆座 A": "a vel", "船帆座 B": "b vel", "船帆座 C": "c vel", "船帆座 D": "d vel", "船帆座 E": "e vel", "船帆座 F": "f vel", "船帆座 H": "h vel", "船帆座 I": "i vel", "船帆座 J": "j vel", "船帆座 K": "k vel", "船帆座 L": "l vel", "船帆座 M": "m vel", "船帆座 N": "n vel", "船帆座 O": "o vel", "船帆座 Q": "q vel", "船帆座 16": "16 vel", "船帆座 33": "33 vel", "船帆座 47": "47 vel", "船帆座 154": "154 vel", "室女座 α": "alf vir", "室女座 β": "bet vir", "室女座 γ": "gam vir", "室女座 δ": "del vir", "室女座 ε": "eps vir", "室女座 ζ": "zet vir", "室女座 η": "eta vir", "室女座 θ": "tet vir", "室女座 ι": "iot vir", "室女座 κ": "kap vir", "室女座 λ": "lam vir", "室女座 μ": "mu. vir", "室女座 ν": "nu. vir", "室女座 ξ": "ksi vir", "室女座 ο": "omi vir", "室女座 π": "pi. vir", "室女座 ρ": "rho vir", "室女座 σ": "sig vir", "室女座 τ": "tau vir", "室女座 υ": "ups vir", "室女座 φ": "phi vir", "室女座 χ": "chi vir", "室女座 ψ": "psi vir", "室女座 ω": "ome vir", "室女座 b": "b vir", "室女座 c": "c vir", "室女座 d1": "d1 vir", "室女座 d2": "d2 vir", "室女座 e": "e vir", "室女座 f": "f vir", "室女座 g": "g vir", "室女座 h": "h vir", "室女座 i": "i vir", "室女座 k": "k vir", "室女座 l": "l vir", "室女座 m": "m vir", "室女座 o": "o vir", "室女座 p": "p vir", "室女座 q": "q vir", "室女座 y": "y vir", "室女座 A1": "a1 vir", "室女座 A2": "a2 vir", "室女座 M": "m vir", "室女座 1": "1 vir", "室女座 2": "2 vir", "室女座 3": "3 vir", "室女座 4": "4 vir", "室女座 5": "5 vir", "室女座 6": "6 vir", "室女座 7": "7 vir", "室女座 8": "8 vir", "室女座 9": "9 vir", "室女座 10": "10 vir", "室女座 11": "11 vir", "室女座 12": "12 vir", "室女座 13": "13 vir", "室女座 14": "14 vir", "室女座 15": "15 vir", "室女座 16": "16 vir", "室女座 17": "17 vir", "室女座 20": "20 vir", "室女座 21": "21 vir", "室女座 25": "25 vir", "室女座 26": "26 vir", "室女座 27": "27 vir", "室女座 28": "28 vir", "室女座 29": "29 vir", "室女座 30": "30 vir", "室女座 31": "31 vir", "室女座 32": "32 vir", "室女座 33": "33 vir", "室女座 34": "34 vir", "室女座 35": "35 vir", "室女座 36": "36 vir", "室女座 37": "37 vir", "室女座 38": "38 vir", "室女座 40": "40 vir", "室女座 41": "41 vir", "室女座 43": "43 vir", "室女座 44": "44 vir", "室女座 46": "46 vir", "室女座 47": "47 vir", "室女座 48": "48 vir", "室女座 49": "49 vir", "室女座 50": "50 vir", "室女座 51": "51 vir", "室女座 53": "53 vir", "室女座 54": "54 vir", "室女座 55": "55 vir", "室女座 56": "56 vir", "室女座 57": "57 vir", "室女座 58": "58 vir", "室女座 59": "59 vir", "室女座 60": "60 vir", "室女座 61": "61 vir", "室女座 62": "62 vir", "室女座 63": "63 vir", "室女座 64": "64 vir", "室女座 65": "65 vir", "室女座 66": "66 vir", "室女座 67": "67 vir", "室女座 68": "68 vir", "室女座 69": "69 vir", "室女座 70": "70 vir", "室女座 71": "71 vir", "室女座 72": "72 vir", "室女座 73": "73 vir", "室女座 74": "74 vir", "室女座 75": "75 vir", "室女座 76": "76 vir", "室女座 77": "77 vir", "室女座 78": "78 vir", "室女座 79": "79 vir", "室女座 80": "80 vir", "室女座 81": "81 vir", "室女座 82": "82 vir", "室女座 83": "83 vir", "室女座 84": "84 vir", "室女座 85": "85 vir", "室女座 86": "86 vir", "室女座 87": "87 vir", "室女座 88": "88 vir", "室女座 89": "89 vir", "室女座 90": "90 vir", "室女座 92": "92 vir", "室女座 93": "93 vir", "室女座 94": "94 vir", "室女座 95": "95 vir", "室女座 96": "96 vir", "室女座 97": "97 vir", "室女座 98": "98 vir", "室女座 99": "99 vir", "室女座 100": "100 vir", "室女座 101": "101 vir", "室女座 102": "102 vir", "室女座 103": "103 vir", "室女座 104": "104 vir", "室女座 105": "105 vir", "室女座 106": "106 vir", "室女座 107": "107 vir", "室女座 108": "108 vir", "室女座 109": "109 vir", "室女座 110": "110 vir", "室女座 236": "236 vir", "飞鱼座 α": "alf vol", "飞鱼座 β": "bet vol", "飞鱼座 γ1": "gam1 vol", "飞鱼座 γ2": "gam2 vol", "飞鱼座 δ": "del vol", "飞鱼座 ε": "eps vol", "飞鱼座 ζ": "zet vol", "飞鱼座 η": "eta vol", "飞鱼座 θ": "tet vol", "飞鱼座 ι": "iot vol", "飞鱼座 κ1": "kap1 vol", "飞鱼座 κ2": "kap2 vol", "狐狸座 α": "alf vul", "狐狸座 1": "1 vul", "狐狸座 2": "2 vul", "狐狸座 3": "3 vul", "狐狸座 4": "4 vul", "狐狸座 5": "5 vul", "狐狸座 6": "6 vul", "狐狸座 7": "7 vul", "狐狸座 8": "8 vul", "狐狸座 9": "9 vul", "狐狸座 10": "10 vul", "狐狸座 12": "12 vul", "狐狸座 13": "13 vul", "狐狸座 14": "14 vul", "狐狸座 15": "15 vul", "狐狸座 16": "16 vul", "狐狸座 17": "17 vul", "狐狸座 18": "18 vul", "狐狸座 19": "19 vul", "狐狸座 20": "20 vul", "狐狸座 21": "21 vul", "狐狸座 22": "22 vul", "狐狸座 23": "23 vul", "狐狸座 24": "24 vul", "狐狸座 25": "25 vul", "狐狸座 26": "26 vul", "狐狸座 27": "27 vul", "狐狸座 28": "28 vul", "狐狸座 29": "29 vul", "狐狸座 30": "30 vul", "狐狸座 31": "31 vul", "狐狸座 32": "32 vul", "狐狸座 33": "33 vul", "狐狸座 34": "34 vul", "狐狸座 35": "35 vul", } starEN2ZH = dict() # starZH2EN中靠前的星名较常用些 for k, v in reversed(starZH2EN.items()): starEN2ZH[v] = k ================================================ FILE: prototype/core/astro_coord/remote.py ================================================ import re import httpx import asyncio from .data import solar_bodies from async_lru import alru_cache from config import CACHE_SIZE, MAX_CONNECTIONS # 设置最大并发数 limits = httpx.Limits( max_connections=MAX_CONNECTIONS, max_keepalive_connections=MAX_CONNECTIONS, ) @alru_cache(maxsize=CACHE_SIZE) async def get_RaDec_by_name( star_name: str, ) -> tuple[str | None, tuple[float, float] | None]: """ 根据恒星名称获取其赤经和赤纬 Params: starName: 恒星名称 Returns: raDec: J2000赤经(时)和赤纬(角度) """ # 不查询太阳系天体 if star_name in solar_bodies: return (None, None) star_name_base64 = re.sub(r"\s+", "+", star_name) async with httpx.AsyncClient(limits=limits) as client: response = await client.get( f"https://simbad.u-strasbg.fr/simbad/sim-nameresolver?ident={star_name_base64}&output=json&data=J&option=strict" ) if response.status_code != 200: raise ValueError( f"Failed request astrocoord with status code {response.status_code}" ) data = response.json() ra = data[0]["ra"] / 15 dec = data[0]["dec"] return (star_name, (ra, dec)) async def get_RaDecs_by_names( star_names: list[str], ) -> dict[str, tuple[float | None, float | None]]: """ 根据恒星名称数组获取其赤经和赤纬 Params: star_names: 恒星名称列表 Returns: raDecs: 赤经和赤纬字典(角度) """ tasks = [get_RaDec_by_name(starName) for starName in star_names] raDecs_tmp = [] for task in asyncio.as_completed(tasks): try: raDec = await task raDecs_tmp.append(raDec) except ValueError: pass raDecs_tmp = dict(raDecs_tmp) raDecs_dict = dict() for star_name in star_names: raDecs_dict[star_name] = raDecs_tmp.get(star_name, (None, None)) return raDecs_dict ================================================ FILE: prototype/core/astro_coord/stellarium.COPYING ================================================ GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. ================================================ FILE: prototype/core/astro_coord/utils.py ================================================ import astronomy as ast from datetime import datetime def stamp2ast_time(timestamp: float) -> ast.Time: """ Convert the timestamp to astropy time. """ return ast.Time( ( datetime.fromtimestamp(timestamp) - datetime.fromtimestamp(946728000) ).total_seconds() / 86400 ) ================================================ FILE: prototype/core/astrometry/client.py ================================================ #!/usr/bin/env python3 # This file is part of the Astrometry.net suite. # Copyright 2009 Dustin Lang # Licensed under a 3-clause BSD style license - see LICENSE # https://github.com/dstndstn/astrometry.net from __future__ import print_function import os import sys import time import base64 import shutil import logging try: # py3 from urllib.parse import urlencode, quote from urllib.request import urlopen, Request from urllib.error import HTTPError except ImportError: # py2 from urllib import urlencode, quote from urllib2 import urlopen, Request, HTTPError # from exceptions import Exception from email.mime.base import MIMEBase from email.mime.multipart import MIMEMultipart from email.mime.application import MIMEApplication from email.encoders import encode_noop import json logging.basicConfig( level=logging.INFO, format="%(levelname)s - %(message)s", handlers=[logging.StreamHandler(sys.stdout)], ) def json2python(data): try: return json.loads(data) except: pass return None python2json = json.dumps class MalformedResponse(Exception): pass class RequestError(Exception): pass class Client(object): default_url = "https://nova.astrometry.net/api/" def __init__(self, apiurl=default_url): self.session = None self.apiurl = apiurl def get_url(self, service): return self.apiurl + service def send_request(self, service, args={}, file_args=None): """ service: string args: dict """ if self.session is not None: args.update({"session": self.session}) logging.info(f"Python: {args}") json = python2json(args) logging.info(f"Sending json: {json}") url = self.get_url(service) logging.info(f"Sending to URL: {url}") # If we're sending a file, format a multipart/form-data if file_args is not None: import random boundary_key = "".join([random.choice("0123456789") for i in range(19)]) boundary = "===============%s==" % boundary_key headers = {"Content-Type": 'multipart/form-data; boundary="%s"' % boundary} data_pre = ( "--" + boundary + "\n" + "Content-Type: text/plain\r\n" + "MIME-Version: 1.0\r\n" + 'Content-disposition: form-data; name="request-json"\r\n' + "\r\n" + json + "\n" + "--" + boundary + "\n" + "Content-Type: application/octet-stream\r\n" + "MIME-Version: 1.0\r\n" + 'Content-disposition: form-data; name="file"; filename="%s"' % file_args[0] + "\r\n" + "\r\n" ) data_post = "\n" + "--" + boundary + "--\n" data = data_pre.encode() + file_args[1] + data_post.encode() else: # Else send x-www-form-encoded data = {"request-json": json} logging.info(f"Sending form data: {data}") data = urlencode(data) data = data.encode("utf-8") logging.info(f"Sending data: {data}") headers = {} request = Request(url=url, headers=headers, data=data) try: f = urlopen(request) logging.info(f"Got reply HTTP status code: {f.status}") txt = f.read() logging.info(f"Got json: {txt}") result = json2python(txt) logging.info(f"Got result: {result}") stat = result.get("status") logging.info(f"Got status: {stat}") if stat == "error": errstr = result.get("errormessage", "(none)") raise RequestError("server error message: " + errstr) return result except HTTPError as e: logging.info(f"HTTPError {e}") txt = e.read() open("err.html", "wb").write(txt) logging.info("Wrote error text to err.html") def login(self, apikey): args = {"apikey": apikey} result = self.send_request("login", args) sess = result.get("session") logging.info(f"Got session: {sess}") if not sess: raise RequestError("no session in result") self.session = sess def _get_upload_args(self, **kwargs): args = {} for key, default, typ in [ ("allow_commercial_use", "d", str), ("allow_modifications", "d", str), ("publicly_visible", "y", str), ("scale_units", None, str), ("scale_type", None, str), ("scale_lower", None, float), ("scale_upper", None, float), ("scale_est", None, float), ("scale_err", None, float), ("center_ra", None, float), ("center_dec", None, float), ("parity", None, int), ("radius", None, float), ("downsample_factor", None, int), ("positional_error", None, float), ("tweak_order", None, int), ("crpix_center", None, bool), ("invert", None, bool), ("image_width", None, int), ("image_height", None, int), ("x", None, list), ("y", None, list), ("album", None, str), ]: if key in kwargs: val = kwargs.pop(key) val = typ(val) args.update({key: val}) elif default is not None: args.update({key: default}) logging.info(f"Upload args: {args}") return args def url_upload(self, url, **kwargs): args = dict(url=url) args.update(self._get_upload_args(**kwargs)) result = self.send_request("url_upload", args) return result def upload(self, fn=None, **kwargs): args = self._get_upload_args(**kwargs) file_args = None if fn is not None: try: f = open(fn, "rb") file_args = (fn, f.read()) except IOError: logging.info("File %s does not exist" % fn) raise return self.send_request("upload", args, file_args) def submission_images(self, subid): result = self.send_request("submission_images", {"subid": subid}) return result.get("image_ids") def overlay_plot(self, service, outfn, wcsfn, wcsext=0): from astrometry.util import util as anutil wcs = anutil.Tan(wcsfn, wcsext) params = dict( crval1=wcs.crval[0], crval2=wcs.crval[1], crpix1=wcs.crpix[0], crpix2=wcs.crpix[1], cd11=wcs.cd[0], cd12=wcs.cd[1], cd21=wcs.cd[2], cd22=wcs.cd[3], imagew=wcs.imagew, imageh=wcs.imageh, ) result = self.send_request(service, {"wcs": params}) logging.info(f"Result status: {result["status"]}") plotdata = result["plot"] plotdata = base64.b64decode(plotdata) open(outfn, "wb").write(plotdata) logging.info(f"Wrote {outfn}") def sdss_plot(self, outfn, wcsfn, wcsext=0): return self.overlay_plot("sdss_image_for_wcs", outfn, wcsfn, wcsext) def galex_plot(self, outfn, wcsfn, wcsext=0): return self.overlay_plot("galex_image_for_wcs", outfn, wcsfn, wcsext) def myjobs(self): result = self.send_request("myjobs/") return result["jobs"] def job_status(self, job_id, justdict=False): result = self.send_request("jobs/%s" % job_id) if justdict: return result stat = result.get("status") if stat == "success": result = self.send_request("jobs/%s/calibration" % job_id) logging.info(f"Calibration: {result}") result = self.send_request("jobs/%s/tags" % job_id) logging.info(f"Tags: {result}") result = self.send_request("jobs/%s/machine_tags" % job_id) logging.info(f"Machine Tags: {result}") result = self.send_request("jobs/%s/objects_in_field" % job_id) logging.info(f"Objects in field: {result}") result = self.send_request("jobs/%s/annotations" % job_id) logging.info(f"Annotations: {result}") result = self.send_request("jobs/%s/info" % job_id) logging.info(f"Calibration: {result}") return stat def annotate_data(self, job_id): """ :param job_id: id of job :return: return data for annotations """ result = self.send_request("jobs/%s/annotations" % job_id) return result def sub_status(self, sub_id, justdict=False): result = self.send_request("submissions/%s" % sub_id) if justdict: return result return result.get("status") def jobs_by_tag(self, tag, exact): exact_option = "exact=yes" if exact else "" result = self.send_request( "jobs_by_tag?query=%s&%s" % (quote(tag.strip()), exact_option), {}, ) return result class ClientRunnerOptions(object): def __init__(self, **entries): self.server = Client.default_url self.public = "y" self.allow_mod = "d" self.allow_commercial = "d" self.__dict__.update(entries) def __getattr__(self, name): try: return object.__getattr__(self, name) except: return None def run_client(opt): args = {} args["apiurl"] = opt.server c = Client(**args) c.login(opt.apikey) if opt.upload or opt.upload_url or opt.upload_xy: if opt.wcs or opt.kmz or opt.newfits or opt.corr or opt.annotate: opt.wait = True kwargs = dict( allow_commercial_use=opt.allow_commercial, allow_modifications=opt.allow_mod, publicly_visible=opt.public, ) if opt.scale_lower and opt.scale_upper: kwargs.update( scale_lower=opt.scale_lower, scale_upper=opt.scale_upper, scale_type="ul", ) elif opt.scale_est and opt.scale_err: kwargs.update( scale_est=opt.scale_est, scale_err=opt.scale_err, scale_type="ev" ) elif opt.scale_lower or opt.scale_upper: kwargs.update(scale_type="ul") if opt.scale_lower: kwargs.update(scale_lower=opt.scale_lower) if opt.scale_upper: kwargs.update(scale_upper=opt.scale_upper) for key in [ "scale_units", "center_ra", "center_dec", "radius", "downsample_factor", "positional_error", "tweak_order", "crpix_center", "album", ]: if getattr(opt, key) is not None: kwargs[key] = getattr(opt, key) if opt.parity is not None: kwargs.update(parity=int(opt.parity)) if opt.upload: upres = c.upload(opt.upload, **kwargs) if opt.upload_xy: kwargs.update(x=opt.upload_xy[0], y=opt.upload_xy[1]) upres = c.upload(**kwargs) if opt.upload_url: upres = c.url_upload(opt.upload_url, **kwargs) stat = upres["status"] if stat != "success": logging.info(f"Upload failed: status {stat}") logging.info(upres) return "Astrometry提交任务失败:状态" + stat, None opt.sub_id = upres["subid"] if opt.solved_id is None: if opt.sub_id is None: logging.info("Can't --wait without a submission id or job id!") return "Can't --wait without a submission id or job id!", None while True: stat = c.sub_status(opt.sub_id, justdict=True) logging.info(f"Got status: {stat}") jobs = stat.get("jobs", []) if len(jobs): for j in jobs: if j is not None: break if j is not None: logging.info(f"Selecting job id {j}") opt.solved_id = j break time.sleep(1) # 提交完任务后返回job_id return "success", opt.solved_id def get_args(): import optparse parser = optparse.OptionParser() parser.add_option( "--server", dest="server", default=Client.default_url, help="Set server base URL (eg, %default)", ) parser.add_option( "--apikey", "-k", dest="apikey", help="API key for Astrometry.net web service; if not given will check AN_API_KEY environment variable", ) parser.add_option("--upload", "-u", dest="upload", help="Upload a file") parser.add_option( "--upload-xy", dest="upload_xy", help="Upload a list including x,y positions respectively", ) parser.add_option( "--wcs", dest="wcs", help="Download resulting wcs.fits file, saving to given filename; implies --wait if --urlupload or --upload", ) parser.add_option( "--newfits", dest="newfits", help="Download resulting new-image.fits file, saving to given filename; implies --wait if --urlupload or --upload", ) parser.add_option( "--corr", dest="corr", help="Download resulting corr.fits file, saving to given filename; implies --wait if --urlupload or --upload", ) parser.add_option( "--kmz", dest="kmz", help="Download resulting kmz file, saving to given filename; implies --wait if --urlupload or --upload", ) parser.add_option( "--annotate", "-a", dest="annotate", help="store information about annotations in give file, JSON format; implies --wait if --urlupload or --upload", ) parser.add_option( "--urlupload", "-U", dest="upload_url", help="Upload a file at specified url" ) parser.add_option( "--scale-units", dest="scale_units", choices=("arcsecperpix", "arcminwidth", "degwidth", "focalmm"), help='Units for scale estimate ("arcsecperpix", "arcminwidth", "degwidth", or "focalmm")', ) # parser.add_option('--scale-type', dest='scale_type', # choices=('ul', 'ev'), help='Scale bounds: lower/upper or estimate/error') parser.add_option( "--scale-lower", dest="scale_lower", type=float, help="Scale lower-bound" ) parser.add_option( "--scale-upper", dest="scale_upper", type=float, help="Scale upper-bound" ) parser.add_option( "--scale-est", dest="scale_est", type=float, help="Scale estimate" ) parser.add_option( "--scale-err", dest="scale_err", type=float, help='Scale estimate error (in PERCENT), eg "10" if you estimate can be off by 10%', ) parser.add_option("--ra", dest="center_ra", type=float, help="RA center") parser.add_option("--dec", dest="center_dec", type=float, help="Dec center") parser.add_option( "--radius", dest="radius", type=float, help="Search radius around RA,Dec center" ) parser.add_option( "--downsample", dest="downsample_factor", type=int, help="Downsample image by this factor", ) parser.add_option( "--positional_error", dest="positional_error", type=float, help="How many pixels a star may be from where it should be.", ) parser.add_option( "--parity", dest="parity", choices=("0", "1"), help="Parity (flip) of image" ) parser.add_option( "--tweak-order", dest="tweak_order", type=int, help="SIP distortion order (default: 2)", ) parser.add_option( "--crpix-center", dest="crpix_center", action="store_true", default=None, help="Set reference point to center of image?", ) parser.add_option( "--invert", action="store_true", default=None, help="Invert image before detecting sources -- for white-sky, black-stars images", ) parser.add_option("--image-width", type=int, help="Set image width for x,y lists") parser.add_option("--image-height", type=int, help="Set image height for x,y lists") parser.add_option( "--album", type=str, help="Add image to album with given title string" ) parser.add_option( "--sdss", dest="sdss_wcs", nargs=2, help="Plot SDSS image for the given WCS file; write plot to given PNG filename", ) parser.add_option( "--galex", dest="galex_wcs", nargs=2, help="Plot GALEX image for the given WCS file; write plot to given PNG filename", ) parser.add_option( "--jobid", "-i", dest="solved_id", type=int, help="retrieve result for jobId instead of submitting new image", ) parser.add_option( "--substatus", "-s", dest="sub_id", help="Get status of a submission" ) parser.add_option("--jobstatus", "-j", dest="job_id", help="Get status of a job") parser.add_option( "--jobs", "-J", dest="myjobs", action="store_true", help="Get all my jobs" ) parser.add_option( "--jobsbyexacttag", "-T", dest="jobs_by_exact_tag", help="Get a list of jobs associated with a given tag--exact match", ) parser.add_option( "--jobsbytag", "-t", dest="jobs_by_tag", help="Get a list of jobs associated with a given tag", ) parser.add_option( "--private", "-p", dest="public", action="store_const", const="n", default="y", help="Hide this submission from other users", ) parser.add_option( "--allow_mod_sa", "-m", dest="allow_mod", action="store_const", const="sa", default="d", help="Select license to allow derivative works of submission, but only if shared under same conditions of original license", ) parser.add_option( "--no_mod", "-M", dest="allow_mod", action="store_const", const="n", default="d", help="Select license to disallow derivative works of submission", ) parser.add_option( "--no_commercial", "-c", dest="allow_commercial", action="store_const", const="n", default="d", help="Select license to disallow commercial use of submission", ) opt, args = parser.parse_args() if opt.apikey is None: # try the environment opt.apikey = os.environ.get("AN_API_KEY", None) if opt.apikey is None: parser.print_help() logging.info("You must either specify --apikey or set AN_API_KEY") sys.exit(-1) return opt if __name__ == "__main__": logging.info("Running with args %s" % sys.argv) opt = get_args() run_client(opt) ================================================ FILE: prototype/core/astrometry/extract.py ================================================ import numpy as np from PIL import Image import sep_pjw as sep def extract_stars( image: Image.Image, thresh: float = 30, min_area: int = 1, clean: bool = True, clean_param: float = 1.0, ) -> tuple[str, list | None]: """ Extract stars from an image. Args: image (PIL.Image): The image to extract stars from. thresh (float): The threshold for star detection. min_area (int): The minimum area for star detection. clean (bool): Whether to clean the image. clean_param (float): The cleaning Returns: detail: Whether the extraction is successful. positions: The positions of the stars in the image. """ detail = "success" # 转换为灰度图像 image = image.convert("L") # 转换为numpy数组 image_array = np.array(image, dtype=np.float64) # 背景提取 bkg = sep.Background(image_array) image_sub = image_array - bkg # 检测星星 try: objects = sep.extract( image_sub, thresh, minarea=min_area, clean=clean, clean_param=clean_param, ) except Exception as e: return str(e), None # 提取星星位置 positions = np.around( np.array([objects["x"], objects["y"]]), decimals=2, ).T.tolist() assert type(positions) == list return detail, positions ================================================ FILE: prototype/core/astrometry/solve.py ================================================ import httpx import asyncio import numpy as np import sep_pjw as sep from PIL import Image from io import BytesIO import astronomy as ast from astropy.io import fits from ..astro_coord.utils import stamp2ast_time from .client import ClientRunnerOptions, run_client from core.astro_coord.calc import get_HaDec_by_RaDec from ..positioning.locator.utils.math import sph_dist from config import ASTROMETRY_API_KEY, MAX_CONNECTIONS from ..astro_coord.data import solar_bodies, starEN2ZH, solar_body_mags # 设置最大并发数 limits = httpx.Limits( max_connections=MAX_CONNECTIONS, max_keepalive_connections=MAX_CONNECTIONS, ) def flux_in_img(images: list[Image.Image]) -> list[float]: """ Calculate the flux of stars in every images. Args: images: The images to calculate the flux. Returns: fluxs: The flux of stars in every images. """ fluxs = [] for image in images: image = image.convert("L") image = np.array(image, dtype=np.float64) bkg = sep.Background(image) image_sub = image - bkg # 使用一个阈值来检测星星,如果检测不到星星,就降低阈值 thresh = 32 objects = dict() # 用于存储在图上检测到的星星信息 while thresh >= 1: objects = sep.extract( image_sub, thresh, minarea=1, clean=True, clean_param=1.0, ) if len(objects["flux"]) == 0: thresh /= 2 else: break if len(objects["flux"]) == 0: # 实在检测不到星星,就返回0 fluxs.append(0) elif len(objects["flux"]) == 1: fluxs.append(objects["flux"][0]) else: # 如果检测到多个星星,就返回中间的那个 positions = np.array([objects["x"], objects["y"]]).T center = np.array(image.shape) / 2 distances = np.linalg.norm(positions - center, axis=1) fluxs.append(objects["flux"][np.argmin(distances)]) return fluxs def tune_rd( xy2field_rd: dict, timestamp: float, radius: float = 60, max_mag: float = 6 ) -> dict[tuple[float, float], tuple[float, float, str]]: """ Tune the right ascension and declination of the stars. Args: xy2field_rd: The mapping from the positions of the stars to the right ascension and declination. timestamp: The timestamp of the observation. radius: The radius to search for the stars, in arcmins. max_mag: The maximum magnitude of the star. Returns: xy2index_rd_names: The mapping from the positions of the stars to the right ascension, declination and name. """ xy2index_rd_names_mag = dict() # 图上点坐标到赤道坐标、名称和视星等的映射 fixed_xy2field_rd = dict() # 太阳系外要查询的恒星名(查询名: 操作名) solar_stars = SolarStars( timestamp, max_mag ) # 初始化太阳系天体信息,缓存以便于后续查询 # 先从太阳系外天体中找 for xy in xy2field_rd.keys(): ra, dec = xy2field_rd[xy] seperate = "+" if dec > 0 else "" fixed_xy2field_rd[xy] = ( f"{ra.item()}{seperate}{dec.item()}" # 生成供SIMBAD查询的坐标 ) xy2index_rd_names_mag = get_fixed_stars(fixed_xy2field_rd, radius, max_mag) # 在从太阳系天体中找 for xy in xy2field_rd.keys(): ra, dec = xy2field_rd[xy] solar_index_rd, solar_name, solar_mag = solar_stars.get_solar_stars( ra, dec, radius ) if solar_name and solar_mag <= xy2index_rd_names_mag[xy][3]: xy2index_rd_names_mag[xy] = (*solar_index_rd, solar_name, solar_mag) # 删除xy2index_rd_names中的mag信息 xy2index_rd_names_mag = { xy: xy2index_rd_names_mag[xy][:3] for xy in xy2index_rd_names_mag } return xy2index_rd_names_mag class SolarStars: def __init__(self, timestamp: float, max_mag: float): """ Initialize the SolarStars. Args: timestamp: The timestamp of the observation. max_mag: The maximum magnitude of the star. """ # 先获取所有太阳系天体的赤道坐标 time = stamp2ast_time(timestamp) observer = ast.Observer(0, 0, 0) # 无先验信息,随便取个位置 self.all_infos = [] for star_name in solar_bodies: if solar_body_mags[star_name] > max_mag: continue # 将name第一个字母大写,其他字母小写 star_name = star_name.capitalize() star_body = getattr(ast.Body, star_name) equ_ofdate = ast.Equator(star_body, time, observer, True, True) self.all_infos.append( ( (equ_ofdate.ra * 15, equ_ofdate.dec), star_name, solar_body_mags[star_name.lower()], ) ) def get_solar_stars( self, ra: float, dec: float, radius: float ) -> tuple[tuple[float, float], str | None, float]: """ Get the solar star that is closest to the given right ascension and declination. Args: ra: The right ascension. dec: The declination. radius: The radius to search for the stars, in arcmins. Returns: solar_index_rd: The right ascension and declination of the solar star. solar_name: The name of the solar star. mag: The magnitude of the solar star. """ # 计算所有太阳系天体和给定坐标的距离,返回radius半径内的最亮的太阳系天体 all_rds = np.array([info[0] for info in self.all_infos]) center = np.array([ra, dec]) distances = sph_dist(all_rds[:, 0], all_rds[:, 1], center[0], center[1], "deg") target_idxs = np.argwhere(distances <= radius / 60).flatten() if len(target_idxs) == 0: return (0, 0), None, 100 target_idx = target_idxs[ np.argmin([self.all_infos[idx][2] for idx in target_idxs]) ] return self.all_infos[target_idx] def get_fixed_stars( fixed_xy2field_rd: dict, radius: float, max_mag: float ) -> dict[tuple[float, float], tuple[float, float, str, float]]: """ Find the fixed stars that is closest to the given right ascension and declination. Args: fixed_xy2field_rd: The mapping from the positions of the stars to the ascension and declination in the image. radius: The radius to search for the stars, in arcmins. max_mag: The maximum magnitude of the star. Returns: The mapping from the positions of the stars to the right ascension, declination, name and magnitude. """ async def find_star( xy: tuple[float, float], field_rd: str ) -> tuple[tuple[float, float], tuple[float, float, str, float]]: """ Find the star that is closest to the given right ascension and declination. Args: xy: The position of the star in the image. field_rd: The right ascension and declination of the star. Returns: The right ascension, declination and name of the star. """ # 发送请求 async with httpx.AsyncClient(limits=limits) as client: # 查询参数 params = { "coord": field_rd, "output": "json", "radius": radius, "data": "J(2d;c) I.0 M(V)", } response = await client.post( "https://simbad.u-strasbg.fr/simbad/sim-nameresolver", params=params, timeout=10, ) # 处理返回结果 ra, dec = field_rd.split("-") if "-" in field_rd else field_rd.split("+") if response.text.startswith("!! No astronomical object found :"): # 如果找不到,就返回原来的坐标 return (xy, (float(ra), float(dec), "Unknown", 100)) # 按视星等数值从小到大排序,把最亮的天体选出 found_results = response.json() found_results = sorted( found_results, key=lambda x: float(x.get("M.V", 100)) ) found_result = found_results[0] mag = float(found_result.get("M.V", 100)) # 如果找到的天体视星等大于最大视星等,也返回原来的坐标 if mag > max_mag: return (xy, (float(ra), float(dec), "Unknown", 100)) # 成功找到一定半径内的亮星,返回其信息 ra, dec = found_result["coord"].split()[:2] return ( xy, ( float(ra), float(dec), found_result["mainId"].lstrip("* "), mag, ), ) # 并发查询 async def task_pack(): tasks = [find_star(xy, field_rd) for xy, field_rd in fixed_xy2field_rd.items()] return await asyncio.gather(*tasks) raw_resp_infos = asyncio.run(task_pack()) # 转为字典 fixed_xy2index_rd_name_mags = dict() for xy, rd_name in raw_resp_infos: fixed_xy2index_rd_name_mags[xy] = rd_name return fixed_xy2index_rd_name_mags def submit( sub_images: list[Image.Image], xy: list[tuple[float, float]], image_width: int, image_height: int, scale_units: str = "degwidth", scale_lower: float = 10, scale_upper: float = 180, ) -> tuple[str, str | None]: """ Solve the astrometry of an image. Args: images: The images to solve. xy: The positions of the stars in the image. image_width: The width of the image. image_height: The height of the image. scale_units: The unit of the scale. scale_lower: The lower bound of the scale. scale_upper: The upper bound of the scale. Returns: detail: Whether the solving is successful. job_id: The id of the job. """ # 计算所有图片的星星flux fluxs = np.array(flux_in_img(sub_images)) # 按flux从大到小排序 xy_formated = np.array(xy).round(decimals=2) # 保留两位小数 sorted_xy = xy_formated[np.argsort(-fluxs)] # Get the options for the client options = ClientRunnerOptions( apikey=ASTROMETRY_API_KEY, upload_xy=sorted_xy.T.tolist(), image_width=image_width, image_height=image_height, scale_units=scale_units, scale_lower=scale_lower, scale_upper=scale_upper, parity="1", public="n", ) # Run the client try: detail, job_id = run_client(options) job_id = str(job_id) except Exception as e: detail = str(e) job_id = None return detail, job_id def recognize( job_id: str, xy: list[tuple[float, float]], timestamp: float, radius: float = 60, max_mag: float = 6, is_zh: bool = False, ) -> tuple[str, list[tuple[float, float, str]] | None]: """ Recognize the stars in the image. Args: job_id: The ID of the job. xy: The positions of the stars in the image. timestamp: The timestamp of the observation. radius: The radius to search for the stars, in arcmins. max_mag: The maximum magnitude of the star. is_zh: Whether to translate the star names into 中文. Returns: detail: Whether the solving is successful. hd_names: The hour angle, declination and name of the stars. """ # 查询任务状态 detail = httpx.get(f"https://nova.astrometry.net/api/jobs/{job_id}").json()[ "status" ] if detail == "success": rdls_url = f"https://nova.astrometry.net/image_rd_file/{job_id}" content = httpx.get(rdls_url).content xy2field_rd = dict() # 星点坐标到图中赤道坐标的映射 with fits.open(BytesIO(content)) as hdul: hdul_data = hdul[1].data # type: ignore for i in range(len(xy)): xy2field_rd[ ( hdul_data["x"][i].item(), hdul_data["y"][i].item(), ) ] = ( hdul_data["ra"][i], hdul_data["dec"][i], ) try: # 根据图中赤道坐标,寻找最接近的星星的真实赤道坐标和名称 xy2rd_names = tune_rd(xy2field_rd, timestamp, radius, max_mag) # xy保留小数点后两位 round_xy = np.array(xy).round(decimals=2).tolist() # 返回输入顺序的星星的真实时角坐标和名称 hd_names = [] assert type(round_xy) == list for xy_item in round_xy: rd_name = xy2rd_names[(float(xy_item[0]), float(xy_item[1]))] # type: ignore ra, dec = rd_name[:2] hour_ra = get_HaDec_by_RaDec((ra / 15, dec), stamp2ast_time(timestamp)) star_name = rd_name[2] if is_zh: # 尝试汉化星名 star_name = starEN2ZH.get(star_name.lower(), star_name) hd_names.append((*hour_ra, star_name)) except Exception as e: detail = str(e) return detail, None return detail, hd_names else: return detail, None ================================================ FILE: prototype/core/moon_time/calc.py ================================================ from copy import deepcopy import numpy as np from .utils import ( find_moon_idx, angle_btw_moon_stars, geo_estimate_by_stars, angle_error, ) from core.positioning.calc import stars_convert, calc_z from core.positioning.find_z.utils.math import minimize from core.positioning.top_point.methods.matrix_inverse_normalized import intersection def calc( photo: dict, approx_timestamp: float, scope_days: float, is_fix_gravity: bool = False, is_fix_refraction: bool = False, ) -> float: """ 根据星星(含月)相互角距计算对应时间 params: photo: 数据,第一个是月亮: stars: list, star points lines: (n, 2, 2), plumb lines approx_timestamp: 大致时间戳 scope_days: 日期搜索范围大小(单位天) is_fix_gravity: 是否修正重力 is_fix_refraction: 是否修正大气折射 return: float 返回对应时间戳 """ # 数据转换 moon_idx = find_moon_idx(photo["stars"]) if moon_idx == -1: raise ValueError("没有找到月亮数据") # 获取灭点、焦距 points, hour_decs, _ = stars_convert( [photo["stars"][i] for i in range(len(photo["stars"])) if i != moon_idx] ) # 剔除月的数据 try: top_point = intersection(np.array(photo["lines"])) except: raise ValueError("无法找到灭点") try: z = calc_z(points, hour_decs, top_point, is_fix_refraction) except: raise ValueError("无法计算焦距") # 获取月与各星相互角距作为目标值 points, _, star_names = stars_convert(photo["stars"]) target_angles = angle_btw_moon_stars(points, moon_idx, z) # 根据星星信息计算大致日期下的地理坐标 geo_estimate = geo_estimate_by_stars( deepcopy(photo), approx_timestamp, moon_idx, is_fix_gravity, is_fix_refraction ) s_per_day = 86400 # 将scope_days划分为每20天一个区间,对每个区间使用三段二分法minimize搜索最小误差,最后返回最小误差对应的时间 min_time = int(approx_timestamp - (scope_days * s_per_day) / 2) max_time = int(approx_timestamp + (scope_days * s_per_day) / 2) min_error = float("inf") opt_time = 0 opt_func = lambda timestamp: angle_error( timestamp, approx_timestamp, star_names, geo_estimate, moon_idx, target_angles ) for left_i in range(min_time, max_time, 20 * s_per_day): right_i = min(left_i + 20 * s_per_day, max_time) opt_time_single = minimize(opt_func, left_i, right_i, 1, 100) time_error = opt_func(opt_time_single) if time_error < min_error: min_error = time_error opt_time = opt_time_single return opt_time ================================================ FILE: prototype/core/moon_time/utils.py ================================================ import numpy as np import astronomy as ast from core.positioning.locator.utils.math import vector_angle from core.positioning.calc import calc_geo as geo_calc from core.astro_coord.calc import get_HaDecs_by_names from core.positioning.locator.utils.math import sph2cart from core.positioning.calc import stars_convert def find_moon_idx(stars: list[dict]) -> int: """ 找到月亮的索引 params: stars: star points return: 返回月亮的索引 """ for i, star in enumerate(stars): if star["name"] in ["月", "月亮", "月球", "moon"]: return i return -1 def angle_btw_moon_stars(points: np.ndarray, moon_idx: int, z: float) -> np.ndarray: """ 计算月亮与星星的角距 params: points: (n, 2), star points moon_idx: 月的索引 z: 焦距 return: 返回角距列表 """ points_3d = np.concatenate([points, np.ones((len(points), 1)) * z], axis=1) target_angles = vector_angle(points_3d[moon_idx], points_3d) return target_angles def geo_estimate_by_stars( data: dict, approx_timestamp: float, moon_idx: int, is_fix_gravity: bool, is_fix_refraction: bool, ) -> dict: """ 根据星星信息计算大致日期下的地理坐标 params: data: a dict including: stars: (n, 2), star points lines: (n, 2, 2), plumb lines approx_timestamp: 大致时间戳 moon_idx: 月的索引 is_fix_gravity: 是否修正重力 is_fix_refraction: 是否修正大气折射 return: 返回地理位置列表 """ # 数据转换 _, _, star_names = stars_convert(data["stars"]) # 根据大致日期获取各星时角赤纬 approx_star_HaDecs, is_success = get_HaDecs_by_names(star_names, approx_timestamp) if not is_success: raise ValueError("无法获取天体坐标") for i, star_name in enumerate(star_names): data["stars"][i]["lon"] = np.deg2rad( 360 - approx_star_HaDecs[star_name][0] * 15 # type: ignore ) data["stars"][i]["lat"] = np.deg2rad(approx_star_HaDecs[star_name][1]) # type: ignore # 计算大致日期下的地理坐标 data["stars"].pop(moon_idx) # 剔除月的数据 try: geo_estimate = geo_calc( data, is_fix_refraction=is_fix_refraction, is_fix_gravity=is_fix_gravity, ) except: raise ValueError("无法计算地理位置") return geo_estimate def s2sidereal_days(s: float) -> float: """ 将秒转换为恒星天 params: s: number 秒 return: number 恒星天 """ s_in_sidereal_day = 86164.0905 return s / s_in_sidereal_day def angle_error( timestamp: float, approx_timestamp: float, star_names: list[str], geo_estimate: dict, moon_idx: int, target_angles: np.ndarray, ): """ 误差函数,计算每一天的星星(含月)相互角距,输出误差 params: timestamp: 时间戳 approx_timestamp: 大致日期 star_names: 星星名字列表 geo_estimate: 地理坐标 moon_idx: 月的索引 target_angles: 目标角距 return: number 返回星角距误差和 """ # 使用恒星日周期快速计算该时间下观测者地理坐标 observer_lon = ( np.rad2deg(geo_estimate["lon"]) - s2sidereal_days(timestamp - approx_timestamp) * 360 ) observer_lon = wrap_angle_in_deg(observer_lon) # 得到该时间所计算的观测者地理坐标 observer = ast.Observer(np.rad2deg(geo_estimate["lat"]), observer_lon, 0) # 获取该时间、该地理坐标下的天体时角赤纬 star_HaDecs, _ = get_HaDecs_by_names(star_names, timestamp, observer) moon_HaDec = star_HaDecs[star_names[moon_idx]] assert moon_HaDec[0] and moon_HaDec[1] moon_vec = np.array( sph2cart(np.deg2rad(moon_HaDec[0] * 15), np.deg2rad(moon_HaDec[1])) ) # 计算每颗星星(不包含月)与月的角距误差 error = 0 for i, star_name in enumerate(star_names): if i == moon_idx: continue star_HaDec = star_HaDecs[star_name] assert star_HaDec[0] and star_HaDec[1] star_vec = np.array( sph2cart(np.deg2rad(star_HaDec[0] * 15), np.deg2rad(star_HaDec[1])) ) angle = vector_angle(star_vec, moon_vec) error += (np.rad2deg(angle - target_angles[i])) ** 2 return error def wrap_angle_in_deg(deg): """ Make the angle in [-180, 180]. """ while deg > 180: deg -= 360 while deg < -180: deg += 360 return deg ================================================ FILE: prototype/core/positioning/__init__.py ================================================ ================================================ FILE: prototype/core/positioning/calc.py ================================================ import numpy as np from .top_point.methods.matrix_inverse_normalized import intersection from .find_z.methods import trisect, fix_refraction from .locator.methods.bi_median import get_geo from .find_z.utils.math import angles_on_sphere, normalize from .latitude.method.series2 import astronomic_latitude_to_geodetic_latitude def calc_z( points: np.ndarray, hour_decs: np.ndarray, top_point: np.ndarray, is_fix_refraction: bool = False, ) -> float: """ Find the z value. Params: points: (n, 2), star points hour_decs: (n, 2), hour & declinations top_point: (2,), top point is_fix_refraction: whether to fix refraction Returns: z: float, z value """ thetas = angles_on_sphere(hour_decs) z_input_parameters = {"points": points, "thetas": thetas, "ra_decs": hour_decs} z = trisect.get_z(z_input_parameters) if is_fix_refraction: z = fix_refraction.get_z(z_input_parameters, z, top_point) return z def calc_geo( photo: dict, is_fix_refraction: bool = False, is_fix_gravity: bool = False ) -> dict: """ Find the geographical position. params: photo: a dict including: stars: list, star points name: str, star name x: float, x value y: float, y value lat: float, declination lon: float, reverse of hour angle lines: (n, 2, 2), plumb lines is_fix_refraction: whether to fix refraction is_fix_gravity: whether to fix gravity return: a dict: detail: str, success or failed topPoint: (2,), top point z: float, z value lon: float, longitude lat: float, latitude """ num_points = len(photo["stars"]) points, hour_decs, _ = stars_convert(photo["stars"]) # 计算灭点 try: top_point = intersection(np.array(photo["lines"])) except: return {"detail": "灭点计算失败"} # 计算焦距 try: z = calc_z(points, hour_decs, top_point, is_fix_refraction) except: return {"detail": "焦距计算失败"} # 计算地理位置 points_3d = np.concatenate([points, np.ones((num_points, 1)) * z], axis=1) top_point_3d = np.array([*top_point, z]) points_3d = normalize(points_3d) top_point_3d = normalize(top_point_3d) try: geo = get_geo( { "points": points_3d, "top_point": top_point_3d, "hour_decs": hour_decs, "z": z, }, is_fix_refraction, ) except: return {"detail": "地理位置计算失败"} if is_fix_gravity: geo[1] = np.deg2rad( astronomic_latitude_to_geodetic_latitude(np.rad2deg(geo[1])) ) return { "detail": "success", "topPoint": top_point, "z": z, "lon": geo[0].item(), "lat": geo[1].item(), } def stars_convert(stars: list[dict]) -> tuple[np.ndarray, np.ndarray, list[str]]: """ Convert the stars to numpy arrays of (lon, lat) coordinates. """ num_stars = len(stars) star_names = [star["name"] for star in stars] points = np.zeros((num_stars, 2), dtype=np.float32) hour_decs = np.zeros((num_stars, 2), dtype=np.float32) for i, star in enumerate(stars): points[i] = star["x"], star["y"] hour_decs[i] = star["lon"], star["lat"] return points, hour_decs, star_names ================================================ FILE: prototype/core/positioning/find_z/README.md ================================================ # 焦距计算误差测试框架 ## 算法原形 使用 python 来测试焦距计算算法的误差。提供Oxy平面点坐标,以及他们两两关于z轴某一焦点的夹角矩阵。每个点由两个坐标表示,含一定噪声,夹角矩阵不含噪声。需要计算真实的焦距。 ## 排行榜 ### 无畸变 **参数**: ```python args.num_points = 5 # 点的数量 args.num_tests = 100 # 测试次数 args.scope_x = (-1000, 1000) args.scope_y = (-2000, -1000) args.z = 3000 # 焦距 args.k1 = 0 # 畸变系数k1 args.k2 = 0 # 畸变系数k2 args.noise_std = 1 # 高斯噪声标准差 ``` |排名|方法|平均误差|95%置信区间| |---|---|---|---| | 1 | [trisect](methods/trisect.py) | 2.132 | (1.791, 2.473) | | 2 | [bi_mean](methods/bi_mean.py) | 90.111 | (49.588, 130.633) | | 3 | [north_len](methods/north_len.py) | 110.185 | (29.654, 190.716) | ### 有畸变 **参数**: ```python args.num_points = 5 # 点的数量 args.num_tests = 100 # 测试次数 args.scope_x = (-1000, 1000) args.scope_y = (-2000, -1000) args.z = 3000 # 焦距 args.k1 = 1e-9 # 畸变系数k1 args.k2 = 1e-18 # 畸变系数k2 args.noise_std = 1 # 高斯噪声标准差 ``` |排名|方法|平均误差|95%置信区间| |---|---|---|---| | 1 | [trisect](methods/trisect.py) | 3.048 | (2.555, 3.541) | | 2 | [north_len](methods/north_len.py) | 107.276 | (38.042, 176.509) | | 3 | [bi_mean](methods/bi_mean.py) | 121.416 | (76.569, 166.262) | ## 使用方法 1. 在`core`目录下运行 ```bash python -m positioning.find_z.benchmark ``` ## 贡献方法 1. 在 `methods` 目录下新建一个文件,实现一个算法。 需实现一个函数`getZ`,接受一个字典`datas`,其中包含:points为一个(n, 2)的数组,表示点的坐标;thetas为一个(n, n)的数组,表示夹角矩阵;des为一个(n,)的数组,表示各点的赤纬。该函数需返回一个浮点数,表示焦距。 2. 在 `benchmark.py` 的`methods`列表中添加你的方法。 3. 运行 `python benchmark.py` 来测试你的方法。 ================================================ FILE: prototype/core/positioning/find_z/benchmark.py ================================================ import argparse from copy import deepcopy import numpy as np import scipy.stats as st from .methods.bi_mean import get_z as bi_mean from .methods.north_len import get_z as north_len from .methods.trisect import get_z as trisect from ..locator.utils.math import vector_angle def generate_points(args): num_points = args.num_points scope_x = args.scope_x scope_y = args.scope_y ## 生成点和夹角(弧度) points = [] thetas = np.zeros((num_points, num_points), dtype=np.float32) for i in range(num_points): ## 生成一个参考点 points_x = np.random.uniform(*scope_x) points_y = np.random.uniform(*scope_y) points.append([points_x, points_y]) points = np.array(points) ## 计算夹角 for i in range(num_points): for j in range(i + 1, num_points): vec_a = np.concatenate([points[i], [args.z]]) vec_b = np.concatenate([points[j], [args.z]]) cos_theta = np.dot(vec_a, vec_b) / ( np.linalg.norm(vec_a) * np.linalg.norm(vec_b) ) thetas[i, j] = thetas[j, i] = np.arccos(cos_theta) # 根据一个随机的北天极,生成赤纬 ## 生成一个随机的北天极 north_pole = np.random.rand(3) * 2 - 1 ## 生成赤纬 des = np.array( [ np.pi / 2 - vector_angle(north_pole, np.concatenate([point, [-args.z]])) for point in points ] ) ## 施加径向畸变 if args.k1 is not None and args.k2 is not None: points = destort(points, args.k1, args.k2, args.scope_x, args.scope_y) ## 加入高斯噪声 points += np.random.normal(0, args.noise_std, points.shape) return { "points": points, "thetas": thetas, "des": des, } def destort(points, k1, k2, scope_x, scope_y): """ 施加径向畸变 params: points: np.array, shape=(n, 2), 2D points k1: float, radial distortion coefficient k2: float, tangential distortion coefficient scope_x: tuple, x scope scope_y: tuple, y scope return: points: np.array, shape=(n, 2), 2D points """ center = np.array([scope_x[0] + scope_x[1], scope_y[0] + scope_y[1]]) / 2 points_relative = points - center r = np.hypot(points_relative[:, 0], points_relative[:, 1]).reshape(-1, 1) points_relative *= 1 + k1 * r**2 + k2 * r**4 points = points_relative + center return points def print_results(results): ## 输出结果 for name, result in results.items(): print("Method:", name) error = np.array(result["error"]) # print('Mean error:', np.mean(error), 'Std:', np.std(error, ddof=1)) print( "\tMean error:", np.mean(error), "Interval:", st.t.interval( 0.95, len(error) - 1, loc=np.mean(error), scale=st.sem(error) ), ) ## 输出markdown表格 print("|排名|方法|平均误差|95%置信区间|") print("|---|---|---|---|") results = dict( sorted(results.items(), key=lambda x: np.mean(x[1]["error"]), reverse=False) ) # 误差从小到大 for i, (name, result) in enumerate(results.items()): error = np.array(result["error"]) mean_error = np.mean(error) interval = st.t.interval( 0.95, len(error) - 1, loc=mean_error, scale=st.sem(error) ) print( "|", i + 1, "|", f"[{name}](methods/{name}.py)", "|", f"{mean_error:.3f}", "|", f"({interval[0]:.3f}, {interval[1]:.3f})", "|", ) def main(methods, args): results = {} for name in methods.keys(): results[name] = {"error": []} for _ in range(args.num_tests): ## 生成点和夹角 datas = generate_points(args) for name, method in methods.items(): ## 计算焦距 z = method(deepcopy(datas)) ## 计算误差 results[name]["error"].append(np.abs(z - args.z)) ## 排序 results = dict( sorted(results.items(), key=lambda x: np.mean(x[1]["error"]), reverse=True) ) ## 输出结果 print_results(results) if __name__ == "__main__": args = argparse.ArgumentParser() args.num_points = 5 # 点的数量 args.num_tests = 100 # 测试次数 args.scope_x = (-1000, 1000) args.scope_y = (1000, 2000) args.z = 3000 # 焦距 args.k1 = 1e-9 # 畸变系数k1 args.k2 = 1e-18 # 畸变系数k2 args.noise_std = 1 # 高斯噪声标准差 ## 检测是否有效范围 assert args.scope_x[0] < args.scope_x[1] assert args.scope_y[0] < args.scope_y[1] ## 定义所需评测的方法 methods = { "bi_mean": bi_mean, "trisect": trisect, "north_len": north_len, } main(methods, args) ================================================ FILE: prototype/core/positioning/find_z/methods/__init__.py ================================================ ================================================ FILE: prototype/core/positioning/find_z/methods/bi_mean.py ================================================ import numpy as np def get_z(data: dict) -> float: """ Find the focal length. params: data: (points, thetas). points: list of points. thetas: list of angles in radians return: z: focal length """ points = data["points"] thetas = data["thetas"] n = len(points) z_list = [] for i in range(n): for j in range(i + 1, n): z = get_z_from_2_points(points[i], points[j], thetas[i][j]) z_list.extend(z) z = reject_outliers(z_list) # print(z_list) return np.mean(z) def get_z_from_2_points(p1: tuple, p2: tuple, theta: float) -> list[float]: """ Find the focal length from 2 points and the angle between them. params: p1: point 1 p2: point 2 theta: angle between p1 and p2 in radians return: z: focal length """ x1, y1 = p1 x2, y2 = p2 a = np.cos(theta) ** 2 - 1 b = (x1**2 + y1**2 + x2**2 + y2**2) * np.cos(theta) ** 2 - 2 * (x1 * x2 + y1 * y2) c = (x1**2 + y1**2) * (x2**2 + y2**2) * np.cos(theta) ** 2 - ( x1 * x2 + y1 * y2 ) ** 2 delta = b**2 - 4 * a * c if delta < 0: return [] sqrt_delta = np.sqrt(delta) solve1 = (-b + sqrt_delta) / (2 * a) solve2 = (-b - sqrt_delta) / (2 * a) if ( solve1 >= 0 and solve2 >= 0 and (x1 * x2 + y1 * y2 + solve1) * (x1 * x2 + y1 * y2 + solve2) > 0 ): return [np.sqrt(solve1), np.sqrt(solve2)] if solve1 >= 0 and (x1 * x2 + y1 * y2 + solve1) * np.cos(theta) > 0: return [np.sqrt(solve1)] if solve2 >= 0 and (x1 * x2 + y1 * y2 + solve2) * np.cos(theta) > 0: return [np.sqrt(solve2)] return [] def reject_outliers(data: list, sigma: float = 2.0) -> list: """ Reject the outliers in the data. params: data: list of data sigma: the number of standard deviations from the mean to reject the outliers return: data: list of data without outliers """ data = np.array(data) return data[ (data > np.mean(data) - sigma * np.std(data)) & (data < np.mean(data) + sigma * np.std(data)) ] ================================================ FILE: prototype/core/positioning/find_z/methods/fix_refraction.py ================================================ import numpy as np import astronomy as ast from ..utils.math import minimize, normalize from core.positioning.locator.utils.math import vector_angle def get_z(data: dict, z0: float, zenith: np.ndarray) -> float: """ Find the focal length considering refraction. Args: data: (points, thetas, ra_decs). points: x/y list of points. thetas: list of angles in radians. ra_decs: list of ra and dec in radians. z0: initial guess of focal length zenith: zenith point, 2d array Returns: z: focal length """ points = data["points"] thetas = data["thetas"] # z的上下限10% z_min = z0 * 0.9 z_max = z0 * 1.1 # 使用优化函数求解 def z_error(z): # 计算天顶的观测向量 zenith_vector = np.array([*zenith, z]) # 计算各星的观测向量 star_vector_observer = np.concatenate( [points, np.ones((len(points), 1)) * z], axis=1 ) # 计算各星高度角 star_angles = np.pi / 2 - np.array( [ vector_angle(star_vector_observer[i], zenith_vector) for i in range(len(star_vector_observer)) ] ) # 计算去折射高度角修正值(添加到zenithAngles上就是未折射时的高度角) star_refraction = np.array( [ ast.InverseRefractionAngle(ast.Refraction.Normal, np.rad2deg(angle)) for angle in star_angles ] ) # 计算去折射后的各星的观测向量 star_vector_real = np.array( [ rotate(star_vector_observer[i], zenith_vector, star_refraction[i]) for i in range(len(star_vector_observer)) ] ) # 计算去折射后的各星夹角 angles_real = np.array( [ vector_angle(star_vector_real[i], star_vector_real[j]) for i in range(len(star_vector_real)) for j in range(i + 1, len(star_vector_real)) ] ) # 计算夹角总误差 error = np.sum((angles_real - thetas[np.triu_indices(len(points), k=1)]) ** 2) return error z = minimize( z_error, z_min, z_max, ) return z def rotate(vector: np.ndarray, zenith_vec: np.ndarray, angle: float) -> np.ndarray: """ Rotate a vector towards a zenith vector by a given angle. Params: vector: vector to rotate zenith_vec: zenith vector angle: angle to rotate in degrees Returns: rotated element vector """ # 单位化 vector = normalize(vector) zenith_vec = normalize(zenith_vec) # 旋转轴 axis = np.cross(vector, zenith_vec) # 旋转角度 angle = np.deg2rad(angle) # 罗德里格斯旋转公式 rotated = ( vector * np.cos(angle) + np.cross(axis, vector) * np.sin(angle) + axis * np.dot(axis, vector) * (1 - np.cos(angle)) ) return rotated ================================================ FILE: prototype/core/positioning/find_z/methods/north_len.py ================================================ import numpy as np def north_len(points: np.ndarray, des: np.ndarray, f: float) -> float: """ Calculate the length of the north pole. params: points: list of points des: list of declinations f: zenith point return: length: length of the north pole """ C = np.concatenate([points, np.ones((points.shape[0], 1)) * f], axis=1) C_normlized = C / np.linalg.norm(C, axis=1)[:, None] D = np.sin(des) N = np.linalg.pinv(C_normlized) @ D return np.linalg.norm(N) def get_z(data: dict) -> float: """ Find the focal length. params: data: (points, thetas). points: list of points. thetas: list of angles in radians return: z: focal length """ points = data["points"] des = data["des"] f_left = 0 f_right = 1e9 for _ in range(100): delta = (f_right - f_left) / 3 f_mid_left = f_left + delta f_mid_right = f_right - delta error_sum1 = np.abs(north_len(points, des, f_mid_left) - 1) error_sum2 = np.abs(north_len(points, des, f_mid_right) - 1) if error_sum1 < error_sum2: f_right = f_mid_right else: f_left = f_mid_left f = (f_left + f_right) / 2 return f ================================================ FILE: prototype/core/positioning/find_z/methods/trisect.py ================================================ import numpy as np from ..utils.math import minimize def calculate_angle(p1: np.ndarray, p2: np.ndarray, z: float) -> np.ndarray: v1 = np.array([*p1, z]) v2 = np.array([*p2, z]) cos_theta = np.dot(v1, v2) / (np.linalg.norm(v1) * np.linalg.norm(v2)) cos_theta = np.clip(cos_theta, -1, 1) return np.arccos(cos_theta) def get_z(data: dict) -> float: """ Find the focal length. params: data: (points, thetas). points: list of points. thetas: list of angles in radians return: z: focal length """ points = data["points"] thetas = data["thetas"] z = minimize( lambda z: sum( (calculate_angle(points[i], points[j], z) - thetas[i, j]) ** 2 for i in range(len(points)) for j in range(i + 1, len(points)) ), 0, 1e9, ) return z ================================================ FILE: prototype/core/positioning/find_z/utils/math.py ================================================ import numpy as np from typing import Callable from ...locator.utils.math import sph_dist def normalize(vec: np.ndarray) -> np.ndarray: return vec / np.linalg.norm(vec, axis=-1, keepdims=True) def angles_on_sphere(dec_ras: np.ndarray) -> np.ndarray: """ Calculate the angles between points on a sphere. The dec_ras are represented as arrays of (lon, lat) coordinates. """ num_points = dec_ras.shape[0] thetas = np.zeros((num_points, num_points), dtype=np.float32) for i in range(num_points): for j in range(i + 1, num_points): thetas[i, j] = sph_dist(*dec_ras[i], *dec_ras[j]) thetas[j, i] = thetas[i, j] return thetas # def minimize(func, lower_bound, upper_bound, tolerance=1e-6, max_iter=100): def minimize( func: Callable, lower_bound: float, upper_bound: float, tolerance: float = 1e-6, max_iter: int = 100, ) -> float: """ Find the minimum of a function using the ternary search algorithm. """ for _ in range(max_iter): delta = (upper_bound - lower_bound) / 3 mid_left = lower_bound + delta mid_right = upper_bound - delta sum1 = func(mid_left) sum2 = func(mid_right) if sum1 < sum2: upper_bound = mid_right else: lower_bound = mid_left if abs(upper_bound - lower_bound) < tolerance: break return (lower_bound + upper_bound) / 2 ================================================ FILE: prototype/core/positioning/latitude/benchmark.py ================================================ from . import constants import numpy as np from matplotlib import pyplot as plt from .method.bisect_formular import ( astronomic_latitude_to_geodetic_latitude as bisect_formular, ) from .method.bisect_tabular import ( astronomic_latitude_to_geodetic_latitude as bisect_tabular, ) from .method.naive import astronomic_latitude_to_geodetic_latitude as naive from .method.series import astronomic_latitude_to_geodetic_latitude as series from .method.series2 import astronomic_latitude_to_geodetic_latitude as series2 geodetic_latitudes = np.linspace(-90, 90, 10001) def get_geocentric_latitude(geodetic_latitude_in_rad): tan_theta = (1 - constants.f) ** 2 * np.tan(geodetic_latitude_in_rad) return np.arctan(tan_theta) def get_astronomic_latitude(geocentric_latitude_in_rad): ## 地心纬度的自转半径 centripetal_radius_at_geocentric_latitude = constants.a * np.cos( geocentric_latitude_in_rad ) ## 自转向心力加速度 centripetal_acc_at_geocentric_latitude = ( constants.OMEGA**2 * centripetal_radius_at_geocentric_latitude ) ## 地心纬度的半径的平方 squared_geocentric_radius_at_geocentric_latitude = ( constants.a**2 * np.cos(geocentric_latitude_in_rad) ** 2 + constants.b**2 * np.sin(geocentric_latitude_in_rad) ** 2 ) ## 两极的万有引力的加速度,没有自转加速度 # g_p = G * M_earth / b ** 2 ## 地心纬度的万有引力的加速度 # g = G * M_earth / R ** 2 ## 所以地心纬度的万有引力的加速度 ## g = g_p * b ** 2 / R ** 2 g_at_geocentric_latitude = ( constants.g_p * constants.b**2 / squared_geocentric_radius_at_geocentric_latitude ) ## 使用直角坐标系的向量来记录万有引力的加速度和自转向心力 ## 地理位置假设在 xz 平面上,且 x 为正 centripetal_force_acc = np.array([-centripetal_acc_at_geocentric_latitude, 0, 0]) gravitation_acc = np.array( [ -g_at_geocentric_latitude * np.cos(geocentric_latitude_in_rad), 0, -g_at_geocentric_latitude * np.sin(geocentric_latitude_in_rad), ] ) ## 重力的向量 gravity_acc = gravitation_acc - centripetal_force_acc ## 天文纬度 astronomic_latitude_in_rad = np.arctan2(-gravity_acc[2], -gravity_acc[0]) return astronomic_latitude_in_rad geocentric_latitudes = [] astronomic_latitudes = [] for geodetic_latitude in geodetic_latitudes: geocentric_latitude = get_geocentric_latitude(np.deg2rad(geodetic_latitude)) astronomic_latitude_in_rad = get_astronomic_latitude(geocentric_latitude) astronomic_latitude = np.rad2deg(astronomic_latitude_in_rad) astronomic_latitudes.append(astronomic_latitude) geocentric_latitudes.append(np.rad2deg(geocentric_latitude)) # =============================== # 对比算法 # =============================== methods = { # "naive": naive, # "bisect_formular": bisect_formular, # "bisect_tabular": bisect_tabular, # "series": series, "series2": series2, } diff = dict() for method_name, method in methods.items(): diff[method_name] = [] for geodetic_latitude, astronomic_latitude in zip( geodetic_latitudes, astronomic_latitudes ): for method_name, method in methods.items(): solved_geodetic_latitude = method(astronomic_latitude) diff[method_name].append(solved_geodetic_latitude - geodetic_latitude) for method_name, method_diff in diff.items(): plt.plot(geodetic_latitudes, diff[method_name], label=method_name) plt.grid(True) plt.xlabel("real geodetic latitude in degree") plt.ylabel("error in degree") plt.legend(loc="best") plt.show() ================================================ FILE: prototype/core/positioning/latitude/constants.py ================================================ import numpy as np ## 地球赤道半径 a = 6378137 ## 地球扁率 f = 1 / 298.257223563 ## 赤道重力加速度 g_e = 9.7803253359 ## 极地重力加速度 g_p = 9.8321849378 ## 地球极地半径 b = a * (1 - f) ## 恒星日 T = 86164.0905 ## 地球自转角速度 OMEGA = 2 * np.pi / T ================================================ FILE: prototype/core/positioning/latitude/method/__init__.py ================================================ ================================================ FILE: prototype/core/positioning/latitude/method/bisect_formular.py ================================================ from .. import constants import numpy as np def get_geocentric_latitude(geodetic_latitude_in_rad): tan_theta = (1 - constants.f) ** 2 * np.tan(geodetic_latitude_in_rad) return np.arctan(tan_theta) def get_astronomic_latitude(geocentric_latitude_in_rad): ## 地心纬度的自转半径 centripetal_radius_at_geocentric_latitude = constants.a * np.cos( geocentric_latitude_in_rad ) ## 自转向心力加速度 centripetal_acc_at_geocentric_latitude = ( constants.OMEGA**2 * centripetal_radius_at_geocentric_latitude ) ## 地心纬度的半径的平方 squared_geocentric_radius_at_geocentric_latitude = ( constants.a**2 * np.cos(geocentric_latitude_in_rad) ** 2 + constants.b**2 * np.sin(geocentric_latitude_in_rad) ** 2 ) ## 两极的万有引力的加速度,没有自转加速度 # g_p = G * M_earth / b ** 2 ## 地心纬度的万有引力的加速度 # g = G * M_earth / R ** 2 ## 所以地心纬度的万有引力的加速度 ## g = g_p * b ** 2 / R ** 2 g_at_geocentric_latitude = ( constants.g_p * constants.b**2 / squared_geocentric_radius_at_geocentric_latitude ) ## 使用直角坐标系的向量来记录万有引力的加速度和自转向心力 ## 地理位置假设在 xz 平面上,且 x 为正 centripetal_force_acc = np.array([-centripetal_acc_at_geocentric_latitude, 0, 0]) gravitation_acc = np.array( [ -g_at_geocentric_latitude * np.cos(geocentric_latitude_in_rad), 0, -g_at_geocentric_latitude * np.sin(geocentric_latitude_in_rad), ] ) ## 重力的向量 gravity_acc = gravitation_acc - centripetal_force_acc ## 天文纬度 astronomic_latitude_in_rad = np.arctan2(-gravity_acc[2], -gravity_acc[0]) return astronomic_latitude_in_rad def reverse_solve(geodetic_latitude): geocentric = get_geocentric_latitude( get_geocentric_latitude(np.deg2rad(geodetic_latitude)) ) astronomic = get_astronomic_latitude(geocentric) return np.rad2deg(astronomic) def astronomic_latitude_to_geodetic_latitude(astronomic_latitudes_in_degree): l = -90 r = 90 for _ in range(100): m = (l + r) / 2 angle = reverse_solve(m) if angle > astronomic_latitudes_in_degree: r = m else: l = m return (l + r) / 2 ================================================ FILE: prototype/core/positioning/latitude/method/bisect_tabular.py ================================================ from .. import constants import numpy as np geodetic_latitudes = np.linspace(-90, 90, 100000) def get_geocentric_latitude(geodetic_latitude_in_rad): tan_theta = (1 - constants.f) ** 2 * np.tan(geodetic_latitude_in_rad) return np.arctan(tan_theta) def get_astronomic_latitude(geocentric_latitude_in_rad): ## 地心纬度的自转半径 centripetal_radius_at_geocentric_latitude = constants.a * np.cos( geocentric_latitude_in_rad ) ## 自转向心力加速度 centripetal_acc_at_geocentric_latitude = ( constants.OMEGA**2 * centripetal_radius_at_geocentric_latitude ) ## 地心纬度的半径的平方 squared_geocentric_radius_at_geocentric_latitude = ( constants.a**2 * np.cos(geocentric_latitude_in_rad) ** 2 + constants.b**2 * np.sin(geocentric_latitude_in_rad) ** 2 ) ## 两极的万有引力的加速度,没有自转加速度 # g_p = G * M_earth / b ** 2 ## 地心纬度的万有引力的加速度 # g = G * M_earth / R ** 2 ## 所以地心纬度的万有引力的加速度 ## g = g_p * b ** 2 / R ** 2 g_at_geocentric_latitude = ( constants.g_p * constants.b**2 / squared_geocentric_radius_at_geocentric_latitude ) ## 使用直角坐标系的向量来记录万有引力的加速度和自转向心力 ## 地理位置假设在 xz 平面上,且 x 为正 centripetal_force_acc = np.array([-centripetal_acc_at_geocentric_latitude, 0, 0]) gravitation_acc = np.array( [ -g_at_geocentric_latitude * np.cos(geocentric_latitude_in_rad), 0, -g_at_geocentric_latitude * np.sin(geocentric_latitude_in_rad), ] ) ## 重力的向量 gravity_acc = gravitation_acc - centripetal_force_acc ## 天文纬度 astronomic_latitude_in_rad = np.arctan2(-gravity_acc[2], -gravity_acc[0]) return astronomic_latitude_in_rad geocentric_latitudes = [] astronomic_latitudes = [] for geodetic_latitude in geodetic_latitudes: geocentric_latitude = get_geocentric_latitude(np.deg2rad(geodetic_latitude)) astronomic_latitude_in_rad = get_astronomic_latitude(geocentric_latitude) astronomic_latitude = np.rad2deg(astronomic_latitude_in_rad) astronomic_latitudes.append(astronomic_latitude) def astronomic_latitude_to_geodetic_latitude(astronomic_latitudes_in_degree): n = len(astronomic_latitudes) l = 0 r = n - 1 while l < r: m = (l + r) // 2 if astronomic_latitudes[m] > astronomic_latitudes_in_degree: r = m else: l = m + 1 right_key = astronomic_latitudes[l] left_key = right_key right_val = geodetic_latitudes[l] left_val = right_val dist_to_right = right_key - astronomic_latitudes_in_degree if l > 0: left_key = astronomic_latitudes[l - 1] left_val = geodetic_latitudes[l - 1] delta = right_key - left_key if np.abs(delta) < 1e-9: return left_val ratio = dist_to_right / delta return left_val * ratio + right_val * (1 - ratio) ================================================ FILE: prototype/core/positioning/latitude/method/naive.py ================================================ def astronomic_latitude_to_geodetic_latitude(astronomic_latitudes_in_degree): geodetic_latitude = astronomic_latitudes_in_degree return geodetic_latitude ================================================ FILE: prototype/core/positioning/latitude/method/series.py ================================================ import numpy as np def astronomic_latitude_to_geodetic_latitude(astronomic_latitudes_in_degree): return astronomic_latitudes_in_degree - ( 0.00032712 * np.sin(np.deg2rad(astronomic_latitudes_in_degree)) ** 2 - 0.00000368 * np.sin(np.deg2rad(astronomic_latitudes_in_degree)) - 0.099161 ) * np.sin(np.deg2rad(astronomic_latitudes_in_degree) * 2) ================================================ FILE: prototype/core/positioning/latitude/method/series2.py ================================================ import numpy as np def astronomic_latitude_to_geodetic_latitude( astronomic_latitudes_in_degree: np.ndarray, ) -> np.ndarray: bn = [ 0.0016248797304581834, -1.5959025318697836e-06, 1.7384354350353823e-09, 6.2648178203277005e-12, -2.723302870849e-14, ] angle_rad = np.deg2rad(astronomic_latitudes_in_degree) res = 0 for i, b in enumerate(bn): res += b * np.sin(2 * (i + 1) * angle_rad) return astronomic_latitudes_in_degree + np.rad2deg(res) ================================================ FILE: prototype/core/positioning/latitude/readme.md ================================================ ## 方法评估 series3 目前最好,原理见 `series_model.py` ## 建模 把地球近似看成是个椭球体 1. 按纬度圈来切,截面是正圆 1. 按子午圈来切,截面是椭圆 1. 长轴 $a$ 为地心到赤道 1. $$f=1-\frac{b}{a}$$ 为扁率 1. 短轴 $$b=a(1-f)$$ 为地心到两极 1. $$e^{2}=1-{\frac {b^{2}}{a^{2}}}=2f-f^2$$ 是椭球体的平方偏心率 1. $g_e, g_p$分别是赤道和两极处定义的重力加速度 ### 几种纬度 [天文纬度](https://en.wikipedia.org/wiki/Latitude#Astronomical_latitude),是铅垂线(重力方向)与赤道面的夹角(需要考虑地球自转),已知变量 [大地纬度](https://en.wikipedia.org/wiki/Latitude) $\phi$,是椭球面切面法线,与赤道面的夹角。目标变量 [地心纬度](https://en.wikipedia.org/wiki/Latitude#Geocentric_latitude) $\theta$,是从地心到该点的向量,与赤道面的夹角 $$\tan\theta = (1-f)^2\tan\phi$$ ### 计算步骤 万有引力的一部分,提供了沿纬度圈进行地球自转的向心力,另一部分提供了重力 重力可以由下面 Somigliana 方程来计算大小 根据下面方法,计算出万有引力。 #### 万有引力 强假设:万有引力朝向地心。 两极处的重力等于万有引力 $$\frac{GMm}{b^2}=mg_p$$ 地心纬度 $\theta$ 处的地心半径的平方为 $$d^2=a^2\cos^2\theta+b^2\sin^2\theta=a^2\left(1-e^2\cdot \sin^2\theta\right)$$ 万有引力为 $$F=\frac{GMm}{d^2}$$ 万有引力的加速度为 $$a_g=\frac{GM}{d^2}=\frac{g_pb^2}{d^2}=g_p\frac{(1-f)^2}{1-e^2\cdot\sin^2\theta}$$ #### 向心加速度 [恒星日](https://en.wikipedia.org/wiki/Sidereal_time)时长为 $T=86164.0905$ 秒 向心加速度与地心纬度相关 $$a_c = \Omega^2 r = \left(\frac{2\pi}{T}\right)^2\cdot r = a\cdot \left(\frac{2\pi}{T}\right)^2\cdot \cos\theta$$ ================================================ FILE: prototype/core/positioning/latitude/series_model.py ================================================ from . import constants import numpy as np np.set_printoptions(precision=15) cnt = 10001 geodetic_latitudes = np.linspace(-90, 90, cnt) def get_geocentric_latitude(geodetic_latitude_in_rad): tan_theta = (1 - constants.f) ** 2 * np.tan(geodetic_latitude_in_rad) return np.arctan(tan_theta) def get_astronomic_latitude(geocentric_latitude_in_rad): ## 地心纬度的自转半径 centripetal_radius_at_geocentric_latitude = constants.a * np.cos( geocentric_latitude_in_rad ) ## 自转向心力加速度 centripetal_acc_at_geocentric_latitude = ( constants.OMEGA**2 * centripetal_radius_at_geocentric_latitude ) ## 地心纬度的半径的平方 squared_geocentric_radius_at_geocentric_latitude = ( constants.a**2 * np.cos(geocentric_latitude_in_rad) ** 2 + constants.b**2 * np.sin(geocentric_latitude_in_rad) ** 2 ) ## 两极的万有引力的加速度,没有自转加速度 # g_p = G * M_earth / b ** 2 ## 地心纬度的万有引力的加速度 # g = G * M_earth / R ** 2 ## 所以地心纬度的万有引力的加速度 ## g = g_p * b ** 2 / R ** 2 g_at_geocentric_latitude = ( constants.g_p * constants.b**2 / squared_geocentric_radius_at_geocentric_latitude ) ## 使用直角坐标系的向量来记录万有引力的加速度和自转向心力 ## 地理位置假设在 xz 平面上,且 x 为正 centripetal_force_acc = np.array([-centripetal_acc_at_geocentric_latitude, 0, 0]) gravitation_acc = np.array( [ -g_at_geocentric_latitude * np.cos(geocentric_latitude_in_rad), 0, -g_at_geocentric_latitude * np.sin(geocentric_latitude_in_rad), ] ) ## 重力的向量 gravity_acc = gravitation_acc - centripetal_force_acc ## 天文纬度 astronomic_latitude_in_rad = np.arctan2(-gravity_acc[2], -gravity_acc[0]) return astronomic_latitude_in_rad geocentric_latitudes = [] astronomic_latitudes = [] for geodetic_latitude in geodetic_latitudes: geocentric_latitude = get_geocentric_latitude(np.deg2rad(geodetic_latitude)) astronomic_latitude_in_rad = get_astronomic_latitude(geocentric_latitude) astronomic_latitude = np.rad2deg(astronomic_latitude_in_rad) astronomic_latitudes.append(astronomic_latitude) geocentric_latitudes.append(np.rad2deg(geocentric_latitude)) A = np.zeros((cnt, 5)) for i in range(5): A[:, i] = np.sin(2 * (i + 1) * np.deg2rad(astronomic_latitudes)) B = np.array(np.deg2rad(geodetic_latitudes)) - np.array( np.deg2rad(astronomic_latitudes) ) A_inv = np.linalg.pinv(A) x = A_inv @ B print(x.tolist()) ================================================ FILE: prototype/core/positioning/locator/README.md ================================================ # 定位计算误差测试框架 ## 算法原形 使用 python 来测试地理定位算法的误差。提供相机坐标系下的焦距、各星矢量、灭点矢量、各星参考时角&赤纬。各星矢量、灭点矢量含一定噪声,焦距、各星参考时角&赤纬不含噪声。需要计算真实的地理坐标。 ## 排行榜 ### 无畸变 **参数**: ```python args.num_points = 5 # 点的数量 args.num_tests = 1000 # 测试次数 args.scope_x = (-1000, 1000) args.scope_y = (-2000, -1000) args.z = 3000 # 焦距 args.k1 = 0 # 畸变系数k1 args.k2 = 0 # 畸变系数k2 args.noise_std = 1 # 高斯噪声标准差 ``` |排名|方法|平均误差|95%置信区间| |---|---|---|---| | 1 | [bi_median](methods/bi_median.py) | 7.145 | (6.673, 7.617) | | 2 | [matrix_inverse](methods/matrix_inverse.py) | 10.180 | (9.557, 10.802) | ### 有畸变 **参数**: ```python args.num_points = 5 # 点的数量 args.num_tests = 1000 # 测试次数 args.scope_x = (-1000, 1000) args.scope_y = (-2000, -1000) args.z = 3000 # 焦距 args.k1 = 1e-8 # 畸变系数k1 args.k2 = 1e-16 # 畸变系数k2 args.noise_std = 1 # 高斯噪声标准差 ``` |排名|方法|平均误差|95%置信区间| |---|---|---|---| | 1 | [bi_median](methods/bi_median.py) | 118.253 | (111.179, 125.327) | | 2 | [matrix_inverse](methods/matrix_inverse.py) | 119.923 | (112.895, 126.951) | ## 使用方法 1. 在`core`目录下运行 ```bash python -m positioning.locator.benchmark ``` ## 贡献方法 1. 在 `methods` 目录下新建一个文件,实现一个算法。 需实现一个函数`get_geo`,接受一个字典`data`,其中包含:points为一个(n, 3)的数组,表示各星矢量;top_point为一个(3,)的数组,表示灭点矢量;hour_decs为一个(n, 2)的数组,表示各点的参考时角&赤纬;z是一个浮点数,表示焦距。所有矢量皆已归一化。该函数需返回一个(2,),分别表示地理坐标的经度($[-\pi,\pi]$)、纬度($[-\frac{\pi}{2},\frac{\pi}{2}]$)。 2. 在 `benchmark.py` 的`methods`列表中添加你的方法。 3. 运行 `python benchmark.py` 来测试你的方法,误差将以**球面距离(km)**显示。 ================================================ FILE: prototype/core/positioning/locator/benchmark.py ================================================ import argparse from copy import deepcopy import numpy as np import scipy.stats as st from .methods.bi_median import get_geo as bi_median from .methods.matrix_inverse import get_geo as matrix_inverse from .utils.math import cart2sph, sph_dist def generate_datas(args): num_points = args.num_points scope_x = args.scope_x scope_y = args.scope_y ## 生成星点矢量 points = [] for i in range(num_points): ## 生成一个参考点 points_x = np.random.uniform(*scope_x) points_y = np.random.uniform(*scope_y) points.append([points_x, points_y, -args.z]) points = np.array(points) ## 根据一个随机的北天极、一个随机的(0N,0E)轴,生成参考时角&赤纬 ## 生成一个随机的北天极 z_pole = np.random.uniform(-1, 1, 3) z_pole /= np.linalg.norm(z_pole) ## 生成一个随机的(0N,0E)轴,与北天极正交 x_pole = np.random.uniform(-1, 1, 3) x_pole = x_pole - np.dot(x_pole, z_pole) * z_pole x_pole /= np.linalg.norm(x_pole) ## 生成一个随机的(0N,90E)轴,与北天极正交 y_pole = np.cross(z_pole, x_pole) ## 生成随机灭点矢量 top_point = np.random.uniform(-1, 1, 3) top_point = top_point * -args.z / top_point[2] ## 生成参考时角&赤纬,以及真实地理坐标 A = np.array([x_pole, y_pole, z_pole]).T b = np.concatenate([top_point[:, None], points.T], axis=1) x = np.linalg.solve(A, b).T geo_cart = x[0] points_cart = x[1:] geo = np.array(cart2sph(*geo_cart)[:2]) hour_decs = np.array([cart2sph(*point)[:2] for point in points_cart]) ## 施加径向畸变 if args.k1 is not None and args.k2 is not None: points = destort(points, args.k1, args.k2, args.scope_x, args.scope_y) top_point = destort( top_point.reshape(1, -1), args.k1, args.k2, args.scope_x, args.scope_y ).reshape(-1) ## 加入高斯噪声 points += np.random.normal(0, args.noise_std, points.shape) top_point += np.random.normal(0, args.noise_std, top_point.shape) ## 归一化 points /= np.linalg.norm(points, axis=1).reshape(-1, 1) top_point /= np.linalg.norm(top_point) return ( { "points": points, "top_point": top_point, "hour_decs": hour_decs, "z": args.z, }, geo, ) def destort(points_3d, k1, k2, scope_x, scope_y): """ 施加径向畸变 params: points_3d: np.array, shape=(n, 3), 2D points k1: float, radial distortion coefficient k2: float, tangential distortion coefficient scope_x: tuple, x scope scope_y: tuple, y scope return: points: np.array, shape=(n, 3), 2D points """ points_2d = points_3d[:, :2] z = points_3d[:, 2] center = np.array([scope_x[0] + scope_x[1], scope_y[0] + scope_y[1]]) / 2 points_relative = points_2d - center r = np.hypot(points_relative[:, 0], points_relative[:, 1]).reshape(-1, 1) points_relative *= 1 + k1 * r**2 + k2 * r**4 points_2d = points_relative + center points_3d = np.concatenate([points_2d, z.reshape(-1, 1)], axis=1) return points_3d def print_results(results): ## 输出结果 for name, result in results.items(): print("Method:", name) error = np.array(result["error"]) # print('Mean error:', np.mean(error), 'Std:', np.std(error, ddof=1)) print( "\tMean error:", np.mean(error), "Interval:", st.t.interval( 0.95, len(error) - 1, loc=np.mean(error), scale=st.sem(error) ), ) ## 输出markdown表格 print("|排名|方法|平均误差|95%置信区间|") print("|---|---|---|---|") results = dict( sorted(results.items(), key=lambda x: np.mean(x[1]["error"]), reverse=False) ) # 误差从小到大 for i, (name, result) in enumerate(results.items()): error = np.array(result["error"]) mean_error = np.mean(error) interval = st.t.interval( 0.95, len(error) - 1, loc=mean_error, scale=st.sem(error) ) print( "|", i + 1, "|", f"[{name}](methods/{name}.py)", "|", f"{mean_error:.3f}", "|", f"({interval[0]:.3f}, {interval[1]:.3f})", "|", ) def main(methods, args): results = {} for name in methods.keys(): results[name] = {"error": []} for _ in range(args.num_tests): ## 生成数据 datas, real_geo = generate_datas(args) for name, method in methods.items(): ## 计算地理坐标 geo = method(deepcopy(datas)) ## 计算误差,使用球面距离表示 results[name]["error"].append(sph_dist(*geo, *real_geo) * 6371.939) ## 排序 results = dict( sorted(results.items(), key=lambda x: np.mean(x[1]["error"]), reverse=True) ) ## 输出结果 print_results(results) if __name__ == "__main__": args = argparse.ArgumentParser() args.num_points = 5 # 点的数量 args.num_tests = 1000 # 测试次数 args.scope_x = (-1000, 1000) args.scope_y = (-2000, -1000) args.z = 3000 # 焦距 args.k1 = 1e-9 # 畸变系数k1 args.k2 = 1e-18 # 畸变系数k2 args.noise_std = 1 # 高斯噪声标准差 ## 检测是否有效范围 assert args.scope_x[0] < args.scope_x[1] assert args.scope_y[0] < args.scope_y[1] ## 定义所需评测的方法 methods = { "matrix_inverse": matrix_inverse, "bi_median": bi_median, } main(methods, args) ================================================ FILE: prototype/core/positioning/locator/methods/__init__.py ================================================ ================================================ FILE: prototype/core/positioning/locator/methods/bi_median.py ================================================ import numpy as np import astronomy as ast from ..utils.math import cart2sph, sph2cart, vector_angle def get_geo(data: dict, is_fix_refraction: bool = False) -> np.ndarray: """ Find the geographical position. params: datas: a dict including: points: (n, 3), star points top_point: (3,) top point hour_decs: (n, 2), hour angle and declination z: (1,), focal length is_fix_refraction: whether to fix refraction return: geo: (2,), geographical position about longitude and latitude """ ## 获取数据 points = data["points"] top_point = data["top_point"] n_points = len(points) data["n_points"] = n_points ## 计算各星天顶角余弦值 cos_theta = points @ top_point if is_fix_refraction: star_altitudes = 90 - np.rad2deg(np.acos(cos_theta)) # 高度角(角度) real_star_altitudes = np.deg2rad( np.array( [ angle + ast.InverseRefractionAngle(ast.Refraction.Normal, angle) for angle in star_altitudes ] ) ) # 去折射的高度角(弧度) cos_theta = np.cos(np.pi / 2 - real_star_altitudes) data["cos_theta"] = cos_theta ## 每双星计算得出双解 crude_positions = [] for i in range(n_points): for j in range(i + 1, n_points): # 忽略sqrt负数的警告 with np.errstate(invalid="ignore"): results = dual_star_positioning(data, i, j) if ( np.isnan(results[0]).any() == False and np.isnan(results[1]).any() == False ): crude_positions.append(results) ## 检查是否有解 if len(crude_positions) == 0: raise Exception("无解") ## 加权平均 geo = square_median_average(crude_positions, data) return geo def dual_star_positioning(data: dict, i: int, j: int) -> list[list[float]]: """ 根据双星计算地理坐标,返回双解 """ plane1 = get_plane(data, i) plane2 = get_plane(data, j) ## 计算两平面与圆的两交点 return get_plane_intersection(plane1, plane2) def get_plane(data: dict, i: int) -> np.ndarray: """ 根据星点计算平面方程 """ cos_theta = data["cos_theta"][i] hour_angle = data["hour_decs"][i][0] declination = data["hour_decs"][i][1] a = cos_theta * np.cos(hour_angle) * np.cos(declination) b = np.sin(hour_angle) * cos_theta * np.cos(declination) c = np.sin(declination) * cos_theta d = cos_theta**2 return np.array([a, b, c, d]) def get_plane_intersection(plane1: np.ndarray, plane2: np.ndarray) -> list[list[float]]: """ 计算两平面交点 """ A1, B1, C1, D1 = plane1 A2, B2, C2, D2 = plane2 x1 = ( -A1 * B1 * B2 * D2 + A1 * B2**2 * D1 - A1 * C1 * C2 * D2 + A1 * C2**2 * D1 + A2 * B1**2 * D2 - A2 * B1 * B2 * D1 + A2 * C1**2 * D2 - A2 * C1 * C2 * D1 - B1 * C2 * np.sqrt( A1**2 * B2**2 + A1**2 * C2**2 - A1**2 * D2**2 - 2 * A1 * A2 * B1 * B2 - 2 * A1 * A2 * C1 * C2 + 2 * A1 * A2 * D1 * D2 + A2**2 * B1**2 + A2**2 * C1**2 - A2**2 * D1**2 + B1**2 * C2**2 - B1**2 * D2**2 - 2 * B1 * B2 * C1 * C2 + 2 * B1 * B2 * D1 * D2 + B2**2 * C1**2 - B2**2 * D1**2 - C1**2 * D2**2 + 2 * C1 * C2 * D1 * D2 - C2**2 * D1**2 ) + B2 * C1 * np.sqrt( A1**2 * B2**2 + A1**2 * C2**2 - A1**2 * D2**2 - 2 * A1 * A2 * B1 * B2 - 2 * A1 * A2 * C1 * C2 + 2 * A1 * A2 * D1 * D2 + A2**2 * B1**2 + A2**2 * C1**2 - A2**2 * D1**2 + B1**2 * C2**2 - B1**2 * D2**2 - 2 * B1 * B2 * C1 * C2 + 2 * B1 * B2 * D1 * D2 + B2**2 * C1**2 - B2**2 * D1**2 - C1**2 * D2**2 + 2 * C1 * C2 * D1 * D2 - C2**2 * D1**2 ) ) / ( A1**2 * B2**2 + A1**2 * C2**2 - 2 * A1 * A2 * B1 * B2 - 2 * A1 * A2 * C1 * C2 + A2**2 * B1**2 + A2**2 * C1**2 + B1**2 * C2**2 - 2 * B1 * B2 * C1 * C2 + B2**2 * C1**2 ) y1 = ( A1**2 * B2 * D2 - A1 * A2 * B1 * D2 - A1 * A2 * B2 * D1 + A1 * C2 * np.sqrt( A1**2 * B2**2 + A1**2 * C2**2 - A1**2 * D2**2 - 2 * A1 * A2 * B1 * B2 - 2 * A1 * A2 * C1 * C2 + 2 * A1 * A2 * D1 * D2 + A2**2 * B1**2 + A2**2 * C1**2 - A2**2 * D1**2 + B1**2 * C2**2 - B1**2 * D2**2 - 2 * B1 * B2 * C1 * C2 + 2 * B1 * B2 * D1 * D2 + B2**2 * C1**2 - B2**2 * D1**2 - C1**2 * D2**2 + 2 * C1 * C2 * D1 * D2 - C2**2 * D1**2 ) + A2**2 * B1 * D1 - A2 * C1 * np.sqrt( A1**2 * B2**2 + A1**2 * C2**2 - A1**2 * D2**2 - 2 * A1 * A2 * B1 * B2 - 2 * A1 * A2 * C1 * C2 + 2 * A1 * A2 * D1 * D2 + A2**2 * B1**2 + A2**2 * C1**2 - A2**2 * D1**2 + B1**2 * C2**2 - B1**2 * D2**2 - 2 * B1 * B2 * C1 * C2 + 2 * B1 * B2 * D1 * D2 + B2**2 * C1**2 - B2**2 * D1**2 - C1**2 * D2**2 + 2 * C1 * C2 * D1 * D2 - C2**2 * D1**2 ) - B1 * C1 * C2 * D2 + B1 * C2**2 * D1 + B2 * C1**2 * D2 - B2 * C1 * C2 * D1 ) / ( A1**2 * B2**2 + A1**2 * C2**2 - 2 * A1 * A2 * B1 * B2 - 2 * A1 * A2 * C1 * C2 + A2**2 * B1**2 + A2**2 * C1**2 + B1**2 * C2**2 - 2 * B1 * B2 * C1 * C2 + B2**2 * C1**2 ) z1 = ( -(A1 * B2 - A2 * B1) * np.sqrt( A1**2 * B2**2 + A1**2 * C2**2 - A1**2 * D2**2 - 2 * A1 * A2 * B1 * B2 - 2 * A1 * A2 * C1 * C2 + 2 * A1 * A2 * D1 * D2 + A2**2 * B1**2 + A2**2 * C1**2 - A2**2 * D1**2 + B1**2 * C2**2 - B1**2 * D2**2 - 2 * B1 * B2 * C1 * C2 + 2 * B1 * B2 * D1 * D2 + B2**2 * C1**2 - B2**2 * D1**2 - C1**2 * D2**2 + 2 * C1 * C2 * D1 * D2 - C2**2 * D1**2 ) ) / ( A1**2 * B2**2 + A1**2 * C2**2 - 2 * A1 * A2 * B1 * B2 - 2 * A1 * A2 * C1 * C2 + A2**2 * B1**2 + A2**2 * C1**2 + B1**2 * C2**2 - 2 * B1 * B2 * C1 * C2 + B2**2 * C1**2 ) + ( A1**2 * C2 * D2 - A1 * A2 * C1 * D2 - A1 * A2 * C2 * D1 + A2**2 * C1 * D1 + B1**2 * C2 * D2 - B1 * B2 * C1 * D2 - B1 * B2 * C2 * D1 + B2**2 * C1 * D1 ) / ( A1**2 * B2**2 + A1**2 * C2**2 - 2 * A1 * A2 * B1 * B2 - 2 * A1 * A2 * C1 * C2 + A2**2 * B1**2 + A2**2 * C1**2 + B1**2 * C2**2 - 2 * B1 * B2 * C1 * C2 + B2**2 * C1**2 ) x2 = ( -A1 * B1 * B2 * D2 + A1 * B2**2 * D1 - A1 * C1 * C2 * D2 + A1 * C2**2 * D1 + A2 * B1**2 * D2 - A2 * B1 * B2 * D1 + A2 * C1**2 * D2 - A2 * C1 * C2 * D1 + B1 * C2 * np.sqrt( A1**2 * B2**2 + A1**2 * C2**2 - A1**2 * D2**2 - 2 * A1 * A2 * B1 * B2 - 2 * A1 * A2 * C1 * C2 + 2 * A1 * A2 * D1 * D2 + A2**2 * B1**2 + A2**2 * C1**2 - A2**2 * D1**2 + B1**2 * C2**2 - B1**2 * D2**2 - 2 * B1 * B2 * C1 * C2 + 2 * B1 * B2 * D1 * D2 + B2**2 * C1**2 - B2**2 * D1**2 - C1**2 * D2**2 + 2 * C1 * C2 * D1 * D2 - C2**2 * D1**2 ) - B2 * C1 * np.sqrt( A1**2 * B2**2 + A1**2 * C2**2 - A1**2 * D2**2 - 2 * A1 * A2 * B1 * B2 - 2 * A1 * A2 * C1 * C2 + 2 * A1 * A2 * D1 * D2 + A2**2 * B1**2 + A2**2 * C1**2 - A2**2 * D1**2 + B1**2 * C2**2 - B1**2 * D2**2 - 2 * B1 * B2 * C1 * C2 + 2 * B1 * B2 * D1 * D2 + B2**2 * C1**2 - B2**2 * D1**2 - C1**2 * D2**2 + 2 * C1 * C2 * D1 * D2 - C2**2 * D1**2 ) ) / ( A1**2 * B2**2 + A1**2 * C2**2 - 2 * A1 * A2 * B1 * B2 - 2 * A1 * A2 * C1 * C2 + A2**2 * B1**2 + A2**2 * C1**2 + B1**2 * C2**2 - 2 * B1 * B2 * C1 * C2 + B2**2 * C1**2 ) y2 = ( A1**2 * B2 * D2 - A1 * A2 * B1 * D2 - A1 * A2 * B2 * D1 - A1 * C2 * np.sqrt( A1**2 * B2**2 + A1**2 * C2**2 - A1**2 * D2**2 - 2 * A1 * A2 * B1 * B2 - 2 * A1 * A2 * C1 * C2 + 2 * A1 * A2 * D1 * D2 + A2**2 * B1**2 + A2**2 * C1**2 - A2**2 * D1**2 + B1**2 * C2**2 - B1**2 * D2**2 - 2 * B1 * B2 * C1 * C2 + 2 * B1 * B2 * D1 * D2 + B2**2 * C1**2 - B2**2 * D1**2 - C1**2 * D2**2 + 2 * C1 * C2 * D1 * D2 - C2**2 * D1**2 ) + A2**2 * B1 * D1 + A2 * C1 * np.sqrt( A1**2 * B2**2 + A1**2 * C2**2 - A1**2 * D2**2 - 2 * A1 * A2 * B1 * B2 - 2 * A1 * A2 * C1 * C2 + 2 * A1 * A2 * D1 * D2 + A2**2 * B1**2 + A2**2 * C1**2 - A2**2 * D1**2 + B1**2 * C2**2 - B1**2 * D2**2 - 2 * B1 * B2 * C1 * C2 + 2 * B1 * B2 * D1 * D2 + B2**2 * C1**2 - B2**2 * D1**2 - C1**2 * D2**2 + 2 * C1 * C2 * D1 * D2 - C2**2 * D1**2 ) - B1 * C1 * C2 * D2 + B1 * C2**2 * D1 + B2 * C1**2 * D2 - B2 * C1 * C2 * D1 ) / ( A1**2 * B2**2 + A1**2 * C2**2 - 2 * A1 * A2 * B1 * B2 - 2 * A1 * A2 * C1 * C2 + A2**2 * B1**2 + A2**2 * C1**2 + B1**2 * C2**2 - 2 * B1 * B2 * C1 * C2 + B2**2 * C1**2 ) z2 = ( (A1 * B2 - A2 * B1) * np.sqrt( A1**2 * B2**2 + A1**2 * C2**2 - A1**2 * D2**2 - 2 * A1 * A2 * B1 * B2 - 2 * A1 * A2 * C1 * C2 + 2 * A1 * A2 * D1 * D2 + A2**2 * B1**2 + A2**2 * C1**2 - A2**2 * D1**2 + B1**2 * C2**2 - B1**2 * D2**2 - 2 * B1 * B2 * C1 * C2 + 2 * B1 * B2 * D1 * D2 + B2**2 * C1**2 - B2**2 * D1**2 - C1**2 * D2**2 + 2 * C1 * C2 * D1 * D2 - C2**2 * D1**2 ) ) / ( A1**2 * B2**2 + A1**2 * C2**2 - 2 * A1 * A2 * B1 * B2 - 2 * A1 * A2 * C1 * C2 + A2**2 * B1**2 + A2**2 * C1**2 + B1**2 * C2**2 - 2 * B1 * B2 * C1 * C2 + B2**2 * C1**2 ) + ( A1**2 * C2 * D2 - A1 * A2 * C1 * D2 - A1 * A2 * C2 * D1 + A2**2 * C1 * D1 + B1**2 * C2 * D2 - B1 * B2 * C1 * D2 - B1 * B2 * C2 * D1 + B2**2 * C1 * D1 ) / ( A1**2 * B2**2 + A1**2 * C2**2 - 2 * A1 * A2 * B1 * B2 - 2 * A1 * A2 * C1 * C2 + A2**2 * B1**2 + A2**2 * C1**2 + B1**2 * C2**2 - 2 * B1 * B2 * C1 * C2 + B2**2 * C1**2 ) solve1 = cart2sph(x1, y1, z1) solve2 = cart2sph(x2, y2, z2) return [ [solve1[0], solve1[1]], [solve2[0], solve2[1]], ] # 先经度后纬度 def square_median_average(crude_positions: list[np.ndarray], data: dict) -> np.ndarray: """ 计算加权平均 """ def evaluate(pos: np.ndarray) -> float: """ 评估解的合理性 """ sum = 0 for i in range(data["n_points"]): ## 计算该位置的实际天顶角 angle = vector_angle( np.array(sph2cart(*data["hour_decs"][i])), np.array(sph2cart(pos[0], pos[1], 1)), ) diff = angle - np.arccos(data["cos_theta"][i]) sum += diff**2 return 1 / sum # 评估,保留一对解中的正确的位置和评估值 positions = [] avg_position = [] for pair in crude_positions: s1 = evaluate(pair[0]) s2 = evaluate(pair[1]) true_pair = pair[0] if s1 > s2 else pair[1] positions.append(true_pair) true_pair = sph2cart(true_pair[0], true_pair[1], 1) avg_position.append(true_pair) # 计算平均向量 avg_position = np.array(avg_position) avg_position = np.mean(avg_position, axis=0) # 根据平均值消除经纬度的周期性,防止中位数在0经线附近计算错误 positions2 = [] for pos in positions: lon = adjust_angle(pos[0], avg_position[0]) lat = adjust_angle(pos[1], avg_position[1]) positions2.append([lon, lat]) positions2 = np.array(positions2) # 求positions中位数,相比于平均值,中位数鲁棒性更好 median_geo = np.median(positions2, axis=0) return median_geo def adjust_angle(angle: float, avg_angle: float) -> float: if angle - avg_angle > 180: return angle - 360 elif angle - avg_angle < -180: return angle + 360 else: return angle ================================================ FILE: prototype/core/positioning/locator/methods/matrix_inverse.py ================================================ import numpy as np from ..utils.math import cart2sph, sph2cart def get_geo(data: dict): """ Find the geographical position. params: datas: a dict including: points: (n, 3), star points top_point: (3,) top point hour_decs: (n, 2), hour angle and declination z: (1,), focal length return: geo: (2,), geographical position about longitude and latitude """ ## 获取数据 points = data["points"] top_point = data["top_point"] hour_decs = data["hour_decs"] ## 计算各星天顶角余弦值 cos_theta = points @ top_point ## 将星参考时角&赤纬转换为直角坐标 hour_decs_cart = np.array([sph2cart(*hour_de) for hour_de in hour_decs]) ## 使用伪逆求解地理坐标 geo_cart = np.linalg.pinv(hour_decs_cart) @ cos_theta ## 转换为球坐标 geo = np.array(cart2sph(*geo_cart)[:2]) return geo ================================================ FILE: prototype/core/positioning/locator/utils/math.py ================================================ import numpy as np def vector_angle(vec1: np.ndarray, vec2: np.ndarray) -> np.ndarray: cos_theta = np.dot(vec1, vec2.T) / ( np.linalg.norm(vec1, axis=-1) * np.linalg.norm(vec2, axis=-1) ) cos_theta = np.clip(cos_theta, -1, 1) return np.arccos(cos_theta) def cart2sph(x: float, y: float, z: float) -> tuple: hxy = np.hypot(x, y) r = np.hypot(hxy, z) elev = np.arctan2(z, hxy) # for elevation angle defined from Z-axis down az = np.arctan2(y, x) return az, elev, r def sph2cart(az: float, elev: float, r: float = 1) -> tuple: rcos_theta = r * np.cos(elev) x = rcos_theta * np.cos(az) y = rcos_theta * np.sin(az) z = r * np.sin(elev) return x, y, z def sph_dist( az1: np.ndarray, elev1: np.ndarray, az2: np.ndarray, elev2: np.ndarray, unit: str = "rad", ) -> np.ndarray: if unit == "deg": az1 = np.deg2rad(az1) elev1 = np.deg2rad(elev1) az2 = np.deg2rad(az2) elev2 = np.deg2rad(elev2) result = np.arccos( np.sin(elev1) * np.sin(elev2) + np.cos(elev1) * np.cos(elev2) * np.cos(az1 - az2) ) if unit == "deg": result = np.rad2deg(result) return result ================================================ FILE: prototype/core/positioning/top_point/README.md ================================================ # 灭点计算误差测试框架 ## 算法原形 使用 python 来进行一组直线交点算法的验证。所提供的直线实际上交于一点,每条直线由两个端点坐标表示,含一定噪声,需要计算它们的真实交点。 ## 排行榜 ### 无畸变 **参数**: ```python args.num_lines = 10 # 线的数量 args.num_tests = 100 # 测试次数 args.scope_x = (-300, 300) args.scope_y = (-2000, -1000) args.alpha = 0.2 # 0~1,越大时两点的距离越接近 args.k1 = 0 # 畸变系数 args.k2 = 0 # 畸变系数 args.noise_std = 1 # 高斯噪声标准差 ``` | 排名 | 方法 | 平均误差 | 95%置信区间 | |----|-------------------------------------------------------------------|--------|------------------| | 1 | [matrix_inverse_normalized](methods/matrix_inverse_normalized.py) | 3.953 | (3.831, 4.076) | | 2 | [matrix_inverse](methods/matrix_inverse.py) | 8.022 | (7.807, 8.237) | | 3 | [sphere](methods/sphere.py) | 8.025 | (7.810, 8.240) | | 4 | [median2](methods/median2.py) | 9.375 | (9.114, 9.635) | | 5 | [median](methods/median.py) | 9.548 | (9.283, 9.812) | | 6 | [least_square](methods/least_square.py) | 11.964 | (11.057, 12.872) | ### 有畸变 **参数**: ```python args.num_lines = 10 # 线的数量 args.num_tests = 3000 # 测试次数 args.scope_x = (-300, 300) args.scope_y = (-2000, -1000) args.alpha = 0.2 # 0~1,越大时两点的距离越接近 args.k1 = 1e-7 # 畸变系数 args.k2 = 1e-14 # 畸变系数 args.noise_std = 1 # 高斯噪声标准差 ``` | 排名 | 方法 | 平均误差 | 95%置信区间 | |----|-------------------------------------------------------------------|--------|------------------| | 1 | [matrix_inverse_normalized](methods/matrix_inverse_normalized.py) | 10.628 | (10.226, 11.030) | | 2 | [matrix_inverse](methods/matrix_inverse.py) | 37.666 | (37.043, 38.289) | | 3 | [sphere](methods/sphere.py) | 37.699 | (37.076, 38.323) | | 4 | [median2](methods/median2.py) | 47.518 | (46.607, 48.430) | | 5 | [median](methods/median.py) | 50.080 | (49.129, 51.031) | | 6 | [least_square](methods/least_square.py) | 62.304 | (61.098, 63.511) | ## 使用方法 1. 在`core`目录下运行 ```bash python -m positioning.top_point.benchmark ``` ## 贡献方法 1. 在 `methods` 目录下新建一个文件,实现一个算法。 需实现一个函数`intersection`,接受一个`numpy.ndarray`的`shape=(n, 2, 2)`的直线两点数组,返回一个`numpy.ndarray`的`shape=(2,)`的交点坐标数组。 2. 在 `benchmark.py` 的`methods`列表中添加你的方法。 3. 运行 `python benchmark.py` 来测试你的方法。 ================================================ FILE: prototype/core/positioning/top_point/__init__.py ================================================ ================================================ FILE: prototype/core/positioning/top_point/benchmark.py ================================================ import argparse import numpy as np import scipy.stats as st from .methods.least_square import intersection as least_square from .methods.matrix_inverse import intersection as matrix_inverse from .methods.median import intersection as median from .methods.median2 import intersection as median2 from .methods.nearest_l2 import intersection as nearest_l2 from .methods.optim import intersection as optim from .methods.sphere import intersection as sphere from .methods.square_weight import intersection as square_weight from .methods.matrix_inverse_normalized import intersection as matrix_inverse_normalized def generate_lines(args): # 实际的灭点就在原点上 num_lines = args.num_lines scope_x = args.scope_x scope_y = args.scope_y alpha = args.alpha ## 生成线的两点 lines = [] for i in range(num_lines): ## 生成一个参考点 x0 = 0 while np.abs(x0) < 1e-2: x0 = np.random.uniform(*scope_x) y0 = 0 while np.abs(y0) < 1e-2: y0 = np.random.uniform(*scope_y) ## 生成范围 if y0 / x0 > 0: limit_x1 = np.max((scope_x[0], scope_y[0] / y0 * x0)) limit_x2 = np.min((scope_x[1], scope_y[1] / y0 * x0)) else: limit_x1 = np.max((scope_x[0], scope_y[1] / y0 * x0)) limit_x2 = np.min((scope_x[1], scope_y[0] / y0 * x0)) ## 生成两个点 rand = np.random.random() * alpha + (1 - alpha) x1 = rand * limit_x1 + (1 - rand) * limit_x2 y1 = y0 / x0 * x1 rand = np.random.random() * alpha + (1 - alpha) x2 = rand * limit_x2 + (1 - rand) * limit_x1 y2 = y0 / x0 * x2 lines.append(((x1, y1), (x2, y2))) lines = np.array(lines, dtype=np.float32) ## 施加径向畸变 if args.k1 is not None and args.k2 is not None: lines = destort(lines, args.k1, args.k2, args.scope_x, args.scope_y) ## 加入高斯噪声 lines += np.random.normal(0, args.noise_std, lines.shape) return lines def destort(lines, k1, k2, scope_x, scope_y): """ 施加径向畸变 params: lines: numpy array, each row contains two points. [((x1, y1), (x2, y2)), ...] k1: float, radial distortion coefficient k2: float, tangential distortion coefficient scope_x: tuple, x scope scope_y: tuple, y scope return: lines: numpy array, each row contains two points. [((x1, y1), (x2, y2)), ...] """ lines = lines.reshape(-1, 2) center = np.array([scope_x[0] + scope_x[1], scope_y[0] + scope_y[1]]) / 2 lines_relative = lines - center r = np.hypot(lines_relative[:, 0], lines_relative[:, 1]).reshape(-1, 1) lines_relative *= 1 + k1 * r**2 + k2 * r**4 lines = lines_relative + center lines = lines.reshape(-1, 2, 2) return lines def print_results(results): ## 输出结果 for name, result in results.items(): print("Method:", name) error = np.array(result["error"]) error_x = np.array(result["error_x"]) error_y = np.array(result["error_y"]) # print('Mean error:', np.mean(error), 'Std:', np.std(error, ddof=1)) print( "\tMean error:", np.mean(error), "Interval:", st.t.interval( 0.95, len(error) - 1, loc=np.mean(error), scale=st.sem(error) ), ) print( "\t\tMean error_x:", np.mean(error_x), "Interval:", st.t.interval( 0.95, len(error_x) - 1, loc=np.mean(error_x), scale=st.sem(error_x) ), ) print( "\t\tMean error_y:", np.mean(error_y), "Interval:", st.t.interval( 0.95, len(error_y) - 1, loc=np.mean(error_y), scale=st.sem(error_y) ), ) ## 输出markdown表格 print("|排名|方法|平均误差|95%置信区间|") print("|---|---|---|---|") results = dict( sorted(results.items(), key=lambda x: np.mean(x[1]["error"]), reverse=False) ) # 误差从小到大 for i, (name, result) in enumerate(results.items()): error = np.array(result["error"]) mean_error = np.mean(error) interval = st.t.interval( 0.95, len(error) - 1, loc=mean_error, scale=st.sem(error) ) print( "|", i + 1, "|", f"[{name}](methods/{name}.py)", "|", f"{mean_error:.3f}", "|", f"({interval[0]:.3f}, {interval[1]:.3f})", "|", ) def main(methods, args): results = {} for name in methods.keys(): results[name] = {"error": [], "error_x": [], "error_y": []} for _ in range(args.num_tests): ## 生成线的两点 lines = generate_lines(args) for name, method in methods.items(): ## 计算灭点 point = method(lines.copy()) ## 计算误差 results[name]["error"].append(np.hypot(*point)) results[name]["error_x"].append(point[0]) results[name]["error_y"].append(point[1]) ## 排序 results = dict( sorted(results.items(), key=lambda x: np.mean(x[1]["error"]), reverse=True) ) ## 输出结果 print_results(results) if __name__ == "__main__": args = argparse.ArgumentParser() args.num_lines = 10 # 线的数量 args.num_tests = 3000 # 测试次数 args.scope_x = (-300, 300) args.scope_y = (-2000, -1000) args.alpha = 0.2 # 0~1,越大时两点的距离越接近 args.k1 = 1e-7 # 畸变系数 args.k2 = 1e-14 # 畸变系数 args.noise_std = 1 # 高斯噪声标准差 ## 检测是否有效范围 assert args.scope_x[0] < args.scope_x[1] assert args.scope_y[0] < args.scope_y[1] ## 定义所需评测的方法 methods = { "median2": median2, "median": median, "sphere": sphere, # "square_weight": square_weight, "least_square": least_square, # "nearest_l2": nearest_l2, "matrix_inverse": matrix_inverse, # "optim": optim, "matrix_inverse_normalized": matrix_inverse_normalized, } main(methods, args) ================================================ FILE: prototype/core/positioning/top_point/experiment.py ================================================ import matplotlib.pyplot as plt import numpy as np from .methods.matrix_inverse import intersection as matrix_inverse_intersection from .methods.sphere import intersection as sphere_intersection two_lines = np.array( [ [(923, 746), (1669, 918)], [(920, 752), (1672, 921)], [(924, 761), (1685, 930)], [(924, 771), (1695, 939)], [(927, 781), (1708, 948)], [(928, 791), (1719, 954)], [(931, 801), (1732, 959)], [(932, 811), (1743, 944)], [(934, 821), (1755, 952)], [(938, 831), (1769, 958)], [(936, 842), (1778, 951)], ] ) result1 = sphere_intersection(two_lines) print(result1) result2 = matrix_inverse_intersection(two_lines) print(result2) plt.figure(figsize=(10, 10)) # 遍历每一行的线段,并绘制 for line in two_lines: point1, point2 = line plt.plot([point1[0], point2[0]], [point1[1], point2[1]], marker="o") plt.plot(result1[0], result1[1], marker="o", color="red", label="Sphere") plt.plot(result2[0], result2[1], marker="o", color="green", label="Matrix Inverse") # 添加标题和标签 plt.title("Line Segments between Points") plt.xlabel("X-axis") plt.ylabel("Y-axis") # 显示网格 plt.grid() plt.legend() # 显示绘图 plt.axis("equal") # 设置比例相等 plt.show() ================================================ FILE: prototype/core/positioning/top_point/methods/__init__.py ================================================ ================================================ FILE: prototype/core/positioning/top_point/methods/least_square.py ================================================ import numpy as np from ..utils.plane import all_points_of_lines_intersection def least_squares_fit(points): # 提取x和y坐标 x = points[:, 0] y = points[:, 1] # 计算x和y的均值 mean_x = np.mean(x) mean_y = np.mean(y) # 计算斜率k和截距b所需要的总和 numerator = np.sum((x - mean_x) * (y - mean_y)) denominator = np.sum((x - mean_x) ** 2) # 计算斜率k k = numerator / denominator # 计算截距b b = mean_y - k * mean_x return k, b def intersection(lines: list) -> tuple: """ Find the intersection point of given lines. params: lines: numpy array, each row contains two points. [((x1, y1), (x2, y2)), ...] return: intersection point (x, y) """ ## 计算每两条线的交点 points = all_points_of_lines_intersection(lines) points = np.array(points, dtype=np.float32) ## 计算直线参数abc abc_lines = [] for line in lines: x1, y1 = line[0] x2, y2 = line[1] a = y2 - y1 b = x1 - x2 c = np.cross(line[1], line[0]).item() if np.abs(a) < 1e-5: continue abc_lines.append((b / a, c / a)) abc_lines = np.array(abc_lines, dtype=np.float32) ## 最小二乘拟合 line_k, line_b = least_squares_fit(abc_lines) return line_k, line_b ================================================ FILE: prototype/core/positioning/top_point/methods/matrix_inverse.py ================================================ import numpy as np def intersection(lines: np.ndarray) -> np.ndarray: """ Find the intersection point of given lines. params: lines: numpy array, each row contains two points. [((x1, y1), (x2, y2)), ...] return: intersection point (x, y) """ V = lines[:, 1] - lines[:, 0] A = np.zeros_like(V) A[:, 0] = V[:, 1] A[:, 1] = -V[:, 0] lines_3d = np.dstack((lines, np.zeros((lines.shape[0], 2, 1)))) b = np.cross(lines_3d[:, 0], lines_3d[:, 1])[:, 2] A_inv = np.linalg.pinv(A) point = A_inv @ b return point ================================================ FILE: prototype/core/positioning/top_point/methods/matrix_inverse_normalized.py ================================================ import numpy as np def intersection(lines: np.ndarray) -> np.ndarray: """ 在 matrix_inverse 基础上改良:对直线方程的系数进行归一化 Find the intersection point of given lines. params: lines: numpy array, each row contains two points. [((x1, y1), (x2, y2)), ...] return: intersection point (x, y) """ V = lines[:, 1] - lines[:, 0] A = np.zeros_like(V) A[:, 0] = V[:, 1] A[:, 1] = -V[:, 0] lines_3d = np.dstack((lines, np.zeros((lines.shape[0], 2, 1)))) C = np.cross(lines_3d[:, 0], lines_3d[:, 1])[:, 2] # 对直线方程的系数进行归一化 for i in range(len(A)): a, b = A[i] c = C[i] m = a + b + c A[i] /= m C[i] /= m A_inv = np.linalg.pinv(A) point = A_inv @ C return point ================================================ FILE: prototype/core/positioning/top_point/methods/median.py ================================================ import numpy as np from ..utils.plane import all_points_of_lines_intersection def intersection(lines: list) -> tuple: """ Find the intersection point of given lines. params: lines: numpy array, each row contains two points. [((x1, y1), (x2, y2)), ...] return: intersection point (x, y) """ ## 计算每两条线的交点 points = all_points_of_lines_intersection(lines) points = np.array(points, dtype=np.float32) ## 计算中位数交点 point = np.median(points, axis=0) return point ================================================ FILE: prototype/core/positioning/top_point/methods/median2.py ================================================ import numpy as np from ..utils.plane import all_points_of_lines_intersection def intersection(lines: list) -> tuple: """ Find the intersection point of given lines. params: lines: numpy array, each row contains two points. [((x1, y1), (x2, y2)), ...] return: intersection point (x, y) """ ## 计算每两条线的交点 points = all_points_of_lines_intersection(lines) points = np.array(points, dtype=np.float32) ## 剔除2倍标准差之外的点 points = points[ np.abs(points[:, 0] - np.mean(points[:, 0])) < 2 * np.std(points[:, 0]) ] points = points[ np.abs(points[:, 1] - np.mean(points[:, 1])) < 2 * np.std(points[:, 1]) ] ## 计算中位数交点 point = np.median(points, axis=0) return point ================================================ FILE: prototype/core/positioning/top_point/methods/nearest_l2.py ================================================ import numpy as np def intersection(lines: list) -> tuple: """ Find the intersection point of given lines. params: lines: numpy array, each row contains two points. [((x1, y1), (x2, y2)), ...] return: intersection point (x, y) """ strt_points = np.zeros((lines.shape[0], 3)) strt_points[:, 0:2] = lines[:, 0] vect = lines[:, 1] - lines[:, 0] vect = vect / np.linalg.norm(vect, axis=1)[:, np.newaxis] directions = np.zeros((lines.shape[0], 3)) directions[:, 0:2] = vect n, dim = strt_points.shape G_left = np.tile(np.eye(dim), (n, 1)) G_right = np.zeros((dim * n, n)) for i in range(n): G_right[i * dim : (i + 1) * dim, i] = -directions[i, :] G = np.concatenate([G_left, G_right], axis=1) d = strt_points.reshape((-1, 1)) m = np.linalg.inv(np.dot(G.T, G)).dot(G.T).dot(d) return m[:2].flatten() # return m ================================================ FILE: prototype/core/positioning/top_point/methods/optim.py ================================================ import numpy as np from . import median from scipy.optimize import minimize def objective_function(point: tuple, lines: list) -> float: """ Objective function for optimization. params: point: tuple, (x, y) lines: numpy array, each row contains two points. [((x1, y1), (x2, y2)), ...] return: distance: float, sum of distance from point to lines """ x, y = point total_distance = 0 for line in lines: x1, y1 = line[0] x2, y2 = line[1] a = y2 - y1 b = x1 - x2 c = np.cross(line[1], line[0]).item() distance = ( np.hypot(x1 - x2, y1 - y2) * np.abs(np.dot((a, b, c), (x, y, 1))) / np.hypot(a, b) / np.hypot(x - (x1 + x2) / 2, y - (y1 + y2) / 2) ) total_distance += distance**2 return distance def intersection(lines: list) -> tuple: """ Find the intersection point of given lines. params: lines: numpy array, each row contains two points. [((x1, y1), (x2, y2)), ...] return: intersection point (x, y) """ ## 计算直线参数abc abc_lines = [] for line in lines: x1, y1 = line[0] x2, y2 = line[1] a = y2 - y1 b = x1 - x2 c = np.cross(line[1], line[0]).item() abc_lines.append((a, b, c)) abc_lines = np.array(abc_lines, dtype=np.float32) ## 优化求交点 point = median.intersection(lines) res = minimize(objective_function, point, args=lines) return res.x ================================================ FILE: prototype/core/positioning/top_point/methods/sphere.py ================================================ import numpy as np def intersection(lines: list) -> tuple: """ Find the intersection point of given lines. params: lines: numpy array, each row contains two points. [((x1, y1), (x2, y2)), ...] return: intersection point (x, y) """ ## 设置焦点 z = np.array([0, 0, -1500]) ## 计算每条线所处平面的法向量 normals = [] for line in lines: x1, y1 = line[0] x2, y2 = line[1] a = np.array([x1, y1, 0]) - z b = np.array([x2, y2, 0]) - z normal = np.cross(a, b) normals.append(normal) normals = np.array(normals, dtype=np.float32) # normals /= np.linalg.norm(normals, axis=1, keepdims=True) ## 计算灭点 ## normals * point = 0 A = normals.T @ normals ## 对A进行特征值分解,选择最小的特征值对应的特征向量 _, V = np.linalg.eig(A) point = V[:, np.argmin(np.linalg.eigvals(A))] ## 归一化 point = point * -z[2] / point[2] + z return point[:2] ================================================ FILE: prototype/core/positioning/top_point/methods/square_weight.py ================================================ import numpy as np from ..utils.plane import all_points_of_lines_intersection def intersection(lines: list) -> tuple: """ Find the intersection point of given lines. params: lines: numpy array, each row contains two points. [((x1, y1), (x2, y2)), ...] return: intersection point (x, y) """ ## 计算每两条线的交点 points = all_points_of_lines_intersection(lines) points = np.array(points, dtype=np.float32) ## 计算直线参数abc abc_lines = [] for line in lines: x1, y1 = line[0] x2, y2 = line[1] a = y2 - y1 b = x1 - x2 c = np.cross(line[1], line[0]) abc_lines.append((a, b, c)) abc_lines = np.array(abc_lines, dtype=np.float32) ## 计算每个交点到每条线的距离 weights = [] for point in points: x, y = point weight = 0 for abc in abc_lines: a, b, c = abc tmp = np.abs(np.dot(abc, np.array([x, y, 1]))) if tmp < 1e-5: continue # distance += np.abs(a*x + b*y + c) / np.sqrt(a**2 + b**2) weight += a**2 + b**2 / tmp**2 weights.append(weight) weights = np.array(weights, dtype=np.float32) ## 计算加权交点 point = np.average(points, axis=0, weights=weights) return point ================================================ FILE: prototype/core/positioning/top_point/utils/plane.py ================================================ import numpy as np def two_line_intersection_point(l1, l2): p1 = np.array(l1[0]) p2 = np.array(l1[1]) p3 = np.array(l2[0]) p4 = np.array(l2[1]) v1 = p2 - p1 v2 = p4 - p3 v3 = p3 - p1 det = v1[0] * v2[1] - v1[1] * v2[0] if det == 0: return False, np.array([0, 0]) t = (v3[0] * v2[1] - v3[1] * v2[0]) / det res = p1 + t * v1 return True, res def all_points_of_lines_intersection(lines): points = [] for i in range(len(lines)): for j in range(i + 1, len(lines)): has_intersection, intersection_point = two_line_intersection_point( lines[i], lines[j] ) if has_intersection: points.append(intersection_point) return points ================================================ FILE: prototype/core/stellarium/readme.md ================================================ ## 操作 Stellarium 并截图 1. 打开『远程控制』插件 1. 按『F2』按键 打开『设置』 2. 选择『插件』 3. 选择『远程控制』 1. 勾选该页面的『启动时加载』 2. 点击该页面的『设置』,手工设置喜欢的端口,也可以保持默认的 8090 不变 2. 在脚本中修改 `PORT` 为上一步设置的端口 3. 按『F12』按键,可以打开『脚本控制台』,开启『设置』中的 1. 『allow scripts to store screenshots to other directories』 2. 『运行脚本时关闭窗口』 脚本相关的文档 https://stellarium.org/doc/head/scripting.html ================================================ FILE: prototype/core/stellarium/screenshot.py ================================================ import os import re from datetime import datetime, timezone import httpx HOST = "http://127.0.0.1" PORT = 8090 BASE_URL = "{}:{}".format(HOST, PORT) def execute_code(code): url = "{}/api/scripts/direct".format(BASE_URL) data = {"code": code} resp = httpx.post(url, data=data) res = resp.text return res def screenshot(name, folder="./"): path = os.path.abspath(folder) SCRIPT_SCREEN_SHOT = ( 'core.wait(0.5);core.screenshot("{}",false,"{}",true,"png");'.format(name, path) ) execute_code(SCRIPT_SCREEN_SHOT) def set_location(lat, lng, alt): COMMAND_SCRIPT = "core.setObserverLocation({},{},{},0);".format(lng, lat, alt) res = execute_code(COMMAND_SCRIPT) print("设置经纬度 lat/lng/alt {}/{}/{} : {}".format(lat, lng, alt, res)) def set_time(dt: datetime): utc_time = dt.astimezone(timezone.utc) utc_time_str = utc_time.strftime("%Y-%m-%dT%H:%M:%S") COMMAND_SCRIPT = 'core.setTimeRate(0);\ncore.setDate("{}", "utc", false);'.format( utc_time_str ) res = execute_code(COMMAND_SCRIPT) print("设置时间 {} : {}".format(dt, res)) def set_direction(azimuth_from_south, altitude): COMMAND_SCRIPT = "core.moveToAltAzi({},{},0);".format(altitude, azimuth_from_south) res = execute_code(COMMAND_SCRIPT) print("设置 方位角 {} 高度角 {} : {}".format(azimuth_from_south, altitude, res)) def set_fov(fov_degree): COMMAND_SCRIPT = "StelMovementMgr.zoomTo({}, 0)".format(fov_degree) res = execute_code(COMMAND_SCRIPT) print("设置 FOV {} : {}".format(fov_degree, res)) def sanitize_filename(input_str): sanitized_str = re.sub(r'[<>:"/\\|?*]', "_", input_str) sanitized_str = sanitized_str.strip() return sanitized_str def make_screenshot(): dt = datetime.fromisoformat("2024-10-31T18:00:00+08:00") set_time(dt) observer_latitude = 40 observer_longtitude = 116 observer_altitude = 0 azimuth_degree_from_south = 0 altitude_degree = 30 fov_degree = 75.7 set_location(observer_latitude, observer_longtitude, observer_altitude) set_direction(azimuth_degree_from_south, altitude_degree) set_fov(fov_degree) COMMAND_SCRIPT = """ core.setProjectionMode("ProjectionPerspective"); core.setDiskViewport(false); core.setSkyCulture("modern_iau"); AsterismMgr.setFlagLines(true); AsterismMgr.setFlagLabels(true); ConstellationMgr.setFlagArt(false); GridLinesMgr.setFlagGridlines(true); GridLinesMgr.setFlagAzimuthalGrid(true); LandscapeMgr.setCurrentLandscapeID("zero"); LandscapeMgr.setFlagOrdinalPoints(true); LandscapeMgr.setFlagAtmosphere(false); StelSkyLayerMgr.setFlagShow(false); StelSkyDrawer.setFlagHasAtmosphere(false); ZodiacalLight.setFlagShow(false); """ execute_code(COMMAND_SCRIPT) fn = "stellarium_{}_{}_{}".format( dt.isoformat(), observer_latitude, observer_longtitude ) fn = sanitize_filename(fn) screenshot(fn, folder="./") make_screenshot() ================================================ FILE: prototype/main.py ================================================ from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware import uvicorn.config from routers import astro_coord, moon_time, positioning, bmap, astrometry from routers.limiter import limiter from slowapi import _rate_limit_exceeded_handler from slowapi.errors import RateLimitExceeded from config import CORS_ALLOW_ORIGIN, LOG_LEVEL import uvicorn app = FastAPI() # 跨域 app.add_middleware( CORSMiddleware, allow_origins=CORS_ALLOW_ORIGIN, allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) # 限流 app.state.limiter = limiter app.add_exception_handler(RateLimitExceeded, _rate_limit_exceeded_handler) # type: ignore # 分发路由 app.include_router(positioning.router, prefix="/api/positioning", tags=["positioning"]) app.include_router(astro_coord.router, prefix="/api/astrocoord", tags=["astrocoord"]) app.include_router(moon_time.router, prefix="/api/moontime", tags=["moontime"]) app.include_router(bmap.router, prefix="/api/_BMapService", tags=["_BMapService"]) app.include_router(astrometry.router, prefix="/api/astrometry", tags=["astrometry"]) @app.get("/api/") def read_root(): return {"Hello": "World"} if __name__ == "__main__": log_config = uvicorn.config.LOGGING_CONFIG log_config["formatters"]["access"][ "fmt" ] = "%(asctime)s - %(levelname)s - %(message)s" log_config["formatters"]["default"][ "fmt" ] = "%(asctime)s - %(levelname)s - %(message)s" uvicorn.run( app, host="127.0.0.1", port=6975, log_config=log_config, log_level=LOG_LEVEL ) ================================================ FILE: prototype/requirements-dev.txt ================================================ black numpy scipy pytest matplotlib fastapi uvicorn[standard] python-multipart astronomy-engine httpx async_lru slowapi sep-pjw ================================================ FILE: prototype/requirements.txt ================================================ numpy scipy fastapi uvicorn[standard] python-multipart astronomy-engine httpx async_lru slowapi sep-pjw astropy ================================================ FILE: prototype/routers/__init__.py ================================================ ================================================ FILE: prototype/routers/astro_coord.py ================================================ from fastapi import APIRouter, Request from schemas import astro_coord from core.astro_coord.calc import get_HaDecs_by_names from .limiter import limiter from config import MEDIUM_RATE_LIMIT router = APIRouter() @router.post("", response_model=astro_coord.AstroCoord) @limiter.limit(MEDIUM_RATE_LIMIT) def http_astro_coord(request: Request, data: astro_coord.AstroTime): """ 获取指定时间的天体时角和赤纬 Params: request: Request, slowapi必需 data: star_names: list[str] 天体名称列表 timestamp: number 时间戳 Returns: a dict: detail: str, 计算情况 haDecs: list[float | None] 各天体的时角和赤纬列表(角度) """ haDecs, detail = get_HaDecs_by_names(data.starNames, data.timestamp) return { "detail": detail, "haDecs": haDecs, } ================================================ FILE: prototype/routers/astrometry.py ================================================ from typing import Annotated from fastapi import APIRouter, Request, Response, Form from schemas.astrometry.extract_stars import ExtractStarRequest, ExtractStarResponse from schemas.astrometry.recognize import RecognizeRequest, RecognizeResponse from schemas.astrometry.submit import SubmitRequest, SubmitResponse from core.astrometry.extract import extract_stars from core.astrometry.solve import recognize from core.astrometry.solve import submit from io import BytesIO from PIL import Image import json import httpx from .limiter import limiter from config import LIGHT_RATE_LIMIT, MEDIUM_RATE_LIMIT, MAX_UPLOAD_SIZE router = APIRouter() @router.post("/extractstars", response_model=ExtractStarResponse) @limiter.limit(LIGHT_RATE_LIMIT) def http_extract_stars(request: Request, data: Annotated[ExtractStarRequest, Form()]): """ 获取图像中的星星位置 Params: request: Request, slowapi必需 data: image: File, 图像文件 thresh: float, 星星检测阈值 min_area: int, 最小星星面积 clean: bool, 是否清洗图像 clean_param: float, 清洗参数 Returns: a dict: detail: str, 计算情况 positions: list[list[float]] 星星位置列表 """ f = data.image.file.read() if len(f) > MAX_UPLOAD_SIZE: return { "detail": f"上传文件大小{len(f)}超过{MAX_UPLOAD_SIZE}字节", "positions": None, } try: image = Image.open(BytesIO(f)) except Exception as e: return { "detail": str(e), "positions": None, } detail, positions = extract_stars( image, data.thresh, data.min_area, data.clean, data.clean_param ) return { "detail": detail, "positions": positions, } @router.post("/submit", response_model=SubmitResponse) @limiter.limit(MEDIUM_RATE_LIMIT) def http_submit(request: Request, data: Annotated[SubmitRequest, Form()]): """ 提交图像中的星星位置以让Astrometry.net解析 Args: request: Request, slowapi必需 data: sub_images: list[UploadFile], 必需, 星星周围的图像 xy: list[Coordinate], 必需, 图像中星星的位置 image_width: int, 必需, 原始图像的宽度 image_height: int, 必需, 原始图像的高度 scale_units: str, 可选, 缩放宽度的单位 scale_lower: float, 可选, 缩放宽度的下限 scale_upper: float, 可选, 缩放宽度的上限 Returns: a dict: detail: str, 计算情况 job_id: str | None, 提交的任务id """ sub_images = [] for sub_image in data.sub_images: f = sub_image.file.read() if len(f) > MAX_UPLOAD_SIZE: return { "detail": f"上传文件大小{len(f)}超过{MAX_UPLOAD_SIZE}字节", "job_id": None, } try: image = Image.open(BytesIO(f)) except Exception as e: return { "detail": str(e), "job_id": None, } sub_images.append(image) xy = json.loads(data.xy) image_width = data.image_width image_height = data.image_height scale_units = data.scale_units scale_lower = data.scale_lower scale_upper = data.scale_upper detail, job_id = submit( sub_images, xy, image_width, image_height, scale_units, scale_lower, scale_upper ) return {"detail": detail, "job_id": job_id} @router.get("/jobidstatus/{job_id}") def http_jobid_status(request: Request, job_id: str): """ 获取任务的状态 Args: request: Request, slowapi必需 job_id: str, 提交的任务id Returns: a str, Astrometry的响应结果 """ response = httpx.get(f"http://nova.astrometry.net/api/jobs/{job_id}") return Response(content=response.text, status_code=response.status_code) @router.post("/recognize", response_model=RecognizeResponse) @limiter.limit(MEDIUM_RATE_LIMIT) def http_recognize(request: Request, data: RecognizeRequest): """ 解析Astrometry.net返回的结果 Args: request: Request, slowapi必需 data: job_id: str, 提交的任务id xy: list[Coordinate], x, y坐标 timestamp: float, 图像的时间戳 radius: float, 搜索半径 max_mag: float, 最大星等 is_zh: bool, 是否使用中文星名 Returns: a dict: detail: str, 计算情况 hd_names: list[tuple[float, float, str]] | None, HA, Dec, 星名 """ detail, hd_names = recognize( data.job_id, data.xy, data.timestamp, radius=data.radius, max_mag=data.max_mag, is_zh=data.is_zh, ) return {"detail": detail, "hd_names": hd_names} ================================================ FILE: prototype/routers/bmap.py ================================================ import httpx from fastapi import APIRouter, Query, Request, Response import re from config import BACKEND_API_BASEURL, BMAP_API_KEY router = APIRouter() # Define the base URL for the Baidu Map API BMAP_API_BASEURL = "https://api.map.baidu.com" PROXY_URL = f"{BACKEND_API_BASEURL}/_BMapService" @router.api_route("{path:path}", methods=["GET", "POST", "PUT", "DELETE"]) async def bmap_service_proxy(path: str, request: Request, ak: str = Query(None)): params = dict(request.query_params) # Add the ak parameter if it's not provided in the query string if not ak: params["ak"] = BMAP_API_KEY # Set the custom header headers = dict(request.headers) headers["X-Forwarded-Host"] = headers["host"] headers.pop("host", None) headers.pop("connection", None) headers["BMAP_PROXY_URL"] = PROXY_URL # Forward the request to the target server async with httpx.AsyncClient() as client: # 流式传输 async with client.stream( method=request.method, url=f"{BMAP_API_BASEURL}{path}", headers=headers, params=params, content=await request.body() if request.method in ["POST", "PUT"] else None, ) as response: raw_cookies = response.headers.get_list("set-cookie") new_cookies = [] for c in raw_cookies: if "domain=" in c.lower(): c = re.sub(r"(?i)domain=.*?(;|$)", "", c) new_cookies.append(c) out_headers = dict(response.headers) out_headers.pop("content-encoding", None) if len(new_cookies) > 0: out_headers["set-cookie"] = "; ".join(new_cookies) content_chunks = [] async for chunk in response.aiter_bytes(): content_chunks.append(chunk) return Response( content=b"".join(content_chunks), status_code=response.status_code, headers=out_headers, ) ================================================ FILE: prototype/routers/limiter.py ================================================ from slowapi import Limiter from slowapi.util import get_remote_address from config import RATE_LIMIT limiter = Limiter(key_func=get_remote_address, enabled=RATE_LIMIT) ================================================ FILE: prototype/routers/moon_time.py ================================================ from fastapi import APIRouter, Request from core.moon_time.calc import calc from schemas import moon_time from .limiter import limiter from config import HEAVY_RATE_LIMIT router = APIRouter() @router.post("", response_model=moon_time.MoonTimeResponse) @limiter.limit(HEAVY_RATE_LIMIT) def http_time_by_moon(request: Request, data: moon_time.MoonTimeRequest): """ 通过月亮与星星的相对位置计算时间 Params: request: Request, slowapi必需 data: photo: a dict including: stars: list, star points lines: (n, 2, 2), plumb lines approxTimestamp: number, approximate timestamp scopeDays: number, date search range size (in days) isFixRefraction: whether to fix refraction isFixGravity: whether to fix gravity Returns: a dict: time: float, the timestamp detail: str, the detail of the calculation """ detail = "success" try: time = calc( data.photo.model_dump(), data.approxTimestamp, data.scopeDays, is_fix_gravity=data.isFixGravity, is_fix_refraction=data.isFixRefraction, ) except Exception as e: time = None detail = str(e) return {"time": time, "detail": detail} ================================================ FILE: prototype/routers/positioning.py ================================================ from fastapi import APIRouter, Request from schemas import positioning from core.positioning.calc import calc_geo from .limiter import limiter from config import LIGHT_RATE_LIMIT router = APIRouter() @router.post("", response_model=positioning.PositioningResponse) @limiter.limit(LIGHT_RATE_LIMIT) def http_geo_by_data(request: Request, data: positioning.PositioningRequest): """ Find the geographical position. params: request: Request, slowapi必需 data: photo: a dict including: stars: list, star points name: str, star name x: float, x value y: float, y value lat: float, declination lon: float, reverse of hour angle lines: (n, 2, 2), plumb lines isFixRefraction: whether to fix refraction isFixGravity: whether to fix gravity return: a dict: detail: str, success or failed topPoint: (2,), top point z: float, z value lon: float, longitude lat: float, latitude """ geo = calc_geo( data.photo.model_dump(), is_fix_refraction=data.isFixRefraction, is_fix_gravity=data.isFixGravity, ) return geo ================================================ FILE: prototype/schemas/__init__.py ================================================ ================================================ FILE: prototype/schemas/astro_coord.py ================================================ from pydantic import BaseModel, Field from config import MAX_NUM_OF_STARS class AstroTime(BaseModel): starNames: list[str] = Field(..., title="Star Names", max_length=MAX_NUM_OF_STARS) timestamp: float = Field(..., title="Timestamp", gt=0) model_config = { "json_schema_extra": { "examples": [ { "starNames": [ "北落师门", "火鸟六", "土司空", "室宿一", "危宿三", "月球", ], "timestamp": 1728921600, } ] } } class AstroCoord(BaseModel): detail: str haDecs: dict[str, list[float | None]] ================================================ FILE: prototype/schemas/astrometry/extract_stars.py ================================================ from fastapi import UploadFile from ..base import Coordinate from pydantic import BaseModel, Field class ExtractStarRequest(BaseModel): image: UploadFile = Field(..., description="The image to extract stars from.") thresh: float = Field(30, description="The threshold for star detection.", ge=0) min_area: int = Field(1, description="The minimum area for star detection.", gt=0) clean: bool = Field(True, description="Whether to clean the image.") clean_param: float = Field(1.0, description="The cleaning", ge=0) class ExtractStarResponse(BaseModel): detail: str = Field(..., description="Whether the extraction is successful.") positions: list[Coordinate] | None = Field( ..., description="The positions of the stars in the image." ) ================================================ FILE: prototype/schemas/astrometry/recognize.py ================================================ from ..base import Coordinate from pydantic import BaseModel, Field from config import MAX_NUM_OF_STARS class RecognizeRequest(BaseModel): job_id: str = Field(..., description="The job id of the submission.", min_length=1) xy: list[Coordinate] = Field( ..., description="The list of x, y coordinates.", min_length=1, max_length=MAX_NUM_OF_STARS, ) timestamp: float = Field(..., description="The timestamp of the image.", gt=0) radius: float = Field(60, description="The radius of the search area.", gt=0) max_mag: float = Field(6, description="The maximum magnitude of the stars.") is_zh: bool = Field(False, description="Whether to use the Chinese star names.") class RecognizeResponse(BaseModel): detail: str = Field(..., description="Whether the extraction is successful.") hd_names: list[tuple[float, float, str]] | None = Field( ..., description="The list of RA, Dec, and star names." ) ================================================ FILE: prototype/schemas/astrometry/submit.py ================================================ from fastapi import UploadFile from ..base import Coordinate from pydantic import BaseModel, Field from config import MAX_NUM_OF_STARS class SubmitRequest(BaseModel): sub_images: list[UploadFile] = Field( ..., description="The images around stars.", min_length=3, max_length=MAX_NUM_OF_STARS, ) xy: str = Field( ..., description="The positions of the stars in the image.", min_length=1, ) image_width: int = Field(..., description="The width of the original image.", ge=1) image_height: int = Field( ..., description="The height of the original image.", ge=1 ) scale_units: str = Field( "degwidth", description="The units of the scale width.", pattern="^degwidth|arcminwidth|arcsecperpix$", ) scale_lower: float = Field( 10, description="The lower bound of the scale width.", ge=0.1, le=180 ) scale_upper: float = Field( 180, description="The upper bound of the scale width.", ge=0.1, le=180 ) class SubmitResponse(BaseModel): detail: str = Field(..., description="Whether the extraction is successful.") job_id: str | None = Field(..., description="The job id of the submission.") ================================================ FILE: prototype/schemas/base.py ================================================ from pydantic import BaseModel, Field from config import MAX_NUM_OF_STARS, MAX_NUM_OF_LINES Coordinate = tuple[float, float] Line = tuple[Coordinate, Coordinate] class Stars(BaseModel): name: str = Field(..., title="Star name", min_length=1) x: float y: float lat: float lon: float class PointLines(BaseModel): stars: list[Stars] = Field( ..., title="List of stars", min_length=3, max_length=MAX_NUM_OF_STARS ) lines: list[Line] = Field( ..., title="List of lines", min_length=2, max_length=MAX_NUM_OF_LINES ) ================================================ FILE: prototype/schemas/moon_time.py ================================================ from pydantic import BaseModel, Field from .base import PointLines, Stars from config import MAX_NUM_OF_STARS, MAX_MOON_SEARCH_RANGE class MoonPointLines(PointLines): # 对于标月定时,星体数量至少为4 stars: list[Stars] = Field( ..., title="List of stars", min_length=4, max_length=MAX_NUM_OF_STARS ) class MoonTimeRequest(BaseModel): photo: MoonPointLines approxTimestamp: float = Field(..., title="Approximate timestamp", gt=0) scopeDays: float = Field(..., title="Scope days", gt=0, le=MAX_MOON_SEARCH_RANGE) isFixRefraction: bool = False isFixGravity: bool = False model_config = { "json_schema_extra": { "examples": [ { "photo": { "stars": [ { "x": -456, "y": 226, "name": "北落师门", "lat": -0.514698517559122, "lon": 1.4148802469500708, }, { "x": -1771, "y": 226, "name": "火鸟六", "lat": -0.7359784771918016, "lon": 1.8010525244668565, }, { "x": -1190, "y": -1129, "name": "土司空", "lat": -0.3115297329153774, "lon": 1.8766165544319517, }, { "x": 1240, "y": -1817, "name": "室宿一", "lat": 0.26775668134988717, "lon": 1.4453427873820661, }, { "x": 1879, "y": -685, "name": "危宿三", "lat": 0.17437230642688134, "lon": 1.0936691241925116, }, { "x": 287, "y": -528, "name": "月", "lat": -0.15740097203546588, "lon": 1.4272146342180179, }, ], "lines": [ [[0.0, 0.0], [0.0, 1.0]], [[0.0, -5196.15], [1.0, -5196.15]], ], }, "approxTimestamp": 1727712000, "scopeDays": 365, "isFixRefraction": False, "isFixGravity": False, } ] } } class MoonTimeResponse(BaseModel): detail: str time: float | None ================================================ FILE: prototype/schemas/positioning.py ================================================ from pydantic import BaseModel from .base import PointLines, Coordinate class PositioningRequest(BaseModel): photo: PointLines isFixRefraction: bool = False isFixGravity: bool = False model_config = { "json_schema_extra": { "examples": [ { "photo": { "stars": [ { "x": -1201.17, "y": -1819.5, "name": "虚宿二", "lat": 0.09341147600777984, "lon": 1.2108214413505443, }, { "x": -361.46, "y": -1706.09, "name": "瓠瓜二", "lat": 0.2792875869041326, "lon": 1.0830800661765572, }, { "x": 1124.82, "y": -6691.48, "name": "ο And", "lat": 0.7410939499629344, "lon": 1.6733736902577325, }, { "x": -629.95, "y": -6035.47, "name": "室宿二", "lat": 0.49252561233494535, "lon": 1.681714182420701, }, { "x": 663.58, "y": -2323.9, "name": "天津九", "lat": 0.5945701655622426, "lon": 1.0805747914794241, }, ], "lines": [ [[0.0, 0.0], [0.0, 1.0]], [[0.0, -17013.85], [1.0, -17013.85]], ], }, "isFixRefraction": True, "isFixGravity": True, } ] } } class PositioningResponse(BaseModel): detail: str topPoint: Coordinate z: float lat: float lon: float ================================================ FILE: prototype/tests/__init__.py ================================================ ================================================ FILE: prototype/tests/test_astro_coord.py ================================================ import time import httpx import pytest import datetime from config import BACKEND_API_BASEURL from core.astro_coord.calc import get_HaDecs_by_names star_names = ["北落师门", "火鸟六", "土司空", "室宿一", "危宿三", "月球"] timestamp = datetime.datetime( 2024, 10, 14, 16, tzinfo=datetime.timezone.utc ).timestamp() # 1728921600 target = { "北落师门": [18.595556930406165, -29.49005348878152], "火鸟六": [17.12048758918283, -42.168460801822654], "土司空": [16.831855171272608, -17.849340559226274], "室宿一": [18.479197486611962, 15.34132894683517], "危宿三": [19.822494325758775, 9.99079838431698], "月球": [18.548443184393808, -9.018411404642423], } def test_local(): result, is_success = get_HaDecs_by_names(star_names, timestamp) assert is_success for star_name in star_names: assert result[star_name] == pytest.approx(target[star_name]) # 验证缓存功能 start_time = time.time() result, is_success = get_HaDecs_by_names(star_names, timestamp) end_time = time.time() assert is_success for star_name in star_names: assert result[star_name] == pytest.approx(target[star_name]) assert end_time - start_time < 0.05 def test_remote(): url = f"{BACKEND_API_BASEURL}/astrocoord" data = {"starNames": star_names, "timestamp": timestamp} resp = httpx.post(url, json=data) assert resp.status_code == 200 result = resp.json() assert result["detail"] == "success" for star_name in star_names: assert result["haDecs"][star_name] == pytest.approx(target[star_name]) # 验证缓存功能 start_time = time.time() resp = httpx.post(url, json=data) end_time = time.time() assert resp.status_code == 200 result = resp.json() assert result["detail"] == "success" for star_name in star_names: assert result["haDecs"][star_name] == pytest.approx(target[star_name]) assert end_time - start_time < 0.05 ================================================ FILE: prototype/tests/test_astrometry/test_extract_stars.py ================================================ import io import httpx import pytest import numpy as np from PIL import Image import matplotlib.pyplot as plt from matplotlib.patches import Circle from core.astrometry.extract import extract_stars from config import BACKEND_API_BASEURL def sort_positions(positions: list[list[float]]) -> list: positions_array = np.array(positions) center = np.array(image.size) / 2 distances = np.linalg.norm(positions_array - center, axis=1) return positions_array[np.argsort(distances)].tolist() def plot(image: Image.Image, objects: list[list[float]]): data_image = np.array(image.convert("L"), dtype=np.float64) # plot background-subtracted image fig, ax = plt.subplots() m, s = np.mean(data_image), np.std(data_image) im = ax.imshow( data_image, interpolation="nearest", cmap="gray", vmin=float(m - s), vmax=float(m + s), origin="lower", ) # plot an ellipse for each object for i in range(len(objects)): e = Circle(xy=(objects[i][0], objects[i][1]), radius=10) e.set_facecolor("none") e.set_edgecolor("red") ax.add_artist(e) plt.show() image = Image.open("../examples/picMemeRider1.jpeg").crop((0, 0, 3024, 2000)) target_positions = [ [477.32, 268.11], [2925.06, 351.4], [2880.87, 446.34], [2479.18, 509.05], [1652.67, 510.68], [2932.68, 548.29], [2345.36, 607.36], [1847.01, 642.52], [1763.0, 659.0], [2584.52, 660.33], [34.27, 700.39], [1621.46, 781.51], [2547.16, 810.44], [2022.82, 924.79], [2655.53, 1046.25], [1659.0, 1108.51], [510.52, 1129.51], [2114.06, 1159.66], [2383.23, 1171.87], [2553.0, 1194.5], [1465.91, 1202.07], [1292.96, 1203.98], [2939.76, 1221.86], [1982.33, 1250.44], [2465.78, 1332.44], [1480.0, 1357.0], [2348.42, 1367.15], [2398.39, 1374.78], [1257.75, 1412.04], [2095.88, 1517.86], [1801.81, 1559.6], [1968.56, 1563.68], [431.49, 1579.5], [1799.22, 1587.16], [2493.96, 1592.52], [1299.66, 1644.35], [1856.59, 1641.79], [671.12, 1684.6], [1640.71, 1687.26], [1874.69, 1704.99], [1271.98, 1718.54], [1955.41, 1740.37], [914.12, 1744.05], [961.41, 1749.1], [1943.06, 1770.6], [2711.99, 1808.5], [2354.51, 1836.43], [2692.16, 1874.1], [136.53, 1873.54], [2635.47, 1926.15], [1607.75, 1929.96], [912.85, 1947.87], [1068.22, 1965.12], [732.11, 1981.45], [1109.36, 1997.87], ] target_positions = sort_positions(target_positions) def test_local(): detail, positions = extract_stars(image, thresh=40) assert detail == "success" and type(positions) == list positions = sort_positions(positions) # plot(image, positions) ##DEBUG for i in range(len(positions)): assert positions[i] == pytest.approx(target_positions[i], rel=1e-4) def test_remote(): byte_io = io.BytesIO() image.save(byte_io, format="JPEG") image_bytes = byte_io.getvalue() files = {"image": image_bytes} data = { "thresh": 40, "min_area": 1, "clean": True, "clean_param": 1.0, } response = httpx.post( f"{BACKEND_API_BASEURL}/astrometry/extractstars", files=files, data=data ) assert response.status_code == 200, response.text result = response.json() assert result["detail"] == "success", result positions = sort_positions(result["positions"]) for i in range(len(positions)): assert positions[i] == pytest.approx(target_positions[i], rel=1e-4) ================================================ FILE: prototype/tests/test_astrometry/test_recognize.py ================================================ import httpx import pytest from datetime import datetime from config import BACKEND_API_BASEURL from core.astrometry.solve import recognize job_id = "12339064" xy = [ (650.8, 33.41), (703.14, 79.09), (709.57, 170.07), (705.1, 198.62), (1114.71, 75.48), (587.4, 340.17), (477.09, 342.3), (301.54, 408.02), (355.75, 457.07), (390.5, 473.86), (159.43, 518.48), (137.21, 422.11), (125.23, 800.0), ] timestamp = datetime(2024, 10, 2, 8, 19, 30).timestamp() target = [ (1.9897989688757498, 28.218636151755415, "室宿二"), (1.9339721182415666, 25.604551898466813, "室宿增二"), (1.70823521216926, 23.878248190766683, "离宫五"), (1.6291023123906356, 23.54245362285061, "离宫六"), (2.2739194940482825, 12.305428191189998, "雷电二"), (1.0888809644149937, 25.281360500973765, "壁宿增六"), (0.9114997311323787, 29.230284316654693, "壁宿二"), (0.4358077885733779, 33.85739442331256, "奎宿六"), (0.3950906583243974, 30.998840521801952, "奎宿五"), (0.40801422894736816, 29.449717835792292, "奎宿四"), (23.887293691166132, 35.7539066873888, "奎宿九"), (0.10377900448763411, 38.63477453402231, "奎宿八"), (23.16431636047376, 29.702173420712025, "娄宿增六"), ] def test_local(): detail, hd_names = recognize( job_id, xy, timestamp, radius=60, max_mag=6, is_zh=True, ) assert detail == "success" assert hd_names for i in range(len(hd_names)): assert hd_names[i][2] == target[i][2] assert hd_names[i][:2] == pytest.approx(target[i][:2]) def test_remote(): data = { "job_id": job_id, "xy": xy, "timestamp": timestamp, "radius": 60, "max_mag": 6, "is_zh": True, } response = httpx.post(f"{BACKEND_API_BASEURL}/astrometry/recognize", json=data) assert response.status_code == 200, response.text result = response.json() assert result["detail"] == "success" hd_names = result["hd_names"] for i in range(len(hd_names)): assert hd_names[i][2] == target[i][2] assert hd_names[i][:2] == pytest.approx(target[i][:2]) ================================================ FILE: prototype/tests/test_astrometry/test_submit.py ================================================ import pytest from PIL import Image from core.astrometry.solve import flux_in_img, submit def crop_image(image: Image.Image, x: float, y: float, size: float) -> Image.Image: return image.crop((x - size, y - size, x + size, y + size)) xy = [ (650.8, 33.41), (703.14, 79.09), (709.57, 170.07), (705.1, 198.62), (1114.71, 75.48), (587.4, 340.17), (477.09, 342.3), (301.54, 408.02), (355.75, 457.07), (390.5, 473.86), (159.43, 518.48), (137.21, 422.11), (125.23, 800.0), ] target_fluxs = [ 519.08, 67.4, 107.01, 84.96, 393.89, 86.01, 391.27, 76.34, 185.0, 53.62, 316.34, 133.95, 126.21, ] image = Image.open("../examples/picLightDog.jpeg") cropped_images = [crop_image(image, x, y, 10) for x, y in xy] def test_flux_in_img(): fluxs = flux_in_img(cropped_images) assert fluxs == pytest.approx(target_fluxs, rel=1e-2) # submit仅用来提交任务,求解部分交由在线Astrometry,因此不做测试 def log_submit(): detail, job_id = submit(cropped_images, xy, *image.size) print(detail, job_id) ================================================ FILE: prototype/tests/test_moon_time.py ================================================ import httpx import pytest import datetime from core.moon_time.calc import calc from config import BACKEND_API_BASEURL photo = { "stars": [ { "x": -456, "y": 226, "name": "北落师门", "lat": -0.514698517559122, "lon": 1.4148802469500708, }, { "x": -1771, "y": 226, "name": "火鸟六", "lat": -0.7359784771918016, "lon": 1.8010525244668565, }, { "x": -1190, "y": -1129, "name": "土司空", "lat": -0.3115297329153774, "lon": 1.8766165544319517, }, { "x": 1240, "y": -1817, "name": "室宿一", "lat": 0.26775668134988717, "lon": 1.4453427873820661, }, { "x": 1879, "y": -685, "name": "危宿三", "lat": 0.17437230642688134, "lon": 1.0936691241925116, }, { "x": 287, "y": -528, "name": "月", "lat": -0.15740097203546588, "lon": 1.4272146342180179, }, ], "lines": [[[0.0, 0.0], [0.0, 1.0]], [[0.0, -5196.15], [1.0, -5196.15]]], } is_fix_refraction = False is_fix_gravity = False approx_timestamp = datetime.datetime(2024, 10, 1, 0).timestamp() # 1727712000 scope_days = 365 target = datetime.datetime(2024, 10, 14, 16, tzinfo=datetime.timezone.utc).timestamp() def test_local(): real_timestamp = calc( photo, approx_timestamp, scope_days, is_fix_refraction, is_fix_gravity ) assert real_timestamp == pytest.approx(target) def test_remote(): url = f"{BACKEND_API_BASEURL}/moontime" post_data = { "photo": photo, "approxTimestamp": approx_timestamp, "scopeDays": scope_days, "isFixRefraction": is_fix_refraction, "isFixGravity": is_fix_gravity, } resp = httpx.post(url, json=post_data) assert resp.status_code == 200 result = resp.json() assert result["detail"] == "success" assert result["time"] == pytest.approx(target) ================================================ FILE: prototype/tests/test_positioning.py ================================================ import httpx import pytest import numpy as np from config import BACKEND_API_BASEURL from core.positioning.calc import calc_geo photo = { "stars": [ { "x": -1201.17, "y": -1819.5, "name": "虚宿二", "lat": 0.09341147600777984, "lon": 1.2108214413505443, }, { "x": -361.46, "y": -1706.09, "name": "瓠瓜二", "lat": 0.2792875869041326, "lon": 1.0830800661765572, }, { "x": 1124.82, "y": -6691.48, "name": "ο And", "lat": 0.7410939499629344, "lon": 1.6733736902577325, }, { "x": -629.95, "y": -6035.47, "name": "室宿二", "lat": 0.49252561233494535, "lon": 1.681714182420701, }, { "x": 663.58, "y": -2323.9, "name": "天津九", "lat": 0.5945701655622426, "lon": 1.0805747914794241, }, ], "lines": [[[0.0, 0.0], [0.0, 1.0]], [[0.0, -17013.85], [1.0, -17013.85]]], } is_fix_refraction = True is_fix_gravity = True target = { "detail": "success", "z": 3000, "lon": 115, "lat": 34.999625, } target_topPoint = [0.0, -17013.85] def test_local(): geo = calc_geo(photo, is_fix_refraction, is_fix_gravity) geo["lat"] = np.rad2deg(geo["lat"]) geo["lon"] = np.rad2deg(geo["lon"]) assert geo["topPoint"] == pytest.approx(target_topPoint) del geo["topPoint"] assert geo == pytest.approx(target, rel=6e-3) def test_remote(): url = f"{BACKEND_API_BASEURL}/positioning" post_data = { "photo": photo, "isFixRefraction": is_fix_refraction, "isFixGravity": is_fix_gravity, } resp = httpx.post(url, json=post_data) assert resp.status_code == 200 result = resp.json() result["lat"] = np.rad2deg(result["lat"]) result["lon"] = np.rad2deg(result["lon"]) assert result["topPoint"] == pytest.approx(target_topPoint) del result["topPoint"] assert result == pytest.approx(target, rel=6e-3) ================================================ FILE: prototype/tests/test_utils.py ================================================ import numpy as np import pytest from core.positioning.top_point.utils.plane import two_line_intersection_point def test_two_line_intersection_point(): case1 = { "l1": [[1, 1], [2, 2]], "l2": [[1, 2], [2, 1]], "has_intersection": True, "intersection": [1.5, 1.5], } case2 = { "l1": [[1, 1], [2, 2]], "l2": [[3, 3], [4, 4]], "has_intersection": False, "intersection": [0, 0], } cases = [case1, case2] for case in cases: has_intersection, point = two_line_intersection_point(case["l1"], case["l2"]) assert has_intersection == case["has_intersection"] if has_intersection: pytest.approx(point, np.array(case["intersection"])) ================================================ FILE: pyproject.toml ================================================ [project] name = "starlocator" version = "2.1.0" description = "照片测星定位 网页app(地平论吧)" readme = "README.md" requires-python = ">=3.12" dependencies = [ "astronomy-engine>=2.1.19", "astropy>=7.1.0", "async-lru>=2.0.5", "fastapi>=0.116.1", "httpx>=0.28.1", "numpy>=2.3.2", "python-multipart>=0.0.20", "scipy>=1.16.1", "sep-pjw>=1.3.8", "slowapi>=0.1.9", "uvicorn[standard]>=0.35.0", ] [[tool.uv.index]] url = "https://mirrors.aliyun.com/pypi/simple" default = true [dependency-groups] dev = [ "black>=25.1.0", "matplotlib>=3.10.5", "pytest>=8.4.1", ] ================================================ FILE: src/config.js ================================================ export const BACKEND_API = `http://localhost:6975/api`; ================================================ FILE: src/css/site.css ================================================ body { background-color: #1c355d; color: #dfdfdf; } th { background-color: #1d2430; height: 25px; } td { text-align: center; height: 25px; background-color: #1d2d46; } td:hover { background-color: #1d2430; } .inputTable .col-seq { width: 5%; } .inputTable .col-name { width: 17%; } .inputTable .col-hour-angle { width: 23%; } .inputTable .col-declination { width: 18%; } .inputTable .col-x, .inputTable .col-y { width: 13%; } .inputTable .col-action { width: 10%; } h1 { font-size: 24px; padding-left: 5px; padding-top: 5px; } h2 { background-color: #202c46; font-size: 18px; padding-left: 5px; padding-right: 5px; margin-top: 0px; margin-bottom: 10px; } input.table { text-align: center; background-color: #1d2d46; border: 0px; color: white; } input.table:hover { background-color: #1d2430; } input[type=date], [type=time] { font-family: sans-serif; } input[type=text] { text-align: center; background-color: #1d2d46; border: 0px; color: white; } a:link { color: #4074db; } a:visited { color: #189c65; } .tooltip .tooltiptext { visibility: hidden; width: 150px; background-color: white; color: #3c3c3c; font-size: 12px; font-weight: normal; text-align: center; padding: 4px; margin-top: 18px; border: solid; border-width: 1px; position: absolute; z-index: 1; } .tooltip:hover .tooltiptext { visibility: visible; } .autocomplete { position: relative; display: inline-block; } .autocomplete-list { max-height: 105px; overflow: scroll; overflow-x: hidden; overscroll-behavior: none; } .autocomplete-items { position: relative; border-top: none; z-index: 99; top: 0%; left: -1%; right: 0%; width: 102%; /* 0高度确保不会增加表格行高 */ height: 0; } .autocomplete-items div { padding: 0px; cursor: pointer; background-color: #3363af; color: white; border: none; } /*when hovering an item:*/ .autocomplete-items div:hover { background-color: #3363af; } /*when navigating through the items using the arrow keys:*/ .autocomplete-active { background-color: DodgerBlue !important; color: #ffffff; } @media (min-width:480px) { .col-toolbar { position: relative; width: 100%; max-width: 900px; } .col-result { position: relative; width: 900px; } .helpdiv { margin-left: auto; margin-right: auto; width:100%; } } @media (min-width:1035px) { .col-toolbar { position: relative; width: 85px; padding-right: 5px; } .col-result { position: relative; padding-top: 10px; margin-left: 97px; width: 904px; } .helpdiv { margin-left: auto; margin-right: auto; width:927px; } } @media (min-width:1562px) { .col-result { position: relative; -ms-flex: 0 0 34%; flex: 0 0 34%; max-width: 34%; padding-top: 0px; margin-left: 0px; } .helpdiv { margin-left: auto; margin-right: auto; width:60%; } } #canvas { margin: 0 auto; background: #000; cursor: move; } #box.drag-over { outline: 3px dashed #4074db; outline-offset: -8px; } .canvasInfoBar { display: flex; flex-direction: column; gap: 2px; min-height: 44px; margin-bottom: 30px; } .canvasMetaBar, .canvasStatusBar { display: flex; align-items: flex-start; gap: 12px; min-width: 0; } .canvasMetaBar { justify-content: space-between; width: 100%; } .canvasStatusBar { flex-wrap: wrap; } #picInfo, #canvasStatus, #celeStatus { min-height: 20px; } #picInfo { flex: 1; } #cursorCrd { flex: 0 0 150px; min-height: 20px; text-align: right; white-space: nowrap; } .outputColumn { margin-top: 15px; margin-bottom: 15px; } .removeLine { background: none; width: 60%; height: 60%; background-color: #e44f0d60; border-radius: 50%; color: #e44f0d; -webkit-user-select: none; user-select: none; } .resetButton { color: white; border: 2px solid #c93a20; border-radius: 5px; width: 85px; height: 48px; cursor: pointer; background-color: #9c3521; margin-bottom: 5px; } .resetButton:hover { background-color: #c93a20; } .resetButton:active { background-color: #522a22; } .actionButton { color: white; border: 2px solid #189c65; border-radius: 5px; width: 85px; height: 48px; cursor: pointer; background-color: #187C54; margin-bottom: 5px; } .actionButton:hover { background-color: #189c65; } .actionButton:active { background-color: #194837; } .actionButton.is-disabled { opacity: 0.45; filter: grayscale(65%); } .actionButton.is-disabled:hover { background-color: #187C54; } .tableActionButton, .addCeleRowButton { border: 1px solid #189c65; border-radius: 4px; background-color: #187C54; color: white; cursor: pointer; } .tableActionButton { padding: 2px 6px; font-size: 12px; } .tableActionButton:hover, .addCeleRowButton:hover { background-color: #189c65; } .addCeleRowButton { margin-top: 6px; padding: 4px 12px; } .helpButton { color: white; border: 2px solid #2150B7; border-radius: 5px; width: 85px; height: 48px; cursor: pointer; background-color: #204898; margin-bottom: 5px; } .helpButton:hover { background-color: #2150B7; } .helpButton:active { background-color: #1d2d46; } .calculButton { color: black; border: 2px solid #e44f0d; border-radius: 10px; width: 100%; height: 100%; cursor: pointer; background-color: #b54914; font-size: 36px; } .calculButton:hover { background-color: #e44f0d; } .calculButton:active { background-color: #422a1c; } .calculButton:hover .calculIcon{ visibility: hidden; } .calculButton:hover .calculAnim{ visibility: visible; } .calculButton:active .calculIcon{ visibility: visible; } .calculButton:active .calculAnim{ visibility: hidden; } .calculAnim{ visibility: hidden; position: absolute; } .zenith { color: #e44f0d; } .result { color: #189c65; } .celesName { margin-left: 5%; margin-right: 5%; width: 90%; } .celesNameInput { display: block; box-sizing: border-box; width: 90%; margin: 0 auto; padding: 2px 4px; } .formatedInput { display: flex; align-items: center; justify-content: center; gap: 4px; height: 100%; white-space: nowrap; } .formatedInput div { min-width: 22px; text-align: center; overflow: hidden; text-overflow: clip; white-space: nowrap; } .hourAngle { margin-left: 4%; margin-right: 4%; width: 92%; } .declination { margin-left: 5%; margin-right: 5%; width: 90%; } .coordsInput { margin-left: 7.5%; margin-right: 7.5%; width: 85%; } .input-helper { display: none; /* 默认隐藏 */ position: absolute; /* 使用绝对定位 */ background-color: #7f7f7f; /* 背景颜色 */ border: 1px solid #ccc; /* 边框 */ padding: 10px; /* 内边距 */ z-index: 1000; /* 确保浮动 div 在上层 */ } .row { display: -ms-flexbox; display: flex; -ms-flex-wrap: wrap; flex-wrap: wrap; } .header { background-color: #161f2c; height: 45px; margin: -16px -8px 10px -8px; } .col-toolbar { padding-right: 10px; } .col-toolbar button { display: inline-flex; align-items: center; justify-content: center; gap: 6px; vertical-align: top; } .toolbar-icon { flex-shrink: 0; margin-left: -4px; margin-top: -3px; } .toolbar-label { display: none; font-size: 14px; white-space: nowrap; } @media (min-width:1100px) { .col-toolbar { width: 120px; } .col-toolbar .resetButton, .col-toolbar .actionButton, .col-toolbar .helpButton { width: 110px; height: 72px; flex-direction: column; gap: 2px; padding: 4px 6px; } .col-toolbar .toolbar-icon { margin-left: 0; margin-top: 0; } .col-toolbar .toolbar-label { display: block; font-size: 12px; line-height: 1; text-align: center; } } @media (min-width:1100px) and (max-width:1561px) { .col-result { margin-left: 132px; } } .col-measure { position: relative; width: 900px; padding-right: 10px; } .col-input { -ms-flex: 0 0 90%; flex: 0 0 90%; max-width: 90%; margin-left: -1px; } .col-calcul { -ms-flex: 0 0 10%; flex: 0 0 10%; max-width: 10%; margin: 0px; } .col-acknow { -ms-flex: 0 0 70%; flex: 0 0 70%; max-width: 70%; } .col-logo { -ms-flex: 0 0 28%; flex: 0 0 28%; max-width: 28%; } .desc { color:#9f9f9f; margin-top:0px; margin-bottom:0px; } ================================================ FILE: src/help.html ================================================ 帮助

StarLocator StarLocator 照片测星定位 点击加入交流群 GitHub

帮助文档

这是什么?

StarLocator 是一款基于任意照片测量的天文定位网页APP,您可以使用该程序对图片的大致拍摄地进行定位。定位所需条件为图中天体的辨识、复数铅垂线的存在以及拍摄时间。

如何使用?

  1. 在中间测量栏点击“选择文件”按钮,打开一张有星星入镜的图片;

    尽可能清晰。拖影、失焦或变形都可能会严重影响定位结果,但广角理论上不影响。

  2. 在左侧工具栏点击“天体选择”按钮,或使用“天体框选”,标记图中至少3个天体;

    * 天体要求清晰且尽可能在左右方向上间隔大一些,避免处于同一条垂直线上;

    * 除了使用标月定时功能外,尽可能不要标记月球,因为它的坐标与地理位置耦合。

    * “天体框选”可自动识别框区中的星点,你可调整设置中的阈值以调整检测灵敏度。

  3. 在下方的测量表的“名称”列中输入天体名称;

    * 当您选中某一行的名称空格时,对应天体的标记将在图中高亮显示。对于传统派,您可以使用星图软件(如 stellarium或其在线网页版 )调节至拍摄时间和地点,对照着对天体进行辨识。如遇困难可以加入讨论群尝试求助。对于现代派,你也可以使用“天体识别”功能。

    * 支持填写几乎所有的中文、外文星名。同时,我们提供了一个候选框以帮助你更好地确定正确的星名,其中包括了所有受支持的中文星名,但外文星名没有完全涵盖,某些生僻的外文星名事实上也受支持,详见SIMBAD

    * 支持填写日月、太阳系八大行星和冥王星,但对于其他太阳系天体(如一些彗星)并不支持。你可以取消勾选设置中的“自动获取天体坐标”、手动输入其坐标:请打开stellarium等星图软件,设置(0°N, 0°E)位置,查找拍摄时的星图中对应天体的时角和赤纬,自行填入表中。

  4. 在右侧设置栏中输入照片拍摄的准确时间;

    若无法精确到秒,可在尾数中填入“30”。

  5. 在左侧工具栏点击“铅锤线标记”按钮,在图中标记铅垂线的首尾端点,最少需要标记2条铅垂线,即4个端点;

    照片中常见的铅垂线通常包含建筑物的侧棱、垂直的窗框、砖缝等等。铅垂线的选择以及标记准确与否对定位结果有极大的影响。铅垂线越多,定位结果将会越准确。

  6. 点击橙色的“计算”按钮,即可在右侧的结果栏查看结果;

    * 首次计算将视您的网络情况花费2~20秒不等的时间请求获取天体坐标。

  7. 定位结果和±0.5分钟误差线将同时将显示在地图中,可通过滚轮和拖动查看。

    * 经度、纬度为定位点的经纬度,其中经度正值为东经、负值为西经,纬度正值为北纬、负值为南纬。

    * 像素焦距为焦平面到光心的像素距离。

    * 35mm焦距为将该像素焦距根据照片的分辨率换算得到的等效焦距。

特色功能

天体识别

如果图片上有足够多星,你可以使用“天体识别”功能,以便自动识别和填写所有天体名称和坐标。你需要:

  1. 设置正确的拍摄时间(否则无法正确识别太阳系天体);
  2. 准确标记至少3个天体(越多越好);
  3. 在设置-天体识别中,设置视野宽度角的估计范围;
  4. 在左侧工具栏点击“天体识别”按钮;
  5. 该功能可能会花费半分钟或更长时间,受Astrometry资源占用、网络情况影响。之后,所有天体的名称和坐标将会自动填写到测量表中。

不过,你也更有可能遇到天体识别失败,原因可能是:

  • 天体数目太少,信息不足,无法确定。建议在图上仔细寻找更多天体,或是更准确地估计视野宽度角,缩小其范围;
  • 图片拍摄抖动、重影、质量不佳,星点位置偏移。建议重新拍摄。

标月定时

在已标注了一月三星多铅垂线的条件下,你可无需填写拍摄时间,请遵循以下步骤:

  1. 确保已标注好了一月三星和多条铅垂线;
  2. 确定并填写一个大概的拍摄时间,然后设置“标月定时搜索区间”,程序将以前者为中心、后者为区间大小进行搜索;

    30天的搜索区间是一个非常保守的值,建议在大多数情况下使用。如果你打算设置更大的搜索区间,请确保你的标注足够精确,否则时间可能会偏差一个月。

  3. 点击“标月定时”按钮,等待数秒后拍摄时间将会更新;
  4. 删除月亮标注,点击“计算”按钮,获取定位结果。

未完成功能

当前发布的StarLocator为先行版,仍有部分功能正在开发中,包括:

  • 地平线标记 - 可以在没有铅垂线的地图上通过标记地平线进行大致定位,精度较低,可用于无人造物的宽阔野外场景。
  • 定向测量 - 可以计算图中任意一点相对相机镜头的方位角和高度角。
  • 水平透视 - 基于建筑物表面互相平行的水平线测量建筑物朝向的方位角。

FAQ

  1. 照片中没有星星可以测吗?
  2. 这里是建议您找一个算命的呢亲亲:)。

  3. 照片中的星星怎么认?
  4. 如果您完全不认得星星,可以在星图软件上对相近时间、相近地点的星空进行对比来寻找。如果照片中的星星较少,那么说明其他较暗的星星可能被光污染淹没了,需要从星图中较亮的星星中寻找。

  5. 为什么一定要标记铅垂钱
  6. 在确定的一个时刻,天上的星星与地上的位置是一一对应的,星空相当于一张地图,但光有地图可无法告诉您当前位置。所有的铅垂在星空中的焦点就相当于地图上的指针,用于指出照片的拍摄地。

  7. 怎么误差这么大?
  8. 该测量中最有可能带来误差的因素有镜头的几何畸变、时间误差、画面模糊拖影、选用的参考线不铅垂等。如果您知道拍摄的镜头型号,可以先在其他软件中进行镜头校正,让图像完美地成像于一个焦平面上,这样可以尽可能消除几何畸变带来的误差。时间哪怕只相差1分钟也可能带来约20km量级的误差,这是无法消除的,但其方向固定为东西方向。

  9. 这是什么原理?
  10. 该定位是将手机当作六分仪对天体的高度角进行测量,以双星定位法进行定位,核心原理可以参考: B站视频 以及 B站专栏

================================================ FILE: src/index.html ================================================ 照片测星定位

StarLocator StarLocator 照片测星定位 点击加入交流群 GitHub

工具

测量

序号天体的序号 天体名称天体的名称,中英文皆可;中文在星座名和希腊字母之间需要加上空格 参考时角在0°经线读取的天体时角,可以用于计算GP点经度 赤纬天体的赤纬,即GP点的纬度 x天体在照片中的横坐标 y天体在照片中的纵坐标 操作添加或删除天体行
0 天顶 N/A N/A N/A
1
h
m
s
°
2
h
m
s
°
3
h
m
s
°

设置






° — °

结果

像素焦距z焦平面到光心的像素距离 35mm焦距根据照片的分辨率换算得到的等效焦距 经度定位点的经度;正值为东经,负值为西经 定位点的纬度;正值为北纬,负值为南纬纬度
0.00 0mm 0.0000° 0.0000°

关于

感谢开源项目(完整名单见NOTICE):
================================================ FILE: src/index.js ================================================ import './css/site.css'; import { InteractPhoto } from './interface/classes/interact.js'; import { EventManager } from './interface/classes/EventManager.js'; let interactPhoto = new InteractPhoto(); // eslint-disable-next-line no-unused-vars let eventManager = new EventManager(interactPhoto); ================================================ FILE: src/interface/classes/EventManager.js ================================================ import { initializeElements, initializeCanvas, initializeEvents, initializeMap } from '../init.js'; import { TouchEventAdapter } from './TouchEventAdapter.js'; import { PickCele } from '../functions/PickCele.js'; import { PickPL } from '../functions/PickPL.js'; import { ImageChange } from '../functions/ImageChange.js'; import { Calc } from '../functions/Calc.js'; import { MoonTime } from '../functions/MoonTime.js'; import { CeleCoord } from '../functions/CeleCoord.js'; import { SelectStars } from '../functions/SelectStars.js'; import { RecognizeStars } from '../functions/CeleRecognition.js'; // 事件管理器,管理鼠标事件、按钮事件与照片的交互 class EventManager { constructor(interactPhoto) { this.interactPhoto = interactPhoto; this.touchEventAdapter = new TouchEventAdapter(); // 事件共享变量 this.celeCoord = new CeleCoord(this.interactPhoto); // 按钮事件处理类 this.pickCele = new PickCele(this.interactPhoto); this.pickPL = new PickPL(this.interactPhoto); this.imageChange = new ImageChange(this.interactPhoto, this.clearAllData.bind(this)); this.calc = new Calc(this.interactPhoto, this.celeCoord); this.moonTime = new MoonTime(this.interactPhoto, this.astroCalculator, this.celeCoord); this.selectStars = new SelectStars(this.interactPhoto); this.recognizeStars = new RecognizeStars(this.interactPhoto); // 页面加载完成事件 window.onload = function () { initializeElements(this.interactPhoto); initializeCanvas(this.interactPhoto); initializeEvents(this); initializeMap(this.interactPhoto); }.bind(this); } // 重置所有标注数据 clearAllData() { this.interactPhoto.buttonFunctioner = this.interactPhoto.defaultbuttonFunctioner; this.pickCele.clearData(); this.pickPL.clearData(); this.calc.clearData(); this.interactPhoto.CeleArray.clear(); // 清空表格数据 } // 鼠标事件处理 // 处理鼠标按下事件 handleMouseDown(e) { this.interactPhoto.buttonFunctioner.handleMouseDown(e); } // 处理鼠标抬起事件 handleMouseUp(e) { this.interactPhoto.buttonFunctioner.handleMouseUp(e); } // 处理鼠标移动事件 handleMouseMove(e) { this.interactPhoto.buttonFunctioner.handleMouseMove(e); } // 处理鼠标移出事件 handleMouseOut(e) { this.interactPhoto.buttonFunctioner.handleMouseOut(e); } // 处理鼠标滚轮事件用于缩放照片大小 handleMouseWheel(opt) { this.interactPhoto.buttonFunctioner.handleMouseWheel(opt); } // 处理页面改变大小事件 handleResize() { this.interactPhoto.buttonFunctioner.handleResize(); } } export { EventManager }; ================================================ FILE: src/interface/classes/TouchEventAdapter.js ================================================ class TouchEventAdapter { constructor() { this.lastPageX; // 上次触摸点横坐标 this.lastPageY; // 上次触摸点纵坐标 this.lastDistance; // 上次触摸点距离 } adapter(e) { let eAdapter = { ...e }; eAdapter.e = e; // 触摸事件适配 if (e.type === 'touchstart') { eAdapter = this.touchStart(eAdapter); } else if (e.type === 'touchend') { eAdapter = this.touchEnd(eAdapter); } else if (e.type === 'touchmove') { eAdapter = this.touchMove(eAdapter); } else if (e.type === 'touchcancel') { eAdapter = this.touchCancel(eAdapter); } return eAdapter; } // 处理触摸开始事件 touchStart(e) { this.lastPageX = e.pageX; this.lastPageY = e.pageY; if (e.e.targetTouches.length == 2) { this.lastDistance = Math.sqrt( Math.pow(e.e.targetTouches[0].pageX - e.e.targetTouches[1].pageX, 2) + Math.pow(e.e.targetTouches[0].pageY - e.e.targetTouches[1].pageY, 2) ); } return e; } // 处理触摸结束事件 touchEnd(e) { return e; } // 处理触摸移动事件 touchMove(e) { if (this.lastPageX === undefined || this.lastPageY === undefined) { e.e.movementX = 0; e.e.movementY = 0; } else { e.e.movementX = e.e.targetTouches[0].pageX - this.lastPageX; e.e.movementY = e.e.targetTouches[0].pageY - this.lastPageY; } this.lastPageX = e.e.targetTouches[0].pageX; this.lastPageY = e.e.targetTouches[0].pageY; if (e.e.targetTouches.length == 2) { let distance = Math.sqrt( Math.pow(e.e.targetTouches[0].pageX - e.e.targetTouches[1].pageX, 2) + Math.pow(e.e.targetTouches[0].pageY - e.e.targetTouches[1].pageY, 2) ); e.e.scale = distance / this.lastDistance; this.lastDistance = distance; } return e; } // 处理触摸取消事件 touchCancel(e) { return e; } } export { TouchEventAdapter }; ================================================ FILE: src/interface/classes/interact.js ================================================ import { DefaultbuttonFunctioner } from '../functions/Default.js'; import { CeleArray } from '../elements/CelestialBody.js'; import { PLArray } from '../elements/PlumbLine.js'; // 照片与其可交互信息的类 class InteractPhoto { constructor() { // 页面各元素变量 this.img = null; // 照片 this.container = null; // 容器 this.canvas = null; // 画布 this.canvasInst = null; // 画布实例 this.tips = null; // 提示 this.celeStatus = null; // 天体标记数量提示 this.cursorCrd = null; // 鼠标坐标 this.inputTable = null; // 输入表格 this.movable = false; // 是否可移动 this.text = null; // 文本 this.rect = null; // 矩形 this.map = null; // 地图 this.date = null; // 日期 this.time = null; // 时间 this.timeZone = null; // 时区 // 画布对象池 this.CeleArray = new CeleArray(this); // 星星对象数组 this.PLArray = new PLArray(this); // 铅垂线对象数组 // 鼠标事件变量 this.lmbDown = false; // 鼠标左键是否按下 this.cancelOp = false; // 是否取消选择星体or铅垂线的操作 // 按钮功能状态变量 this.defaultbuttonFunctioner = new DefaultbuttonFunctioner(this); this.buttonFunctioner = this.defaultbuttonFunctioner; // 当前按钮事件对象 } // 调整画布的缩放和视图位置 reZoomCanvas(rect, alignRect = false, resize = true) { var scaleX = this.canvas.width / rect.width; var scaleY = this.canvas.height / rect.height; var scale = Math.min(scaleX, scaleY); var newX = this.canvas.width / 2 - rect.width / 2, newY = this.canvas.height / 2 - rect.height / 2; if (alignRect) this.canvas.setViewportTransform([1, 0, 0, 1, newX, newY]); else this.canvas.setViewportTransform([1, 0, 0, 1, this.canvas.width / 2, this.canvas.height / 2]); if (resize) this.canvas.zoomToPoint({ x: this.canvas.width / 2, y: this.canvas.height / 2 }, scale); } // 鼠标模式 setCanvasCursor(cursor) { this.canvasInst.style.cursor = cursor; } // 重置按钮功能状态 resetbuttonFunctioner() { this.buttonFunctioner = this.defaultbuttonFunctioner; } // 刷新天体标记数量提示和天体识别按钮状态 updateCeleStatus() { if (!this.celeStatus) return; const count = this.CeleArray.num(); this.celeStatus.innerHTML = this.getCeleStatusText(count); this.updateRecognizeButton(count); } getCeleStatusText(count) { if (count < 3) return `已标记天体:${count} / 3,请至少标记 3 个天体后再进行天体识别`; return `已标记天体:${count} 个`; } updateRecognizeButton(count) { const recognizeButton = document.getElementById('recognizeStars'); if (recognizeButton) { recognizeButton.classList.toggle('is-disabled', count < 3); recognizeButton.setAttribute('aria-disabled', count < 3 ? 'true' : 'false'); } } // 获取当前日期时间时区的时间戳 getTimestamp() { let timeZoneOffset = this.timeZone.value; if (timeZoneOffset.length === 1) { timeZoneOffset = '0' + timeZoneOffset + ':00'; } else if (timeZoneOffset.length === 2) { timeZoneOffset = timeZoneOffset + ':00'; } let date = new Date( this.date.value + 'T' + this.time.value + (this.timeZone.value >= 0 ? '+' : '') + timeZoneOffset ); return date.getTime() / 1000; } /** * 设置日期时间时区 * @param {Number} timestamp 日期时间 */ setDatebyTime(timestamp) { let datetime = new Date(timestamp * 1000); let date = datetime.toLocaleDateString().split('/'); let year = date[0]; let month = date[1]; let day = date[2]; this.date.value = `${year}-${month.padStart(2, '0')}-${day.padStart(2, '0')}`; this.time.value = datetime.toLocaleTimeString(); this.timeZone.value = -datetime.getTimezoneOffset() / 60; } } export { InteractPhoto }; ================================================ FILE: src/interface/elements/Baseclass.js ================================================ import { Path, IText, Line } from 'fabric'; // 点基类 class ShapeObject { constructor(x, y, id, canvas, color, label) { this.x = x; this.y = y; this.id = id; this.canvas = canvas; this.color = color; this.point = new Path('M15 0 16 16 17 0ZM0 15 16 16 0 17ZM15 32 16 16 17 32ZM32 17 16 16 32 15Z', { left: x - 16.5, top: y - 16.5, width: 32, height: 32, fill: this.color, hasControls: false, }); this.label = new IText(label, { left: x + 16.5, top: y - 10.5, fontSize: 16, fontFamily: 'Segoe WPC,Segoe UI,Microsoft YaHei,sans-serif', fill: this.color, selectable: false, hoverCursor: 'grab', }); this.deleter = new IText('×', { left: x - 28.5, top: y - 24.5, fontSize: 20, fill: '#CF0000', hasControls: false, hoverCursor: 'pointer', }); this.point.on('moving', this.onMove.bind(this)); this.canvas.add(this.point); this.canvas.add(this.label); this.point.on('selected', this.displayDeleter.bind(this)); this.point.on('deselected', this.hideDeleter.bind(this)); this.deleter.on('mousedown', this.remove.bind(this)); } setRealXY(x, y) { (this.x = x), (this.y = y); (this.point.left = x - 16.5), (this.point.top = y - 16.5); this.onMove(); } onMove() { this.label.left = this.point.left + 33; this.label.top = this.point.top + 6; this.label.setCoords(); this.deleter.left = this.point.left - 12; this.deleter.top = this.point.top - 8; this.deleter.setCoords(); } onZoom() {} remove() { this.canvas.remove(this.point); this.canvas.remove(this.label); this.canvas.remove(this.deleter); } displayDeleter() { this.canvas.add(this.deleter); this.canvas.renderAll(); } hideDeleter() { this.canvas.remove(this.deleter); this.canvas.renderAll(); } } // 线基类 class LineObject { constructor(coordinates, canvas, color) { this.coordinates = coordinates; this.canvas = canvas; this.color = color; this.line = new Line(this.coordinates, { fill: this.color, stroke: this.color, strokeWidth: 1, selectable: false, hoverCursor: 'grab', }); this.canvas.add(this.line); } remove() { this.canvas.remove(this.line); } } // 数据结构基类 class markerArray { constructor(interactPhoto) { this.array = []; this.interactPhoto = interactPhoto; } num() { return this.array.length; } add(obj) { this.array.push(obj); } /* eslint-disable-next-line no-unused-vars */ remove(id) {} get(id) { return this.array[id]; } clear() { for (let i of this.array) { i.remove(); } this.array = []; } } export { ShapeObject, LineObject, markerArray }; ================================================ FILE: src/interface/elements/CelestialBody.js ================================================ import { ShapeObject, markerArray } from './Baseclass.js'; import { autoCompleteStarName } from '../functions/AutoComplete.js'; const MIN_STAR_ROWS = 3; // 星体类 class CelestialBody extends ShapeObject { constructor(x, y, id, canvas) { super(x, y, id, canvas, '#FFD248', `${id}`); // 初始化图上名字 this.onRename(); // 初始化图上坐标 this.addToTable(); } /** * 四舍五入到指定位数 * @param num {number} 原始数据 * @param digits {number} 小数点后的位数 * @returns {number} 四舍五入后的结果 */ round(num, digits = 0) { let tmp = 10 ** digits; return Math.round(num * tmp) / tmp; } addToTable(x = this.x, y = this.y) { const coordX = document.getElementById(`coordX${this.id}`); const coordY = document.getElementById(`coordY${this.id}`); coordX.value = this.round(x, 2); coordY.value = this.round(y, 2); coordX.dataset.rawValue = x; coordY.dataset.rawValue = y; } onMove() { super.onMove(); // 修改表格内容(貌似性能不是很好) this.addToTable(this.point.left + 16.5, this.point.top + 16.5); } /** * 当表格内星星名字变动时,在图上重命名 */ onRename() { // 获取填写的名称 let name = document.getElementById(`name${this.id}`).value; // this.id 为字符串 name数字 // 若没填写名字,显示两位数编号 if (name === '' || name === '\n') { name = this.id.toString().padStart(2, '0'); } // 必须使用 set() 方法并刷新画布,否则文本更改不会显示 this.label.set('text', name); this.canvas.renderAll(); } remove() { super.remove(); } removeTableData() { document.getElementById(`name${this.id}`).value = ''; document.getElementById(`hAngleH${this.id}`).textContent = ''; document.getElementById(`hAngleM${this.id}`).textContent = ''; document.getElementById(`hAngleS${this.id}`).textContent = ''; delete document.getElementById(`hAngleS${this.id}`).dataset.rawValue; document.getElementById(`declinD${this.id}`).textContent = ''; document.getElementById(`declinM${this.id}`).textContent = ''; document.getElementById(`declinS${this.id}`).textContent = ''; delete document.getElementById(`declinS${this.id}`).dataset.rawValue; document.getElementById(`coordX${this.id}`).value = ''; document.getElementById(`coordY${this.id}`).value = ''; delete document.getElementById(`coordX${this.id}`).dataset.rawValue; delete document.getElementById(`coordY${this.id}`).dataset.rawValue; document.getElementById(`name${this.id}`).oninput = null; document.getElementById(`name${this.id}`).onfocus = null; document.getElementById(`coordX${this.id}`).oninput = null; document.getElementById(`coordY${this.id}`).oninput = null; } } class CeleArray extends markerArray { constructor(interactPhoto) { super(interactPhoto); } add(x, y) { const id = this.num() + 1; this.ensureTableRow(id); // 判断星星数量是否已超过表格行数 let inputTable = document.getElementById('inputTable'); if (!inputTable) return; // 创建新的星星对象 let star = new CelestialBody(x, y, id, this.interactPhoto.canvas); this.array.push(star); // 为新添加的星星绑定与CeleArray相关的删除事件 star.deleter .on('mousedown', () => { this.remove(star.id); }) .bind(this); this.bindTableRow(id); this.interactPhoto.updateCeleStatus(); } initializeTableRows() { for (let i = 1; i <= this.tableStarRowCount(); i++) { this.bindTableRow(i); } this.interactPhoto.updateCeleStatus(); } tableStarRowCount() { const inputTable = document.getElementById('inputTable'); return inputTable ? inputTable.rows.length - 2 : 0; } ensureTableRow(id) { while (this.tableStarRowCount() < id) { this.addEmptyRow(); } } addEmptyRow() { let inputTable = document.getElementById('inputTable'); if (!inputTable) return; const id = this.tableStarRowCount() + 1; let newRow = inputTable.insertRow(id + 1); newRow.innerHTML = this.createStarRowHTML(id); this.bindTableRow(id); } createStarRowHTML(id) { return ` ${id}
h
m
s
°
`; } bindTableRow(id) { const name = document.getElementById(`name${id}`); const coordX = document.getElementById(`coordX${id}`); const coordY = document.getElementById(`coordY${id}`); const removeButton = document.querySelector(`.removeCeleRow[data-star-id="${id}"]`); if (name) { if (!name.dataset.autocompleteBound) { autoCompleteStarName(name); name.dataset.autocompleteBound = 'true'; } name.oninput = () => { const star = this.array[id - 1]; if (star) star.onRename(); }; name.onfocus = () => { const star = this.array[id - 1]; if (!star) return; star.canvas.setActiveObject(star.point); star.canvas.renderAll(); }; } const handleCoordInput = () => { const x = parseFloat(coordX.value); const y = parseFloat(coordY.value); if (!Number.isFinite(x) || !Number.isFinite(y)) return; coordX.dataset.rawValue = x; coordY.dataset.rawValue = y; if (!this.interactPhoto.movable) { this.interactPhoto.tips.innerHTML = '请先选择星空照片'; return; } if (id <= this.num()) { this.array[id - 1].setRealXY(x, y); this.array[id - 1].point.setCoords(); this.array[id - 1].label.setCoords(); this.interactPhoto.canvas.renderAll(); return; } if (id === this.num() + 1) { this.add(x, y); } else { this.interactPhoto.tips.innerHTML = `请先填写第 ${this.num() + 1} 行的 x、y 坐标`; } }; if (coordX) coordX.oninput = handleCoordInput; if (coordY) coordY.oninput = handleCoordInput; if (removeButton) { removeButton.onclick = () => { this.removeTableRow(id); }; } } clearTableRowData(id) { document.getElementById(`name${id}`).value = ''; document.getElementById(`hAngleH${id}`).textContent = ''; document.getElementById(`hAngleM${id}`).textContent = ''; document.getElementById(`hAngleS${id}`).textContent = ''; delete document.getElementById(`hAngleS${id}`).dataset.rawValue; document.getElementById(`declinD${id}`).textContent = ''; document.getElementById(`declinM${id}`).textContent = ''; document.getElementById(`declinS${id}`).textContent = ''; delete document.getElementById(`declinS${id}`).dataset.rawValue; document.getElementById(`coordX${id}`).value = ''; document.getElementById(`coordY${id}`).value = ''; delete document.getElementById(`coordX${id}`).dataset.rawValue; delete document.getElementById(`coordY${id}`).dataset.rawValue; } copyTableRowData(fromId, toId) { document.getElementById(`name${toId}`).value = document.getElementById(`name${fromId}`).value; document.getElementById(`hAngleH${toId}`).textContent = document.getElementById(`hAngleH${fromId}`).textContent; document.getElementById(`hAngleM${toId}`).textContent = document.getElementById(`hAngleM${fromId}`).textContent; document.getElementById(`hAngleS${toId}`).textContent = document.getElementById(`hAngleS${fromId}`).textContent; document.getElementById(`declinD${toId}`).textContent = document.getElementById(`declinD${fromId}`).textContent; document.getElementById(`declinM${toId}`).textContent = document.getElementById(`declinM${fromId}`).textContent; document.getElementById(`declinS${toId}`).textContent = document.getElementById(`declinS${fromId}`).textContent; document.getElementById(`coordX${toId}`).value = document.getElementById(`coordX${fromId}`).value; document.getElementById(`coordY${toId}`).value = document.getElementById(`coordY${fromId}`).value; this.copyRawValue(`hAngleS${fromId}`, `hAngleS${toId}`); this.copyRawValue(`declinS${fromId}`, `declinS${toId}`); this.copyRawValue(`coordX${fromId}`, `coordX${toId}`); this.copyRawValue(`coordY${fromId}`, `coordY${toId}`); } copyRawValue(fromElementId, toElementId) { const fromElement = document.getElementById(fromElementId); const toElement = document.getElementById(toElementId); if (fromElement.dataset.rawValue === undefined) { delete toElement.dataset.rawValue; } else { toElement.dataset.rawValue = fromElement.dataset.rawValue; } } removeTableRow(id) { if (id <= this.num()) { this.array[id - 1].remove(); this.remove(id); return; } let inputTable = document.getElementById('inputTable'); if (this.tableStarRowCount() > MIN_STAR_ROWS) { inputTable.deleteRow(id + 1); for (let i = id; i <= this.tableStarRowCount(); i++) { this.renumberTableRow(i); this.bindTableRow(i); } } else { this.clearTableRowData(id); this.bindTableRow(id); } this.interactPhoto.updateCeleStatus(); } renumberTableRow(id) { let inputTable = document.getElementById('inputTable'); const row = inputTable.rows[id + 1]; if (!row) return; row.cells[0].innerHTML = id; row.querySelectorAll('[id]').forEach((element) => { element.id = element.id.replace(/\d+$/, id); }); const removeButton = row.querySelector('.removeCeleRow'); if (removeButton) removeButton.dataset.starId = id; } /** * 从数组中删除指定id(从1开始计)的星星 * 注:不处理星星标记本身的删除逻辑 * @param {Number} id */ remove(id) { // 先清除表格数据 this.array[id - 1].removeTableData(); // 对后面的星星进行 id 更新 for (let celeBody of this.array) { if (celeBody.id > id) { this.copyTableRowData(celeBody.id, celeBody.id - 1); celeBody.removeTableData(); celeBody.id--; celeBody.onRename(); } } // 最后从数组中删除对应星星 this.array.splice(id - 1, 1); // 删除最后一行表格 let inputTable = document.getElementById('inputTable'); if (inputTable.rows.length - 2 > MIN_STAR_ROWS) { inputTable.deleteRow(inputTable.rows.length - 1); } for (let i = 1; i <= this.tableStarRowCount(); i++) { this.bindTableRow(i); } this.interactPhoto.updateCeleStatus(); } clear() { let inputTable = document.getElementById('inputTable'); while (inputTable.rows.length - 2 > MIN_STAR_ROWS) { inputTable.deleteRow(inputTable.rows.length - 1); } // 清空表格数据 for (let i = 1; i <= this.tableStarRowCount(); i++) { this.clearTableRowData(i); document.getElementById(`name${i}`).oninput = null; document.getElementById(`name${i}`).onfocus = null; document.getElementById(`coordX${i}`).oninput = null; document.getElementById(`coordY${i}`).oninput = null; } // 清空星星及其数组 for (let i of this.array) { i.remove(); } this.array = []; for (let i = 1; i <= this.tableStarRowCount(); i++) { this.bindTableRow(i); } this.interactPhoto.updateCeleStatus(); } } export { CelestialBody, CeleArray }; ================================================ FILE: src/interface/elements/PlumbLine.js ================================================ import { ShapeObject, LineObject, markerArray } from './Baseclass.js'; // 线端点类 class PLpoint extends ShapeObject { constructor(coordinate, interactPhoto, canvas, id, color) { super(coordinate[0], coordinate[1], id, canvas, color, ''); this.coordinate = coordinate; this.interactPhoto = interactPhoto; } onMove() { super.onMove(); this.coordinate = [this.point.left + 16.5, this.point.top + 16.5]; } } // 端点线类 class PLLine { constructor(interactPhoto) { this.interactPhoto = interactPhoto; this.points = []; this.lineObject = null; } // 添加线段移动事件,通常是在添加第二个点后调用 addMoveLineEvent() { this.points[0].point.off('moving'); this.points[1].point.off('moving'); this.points[0].point.on('moving', this.onMovePoint.bind(this, this.points[0])); this.points[1].point.on('moving', this.onMovePoint.bind(this, this.points[1])); } // 点移动事件,用于更新线段位置,通常在点移动时调用 onMovePoint(PLpoint) { PLpoint.onMove(); // TODO: 在这里执行点的更新工作 let line = this.lineObject.line; line.set({ x1: this.points[0].coordinate[0], y1: this.points[0].coordinate[1], x2: this.points[1].coordinate[0], y2: this.points[1].coordinate[1], }); line.setCoords(); // 更新线的位置 this.interactPhoto.canvas.renderAll(); // 刷新画布以显示更改 } // 删除本端点线 remove() { this.points.forEach((point) => point.remove()); if (this.lineObject != null) { this.lineObject.remove(); } } } class PLArray extends markerArray { constructor(interactPhoto) { super(interactPhoto); } add(coordinate) { // 如果数组为空或者最后一个线段已经有两个点了,就新建一个线段 if (this.array.length == 0 || this.array.slice(-1)[0].points.length == 2) { let pl = new PLLine(this.interactPhoto); this.array.push(pl); } // 获取当前最后一个线段 let lastPLLine = this.array.slice(-1)[0]; let newPointID = this.num() * 2 - 2 + lastPLLine.points.length; // 添加点 let newpPoint = new PLpoint(coordinate, this.interactPhoto, this.interactPhoto.canvas, newPointID, '#35dc96'); lastPLLine.points.push(newpPoint); // 如果有了两个端点,就添加线段 if (lastPLLine.points.length == 2) { let lineCoord = [lastPLLine.points[0].coordinate, lastPLLine.points[1].coordinate].flat(); lastPLLine.lineObject = new LineObject(lineCoord, this.interactPhoto.canvas, '#35dc96'); lastPLLine.addMoveLineEvent(); } else if (lastPLLine.points.length > 2) { console.error('Too many points in a line.'); } // 绑定删除按钮事件 newpPoint.deleter .on('mousedown', () => { this.remove(newpPoint.id); }) .bind(this); } remove(id) { let deletedId = Math.floor(id / 2); this.array[deletedId].remove(); // 删除对应的线段 this.array.splice(deletedId, 1); // 更新后面的线中的点的 ID for (let i = deletedId; i < this.num(); ++i) { for (let j = 0; j < this.array[i].points.length; ++j) { this.array[i].points[j].id -= 2; } } } } export { PLpoint, PLLine, PLArray }; ================================================ FILE: src/interface/elements/Rectangle.js ================================================ import { Rect } from 'fabric'; class Rectangle { constructor(x, y, canvas) { this.canvas = canvas; this.rect = new Rect({ left: x, top: y, strokeWidth: 2, stroke: 'blue', fill: 'rgba(0,0,0,0)', width: 0, height: 0, selectable: false, hoverCursor: 'grab', }); this.canvas.add(this.rect); } update(x, y) { this.rect.set({ width: x - this.rect.left, height: y - this.rect.top }); this.canvas.renderAll(); } getCoordinates() { return { left: this.rect.left, top: this.rect.top, width: this.rect.width, height: this.rect.height, }; } } export { Rectangle }; ================================================ FILE: src/interface/functions/AutoComplete.js ================================================ import fuzzysort from 'fuzzysort'; import { starZH2EN } from '../starZH2EN.js'; const options = { limit: 100, threshold: 0.4, all: false }; function autoCompleteStarName(inp) { /*从英汉对照表获取所有名称,并去重*/ var currentFocus; // 当前焦点 var arrAllStarNames = []; var tmp = Array.from(new Set(Object.keys(starZH2EN).concat(Object.values(starZH2EN)))); tmp.forEach((t) => arrAllStarNames.push(fuzzysort.prepare(t))); /*输入框输入时,自动显示实时补全项*/ inp.addEventListener('input', function () { var divA, divB, val = this.value; closeAllLists(); if (!val) { return false; } // 如果输入框为空,直接返回 currentFocus = 0; /* 创建一个DIV邻元素,作为自动补全项的容器 结构如下:
...
*/ divA = document.createElement('DIV'); divA.setAttribute('id', this.id + '-autocomplete'); divA.setAttribute('class', 'autocomplete-items'); this.parentNode.appendChild(divA); divB = document.createElement('DIV'); divB.setAttribute('class', 'autocomplete-list'); divB.setAttribute('id', this.id + '-autocomplete-list'); divA.appendChild(divB); var autoCompleteList = fuzzysort.go(val.toLowerCase(), arrAllStarNames, options); autoCompleteList.sort(function (first, second) { return second.score - first.score; }); /* 创建自动补全项 */ autoCompleteList.forEach((element) => { let divItem = document.createElement('DIV'); divItem.innerHTML += element.highlight(); divItem.innerHTML += ""; divItem.addEventListener('click', function () { inp.value = this.getElementsByTagName('input')[0].value; inp.dispatchEvent(new Event('input')); closeAllLists(); }); divB.appendChild(divItem); }); }); /*键盘事件*/ inp.addEventListener('keydown', function (e) { let divA = document.getElementById(this.id + '-autocomplete'); if (divA) var items = divA.getElementsByTagName('div'); if (e.keyCode == 9) { // tab/shift+tab: move between celestial-name inputs, not autocomplete items const currentId = this.id.match(/^name(\d+)$/); const nextId = currentId ? Number(currentId[1]) + (e.shiftKey ? -1 : 1) : null; const nextInput = nextId ? document.getElementById(`name${nextId}`) : null; closeAllLists(); if (nextInput) { e.preventDefault(); nextInput.focus(); } } else if (e.keyCode == 38) { //up e.preventDefault(); currentFocus--; addActive(items); fixScrolling(items); } else if (e.keyCode == 40) { //down e.preventDefault(); currentFocus++; addActive(items); fixScrolling(items); } else if (e.keyCode == 13) { //enter e.preventDefault(); if (currentFocus > 0) { if (items) items[currentFocus].click(); } else { closeAllLists(); } } else if (e.keyCode == 27) { //esc e.preventDefault(); closeAllLists(); } }); /*点击其他地方关闭自动补全项候选框*/ document.addEventListener('click', function (e) { closeAllLists(e.target); }); /*修正滚动条位置*/ function fixScrolling(item) { if (!item) return false; var l = document.getElementsByClassName('autocomplete-list')[0]; var singleItemHeight = l.scrollHeight / (item.length - 1); console.info((currentFocus - 1) * singleItemHeight); if ((currentFocus - 1) * singleItemHeight >= l.scrollTop + l.clientHeight - singleItemHeight) { l.scrollTop = (currentFocus - 1 - 4) * singleItemHeight; } if ((currentFocus - 1) * singleItemHeight < l.scrollTop) { l.scrollTop = Math.max(0, (currentFocus - 1) * singleItemHeight); } } /*添加active*/ function addActive(items) { if (!items) return false; removeActive(items); if (currentFocus >= items.length) currentFocus = 1; if (currentFocus < 1) currentFocus = items.length - 1; items[currentFocus].classList.add('autocomplete-active'); } /*移除所有active*/ function removeActive(items) { for (var i = 0; i < items.length; i++) { items[i].classList.remove('autocomplete-active'); } } /*关闭自动补全项候选框*/ function closeAllLists(elmnt) { let divA = document.getElementsByClassName('autocomplete-items'); for (let i = 0; i < divA.length; i++) { if (elmnt != divA[i] && elmnt != inp) { divA[i].parentNode.removeChild(divA[i]); } } } } export { autoCompleteStarName }; ================================================ FILE: src/interface/functions/Calc.js ================================================ import { DefaultbuttonFunctioner } from './Default.js'; import { BACKEND_API } from '../../config.js'; import { getOriginalStars, getGlobalPLPointsCoord, post } from '../utils.js'; // 计算地理位置按钮功能类 class Calc extends DefaultbuttonFunctioner { constructor(interactPhoto, celeCoord) { super(interactPhoto); this.celeCoord = celeCoord; } onClick() { super.onClick(); if (!this.interactPhoto.movable) return; let isAutoCeleCoord = document.getElementById('check3').checked; // 是否自动计算天体坐标 if (isAutoCeleCoord) { // 先计算天体坐标 this.celeCoord.calc().then((code) => { // 如果天体坐标计算成功,再计算地理位置 if (code == 0) { this.calc(); } }); } else { this.calc(); } } // 重置标注数据 clearData() { document.getElementById('zenX').value = ''; document.getElementById('zenY').value = ''; } // 计算地理位置 calc() { // 读取数据 let globalPLsPointsCoord = getGlobalPLPointsCoord(this.interactPhoto); let originalStars = getOriginalStars(this.interactPhoto); // 检查数据 if (originalStars.length < 3) { this.interactPhoto.tips.innerHTML = `请至少选择三颗星`; return; } else if (!this.checkStars(originalStars)) { this.interactPhoto.tips.innerHTML = `请完整填写星星数据`; return; } else if (globalPLsPointsCoord.length < 2) { this.interactPhoto.tips.innerHTML = `请至少选择两条铅垂线`; return; } // 开始计算 this.interactPhoto.buttonFunctioner = this; this.interactPhoto.tips.innerHTML = `计算中...`; post( `${BACKEND_API}/positioning`, { photo: { stars: originalStars, lines: globalPLsPointsCoord, }, isFixRefraction: document.getElementById('check1').checked, isFixGravity: document.getElementById('check2').checked, }, 'json' ).then(([results, detail]) => { if (detail === 'success') { // 显示结果 this.addZenithtoTable(results['topPoint']); this.showZ(results['z']); this.showGeoEstimate(results['lon'], results['lat']); this.interactPhoto.tips.innerHTML = '计算地理位置成功'; } else { this.interactPhoto.tips.innerHTML = `计算地理位置失败:${detail}`; } }); // 结束计算 this.interactPhoto.resetbuttonFunctioner(); } // 检查originalStars数组每个子项的数据是否完整 checkStars(originalStars) { let isComplete = true; originalStars.forEach((originalStar) => { Object.values(originalStar).forEach((data) => { if (!data) { isComplete = false; } }); }); return isComplete; } // 添加天顶坐标到表格 addZenithtoTable(zenith) { document.getElementById('zenX').value = Math.round(zenith[0] * 100) / 100; document.getElementById('zenY').value = Math.round(zenith[1] * 100) / 100; } // 显示焦距 showZ(z) { document.getElementById('focLenPix').textContent = Math.round(z * 1000) / 1000; let width = this.interactPhoto.img.width; let height = this.interactPhoto.img.height; let tri_long = Math.sqrt(width * width + height * height); let z35 = (z * 43.27) / tri_long; document.getElementById('focLenMm').textContent = Math.round(z35); } // 显示地理坐标 showGeoEstimate(geoLon, geoLat) { /*global BMapGL*/ // 转换单位 geoLon = (geoLon * 180) / Math.PI; geoLat = (geoLat * 180) / Math.PI; // 在地图上显示位置 geoLon = this.wrapAngleInDeg(geoLon); document.getElementById('outputLat').textContent = Math.round(geoLat * 10000) / 10000 + '°'; document.getElementById('outputLong').textContent = Math.round(geoLon * 10000) / 10000 + '°'; let map = this.interactPhoto.map; // 清除之前的标记 map.clearOverlays(); // 逆地址解析 let addressDiv = document.getElementById('address'); addressDiv.innerText = '正在获取地理位置信息...'; // 创建地理编码实例 let myGeo = new BMapGL.Geocoder(); // 根据坐标得到地址描述 myGeo.getLocation(new BMapGL.Point(geoLon, geoLat), function (result) { if (result) { addressDiv.innerText = result.address; } else { addressDiv.innerText = '获取地理位置信息失败'; } }); // 添加新的标记 let geoPoint = new BMapGL.Point(geoLon, geoLat); let newMarker = new BMapGL.Marker(geoPoint); map.addOverlay(newMarker); // 误差线 let shift = 0.125; // TODO: 从界面读取误差值 let polyline = new BMapGL.Polyline( [ new BMapGL.Point(this.wrapAngleInDeg(geoLon - shift), geoLat), new BMapGL.Point(this.wrapAngleInDeg(geoLon + shift), geoLat), ], { strokeColor: 'red', strokeWeight: 2, strokeOpacity: 0.5, } ); map.addOverlay(polyline); map.centerAndZoom(geoPoint, 10); } /** * 使得角度位于 [-180,180] * @param {number} deg * @returns {number} */ wrapAngleInDeg(deg) { while (deg > 180) { deg -= 360; } while (deg < -180) { deg += 360; } return deg; } } export { Calc }; ================================================ FILE: src/interface/functions/CeleCoord.js ================================================ import { BACKEND_API } from '../../config.js'; import { post, setHADE } from '../utils.js'; // 计算天体坐标功能类 class CeleCoord { constructor(interactPhoto) { this.interactPhoto = interactPhoto; } async calc() { // 读取数据 let starNames = this.getStarNames(); let timestamp = this.interactPhoto.getTimestamp(); // 检查是否有未填写的天体名称 if (starNames === null) { this.interactPhoto.tips.innerHTML = `请填写所有天体名称`; return -1; } // 开始计算 let [results, detail] = await post( `${BACKEND_API}/astrocoord`, { starNames: starNames, timestamp: timestamp, }, 'json' ); if (results === null) { this.interactPhoto.tips.innerHTML = `自动计算天体坐标失败:${detail}`; return -1; } this.interactPhoto.tips.innerHTML = `自动计算天体坐标成功`; for (let i = 0; i < starNames.length; i++) { let [ha, dec] = results['haDecs'][starNames[i]]; if (isNaN(ha) || isNaN(dec)) { this.interactPhoto.tips.innerHTML = `无法自动计算${starNames[i]}坐标,请检查天体名称是否正确`; return -1; } else { setHADE(i + 1, 360 - ha * 15, dec); // 时角变参考时角 } } return 0; } getStarNames() { let starNames = []; for (let i = 1; i <= this.interactPhoto.CeleArray.num(); i++) { if (document.getElementById(`name${i}`).value === '') { return null; } starNames.push(document.getElementById(`name${i}`).value); } return starNames; } } export { CeleCoord }; ================================================ FILE: src/interface/functions/CeleRecognition.js ================================================ import { DefaultbuttonFunctioner } from './Default.js'; import { post, setHADE } from '../utils.js'; import { BACKEND_API } from '../../config.js'; // 天体识别按钮功能类 class RecognizeStars extends DefaultbuttonFunctioner { constructor(interactPhoto) { super(interactPhoto); this.isRecognizing = false; // 是否正在自动识星 this.xy = null; // 所有天体的图上坐标 } onClick() { super.onClick(); if (!this.interactPhoto.movable) return; if (this.isRecognizing) { // 自动识星可能比较耗时,可以让用户取消 this.clearData(); this.interactPhoto.resetbuttonFunctioner(); this.interactPhoto.tips.innerHTML = '已取消自动识星'; return; } // 检查数据 const count = this.interactPhoto.CeleArray.num(); if (count < 3) { this.interactPhoto.tips.innerHTML = `请至少选择三颗星,当前已标记 ${count} 个`; return; } this.interactPhoto.buttonFunctioner = this; this.isRecognizing = true; this.submitData(); } clearData() { this.isRecognizing = false; this.xy = null; } // 提交数据 async submitData() { this.interactPhoto.tips.innerHTML = '正在申请任务排队(0/3)'; this.xy = this.getXY(); const subImages = await this.getSubImages(this.xy); const image_width = this.interactPhoto.img.width; const image_height = this.interactPhoto.img.height; const formData = { sub_images: subImages, xy: JSON.stringify(this.xy), image_width: image_width, image_height: image_height, scale_lower: document.getElementById('setScopeAngle1').value, scale_upper: document.getElementById('setScopeAngle2').value, }; post(BACKEND_API + '/astrometry/submit', formData, 'form').then(([results, detail]) => { if (detail == 'success') { this.interactPhoto.tips.innerHTML = '正在求解天体坐标(1/3)'; this.inquire(results['job_id']); } else { this.interactPhoto.tips.innerHTML = `提交数据失败:${detail}`; this.clearData(); // TODO:其他按钮功能类可能也需要清除状态 this.interactPhoto.resetbuttonFunctioner(); } }); } // 轮询Astrometry任务是否成功 inquire(jobid) { fetch(`${BACKEND_API}/astrometry/jobidstatus/${jobid}`, { method: 'GET', }) .then((response) => { return response.json(); }) .then((data) => { if (data['status'] === 'success') { this.interactPhoto.tips.innerHTML = '正在识别天体名称(2/3)'; this.recognizeStars(jobid); } else if (data['status'] === 'failure') { this.interactPhoto.tips.innerHTML = '无法确定天体坐标'; this.clearData(); this.interactPhoto.resetbuttonFunctioner(); } else { setTimeout(() => { this.inquire(jobid); }, 1000); } }) .catch((error) => { this.interactPhoto.tips.innerHTML = `查询任务状态失败:${error}`; this.clearData(); this.interactPhoto.resetbuttonFunctioner(); }); } // 识别星名 recognizeStars(jobid) { const data = { job_id: jobid, xy: this.xy, timestamp: this.interactPhoto.getTimestamp(), is_zh: true, }; post(BACKEND_API + '/astrometry/recognize', data, 'json').then(([results, detail]) => { if (detail == 'success') { this.interactPhoto.tips.innerHTML = '识别成功(3/3)'; this.showStars(results); } else { this.interactPhoto.tips.innerHTML = `识别失败:${detail}`; } this.clearData(); this.interactPhoto.resetbuttonFunctioner(); }); } // 获取天体的图上坐标 getXY() { let xy = []; let width = this.interactPhoto.rect.width; let height = this.interactPhoto.rect.height; for (const star of this.interactPhoto.CeleArray.array) { xy.push([star.x + width / 2, star.y + height / 2]); } return xy; } // 获取天体的子图 getSubImages(xy) { const img = this.interactPhoto.img; const imgRect = this.interactPhoto.rect; const size = 20; // 子图的大小 function getSubImage(x, y) { // 创建一个临时的canvas用于裁剪 let tempCanvas = document.createElement('canvas'); tempCanvas.width = size; tempCanvas.height = size; let ctx = tempCanvas.getContext('2d'); // 将裁剪区域绘制到临时canvas上 const coords = { left: x - size / 2, top: y - size / 2, width: size, height: size, }; ctx.drawImage( img, // 图像元素 coords.left - imgRect.left, coords.top - imgRect.top, coords.width, coords.height, 0, 0, coords.width, coords.height ); // 将临时canvas转换为Blob对象 return new Promise((resolve) => { tempCanvas.toBlob((blob) => { resolve(blob); }); }); } let subImagesPromises = []; for (const [x, y] of xy) { subImagesPromises.push(getSubImage(x, y)); } return Promise.all(subImagesPromises); } // 显示识别结果 showStars(results) { const hd_names = results['hd_names']; for (let i = 0; i < this.interactPhoto.CeleArray.num(); i++) { const star_id = this.interactPhoto.CeleArray.array[i].id; setHADE(star_id, 360 - hd_names[i][0] * 15, hd_names[i][1]); document.getElementById(`name${star_id}`).value = hd_names[i][2]; // 手动触发输入事件,以便更新图上文字 document.getElementById(`name${star_id}`).dispatchEvent(new Event('input')); } } } export { RecognizeStars }; ================================================ FILE: src/interface/functions/Default.js ================================================ import { Point } from 'fabric'; // 默认按钮功能类,所有按钮功能类的父类 class DefaultbuttonFunctioner { constructor(interactPhoto) { this.interactPhoto = interactPhoto; this.panning = false; // 是否正在移动画布 } // 点击事件逻辑 onClick() { if (!this.interactPhoto.movable) return; } // 按钮事件处理 // 重置标注数据 clearData() {} // 选择重置缩放事件 resetZoom() { if (!this.interactPhoto.movable) return; this.interactPhoto.reZoomCanvas(this.interactPhoto.rect); } // 处理鼠标按下事件 handleMouseDown() { this.interactPhoto.lmbDown = true; if (!this.interactPhoto.movable) return; // 画布缩放移动 if ( this.interactPhoto.buttonFunctioner === this.interactPhoto.defaultbuttonFunctioner && this.interactPhoto.canvas.getActiveObject() === undefined ) { if (!this.panning) { this.interactPhoto.setCanvasCursor('grabbing'); } this.panning = true; this.interactPhoto.canvas.selection = false; } } // 处理鼠标抬起事件 handleMouseUp() { this.interactPhoto.lmbDown = false; if (!this.interactPhoto.movable) return; // 画布移动 if ( this.interactPhoto.buttonFunctioner === this.interactPhoto.defaultbuttonFunctioner && this.interactPhoto.canvas.getActiveObject() === undefined ) { this.panning = false; this.interactPhoto.canvas.selection = true; this.interactPhoto.setCanvasCursor('grab'); } } // 处理鼠标移动事件 handleMouseMove(e) { // 星体及铅垂线取消选择 if (this.interactPhoto.buttonFunctioner != this.interactPhoto.defaultbuttonFunctioner) { this.CancelPicking(e); } // 坐标显示 if (this.interactPhoto.movable && e && !this.panning) { let p = this.interactPhoto.canvas.getPointer(e.e); this.interactPhoto.cursorCrd.innerHTML = `${Math.round(p.x * 100) / 100},${Math.round(p.y * 100) / 100}`; } // 处理画布移动 if (this.panning && e) { let isTouch = e.e.targetTouches !== undefined; if (!isTouch || e.e.targetTouches.length == 1) { var delta = new Point(e.e.movementX, e.e.movementY); this.interactPhoto.canvas.relativePan(delta); } else if (e.e.targetTouches.length == 2) { if (e.e.scale === undefined) return; let zoom = this.interactPhoto.canvas.getZoom(); zoom *= e.e.scale; if (zoom > 20) zoom = 20; if (zoom < 0.01) zoom = 0.1; this.interactPhoto.canvas.zoomToPoint( { x: (e.e.targetTouches[0].pageX + e.e.targetTouches[1].pageX) / 2, y: (e.e.targetTouches[0].pageY + e.e.targetTouches[1].pageY) / 2, }, zoom ); } } } // 处理鼠标移出事件 handleMouseOut(e) { if (!this.interactPhoto.movable) return; if (e) { this.interactPhoto.cursorCrd.innerHTML = ''; } } // 处理鼠标滚轮事件用于缩放照片大小 handleMouseWheel(opt) { if (!this.interactPhoto.movable) return; opt.e.preventDefault(); const delta = opt.e.deltaY; let zoom = this.interactPhoto.canvas.getZoom(); // 使用 canvas 直接引用 zoom *= 0.999 ** delta; if (zoom > 20) zoom = 20; if (zoom < 0.01) zoom = 0.1; this.interactPhoto.canvas.zoomToPoint( { x: opt.e.offsetX, y: opt.e.offsetY, }, zoom ); } // 处理页面改变大小事件 handleResize() { this.interactPhoto.canvas.setWidth(this.interactPhoto.container.clientWidth); this.interactPhoto.canvas.setHeight(this.interactPhoto.container.clientHeight); if (this.interactPhoto.movable) { this.interactPhoto.reZoomCanvas(this.interactPhoto.rect); } else { this.interactPhoto.reZoomCanvas(this.interactPhoto.text, true, false); } } // 取消选择星体or铅垂线 CancelPicking(e) { if (this.interactPhoto.lmbDown && e.e.movementX ** 2 + e.e.movementY ** 2 > 10) { // 按下左键后,滑动超过一定范围才取消选择 this.interactPhoto.cancelOp = true; this.interactPhoto.canvas.selection = false; this.interactPhoto.tips.innerHTML = '松开鼠标取消标记。'; this.interactPhoto.setCanvasCursor('not-allowed'); return; } this.interactPhoto.setCanvasCursor('crosshair'); } } export { DefaultbuttonFunctioner }; ================================================ FILE: src/interface/functions/ImageChange.js ================================================ import { FabricImage } from 'fabric'; import { DefaultbuttonFunctioner } from './Default.js'; // 图片更换功能类 class ImageChange extends DefaultbuttonFunctioner { constructor(interactPhoto, clearAllData) { super(interactPhoto); this.clearAllData = clearAllData; } loadFile(file) { if (!file || !file.type.startsWith('image/')) return; let reader = new FileReader(); reader.onload = function (e) { let img = new Image(); img.src = e.target.result; this.interactPhoto.img = img; FabricImage.fromURL(e.target.result).then((img) => { let width = img.width, height = img.height; // 移除先前图片 if (this.interactPhoto.rect != undefined) { this.clearAllData(); this.interactPhoto.canvas.remove(this.interactPhoto.rect); } // 创建图片Rect img.set({ left: width / -2, top: height / -2, selectable: false, hoverCursor: 'grab', }); this.interactPhoto.canvas.add(img); this.interactPhoto.rect = img; // 更新页面 document.getElementById('picInfo').innerHTML = `${img.width} × ${img.height}   `; this.interactPhoto.reZoomCanvas(img); }); }.bind(this); reader.readAsDataURL(file); this.interactPhoto.movable = true; this.interactPhoto.canvas.selection = true; this.interactPhoto.canvas.defaultCursor = 'grab'; this.interactPhoto.canvas.remove(this.interactPhoto.text); } onClick(e) { this.loadFile(e.target.files[0]); } } export { ImageChange }; ================================================ FILE: src/interface/functions/MoonTime.js ================================================ import { DefaultbuttonFunctioner } from './Default.js'; import { getOriginalStars, getGlobalPLPointsCoord, post } from '../utils.js'; import { BACKEND_API } from '../../config.js'; class MoonTime extends DefaultbuttonFunctioner { constructor(interactPhoto, astroCalculator, celeCoord) { super(interactPhoto); this.astroCalculator = astroCalculator; this.celeCoord = celeCoord; } onClick() { super.onClick(); if (!this.interactPhoto.movable) return; // 读取数据 let globalPLsPointsCoord = getGlobalPLPointsCoord(this.interactPhoto); let originalStars = getOriginalStars(this.interactPhoto); // 检查数据 if (!this.checkStars(originalStars)) { this.interactPhoto.tips.innerHTML = `请完整填写星星名称`; return; } else if (!this.hasMoon(originalStars)) { this.interactPhoto.tips.innerHTML = `请标记月亮`; return; } else if (originalStars.length < 4) { this.interactPhoto.tips.innerHTML = `除月外请至少选择三颗星`; return; } else if (globalPLsPointsCoord.length < 2) { this.interactPhoto.tips.innerHTML = `请至少选择两条铅垂线`; return; } let isAutoCeleCoord = document.getElementById('check3').checked; // 是否自动计算天体坐标 if (isAutoCeleCoord) { // 先计算天体坐标 this.celeCoord.calc().then((code) => { // 如果天体坐标计算成功,再计算地理位置 if (code == 0) { // 重新读取已更新的数据 let originalStars = getOriginalStars(this.interactPhoto); this.calc(originalStars, globalPLsPointsCoord); } }); } else { this.calc(originalStars, globalPLsPointsCoord); } } // 计算拍摄时间 calc(stars, globalPLsPointsCoord) { // 开始计算 this.interactPhoto.buttonFunctioner = this; this.interactPhoto.tips.innerHTML = `计算中...`; // 读取设置 let isFixRefraction = document.getElementById('check1').checked; let isFixGravity = document.getElementById('check2').checked; let approxTimestamp = this.interactPhoto.getTimestamp(); let scopeDays = parseFloat(document.getElementById('setTimeScope').value); // 计算拍摄时间 post( `${BACKEND_API}/moontime`, { photo: { stars: stars, lines: globalPLsPointsCoord, }, approxTimestamp: approxTimestamp, scopeDays: scopeDays, isFixRefraction: isFixRefraction, isFixGravity: isFixGravity, }, 'json' ).then(([results, detail]) => { if (detail === 'success') { // 显示结果 this.interactPhoto.setDatebyTime(results['time']); // 使用新时间重新计算天体坐标并显示 this.celeCoord.calc().then(() => { this.interactPhoto.tips.innerHTML = '计算拍摄时间成功'; }); } else { this.interactPhoto.tips.innerHTML = `计算拍摄时间失败:${detail}`; } }); // 结束计算 this.interactPhoto.resetbuttonFunctioner(); } // 检查originalStars数组每个子项的名称是否完整 checkStars(originalStars) { let isComplete = true; originalStars.forEach((originalStar) => { if (originalStar[0] === '') { isComplete = false; } }); return isComplete; } // 检查月亮 hasMoon(originalStars) { return originalStars.some( (star) => star['name'] === '月' || star['name'] === '月亮' || star['name'] === 'moon' ); } } export { MoonTime }; ================================================ FILE: src/interface/functions/PickCele.js ================================================ import { DefaultbuttonFunctioner } from './Default.js'; // 选择天体按钮功能类 class PickCele extends DefaultbuttonFunctioner { constructor(interactPhoto) { super(interactPhoto); this.isPickingCele = false; // 是否正在选择天体 } onClick() { super.onClick(); if (!this.interactPhoto.movable) return; this.isPickingCele = !this.isPickingCele; this.interactPhoto.tips.innerHTML = `${this.isPickingCele ? '单击要选择的天体。' : ''}`; if (this.isPickingCele) { this.interactPhoto.buttonFunctioner = this; } else { this.interactPhoto.resetbuttonFunctioner(); } } clearData() { this.isPickingCele = false; this.interactPhoto.CeleArray.clear(); } handleMouseUp(e) { super.handleMouseUp(e); if (!this.interactPhoto.movable) return; if (this.interactPhoto.cancelOp) { this.interactPhoto.cancelOp = false; // 取消操作 } else { // 加入 let p = this.interactPhoto.canvas.getPointer(e.e); this.addStarAtPoint(p.x, p.y); } // 结束此次操作 this.isPickingCele = false; this.interactPhoto.tips.innerHTML = ''; this.interactPhoto.setCanvasCursor('grab'); this.interactPhoto.buttonFunctioner = this.interactPhoto.defaultbuttonFunctioner; } // 添加星星点的函数 addStarAtPoint(x, y) { this.interactPhoto.CeleArray.add(x, y); } } export { PickCele }; ================================================ FILE: src/interface/functions/PickPL.js ================================================ import { DefaultbuttonFunctioner } from './Default.js'; // 选择铅垂线按钮功能类 class PickPL extends DefaultbuttonFunctioner { constructor(interactPhoto) { super(interactPhoto); this.isPickingPL = false; // 是否正在选择铅垂线 } onClick() { super.onClick(); if (!this.interactPhoto.movable) return; this.isPickingPL = !this.isPickingPL; this.interactPhoto.tips.innerHTML = `${this.isPickingPL ? '单击添加铅垂线端点。' : ''}`; if (this.isPickingPL) { this.interactPhoto.buttonFunctioner = this; } else { this.interactPhoto.resetbuttonFunctioner(); } } clearData() { this.isPickingPL = false; for (let pl of this.interactPhoto.PLArray.array) { pl.remove(); } this.interactPhoto.PLArray.array = []; } handleMouseUp(e) { super.handleMouseUp(e); if (!this.interactPhoto.movable) return; // 选择铅垂线 if (this.isPickingPL) { if (this.interactPhoto.cancelOp) { this.interactPhoto.cancelOp = false; // 取消操作 } else { // 加入一个端点 let p = this.interactPhoto.canvas.getPointer(e.e); this.addPL([p.x, p.y]); // 结束此次操作 this.isPickingPL = false; this.interactPhoto.resetbuttonFunctioner(); this.interactPhoto.tips.innerHTML = ''; this.interactPhoto.setCanvasCursor('grab'); } } } // 添加铅垂线的函数 addPL(coordinate) { this.interactPhoto.PLArray.add(coordinate); } } export { PickPL }; ================================================ FILE: src/interface/functions/SelectStars.js ================================================ import { DefaultbuttonFunctioner } from './Default.js'; import { Rectangle } from '../elements/Rectangle.js'; import { post } from '../utils.js'; import { BACKEND_API } from '../../config.js'; const selectStatus = { IDLE: 0, READY: 1, SELECTING: 2, CALCING: 3, }; // 选择天体按钮功能类 class SelectStars extends DefaultbuttonFunctioner { constructor(interactPhoto) { super(interactPhoto); this.status = selectStatus.IDLE; // 框选的状态 this.rect = null; // 选择天体的矩形框 } onClick() { super.onClick(); if (!this.interactPhoto.movable) return; if (this.status === selectStatus.IDLE) { this.status = selectStatus.READY; this.interactPhoto.tips.innerHTML = '框选要寻星的区域。'; } else if (this.status === selectStatus.READY) { this.status = selectStatus.IDLE; this.interactPhoto.tips.innerHTML = ''; } if (this.status === selectStatus.READY) { this.interactPhoto.buttonFunctioner = this; } else if (this.status === selectStatus.IDLE) { this.interactPhoto.resetbuttonFunctioner(); } } clearData() { this.status = selectStatus.IDLE; } handleMouseDown(e) { super.handleMouseDown(e); if (!this.interactPhoto.movable) return; if (this.status === selectStatus.READY) { // 开始选择,创建矩形框 this.status = selectStatus.SELECTING; this.interactPhoto.setCanvasCursor('crosshair'); let p = this.interactPhoto.canvas.getPointer(e.e); this.rect = new Rectangle(p.x, p.y, this.interactPhoto.canvas); } } handleMouseMove(e) { super.handleMouseMove(e); if (!this.interactPhoto.movable) return; if (this.status === selectStatus.SELECTING) { // 更新矩形框 let p = this.interactPhoto.canvas.getPointer(e.e); this.rect.update(p.x, p.y); } } handleMouseUp(e) { super.handleMouseUp(e); if (!this.interactPhoto.movable) return; if (this.status === selectStatus.SELECTING) { // 结束选择,获取选择的天体 let coords = this.rect.getCoordinates(); this.status = selectStatus.CALCING; this.locateStars(this.interactPhoto.img, this.interactPhoto.rect, coords); // 结束此次操作 this.interactPhoto.canvas.remove(this.rect.rect); this.rect = null; this.status = selectStatus.IDLE; this.interactPhoto.tips.innerHTML = ''; this.interactPhoto.setCanvasCursor('grab'); this.interactPhoto.buttonFunctioner = this.interactPhoto.defaultbuttonFunctioner; } } // 通过选择的天体区域寻找天体 locateStars(img, imgRect, coords) { // 创建一个临时的canvas用于裁剪 var tempCanvas = document.createElement('canvas'); tempCanvas.width = coords.width; tempCanvas.height = coords.height; var ctx = tempCanvas.getContext('2d'); // 将裁剪区域绘制到临时canvas上 ctx.drawImage( img, // 图像元素 coords.left - imgRect.left, coords.top - imgRect.top, coords.width, coords.height, 0, 0, coords.width, coords.height ); // 将临时canvas转换为Blob对象 tempCanvas.toBlob((blob) => { // 使用FormData准备POST请求的数据 let formData = { image: blob, thresh: document.getElementById('setStarThresh').value }; // 发送POST请求 post(BACKEND_API + '/astrometry/extractstars', formData, 'form').then(([results, detail]) => { if (detail == 'success') { // 显示天体 this.showStars(coords.left, coords.top, results); this.interactPhoto.tips.innerHTML = `寻星成功:共找到${results.positions.length}颗星`; } else { this.interactPhoto.tips.innerHTML = `寻星失败:${detail}`; } }); }); } // 显示天体 showStars(x0, y0, stars) { console.log(stars); stars.positions.forEach((star) => { this.interactPhoto.CeleArray.add(star[0] + x0, star[1] + y0); }); } } export { SelectStars }; ================================================ FILE: src/interface/init.js ================================================ import { Canvas, IText } from 'fabric'; // 初始化页面元素 function initializeElements(interactPhoto) { interactPhoto.container = document.getElementById('box'); interactPhoto.cursorCrd = document.getElementById('cursorCrd'); interactPhoto.tips = document.getElementById('canvasStatus'); interactPhoto.celeStatus = document.getElementById('celeStatus'); interactPhoto.inputTable = document.getElementById('inputTable'); interactPhoto.date = document.getElementById('setDate'); interactPhoto.time = document.getElementById('setTime'); interactPhoto.timeZone = document.getElementById('setTimeZone'); interactPhoto.setDatebyTime(new Date().getTime() / 1000); // 设置当前日期、时间、时区 } // 初始化画布 function initializeCanvas(interactPhoto) { interactPhoto.canvas = new Canvas('canvas', { width: interactPhoto.container.clientWidth, height: interactPhoto.container.clientHeight, backgroundColor: 'black', selection: false, }); interactPhoto.text = new IText('选择星空照片。', { fill: '#8a6119', textAlign: 'center', fontSize: 40, fontFamily: '等线', selectable: false, hoverCursor: 'default', }); interactPhoto.canvas.add(interactPhoto.text); interactPhoto.reZoomCanvas(interactPhoto.text, true, false); interactPhoto.canvasInst = document.getElementsByClassName('upper-canvas')[0]; } // 初始化事件 function initializeEvents(eventManager) { let interactPhoto = eventManager.interactPhoto; interactPhoto.setCanvasCursor('grab'); // 鼠标事件绑定 interactPhoto.canvas.on('mouse:down', (e) => eventManager.handleMouseDown.call(eventManager, e)); interactPhoto.canvas.on('mouse:up', (e) => eventManager.handleMouseUp.call(eventManager, e)); interactPhoto.canvas.on('mouse:move', (e) => eventManager.handleMouseMove.call(eventManager, e)); interactPhoto.canvas.on('mouse:out', (e) => eventManager.handleMouseOut.call(eventManager, e)); interactPhoto.canvas.on('mouse:wheel', (opt) => eventManager.handleMouseWheel.call(eventManager, opt)); // 兼容手机端事件绑定 let touchEventAdapter = eventManager.touchEventAdapter.adapter.bind(eventManager.touchEventAdapter); interactPhoto.canvasInst.addEventListener('touchstart', (e) => eventManager.handleMouseDown.call(eventManager, touchEventAdapter(e)) ); interactPhoto.canvasInst.addEventListener('touchend', (e) => eventManager.handleMouseUp.call(eventManager, touchEventAdapter(e)) ); interactPhoto.canvasInst.addEventListener('touchmove', (e) => eventManager.handleMouseMove.call(eventManager, touchEventAdapter(e)) ); interactPhoto.canvasInst.addEventListener('touchcancel', (e) => eventManager.handleMouseOut.call(eventManager, touchEventAdapter(e)) ); // 窗口事件绑定 window.onresize = eventManager.handleResize.call(eventManager); // 按钮事件绑定 document.getElementById('resetPick').addEventListener('click', eventManager.clearAllData.bind(eventManager)); document .getElementById('resetZoom') .addEventListener('click', interactPhoto.buttonFunctioner.resetZoom.bind(interactPhoto.buttonFunctioner)); document .getElementById('celePick') .addEventListener('click', eventManager.pickCele.onClick.bind(eventManager.pickCele)); document.getElementById('vaniZen').addEventListener('click', eventManager.pickPL.onClick.bind(eventManager.pickPL)); document .getElementById('srcFile') .addEventListener('change', (e) => eventManager.imageChange.onClick.call(eventManager.imageChange, e)); interactPhoto.container.addEventListener('dragover', (e) => { e.preventDefault(); e.stopPropagation(); interactPhoto.container.classList.add('drag-over'); }); interactPhoto.container.addEventListener('dragleave', (e) => { e.preventDefault(); e.stopPropagation(); if (!interactPhoto.container.contains(e.relatedTarget)) { interactPhoto.container.classList.remove('drag-over'); } }); interactPhoto.container.addEventListener('drop', (e) => { e.preventDefault(); e.stopPropagation(); interactPhoto.container.classList.remove('drag-over'); eventManager.imageChange.loadFile(e.dataTransfer.files[0]); }); document .getElementById('actionCalcul') .addEventListener('click', eventManager.calc.onClick.bind(eventManager.calc)); document .getElementById('moonTime') .addEventListener('click', eventManager.moonTime.onClick.bind(eventManager.moonTime)); document .getElementById('selectStars') .addEventListener('click', eventManager.selectStars.onClick.bind(eventManager.selectStars)); document .getElementById('recognizeStars') .addEventListener('click', eventManager.recognizeStars.onClick.bind(eventManager.recognizeStars)); document.getElementById('addCeleRow').addEventListener('click', () => { interactPhoto.CeleArray.addEmptyRow(); }); //为星体名称输入框启用自动补全 interactPhoto.CeleArray.initializeTableRows(); } // 初始化地图 function initializeMap(interactPhoto) { /*global BMapGL*/ // 按住鼠标右键,修改倾斜角和角度 let map = new BMapGL.Map('map'); // 创建Map实例 map.centerAndZoom(new BMapGL.Point(110, 35), 4); // 初始化地图,设置中心点坐标和地图级别 map.enableScrollWheelZoom(true); //开启鼠标滚轮缩放 map.addControl(new BMapGL.ScaleControl()); // 添加比例尺控件 map.addControl(new BMapGL.ZoomControl()); // 添加缩放控件 map.addControl(new BMapGL.MapTypeControl()); //添加地图类型控件 interactPhoto.map = map; } export { initializeElements, initializeCanvas, initializeEvents, initializeMap }; ================================================ FILE: src/interface/starZH2EN.js ================================================ const starZH2EN = { 太阳: 'sun', 日: 'sun', 月球: 'moon', 月: 'moon', 月亮: 'moon', 水星: 'mercury', 金星: 'venus', 火星: 'mars', 木星: 'jupiter', 土星: 'saturn', 天王星: 'uranus', 海王星: 'neptune', 冥王星: 'pluto', 垒壁阵十: '29 psc', 垒壁阵十二: '30 psc', 壁宿增五: '85 peg', 土公增一: '31 psc', 土公一: 'c psc', 八魁二: '2 cet', 王良增三: '9 cas', 八魁四: '3 cet', 垒壁阵十一: '33 psc', 壁宿增十: '86 peg', 王良增二: '10 cas', 垒壁阵增六: '4 cet', 垒壁阵增七: '5 cet', 壁宿二: 'alf and', 壁宿增十八: '87 peg', 王良一: 'bet cas', 火鸟四: 'eps phe', 土公增二: '34 psc', 螣蛇增十九: '22 and', 螣蛇增十一: '22 and', 八魁一: '6 cet', 壁宿一: 'gam peg', 天厩增一: '23 and', 壁宿增十九: 'chi peg', 八魁六: '7 cet', 土公增三: '35 psc', 土公增四: '36 psc', 壁宿增十一: '37 psc', 天厩一: 'tet and', 壁宿增十七: '39 psc', 天厩三: 'sig and', 天仓一: 'iot cet', 壁宿增十六: '40 psc', 鸟喙六: 'zet tuc', 土公增五: 'd psc', 天厩二: 'rho and', 壁宿增十二: '42 psc', 八魁五: '9 cet', 壁宿增十三: '43 psc', 王良增四: '12 cas', 土公增七: '44 psc', 蛇尾一: 'bet hyi', 土公二: '45 psc', 火鸟五: 'kap phe', 火鸟六: 'alf phe', 土公增八: '10 cet', 壁宿增廿一: '46 psc', 壁宿增廿: '47 psc', 壁宿增十五: '48 psc', 土公增九: '11 cet', 天溷增一: '12 cet', 奎宿增一: '28 and', 壁宿增十四: '49 psc', 火鸟八: 'lam1 phe', 传舍增一: '13 cas', 鸟喙四: 'bet1 tuc', 王良五: 'lam cas', 土公增六: '51 psc', 壁宿增廿二: '52 psc', 壁宿增廿三: '52 psc', 王良二: 'kap cas', 传舍二: '16 cas', 天溷增二: '13 cet', 土公增十: '14 cet', 奎宿六: 'pi. and', 附路: 'zet cas', 土公增十一: '15 cet', 奎宿四: 'eps and', 奎宿五: 'del and', 奎宿增三: '54 psc', 奎宿增二: '55 psc', 王良四: 'alf cas', 奎宿增廿二: '32 and', 火鸟七: 'mu. phe', 阁道增二: 'ksi cas', 鸟喙五: 'rho tuc', 水委三: 'eta phe', 阁道增一: 'pi. cas', 土司空: 'bet cet', 天溷四: 'phi1 cet', 阁道六: 'omi cas', 天溷三: '18 cet', 少丞增一: '21 cas', 奎宿增四: '59 psc', 奎宿二: 'zet and', 外屏增九: '60 psc', 少丞: '23 cas', 紫微左垣八: '23 cas', 外屏增八: '62 psc', 外屏一: 'del psc', 阁道五: 'nu. cas', 奎宿增五: '64 psc', 王良三: 'eta cas', 奎宿七: 'nu. and', 奎宿三: 'i psc', 天溷增六: 'phi2 cet', 天溷增三: '20 cet', 天溷一: '21 cet', 奎宿增六: '66 psc', 奎宿增九: '36 and', 奎宿增十: 'k psc', 天溷二: 'phi3 cet', 王良增五: 'ups2 cas', 策: 'gam cas', 奎宿八: 'mu. and', 奎宿一: 'eta and', 奎宿增十一: 'h psc', 天溷增五: 'phi4 cet', 外屏增七: '70 psc', 奎宿增十五: 'sig psc', 奎宿增廿: '39 and', 外屏二: 'eps psc', 天溷增四: '25 cet', 外屏增十: '26 cet', 外屏增六: '73 psc', 外屏增一: '72 psc', 天仓增十四: '27 cet', 奎宿十六: 'psi1 psc', 外屏增五: '77 psc', 天仓增十三: '28 cet', 火鸟九: 'bet phe', 奎宿十: '76 psc', 外屏增二: '75 psc', 天仓增十二: '30 cet', 奎宿增八: 'psi2 psc', 外屏增十一: '29 cet', 奎宿增十九: '41 and', 奎宿增十四: '78 psc', 外屏增四: 'e psc', 水委二: 'zet phe', 天仓二: 'eta cet', 勾陈五: '2 umi', 军南门: 'phi and', 奎宿九: 'bet and', 奎宿增七: 'psi3 psc', 天仓增十一: '32 cet', 奎宿增十八: '44 and', 外屏增十二: '33 cet', 华盖四: '31 cas', 阁道四: 'tet cas', 奎宿增十三: 'g psc', 奎宿增十六: '45 and', 奎宿十五: 'chi psc', 奎宿十一: 'tau psc', 传舍四: '32 cas', 天仓增四: '34 cet', 外屏增十三: '35 cet', 天仓增十: '36 cet', 外屏三: 'zet psc', 奎宿十四: 'phi psc', 天仓增九: '37 cet', 外屏增三: '88 psc', 天仓增三: '38 cet', 华盖三: 'hip 5926', 天仓增六: '39 cet', 天仓增五: '40 cet', 天仓增八: '41 cet', 外屏增十四: 'f psc', 奎宿十三: 'ups psc', 奎宿增廿三: 'ups psc', 天仓增二: '42 cet', 阁道增三: 'phi cas', 奎宿十二: 'l psc', 天大将军增二: 'ksi and', 天大将军增一: 'ksi and', 天仓增一: '43 cet', 奎宿增十七: '47 and', 天仓三: 'tet cet', 天仓增七: '44 cet', 天仓增十五: '46 cet', 阁道三: 'del cas', 华盖五: 'psi cas', 右更一: 'rho psc', 右更增一: '94 psc', 天仓增十六: '47 cet', 天大将军增三: 'ome and', 火鸟十: 'gam phe', '𫓧锧一': '48 cet', 天大将军四: '49 and', 外屏四: 'mu. psc', 杠九: '38 cas', 天园一: 'del phe', 右更二: 'eta psc', 阁道增四: 'chi cas', 天仓增十八: '49 cet', 右更增四: '100 psc', 右更增二: '101 psc', 天仓增十七: '50 cet', 天大将军六: 'ups and', 右更三: 'pi. psc', 水委一: 'alf eri', 天大将军三: '51 and', 华盖二: '40 cas', 右更五: '104 psc', 天大将军五: 'chi and', 天大将军七: 'tau and', 天大将军增四: 'tau and', 外屏五: 'nu. psc', 奎宿增十二: '1 tri', 华盖六: '43 cas', 娄宿增三: '107 psc', 杠八: '42 cas', 阁道增五: '44 cas', 天大将军二: 'phi per', 天仓五: 'tau cet', 右更四: 'omi psc', 娄宿增二: '3 ari', 天仓增廿一: 'chi cet', 右更增三: '54 cet', 天仓四: 'zet cet', 大陵增四: '1 per', 天大将军增十六: '2 per', 娄宿增六: 'alf tri', 天大将军增十一: '55 and', 娄宿二: 'gam1 ari', 外屏六: 'ksi psc', 阁道二: 'eps cas', 娄宿一: 'bet ari', 蛇腹四: 'eta2 hyi', 天园二: 'chi eri', 华盖七: 'ome cas', 天大将军八: '56 and', '𫓧锧五': '56 cet', 娄宿增一: 'iot ari', 娄宿增五: 'lam ari', 天囷增二: '58 cet', 天大将军增十五: '3 per', 蛇首一: 'alf hyi', 天仓六: '57 cet', '𫓧锧四': 'ups cet', 外屏增十五: '112 psc', 杠七: 'a cas', 外屏七: 'alf psc', 大陵增五: 'g per', 天大将军增五: 'eps tri', 天囷增四: '60 cet', 杠五: '50 cas', 娄宿增七: '10 ari', 天囷增三: '61 cet', 天大将军一: 'gam1 and', 天庾一: 'nu. for', 五帝内座二: '47 cas', 五帝内座增一: '47 cas', 杠三: '49 cas', 杠四: '51 cas', 娄宿增十一: 'kap ari', 娄宿增八: '11 ari', 娄宿三: 'alf ari', 天大将军增九: '58 and', 杠六: '54 cas', 天囷增一: '62 cet', 娄宿增九: '14 ari', 天大将军九: 'bet tri', 娄宿增十四: '15 ari', 天大将军增十: '59 and', 天囷增六: '64 cet', 大陵增三: 'h per', 天囷十二: '63 cet', 天大将军增六: 'iot tri', 天囷十三: '66 cet', 娄宿增十二: 'eta ari', 天囷五: 'ksi1 cet', 娄宿增十五: '19 ari', 天大将军增十二: 'b and', 大陵增六: '6 per', 传舍五: '55 cas', 娄宿增十: '20 ari', 天大将军增七: '7 tri', 天园三: 'phi eri', 刍藁三: '67 cet', 天大将军十一: 'del tri', 天大将军十: 'gam tri', 大陵增二: '8 per', 大陵增一: 'chi per', 娄宿增十三: 'tet ari', 胃宿增一: '10 tri', 天大将军增十三: 'c and', 刍藁增二: 'omi cet', 大陵增七: '63 and', 蛇腹三: 'del hyi', 天囷增五: '69 cet', 天囷十一: '70 cet', 大陵一: 'i per', 大陵增八: '64 and', 天囷增七: 'ksi ari', 刍藁四: '71 cet', 大陵增九: '65 and', 刍藁一: 'rho cet', 天园四: 'kap eri', 大陵增十: '66 and', 天囷六: 'ksi2 cet', 胃宿增二: '12 tri', 阁道一: 'iot cas', 左更增一: '26 ari', 北极星: 'alf umi', 勾陈一: 'alf umi', 天苑增九: 'sig cet', 天大将军增八: '14 tri', 天大将军增十七: '14 tri', 天囷十: '75 cet', 天庾二: 'ome for', 刍藁二: '77 cet', 刍藁增三: '79 cet', 天囷七: 'nu. cet', 刍藁增五: '80 cet', 天囷增八: '31 ari', 刍藁增四: '81 cet', 左更一: 'nu. ari', 天囷九: 'del cet', 刍藁六: 'eps cet', 蛇腹二: 'eps hyi', 天园五: 's eri', 天园增一: 'iot eri', 胃宿增五: '33 ari', 天囷增廿: '84 cet', 大陵八: '12 per', 左更二: 'mu. ari', 天囷增九: '85 cet', 天囷八: 'gam cet', 胃宿一: '35 ari', 大陵增十四: '14 per', 天苑七: 'pi. cet', 大陵增十三: 'tet per', 左更三: 'omi ari', 天囷四: 'mu. cet', 天苑八: 'tau1 eri', 天苑增八: 'tau1 eri', 蛇腹一: 'zet hyi', 胃宿二: '39 ari', 左更增二: '40 ari', 天庾三: 'bet for', 左更五: 'pi. ari', 胃宿三: 'c ari', 附白二: 'nu. hyi', 大陵七: '16 per', 天船一: 'eta per', 天苑九: 'tau2 eri', 左更四: 'sig ari', 大陵增十六: '17 per', 大陵增十五: '20 per', 大陵二: 'tau per', 大陵增十一: 'tau per', 左更增三: 'rho1 ari', 左更增五: 'rho2 ari', 传舍六: 'hd 223274', 天苑六: 'eta eri', 左更增四: 'rho ari', 胃宿增三: '21 per', 天苑增六: '4 eri', 左更增六: '47 ari', 天苑增五: '6 eri', 天园六: 'tet1 eri', 左更增七: 'eps ari', 天囷增十九: '5 eri', 天囷三: 'lam cet', 天囷增十八: '7 eri', 天苑增十: 'rho1 eri', 天囷一: 'alf cet', 天囷增十: '93 cet', 天苑十: 'tau3 eri', 天苑增十一: 'rho2 eri', 天苑增十二: 'rho3 eri', 天船二: 'gam per', 大陵六: 'rho per', 胃宿增四: '52 ari', 五帝内座一: 'hip 14417', 大陵五: 'bet per', 天阴增一: '54 ari', 大陵三: 'iot per', 大陵四: 'kap per', 大陵增廿一: 'ome per', 大陵增十八: 'ome per', 天阴四: 'del ari', 天阴增六: 'del ari', 天苑增三: 'alf for', 天苑增十七: 'alf for', 天苑增四: 'alf for', 天囷增十七: '94 cet', 天阴二: 'zet ari', 天苑五: 'zet eri', 天苑增十三: '14 eri', 大陵增廿: '30 per', 天苑增二: '15 eri', 天囷增十六: '95 cet', 天船增一: '29 per', 天船增二: '31 per', 天囷增十一: 'kap1 cet', 天苑十一: 'tau4 eri', 天园增三: 'e eri', 紫微右垣七: 'bk cam', 五帝内座四: '47 cas', 天囷二: 'kap2 cet', 大陵增十九: 'l per', 天阿: '62 ari', 天阴三: 'tau2 ari', 天阴增二: '64 ari', 天船三: 'alf per', 天廪四: 'omi tau', 天廪三: 'ksi tau', 天阴五: '66 ari', 传舍七: 'cs cam', 天船增三: '34 per', 传舍九: 'ce cam', 天廪二: 's tau', 天廪增三: 's tau', 天船增四: 'sig per', 天苑增十四: 'v eri', 天廪一: 'f tau', 天船增五: '36 per', 天廪增一: 't tau', 天苑四: 'eps eri', 天苑十二: 'tau5 eri', 昴宿增二: '7 tau', 卷舌增一: 'ix per', 天苑增一: '20 eri', 天船四: 'psi per', 天囷增廿一: 'v711 tau', 天囷增十五: '10 tau', 昴宿增三: '9 tau', 天园增四: 'y eri', 天苑增十五: '21 eri', 天囷增十二: '12 tau', 天苑增十六: '22 eri', 昴宿增一: '11 tau', 天阴增三: '13 tau', 卷舌六: 'o per', 天园七: 'h eri', 天船五: 'del per', 天苑三: 'del eri', 天阴增四: '14 tau', 蛇首二: 'bet ret', 卷舌五: 'omi per', 卷舌增七: 'omi per', 天囷增十四: '24 eri', 昴宿增九: '16 tau', 昴宿一: '17 tau', 天囷增十三: '25 eri', 昴宿增八: '18 tau', 卷舌一: 'nu. per', 昴宿二: 'q tau', 天廪增二: 'u tau', 昴宿四: '20 tau', 昴宿三: '21 tau', 上丞增二: 'hip 17587', 天苑二: 'pi. eri', 昴宿五: '23 tau', 天苑十三: 'tau6 eri', 附白一: 'gam hyi', 昴宿六: 'eta tau', 天苑十四: 'tau7 eri', 毕宿增一: 'e tau', 天园八: 'f eri', 昴宿增十一: '26 tau', 昴宿七: '27 tau', 昴宿增十二: '28 tau', 天园九: 'g eri', 天谗: 'n per', 杠一: 'gam cam', 毕宿增二: '31 tau', 九州殊口增三: '29 eri', 九州殊口增四: '30 eri', 九州殊口增五: '30 eri', 天园增五: 'i eri', 天苑十五: 'tau8 eri', 卷舌四: 'zet per', 九州殊口增二: 'w eri', 昴宿增五: '32 tau', 传舍增二: '16 cas', 卷舌二: 'eps per', 天苑一: 'gam eri', 卷舌三: 'ksi per', 天苑十六: 'tau9 eri', 毕宿八: 'lam tau', 九州殊口增一: '35 eri', 毕宿增三: 'nu. tau', 毕宿增四: '40 tau', '月(室宿)': 'a1 tau', 月增一: 'a2 tau', 砺石一: 'psi tau', 卷舌增四: '49 per', 卷舌增五: '50 per', 天船六: 'c per', 天街增一: 'ome1 tau', 五帝内座五: 'hip 19461', 九州殊口增六: '37 eri', 砺石二: 'p tau', 毕宿增五: '45 tau', 九州殊口二: 'omi1 eri', 毕宿增六: '46 tau', 毕宿增十四: '46 tau', 毕宿增八: '47 tau', 天园增六: 'alf hor', 九州殊口一: 'a eri', 夹白二: 'alf ret a', 卷舌增六: 'f per', 天船七: 'mu. per', 九州殊口增七: 'omi2 eri', 九州殊口增十一: 'omi2 eri', 毕宿增七: 'mu. tau', 毕宿增九: '48 tau', 金鱼一: 'gam dor', 天船九: 'hip 19949', 天街二: 'ome tau', 天园十: 'ups4 eri', 天船增十: 'b per', 毕宿四: 'gam tau', 天节三: 'h tau', 砺石四: 'phi tau', 卷舌增三: '54 per', 毕宿增十: '58 tau', 少卫增一: '79 dra', 天船增六: 'd per', 砺石三: 'chi tau', 毕宿三: 'del1 tau', 毕宿增十一: '63 tau', 九州殊口三: 'ksi eri', 天节八: 'r tau', 天园十一: 'ups3 eri', 毕宿增十二: 'del2 tau', 卷舌增二: '55 per', 天街增二: 'kap1 tau', 天街一: 'kap2 tau', 毕宿二: 'del3 tau', 天街增三: 'ups tau', 毕宿七: '71 tau', 天节一: 'pi. tau', 天街增四: '72 tau', 九斿增一: '44 eri', 毕宿六: 'tet1 tau', 毕宿一: 'eps tau', 毕宿增十三: 'tet2 tau', 天节四: 'b tau', 毕宿增十五: 'hip 21029', 毕宿增十六: 'hip 21053', 毕宿增十七: '85 tau', 九斿增二: '45 eri', 天船增九: '1 cam', 五车增二: 'm per', 天园十三: 'ups1 eri', 天节二: 'rho tau', 九州殊口增九: '46 eri', 金鱼二: 'alf dor', 九州殊口增八: '47 eri', 天园十二: 'ups2 eri', 天节七: 'd tau', 毕宿五: 'alf tau', 九州殊口四: 'nu. eri', 五车增三: 'e per', 九斿一: '49 eri', 九州殊口增十: 'c eri', 附耳增二: '89 tau', 附耳增三: '89 tau', 天节五: 'c tau', 九斿增四: 'l eri', 附耳增一: 'sig1 tau', 附耳: 'sig2 tau', 附耳增四: 'sig2 tau', 天船增七: '3 cam', 天船增八: '2 cam', 天节六: '93 tau a', 九斿八: '54 eri', 诸王六: 'tau tau', 五车增一: '59 per', 诸王增一: '95 tau', 九州殊口六: '55 eri', 九州殊口五: '56 eri', 九斿二: 'mu. eri', 九斿七: '58 eri', 八谷增一: '4 cam', 九斿增五: '59 eri', 参旗增一: '96 tau', 参旗六: 'pi.3 ori', 五车增七: '1 aur', 九斿六: '60 eri', 参旗五: 'pi.2 ori', 参旗七: 'pi.4 ori', 天高二: 'i tau', 参旗一: 'omi1 ori', 五车增八: '2 aur', 九斿三: 'ome eri', 参旗增十一: '5 ori', 紫微右垣六: 'alf cam', 参旗八: 'pi.5 ori', 参旗增十二: 'pi.5 ori', 参旗三: 'g ori', 参旗四: 'pi.1 ori', 八谷增三: '5 cam', 参旗二: 'omi2 ori', 九斿增三: 'b eri', 八谷增二: '6 cam', 五车一: 'iot aur', 八谷五: '7 cam', 诸王五: '99 tau', 诸王增二: 'k tau', 参旗九: 'pi.6 ori', 五车增六: 'ome aur', 参旗增三: '101 tau', 九斿四: '63 eri', 九斿五: '64 eri', 五车增五: '5 aur', 五车增四: '6 aur', 玉井二: 'psi eri', 九斿九: '1 lep', 天高一: 'iot tau', 八谷增十四: 'bet cam', 九斿增七: 'hip 23554', 参旗增四: '11 ori', 屏二: 'eps lep', 八谷七: '11 cam', 八谷增十三: '12 cam', 八谷六: '9 aur', 八谷增四: '9 aur', 玉井增一: '66 eri', 天高增一: 'm tau', 参旗增八: '13 ori', 参旗增九: '13 ori', 天高增二: 'l tau a', 玉井三: 'bet eri', 参旗增十: 'i ori', 天高增三: '105 tau', 诸王四: '103 tau', 玉井增二: '68 eri', 天高三: '107 tau', 玉井一: 'lam eri', 参旗增七: 'h ori', 参旗增五: '15 ori', 军井一: 'iot lep', 屏一: 'mu. lep', 军井二: 'kap lep', 参宿增九: 'rho ori', 天潢五: 'mu. aur', 八谷四: '14 cam', 夹白一: 'tet dor', 参宿七: 'bet ori', 天潢三: '14 aur', 参旗增六: '18 ori', 五车二: 'alf aur', 参宿增卅八: 'tau ori', 玉井四: 'tau ori', 天潢增一: '16 aur', 天潢增二: '17 aur', 咸池三: 'lam aur', 参宿增八: '21 ori', 天高四: 'n tau', 八谷增十二: '15 cam', 军井三: 'lam lep', 军井四: 'nu. lep', 天潢一: '19 aur', 参宿增卅九: 'hip 25028', 参宿增五: 'o ori', 咸池一: 'rho aur', 六甲六: 'k cam', 参宿增十: 'm ori', 八谷增十一: '16 cam', 军井增一: '8 lep', 参宿增卅七: 'e ori', 参宿增三: 'eta ori', 参宿增四: 'p ori', 天潢四: 'sig aur', 参宿增六: 'psi1 ori', 参宿增七: 'psi1 ori', 参宿五: 'gam ori', 天关增一: '113 tau', 五车五: 'bet tau', 参宿增十一: 'psi ori', 天高增四: 'o tau', 天潢二: 'phi aur', 厕二: 'bet lep', 诸王三: '118 tau', 参宿增二: '31 ori', 咸池二: 'hip 25810', 参宿增十三: 'a ori', 厕增一: '10 lep', 丈人二: 'eps col', 参宿增十二: 'n1 ori', 参宿增卅六: 'ups ori', 参宿三: 'del ori', 八谷增十: '18 cam', 厕一: 'alf lep', 金鱼三: 'bet dor', 参宿增十四: 'n2 ori', 觜宿二: 'phi1 ori', 觜宿一: 'lam ori', 伐增二: 'tet1 ori', 伐二: 'tet2 ori', 伐一: 'c ori', 伐三: 'iot ori', 诸王增三: '121 tau', 伐增一: '45 ori', 参宿二: 'eps ori', 觜宿三: 'phi2 ori', 八谷增十五: '19 cam', 天关: 'zet tau', 参宿增一: 'sig ori', 参宿增卅五: 'd ori', 参宿增十五: 'ome ori', 丈人一: 'alf col', 诸王二: '125 tau', 八谷增十六: '21 cam', 参宿一: 'zet ori', 天关增二: '126 tau', 厕增八: '12 lep', 厕增二: '12 lep', 参宿增十六: 'b ori', 天关增六: '127 tau', 八谷增九: '24 cam', 八谷增十七: '23 cam', 厕三: 'gam lep', 金鱼四: 'del dor', 天关增三: '128 tau', 五车增十七: 'omi aur', 屎: 'mu. col', 八谷三: '26 cam', 天关增四: '129 tau', 八谷增八: '28 cam', 厕增七: 'zet lep', 水府增二: '131 tau', 老人增四: 'bet pic', 天关增五: '130 tau', 水府增一: '133 tau', 参宿六: 'kap ori', 参宿增十七: '52 ori', 诸王增四: '132 tau', 水府增三: '135 tau', 八谷增七: '29 cam', 子二: 'bet col', 厕四: 'del lep', 参宿增卅四: '55 ori', 八谷增十八: '30 cam', 水府增四: '137 tau', 水府增五: '137 tau', 参宿增廿二: '56 ori', 子一: 'lam col', 诸王一: '136 tau', 司怪四: 'chi1 ori', 八谷二: 'ksi aur', 八谷增六: 'ksi aur', 司怪增三: '57 ori', 八谷八: '31 cam', 参宿四: 'alf ori', 厕增六: 'eta lep', 子增一: 'gam col', 司怪一: '139 tau', 参宿增廿一: '59 ori', 参宿增卅三: '1 mon', 参宿增卅二: '2 mon', 老人增三: 'eta col', 八谷一: 'del aur', 五车三: 'bet aur', 五车四: 'tet aur', 八谷增五: '34 cam', 五车增十六: 'pi. aur', 司怪增一: '140 tau', 五车增十五: '36 aur', 司怪增二: '141 tau', 参宿增卅一: '3 mon', 参宿增十八: 'mu. ori', 五车增十: '38 aur', 司怪增四: '64 ori', 司怪三: 'chi2 ori', 司怪二: '1 gem', 参宿增十九: '63 ori', 参宿增廿: '66 ori', 厕增四: '17 lep', 五车增十一: '39 aur', 厕增五: 'tet lep', 五车增九: '40 aur', 孙二: 'tet col', 水府一: 'nu. ori', 厕增三: '19 lep', 参宿增卅: '4 mon', 金鱼五: 'nu. dor', 八谷增十九: '37 cam', 五车增十四: '41 aur', 水府二: 'ksi ori', 司怪增五: '68 ori', 水府四: 'f1 ori', 司怪增六: '71 ori', 参宿增廿八: 'gam mon', 钺: 'eta gem', 井宿增一: 'kap aur', 水府三: 'f2 ori', 八谷增廿: '40 cam', 水府增六: '73 ori', 水府增七: 'k ori', 孙一: 'kap col', 钺增一: '9 gem', 水府增八: 'l ori', 五车增十三: '42 aur', 参宿增廿九: '6 mon', 八谷增廿一: '1 lyn', 五车增十二: '43 aur', 上卫增二: '11 cep', 八谷增廿六: '2 lyn', 参宿增廿七: '7 mon', 孙增一: 'zet cma', 八谷增卅四: '45 aur', 八谷增廿五: '4 lyn', 孙增三: 'del col', 孙增四: 'del col', 八谷增廿二: '3 lyn', 军市一: 'bet cma', 井宿一: 'mu. gem', 四渎四: 'eps mon', 老人: 'alf car', 座旗增一: 'psi1 aur', 八谷增廿七: '5 lyn', 参宿增廿四: '9 mon', 四渎增五: '77 ori', 四渎增六: '78 ori', 参宿增廿五: '10 mon', 孙增二: 'lam cma', 井宿增二: '48 aur', 参宿增廿六: 'bet mon', 井宿二: 'nu. gem', 座旗增二: '47 aur', 八谷增廿八: '6 lyn', 军市六: 'ksi1 cma', 四渎增三: '12 mon', 四渎三: '13 mon', 四渎增八: '14 mon', 井宿增九: 'w gem', 军市增二: 'ksi2 cma', 井宿增六: '49 aur', 井宿增八: '23 gem', 八谷增卅三: '9 lyn', 军市增一: 'nu.1 cma', 野鸡: 'nu.2 cma', 八谷增卅二: '11 lyn', 八谷增廿三: '8 lyn', 井宿三: 'gam gem', 老人增二: 'nu. pup', 军市二: 'nu.3 cma', 井宿增三: '53 aur', 八谷增廿四: '10 lyn', 座旗八: '51 aur', 座旗七: 'psi3 aur', 座旗五: 'psi2 aur', 井宿增五: '54 aur', 四渎增一: '15 mon', 井宿增七: '26 gem', 座旗三: 'psi4 aur', 井宿五: 'eps gem', 井宿增十: '30 gem', 井宿增十八: '30 gem', 弧矢增一: '10 cma', 井宿增四: '28 gem', 天狼: 'alf cma', 井宿四: 'ksi gem', 井宿增十九: 'ksi gem', 井宿增十一: '32 gem', 六甲一: 'hip 32439', 四渎增二: '16 mon', 座旗四: 'psi5 aur', 八谷增卅一: '13 lyn', 天狼增一: '11 cma', 军市增三: '12 cma', 四渎二: '17 mon', 座旗一: 'psi6 aur', 阙丘一: '18 mon', 金鱼增一: 'alf pic', 弧矢八: 'kap cma', 老人增一: 'tau pup', 井宿增十二: '35 gem', 座旗六: 'psi7 aur', 井宿六: 'd gem', 座旗九: '59 aur', 八谷增廿九: '14 lyn', 座旗增三: '60 aur', 军市三: '15 cma', 紫微右垣五: '43 cam', 座旗增四: 'psi8 aur', 军市五: 'omi1 cma', 天狼增二: 'tet cma', 天狼增六: 'tet cma', 井宿增十三: 'e gem', 军市四: '17 cma', 天樽增一: '37 gem', 军市增六: 'pi. cma', 军市增七: 'pi. cma', 军市增四: 'pi. cma', 天狼增三: 'mu. cma', 天狼增五: 'iot cma', 八谷增卅: '15 lyn', 座旗二: 'psi10 aur', 弧矢七: 'eps cma', 座旗增五: '62 aur', 天樽增二: '40 gem', 井宿增十四: '41 gem', 弧矢增二: 'sig cma', 天樽三: 'ome gem', 阙丘增四: '19 mon', 军市增五: 'omi2 cma', 天狼增四: 'gam cma', 井宿七: 'zet gem', 天樽增六: '44 gem', 弧矢增廿五: 'fv cma', 井宿增十五: '45 gem', 弧矢一: 'del cma', 飞鱼二: 'gam2 vol', 阙丘增五: '20 mon', 天樽增三: '47 gem', 阙丘二: '21 mon', 座旗增六: '63 aur', 阙丘增三: 'del mon', 弧矢增五: '26 cma', 天樽增五: '48 gem', 井宿增十六: 'hip 34858', 阙丘增二: '23 mon', 井宿增十七: '51 gem', 弧矢增四: '27 cma', 天樽增四: '52 gem', 弧矢增三: 'ome cma', 阙丘增一: '24 mon', 内阶增二: '18 lyn', 飞鱼五: 'del vol', 弧矢九: 'pi. pup', 座旗增七: '64 aur', 井宿八: 'lam gem', 弧矢增七: '29 cma', 弧矢增六: 'tau cma', 天樽二: 'del gem', 天樽增七: '56 gem', 座旗增十一: '20 lyn', 内阶增一: '19 lyn', 天樽一: 'a gem', 弧矢二: 'eta cma', 座旗增八: '66 aur', 水位增一: '1 cmi', 南河一: 'eps cmi', 座旗增九: '21 lyn', 天樽增八: '61 gem', 南河二: 'bet cmi', 天樽增九: '63 gem', 南河增二: 'eta cmi', 南河增一: 'gam cmi', 北河一: 'rho gem', 弧矢增廿四: 'sig pup', 水位一: '6 cmi', 座旗增十: '22 lyn', 南河增五: 'del1 cmi', 南河增四: 'del2 cmi', 水位增二: '68 gem', 南河增三: 'del3 cmi', 北河二: 'alf gem', 阙丘增六: '25 mon', 北河增一: '70 gem', 弧矢六: 'k pup', 北河增二: 'omi gem', 南河三: 'alf cmi', 弧矢增廿: 'd1 pup', 水位增三: 'f gem', 阙丘增七: 'alf mon', 飞鱼六: 'zet vol', 内阶增三: '24 lyn', 北河增四: 'sig gem', 弧矢增十九: 'l pup', 积薪增一: 'c gem', 积薪: 'kap gem', 弧矢三: 'c pup', 北河三: 'bet gem', 弧矢增八: '2 pup', 弧矢增九: '4 pup', 水位增四: 'g gem', 水位二: '11 cmi', 北河增三: 'pi. gem', 弧矢增十: '5 pup', 弧矢五: 'omi pup', 积薪增二: '82 gem', 弧矢增十七: 'ksi pup', 弧矢增十二: '6 pup', 南河增六: 'zet cmi', 弧矢增廿三: 'a pup', 弧矢增十一: '10 pup', 弧矢增廿一: 'b pup', 积薪增三: '84 gem', 上台增三: '25 lyn', 上台增二: '26 lyn', 水位增五: '85 gem', 天社增一: 'chi car', 弧矢增十五: 'j pup', 水位增九: '1 cnc', 弧矢四: 'chi pup', 南河增七: '14 cmi', 弧矢增卅一: '12 pup', 弧矢增十六: '12 pup', 南河增十: '27 mon', 水位增七: '3 cnc', 爟增二: 'ome1 cnc', 南河增九: '28 mon', 水位增八: '5 cnc', 爟增一: 'ome2 cnc', 南河增八: '13 pup', 爟增三: 'chi gem', 弧矢增廿二: 'zet pup', 弧矢增十四: '14 pup', 六甲三: 'vz cam', 水位三: '8 cnc', 弧矢增卅二: 'rho pup', 水位增六: 'mu. cnc', 上台增一: '27 lyn', 外厨增一: 'zet mon', 水位增十一: '12 cnc', 爟增四: '11 cnc', 弧矢增十三: '16 pup', 天社一: 'gam vel', 爟增五: 'psi1 cnc', 爟一: 'psi cnc', 外厨增十四: '18 pup', 外厨增十六: '19 pup', 水位四: 'zet1 cnc', 爟四: '15 cnc', 外厨增十三: '20 pup', 柳宿增十: 'bet cnc', 外厨增十一: '21 pup', 内阶增五: '29 lyn', 小斗增一: 'alf cha', 飞鱼四: 'kap1 vol', 爟增六: 'chi cnc', 内阶增四: '30 lyn', 爟二: 'lam cnc', 小斗八: 'tet cha', 海石一: 'eps car', 外厨增十七: '22 pup d', 上台增四: '31 lyn', 鬼宿增二: 'd1 cnc', 柳宿增九: '21 cnc', 外厨增二: '1 hya', 外厨增三: 'c hya', 飞鱼三: 'bet vol', 鬼宿增三: 'd2 cnc', 鬼宿增十九: 'd2 cnc', 外厨一: '2 hya', 爟三: 'phi1 cnc', 爟增七: 'phi1 cnc', 爟增九: '24 cnc', 鬼宿增五: '27 cnc', 爟增八: 'phi2 cnc', 爟增十: '28 cnc', 鬼宿增四: '29 cnc', 内阶一: 'omi uma', 爟增十一: 'ups1 cnc', 鬼宿一: 'tet cnc', 柳宿增八: '34 cnc', 鬼宿二: 'eta cnc', 内阶增八: 'a uma', 轩辕增八: '33 lyn', 鬼宿增一: '35 cnc', 外厨增四: '3 hya', 柳宿增七: 'c cnc', 天狗一: 'e vel', 柳宿一: 'del hya', 柳宿增六: '37 cnc', 柳宿二: 'sig hya', 内阶增九: 'pi.1 uma', 轩辕增十: '2 lmi', 轩辕增九: '3 lmi', 外厨增八: 'a hya a', 天狗四: 'bet pyx', 内阶增七: 'pi.2 uma', 天社二: 'b vel', 外厨增十: '9 hya', 鬼宿增六: 'a1 cnc', 柳宿三: 'eta hya', 鬼宿三: 'gam cnc', 天狗五: 'alf pyx', 外厨二: 'f hya', 天狗二: 'd vel', 鬼宿四: 'del cnc', 天社三: 'del vel', 柳宿增五: 'b cnc', 柳宿增一: '10 hya', 轩辕增十一: '46 cnc', 天社增二: 'a vel', 外厨增九: 'd hya', 轩辕增廿二: 'iot cnc', 柳宿五: 'eps hya', 鬼宿增七: 'a2 cnc', 柳宿四: 'rho hya', 外厨三: '14 hya', 天狗六: 'gam pyx', 鬼宿增八: '54 cnc', 鬼宿增九: '52 cnc', 外厨增六: '15 hya', 上台增五: '35 lyn', 轩辕增廿一: '53 cnc', 轩辕增七: 'sig1 cnc', 轩辕增廿: 'rho1 cnc', 轩辕增十九: 'rho1 cnc', 内阶五: 'b uma', 轩辕增十二: '57 cnc', 海石增二: 'c car', 柳宿六: 'zet hya', 外厨增七: '17 hya', 天狗七: 'del pyx', 轩辕增十八: 'rho2 cnc', 柳宿增十二: '60 cnc', 柳宿增四: '60 cnc', 内阶三: '6 uma', 轩辕增六: 'sig2 cnc', 鬼宿增十: 'omi1 cnc', 鬼宿增十一: 'omi2 cnc', 轩辕增十三: '61 cnc', 柳宿增三: 'alf cnc', 柳宿增十三: 'alf cnc', 三台一: 'iot uma', 上台一: 'iot uma', 轩辕增五: 'sig3 cnc', 轩辕一: '10 uma', 轩辕增四: '66 cnc', 鬼宿增十二: '68 cnc', 轩辕增十七: '67 cnc', 飞鱼一: 'alf vol', 三师一: 'rho uma', 轩辕增廿三: 'nu. cnc', 三台二: 'kap uma', 上台二: 'kap uma', 天社增三: 'c vel', 轩辕增十六: '70 cnc', 鬼宿增十三: '71 cnc', 柳宿七: 'ome hya', 柳宿增二: 'kap cnc', 天记: 'lam vel', 轩辕增十四: 'tau cnc', 三师三: 'sig1 uma', 星宿增四: '19 hya', 轩辕增十五: '75 cnc', 文昌五: 'f uma', 鬼宿增十四: '78 cnc', 轩辕增廿四: 'ksi cnc', 星宿增三: '20 hya', 轩辕增五八: '79 cnc', 三师增一: 'sig2 uma', 内阶增十: 'tau uma', 海石增一: 'a car', 海石增三: 'i car', 鬼宿增十八: 'pi.1 cnc', 星宿增五: '21 hya', 南船五: 'bet car', 上台增六: '36 lyn', 内阶二: 'c uma', 柳宿八: 'tet hya', 鬼宿增十六: 'pi. cnc', 轩辕增三: '19 uma', 内阶六: '17 uma', 文昌六: 'e uma', 星宿增二: '24 hya', 星宿增六: '23 hya', 海石二: 'iot car', 轩辕三: '38 lyn', 鬼宿增十五: '83 cnc', 星宿六: '26 hya', 星宿五: 'p hya', 文昌增五: '37 ly', 轩辕四: 'alf lyn', 天社五: 'kap vel', 文昌增六: '39 lyn', 轩辕增廿五: '6 lmi', 小斗六: 'iot cha', 轩辕七: 'kap leo', 星宿增七: '28 hya', 文昌增三: '21 uma', 星宿增一: '29 hya', 星宿一: 'alf hya', 酒旗三: 'ome leo', 酒旗增五: '3 leo', 上台增七: '41 lyn', 星宿二: 'tau1 hya', 天记增一: 'psi vel', 轩辕增二: '7 lmi', 天社六: 'n vel', 内阶四: 'h uma', 轩辕增一: '8 lmi', 轩辕八: 'lam leo', 酒旗二: 'ksi leo', 酒旗增四: '6 leo', 星宿三: 'tau2 hya', 文昌四: 'tet uma', 内平增五: '9 lmi', 小斗五: 'zet cha', 内平增六: '10 lmi', 海石三: 'h car', 少辅: 'd uma', 紫微右垣四: 'd uma', 星宿增八: 'a hya', 文昌增四: '26 uma', 内平增七: '11 lmi', 酒旗增二: '7 leo', 酒旗增一: '8 leo', 轩辕增四五: '10 leo', 轩辕增廿六: '9 leo', 星宿增十五: '34 hya', 酒旗增三: '11 leo', 内平增四: '42 lyn', 轩辕增四六: '2 sex', 星宿增十三: '37 hya', 星宿四: 'iot hya', 张宿五: 'kap hya', 轩辕十五: 'omi leo', 轩辕增五九: 'omi leo', 轩辕增廿七: '13 leo', 内平增三: '43 lyn', 内平三: '13 lmi', 少辅增一: '27 uma', 轩辕六: 'f leo', 酒旗一: 'psi leo', 海石四: 'l car', 轩辕九: 'eps leo', 文昌增一: '28 uma', 轩辕增四四: '18 leo', 文昌增二: '44 lyn', 海石五: 'ups car', 星宿增十: '3 sex', 轩辕增廿九: '20 leo', 内平增二: '16 lmi', 轩辕增四八: '4 sex', 星宿增十一: '5 sex', 文昌二: 'ups uma', 轩辕增四三: '23 leo', 星宿增九: '6 sex', 张宿一: 'ups1 hya', 轩辕增廿八: 'g leo', 文昌三: 'phi uma', 轩辕增四七: '7 sex', 内平增一: '17 lmi', 星宿增十二: 'gam sex', 轩辕十: 'mu. leo', 轩辕增四九: '9 sex', 文昌增七: '31 uma', 轩辕增四十: '10 sex', 内平四: '18 lmi', 中台增二: '19 lmi', 轩辕增卅九: '11 sex', 轩辕增四二: 'nu. leo', 轩辕增五十: '12 sex', 轩辕增卅八: 'pi. leo', 内平增九: '20 lmi', 张宿四: 'hip 49321', 轩辕增五一: '13 sex', 张宿增一: 'ups2 hya', 轩辕增五二: '14 sex', 轩辕十三: 'eta leo', 内平二: '21 lmi', 轩辕十七: '31 leo', 御女: '31 leo', 轩辕十四: 'alf leo', 天相一: '17 sex', 张宿二: 'lam hya', 轩辕增卅四: '33 leo', 天相增一: '18 sex', 轩辕增卅七: '34 leo', 轩辕增五三: '19 sex', 轩辕增五四: '19 sex', 南船四: 'ome car', 天相增三: '20 sex', 天相增二: '21 sex', 天记增二: 'q vel', 内平一: '22 lmi', 内平增十: '23 lmi', 内平增十一: '24 lmi', 轩辕增卅: '35 leo', 轩辕增卅六: '37 leo', 轩辕十一: 'zet leo', 南船一: 'q car', 三台三: 'lam uma', 中台一: 'lam uma', 轩辕增卅一: '39 leo', 天相三: 'eps sex', 天枢增一: '32 uma', 轩辕增卅二: '40 leo', 轩辕增卅三: '40 leo', 轩辕十二: 'gam1 leo', 长垣增四: '23 sex', 中台增三: '25 lmi', 轩辕增卅五: '42 leo', 三台四: 'mu. uma', 中台二: 'mu. uma', 轩辕增五五: '43 leo', 势增六: '26 lmi', 势增七: '27 lmi', 势增十七: '27 lmi', 天相增四: '25 sex', 天相增八: '24 sex', 势增八: '28 lmi', 势增十八: '28 lmi', 南船增一: 'i car', 轩辕增五六: '44 leo', 势增五: '29 lmi', 势增九: '30 lmi', 势增十九: '30 lmi', 张宿三: 'mu. hya', 天相增九: '26 sex', 天相增五: '27 sex', 轩辕增五七: '45 leo', 海山一: 's car', 势增四: 'bet lmi', 天相增六: 'del sex', 四辅二: 'hip 51384', 天枢增二: '35 uma', 势增三: '32 lmi', 天相增十: 'bet sex', 长垣增五: '31 sex', 天璇增一: '36 uma', 四辅三: 'hip 51502', 势二: 'h lmi', 南船二: 'p car', 长垣一: '46 leo', 长垣增三: '32 sex', 张宿增二: 'phi1 hya', 轩辕十六: 'rho leo', 势一: '34 lmi', 张宿增四: '44 hya', 阴德二: 'hd 91114', 长垣四: '48 leo', 长垣增二: '49 leo', 天璇增二: '37 uma', 小斗三: 'gam cha', 张宿增三: 'phi2 hya', 势增一: '35 lmi', 海山增一: 'p vel', 势增十: '36 lmi', 张宿六: 'phi hya', 势增十一: '37 lmi', 长垣增一: '50 leo', 势增二: '38 lmi', 少微增一: '39 lmi', 天相增十一: '33 sex', 天枢增三: '38 uma', 长垣增六: '34 sex', 南船三: 'tet car', 少微增二: '40 lmi', 长垣增七: '35 sex', 少微三: '41 lmi', 天璇增五: '39 uma', 灵台增二: '36 sex', 小斗四: 'del2 cha', 势三: '42 lmi', 天璇增六: '40 uma', 长垣增八: '37 sex', 天璇增四: '41 uma', 少微四: 'm leo', 长垣二: 'k leo', 海山增二: 'mu. vel', 翼宿增三: 'b1 hya', 长垣增九: '38 sex', 势增十四: '43 lmi', 翼宿增二: '39 sex', 长垣三: 'l leo', 天相增十二: '40 sex', 翼宿五: 'nu. hya', 势增十六: '44 lmi', 势增十五: '44 lmi', 翼宿增一: '41 sex', 翼宿增四: '5 crt', 天璇增七: '43 uma', 天璇增三: '42 uma', 势四: 'o lmi', 翼宿增五: 'b3 hya', 天璇增八: '44 uma', 天牢一: 'ome uma', 少微增三: '48 lmi', 势增十二: '47 lmi', 少微二: '54 leo', 少微增九: '54 leo', 灵台增三: '55 leo', 势增十三: '46 uma', 少微增八: '49 lmi', 灵台增一: '56 leo', 灵台增四: '57 leo', 少微增四: '50 lmi', 天牢三: '47 uma', 翼宿一: 'alf crt', 灵台三: 'd leo', 灵台二: 'c leo', 天牢五: '49 uma', 灵台增五: 'p2 leo', 北斗二: 'bet uma', 天璇: 'bet uma', 西上相增一: 'b leo', 翼宿增六: '8 crt', 灵台增七: 'p3 leo', 北斗一: 'alf uma', 天枢: 'alf uma', 灵台一: 'chi leo', 少微增五: '51 lmi', 翼宿廿: 'chi1 hya', 灵台增八: 'p4 leo', 少微一: '52 lmi', 少微增七: '64 leo', 翼宿增七: '10 crt', 少微增六: '67 leo', 灵台增六: '66 leo', 太尊: 'psi uma', 翼宿十六: 'bet crt', 明堂增五: 'p5 leo', 太微右垣五: 'del leo', 西上相: 'del leo', 太微右垣四: 'tet leo', 西次相: 'tet leo', 虎贲: '72 leo', 西次相增三: 'n leo', 明堂增六: 'phi leo', 明堂增四: '75 leo', 三台六: 'ksi uma', 下台二: 'ksi uma', 三台五: 'nu. uma', 下台一: 'nu. uma', 天牢增二: '55 uma', 翼宿七: 'del crt', 太微右垣二: 'sig leo', 西上将: 'sig leo', 天牢六: '56 uma', 翼宿四: 'lam crt', 太微右垣三: 'iot leo', 西次将: 'iot leo', 明堂增三: '79 leo', 翼宿十: 'eps crt', 翼宿二: 'gam crt', 西次相增二: '81 leo', 明堂增二: '80 leo', 翼宿九: 'kap crt', 明堂一: 'tau leo', 天牢二: '57 uma', 五帝座增二: '85 leo', 明堂三: 'e leo', 明堂增七: 'e leo', 西上相增二: '86 leo', 天牢四: '58 uma', 上辅: 'lam dra', 紫微右垣三: 'lam dra', 五帝座增三: '88 leo', 青丘三: 'n hya', 青丘四: '18 crt', 青丘五: 'ksi hya', 明堂增一: '89 leo', 青丘六: '20 crt', 五帝座增一: '90 leo', 海山五: 'lam cen', 上辅增一: '2 dra', 青丘增三: '22 crt', 翼宿十三: 'tet crt', 明堂二: 'ups leo', 青丘增二: '23 crt', 天牢增一: '59 uma', 内屏增一: 'ome vir', 太阳守增一: '60 uma', 翼宿八: 'iot crt', 青丘七: 'omi hya', 下台增一: '61 uma', 下台增二: '62 uma', 青丘增一: '26 crt', 上辅增二: '3 dra', 翼宿三: 'zet crt', 五帝座三: 'hip 57320', 内屏一: 'ksi vir', 海山六: 'lam mus', 内屏二: 'nu. vir', 太阳守: 'chi uma', 内屏增二: 'a1 vir', 太子: 'gam umi', 翼宿十四: 'hip 57587', 五帝座一: 'bet leo', 太微右垣一: 'bet vir', 右执法: 'bet vir', 五帝座五: 'hip 57779', 青丘一: 'bet hya', 北斗三: 'gam uma', 天玑: 'gam uma', 内屏增三: 'a2 vir', 青丘二: '29 crt', 五帝座四: 'o leo', 天理三: '66 uma', 翼宿六: 'eta crt', 小斗二: 'eps cha', 内屏增六: 'b vir', 轸宿增三: '31 crt', 内屏三: 'pi. vir', 常陈七: '67 uma', 郎位十五: '2 com', 内屏四: 'omi vir', 马尾三: 'del cen', 右辖: 'alf crv', 谒者增一: '10 vir', 内屏增五: '11 vir', 轸宿二: 'eps crv', 轸宿增四: '3 crv', 马尾二: 'rho cen', 郎位增三: '4 com', 郎位十四: '5 com', 内屏增四: '12 vir', 相增一: '1 cvn', 十字架四: 'del cru', 北斗四: 'del uma', 天权: 'del uma', 轸宿一: 'gam crv', 常陈六: '2 cvn', 郎位十: '7 com', 小斗一: 'bet cha', 左执法增一: '13 vir', 轸宿增二: '14 vir', 郎位增二: '9 com', 相增二: '3 cvn', 郎位增一: '10 com', 太微左垣一: 'eta vir', 左执法: 'eta vir', 谒者: 'c vir', 长沙: 'zet crv', 天权增二: '70 uma', 郎位七: '12 com', 谒者增二: '17 vir', 轸宿增五: '6 crv', 常陈增一: '4 cvn', 相: '5 cvn', 郎位六: '13 com', 常陈五: '6 cvn', 郎位三: '14 com', 马尾一: 'g cen', 十字架二: 'alf1 cru', 郎位一: 'gam com', 郎位四: '16 com', 天权增三: '73 uma', 库楼十: 'sig cen', 郎位五: '17 com', 郎位九: '18 com', 郎位十三: '20 com', 轸宿三: 'del crv', 天权增一: '74 uma', 少尉增二: '4 dra', 郎位八: '21 com', 十字架一: 'gam cru', 左辖: 'eta crv', 蜜蜂二: 'gam mus', 九卿增八: '20 vir', 九卿增九: '20 vir', 少尉: 'kap dra', 紫微右垣二: 'kap dra', 常陈四: 'bet cvn', 轸宿增一: 'q vir', 轸宿四: 'bet crv', 少尉增一: '6 dra', 郎位十一: '23 com', 进贤增九: 'f vir', 蜜蜂三: 'alf mus', 库楼八: 'tau cen', 常陈三: '9 cvn', 郎位十二: '26 com', 进贤增八: 'chi vir', 库楼七: 'gam cen', 内厨增二: '76 uma', 九卿增五: '27 vir', 东上相: 'gam vir', 太微左垣二: 'gam vir', 九卿一: 'rho vir', 进贤增七: '28 vir', 常陈二: '10 cvn', 九卿二: 'd2 vir', 蜜蜂一: 'bet mus', 九卿增六: '33 vir', 九卿增四: '34 vir', 内厨一: '7 dra', 十字架三: 'bet cru', 九卿增三: '28 com', 相增三: '11 cvn', 九卿增二: '29 com', 九卿增一: '29 com', 北极五: 'hip 62561', 郎将增一: '30 com', 东次相增一: '37 vir', 郎将: '31 com', 进贤增一: '38 vir', 东次将增一: '41 vir', 北斗五: 'eps uma', 玉衡: 'eps uma', 进贤增五: 'psi vir', 内厨二: '8 dra', 东次相: 'del vir', 太微左垣三: 'del vir', 常陈一: 'alf2 cvn', 进贤: 'k vir', 进贤增二: 'k vir', 内厨增一: '9 dra', 周鼎二: '37 com', 进贤增三: '46 vir', 东次将: 'eps vir', 太微左垣四: 'eps vir', 蜜蜂四: 'del mus', 进贤增四: '48 vir', 库楼六: 'f cen', 周鼎三: '41 com', 角宿增十五: '49 vir', 平增一: 'psi hya', 常陈增五: '15 cvn', 角宿增十四: '50 vir', 平道一: 'tet vir', 东上将: 'alf com', 太微左垣五: 'alf com', 常陈增四: '16 cvn', 常陈增六: '17 cvn', 常陈增二: '18 cvn', 周鼎一: 'bet com', 天门一: '53 vir', 天门增三: '54 vir', 天门增二: '55 vir', 角宿增十二: '56 vir', 角宿增十三: '56 vir', 天门增一: '57 vir', 东次将增三: 'e vir', 角宿增十一: '58 vir', 常陈增三: '20 cvn', 三公三: '21 cvn', 天门增四: '61 vir', 平一: 'gam hya', 角宿增十: '62 vir', 天门增五: '63 vir', 角宿增一: '65 vir', 北斗六: 'zet uma', 开阳: 'zet uma', 角宿增十六: '66 vir', 角宿一: 'alf vir', 辅: 'g uma', 开阳增一: 'g uma', 角宿增九: 'i vir', 天门二: '69 vir', 东上将增一: '70 vir', 东上将增二: '71 vir', 角宿增二: '72 vir', 库楼五: 'd cen', 角宿增三: 'l vir', 天门增十一: '73 vir', 天门增六: '75 vir', 角宿增八: 'h vir', 三公二: '24 cvn', 角宿二: 'zet vir', 角宿增四: '80 vir', 角宿增五: '81 vir', 开阳增二: '82 uma', 东上将增四: 'hip 66640', 南门一: 'eps cen', 右摄提增三: '1 boo', 辅增一: '83 uma', 右摄提增二: '2 boo', 平道二: 'm vir', 天门增七: '83 vir', 天门增八: '85 vir', 角宿增七: '86 vir', 辅增二: '84 uma', 帝席增一: '3 boo', 右摄提二: 'tau boo', 右摄提增五: 'tau boo', 天门增十: '87 vir', 北斗七: 'eta uma', 摇光: 'eta uma', 角宿增六: '88 vir', 库楼四: 'g cen', 右摄提三: 'ups boo', 衡一: 'nu. cen', 衡二: 'mu. cen', 右摄提增一: 'e boo', 天门增九: '89 vir', 天乙: 'i dra', 右摄提增六: '7 boo', 辅增三: '86 uma', 右摄提一: 'eta boo', 库楼一: 'zet cen', 帝席三: '9 boo', 衡三: 'phi cen', 平增二: '47 hya', 平增四: '47 hya', 平增三: '48 hya', 帝席二: '11 boo', 马腹一: 'bet cen', 右枢: 'alf dra', 紫微右垣一: 'alf dra', 衡四: 'chi cen', 亢宿增一: '94 vir', 平二: 'pi. hya', 库楼三: 'tet cen', 亢宿增二: '95 vir', 庶子增二: '3 umi', 天枪增一: '13 boo', 北极四: '4 umi', 后宫: '4 umi', 亢宿增三: '96 vir', 帝席一: 'd boo', 亢宿增四: '97 vir', 折威一: '50 hya', 折威增一: '50 hya', 亢宿一: 'kap vir', 天枪一: 'kap1 boo', 亢池三: '14 boo', 大角: 'alf boo', 亢宿二: 'iot vir', 天枪二: 'iot boo', 玄戈: 'lam boo', 异雀七: 'eta aps', 亢宿四: 'lam vir', 亢池四: '18 boo', 亢宿增十二: 'ups vir', 亢池一: '20 boo', 亢宿增十一: '103 vir', 异雀九: 'eps aps', 折威增二: 'k hya', 天枪三: 'tet boo', 大角增一: 'f boo', 异雀五: 'del oct', 亢宿增六: '104 vir', 北极三: '5 umi', 庶子: '5 umi', 亢宿三: 'phi vir', 天枪增二: 'g boo', 亢宿增五: '106 vir', 梗河三: 'rho boo', 招摇: 'gam boo', 车骑三: 'sig lup', 梗河二: 'sig boo', 库楼二: 'eta cen', 车骑二: 'rho lup', 玄戈增一: '33 boo', 折威三: '3 lib', 南门二: 'alf1 cen', 左摄提二: 'pi.1 boo', 左摄提三: 'zet boo', 左摄提增三: '31 boo', 左摄提增二: '32 boo', 骑官十: 'alf lup', 阳门一: 'b cen', 南门增二: 'alf cir', 亢宿增七: 'mu. vir', 折威四: '4 lib', 折威五: '4 lib', 梗河增五: '34 boo', 阳门二: 'c1 cen', 梗河一: 'eps boo', 左摄提一: 'omi boo', 亢宿增九: '108 vir', 天床六: '6 umi', 氐宿增六: '5 lib', 折威增三: 'm hya', 亢宿增十: '109 vir', 折威增四: '55 hya', 折威增五: '56 hya', 异雀八: 'alf aps', 折威增七: '57 hya', 玄戈增二: 'h boo', 氐宿增五: 'mu. lib', 天枪增三: '39 boo', 阵车一: 'e hya', 阵车增一: 'e hya', 氐宿增七: 'alf1 lib', 北极二: 'bet umi', 帝: 'bet umi', 氐宿一: 'alf2 lib', 亢宿增八: '11 lib', 左摄提增一: 'ksi boo', 骑官九: 'omi lup', 氐宿增八: '10 lib', 折威六: '12 lib', 氐宿增四: 'ksi1 lib', 氐宿增三: 'ksi2 lib', 氐宿增廿九: '16 lib', 折威增六: '14 lib', 氐宿增卅: '17 lib', 骑官四: 'bet lup', 阵车增二: '59 hya', 氐宿增二: '18 lib', 骑官三: 'kap cen', 七公增六: '40 boo', 天床增一: '9 umi', 氐宿增一: 'del lib', 氐宿增廿八: '2 ser', 七公增五: 'bet boo', 阵车二: '60 hya', 梗河增四: 'ome boo', 氐宿增廿七: '110 vir', 天枪增四: 'i boo', 折威七: 'sig lib', 梗河增一: 'psi boo', 骑官八: 'pi. lup', 庶子增三: '10 umi', 氐宿增十: 'nu. lib', 氐宿增九: '22 lib', 梗河增三: 'c boo', 梗河增二: 'b boo', 骑官五: 'lam lup', 骑阵将军: 'kap1 lup', 氐宿二: 'iot1 lib', 车骑一: 'zet lup', 氐宿增十一: 'iot2 lib', 贯索增一: 'chi boo', 氐宿增十二: '26 lib', 顿顽二: 'i lup', 蜀增二: '3 ser', 七公七: 'del boo', 氐宿增廿六: '4 ser', 氐宿四: 'bet lib', 天床增二: '11 umi', 阵车三: 'f lup', 骑官七: 'mu. lup', 三角形一: 'gam tra', 氐宿增廿四: '5 ser', 贯索增二: 'omi crb', 北极一: 'gam umi', 氐宿增十三: '28 lib', 氐宿增十七: 'omi lib', 氐宿增廿五: '6 ser', 骑官二: 'del lup', 顿顽一: 'phi1 lup', 骑官六: 'eps lup', 氐宿增十八: '30 lib', 顿顽增一: 'phi2 lup', 贯索增三: 'eta crb', 氐宿增廿: 'eps lib', 七公六: 'mu.1 boo', 紫微左垣一: 'iot dra', 左枢: 'iot dra', 周增一: 'tau1 ser', 贯索三: 'bet crb', 氐宿增十六: 'zet1 lib', 氐宿增廿三: '10 ser', 氐宿增十五: 'zet3 lib', 七公五: 'nu.1 boo', 勾陈增七: 'tet umi', 三角形增三: 'kap1 aps', 七公增九: 'nu.2 boo', 氐宿增十四: 'zet lib', 贯索二: 'tet crb', 氐宿增廿一: 'a1 ser', 氐宿增十九: '37 lib', 天辐增一: '36 lib', 贯索四: 'alf crb', 秦: 'del ser', 天市右垣六: 'del ser', 骑官一: 'gam lup', 七公增八: 'mu. crb', 氐宿三: 'gam lib', 周增五: 'tau3 ser', 周增二: 'tau4 ser', 周增三: 'tau5 ser', 秦增二: '16 ser', 氐宿增廿二: '14 ser', 三角形增二: 'eps tra', 天辐一: 'ups lib', 七公增十: 'phi boo', 天辐二: 'tau lib', 日增一: '41 lib', 七公增七: 'zet1 crb', 从官增一: 'psi1 lup', 房宿增三: '42 lib', 三角形增四: 'kap2 aps', 周增四: 'tau6 ser', 周增七: 'iot ser', 周增十四: 'chi ser', 周增六: 'tau7 ser', '日(室宿)': 'kap lib', 从官一: 'psi2 lup', 贯索五: 'gam crb', 贯索一: 'pi. crb', 巴增一: 'psi ser', 勾陈四: 'zet umi', 西咸四: 'eta lib', 蜀: 'alf ser', 天市右垣七: 'alf ser', 周增九: 'tau8 ser', 天乳增一: 'a2 ser', 天市右垣五: 'bet ser', 周: 'bet ser', 周增十一: '29 ser', 蜀增一: 'lam ser', 周增十二: 'ups ser', 周增十五: 'ups ser', 周增八: 'kap ser', 天乳增三: '30 ser', 天乳增四: '30 ser', 贯索六: 'del crb', 天乳: 'mu. ser', 巴增二: 'ome ser', 巴: 'eps ser', 天市右垣八: 'eps ser', 从官二: 'chi lup', 房宿增四: 'b sco', 贯索增四: 'kap crb', 巴增五: 'b ser', 天乳增二: 'b ser', 贯索增十三: 'rho ser', 七公四: 'chi her', 周增十三: '39 ser', 房宿增二: 'lam lib', 房宿增一: 'lam lib', 房宿增五: 'a sco', 西咸三: 'tet lib', 七公增十二: '2 her', 三角形二: 'bet tra', 房宿增六: '4 sco', 七公增十一: '4 her', 贯索增五: 'lam crb', 天市右垣四: 'gam ser', 房宿二: 'rho sco', 贯索七: 'eps crb', 西咸二: '48 lib', 房宿一: 'pi. sco', 积卒二: 'eta lup', 积卒增一: 'eta lup', 罚三: '49 lib', 房宿三: 'del sco', 西咸增一: '50 lib', 巴增三: '3 her', 贯索九: 'rho crb', 晋增一: 'r her', 贯索八: 'iot crb', 上宰: 'tet dra', 紫微左垣二: 'tet dra', 贯索增十二: 'pi. ser', 七公增四: 'ups her', 巴增四: '43 ser', 西咸一: 'ksi sco', 房宿四: 'bet1 sco', 积卒一: 'tet lup', 钩钤一: 'ome1 sco', 积卒增二: 'hip 18970', 钩钤二: 'ome2 sco', 罚二: '11 sco', 斗增四: '45 ser', 天市右垣三: 'kap her', 晋增五: '7 her', 斗增三: '46 ser', 斗增五: '47 ser', 七公三: 'phi her', 晋增二: '8 her', 晋增四: '8 her', 贯索增六: 'tau crb', 七公增十三: '14 her', 勾陈增八: '19 umi', 晋增三: 'q her', 贯索增十一: '10 her', 键闭: 'nu. sco', 罚增二: 'psi sco', 罚增一: '16 sco', 心宿增一: 'c1 sco', 心宿增二: 'c2 sco', 勾陈增十: '20 umi', 斗增七: '9 her b', 斗二: '49 ser', 罚增三: 'chi sco', 梁: 'del oph', 天市右垣九: 'del oph', 贯索增七: 'sig crb', 斗增六: '12 her', 斗三: '13 her', 三角形增一: 'del tra', 河间增一: '16 her', 罚一: '18 sco', 斗增二: '15 her', 贯索增十: '17 her', 贯索增八: 'ups crb', 勾陈增九: 'eta umi', 天市右垣十: 'eps oph', 贯索增九: '19 her', 七公二: 'tau her', 异雀六: 'del1 aps', 心宿增三: 'omi sco', 心宿一: 'sig sco', 河间: 'gam her', 天市右垣二: 'gam her', 列肆一: 'sig ser', 天纪一: 'ksi crb', 天纪增三: 'nu.1 crb', 天纪增四: '23 her', 少宰: 'eta dra', 紫微左垣三: 'eta dra', 东咸三: 'psi oph', 斗增九: 'o her', 天纪增二: '25 her', 斗一: 'ome her', 斗增一: 'ome her', 心宿增九: 'rho oph', 心宿增四: 'rho oph', 东咸二: 'chi oph', 车肆一: 'ups oph', 天纪增五: '26 her', 尚书二: 'a dra', 七公增十四: 'g her', 大火: 'alf sco', 心宿二: 'alf sco', 七公增三: '34 her', 心宿增五: 'i sco', 河中: 'bet her', 天市右垣一: 'bet her', 列肆二: 'lam oph', 东咸一: 'phi oph', 东咸四: 'ome oph', 东咸增二: 'ome oph', 斗增十: 'n her', 斗增十一: 'n her', 斗四: 'h her', 异雀四: 'gam aps', 天纪增六: '32 her', 七公增十五: 'sig her', 心宿三: 'tau sco', 七公增二: '16 dra', 七公增一: '17 dra', 列肆增四: '12 oph', 斗五: '33 her', 天市右垣十一: 'zet oph', 七公一: '42 her', 斛增五: '36 her', 斛增六: 'm her', 尚书三: 'g dra', 天纪二: 'zet her', 斛增四: '38 her', 东咸增一: '24 sco', 天纪增七: '39 her', 列肆增三: '14 oph', 天纪增一: 'eta her', 异雀三: 'bet aps', 斛增二: '41 her', 天纪增八: '46 her', 心宿增六: '15 oph', 列肆增二: '16 oph', 斛四: '43 her', 斛增一: '43 her', 勾陈三: 'eps umi', 心宿增八: '25 sco', 斛增三: '45 her', 三角形三: 'alf tra', 七公增十六: '52 her', 天纪增十: '48 her', 龟四: 'eta ara', 车肆二: '20 oph', 尾宿二: 'eps sco', 斛三: 'k her', 天纪增九: '50 her', 列肆增一: '21 oph', 魏增一: '51 her', 尾宿一: 'mu.1 sco', 宦者增三: '49 her', 尾宿增二: 'mu.2 sco', 天纪增十一: '53 her', 尾宿三: 'zet1 sco', 斛一: 'iot oph', 车肆增一: '23 oph', 魏增二: '56 her', 宦者增二: '54 her', 宦者增一: '54 her', 尚书五: 'h dra', 尚书增二: '20 dra', 尾宿增一: '27 sco', 魏增三: '57 her', 斛二: 'kap oph', 龟五: 'zet ara', 龟一: 'eps1 ara', 天江增九: '26 oph', 天纪三: 'eps her', 车肆增二: '30 oph', 天纪四: 'd her', 宋增二: '29 oph', 宦者一: '32 oph', 天纪五: '61 her', 宦者二: '33 oph', 宦者增四: '34 oph', 天江增十: '28 oph', 天江增十一: '31 oph', 天棓增九: 'mu. dra', 宦者三: '60 her', 天江增八: '28 sco', 魏增五: '62 her', 上弼: 'zet dra', 紫微左垣四: 'zet dra', 宋: 'eta oph', 天市左垣十一: 'eta oph', 尾宿四: 'eta sco', 宦者四: '37 oph', 天江一: '29 sco', 帝座: 'alf1 her', 天市左垣一: 'del her', 女床一: 'pi. her', 天江二: 'a oph', 天江增三: '30 sco', 宗正增三: '41 oph', 勾陈增五: 'lam umi', 天纪六: 'u her', 天江增二: '38 oph', 女床二: 'e her', 天江增六: 'omi oph', 宦者增五: 'e oph', 天棓增七: '74 her', 天纪增十三: 'w her', 市楼四: 'nu. ser', 市楼增一: 'nu. ser', 魏增六: '70 her', 魏增七: '70 her', 天江增七: 'ksi oph', 天江增四: '32 sco', 异雀一: 'zet aps', 天江三: 'tet oph', 异雀二: 'iot aps', 天江增一: '43 oph', 女床三: 'rho her', 魏增八: '73 her', 天纪增十五: 'hip 85181', 天江增五: '191 oph', 龟二: 'gam ara', 天江四: 'b oph', 宗正增二: 'sig oph', 天棓增八: 'x her', 糠: 'd oph', 天棓三: 'bet dra', 天市左垣二: 'lam her', 尾宿九: 'ups sco', 勾陈增六: '24 umi', 天籥增一: '50 oph', 龟三: 'del ara', 天籥六: 'c oph', 赵增一: '78 her', 尚书一: 'f dra', 天棓增一: 'nu.1 dra', 勾陈二: 'del umi', 天棓二: 'nu.2 dra', 御女三: '29 dra', 尾宿八: 'lam sco', 候增三: '54 oph', 候增五: 'f oph', 候: 'alf oph', 天棓增十: '26 dra', 候增四: '56 oph', 天籥五: '52 oph', 尾宿增三: 'q sco', 天棓增四: 'y her', 尚书增一: 'ome dra', 尾宿五: 'tet sco', 赵增二: '79 her', 南海: 'ksi ser', 天市左垣十: 'ksi ser', 市楼一: 'mu. oph', 天棓五: 'iot her', 市楼二: 'omi ser', 女史增一: 'psi1 dra', 尾宿七: 'kap sco', 赵增三: '84 her', 天籥三: '58 oph', 宗正一: 'bet oph', 宗正增一: '61 oph', 孔雀一: 'eta pav', 九河: 'mu. her', 天市左垣三: 'mu. her', 天籥八: '2 sgr', 尾宿六: 'iot1 sco', 宗正二: 'gam oph', 九河增一: '87 her', 天棓增二: '30 dra', 天柱增六: '35 dra', 傅说: 'g sco', 天棓增三: 'z her', 天纪增十四: 'f her', 天棓一: 'ksi dra', 天籥一: '63 oph', 女史: 'psi2 dra', 天纪九: 'tet her', 天棓四: 'gam dra', 中山增一: 'ksi her', 中山增二: 'nu. her', 天市左垣九: 'nu. oph', 燕: 'zet cap', 天籥增二: '4 sgr', 天柱五: '40 dra', 帛度增三: '93 her', 天柱增五: '41 dra', 天籥增三: '5 sgr', 宗人一: '66 oph', 东海增一: 'zet ser', 宗人二: '67 oph', 斗宿增一: '6 sgr', 帛度一: '95 her', 宗人三: '68 oph', 帛度增一: '96 her', 屠肆增一: '97 her', 天籥增四: '7 sgr', 市楼三: 'tau oph', 宗人四: 'p oph', 箕宿一: 'gam sgr', 屠肆二: '98 her', 中山增三: 'b her', 宗人增二: '71 oph', 宗人增一: '72 oph', 天市左垣四: 'omi her', 中山: 'omi her', 中山增七: '100 her', 孔雀二: 'pi. pav', 帛度二: '102 her', 帛度增二: '101 her', 宗人增三: '73 oph', 中山增四: 'a her', 斗宿三: 'mu. sgr', 扶筐增一: '36 dra', 斗宿增二: '15 sgr', 斗宿增五: '15 sgr', 柱史增二: '37 dra', 柱史增一: '38 dra', 箕宿四: 'eta sgr', 屠肆增二: '105 her', 织女增四: 'kap lyr', 屠肆增三: '106 her', 柱史: 'phi dra', 宗人增四: '74 oph', 中山增五: '108 her', 箕宿二: 'del sgr', 中山增六: 't her', 御女四: 'chi dra', 东海: 'eta ser', 天市左垣八: 'eta ser', 孔雀增二: 'ksi pav', 屠肆一: '109 her', 扶筐三: 'b dra', 箕宿三: 'eps sgr', 织女增三: 'mu. lyr', 斗宿增三: '21 sgr', 扶筐增二: '42 dra', 鳖一: 'alf tel', 东海增二: 'd ser', 斗宿二: 'lam sgr', 东海增四: 'c ser', 孔雀三: 'nu. pav', 东海增三: '61 ser', 扶筐二: 'd dra', 鳖十: 'kap2 cra', 鳖十一: 'tet cra', 天弁一: 'alf sct', 织女: 'alf lyr', 织女一: 'alf lyr', 斗宿增四: '26 sgr', 天弁二: 'del sct', 扶筐一: 'c dra b', 孔雀八: 'zet pav', 天弁三: 'eps sct', 农丈人: 'hip 91918', 织女二: 'eps1 lyr', 织女增二: 'eps2 lyr', 织女三: 'zet1 lyr', 织女增一: 'zet2 lyr', 徐增一: '4 aql', 斗宿一: 'phi sgr', 宗一: '110 her', 御女二: '50 dra', 天弁增一: '5 aql', 宗二: '111 her', 天弁四: 'bet sct', 鳖二: 'eta1 cra', 建增一: '29 sgr', 渐台增六: 'nu.1 lyr', 渐台增五: 'nu. lyr', 渐台二: 'bet lyr', 建增五: '30 sgr', 天弁增二: '7 aql', 扶筐四: 'omi dra', 天弁增三: '8 aql', 建增四: '31 sgr', 孔雀四: 'lam pav', 天市左垣五: '112 her', 渐台增一: 'del1 lyr', 建增三: '33 sgr', 建增六: 'nu.1 sgr', 少弼: 'ups dra', 紫微左垣五: 'ups dra', 渐台一: 'del2 lyr', 齐增一: '113 her', 建增七: 'nu.2 sgr', 斗宿四: 'sig sgr', 辇道一: '13 lyr', 徐增二: '62 ser', 天市左垣七: 'tet1 ser', 徐: 'tet1 ser', 扶筐五: '48 dra', 孔雀五: 'kap pav', 天弁五: 'eta sct', 徐增四: '64 ser', 建增二: 'ksi1 sgr', 建一: 'ksi2 sgr', 孔雀增三: 'ome pav', 鳖八: 'eps cra', 吴越增二: '10 aql', 渐台三: 'gam lyr', 吴越增三: '11 aql', 吴越增一: 'eps aql', 渐台增四: 'lam lyr', 扶筐六: '49 dra', 辇道增一: '16 lyr', 天弁六: 'i aql', 斗宿六: 'zet sgr', 天弁九: 'g aql', 鳖三: 'zet cra', 建二: 'omi sgr', 扶筐七: '51 dra', 天弁八: 'h aql', 天市左垣六: 'zet aql', 吴越: 'zet aql', 天弁七: 'lam aql', 鳖七: 'gam cra', 斗宿五: 'tau sgr', 吴越增四: '18 aql', 渐台四: 'iot lyr', 渐台增三: '17 lyr', 鳖四: 'del cra', 徐增三: '19 aql', 天柱四: '59 dra', 天柱增一: '59 dra', 鳖六: 'alf cra', 天厨增一: '55 dra', 建三: 'pi. sgr', 鳖五: 'bet cra', 扶筐增四: '53 dra', 天厨一: 'del dra', 天弁增四: '20 aql', 右旗增二: '21 aql', 辇道二: 'eta lyr', 辇道增二: 'eta lyr', 扶筐增三: '54 dra', 齐增二: '1 sge', 狗增六: 'psi sgr', 御女一: 'tau dra', 齐增三: '1 vul', 辇道三: 'tet lyr', 右旗增一: '22 aql', 奚仲一: 'kap cyg', 建四: 'd sgr', 建增九: 'hip 94823', 齐增四: '2 vul', 吴越增五: 'ome1 aql', 建增十: 'hip 94859', 吴越增六: 'a aql', 天弁增五: 'f aql', 右旗增三: 'd aql', 天厨六: 'pi. dra', 建五: 'rho1 sgr', 建六: 'ups sgr', 建增八: 'rho2 sgr', 天渊二: 'bet1 sgr', 齐增八: '3 vul', 天渊一: 'bet2 sgr', 天渊三: 'alf sgr', 辇道增八: '2 cyg', 左旗增三: '2 sge', 左旗增二: '3 sge', 吴越增七: 'b aql', 狗二: 'chi1 sgr', 狗增五: 'chi2 sgr', 齐增七: '3 cyg', 左旗增四: '4 vul', 右旗三: 'del aql', 狗增七: 'chi3 sgr', 狗增四: 'chi3 sgr', 辇道四: '4 cyg', 左旗增五: '5 vul', 狗增三: '50 sgr', 右旗四: 'nu. aql', 奚仲增一: 'iot1 cyg', 齐增五: 'alf vul', 齐增十一: '8 vul', 右旗增四: 'c aql', 左旗增六: '7 vul', 奚仲二: 'iot cyg', 右旗增八: 'e aql', 右旗增七: 'e aql', 辇道增七: 'bet1 cyg', 辇道增九: '8 cyg', 天厨二: 'sig dra', 右旗一: 'mu. aql', 左旗增七: '9 vul', 右旗增十: '37 aql', 辇道增三: '11 cyg', 右旗六: 'hip 96392', 狗增一: 'h1 sgr', 奚仲三: 'tet cyg', 狗一: 'h2 sgr', 右旗五: 'iot aql', 右旗增六: 'iot aql', 右旗八: 'kap aql', 左旗增一: 'eps sge', 右旗七: '42 aql', 右旗二: 'sig aql', 辇道增六: 'phi cyg', 天津增一: '14 cyg', 狗增二: '53 sgr', 左旗一: 'alf sge', 右旗增五: '45 aql', 天鸡增一: 'e1 sgr', 左旗二: 'bet sge', 奚仲四: 'c cyg', 河鼓增二: '46 aql', 天鸡一: 'e2 sgr', 河鼓增三: 'chi aql', 左旗增八: '10 vul', 辇道增四: '15 cyg', 河鼓增一: 'psi aql', 天津二: 'del cyg', 河鼓增九: 'ups aql', 河鼓三: 'gam aql', 天鸡二: 'f sgr', 辇道五: '17 cyg', 左旗三: 'del sge', 天厨三: 'eps dra', 河鼓增四: 'pi. aql', 左旗四: 'zet sge', 天津增二: '19 cyg', 奚仲增二: 'd cyg', 河鼓二: 'alf aql', 牛郎: 'alf aql', 右旗增十一: '51 aql', 河鼓增五: 'omi aql', 左旗增十八: '12 vul', 天鸡增二: '57 sgr', 左旗增廿九: '9 sge', 天桴四: 'eta aql', 奚仲增六: '23 cyg', 奚仲增七: '23 cyg', 左旗增十七: '13 vul', 右旗九: '56 aql', 河鼓增八: 'ksi aql', 右旗增十二: '57 aql', 天桴三: '58 aql', 天渊增一: 'iot sgr', 河鼓一: 'bet aql', 狗国一: 'ome sgr', 天津增三: '22 cyg', 左旗增廿八: '10 sge', 河鼓增六: 'phi aql', 辇道增五: 'eta cyg', 狗国四: 'b sgr', 左旗七: '11 sge', 天鸡增三: 'g sgr', 左旗五: 'gam sge', 狗国二: 'a sgr', 左旗增十九: '14 vul', 天柱三: '69 dra', 天渊增二: 'tet1 sgr', 狗国增二: 'tet2 sgr', 天津增四: '25 cyg', 左旗六: '13 sge', 孔雀九: 'eps pav', 左旗增十: '15 vul', 奚仲增三: 'e cyg', 天厨五: 'e dra', 牛宿增一: '63 sgr', 左旗增十六: '16 vul', 天厨增二: '65 dra', 狗国三: 'c sgr', 天厨四: 'rho dra', 左旗八: '14 sge', 左旗增廿七: '15 sge', 河鼓增七: 'tau aql', 狗国增一: 'hip 98842', 天桴二: '62 aql', 牛宿增三: '64 sgr', 左旗增廿六: 'eta sge', 牛宿增二: '65 sgr', 天钩增一: '66 dra', 天津增五: 'b1 cyg', 左旗增廿: '17 vul', 天桴增一: '64 aql', 孔雀六: 'del pav', 天柱增二: 'kap cep', 天津增六: 'b2 cyg', 左旗增廿五: 'tet sge', 左旗增十三: '18 vul', 狗国增三: 'hip 99461', 天桴一: 'tet aql', 天钩增二: '68 dra', 左旗增十四: '19 vul', 牛宿增四: 'ksi1 cap', 左旗增十五: '20 vul', 牛宿三: 'ksi cap', 天桴增二: '66 aql', 天津三: '30 cyg', 奚仲增四: '33 cyg', 天津增卅八: 'omi1 cyg', 左旗增十一: '21 vul', 左旗九: 'rho aql', 天津增七: 'b3 cyg', 天津增卅七: 'omi2 cyg', 左旗增廿三: '22 vul', 左旗增十二: '23 vul', 左旗增廿四: '18 sge', 牛宿增五: '3 cap', 左旗增廿一: '24 vul', 牛宿增六: 'alf1 cap', 天津增九: 'p cyg', 牛宿增九: '4 cap', 牛宿二: 'alf2 cap', 天津增八: '36 cyg', 天津增十四: '35 cyg', 牛宿增八: 'sig cap', 天钩增三: '71 dra', 天钩增四: '71 dra', 牛宿增七: 'nu. cap', 牛宿增十一: 'nu. cap', 牛宿增十二: 'bet2 cap', 牛宿一: 'bet cap', 左旗增廿二: '25 vul', 天津一: 'gam cyg', 天津增十五: '39 cyg', 孔雀十一: 'alf pav', 天津增卅六: '43 cyg', 牛宿四: 'pi. cap', 牛宿增十三: 'pi. cap', 天津增十: '40 cyg', 天柱增四: '75 dra', 离珠增一: '68 aql', 牛宿六: 'rho cap', 天津增十二: '42 cyg', 天津增十六: '41 cyg', 天柱增三: '74 dra', 天钩三: 'tet cep', 离珠四: '69 aql', 牛宿五: 'omi cap', 天津增卅五: 'ome1 cyg', 败瓜增一: '1 del', 天津增十一: '44 cyg', 天津增卅四: 'ome2 cyg', 紫微左垣六: '73 dra', 败瓜一: 'eps del', 天津增十三: '47 cyg', 败瓜二: 'eta del', 瓠瓜五: 'zet del', 天津增廿一: '26 vul', 离珠一: '70 aql', 天津增廿: '27 vul', 罗堰增一: 'tau1 cap', 天津增十七: '48 cyg', 瓠瓜四: 'bet del', 波斯二: 'alf ind', 败瓜四: 'iot del', 离珠二: 'l aql', 瓠瓜增五: '29 vul', 天津增廿二: '28 vul', 败瓜三: 'tet del', 瓠瓜增六: 'hip 101909', 败瓜五: 'kap del', 罗堰一: 'tau cap', 离珠三: '1 aqr', 瓠瓜一: 'alf del', 罗堰二: 'ups cap', 天津增十八: '49 cyg', 瓠瓜增一: '10 del', 天津四: 'alf cyg', 车府增一: '51 cyg', 天柱一: '76 dra', 天钩一: '4 cep', 瓠瓜三: 'del del', 天津增廿三: '30 vul', 孔雀七: 'bet pav', 天钩四: 'eta cep', 天津增十九: '52 cyg', 罗堰三: '17 cap', 天津九: 'eps cyg', 瓠瓜二: 'gam2 del', 瓠瓜增七: 'gam2 del', 天津增卅九: 't cyg', 天津增四十: 't cyg', 天津增卅: 'lam cyg', 女宿一: 'eps aqr', 女宿四: 'k aqr', 败瓜增三: '13 del', 天津增卅三: '55 cyg', 瓠瓜增二: '15 del', 败瓜增二: '14 del', 天津增卅一: '56 cyg', 女宿三: '4 aqr', 波斯十一: 'iot ind', 天津增廿四: '31 vul', 女宿增一: '5 aqr', 女宿二: 'mu. aqr', 天津增卅二: '57 cyg', 天津增廿五: '32 vul', 越: '19 cap', 孔雀增四: 'bet ind', 瓠瓜增八: '17 del', 瓠瓜增四: '17 del', 瓠瓜增三: '16 del', 女宿增五: '7 aqr', 天津五: 'nu. cyg', 人增一: '33 vul', 司非增二: '18 del', 虚宿增四: 'eps equ', 车府五: 'f1 cyg', 天垒城九: '8 aqr', 女宿增三: '10 aqr', 女宿增二: '11 aqr', 周二: '21 cap', 天垒城八: '9 aqr', 车府增二: '60 cyg', 离瑜增一: 'gam mic', 虚宿增一: 'lam equ', 女宿增四: '12 aqr', 周一: 'eta cap', 虚宿增三: '3 equ', 蛇尾四: 'alf oct', 车府六: 'ksi cyg', 虚宿增二: '4 equ', 天柱二: '77 dra', 秦一: 'tet cap', 离瑜增二: '2 psa', 车府增三: 'f2 cyg', 天津增廿九: '61 cyg', 赵一: '26 cap', 赵二: '27 cap', 天垒城十: 'nu. aqr', 天垒城增二: 'nu. aqr', 司非一: 'gam equ', 司非增三: '6 equ', 司非增一: '6 equ', 九坎二: 'η mic', 天津八: 'zet cyg', 司非二: 'del equ', 天津六: 'tau cyg', 天垒城七: '29 cap', 虚宿二: 'alf equ', 天垒城十一: '14 aqr', 天津增廿八: 'sig cyg', 天津七: 'ups cyg', 离瑜二: 'eps mic', 秦二: '30 cap', 虚宿增五: '15 aqr', 天钩五: 'alf cep', 天钩增六: '6 cep', 天钩增五: '6 cep', 虚宿增六: '16 aqr', 司危二: '9 equ', 人二: '1 peg', 代一: 'iot cap', 司危一: 'bet equ', 天垒城十二: '17 aqr', 天垒城六: '18 aqr', 虚宿增八: '20 aqr', 天垒城十三: '19 aqr', 虚宿增七: '21 aqr', 天津增廿六: '69 cyg', 孔雀十: 'gam pav', 天津增廿七: '70 cyg', 天钩增七: '7 cep', 离瑜三: '5 psa', 车府增四: 'g cyg', 人一: '2 peg', 虚宿一: 'bet aqr', 离瑜增三: '6 psa', 车府四: 'rho cyg', 车府增八: '72 cyg', 代增一: '37 cap', 代二: '38 cap', 天钱增三: '8 psa', 天钱增四: '7 psa', 车府七: '74 cyg', 垒壁阵二: 'eps cap', 危宿增一: '3 peg', 天垒城一: 'ksi aqr', 人增三: '5 peg', 天钩增十: '9 cep', 危宿增二: '4 peg', 螣蛇七: 'hip 106886', 司命一: '24 aqr', 司禄二: 'd aqr', 司禄增二: 'd aqr', 垒壁阵三: 'gam cap', 车府增五: '75 cyg', 蛇尾三: 'nu. oct', 哭增一: '42 cap', 车府增七: '76 cyg', 代增二: '41 cap', 螣蛇四: 'pi.1 cyg', 司命二: '26 aqr', 危宿增三: '7 peg', 车府增六: '77 cyg', 垒壁阵一: 'kap cap', 哭增二: '44 cap', 造父四: 'mu. cep', 哭增三: '45 cap', 臼一: 'mu.1 cyg', 危宿三: 'eps peg', 人四: '9 peg', 臼二: 'kap peg', 天钱三: 'iot psa', 天垒城二: 'c cap', 造父五: 'nu. cep', 造父增五: 'nu. cep', 人三: '12 peg', 天垒城三: '47 cap', 天垒城四: 'lam cap', 天垒城五: '50 cap', 螣蛇三: 'pi.2 cyg', 垒壁阵四: 'del cap', 司禄一: '11 peg', 司禄增一: '11 peg', 造父增四: '12 cep', 天钱二: 'tet psa', 臼增一: '14 peg', 人增四: '13 peg', 臼增二: '15 peg', 臼增三: '16 peg', 哭一: 'mu. cap', 败臼一: 'gam gru', 螣蛇八: '13 cep', 危宿增十三: '17 peg', 危宿增十一: '17 peg', 少卫增二: '16 cep', 天钱增二: '11 psa', 危宿增七: '18 peg', 天钱增一: 'eta psa', 危宿增四: '28 aqr', 危宿增十: '20 peg', 危宿增八: '19 peg', 造父增一: '14 cep', 羽林军一: '29 aqr', 泣增一: '30 aqr', 盖屋一: 'omi aqr', 危宿增九: '21 peg', 天钩六: 'ksi cep', 天钩增十三: '18 cep', 造父增三: '15 cep', 天钱一: '13 psa', 盖屋二: '32 aqr', 天钩增十二: '20 cep', 天钩增十七: '20 cep', 天钩增十八: '19 cep', 天钩增十一: '19 cep', 杵三: '23 peg', 危宿增六: 'nu. peg', 危宿一: 'alf aqr', 败臼二: 'lam gru', 垒壁阵五: 'iot aqr', 臼三: 'iot peg', 臼增四: '25 peg', 鹤一: 'alf gru', 天钱四: 'mu. psa', 羽林军二: '35 aqr', 泣增二: '36 aqr', 少卫增三: '24 cep', 天钱五: 'tau psa', 危宿二: 'tet peg', 少卫增四: '80 dra', 臼增五: '28 peg', 哭增四: '37 aqr', 哭二: 'e aqr', 造父二: 'zet cep', 造父三: 'lam cep', 羽林军三: '41 aqr', 羽林军六: 'lam psa', 螣蛇九: 'eps cep', 鹤十二: 'mu.1 gru', 鹤增一: 'mu.2 gru', 泣二: 'tet aqr', 虚梁一: '44 aqr', 蛇尾二: 'psi oct', 天钩增十四: '25 cep', 鸟喙一: 'alf tuc', 羽林军十八: '45 aqr', 泣一: 'rho aqr', 危宿增五: '30 peg', 车府三: '2 lac', 臼四: '32 peg', 土公吏一: '31 peg', 羽林军四: '47 aqr', 坟墓二: 'gam aqr', 羽林军五: '49 aqr', 螣蛇十: 'bet lac', 离宫增一: '33 peg', 虚梁二: '51 aqr', 羽林军十七: '50 aqr', 螣蛇二: '4 lac', 坟墓四: 'pi. aqr', 羽林军十五: 'f aqr', 坟墓增一: '34 peg', 垒壁阵增一: '54 aqr', 天钩七: '26 cep', 鸟喙二: 'del tuc', 坟墓增二: '35 peg', 鹤十: 'nu. gru', 坟墓一: 'zet1 aqr', 土公吏二: '36 peg', 造父一: 'del cep', 鹤增二: 'del1 gru', 车府增十九: '5 lac', 鹤十一: 'del2 gru', 少卫增七: 'rho cep', 坟墓增三: '37 peg', 羽林军十六: '56 aqr', 车府增九: '6 lac', 垒壁阵六: 'sig aqr', 螣蛇一: 'alf lac', 败臼增一: 'bet psa', 羽林军十九: '58 aqr', 离宫增二: '39 peg', 坟墓增四: '60 aqr', 羽林军十一: 'ups aqr', 坟墓三: 'eta aqr', 少卫增六: '31 cep', 少卫增五: '31 cep', 羽林军十四: '61 aqr', 车府增十: '8 lac', 螣蛇十五: '9 lac', 虚梁三: 'kap aqr', 天钩增十六: '30 cep', 离宫增三: '40 peg', 车府增十一: '10 lac', 羽林军廿: '64 aqr', 离宫增四: '41 peg', 车府二: '11 lac', 羽林军八: 'eps psa', 雷电一: 'zet peg', 车府增十二: '12 lac', 离宫三: 'omi peg', 败臼四: '19 psa', 鹤二: 'bet gru', 离宫四: 'eta peg', 羽林军廿一: '65 aqr', 垒壁阵增二: '67 aqr', 鹤九: 'rho gru', 羽林军十三: 'g1 aqr', 车府增十三: '13 lac', 离宫增五: '45 peg', 羽林军十: '20 psa a', 鹤四: 'eta gru', 离宫一: 'lam peg', 雷电二: 'ksi peg', 勾陈增一: 'hip 112519', 羽林军十二: 'g2 aqr', 羽林军廿五: 'tau1 aqr', 羽林军廿二: '70 aqr', 鹤三: 'eps gru', 羽林军廿四: 'tau aqr', 天钩八: 'iot cep', 离宫二: 'mu. peg', 车府增十四: '14 lac', 羽林军九: '21 psa', 车府一: '15 lac', 雷电三: 'sig peg', 败臼三: 'gam psa', 垒壁阵七: 'lam aqr', 羽林军廿三: '74 aqr', 垒壁阵增三: '78 aqr', 羽林军廿六: 'del aqr', 羽林军廿七: '77 aqr', 雷电增二: 'rho peg', 天纲: 'del psa', 车府增十五: '16 lac', 室宿增一: '51 peg', 北落师门: 'alf psa', 雷电增一: '52 peg', 霹雳增二: '2 psc', 霹雳增一: '3 psc', 鹤六: 'zet gru', 车府增廿: 'omi and', 车府增十六: 'omi and', 车府增十七: '2 and', 室宿二: 'bet peg', 霹雳一: 'bet psc', 螣蛇十六: '3 and', 室宿一: 'alf peg', 羽林军四二: 'h aqr', 羽林军四一: '85 aqr', 螣蛇增十三: '1 cas', 羽林军卅: 'c1 aqr', 鹤八: 'tet gru', 雷电四: '55 peg', 室宿增二: '56 peg', 羽林军四十: '87 aqr', 螣蛇增四: '4 and', 螣蛇增二: '5 and', 紫微左垣七: 'pi. cep', 霹雳增三: 'a psc', 羽林军廿八: 'c2 aqr', 雷电增三: '57 peg', 螣蛇增十六: '2 cas', 螣蛇增十五: '2 cas', 羽林军廿九: 'c3 aqr', 雷电增五: '58 peg', 鹤七: 'iot gru', 车府增十八: '6 and', 雷电增四: '59 peg', 室宿增三: '60 peg', 螣蛇十七: '7 and', 垒壁阵八: 'phi aqr', 室宿增四: '61 peg', 羽林军卅九: 'psi1 aqr', 羽林军四三: 'chi aqr', 霹雳二: 'gam psc', 鹤五: 'gam tuc', 螣蛇十八: '8 and', 羽林军卅八: 'psi2 aqr', 螣蛇增七: '9 and', 天钩九: 'omi cep', 羽林军卅七: 'psi3 aqr', 羽林军卅六: '94 aqr', 螣蛇增三: '11 and', 螣蛇增十七: 'hip 115171', 螣蛇增六: '10 and', 霹雳增四: 'b psc', 离宫五: 'tau peg', 室宿增五: '63 peg', 螣蛇增八: '12 and', 室宿增六: '64 peg', 羽林军卅五: '97 aqr', 离宫增六: '65 peg', 羽林军卅四: 'b1 aqr', 雷电五: '66 peg', 螣蛇增十四: '4 cas', 室宿增七: '67 peg', 离宫六: 'ups peg', 羽林军卅三: 'b2 aqr', 云雨一: 'kap psc', 螣蛇增五: '13 and', 云雨增四: '9 psc', 离宫增八: '69 peg', 霹雳三: 'tet psc', 雷电六: '70 peg', 云雨增一: '11 psc', 云雨二: '12 psc', 螣蛇十四: 'ar cas', 螣蛇增九: '14 and', 羽林军卅二: '100 aqr', 云雨增三: '13 psc', 火鸟一: 'bet scl', 羽林军卅一: 'b3 aqr', 离宫增七: '71 peg', 壁宿增二: '72 peg', 云雨增二: '14 psc', 螣蛇增十: '15 and', 壁宿增一: '73 peg', 火鸟二: 'iot phe', 云雨增五: '15 psc', 云雨增六: '16 psc', 螣蛇十九: 'lam and', 雷电增七: '75 peg', 螣蛇廿二: 'iot and', 螣蛇增十二: '18 and', 少卫增八: 'gam cep', 羽林军四四: 'ome1 aqr', 霹雳四: 'iot psc', 螣蛇廿一: 'kap and', '𫓧钺一': 'a1 aqr', '𫓧钺增三': 'a2 aqr', '𫓧钺增一': 'a2 aqr', 云雨四: 'lam psc', 羽林军四五: 'ome2 aqr', 雷电增八: '76 peg', 霹雳增五: '77 peg', 壁宿增三: '78 peg', '𫓧钺二': 'i1 aqr', '𫓧钺增二': 'i2 aqr', 螣蛇廿: 'psi and', 云雨增七: '19 psc', 螣蛇十三: 'tau cas', 垒壁阵增四: '20 psc', 王良增一: '6 cas', 云雨三: '21 psc', 云雨增十: '21 psc', 壁宿增四: '79 peg', 霹雳增七: '80 peg', '𫓧钺三': 'i3 aqr', 云雨增八: '22 psc', 壁宿增八: '23 psc', 壁宿增九: 'phi peg', 霹雳增六: '82 peg', 壁宿增七: '83 peg', 垒壁阵增五: '24 psc', 云雨增九: '25 psc', 螣蛇十二: 'rho cas', 霹雳增八: '26 psc', 鸟喙三: 'hip 118092', 鸟喙增一: 'eta tuc', 壁宿增六: 'psi peg', 八魁三: '1 cet', 垒壁阵九: '27 psc', 螣蛇十一: 'sig cas', 霹雳五: 'ome psc', 鸟喙七: 'eps tuc', '仙女座 α': 'alf and', '仙女座 22': '22 and', '仙女座 β': 'bet and', '仙女座 γ1': 'gam1 and', '仙女座 γ2': 'gam2 and', '仙女座 δ': 'del and', '仙女座 ε': 'eps and', '仙女座 ζ': 'zet and', '仙女座 η': 'eta and', '仙女座 θ': 'tet and', '仙女座 ι': 'iot and', '仙女座 κ': 'kap and', '仙女座 λ': 'lam and', '仙女座 μ': 'mu. and', '仙女座 ν': 'nu. and', '仙女座 ξ': 'ksi and', '仙女座 ο': 'omi and', '仙女座 π': 'pi. and', '仙女座 ρ': 'rho and', '仙女座 σ': 'sig and', '仙女座 τ': 'tau and', '仙女座 υ': 'ups and', '仙女座 φ': 'phi and', '仙女座 χ': 'chi and', '仙女座 ψ': 'psi and', '仙女座 ω': 'ome and', '仙女座 b': 'b and', '仙女座 c': 'c and', '仙女座 A': 'a and', '仙女座 1': '1 and', '仙女座 2': '2 and', '仙女座 3': '3 and', '仙女座 4': '4 and', '仙女座 5': '5 and', '仙女座 6': '6 and', '仙女座 7': '7 and', '仙女座 8': '8 and', '仙女座 9': '9 and', '仙女座 10': '10 and', '仙女座 11': '11 and', '仙女座 12': '12 and', '仙女座 13': '13 and', '仙女座 14': '14 and', '仙女座 15': '15 and', '仙女座 16': '16 and', '仙女座 17': '17 and', '仙女座 18': '18 and', '仙女座 19': '19 and', '仙女座 20': '20 and', '仙女座 21': '21 and', '仙女座 23': '23 and', '仙女座 24': '24 and', '仙女座 25': '25 and', '仙女座 26': '26 and', '仙女座 27': '27 and', '仙女座 28': '28 and', '仙女座 29': '29 and', '仙女座 30': '30 and', '仙女座 31': '31 and', '仙女座 32': '32 and', '仙女座 34': '34 and', '仙女座 35': '35 and', '仙女座 36': '36 and', '仙女座 37': '37 and', '仙女座 38': '38 and', '仙女座 39': '39 and', '仙女座 41': '41 and', '仙女座 42': '42 and', '仙女座 43': '43 and', '仙女座 44': '44 and', '仙女座 45': '45 and', '仙女座 46': '46 and', '仙女座 47': '47 and', '仙女座 48': '48 and', '仙女座 49': '49 and', '仙女座 50': '50 and', '仙女座 51': '51 and', '仙女座 52': '52 and', '仙女座 53': '53 and', '仙女座 55': '55 and', '仙女座 56': '56 and', '仙女座 57': '57 and', '仙女座 58': '58 and', '仙女座 59': '59 and', '仙女座 60': '60 and', '仙女座 61': '61 and', '仙女座 62': '62 and', '仙女座 63': '63 and', '仙女座 64': '64 and', '仙女座 65': '65 and', '仙女座 66': '66 and', '唧筒座 α': 'alf ant', '唧筒座 δ': 'del ant', '唧筒座 ε': 'eps ant', '唧筒座 ζ1': 'zet1 ant', '唧筒座 ζ2': 'zet2 ant', '唧筒座 η': 'eta ant', '唧筒座 θ': 'tet ant', '唧筒座 ι': 'iot ant', '天燕座 α': 'alf aps', '天燕座 β': 'bet aps', '天燕座 γ': 'gam aps', '天燕座 δ1': 'del1 aps', '天燕座 δ2': 'del2 aps', '天燕座 ε': 'eps aps', '天燕座 ζ': 'zet aps', '天燕座 η': 'eta aps', '天燕座 θ': 'tet aps', '天燕座 ι': 'iot aps', '天燕座 κ1': 'kap1 aps', '天燕座 κ2': 'kap2 aps', '宝瓶座 α': 'alf aqr', '宝瓶座 β': 'bet aqr', '宝瓶座 γ': 'gam aqr', '宝瓶座 δ': 'del aqr', '宝瓶座 ε': 'eps aqr', '宝瓶座 ζ1': 'zet1 aqr', '宝瓶座 ζ2': 'zet2 aqr', '宝瓶座 η': 'eta aqr', '宝瓶座 θ': 'tet aqr', '宝瓶座 ι': 'iot aqr', '宝瓶座 κ': 'kap aqr', '宝瓶座 λ': 'lam aqr', '宝瓶座 μ': 'mu. aqr', '宝瓶座 ν': 'nu. aqr', '宝瓶座 ξ': 'ksi aqr', '宝瓶座 ο': 'omi aqr', '宝瓶座 π': 'pi. aqr', '宝瓶座 ρ': 'rho aqr', '宝瓶座 σ': 'sig aqr', '宝瓶座 τ': 'tau aqr', '宝瓶座 τ1': 'tau1 aqr', '宝瓶座 τ2': 'tau2 aqr', '宝瓶座 υ': 'ups aqr', '宝瓶座 φ': 'phi aqr', '宝瓶座 χ': 'chi aqr', '宝瓶座 ψ1': 'psi1 aqr', '宝瓶座 ψ2': 'psi2 aqr', '宝瓶座 ψ3': 'psi3 aqr', '宝瓶座 ω1': 'ome1 aqr', '宝瓶座 ω2': 'ome2 aqr', '宝瓶座 b1': 'b1 aqr', '宝瓶座 b2': 'b2 aqr', '宝瓶座 b3': 'b3 aqr', '宝瓶座 c1': 'c1 aqr', '宝瓶座 c2': 'c2 aqr', '宝瓶座 c3': 'c3 aqr', '宝瓶座 d': 'd aqr', '宝瓶座 e': 'e aqr', '宝瓶座 f': 'f aqr', '宝瓶座 g1': 'g1 aqr', '宝瓶座 g2': 'g2 aqr', '宝瓶座 h': 'h aqr', '宝瓶座 i1': 'i1 aqr', '宝瓶座 i2': 'i2 aqr', '宝瓶座 i3': 'i3 aqr', '宝瓶座 k': 'k aqr', '宝瓶座 A1': 'a1 aqr', '宝瓶座 A2': 'a2 aqr', '宝瓶座 1': '1 aqr', '宝瓶座 2': '2 aqr', '宝瓶座 3': '3 aqr', '宝瓶座 4': '4 aqr', '宝瓶座 5': '5 aqr', '宝瓶座 6': '6 aqr', '宝瓶座 7': '7 aqr', '宝瓶座 8': '8 aqr', '宝瓶座 9': '9 aqr', '宝瓶座 10': '10 aqr', '宝瓶座 11': '11 aqr', '宝瓶座 12': '12 aqr', '宝瓶座 13': '13 aqr', '宝瓶座 14': '14 aqr', '宝瓶座 15': '15 aqr', '宝瓶座 16': '16 aqr', '宝瓶座 17': '17 aqr', '宝瓶座 18': '18 aqr', '宝瓶座 19': '19 aqr', '宝瓶座 20': '20 aqr', '宝瓶座 21': '21 aqr', '宝瓶座 22': '22 aqr', '宝瓶座 23': '23 aqr', '宝瓶座 24': '24 aqr', '宝瓶座 25': '25 aqr', '宝瓶座 26': '26 aqr', '宝瓶座 28': '28 aqr', '宝瓶座 29': '29 aqr', '宝瓶座 30': '30 aqr', '宝瓶座 31': '31 aqr', '宝瓶座 32': '32 aqr', '宝瓶座 33': '33 aqr', '宝瓶座 34': '34 aqr', '宝瓶座 35': '35 aqr', '宝瓶座 36': '36 aqr', '宝瓶座 37': '37 aqr', '宝瓶座 38': '38 aqr', '宝瓶座 39': '39 aqr', '宝瓶座 40': '40 aqr', '宝瓶座 41': '41 aqr', '宝瓶座 42': '42 aqr', '宝瓶座 43': '43 aqr', '宝瓶座 44': '44 aqr', '宝瓶座 45': '45 aqr', '宝瓶座 46': '46 aqr', '宝瓶座 47': '47 aqr', '宝瓶座 48': '48 aqr', '宝瓶座 49': '49 aqr', '宝瓶座 50': '50 aqr', '宝瓶座 51': '51 aqr', '宝瓶座 52': '52 aqr', '宝瓶座 53': '53 aqr', '宝瓶座 54': '54 aqr', '宝瓶座 55': '55 aqr', '宝瓶座 56': '56 aqr', '宝瓶座 57': '57 aqr', '宝瓶座 58': '58 aqr', '宝瓶座 59': '59 aqr', '宝瓶座 60': '60 aqr', '宝瓶座 61': '61 aqr', '宝瓶座 62': '62 aqr', '宝瓶座 63': '63 aqr', '宝瓶座 64': '64 aqr', '宝瓶座 65': '65 aqr', '宝瓶座 66': '66 aqr', '宝瓶座 67': '67 aqr', '宝瓶座 68': '68 aqr', '宝瓶座 69': '69 aqr', '宝瓶座 70': '70 aqr', '宝瓶座 71': '71 aqr', '宝瓶座 72': '72 aqr', '宝瓶座 73': '73 aqr', '宝瓶座 74': '74 aqr', '宝瓶座 75': '75 aqr', '宝瓶座 76': '76 aqr', '宝瓶座 77': '77 aqr', '宝瓶座 78': '78 aqr', '宝瓶座 81': '81 aqr', '宝瓶座 82': '82 aqr', '宝瓶座 83': '83 aqr', '宝瓶座 84': '84 aqr', '宝瓶座 85': '85 aqr', '宝瓶座 86': '86 aqr', '宝瓶座 87': '87 aqr', '宝瓶座 88': '88 aqr', '宝瓶座 89': '89 aqr', '宝瓶座 90': '90 aqr', '宝瓶座 91': '91 aqr', '宝瓶座 92': '92 aqr', '宝瓶座 93': '93 aqr', '宝瓶座 94': '94 aqr', '宝瓶座 95': '95 aqr', '宝瓶座 96': '96 aqr', '宝瓶座 97': '97 aqr', '宝瓶座 98': '98 aqr', '宝瓶座 99': '99 aqr', '宝瓶座 100': '100 aqr', '宝瓶座 101': '101 aqr', '宝瓶座 102': '102 aqr', '宝瓶座 103': '103 aqr', '宝瓶座 104': '104 aqr', '宝瓶座 105': '105 aqr', '宝瓶座 106': '106 aqr', '宝瓶座 107': '107 aqr', '宝瓶座 108': '108 aqr', '天鹰座 α': 'alf aql', '天鹰座 β': 'bet aql', '天鹰座 γ': 'gam aql', '天鹰座 δ': 'del aql', '天鹰座 ε': 'eps aql', '天鹰座 ζ': 'zet aql', '天鹰座 η': 'eta aql', '天鹰座 θ': 'tet aql', '天鹰座 ι': 'iot aql', '天鹰座 κ': 'kap aql', '天鹰座 λ': 'lam aql', '天鹰座 μ': 'mu. aql', '天鹰座 ν': 'nu. aql', '天鹰座 ξ': 'ksi aql', '天鹰座 ο': 'omi aql', '天鹰座 π': 'pi. aql', '天鹰座 ρ': 'rho aql', '天鹰座 σ': 'sig aql', '天鹰座 τ': 'tau aql', '天鹰座 υ': 'ups aql', '天鹰座 φ': 'phi aql', '天鹰座 χ': 'chi aql', '天鹰座 ψ': 'psi aql', '天鹰座 ω1': 'ome1 aql', '天鹰座 ω2': 'ome2 aql', '天鹰座 b': 'b aql', '天鹰座 c': 'c aql', '天鹰座 d': 'd aql', '天鹰座 e': 'e aql', '天鹰座 f': 'f aql', '天鹰座 g': 'g aql', '天鹰座 h': 'h aql', '天鹰座 i': 'i aql', '天鹰座 l': 'l aql', '天鹰座 A': 'a aql', '天鹰座 4': '4 aql', '天鹰座 5': '5 aql', '天鹰座 7': '7 aql', '天鹰座 8': '8 aql', '天鹰座 10': '10 aql', '天鹰座 11': '11 aql', '天鹰座 12': '12 aql', '天鹰座 13': '13 aql', '天鹰座 14': '14 aql', '天鹰座 15': '15 aql', '天鹰座 16': '16 aql', '天鹰座 17': '17 aql', '天鹰座 18': '18 aql', '天鹰座 19': '19 aql', '天鹰座 20': '20 aql', '天鹰座 21': '21 aql', '天鹰座 22': '22 aql', '天鹰座 23': '23 aql', '天鹰座 24': '24 aql', '天鹰座 25': '25 aql', '天鹰座 26': '26 aql', '天鹰座 27': '27 aql', '天鹰座 28': '28 aql', '天鹰座 29': '29 aql', '天鹰座 30': '30 aql', '天鹰座 31': '31 aql', '天鹰座 32': '32 aql', '天鹰座 35': '35 aql', '天鹰座 36': '36 aql', '天鹰座 37': '37 aql', '天鹰座 38': '38 aql', '天鹰座 39': '39 aql', '天鹰座 41': '41 aql', '天鹰座 42': '42 aql', '天鹰座 44': '44 aql', '天鹰座 45': '45 aql', '天鹰座 46': '46 aql', '天鹰座 47': '47 aql', '天鹰座 48': '48 aql', '天鹰座 49': '49 aql', '天鹰座 50': '50 aql', '天鹰座 51': '51 aql', '天鹰座 52': '52 aql', '天鹰座 53': '53 aql', '天鹰座 54': '54 aql', '天鹰座 55': '55 aql', '天鹰座 56': '56 aql', '天鹰座 57': '57 aql', '天鹰座 58': '58 aql', '天鹰座 59': '59 aql', '天鹰座 60': '60 aql', '天鹰座 61': '61 aql', '天鹰座 62': '62 aql', '天鹰座 63': '63 aql', '天鹰座 64': '64 aql', '天鹰座 65': '65 aql', '天鹰座 66': '66 aql', '天鹰座 67': '67 aql', '天鹰座 68': '68 aql', '天鹰座 69': '69 aql', '天鹰座 70': '70 aql', '天鹰座 71': '71 aql', '天坛座 α': 'alf ara', '天坛座 β': 'bet ara', '天坛座 γ': 'gam ara', '天坛座 δ': 'del ara', '天坛座 ε1': 'eps1 ara', '天坛座 ε2': 'eps2 ara', '天坛座 ζ': 'zet ara', '天坛座 η': 'eta ara', '天坛座 θ': 'tet ara', '天坛座 ι': 'iot ara', '天坛座 κ': 'kap ara', '天坛座 λ': 'lam ara', '天坛座 μ': 'mu. ara', '天坛座 υ1': 'ups1 ara', '天坛座 υ2': 'ups2 ara', '天坛座 π': 'pi. ara', '天坛座 σ': 'sig ara', '白羊座 α': 'alf ari', '白羊座 β': 'bet ari', '白羊座 γ1': 'gam1 ari', '白羊座 γ2': 'gam2 ari', '白羊座 δ': 'del ari', '白羊座 ε': 'eps ari', '白羊座 ζ': 'zet ari', '白羊座 η': 'eta ari', '白羊座 θ': 'tet ari', '白羊座 ι': 'iot ari', '白羊座 κ': 'kap ari', '白羊座 λ': 'lam ari', '白羊座 μ': 'mu. ari', '白羊座 ν': 'nu. ari', '白羊座 ξ': 'ksi ari', '白羊座 ο': 'omi ari', '白羊座 π': 'pi. ari', '白羊座 ρ': 'rho ari', '白羊座 ρ1': 'rho1 ari', '白羊座 ρ2': 'rho2 ari', '白羊座 ρ3': 'rho3 ari', '白羊座 σ': 'sig ari', '白羊座 τ1': 'tau1 ari', '白羊座 τ2': 'tau2 ari', '白羊座 c': 'c ari', '白羊座 1': '1 ari', '白羊座 3': '3 ari', '白羊座 4': '4 ari', '白羊座 5': '5 ari', '白羊座 6': '6 ari', '白羊座 7': '7 ari', '白羊座 8': '8 ari', '白羊座 9': '9 ari', '白羊座 10': '10 ari', '白羊座 11': '11 ari', '白羊座 12': '12 ari', '白羊座 13': '13 ari', '白羊座 14': '14 ari', '白羊座 15': '15 ari', '白羊座 16': '16 ari', '白羊座 17': '17 ari', '白羊座 19': '19 ari', '白羊座 20': '20 ari', '白羊座 21': '21 ari', '白羊座 22': '22 ari', '白羊座 23': '23 ari', '白羊座 24': '24 ari', '白羊座 25': '25 ari', '白羊座 26': '26 ari', '白羊座 27': '27 ari', '白羊座 29': '29 ari', '白羊座 30': '30 ari', '白羊座 31': '31 ari', '白羊座 32': '32 ari', '白羊座 33': '33 ari', '白羊座 34': '34 ari', '白羊座 35': '35 ari', '白羊座 36': '36 ari', '白羊座 37': '37 ari', '白羊座 38': '38 ari', '白羊座 39': '39 ari', '白羊座 40': '40 ari', '白羊座 41': '41 ari', '白羊座 42': '42 ari', '白羊座 43': '43 ari', '白羊座 44': '44 ari', '白羊座 45': '45 ari', '白羊座 46': '46 ari', '白羊座 47': '47 ari', '白羊座 48': '48 ari', '白羊座 49': '49 ari', '白羊座 50': '50 ari', '白羊座 51': '51 ari', '白羊座 52': '52 ari', '白羊座 53': '53 ari', '白羊座 54': '54 ari', '白羊座 55': '55 ari', '白羊座 56': '56 ari', '白羊座 57': '57 ari', '白羊座 58': '58 ari', '白羊座 59': '59 ari', '白羊座 60': '60 ari', '白羊座 61': '61 ari', '白羊座 62': '62 ari', '白羊座 63': '63 ari', '白羊座 64': '64 ari', '白羊座 65': '65 ari', '白羊座 66': '66 ari', '御夫座 α': 'alf aur', '御夫座 β': 'bet aur', '御夫座 δ': 'del aur', '御夫座 ε': 'eps aur', '御夫座 ζ': 'zet aur', '御夫座 η': 'eta aur', '御夫座 θ': 'tet aur', '御夫座 ι': 'iot aur', '御夫座 κ': 'kap aur', '御夫座 λ': 'lam aur', '御夫座 μ': 'mu. aur', '御夫座 ν': 'nu. aur', '御夫座 ξ': 'ksi aur', '御夫座 ο': 'omi aur', '御夫座 π': 'pi. aur', '御夫座 ρ': 'rho aur', '御夫座 σ': 'sig aur', '御夫座 τ': 'tau aur', '御夫座 υ': 'ups aur', '御夫座 φ': 'phi aur', '御夫座 χ': 'chi aur', '御夫座 ψ1': 'psi1 aur', '御夫座 ψ2': 'psi2 aur', '御夫座 ψ3': 'psi3 aur', '御夫座 ψ4': 'psi4 aur', '御夫座 ψ5': 'psi5 aur', '御夫座 ψ6': 'psi6 aur', '御夫座 ψ7': 'psi7 aur', '御夫座 ψ8': 'psi8 aur', '御夫座 ψ9': 'psi9 aur', '御夫座 ψ10': 'psi10 aur', '御夫座 ω': 'ome aur', '御夫座 1': '1 aur', '御夫座 2': '2 aur', '御夫座 3': '3 aur', '御夫座 4': '4 aur', '御夫座 5': '5 aur', '御夫座 6': '6 aur', '御夫座 7': '7 aur', '御夫座 8': '8 aur', '御夫座 9': '9 aur', '御夫座 10': '10 aur', '御夫座 11': '11 aur', '御夫座 13': '13 aur', '御夫座 14': '14 aur', '御夫座 15': '15 aur', '御夫座 16': '16 aur', '御夫座 17': '17 aur', '御夫座 18': '18 aur', '御夫座 19': '19 aur', '御夫座 20': '20 aur', '御夫座 21': '21 aur', '御夫座 22': '22 aur', '御夫座 24': '24 aur', '御夫座 25': '25 aur', '御夫座 26': '26 aur', '御夫座 27': '27 aur', '御夫座 28': '28 aur', '御夫座 29': '29 aur', '御夫座 30': '30 aur', '御夫座 31': '31 aur', '御夫座 32': '32 aur', '御夫座 33': '33 aur', '御夫座 34': '34 aur', '御夫座 35': '35 aur', '御夫座 36': '36 aur', '御夫座 37': '37 aur', '御夫座 38': '38 aur', '御夫座 39': '39 aur', '御夫座 40': '40 aur', '御夫座 41': '41 aur', '御夫座 42': '42 aur', '御夫座 43': '43 aur', '御夫座 44': '44 aur', '御夫座 45': '45 aur', '御夫座 46': '46 aur', '御夫座 47': '47 aur', '御夫座 48': '48 aur', '御夫座 49': '49 aur', '御夫座 50': '50 aur', '御夫座 51': '51 aur', '御夫座 52': '52 aur', '御夫座 53': '53 aur', '御夫座 54': '54 aur', '御夫座 55': '55 aur', '御夫座 56': '56 aur', '御夫座 57': '57 aur', '御夫座 58': '58 aur', '御夫座 59': '59 aur', '御夫座 60': '60 aur', '御夫座 61': '61 aur', '御夫座 62': '62 aur', '御夫座 63': '63 aur', '御夫座 64': '64 aur', '御夫座 65': '65 aur', '御夫座 66': '66 aur', '牧夫座 α': 'alf boo', '牧夫座 β': 'bet boo', '牧夫座 γ': 'gam boo', '牧夫座 δ': 'del boo', '牧夫座 ε': 'eps boo', '牧夫座 ζ': 'zet boo', '牧夫座 η': 'eta boo', '牧夫座 θ': 'tet boo', '牧夫座 ι': 'iot boo', '牧夫座 κ1': 'kap1 boo', '牧夫座 κ2': 'kap2 boo', '牧夫座 λ': 'lam boo', '牧夫座 μ1': 'mu.1 boo', '牧夫座 μ2': 'mu.2 boo', '牧夫座 ν1': 'nu.1 boo', '牧夫座 ν2': 'nu.2 boo', '牧夫座 ξ': 'ksi boo', '牧夫座 ο': 'omi boo', '牧夫座 π1': 'pi.1 boo', '牧夫座 π2': 'pi.2 boo', '牧夫座 ρ': 'rho boo', '牧夫座 σ': 'sig boo', '牧夫座 τ': 'tau boo', '牧夫座 υ': 'ups boo', '牧夫座 φ': 'phi boo', '牧夫座 χ': 'chi boo', '牧夫座 ψ': 'psi boo', '牧夫座 ω': 'ome boo', '牧夫座 b': 'b boo', '牧夫座 c': 'c boo', '牧夫座 d': 'd boo', '牧夫座 e': 'e boo', '牧夫座 f': 'f boo', '牧夫座 g': 'g boo', '牧夫座 h': 'h boo', '牧夫座 i': 'i boo', '牧夫座 k': 'k boo', '牧夫座 A': 'a boo', '牧夫座 1': '1 boo', '牧夫座 2': '2 boo', '牧夫座 3': '3 boo', '牧夫座 4': '4 boo', '牧夫座 5': '5 boo', '牧夫座 6': '6 boo', '牧夫座 7': '7 boo', '牧夫座 8': '8 boo', '牧夫座 9': '9 boo', '牧夫座 10': '10 boo', '牧夫座 11': '11 boo', '牧夫座 12': '12 boo', '牧夫座 13': '13 boo', '牧夫座 14': '14 boo', '牧夫座 15': '15 boo', '牧夫座 16': '16 boo', '牧夫座 17': '17 boo', '牧夫座 18': '18 boo', '牧夫座 19': '19 boo', '牧夫座 20': '20 boo', '牧夫座 21': '21 boo', '牧夫座 22': '22 boo', '牧夫座 23': '23 boo', '牧夫座 24': '24 boo', '牧夫座 25': '25 boo', '牧夫座 26': '26 boo', '牧夫座 27': '27 boo', '牧夫座 28': '28 boo', '牧夫座 29': '29 boo', '牧夫座 30': '30 boo', '牧夫座 31': '31 boo', '牧夫座 32': '32 boo', '牧夫座 33': '33 boo', '牧夫座 34': '34 boo', '牧夫座 35': '35 boo', '牧夫座 36': '36 boo', '牧夫座 37': '37 boo', '牧夫座 38': '38 boo', '牧夫座 39': '39 boo', '牧夫座 40': '40 boo', '牧夫座 41': '41 boo', '牧夫座 42': '42 boo', '牧夫座 43': '43 boo', '牧夫座 44': '44 boo', '牧夫座 45': '45 boo', '牧夫座 46': '46 boo', '牧夫座 47': '47 boo', '牧夫座 48': '48 boo', '牧夫座 49': '49 boo', '牧夫座 50': '50 boo', '牧夫座 51': '51 boo', '牧夫座 52': '52 boo', '牧夫座 53': '53 boo', '牧夫座 54': '54 boo', '雕具座 α': 'alf cae', '雕具座 β': 'bet cae', '雕具座 γ1': 'gam1 cae', '雕具座 γ2': 'gam2 cae', '雕具座 δ': 'del cae', '雕具座 ζ': 'zet cae', '雕具座 λ': 'lam cae', '雕具座 ν': 'nu. cae', '鹿豹座 α': 'alf cam', '鹿豹座 β': 'bet cam', '鹿豹座 γ': 'gam cam', '鹿豹座 1': '1 cam', '鹿豹座 2': '2 cam', '鹿豹座 3': '3 cam', '鹿豹座 4': '4 cam', '鹿豹座 5': '5 cam', '鹿豹座 6': '6 cam', '鹿豹座 7': '7 cam', '鹿豹座 8': '8 cam', '鹿豹座 9': '9 cam', '鹿豹座 10': '10 cam', '鹿豹座 11': '11 cam', '鹿豹座 12': '12 cam', '鹿豹座 14': '14 cam', '鹿豹座 15': '15 cam', '鹿豹座 16': '16 cam', '鹿豹座 17': '17 cam', '鹿豹座 18': '18 cam', '鹿豹座 19': '19 cam', '鹿豹座 20': '20 cam', '鹿豹座 21': '21 cam', '鹿豹座 22': '22 cam', '鹿豹座 23': '23 cam', '鹿豹座 24': '24 cam', '鹿豹座 25': '25 cam', '鹿豹座 26': '26 cam', '鹿豹座 28': '28 cam', '鹿豹座 29': '29 cam', '鹿豹座 30': '30 cam', '鹿豹座 31': '31 cam', '鹿豹座 32': '32 cam', '鹿豹座 33': '33 cam', '鹿豹座 34': '34 cam', '鹿豹座 35': '35 cam', '鹿豹座 36': '36 cam', '鹿豹座 37': '37 cam', '鹿豹座 38': '38 cam', '鹿豹座 39': '39 cam', '鹿豹座 40': '40 cam', '鹿豹座 41': '41 cam', '鹿豹座 42': '42 cam', '鹿豹座 43': '43 cam', '鹿豹座 44': '44 cam', '鹿豹座 45': '45 cam', '鹿豹座 46': '46 cam', '鹿豹座 47': '47 cam', '鹿豹座 48': '48 cam', '鹿豹座 49': '49 cam', '鹿豹座 50': '50 cam', '鹿豹座 51': '51 cam', '鹿豹座 52': '52 cam', '鹿豹座 53': '53 cam', '鹿豹座 54': '54 cam', '鹿豹座 55': '55 cam', '鹿豹座 56': '56 cam', '鹿豹座 57': '57 cam', '巨蟹座 α': 'alf cnc', '巨蟹座 β': 'bet cnc', '巨蟹座 γ': 'gam cnc', '巨蟹座 δ': 'del cnc', '巨蟹座 ε': 'eps cnc', '巨蟹座 ζ1': 'zet1 cnc', '巨蟹座 ζ2': 'zet2 cnc', '巨蟹座 η': 'eta cnc', '巨蟹座 θ': 'tet cnc', '巨蟹座 ι': 'iot cnc', '巨蟹座 κ': 'kap cnc', '巨蟹座 λ': 'lam cnc', '巨蟹座 μ': 'mu. cnc', '巨蟹座 μ1': 'mu.1 cnc', '巨蟹座 μ2': 'mu.2 cnc', '巨蟹座 ν': 'nu. cnc', '巨蟹座 ξ': 'ksi cnc', '巨蟹座 ο1': 'omi1 cnc', '巨蟹座 ο2': 'omi2 cnc', '巨蟹座 π': 'pi. cnc', '巨蟹座 π1': 'pi.1 cnc', '巨蟹座 π2': 'pi.2 cnc', '巨蟹座 ρ1': 'rho1 cnc', '巨蟹座 ρ2': 'rho2 cnc', '巨蟹座 σ1': 'sig1 cnc', '巨蟹座 σ2': 'sig2 cnc', '巨蟹座 σ3': 'sig3 cnc', '巨蟹座 τ': 'tau cnc', '巨蟹座 υ1': 'ups1 cnc', '巨蟹座 υ2': 'ups2 cnc', '巨蟹座 φ1': 'phi1 cnc', '巨蟹座 φ2': 'phi2 cnc', '巨蟹座 χ': 'chi cnc', '巨蟹座 ψ': 'psi cnc', '巨蟹座 ψ1': 'psi1 cnc', '巨蟹座 ψ2': 'psi2 cnc', '巨蟹座 ω1': 'ome1 cnc', '巨蟹座 ω2': 'ome2 cnc', '巨蟹座 b': 'b cnc', '巨蟹座 c': 'c cnc', '巨蟹座 d1': 'd1 cnc', '巨蟹座 d2': 'd2 cnc', '巨蟹座 A1': 'a1 cnc', '巨蟹座 A2': 'a2 cnc', '巨蟹座 1': '1 cnc', '巨蟹座 2': '2 cnc', '巨蟹座 3': '3 cnc', '巨蟹座 4': '4 cnc', '巨蟹座 5': '5 cnc', '巨蟹座 7': '7 cnc', '巨蟹座 8': '8 cnc', '巨蟹座 9': '9 cnc', '巨蟹座 10': '10 cnc', '巨蟹座 11': '11 cnc', '巨蟹座 12': '12 cnc', '巨蟹座 13': '13 cnc', '巨蟹座 14': '14 cnc', '巨蟹座 15': '15 cnc', '巨蟹座 16': '16 cnc', '巨蟹座 17': '17 cnc', '巨蟹座 18': '18 cnc', '巨蟹座 19': '19 cnc', '巨蟹座 20': '20 cnc', '巨蟹座 21': '21 cnc', '巨蟹座 22': '22 cnc', '巨蟹座 23': '23 cnc', '巨蟹座 24': '24 cnc', '巨蟹座 25': '25 cnc', '巨蟹座 27': '27 cnc', '巨蟹座 28': '28 cnc', '巨蟹座 29': '29 cnc', '巨蟹座 30': '30 cnc', '巨蟹座 31': '31 cnc', '巨蟹座 32': '32 cnc', '巨蟹座 33': '33 cnc', '巨蟹座 34': '34 cnc', '巨蟹座 35': '35 cnc', '巨蟹座 36': '36 cnc', '巨蟹座 37': '37 cnc', '巨蟹座 38': '38 cnc', '巨蟹座 39': '39 cnc', '巨蟹座 40': '40 cnc', '巨蟹座 41': '41 cnc', '巨蟹座 42': '42 cnc', '巨蟹座 43': '43 cnc', '巨蟹座 44': '44 cnc', '巨蟹座 45': '45 cnc', '巨蟹座 46': '46 cnc', '巨蟹座 47': '47 cnc', '巨蟹座 48': '48 cnc', '巨蟹座 49': '49 cnc', '巨蟹座 50': '50 cnc', '巨蟹座 51': '51 cnc', '巨蟹座 52': '52 cnc', '巨蟹座 53': '53 cnc', '巨蟹座 54': '54 cnc', '巨蟹座 55': '55 cnc', '巨蟹座 57': '57 cnc', '巨蟹座 58': '58 cnc', '巨蟹座 59': '59 cnc', '巨蟹座 60': '60 cnc', '巨蟹座 61': '61 cnc', '巨蟹座 62': '62 cnc', '巨蟹座 63': '63 cnc', '巨蟹座 64': '64 cnc', '巨蟹座 65': '65 cnc', '巨蟹座 66': '66 cnc', '巨蟹座 67': '67 cnc', '巨蟹座 68': '68 cnc', '巨蟹座 69': '69 cnc', '巨蟹座 70': '70 cnc', '巨蟹座 71': '71 cnc', '巨蟹座 72': '72 cnc', '巨蟹座 75': '75 cnc', '巨蟹座 76': '76 cnc', '巨蟹座 77': '77 cnc', '巨蟹座 78': '78 cnc', '巨蟹座 79': '79 cnc', '巨蟹座 80': '80 cnc', '巨蟹座 81': '81 cnc', '巨蟹座 82': '82 cnc', '巨蟹座 83': '83 cnc', '猎犬座 α1': 'alf1 cvn', '猎犬座 α2': 'alf2 cvn', '猎犬座 β': 'bet cvn', '猎犬座 1': '1 cvn', '猎犬座 2': '2 cvn', '猎犬座 3': '3 cvn', '猎犬座 4': '4 cvn', '猎犬座 5': '5 cvn', '猎犬座 6': '6 cvn', '猎犬座 7': '7 cvn', '猎犬座 8': '8 cvn', '猎犬座 9': '9 cvn', '猎犬座 10': '10 cvn', '猎犬座 11': '11 cvn', '猎犬座 12': '12 cvn', '猎犬座 14': '14 cvn', '猎犬座 15': '15 cvn', '猎犬座 16': '16 cvn', '猎犬座 17': '17 cvn', '猎犬座 18': '18 cvn', '猎犬座 19': '19 cvn', '猎犬座 20': '20 cvn', '猎犬座 21': '21 cvn', '猎犬座 23': '23 cvn', '猎犬座 24': '24 cvn', '猎犬座 25': '25 cvn', '大犬座 α': 'alf cma', '大犬座 β': 'bet cma', '大犬座 γ': 'gam cma', '大犬座 δ': 'del cma', '大犬座 ε': 'eps cma', '大犬座 ζ': 'zet cma', '大犬座 η': 'eta cma', '大犬座 θ': 'tet cma', '大犬座 ι': 'iot cma', '大犬座 κ': 'kap cma', '大犬座 λ': 'lam cma', '大犬座 μ': 'mu. cma', '大犬座 ν1': 'nu.1 cma', '大犬座 ν2': 'nu.2 cma', '大犬座 ν3': 'nu.3 cma', '大犬座 ξ1': 'ksi1 cma', '大犬座 ξ2': 'ksi2 cma', '大犬座 ο1': 'omi1 cma', '大犬座 ο2': 'omi2 cma', '大犬座 π': 'pi. cma', '大犬座 σ': 'sig cma', '大犬座 τ': 'tau cma', '大犬座 ω': 'ome cma', '大犬座 1': '1 cma', '大犬座 2': '2 cma', '大犬座 4': '4 cma', '大犬座 5': '5 cma', '大犬座 6': '6 cma', '大犬座 7': '7 cma', '大犬座 8': '8 cma', '大犬座 9': '9 cma', '大犬座 10': '10 cma', '大犬座 11': '11 cma', '大犬座 12': '12 cma', '大犬座 13': '13 cma', '大犬座 14': '14 cma', '大犬座 15': '15 cma', '大犬座 16': '16 cma', '大犬座 17': '17 cma', '大犬座 18': '18 cma', '大犬座 19': '19 cma', '大犬座 20': '20 cma', '大犬座 21': '21 cma', '大犬座 22': '22 cma', '大犬座 23': '23 cma', '大犬座 24': '24 cma', '大犬座 25': '25 cma', '大犬座 26': '26 cma', '大犬座 27': '27 cma', '大犬座 28': '28 cma', '大犬座 29': '29 cma', '大犬座 30': '30 cma', '大犬座 31': '31 cma', '大犬座 145': '145 cma', '小犬座 α': 'alf cmi', '小犬座 β': 'bet cmi', '小犬座 γ': 'gam cmi', '小犬座 δ1': 'del1 cmi', '小犬座 δ2': 'del2 cmi', '小犬座 δ3': 'del3 cmi', '小犬座 ε': 'eps cmi', '小犬座 ζ': 'zet cmi', '小犬座 η': 'eta cmi', '小犬座 1': '1 cmi', '小犬座 2': '2 cmi', '小犬座 3': '3 cmi', '小犬座 4': '4 cmi', '小犬座 5': '5 cmi', '小犬座 6': '6 cmi', '小犬座 7': '7 cmi', '小犬座 8': '8 cmi', '小犬座 9': '9 cmi', '小犬座 10': '10 cmi', '小犬座 11': '11 cmi', '小犬座 13': '13 cmi', '小犬座 14': '14 cmi', '摩羯座 α1': 'alf1 cap', '摩羯座 α2': 'alf2 cap', '摩羯座 β': 'bet cap', '摩羯座 β1': 'bet1 cap', '摩羯座 β2': 'bet2 cap', '摩羯座 γ': 'gam cap', '摩羯座 δ': 'del cap', '摩羯座 ε': 'eps cap', '摩羯座 ζ': 'zet cap', '摩羯座 η': 'eta cap', '摩羯座 θ': 'tet cap', '摩羯座 ι': 'iot cap', '摩羯座 κ': 'kap cap', '摩羯座 λ': 'lam cap', '摩羯座 μ': 'mu. cap', '摩羯座 ν': 'nu. cap', '摩羯座 ξ': 'ksi cap', '摩羯座 ξ1': 'ksi1 cap', '摩羯座 ξ2': 'ksi2 cap', '摩羯座 ο': 'omi cap', '摩羯座 π': 'pi. cap', '摩羯座 ρ': 'rho cap', '摩羯座 σ': 'sig cap', '摩羯座 τ': 'tau cap', '摩羯座 τ1': 'tau1 cap', '摩羯座 τ2': 'tau2 cap', '摩羯座 υ': 'ups cap', '摩羯座 φ': 'phi cap', '摩羯座 χ': 'chi cap', '摩羯座 ψ': 'psi cap', '摩羯座 ω': 'ome cap', '摩羯座 b': 'b cap', '摩羯座 c': 'c cap', '摩羯座 A': 'a cap', '摩羯座 1': '1 cap', '摩羯座 2': '2 cap', '摩羯座 3': '3 cap', '摩羯座 4': '4 cap', '摩羯座 5': '5 cap', '摩羯座 6': '6 cap', '摩羯座 7': '7 cap', '摩羯座 8': '8 cap', '摩羯座 9': '9 cap', '摩羯座 10': '10 cap', '摩羯座 11': '11 cap', '摩羯座 12': '12 cap', '摩羯座 13': '13 cap', '摩羯座 14': '14 cap', '摩羯座 15': '15 cap', '摩羯座 16': '16 cap', '摩羯座 17': '17 cap', '摩羯座 18': '18 cap', '摩羯座 19': '19 cap', '摩羯座 20': '20 cap', '摩羯座 21': '21 cap', '摩羯座 22': '22 cap', '摩羯座 23': '23 cap', '摩羯座 24': '24 cap', '摩羯座 25': '25 cap', '摩羯座 26': '26 cap', '摩羯座 27': '27 cap', '摩羯座 28': '28 cap', '摩羯座 29': '29 cap', '摩羯座 30': '30 cap', '摩羯座 31': '31 cap', '摩羯座 32': '32 cap', '摩羯座 33': '33 cap', '摩羯座 34': '34 cap', '摩羯座 35': '35 cap', '摩羯座 36': '36 cap', '摩羯座 37': '37 cap', '摩羯座 38': '38 cap', '摩羯座 39': '39 cap', '摩羯座 40': '40 cap', '摩羯座 41': '41 cap', '摩羯座 42': '42 cap', '摩羯座 43': '43 cap', '摩羯座 44': '44 cap', '摩羯座 45': '45 cap', '摩羯座 46': '46 cap', '摩羯座 47': '47 cap', '摩羯座 48': '48 cap', '摩羯座 49': '49 cap', '摩羯座 50': '50 cap', '摩羯座 51': '51 cap', '船底座 α': 'alf car', '船底座 β': 'bet car', '船底座 ε': 'eps car', '船底座 θ': 'tet car', '船底座 ι': 'iot car', '船底座 υ': 'ups car', '船底座 χ': 'chi car', '船底座 ω': 'ome car', '船底座 a': 'a car', '船底座 b1': 'b1 car', '船底座 b2': 'b2 car', '船底座 c': 'c car', '船底座 d': 'd car', '船底座 e1': 'e1 car', '船底座 e2': 'e2 car', '船底座 f': 'f car', '船底座 g': 'g car', '船底座 h': 'h car', '船底座 i': 'i car', '船底座 k': 'k car', '船底座 l': 'l car', '船底座 m': 'm car', '船底座 p': 'p car', '船底座 q': 'q car', '船底座 r': 'r car', '船底座 s': 's car', '船底座 t1': 't1 car', '船底座 t2': 't2 car', '船底座 u': 'u car', '船底座 w': 'w car', '船底座 x': 'x car', '船底座 y': 'y car', '船底座 z': 'z car', '船底座 z1': 'z1 car', '船底座 z2': 'z2 car', '船底座 A': 'a car', '船底座 B': 'b car', '船底座 C': 'c car', '船底座 D': 'd car', '船底座 E': 'e car', '船底座 G': 'g car', '船底座 H': 'h car', '船底座 I': 'i car', '船底座 K': 'k car', '船底座 L': 'l car', '船底座 M': 'm car', '船底座 N': 'n car', '船底座 O': 'o car', '船底座 P': 'p car', '船底座 Q': 'q car', '仙后座 α': 'alf cas', '仙后座 β': 'bet cas', '仙后座 γ': 'gam cas', '仙后座 δ': 'del cas', '仙后座 ε': 'eps cas', '仙后座 ζ': 'zet cas', '仙后座 η': 'eta cas', '仙后座 θ': 'tet cas', '仙后座 ι': 'iot cas', '仙后座 κ': 'kap cas', '仙后座 λ': 'lam cas', '仙后座 μ': 'mu. cas', '仙后座 ν': 'nu. cas', '仙后座 ξ': 'ksi cas', '仙后座 ο': 'omi cas', '仙后座 π': 'pi. cas', '仙后座 ρ': 'rho cas', '仙后座 σ': 'sig cas', '仙后座 τ': 'tau cas', '仙后座 υ1': 'ups1 cas', '仙后座 υ2': 'ups2 cas', '仙后座 φ': 'phi cas', '仙后座 χ': 'chi cas', '仙后座 ψ': 'psi cas', '仙后座 ω': 'ome cas', '仙后座 A': 'a cas', '仙后座 1': '1 cas', '仙后座 2': '2 cas', '仙后座 4': '4 cas', '仙后座 5': '5 cas', '仙后座 6': '6 cas', '仙后座 7': '7 cas', '仙后座 8': '8 cas', '仙后座 9': '9 cas', '仙后座 10': '10 cas', '仙后座 11': '11 cas', '仙后座 12': '12 cas', '仙后座 13': '13 cas', '仙后座 14': '14 cas', '仙后座 15': '15 cas', '仙后座 16': '16 cas', '仙后座 17': '17 cas', '仙后座 18': '18 cas', '仙后座 19': '19 cas', '仙后座 20': '20 cas', '仙后座 21': '21 cas', '仙后座 22': '22 cas', '仙后座 23': '23 cas', '仙后座 24': '24 cas', '仙后座 25': '25 cas', '仙后座 26': '26 cas', '仙后座 27': '27 cas', '仙后座 28': '28 cas', '仙后座 30': '30 cas', '仙后座 31': '31 cas', '仙后座 32': '32 cas', '仙后座 33': '33 cas', '仙后座 34': '34 cas', '仙后座 35': '35 cas', '仙后座 36': '36 cas', '仙后座 37': '37 cas', '仙后座 38': '38 cas', '仙后座 39': '39 cas', '仙后座 40': '40 cas', '仙后座 42': '42 cas', '仙后座 43': '43 cas', '仙后座 44': '44 cas', '仙后座 45': '45 cas', '仙后座 46': '46 cas', '仙后座 47': '47 cas', '仙后座 48': '48 cas', '仙后座 49': '49 cas', '仙后座 50': '50 cas', '仙后座 51': '51 cas', '仙后座 52': '52 cas', '仙后座 53': '53 cas', '仙后座 54': '54 cas', '仙后座 55': '55 cas', '半人马座 α': 'alf cen', '半人马座 α1': 'alf1 cen', '半人马座 α2': 'alf2 cen', '半人马座 β': 'bet cen', '半人马座 γ': 'gam cen', '半人马座 δ': 'del cen', '半人马座 ε': 'eps cen', '半人马座 ζ': 'zet cen', '半人马座 η': 'eta cen', '半人马座 θ': 'tet cen', '半人马座 ι': 'iot cen', '半人马座 κ': 'kap cen', '半人马座 λ': 'lam cen', '半人马座 μ': 'mu. cen', '半人马座 ν': 'nu. cen', '半人马座 ξ1': 'ksi1 cen', '半人马座 ξ2': 'ksi2 cen', '半人马座 ο1': 'omi1 cen', '半人马座 ο2': 'omi2 cen', '半人马座 π': 'pi. cen', '半人马座 ρ': 'rho cen', '半人马座 σ': 'sig cen', '半人马座 τ': 'tau cen', '半人马座 υ1': 'ups1 cen', '半人马座 υ2': 'ups2 cen', '半人马座 φ': 'phi cen', '半人马座 χ': 'chi cen', '半人马座 ψ': 'psi cen', '半人马座 a': 'a cen', '半人马座 b': 'b cen', '半人马座 c1': 'c1 cen', '半人马座 c2': 'c2 cen', '半人马座 d': 'd cen', '半人马座 e': 'e cen', '半人马座 f': 'f cen', '半人马座 g': 'g cen', '半人马座 h': 'h cen', '半人马座 i': 'i cen', '半人马座 j': 'j cen', '半人马座 k': 'k cen', '半人马座 l': 'l cen', '半人马座 m': 'm cen', '半人马座 n': 'n cen', '半人马座 p': 'p cen', '半人马座 r': 'r cen', '半人马座 u': 'u cen', '半人马座 v': 'v cen', '半人马座 w': 'w cen', '半人马座 x1': 'x1 cen', '半人马座 x2': 'x2 cen', '半人马座 y': 'y cen', '半人马座 z': 'z cen', '半人马座 A': 'a cen', '半人马座 B': 'b cen', '半人马座 C1': 'c1 cen', '半人马座 C2': 'c2 cen', '半人马座 C3': 'c3 cen', '半人马座 D': 'd cen', '半人马座 E': 'e cen', '半人马座 F': 'f cen', '半人马座 G': 'g cen', '半人马座 H': 'h cen', '半人马座 J': 'j cen', '半人马座 K': 'k cen', '半人马座 M': 'm cen', '半人马座 N': 'n cen', '半人马座 Q': 'q cen', '半人马座 1': '1 cen', '半人马座 2': '2 cen', '半人马座 3': '3 cen', '半人马座 4': '4 cen', '半人马座 5': '5 cen', '仙王座 α': 'alf cep', '仙王座 β': 'bet cep', '仙王座 γ': 'gam cep', '仙王座 δ': 'del cep', '仙王座 ε': 'eps cep', '仙王座 ζ': 'zet cep', '仙王座 η': 'eta cep', '仙王座 θ': 'tet cep', '仙王座 ι': 'iot cep', '仙王座 κ': 'kap cep', '仙王座 λ': 'lam cep', '仙王座 μ': 'mu. cep', '仙王座 ν': 'nu. cep', '仙王座 ξ': 'ksi cep', '仙王座 ο': 'omi cep', '仙王座 π': 'pi. cep', '仙王座 ρ': 'rho cep', '仙王座 ρ1': 'rho1 cep', '仙王座 ρ2': 'rho2 cep', '仙王座 1': '1 cep', '仙王座 2': '2 cep', '仙王座 3': '3 cep', '仙王座 4': '4 cep', '仙王座 5': '5 cep', '仙王座 6': '6 cep', '仙王座 7': '7 cep', '仙王座 8': '8 cep', '仙王座 9': '9 cep', '仙王座 10': '10 cep', '仙王座 11': '11 cep', '仙王座 12': '12 cep', '仙王座 13': '13 cep', '仙王座 14': '14 cep', '仙王座 15': '15 cep', '仙王座 16': '16 cep', '仙王座 17': '17 cep', '仙王座 18': '18 cep', '仙王座 19': '19 cep', '仙王座 20': '20 cep', '仙王座 21': '21 cep', '仙王座 22': '22 cep', '仙王座 23': '23 cep', '仙王座 24': '24 cep', '仙王座 25': '25 cep', '仙王座 26': '26 cep', '仙王座 27': '27 cep', '仙王座 28': '28 cep', '仙王座 29': '29 cep', '仙王座 30': '30 cep', '仙王座 31': '31 cep', '仙王座 32': '32 cep', '仙王座 33': '33 cep', '仙王座 34': '34 cep', '仙王座 35': '35 cep', '鲸鱼座 α': 'alf cet', '鲸鱼座 β': 'bet cet', '鲸鱼座 γ': 'gam cet', '鲸鱼座 δ': 'del cet', '鲸鱼座 ε': 'eps cet', '鲸鱼座 ζ': 'zet cet', '鲸鱼座 η': 'eta cet', '鲸鱼座 θ': 'tet cet', '鲸鱼座 ι': 'iot cet', '鲸鱼座 κ1': 'kap1 cet', '鲸鱼座 κ2': 'kap2 cet', '鲸鱼座 λ': 'lam cet', '鲸鱼座 μ': 'mu. cet', '鲸鱼座 ν': 'nu. cet', '鲸鱼座 ξ1': 'ksi1 cet', '鲸鱼座 ξ2': 'ksi2 cet', '鲸鱼座 ο': 'omi cet', '鲸鱼座 π': 'pi. cet', '鲸鱼座 ρ': 'rho cet', '鲸鱼座 σ': 'sig cet', '鲸鱼座 τ': 'tau cet', '鲸鱼座 υ': 'ups cet', '鲸鱼座 φ1': 'phi1 cet', '鲸鱼座 φ2': 'phi2 cet', '鲸鱼座 φ3': 'phi3 cet', '鲸鱼座 φ4': 'phi4 cet', '鲸鱼座 χ': 'chi cet', '鲸鱼座 ψ': 'psi cet', '鲸鱼座 1': '1 cet', '鲸鱼座 2': '2 cet', '鲸鱼座 3': '3 cet', '鲸鱼座 4': '4 cet', '鲸鱼座 5': '5 cet', '鲸鱼座 6': '6 cet', '鲸鱼座 7': '7 cet', '鲸鱼座 8': '8 cet', '鲸鱼座 9': '9 cet', '鲸鱼座 10': '10 cet', '鲸鱼座 11': '11 cet', '鲸鱼座 12': '12 cet', '鲸鱼座 13': '13 cet', '鲸鱼座 14': '14 cet', '鲸鱼座 15': '15 cet', '鲸鱼座 16': '16 cet', '鲸鱼座 17': '17 cet', '鲸鱼座 18': '18 cet', '鲸鱼座 19': '19 cet', '鲸鱼座 20': '20 cet', '鲸鱼座 21': '21 cet', '鲸鱼座 22': '22 cet', '鲸鱼座 23': '23 cet', '鲸鱼座 25': '25 cet', '鲸鱼座 26': '26 cet', '鲸鱼座 27': '27 cet', '鲸鱼座 28': '28 cet', '鲸鱼座 29': '29 cet', '鲸鱼座 30': '30 cet', '鲸鱼座 31': '31 cet', '鲸鱼座 32': '32 cet', '鲸鱼座 33': '33 cet', '鲸鱼座 34': '34 cet', '鲸鱼座 35': '35 cet', '鲸鱼座 36': '36 cet', '鲸鱼座 37': '37 cet', '鲸鱼座 38': '38 cet', '鲸鱼座 39': '39 cet', '鲸鱼座 40': '40 cet', '鲸鱼座 41': '41 cet', '鲸鱼座 42': '42 cet', '鲸鱼座 43': '43 cet', '鲸鱼座 44': '44 cet', '鲸鱼座 45': '45 cet', '鲸鱼座 46': '46 cet', '鲸鱼座 47': '47 cet', '鲸鱼座 48': '48 cet', '鲸鱼座 49': '49 cet', '鲸鱼座 50': '50 cet', '鲸鱼座 52': '52 cet', '鲸鱼座 53': '53 cet', '鲸鱼座 54': '54 cet', '鲸鱼座 55': '55 cet', '鲸鱼座 56': '56 cet', '鲸鱼座 57': '57 cet', '鲸鱼座 58': '58 cet', '鲸鱼座 59': '59 cet', '鲸鱼座 60': '60 cet', '鲸鱼座 61': '61 cet', '鲸鱼座 62': '62 cet', '鲸鱼座 63': '63 cet', '鲸鱼座 64': '64 cet', '鲸鱼座 65': '65 cet', '鲸鱼座 66': '66 cet', '鲸鱼座 67': '67 cet', '鲸鱼座 68': '68 cet', '鲸鱼座 69': '69 cet', '鲸鱼座 70': '70 cet', '鲸鱼座 71': '71 cet', '鲸鱼座 72': '72 cet', '鲸鱼座 73': '73 cet', '鲸鱼座 75': '75 cet', '鲸鱼座 76': '76 cet', '鲸鱼座 77': '77 cet', '鲸鱼座 78': '78 cet', '鲸鱼座 79': '79 cet', '鲸鱼座 80': '80 cet', '鲸鱼座 81': '81 cet', '鲸鱼座 82': '82 cet', '鲸鱼座 83': '83 cet', '鲸鱼座 84': '84 cet', '鲸鱼座 85': '85 cet', '鲸鱼座 86': '86 cet', '鲸鱼座 87': '87 cet', '鲸鱼座 88': '88 cet', '鲸鱼座 89': '89 cet', '鲸鱼座 91': '91 cet', '鲸鱼座 92': '92 cet', '鲸鱼座 93': '93 cet', '鲸鱼座 94': '94 cet', '鲸鱼座 95': '95 cet', '鲸鱼座 96': '96 cet', '鲸鱼座 97': '97 cet', '蝘蜓座 α': 'alf cha', '蝘蜓座 β': 'bet cha', '蝘蜓座 γ': 'gam cha', '蝘蜓座 δ1': 'del1 cha', '蝘蜓座 δ2': 'del2 cha', '蝘蜓座 ε': 'eps cha', '蝘蜓座 ζ': 'zet cha', '蝘蜓座 η': 'eta cha', '蝘蜓座 θ': 'tet cha', '蝘蜓座 ι': 'iot cha', '蝘蜓座 κ': 'kap cha', '蝘蜓座 λ': 'lam cha', '蝘蜓座 μ': 'mu. cha', '蝘蜓座 μ1': 'mu.1 cha', '蝘蜓座 μ2': 'mu.2 cha', '蝘蜓座 ν': 'nu. cha', '蝘蜓座 π': 'pi. cha', '圆规座 α': 'alf cir', '圆规座 β': 'bet cir', '圆规座 γ': 'gam cir', '圆规座 δ': 'del cir', '圆规座 ε': 'eps cir', '圆规座 ζ': 'zet cir', '圆规座 η': 'eta cir', '圆规座 θ': 'tet cir', '天鸽座 α': 'alf col', '天鸽座 β': 'bet col', '天鸽座 γ': 'gam col', '天鸽座 δ': 'del col', '大犬座 3': '3 cma', '天鸽座 ε': 'eps col', '天鸽座 η': 'eta col', '天鸽座 θ': 'tet col', '天鸽座 κ': 'kap col', '天鸽座 λ': 'lam col', '天鸽座 μ': 'mu. col', '天鸽座 ν1': 'nu.1 col', '天鸽座 ν2': 'nu.2 col', '天鸽座 ξ': 'ksi col', '天鸽座 ο': 'omi col', '天鸽座 π1': 'pi.1 col', '天鸽座 π2': 'pi.2 col', '天鸽座 σ': 'sig col', '天鸽座 3': '3 col', '天鸽座 72': '72 col', '后发座 α': 'alf com', '后发座 β': 'bet com', '后发座 γ': 'gam com', '后发座 1': '1 com', '后发座 2': '2 com', '后发座 3': '3 com', '后发座 4': '4 com', '后发座 5': '5 com', '后发座 6': '6 com', '后发座 7': '7 com', '后发座 8': '8 com', '后发座 9': '9 com', '后发座 10': '10 com', '后发座 11': '11 com', '后发座 12': '12 com', '后发座 13': '13 com', '后发座 14': '14 com', '后发座 15': '15 com', '后发座 16': '16 com', '后发座 17': '17 com', '后发座 18': '18 com', '后发座 20': '20 com', '后发座 21': '21 com', '后发座 22': '22 com', '后发座 23': '23 com', '后发座 24': '24 com', '后发座 25': '25 com', '后发座 26': '26 com', '后发座 27': '27 com', '后发座 28': '28 com', '后发座 29': '29 com', '后发座 30': '30 com', '后发座 31': '31 com', '后发座 32': '32 com', '后发座 33': '33 com', '后发座 35': '35 com', '后发座 36': '36 com', '后发座 37': '37 com', '猎犬座 13': '13 cvn', '后发座 38': '38 com', '后发座 39': '39 com', '后发座 40': '40 com', '后发座 41': '41 com', '后发座 42': '42 com', '后发座 43': '43 com', '南冕座 α': 'alf cra', '南冕座 β': 'bet cra', '南冕座 γ': 'gam cra', '南冕座 δ': 'del cra', '南冕座 ε': 'eps cra', '南冕座 ζ': 'zet cra', '南冕座 η1': 'eta1 cra', '南冕座 η2': 'eta2 cra', '南冕座 θ': 'tet cra', '南冕座 κ1': 'kap1 cra', '南冕座 κ2': 'kap2 cra', '南冕座 λ': 'lam cra', '南冕座 μ': 'mu. cra', '北冕座 α': 'alf crb', '北冕座 β': 'bet crb', '北冕座 γ': 'gam crb', '北冕座 δ': 'del crb', '北冕座 ε': 'eps crb', '北冕座 ζ1': 'zet1 crb', '北冕座 ζ2': 'zet2 crb', '北冕座 η': 'eta crb', '北冕座 θ': 'tet crb', '北冕座 ι': 'iot crb', '北冕座 κ': 'kap crb', '北冕座 λ': 'lam crb', '北冕座 μ': 'mu. crb', '北冕座 ν1': 'nu.1 crb', '北冕座 ν2': 'nu.2 crb', '北冕座 ξ': 'ksi crb', '北冕座 ο': 'omi crb', '北冕座 π': 'pi. crb', '北冕座 ρ': 'rho crb', '北冕座 σ': 'sig crb', '北冕座 τ': 'tau crb', '北冕座 υ': 'ups crb', '北冕座 1': '1 crb', '北冕座 2': '2 crb', '北冕座 3': '3 crb', '北冕座 4': '4 crb', '北冕座 5': '5 crb', '北冕座 6': '6 crb', '北冕座 7': '7 crb', '北冕座 8': '8 crb', '北冕座 9': '9 crb', '北冕座 10': '10 crb', '北冕座 11': '11 crb', '北冕座 12': '12 crb', '北冕座 13': '13 crb', '北冕座 14': '14 crb', '北冕座 15': '15 crb', '北冕座 16': '16 crb', '北冕座 17': '17 crb', '北冕座 18': '18 crb', '北冕座 19': '19 crb', '北冕座 20': '20 crb', '北冕座 21': '21 crb', '乌鸦座 α': 'alf crv', '乌鸦座 β': 'bet crv', '乌鸦座 γ': 'gam crv', '乌鸦座 δ': 'del crv', '乌鸦座 ε': 'eps crv', '乌鸦座 ζ': 'zet crv', '乌鸦座 η': 'eta crv', '乌鸦座 1': '1 crv', '乌鸦座 2': '2 crv', '乌鸦座 3': '3 crv', '乌鸦座 4': '4 crv', '乌鸦座 5': '5 crv', '乌鸦座 6': '6 crv', '乌鸦座 7': '7 crv', '乌鸦座 8': '8 crv', '乌鸦座 9': '9 crv', '巨爵座 α': 'alf crt', '巨爵座 β': 'bet crt', '巨爵座 γ': 'gam crt', '巨爵座 δ': 'del crt', '巨爵座 ε': 'eps crt', '巨爵座 ζ': 'zet crt', '巨爵座 η': 'eta crt', '巨爵座 θ': 'tet crt', '巨爵座 ι': 'iot crt', '巨爵座 κ': 'kap crt', '巨爵座 λ': 'lam crt', '巨爵座 ψ': 'psi crt', '巨爵座 5': '5 crt', '巨爵座 7': '7 crt', '巨爵座 8': '8 crt', '巨爵座 10': '10 crt', '巨爵座 11': '11 crt', '巨爵座 12': '12 crt', '巨爵座 13': '13 crt', '巨爵座 14': '14 crt', '巨爵座 15': '15 crt', '巨爵座 16': '16 crt', '长蛇座 N': 'n hya', '巨爵座 17': '17 crt', '巨爵座 18': '18 crt', '巨爵座 20': '20 crt', '巨爵座 21': '21 crt', '巨爵座 22': '22 crt', '巨爵座 23': '23 crt', '巨爵座 24': '24 crt', '巨爵座 26': '26 crt', '巨爵座 27': '27 crt', '巨爵座 29': '29 crt', '巨爵座 30': '30 crt', '巨爵座 31': '31 crt', '南十字座 α1': 'alf1 cru', '南十字座 α2': 'alf2 cru', '南十字座 β': 'bet cru', '南十字座 γ': 'gam cru', '南十字座 δ': 'del cru', '南十字座 ε': 'eps cru', '南十字座 ζ': 'zet cru', '南十字座 η': 'eta cru', '南十字座 θ1': 'tet1 cru', '南十字座 θ2': 'tet2 cru', '南十字座 ι': 'iot cru', '南十字座 κ': 'kap cru', '南十字座 λ': 'lam cru', '南十字座 μ1': 'mu.1 cru', '南十字座 μ2': 'mu.2 cru', '南十字座 35': '35 cru', '南十字座 39': '39 cru', '天鹅座 α': 'alf cyg', '天鹅座 β1': 'bet1 cyg', '天鹅座 β2': 'bet2 cyg', '天鹅座 γ': 'gam cyg', '天鹅座 δ': 'del cyg', '天鹅座 ε': 'eps cyg', '天鹅座 ζ': 'zet cyg', '天鹅座 η': 'eta cyg', '天鹅座 θ': 'tet cyg', '天鹅座 ι': 'iot cyg', '天鹅座 ι1': 'iot1 cyg', '天鹅座 ι2': 'iot2 cyg', '天鹅座 κ': 'kap cyg', '天鹅座 λ': 'lam cyg', '天鹅座 μ1': 'mu.1 cyg', '天鹅座 μ2': 'mu.2 cyg', '天鹅座 ν': 'nu. cyg', '天鹅座 ξ': 'ksi cyg', '天鹅座 ο1': 'omi1 cyg', '天鹅座 ο2': 'omi2 cyg', '天鹅座 π1': 'pi.1 cyg', '天鹅座 π2': 'pi.2 cyg', '天鹅座 ρ': 'rho cyg', '天鹅座 σ': 'sig cyg', '天鹅座 τ': 'tau cyg', '天鹅座 υ': 'ups cyg', '天鹅座 φ': 'phi cyg', '天鹅座 χ': 'chi cyg', '天鹅座 ψ': 'psi cyg', '天鹅座 ω1': 'ome1 cyg', '天鹅座 ω2': 'ome2 cyg', '天鹅座 b1': 'b1 cyg', '天鹅座 b2': 'b2 cyg', '天鹅座 b3': 'b3 cyg', '天鹅座 c': 'c cyg', '天鹅座 d': 'd cyg', '天鹅座 e': 'e cyg', '天鹅座 f1': 'f1 cyg', '天鹅座 f2': 'f2 cyg', '天鹅座 g': 'g cyg', '天鹅座 A': 'a cyg', '天鹅座 P': 'p cyg', '天鹅座 1': '1 cyg', '天鹅座 2': '2 cyg', '天鹅座 3': '3 cyg', '天鹅座 4': '4 cyg', '天鹅座 6': '6 cyg', '天鹅座 7': '7 cyg', '天鹅座 8': '8 cyg', '天鹅座 9': '9 cyg', '天鹅座 10': '10 cyg', '天鹅座 11': '11 cyg', '天鹅座 12': '12 cyg', '天鹅座 13': '13 cyg', '天鹅座 14': '14 cyg', '天鹅座 15': '15 cyg', '天鹅座 16': '16 cyg', '天鹅座 17': '17 cyg', '天鹅座 18': '18 cyg', '天鹅座 19': '19 cyg', '天鹅座 20': '20 cyg', '天鹅座 21': '21 cyg', '天鹅座 22': '22 cyg', '天鹅座 23': '23 cyg', '天鹅座 24': '24 cyg', '天鹅座 25': '25 cyg', '天鹅座 26': '26 cyg', '天鹅座 27': '27 cyg', '天鹅座 28': '28 cyg', '天鹅座 29': '29 cyg', '天鹅座 30': '30 cyg', '天鹅座 31': '31 cyg', '天鹅座 32': '32 cyg', '天鹅座 33': '33 cyg', '天鹅座 34': '34 cyg', '天鹅座 35': '35 cyg', '天鹅座 36': '36 cyg', '天鹅座 37': '37 cyg', '天鹅座 39': '39 cyg', '天鹅座 40': '40 cyg', '天鹅座 41': '41 cyg', '天鹅座 42': '42 cyg', '天鹅座 43': '43 cyg', '天鹅座 44': '44 cyg', '天鹅座 45': '45 cyg', '天鹅座 46': '46 cyg', '天鹅座 47': '47 cyg', '天鹅座 48': '48 cyg', '天鹅座 49': '49 cyg', '天鹅座 50': '50 cyg', '天鹅座 51': '51 cyg', '天鹅座 52': '52 cyg', '天鹅座 53': '53 cyg', '天鹅座 54': '54 cyg', '天鹅座 55': '55 cyg', '天鹅座 56': '56 cyg', '天鹅座 57': '57 cyg', '天鹅座 58': '58 cyg', '天鹅座 59': '59 cyg', '天鹅座 60': '60 cyg', '天鹅座 61': '61 cyg', '天鹅座 62': '62 cyg', '天鹅座 63': '63 cyg', '天鹅座 64': '64 cyg', '天鹅座 65': '65 cyg', '天鹅座 66': '66 cyg', '天鹅座 67': '67 cyg', '天鹅座 68': '68 cyg', '天鹅座 69': '69 cyg', '天鹅座 70': '70 cyg', '天鹅座 71': '71 cyg', '天鹅座 72': '72 cyg', '天鹅座 73': '73 cyg', '天鹅座 74': '74 cyg', '天鹅座 75': '75 cyg', '天鹅座 76': '76 cyg', '天鹅座 77': '77 cyg', '天鹅座 78': '78 cyg', '天鹅座 79': '79 cyg', '天鹅座 80': '80 cyg', '天鹅座 81': '81 cyg', '天鹅座 T': 't cyg', '海豚座 α': 'alf del', '海豚座 β': 'bet del', '海豚座 γ1': 'gam1 del', '海豚座 γ2': 'gam2 del', '海豚座 δ': 'del del', '海豚座 ε': 'eps del', '海豚座 ζ': 'zet del', '海豚座 η': 'eta del', '海豚座 θ': 'tet del', '海豚座 ι': 'iot del', '海豚座 κ': 'kap del', '海豚座 1': '1 del', '海豚座 2': '2 del', '海豚座 3': '3 del', '海豚座 4': '4 del', '海豚座 5': '5 del', '海豚座 6': '6 del', '海豚座 7': '7 del', '海豚座 8': '8 del', '海豚座 9': '9 del', '海豚座 10': '10 del', '海豚座 11': '11 del', '海豚座 12': '12 del', '海豚座 13': '13 del', '海豚座 14': '14 del', '海豚座 15': '15 del', '海豚座 16': '16 del', '海豚座 17': '17 del', '海豚座 18': '18 del', '剑鱼座 α': 'alf dor', '剑鱼座 β': 'bet dor', '剑鱼座 γ': 'gam dor', '剑鱼座 δ': 'del dor', '剑鱼座 ε': 'eps dor', '剑鱼座 ζ': 'zet dor', '剑鱼座 η1': 'eta1 dor', '剑鱼座 η2': 'eta2 dor', '剑鱼座 θ': 'tet dor', '剑鱼座 κ': 'kap dor', '剑鱼座 λ': 'lam dor', '剑鱼座 ν': 'nu. dor', '剑鱼座 π1': 'pi.1 dor', '剑鱼座 π2': 'pi.2 dor', '天龙座 α': 'alf dra', '天龙座 β': 'bet dra', '天龙座 γ': 'gam dra', '天龙座 δ': 'del dra', '天龙座 ε': 'eps dra', '天龙座 ζ': 'zet dra', '天龙座 η': 'eta dra', '天龙座 θ': 'tet dra', '天龙座 ι': 'iot dra', '天龙座 κ': 'kap dra', '天龙座 λ': 'lam dra', '天龙座 μ': 'mu. dra', '天龙座 ν1': 'nu.1 dra', '天龙座 ν2': 'nu.2 dra', '天龙座 ξ': 'ksi dra', '天龙座 ο': 'omi dra', '天龙座 π': 'pi. dra', '天龙座 ρ': 'rho dra', '天龙座 σ': 'sig dra', '天龙座 τ': 'tau dra', '天龙座 υ': 'ups dra', '天龙座 φ': 'phi dra', '天龙座 χ': 'chi dra', '天龙座 ψ1': 'psi1 dra', '天龙座 ψ2': 'psi2 dra', '天龙座 ω': 'ome dra', '天龙座 b': 'b dra', '天龙座 c': 'c dra', '天龙座 d': 'd dra', '天龙座 e': 'e dra', '天龙座 f': 'f dra', '天龙座 g': 'g dra', '天龙座 h': 'h dra', '天龙座 i': 'i dra', '天龙座 A': 'a dra', '天龙座 1': '1 dra', '天龙座 2': '2 dra', '天龙座 3': '3 dra', '天龙座 4': '4 dra', '天龙座 5': '5 dra', '天龙座 6': '6 dra', '天龙座 7': '7 dra', '天龙座 8': '8 dra', '天龙座 9': '9 dra', '天龙座 10': '10 dra', '天龙座 11': '11 dra', '天龙座 12': '12 dra', '天龙座 13': '13 dra', '天龙座 14': '14 dra', '天龙座 15': '15 dra', '天龙座 16': '16 dra', '天龙座 17': '17 dra', '天龙座 18': '18 dra', '天龙座 19': '19 dra', '天龙座 20': '20 dra', '天龙座 21': '21 dra', '天龙座 22': '22 dra', '天龙座 23': '23 dra', '天龙座 24': '24 dra', '天龙座 25': '25 dra', '天龙座 26': '26 dra', '天龙座 27': '27 dra', '天龙座 28': '28 dra', '天龙座 29': '29 dra', '天龙座 30': '30 dra', '天龙座 31': '31 dra', '天龙座 32': '32 dra', '天龙座 33': '33 dra', '天龙座 34': '34 dra', '天龙座 35': '35 dra', '天龙座 36': '36 dra', '天龙座 37': '37 dra', '天龙座 38': '38 dra', '天龙座 39': '39 dra', '天龙座 40': '40 dra', '天龙座 41': '41 dra', '天龙座 42': '42 dra', '天龙座 43': '43 dra', '天龙座 44': '44 dra', '天龙座 45': '45 dra', '天龙座 46': '46 dra', '天龙座 47': '47 dra', '天龙座 48': '48 dra', '天龙座 49': '49 dra', '天龙座 50': '50 dra', '天龙座 51': '51 dra', '天龙座 52': '52 dra', '天龙座 53': '53 dra', '天龙座 54': '54 dra', '天龙座 55': '55 dra', '天龙座 57': '57 dra', '天龙座 58': '58 dra', '天龙座 59': '59 dra', '天龙座 60': '60 dra', '天龙座 61': '61 dra', '天龙座 63': '63 dra', '天龙座 64': '64 dra', '天龙座 65': '65 dra', '天龙座 66': '66 dra', '天龙座 67': '67 dra', '天龙座 68': '68 dra', '天龙座 69': '69 dra', '天龙座 71': '71 dra', '天龙座 72': '72 dra', '天龙座 73': '73 dra', '天龙座 74': '74 dra', '天龙座 75': '75 dra', '天龙座 76': '76 dra', '天龙座 77': '77 dra', '天龙座 78': '78 dra', '天龙座 79': '79 dra', '天龙座 80': '80 dra', '小马座 α': 'alf equ', '小马座 β': 'bet equ', '小马座 γ': 'gam equ', '小马座 δ': 'del equ', '小马座 ε': 'eps equ', '小马座 λ': 'lam equ', '小马座 1': '1 equ', '小马座 2': '2 equ', '小马座 3': '3 equ', '小马座 4': '4 equ', '小马座 5': '5 equ', '小马座 6': '6 equ', '小马座 7': '7 equ', '小马座 8': '8 equ', '小马座 9': '9 equ', '小马座 10': '10 equ', '波江座 α': 'alf eri', '波江座 β': 'bet eri', '波江座 γ': 'gam eri', '波江座 δ': 'del eri', '波江座 ε': 'eps eri', '波江座 ζ': 'zet eri', '波江座 η': 'eta eri', '波江座 θ1': 'tet1 eri', '波江座 θ2': 'tet2 eri', '波江座 ι': 'iot eri', '波江座 κ': 'kap eri', '波江座 λ': 'lam eri', '波江座 μ': 'mu. eri', '波江座 ν': 'nu. eri', '波江座 ξ': 'ksi eri', '波江座 ο1': 'omi1 eri', '波江座 ο2': 'omi2 eri', '波江座 π': 'pi. eri', '波江座 ρ1': 'rho1 eri', '波江座 ρ2': 'rho2 eri', '波江座 ρ3': 'rho3 eri', '波江座 τ1': 'tau1 eri', '波江座 τ2': 'tau2 eri', '波江座 τ3': 'tau3 eri', '波江座 τ4': 'tau4 eri', '波江座 τ5': 'tau5 eri', '波江座 τ6': 'tau6 eri', '波江座 τ7': 'tau7 eri', '波江座 τ8': 'tau8 eri', '波江座 τ9': 'tau9 eri', '波江座 υ1': 'ups1 eri', '波江座 υ2': 'ups2 eri', '波江座 υ3': 'ups3 eri', '波江座 υ4': 'ups4 eri', '波江座 φ': 'phi eri', '波江座 χ': 'chi eri', '波江座 ψ': 'psi eri', '波江座 ω': 'ome eri', '波江座 b': 'b eri', '波江座 c': 'c eri', '波江座 d': 'd eri', '波江座 e': 'e eri', '波江座 f': 'f eri', '波江座 g': 'g eri', '波江座 h': 'h eri', '波江座 i': 'i eri', '波江座 l': 'l eri', '波江座 p': 'p eri', '波江座 q1': 'q1 eri', '波江座 q2': 'q2 eri', '波江座 r': 'r eri', '波江座 s': 's eri', '波江座 u': 'u eri', '波江座 v': 'v eri', '波江座 w': 'w eri', '波江座 y': 'y eri', '波江座 z': 'z eri', '波江座 A': 'a eri', '波江座 1': '1 eri', '鲸鱼座 90': '90 cet', '波江座 2': '2 eri', '波江座 3': '3 eri', '波江座 4': '4 eri', '波江座 5': '5 eri', '波江座 6': '6 eri', '波江座 7': '7 eri', '波江座 8': '8 eri', '波江座 9': '9 eri', '波江座 10': '10 eri', '波江座 11': '11 eri', '波江座 13': '13 eri', '波江座 14': '14 eri', '波江座 15': '15 eri', '波江座 16': '16 eri', '波江座 17': '17 eri', '波江座 18': '18 eri', '波江座 19': '19 eri', '波江座 20': '20 eri', '波江座 21': '21 eri', '波江座 22': '22 eri', '波江座 23': '23 eri', '波江座 24': '24 eri', '波江座 25': '25 eri', '波江座 26': '26 eri', '波江座 27': '27 eri', '波江座 28': '28 eri', '波江座 29': '29 eri', '波江座 30': '30 eri', '波江座 32': '32 eri', '波江座 33': '33 eri', '波江座 34': '34 eri', '波江座 35': '35 eri', '波江座 36': '36 eri', '波江座 37': '37 eri', '波江座 38': '38 eri', '波江座 39': '39 eri', '波江座 40': '40 eri', '波江座 41': '41 eri', '波江座 42': '42 eri', '波江座 43': '43 eri', '波江座 44': '44 eri', '波江座 45': '45 eri', '波江座 46': '46 eri', '波江座 47': '47 eri', '波江座 48': '48 eri', '波江座 49': '49 eri', '波江座 50': '50 eri', '波江座 51': '51 eri', '波江座 52': '52 eri', '波江座 53': '53 eri', '波江座 54': '54 eri', '波江座 55': '55 eri', '波江座 56': '56 eri', '波江座 57': '57 eri', '波江座 58': '58 eri', '波江座 59': '59 eri', '波江座 60': '60 eri', '波江座 61': '61 eri', '波江座 62': '62 eri', '波江座 63': '63 eri', '波江座 64': '64 eri', '波江座 65': '65 eri', '波江座 66': '66 eri', '波江座 67': '67 eri', '波江座 68': '68 eri', '波江座 69': '69 eri', '波江座 82': '82 eri', '天炉座 α': 'alf for', '波江座 12': '12 eri', '天炉座 β': 'bet for', '天炉座 γ1': 'gam1 for', '天炉座 γ2': 'gam2 for', '天炉座 δ': 'del for', '天炉座 ε': 'eps for', '天炉座 ζ': 'zet for', '天炉座 η1': 'eta1 for', '天炉座 η2': 'eta2 for', '天炉座 η3': 'eta3 for', '天炉座 ι1': 'iot1 for', '天炉座 ι2': 'iot2 for', '天炉座 κ': 'kap for', '天炉座 λ1': 'lam1 for', '天炉座 λ2': 'lam2 for', '天炉座 μ': 'mu. for', '天炉座 ν': 'nu. for', '天炉座 π': 'pi. for', '天炉座 ρ': 'rho for', '天炉座 σ': 'sig for', '天炉座 τ': 'tau for', '天炉座 φ': 'phi for', '天炉座 χ1': 'chi1 for', '天炉座 χ2': 'chi2 for', '天炉座 χ3': 'chi3 for', '天炉座 ψ': 'psi for', '天炉座 ω': 'ome for', '双子座 α': 'alf gem', '双子座 β': 'bet gem', '双子座 γ': 'gam gem', '双子座 δ': 'del gem', '双子座 ε': 'eps gem', '双子座 ζ': 'zet gem', '双子座 η': 'eta gem', '双子座 θ': 'tet gem', '双子座 ι': 'iot gem', '双子座 κ': 'kap gem', '双子座 λ': 'lam gem', '双子座 μ': 'mu. gem', '双子座 ν': 'nu. gem', '双子座 ξ': 'ksi gem', '双子座 ο': 'omi gem', '双子座 π': 'pi. gem', '双子座 ρ': 'rho gem', '双子座 σ': 'sig gem', '双子座 τ': 'tau gem', '双子座 υ': 'ups gem', '双子座 φ': 'phi gem', '双子座 χ': 'chi gem', '巨蟹座 6': '6 cnc', '双子座 ω': 'ome gem', '双子座 b': 'b gem', '双子座 c': 'c gem', '双子座 d': 'd gem', '双子座 e': 'e gem', '双子座 f': 'f gem', '双子座 g': 'g gem', '双子座 A': 'a gem', '双子座 1': '1 gem', '双子座 2': '2 gem', '双子座 3': '3 gem', '双子座 4': '4 gem', '双子座 5': '5 gem', '双子座 6': '6 gem', '双子座 7': '7 gem', '双子座 8': '8 gem', '双子座 9': '9 gem', '双子座 10': '10 gem', '双子座 11': '11 gem', '双子座 12': '12 gem', '双子座 13': '13 gem', '双子座 14': '14 gem', '双子座 15': '15 gem', '双子座 16': '16 gem', '双子座 18': '18 gem', '双子座 19': '19 gem', '双子座 20': '20 gem', '双子座 22': '22 gem', '双子座 23': '23 gem', '双子座 24': '24 gem', '双子座 25': '25 gem', '双子座 26': '26 gem', '双子座 27': '27 gem', '双子座 28': '28 gem', '双子座 30': '30 gem', '双子座 31': '31 gem', '双子座 32': '32 gem', '双子座 33': '33 gem', '双子座 34': '34 gem', '双子座 35': '35 gem', '双子座 36': '36 gem', '双子座 37': '37 gem', '双子座 38': '38 gem', '双子座 39': '39 gem', '双子座 40': '40 gem', '双子座 41': '41 gem', '双子座 42': '42 gem', '双子座 43': '43 gem', '双子座 44': '44 gem', '双子座 45': '45 gem', '双子座 46': '46 gem', '双子座 47': '47 gem', '双子座 48': '48 gem', '双子座 49': '49 gem', '双子座 51': '51 gem', '双子座 52': '52 gem', '双子座 53': '53 gem', '双子座 54': '54 gem', '双子座 55': '55 gem', '双子座 56': '56 gem', '双子座 57': '57 gem', '双子座 58': '58 gem', '双子座 59': '59 gem', '双子座 60': '60 gem', '双子座 61': '61 gem', '双子座 62': '62 gem', '双子座 63': '63 gem', '双子座 64': '64 gem', '双子座 65': '65 gem', '双子座 66': '66 gem', '双子座 67': '67 gem', '双子座 68': '68 gem', '双子座 69': '69 gem', '双子座 70': '70 gem', '双子座 71': '71 gem', '双子座 74': '74 gem', '双子座 75': '75 gem', '双子座 76': '76 gem', '双子座 77': '77 gem', '双子座 78': '78 gem', '双子座 79': '79 gem', '双子座 80': '80 gem', '双子座 81': '81 gem', '双子座 82': '82 gem', '双子座 83': '83 gem', '双子座 84': '84 gem', '双子座 85': '85 gem', '双子座 87': '87 gem', '天鹤座 α': 'alf gru', '天鹤座 β': 'bet gru', '天鹤座 γ': 'gam gru', '天鹤座 δ1': 'del1 gru', '天鹤座 δ2': 'del2 gru', '天鹤座 ε': 'eps gru', '天鹤座 ζ': 'zet gru', '天鹤座 η': 'eta gru', '天鹤座 θ': 'tet gru', '天鹤座 ι': 'iot gru', '天鹤座 κ': 'kap gru', '天鹤座 λ': 'lam gru', '天鹤座 μ1': 'mu.1 gru', '天鹤座 μ2': 'mu.2 gru', '天鹤座 ν': 'nu. gru', '天鹤座 ξ': 'ksi gru', '天鹤座 ο': 'omi gru', '天鹤座 π1': 'pi.1 gru', '天鹤座 π2': 'pi.2 gru', '天鹤座 ρ': 'rho gru', '天鹤座 σ1': 'sig1 gru', '天鹤座 σ2': 'sig2 gru', '天鹤座 τ1': 'tau1 gru', '天鹤座 τ2': 'tau2 gru', '天鹤座 τ3': 'tau3 gru', '天鹤座 υ': 'ups gru', '天鹤座 φ': 'phi gru', '武仙座 α1': 'alf1 her', '武仙座 α2': 'alf2 her', '武仙座 β': 'bet her', '武仙座 γ': 'gam her', '武仙座 δ': 'del her', '武仙座 ε': 'eps her', '武仙座 ζ': 'zet her', '武仙座 η': 'eta her', '武仙座 θ': 'tet her', '武仙座 ι': 'iot her', '武仙座 κ': 'kap her', '武仙座 λ': 'lam her', '武仙座 μ': 'mu. her', '武仙座 ν': 'nu. her', '武仙座 ξ': 'ksi her', '武仙座 ο': 'omi her', '武仙座 π': 'pi. her', '武仙座 ρ': 'rho her', '武仙座 σ': 'sig her', '武仙座 τ': 'tau her', '武仙座 υ': 'ups her', '武仙座 φ': 'phi her', '武仙座 χ': 'chi her', '武仙座 ψ2': 'psi2 her', '武仙座 ω': 'ome her', '武仙座 b': 'b her', '武仙座 c': 'c her', '武仙座 d': 'd her', '武仙座 e': 'e her', '武仙座 f': 'f her', '武仙座 g': 'g her', '武仙座 h': 'h her', '武仙座 i': 'i her', '武仙座 k': 'k her', '武仙座 l': 'l her', '武仙座 m': 'm her', '武仙座 n': 'n her', '武仙座 o': 'o her', '武仙座 q': 'q her', '武仙座 r': 'r her', '武仙座 s': 's her', '武仙座 t': 't her', '武仙座 u': 'u her', '武仙座 w': 'w her', '武仙座 x': 'x her', '武仙座 y': 'y her', '武仙座 z': 'z her', '武仙座 A': 'a her', '武仙座 1': '1 her', '武仙座 2': '2 her', '武仙座 3': '3 her', '武仙座 4': '4 her', '武仙座 5': '5 her', '武仙座 6': '6 her', '武仙座 7': '7 her', '武仙座 8': '8 her', '武仙座 9': '9 her', '武仙座 10': '10 her', '武仙座 11': '11 her', '武仙座 12': '12 her', '武仙座 13': '13 her', '武仙座 14': '14 her', '武仙座 15': '15 her', '武仙座 16': '16 her', '武仙座 17': '17 her', '武仙座 18': '18 her', '武仙座 19': '19 her', '武仙座 20': '20 her', '武仙座 21': '21 her', '武仙座 22': '22 her', '武仙座 23': '23 her', '武仙座 24': '24 her', '武仙座 25': '25 her', '武仙座 26': '26 her', '武仙座 27': '27 her', '武仙座 28': '28 her', '武仙座 29': '29 her', '武仙座 30': '30 her', '武仙座 31': '31 her', '武仙座 32': '32 her', '武仙座 33': '33 her', '武仙座 34': '34 her', '武仙座 35': '35 her', '武仙座 36': '36 her', '武仙座 37': '37 her', '武仙座 38': '38 her', '武仙座 39': '39 her', '武仙座 40': '40 her', '武仙座 41': '41 her', '武仙座 42': '42 her', '武仙座 43': '43 her', '武仙座 44': '44 her', '武仙座 45': '45 her', '武仙座 46': '46 her', '武仙座 47': '47 her', '武仙座 48': '48 her', '武仙座 49': '49 her', '武仙座 50': '50 her', '武仙座 51': '51 her', '武仙座 52': '52 her', '武仙座 53': '53 her', '武仙座 54': '54 her', '武仙座 56': '56 her', '武仙座 57': '57 her', '武仙座 58': '58 her', '武仙座 59': '59 her', '武仙座 60': '60 her', '武仙座 61': '61 her', '武仙座 62': '62 her', '武仙座 63': '63 her', '武仙座 64': '64 her', '武仙座 65': '65 her', '武仙座 67': '67 her', '武仙座 68': '68 her', '武仙座 69': '69 her', '武仙座 70': '70 her', '武仙座 72': '72 her', '武仙座 73': '73 her', '武仙座 74': '74 her', '武仙座 75': '75 her', '武仙座 76': '76 her', '武仙座 77': '77 her', '武仙座 78': '78 her', '武仙座 79': '79 her', '武仙座 82': '82 her', '武仙座 83': '83 her', '武仙座 84': '84 her', '武仙座 85': '85 her', '武仙座 86': '86 her', '武仙座 87': '87 her', '武仙座 88': '88 her', '武仙座 89': '89 her', '武仙座 90': '90 her', '武仙座 91': '91 her', '武仙座 92': '92 her', '武仙座 93': '93 her', '武仙座 94': '94 her', '武仙座 95': '95 her', '武仙座 96': '96 her', '武仙座 97': '97 her', '武仙座 98': '98 her', '武仙座 99': '99 her', '武仙座 100': '100 her', '武仙座 101': '101 her', '武仙座 102': '102 her', '武仙座 103': '103 her', '武仙座 104': '104 her', '武仙座 105': '105 her', '武仙座 106': '106 her', '武仙座 107': '107 her', '武仙座 108': '108 her', '武仙座 109': '109 her', '武仙座 110': '110 her', '武仙座 111': '111 her', '武仙座 112': '112 her', '武仙座 113': '113 her', '时钟座 α': 'alf hor', '时钟座 β': 'bet hor', '时钟座 γ': 'gam hor', '时钟座 δ': 'del hor', '时钟座 ζ': 'zet hor', '时钟座 η': 'eta hor', '时钟座 ι': 'iot hor', '时钟座 λ': 'lam hor', '时钟座 μ': 'mu. hor', '时钟座 ν': 'nu. hor', '长蛇座 α': 'alf hya', '长蛇座 β': 'bet hya', '巨爵座 28': '28 crt', '长蛇座 γ': 'gam hya', '长蛇座 δ': 'del hya', '长蛇座 ε': 'eps hya', '长蛇座 ζ': 'zet hya', '长蛇座 η': 'eta hya', '长蛇座 θ': 'tet hya', '长蛇座 ι': 'iot hya', '长蛇座 κ': 'kap hya', '长蛇座 λ': 'lam hya', '长蛇座 μ': 'mu. hya', '长蛇座 ν': 'nu. hya', '巨爵座 4': '4 crt', '长蛇座 ξ': 'ksi hya', '巨爵座 19': '19 crt', '长蛇座 ο': 'omi hya', '巨爵座 25': '25 crt', '长蛇座 π': 'pi. hya', '长蛇座 ρ': 'rho hya', '长蛇座 σ': 'sig hya', '长蛇座 τ1': 'tau1 hya', '长蛇座 τ2': 'tau2 hya', '长蛇座 υ1': 'ups1 hya', '长蛇座 υ2': 'ups2 hya', '长蛇座 φ': 'phi hya', '长蛇座 φ1': 'phi1 hya', '长蛇座 φ2': 'phi2 hya', '巨爵座 1': '1 crt', '长蛇座 φ3': 'phi3 hya', '巨爵座 2': '2 crt', '长蛇座 χ1': 'chi1 hya', '巨爵座 9': '9 crt', '长蛇座 χ2': 'chi2 hya', '长蛇座 ψ': 'psi hya', '长蛇座 ω': 'ome hya', '长蛇座 a': 'a hya', '长蛇座 b1': 'b1 hya', '巨爵座 3': '3 crt', '长蛇座 b3': 'b3 hya', '巨爵座 6': '6 crt', '长蛇座 k': 'k hya', '长蛇座 l': 'l hya', '长蛇座 m': 'm hya', '长蛇座 A': 'a hya', '长蛇座 C': 'c hya', '长蛇座 D': 'd hya', '长蛇座 E': 'e hya', '长蛇座 F': 'f hya', '长蛇座 G': 'g hya', '长蛇座 I': 'i hya', '长蛇座 P': 'p hya', '长蛇座 1': '1 hya', '长蛇座 2': '2 hya', '长蛇座 3': '3 hya', '长蛇座 4': '4 hya', '长蛇座 5': '5 hya', '长蛇座 6': '6 hya', '长蛇座 7': '7 hya', '长蛇座 9': '9 hya', '长蛇座 10': '10 hya', '长蛇座 11': '11 hya', '长蛇座 12': '12 hya', '长蛇座 13': '13 hya', '长蛇座 14': '14 hya', '长蛇座 15': '15 hya', '长蛇座 16': '16 hya', '长蛇座 17': '17 hya', '长蛇座 18': '18 hya', '长蛇座 19': '19 hya', '长蛇座 20': '20 hya', '长蛇座 21': '21 hya', '长蛇座 22': '22 hya', '长蛇座 23': '23 hya', '长蛇座 24': '24 hya', '长蛇座 25': '25 hya', '长蛇座 26': '26 hya', '长蛇座 27': '27 hya', '长蛇座 28': '28 hya', '长蛇座 29': '29 hya', '长蛇座 30': '30 hya', '长蛇座 31': '31 hya', '长蛇座 32': '32 hya', '长蛇座 33': '33 hya', '长蛇座 34': '34 hya', '长蛇座 35': '35 hya', '长蛇座 37': '37 hya', '长蛇座 38': '38 hya', '长蛇座 39': '39 hya', '长蛇座 40': '40 hya', '长蛇座 41': '41 hya', '长蛇座 42': '42 hya', '长蛇座 43': '43 hya', '长蛇座 44': '44 hya', '长蛇座 45': '45 hya', '长蛇座 46': '46 hya', '长蛇座 47': '47 hya', '长蛇座 48': '48 hya', '长蛇座 49': '49 hya', '长蛇座 50': '50 hya', '长蛇座 51': '51 hya', '长蛇座 52': '52 hya', '长蛇座 54': '54 hya', '长蛇座 55': '55 hya', '长蛇座 56': '56 hya', '长蛇座 57': '57 hya', '长蛇座 58': '58 hya', '长蛇座 59': '59 hya', '长蛇座 60': '60 hya', '水蛇座 α': 'alf hyi', '水蛇座 β': 'bet hyi', '水蛇座 γ': 'gam hyi', '水蛇座 δ': 'del hyi', '水蛇座 ε': 'eps hyi', '水蛇座 ζ': 'zet hyi', '水蛇座 η1': 'eta1 hyi', '水蛇座 η2': 'eta2 hyi', '水蛇座 θ': 'tet hyi', '水蛇座 ι': 'iot hyi', '水蛇座 κ': 'kap hyi', '水蛇座 λ': 'lam hyi', '水蛇座 μ': 'mu. hyi', '水蛇座 ν': 'nu. hyi', '水蛇座 π1': 'pi.1 hyi', '水蛇座 π2': 'pi.2 hyi', '水蛇座 σ': 'sig hyi', '水蛇座 τ1': 'tau1 hyi', '水蛇座 τ2': 'tau2 hyi', '印第安座 α': 'alf ind', '印第安座 β': 'bet ind', '印第安座 γ': 'gam ind', '印第安座 δ': 'del ind', '印第安座 ε': 'eps ind', '印第安座 ζ': 'zet ind', '印第安座 η': 'eta ind', '印第安座 θ': 'tet ind', '印第安座 ι': 'iot ind', '印第安座 κ1': 'kap1 ind', '印第安座 κ2': 'kap2 ind', '印第安座 μ': 'mu. ind', '印第安座 ν': 'nu. ind', '印第安座 ο': 'omi ind', '印第安座 π': 'pi. ind', '印第安座 ρ': 'rho ind', '蝎虎座 α': 'alf lac', '蝎虎座 β': 'bet lac', '蝎虎座 1': '1 lac', '蝎虎座 2': '2 lac', '蝎虎座 3': '3 lac', '蝎虎座 4': '4 lac', '蝎虎座 5': '5 lac', '蝎虎座 6': '6 lac', '蝎虎座 7': '7 lac', '蝎虎座 8': '8 lac', '蝎虎座 9': '9 lac', '蝎虎座 10': '10 lac', '蝎虎座 11': '11 lac', '蝎虎座 12': '12 lac', '蝎虎座 13': '13 lac', '蝎虎座 14': '14 lac', '蝎虎座 15': '15 lac', '蝎虎座 16': '16 lac', '狮子座 α': 'alf leo', '狮子座 β': 'bet leo', '狮子座 γ1': 'gam1 leo', '狮子座 γ2': 'gam2 leo', '狮子座 δ': 'del leo', '狮子座 ε': 'eps leo', '狮子座 ζ': 'zet leo', '狮子座 η': 'eta leo', '狮子座 θ': 'tet leo', '狮子座 ι': 'iot leo', '狮子座 κ': 'kap leo', '狮子座 λ': 'lam leo', '狮子座 μ': 'mu. leo', '狮子座 ν': 'nu. leo', '狮子座 ξ': 'ksi leo', '狮子座 ο': 'omi leo', '狮子座 π': 'pi. leo', '狮子座 ρ': 'rho leo', '狮子座 σ': 'sig leo', '狮子座 τ': 'tau leo', '狮子座 υ': 'ups leo', '狮子座 φ': 'phi leo', '狮子座 χ': 'chi leo', '狮子座 ψ': 'psi leo', '狮子座 ω': 'ome leo', '狮子座 b': 'b leo', '狮子座 c': 'c leo', '狮子座 d': 'd leo', '狮子座 e': 'e leo', '狮子座 f': 'f leo', '狮子座 g': 'g leo', '狮子座 k': 'k leo', '狮子座 l': 'l leo', '狮子座 m': 'm leo', '狮子座 n': 'n leo', '狮子座 o': 'o leo', '狮子座 p1': 'p1 leo', '狮子座 p2': 'p2 leo', '狮子座 p3': 'p3 leo', '狮子座 p4': 'p4 leo', '狮子座 p5': 'p5 leo', '狮子座 1': '1 leo', '狮子座 2': '2 leo', '狮子座 3': '3 leo', '狮子座 4': '4 leo', '狮子座 5': '5 leo', '狮子座 6': '6 leo', '狮子座 7': '7 leo', '狮子座 8': '8 leo', '狮子座 9': '9 leo', '狮子座 10': '10 leo', '狮子座 11': '11 leo', '狮子座 12': '12 leo', '狮子座 13': '13 leo', '狮子座 14': '14 leo', '狮子座 15': '15 leo', '狮子座 16': '16 leo', '狮子座 17': '17 leo', '狮子座 18': '18 leo', '狮子座 19': '19 leo', '狮子座 20': '20 leo', '狮子座 21': '21 leo', '狮子座 22': '22 leo', '狮子座 23': '23 leo', '狮子座 24': '24 leo', '狮子座 26': '26 leo', '狮子座 27': '27 leo', '狮子座 29': '29 leo', '狮子座 30': '30 leo', '狮子座 31': '31 leo', '狮子座 32': '32 leo', '狮子座 33': '33 leo', '狮子座 34': '34 leo', '狮子座 35': '35 leo', '狮子座 36': '36 leo', '狮子座 37': '37 leo', '狮子座 39': '39 leo', '狮子座 40': '40 leo', '狮子座 41': '41 leo', '狮子座 42': '42 leo', '狮子座 43': '43 leo', '狮子座 44': '44 leo', '狮子座 45': '45 leo', '狮子座 46': '46 leo', '狮子座 47': '47 leo', '狮子座 48': '48 leo', '狮子座 49': '49 leo', '狮子座 50': '50 leo', '狮子座 51': '51 leo', '狮子座 52': '52 leo', '狮子座 53': '53 leo', '狮子座 54': '54 leo', '狮子座 55': '55 leo', '狮子座 56': '56 leo', '狮子座 57': '57 leo', '狮子座 58': '58 leo', '狮子座 59': '59 leo', '狮子座 60': '60 leo', '狮子座 61': '61 leo', '狮子座 62': '62 leo', '狮子座 63': '63 leo', '狮子座 64': '64 leo', '狮子座 65': '65 leo', '狮子座 66': '66 leo', '狮子座 67': '67 leo', '狮子座 68': '68 leo', '狮子座 69': '69 leo', '狮子座 70': '70 leo', '狮子座 71': '71 leo', '狮子座 72': '72 leo', '狮子座 73': '73 leo', '狮子座 74': '74 leo', '狮子座 75': '75 leo', '狮子座 76': '76 leo', '狮子座 77': '77 leo', '狮子座 78': '78 leo', '狮子座 79': '79 leo', '狮子座 80': '80 leo', '狮子座 81': '81 leo', '狮子座 82': '82 leo', '狮子座 83': '83 leo', '狮子座 84': '84 leo', '狮子座 85': '85 leo', '狮子座 86': '86 leo', '狮子座 87': '87 leo', '狮子座 88': '88 leo', '狮子座 89': '89 leo', '狮子座 90': '90 leo', '狮子座 91': '91 leo', '狮子座 92': '92 leo', '狮子座 93': '93 leo', '狮子座 94': '94 leo', '狮子座 95': '95 leo', '小狮座 β': 'bet lmi', '小狮座 h': 'h lmi', '小狮座 o': 'o lmi', '小狮座 1': '1 lmi', '小狮座 2': '2 lmi', '小狮座 3': '3 lmi', '小狮座 4': '4 lmi', '小狮座 5': '5 lmi', '小狮座 6': '6 lmi', '小狮座 7': '7 lmi', '小狮座 8': '8 lmi', '小狮座 9': '9 lmi', '小狮座 10': '10 lmi', '小狮座 11': '11 lmi', '小狮座 13': '13 lmi', '小狮座 14': '14 lmi', '小狮座 15': '15 lmi', '小狮座 16': '16 lmi', '小狮座 17': '17 lmi', '小狮座 18': '18 lmi', '小狮座 19': '19 lmi', '小狮座 20': '20 lmi', '小狮座 21': '21 lmi', '小狮座 22': '22 lmi', '小狮座 23': '23 lmi', '小狮座 24': '24 lmi', '小狮座 25': '25 lmi', '小狮座 26': '26 lmi', '小狮座 27': '27 lmi', '小狮座 28': '28 lmi', '小狮座 29': '29 lmi', '小狮座 30': '30 lmi', '小狮座 31': '31 lmi', '小狮座 32': '32 lmi', '小狮座 33': '33 lmi', '小狮座 34': '34 lmi', '小狮座 35': '35 lmi', '小狮座 36': '36 lmi', '小狮座 37': '37 lmi', '小狮座 38': '38 lmi', '小狮座 39': '39 lmi', '小狮座 40': '40 lmi', '小狮座 41': '41 lmi', '小狮座 42': '42 lmi', '小狮座 43': '43 lmi', '小狮座 44': '44 lmi', '小狮座 45': '45 lmi', '小狮座 46': '46 lmi', '小狮座 47': '47 lmi', '小狮座 48': '48 lmi', '小狮座 49': '49 lmi', '小狮座 50': '50 lmi', '小狮座 51': '51 lmi', '小狮座 52': '52 lmi', '小狮座 53': '53 lmi', '天兔座 α': 'alf lep', '天兔座 β': 'bet lep', '天兔座 γ': 'gam lep', '天兔座 δ': 'del lep', '天兔座 ε': 'eps lep', '天兔座 ζ': 'zet lep', '天兔座 η': 'eta lep', '天兔座 θ': 'tet lep', '天兔座 ι': 'iot lep', '天兔座 κ': 'kap lep', '天兔座 λ': 'lam lep', '天兔座 μ': 'mu. lep', '天兔座 ν': 'nu. lep', '天兔座 1': '1 lep', '天兔座 2': '2 lep', '天兔座 3': '3 lep', '天兔座 4': '4 lep', '天兔座 5': '5 lep', '天兔座 6': '6 lep', '天兔座 7': '7 lep', '天兔座 8': '8 lep', '天兔座 9': '9 lep', '天兔座 10': '10 lep', '天兔座 11': '11 lep', '天兔座 12': '12 lep', '天兔座 13': '13 lep', '天兔座 14': '14 lep', '天兔座 15': '15 lep', '天兔座 16': '16 lep', '天兔座 17': '17 lep', '天兔座 18': '18 lep', '天兔座 19': '19 lep', '天秤座 α1': 'alf1 lib', '天秤座 α2': 'alf2 lib', '天秤座 β': 'bet lib', '天秤座 γ': 'gam lib', '天秤座 δ': 'del lib', '天秤座 ε': 'eps lib', '天秤座 ζ': 'zet lib', '天秤座 ζ1': 'zet1 lib', '天秤座 ζ3': 'zet3 lib', '天秤座 ζ4': 'zet4 lib', '天秤座 η': 'eta lib', '天秤座 θ': 'tet lib', '天秤座 ι1': 'iot1 lib', '天秤座 ι2': 'iot2 lib', '天秤座 κ': 'kap lib', '天秤座 λ': 'lam lib', '天秤座 μ': 'mu. lib', '天秤座 ν': 'nu. lib', '天秤座 ξ1': 'ksi1 lib', '天秤座 ξ2': 'ksi2 lib', '天秤座 ο': 'omi lib', '天秤座 σ': 'sig lib', '天秤座 τ': 'tau lib', '天秤座 υ': 'ups lib', '天秤座 2': '2 lib', '天秤座 3': '3 lib', '天秤座 4': '4 lib', '长蛇座 53': '53 hya', '天秤座 5': '5 lib', '天秤座 6': '6 lib', '天秤座 7': '7 lib', '天秤座 8': '8 lib', '天秤座 9': '9 lib', '天秤座 10': '10 lib', '天秤座 11': '11 lib', '天秤座 12': '12 lib', '天秤座 13': '13 lib', '天秤座 14': '14 lib', '天秤座 15': '15 lib', '天秤座 16': '16 lib', '天秤座 17': '17 lib', '天秤座 18': '18 lib', '天秤座 19': '19 lib', '天秤座 20': '20 lib', '天秤座 21': '21 lib', '天秤座 22': '22 lib', '天秤座 23': '23 lib', '天秤座 24': '24 lib', '天秤座 25': '25 lib', '天秤座 26': '26 lib', '天秤座 27': '27 lib', '天秤座 28': '28 lib', '天秤座 29': '29 lib', '天秤座 30': '30 lib', '天秤座 31': '31 lib', '天秤座 32': '32 lib', '天秤座 33': '33 lib', '天秤座 34': '34 lib', '天秤座 35': '35 lib', '天秤座 36': '36 lib', '天秤座 37': '37 lib', '天秤座 38': '38 lib', '天秤座 39': '39 lib', '天秤座 40': '40 lib', '天秤座 41': '41 lib', '天秤座 42': '42 lib', '天秤座 43': '43 lib', '天秤座 44': '44 lib', '天秤座 45': '45 lib', '天秤座 46': '46 lib', '天秤座 47': '47 lib', '天秤座 48': '48 lib', '天秤座 49': '49 lib', '天秤座 50': '50 lib', '豺狼座 α': 'alf lup', '豺狼座 β': 'bet lup', '豺狼座 γ': 'gam lup', '豺狼座 δ': 'del lup', '豺狼座 ε': 'eps lup', '豺狼座 ζ': 'zet lup', '豺狼座 η': 'eta lup', '豺狼座 θ': 'tet lup', '豺狼座 ι': 'iot lup', '豺狼座 κ1': 'kap1 lup', '豺狼座 κ2': 'kap2 lup', '豺狼座 λ': 'lam lup', '豺狼座 μ': 'mu. lup', '豺狼座 ν1': 'nu.1 lup', '豺狼座 ν2': 'nu.2 lup', '豺狼座 ξ1': 'ksi1 lup', '豺狼座 ξ2': 'ksi2 lup', '豺狼座 ο': 'omi lup', '豺狼座 π': 'pi. lup', '豺狼座 ρ': 'rho lup', '豺狼座 σ': 'sig lup', '豺狼座 τ1': 'tau1 lup', '豺狼座 τ2': 'tau2 lup', '豺狼座 υ': 'ups lup', '豺狼座 φ1': 'phi1 lup', '豺狼座 φ2': 'phi2 lup', '豺狼座 χ': 'chi lup', '豺狼座 ψ1': 'psi1 lup', '豺狼座 ψ2': 'psi2 lup', '豺狼座 ω': 'ome lup', '豺狼座 a': 'a lup', '豺狼座 b': 'b lup', '豺狼座 c': 'c lup', '豺狼座 d': 'd lup', '豺狼座 e': 'e lup', '豺狼座 f': 'f lup', '豺狼座 g': 'g lup', '豺狼座 h': 'h lup', '豺狼座 i': 'i lup', '豺狼座 k': 'k lup', '豺狼座 1': '1 lup', '豺狼座 2': '2 lup', '豺狼座 3': '3 lup', '豺狼座 4': '4 lup', '豺狼座 5': '5 lup', '天猫座 α': 'alf lyn', '天猫座 1': '1 lyn', '天猫座 2': '2 lyn', '天猫座 3': '3 lyn', '天猫座 4': '4 lyn', '天猫座 5': '5 lyn', '天猫座 6': '6 lyn', '天猫座 7': '7 lyn', '天猫座 8': '8 lyn', '天猫座 9': '9 lyn', '天猫座 10': '10 lyn', '天猫座 11': '11 lyn', '天猫座 12': '12 lyn', '天猫座 13': '13 lyn', '天猫座 14': '14 lyn', '天猫座 15': '15 lyn', '天猫座 16': '16 lyn', '天猫座 17': '17 lyn', '天猫座 18': '18 lyn', '天猫座 19': '19 lyn', '天猫座 20': '20 lyn', '天猫座 21': '21 lyn', '天猫座 22': '22 lyn', '天猫座 23': '23 lyn', '天猫座 24': '24 lyn', '天猫座 25': '25 lyn', '天猫座 26': '26 lyn', '天猫座 27': '27 lyn', '天猫座 28': '28 lyn', '天猫座 29': '29 lyn', '天猫座 30': '30 lyn', '鹿豹座 58': '58 cam', '天猫座 31': '31 lyn', '天猫座 32': '32 lyn', '天猫座 33': '33 lyn', '天猫座 34': '34 lyn', '天猫座 35': '35 lyn', '天猫座 36': '36 lyn', '天猫座 37': '37 lyn', '天猫座 38': '38 lyn', '天猫座 39': '39 lyn', '天猫座 40': '40 lyn', '天猫座 41': '41 lyn', '天猫座 42': '42 lyn', '天猫座 43': '43 lyn', '天猫座 44': '44 lyn', '天琴座 α': 'alf lyr', '天琴座 β': 'bet lyr', '天琴座 γ': 'gam lyr', '天琴座 δ1': 'del1 lyr', '天琴座 δ2': 'del2 lyr', '天琴座 ε1': 'eps1 lyr', '天琴座 ε2': 'eps2 lyr', '天琴座 ζ1': 'zet1 lyr', '天琴座 ζ2': 'zet2 lyr', '天琴座 η': 'eta lyr', '天琴座 θ': 'tet lyr', '天琴座 ι': 'iot lyr', '天琴座 κ': 'kap lyr', '天琴座 λ': 'lam lyr', '天琴座 μ': 'mu. lyr', '天琴座 ν': 'nu. lyr', '天琴座 ν1': 'nu.1 lyr', '天琴座 ν2': 'nu.2 lyr', '天琴座 1': '1 lyr', '天琴座 2': '2 lyr', '天琴座 3': '3 lyr', '天琴座 4': '4 lyr', '天琴座 5': '5 lyr', '天琴座 6': '6 lyr', '天琴座 7': '7 lyr', '天琴座 8': '8 lyr', '天琴座 9': '9 lyr', '天琴座 10': '10 lyr', '天琴座 11': '11 lyr', '天琴座 12': '12 lyr', '天琴座 13': '13 lyr', '天琴座 14': '14 lyr', '天琴座 15': '15 lyr', '天琴座 16': '16 lyr', '天琴座 17': '17 lyr', '天琴座 18': '18 lyr', '天琴座 19': '19 lyr', '天琴座 20': '20 lyr', '天琴座 21': '21 lyr', '山案座 α': 'alf men', '山案座 β': 'bet men', '山案座 γ': 'gam men', '山案座 δ': 'del men', '山案座 ε': 'eps men', '山案座 ζ': 'zet men', '山案座 η': 'eta men', '山案座 θ': 'tet men', '山案座 ι': 'iot men', '山案座 κ': 'kap men', '山案座 λ': 'lam men', '山案座 μ': 'mu. men', '山案座 ν': 'nu. men', '山案座 ξ': 'ksi men', '山案座 π': 'pi. men', '山案座 31': '31 men', '显微镜座 α': 'alf mic', '显微镜座 β': 'bet mic', '显微镜座 γ': 'gam mic', '显微镜座 δ': 'del mic', '显微镜座 ε': 'eps mic', '显微镜座 ζ': 'zet mic', '显微镜座 η': 'eta mic', '显微镜座 θ1': 'tet1 mic', '显微镜座 θ2': 'tet2 mic', '显微镜座 ι': 'iot mic', '显微镜座 ν': 'nu. mic', '麒麟座 α': 'alf mon', '麒麟座 β': 'bet mon', '麒麟座 γ': 'gam mon', '麒麟座 δ': 'del mon', '麒麟座 ε': 'eps mon', '麒麟座 ζ': 'zet mon', '麒麟座 1': '1 mon', '麒麟座 2': '2 mon', '麒麟座 3': '3 mon', '麒麟座 4': '4 mon', '麒麟座 5': '5 mon', '麒麟座 6': '6 mon', '麒麟座 7': '7 mon', '麒麟座 8': '8 mon', '麒麟座 9': '9 mon', '麒麟座 10': '10 mon', '麒麟座 11': '11 mon', '麒麟座 12': '12 mon', '麒麟座 13': '13 mon', '麒麟座 14': '14 mon', '麒麟座 15': '15 mon', '麒麟座 16': '16 mon', '麒麟座 17': '17 mon', '麒麟座 18': '18 mon', '麒麟座 19': '19 mon', '麒麟座 20': '20 mon', '麒麟座 21': '21 mon', '麒麟座 22': '22 mon', '麒麟座 23': '23 mon', '麒麟座 24': '24 mon', '麒麟座 25': '25 mon', '麒麟座 26': '26 mon', '麒麟座 27': '27 mon', '麒麟座 28': '28 mon', '麒麟座 29': '29 mon', '麒麟座 30': '30 mon', '麒麟座 31': '31 mon', '苍蝇座 α': 'alf mus', '苍蝇座 β': 'bet mus', '苍蝇座 γ': 'gam mus', '苍蝇座 δ': 'del mus', '苍蝇座 ε': 'eps mus', '苍蝇座 ζ1': 'zet1 mus', '苍蝇座 ζ2': 'zet2 mus', '苍蝇座 η': 'eta mus', '苍蝇座 θ': 'tet mus', '苍蝇座 ι1': 'iot1 mus', '苍蝇座 ι2': 'iot2 mus', '苍蝇座 λ': 'lam mus', '苍蝇座 μ': 'mu. mus', '矩尺座 γ1': 'gam1 nor', '矩尺座 γ2': 'gam2 nor', '矩尺座 δ': 'del nor', '矩尺座 ε': 'eps nor', '矩尺座 ζ': 'zet nor', '矩尺座 η': 'eta nor', '矩尺座 θ': 'tet nor', '矩尺座 ι1': 'iot1 nor', '矩尺座 ι2': 'iot2 nor', '矩尺座 κ': 'kap nor', '矩尺座 λ': 'lam nor', '矩尺座 μ': 'mu. nor', '南极座 α': 'alf oct', '南极座 β': 'bet oct', '南极座 γ1': 'gam1 oct', '南极座 γ2': 'gam2 oct', '南极座 γ3': 'gam3 oct', '南极座 δ': 'del oct', '南极座 ε': 'eps oct', '南极座 ζ': 'zet oct', '南极座 η': 'eta oct', '南极座 θ': 'tet oct', '南极座 ι': 'iot oct', '南极座 κ': 'kap oct', '南极座 λ': 'lam oct', '南极座 μ1': 'mu.1 oct', '南极座 μ2': 'mu.2 oct', '南极座 ν': 'nu. oct', '南极座 ξ': 'ksi oct', '南极座 π1': 'pi.1 oct', '南极座 π2': 'pi.2 oct', '南极座 ρ': 'rho oct', '南极座 σ': 'sig oct', '南极座 τ': 'tau oct', '南极座 υ': 'ups oct', '南极座 φ': 'phi oct', '南极座 χ': 'chi oct', '南极座 ψ': 'psi oct', '南极座 ω': 'ome oct', '蛇夫座 α': 'alf oph', '蛇夫座 β': 'bet oph', '蛇夫座 γ': 'gam oph', '蛇夫座 δ': 'del oph', '蛇夫座 ε': 'eps oph', '蛇夫座 ζ': 'zet oph', '蛇夫座 η': 'eta oph', '蛇夫座 θ': 'tet oph', '蛇夫座 ι': 'iot oph', '蛇夫座 κ': 'kap oph', '蛇夫座 λ': 'lam oph', '蛇夫座 μ': 'mu. oph', '蛇夫座 ν': 'nu. oph', '蛇夫座 ξ': 'ksi oph', '蛇夫座 ο': 'omi oph', '蛇夫座 ρ': 'rho oph', '蛇夫座 σ': 'sig oph', '蛇夫座 τ': 'tau oph', '蛇夫座 υ': 'ups oph', '蛇夫座 φ': 'phi oph', '蛇夫座 χ': 'chi oph', '蛇夫座 ψ': 'psi oph', '蛇夫座 ω': 'ome oph', '蛇夫座 b': 'b oph', '蛇夫座 c': 'c oph', '蛇夫座 d': 'd oph', '蛇夫座 e': 'e oph', '武仙座 66': '66 her', '蛇夫座 f': 'f oph', '蛇夫座 p': 'p oph', '蛇夫座 A': 'a oph', '蛇夫座 1': '1 oph', '蛇夫座 2': '2 oph', '蛇夫座 3': '3 oph', '蛇夫座 4': '4 oph', '蛇夫座 5': '5 oph', '蛇夫座 7': '7 oph', '蛇夫座 8': '8 oph', '蛇夫座 9': '9 oph', '蛇夫座 10': '10 oph', '蛇夫座 11': '11 oph', '蛇夫座 12': '12 oph', '蛇夫座 13': '13 oph', '蛇夫座 14': '14 oph', '蛇夫座 15': '15 oph', '蛇夫座 16': '16 oph', '蛇夫座 17': '17 oph', '蛇夫座 19': '19 oph', '蛇夫座 20': '20 oph', '蛇夫座 21': '21 oph', '蛇夫座 22': '22 oph', '蛇夫座 23': '23 oph', '蛇夫座 24': '24 oph', '蛇夫座 25': '25 oph', '蛇夫座 26': '26 oph', '蛇夫座 27': '27 oph', '蛇夫座 28': '28 oph', '蛇夫座 29': '29 oph', '蛇夫座 30': '30 oph', '蛇夫座 31': '31 oph', '蛇夫座 32': '32 oph', '蛇夫座 33': '33 oph', '蛇夫座 34': '34 oph', '蛇夫座 35': '35 oph', '蛇夫座 36': '36 oph', '蛇夫座 37': '37 oph', '蛇夫座 38': '38 oph', '蛇夫座 39': '39 oph', '蛇夫座 40': '40 oph', '蛇夫座 41': '41 oph', '蛇夫座 42': '42 oph', '蛇夫座 43': '43 oph', '蛇夫座 44': '44 oph', '蛇夫座 45': '45 oph', '蛇夫座 47': '47 oph', '蛇夫座 49': '49 oph', '蛇夫座 50': '50 oph', '蛇夫座 51': '51 oph', '蛇夫座 52': '52 oph', '蛇夫座 53': '53 oph', '蛇夫座 54': '54 oph', '蛇夫座 55': '55 oph', '蛇夫座 56': '56 oph', '蛇夫座 57': '57 oph', '蛇夫座 58': '58 oph', '蛇夫座 60': '60 oph', '蛇夫座 61': '61 oph', '蛇夫座 62': '62 oph', '蛇夫座 63': '63 oph', '蛇夫座 64': '64 oph', '蛇夫座 66': '66 oph', '蛇夫座 67': '67 oph', '蛇夫座 68': '68 oph', '蛇夫座 69': '69 oph', '蛇夫座 70': '70 oph', '蛇夫座 71': '71 oph', '蛇夫座 72': '72 oph', '蛇夫座 73': '73 oph', '蛇夫座 74': '74 oph', '蛇夫座 191': '191 oph', '猎户座 α': 'alf ori', '猎户座 β': 'bet ori', '猎户座 γ': 'gam ori', '猎户座 δ': 'del ori', '猎户座 ε': 'eps ori', '猎户座 ζ': 'zet ori', '猎户座 η': 'eta ori', '猎户座 θ1': 'tet1 ori', '猎户座 θ2': 'tet2 ori', '猎户座 ι': 'iot ori', '猎户座 κ': 'kap ori', '猎户座 λ': 'lam ori', '猎户座 μ': 'mu. ori', '猎户座 ν': 'nu. ori', '猎户座 ξ': 'ksi ori', '猎户座 ο1': 'omi1 ori', '猎户座 ο2': 'omi2 ori', '猎户座 π1': 'pi.1 ori', '猎户座 π2': 'pi.2 ori', '猎户座 π3': 'pi.3 ori', '猎户座 π4': 'pi.4 ori', '猎户座 π5': 'pi.5 ori', '猎户座 π6': 'pi.6 ori', '猎户座 ρ': 'rho ori', '猎户座 σ': 'sig ori', '猎户座 τ': 'tau ori', '猎户座 υ': 'ups ori', '猎户座 φ1': 'phi1 ori', '猎户座 φ2': 'phi2 ori', '猎户座 χ1': 'chi1 ori', '猎户座 χ2': 'chi2 ori', '猎户座 ψ': 'psi ori', '猎户座 ψ1': 'psi1 ori', '猎户座 ψ2': 'psi2 ori', '猎户座 ω': 'ome ori', '猎户座 b': 'b ori', '猎户座 c': 'c ori', '猎户座 d': 'd ori', '猎户座 e': 'e ori', '猎户座 f1': 'f1 ori', '猎户座 f2': 'f2 ori', '猎户座 g': 'g ori', '猎户座 h': 'h ori', '猎户座 i': 'i ori', '猎户座 k': 'k ori', '猎户座 l': 'l ori', '猎户座 m': 'm ori', '猎户座 n1': 'n1 ori', '猎户座 n2': 'n2 ori', '猎户座 o': 'o ori', '猎户座 p': 'p ori', '猎户座 A': 'a ori', '猎户座 1': '1 ori', '猎户座 2': '2 ori', '猎户座 3': '3 ori', '猎户座 4': '4 ori', '猎户座 5': '5 ori', '猎户座 6': '6 ori', '猎户座 7': '7 ori', '猎户座 8': '8 ori', '猎户座 9': '9 ori', '猎户座 10': '10 ori', '猎户座 11': '11 ori', '猎户座 13': '13 ori', '猎户座 14': '14 ori', '猎户座 15': '15 ori', '猎户座 16': '16 ori', '猎户座 17': '17 ori', '猎户座 18': '18 ori', '猎户座 19': '19 ori', '猎户座 20': '20 ori', '猎户座 21': '21 ori', '猎户座 22': '22 ori', '猎户座 23': '23 ori', '猎户座 24': '24 ori', '猎户座 25': '25 ori', '猎户座 27': '27 ori', '猎户座 28': '28 ori', '猎户座 29': '29 ori', '猎户座 30': '30 ori', '猎户座 31': '31 ori', '猎户座 32': '32 ori', '猎户座 33': '33 ori', '猎户座 34': '34 ori', '猎户座 35': '35 ori', '猎户座 36': '36 ori', '猎户座 37': '37 ori', '猎户座 38': '38 ori', '猎户座 39': '39 ori', '猎户座 40': '40 ori', '猎户座 41': '41 ori', '猎户座 42': '42 ori', '猎户座 43': '43 ori', '猎户座 44': '44 ori', '猎户座 45': '45 ori', '猎户座 46': '46 ori', '猎户座 47': '47 ori', '猎户座 48': '48 ori', '猎户座 49': '49 ori', '猎户座 50': '50 ori', '猎户座 51': '51 ori', '猎户座 52': '52 ori', '猎户座 53': '53 ori', '猎户座 54': '54 ori', '猎户座 55': '55 ori', '猎户座 56': '56 ori', '猎户座 57': '57 ori', '猎户座 58': '58 ori', '猎户座 59': '59 ori', '猎户座 60': '60 ori', '猎户座 61': '61 ori', '猎户座 62': '62 ori', '猎户座 63': '63 ori', '猎户座 64': '64 ori', '猎户座 66': '66 ori', '猎户座 67': '67 ori', '猎户座 68': '68 ori', '猎户座 69': '69 ori', '猎户座 70': '70 ori', '猎户座 71': '71 ori', '猎户座 72': '72 ori', '猎户座 73': '73 ori', '猎户座 74': '74 ori', '猎户座 75': '75 ori', '猎户座 77': '77 ori', '猎户座 78': '78 ori', '孔雀座 α': 'alf pav', '孔雀座 β': 'bet pav', '孔雀座 γ': 'gam pav', '孔雀座 δ': 'del pav', '孔雀座 ε': 'eps pav', '孔雀座 ζ': 'zet pav', '孔雀座 η': 'eta pav', '孔雀座 θ': 'tet pav', '孔雀座 ι': 'iot pav', '孔雀座 κ': 'kap pav', '孔雀座 λ': 'lam pav', '孔雀座 μ1': 'mu.1 pav', '孔雀座 μ2': 'mu.2 pav', '孔雀座 ν': 'nu. pav', '孔雀座 ξ': 'ksi pav', '孔雀座 ο': 'omi pav', '孔雀座 π': 'pi. pav', '孔雀座 ρ': 'rho pav', '孔雀座 σ': 'sig pav', '孔雀座 τ': 'tau pav', '孔雀座 υ': 'ups pav', '孔雀座 φ1': 'phi1 pav', '孔雀座 φ2': 'phi2 pav', '孔雀座 ω': 'ome pav', '飞马座 α': 'alf peg', '飞马座 β': 'bet peg', '飞马座 γ': 'gam peg', '飞马座 δ': 'del peg', '飞马座 ε': 'eps peg', '飞马座 ζ': 'zet peg', '飞马座 η': 'eta peg', '飞马座 θ': 'tet peg', '飞马座 ι': 'iot peg', '飞马座 κ': 'kap peg', '飞马座 λ': 'lam peg', '飞马座 μ': 'mu. peg', '飞马座 ν': 'nu. peg', '飞马座 ξ': 'ksi peg', '飞马座 ο': 'omi peg', '飞马座 π': 'pi. peg', '飞马座 π1': 'pi.1 peg', '飞马座 π2': 'pi.2 peg', '飞马座 ρ': 'rho peg', '飞马座 σ': 'sig peg', '飞马座 τ': 'tau peg', '飞马座 υ': 'ups peg', '飞马座 φ': 'phi peg', '飞马座 χ': 'chi peg', '飞马座 ψ': 'psi peg', '飞马座 1': '1 peg', '飞马座 2': '2 peg', '飞马座 3': '3 peg', '飞马座 4': '4 peg', '飞马座 5': '5 peg', '飞马座 6': '6 peg', '飞马座 7': '7 peg', '飞马座 8': '8 peg', '飞马座 9': '9 peg', '飞马座 10': '10 peg', '飞马座 11': '11 peg', '宝瓶座 27': '27 aqr', '飞马座 12': '12 peg', '飞马座 13': '13 peg', '飞马座 14': '14 peg', '飞马座 15': '15 peg', '飞马座 16': '16 peg', '飞马座 17': '17 peg', '飞马座 18': '18 peg', '飞马座 19': '19 peg', '飞马座 20': '20 peg', '飞马座 21': '21 peg', '飞马座 22': '22 peg', '飞马座 23': '23 peg', '飞马座 24': '24 peg', '飞马座 25': '25 peg', '飞马座 26': '26 peg', '飞马座 27': '27 peg', '飞马座 28': '28 peg', '飞马座 29': '29 peg', '飞马座 30': '30 peg', '飞马座 31': '31 peg', '飞马座 32': '32 peg', '飞马座 33': '33 peg', '飞马座 34': '34 peg', '飞马座 35': '35 peg', '飞马座 36': '36 peg', '飞马座 37': '37 peg', '飞马座 38': '38 peg', '飞马座 39': '39 peg', '飞马座 40': '40 peg', '飞马座 41': '41 peg', '飞马座 42': '42 peg', '飞马座 43': '43 peg', '飞马座 44': '44 peg', '飞马座 45': '45 peg', '飞马座 46': '46 peg', '飞马座 47': '47 peg', '飞马座 48': '48 peg', '飞马座 49': '49 peg', '飞马座 50': '50 peg', '飞马座 51': '51 peg', '飞马座 52': '52 peg', '飞马座 53': '53 peg', '飞马座 54': '54 peg', '飞马座 55': '55 peg', '飞马座 56': '56 peg', '飞马座 57': '57 peg', '飞马座 58': '58 peg', '飞马座 59': '59 peg', '飞马座 60': '60 peg', '飞马座 61': '61 peg', '飞马座 62': '62 peg', '飞马座 63': '63 peg', '飞马座 64': '64 peg', '飞马座 65': '65 peg', '飞马座 66': '66 peg', '飞马座 67': '67 peg', '飞马座 68': '68 peg', '飞马座 69': '69 peg', '飞马座 70': '70 peg', '飞马座 71': '71 peg', '飞马座 72': '72 peg', '飞马座 73': '73 peg', '飞马座 74': '74 peg', '飞马座 75': '75 peg', '飞马座 76': '76 peg', '飞马座 77': '77 peg', '飞马座 78': '78 peg', '飞马座 79': '79 peg', '飞马座 80': '80 peg', '飞马座 81': '81 peg', '飞马座 82': '82 peg', '飞马座 83': '83 peg', '飞马座 84': '84 peg', '飞马座 85': '85 peg', '飞马座 86': '86 peg', '飞马座 87': '87 peg', '飞马座 88': '88 peg', '飞马座 89': '89 peg', '英仙座 α': 'alf per', '英仙座 β': 'bet per', '英仙座 γ': 'gam per', '英仙座 δ': 'del per', '英仙座 ε': 'eps per', '英仙座 ζ': 'zet per', '英仙座 η': 'eta per', '英仙座 θ': 'tet per', '英仙座 ι': 'iot per', '英仙座 κ': 'kap per', '英仙座 λ': 'lam per', '英仙座 μ': 'mu. per', '英仙座 ν': 'nu. per', '英仙座 ξ': 'ksi per', '英仙座 ο': 'omi per', '英仙座 π': 'pi. per', '英仙座 ρ': 'rho per', '英仙座 σ': 'sig per', '英仙座 τ': 'tau per', '英仙座 υ': 'ups per', '英仙座 φ': 'phi per', '仙女座 54': '54 and', '英仙座 χ': 'chi per', '英仙座 ψ': 'psi per', '英仙座 ω': 'ome per', '英仙座 b': 'b per', '英仙座 c': 'c per', '英仙座 d': 'd per', '英仙座 e': 'e per', '英仙座 f': 'f per', '英仙座 g': 'g per', '英仙座 h': 'h per', '英仙座 i': 'i per', '英仙座 k': 'k per', '英仙座 l': 'l per', '英仙座 m': 'm per', '英仙座 n': 'n per', '英仙座 o': 'o per', '英仙座 A': 'a per', '英仙座 1': '1 per', '英仙座 2': '2 per', '英仙座 3': '3 per', '英仙座 4': '4 per', '英仙座 5': '5 per', '英仙座 6': '6 per', '英仙座 7': '7 per', '英仙座 8': '8 per', '英仙座 9': '9 per', '英仙座 10': '10 per', '英仙座 11': '11 per', '英仙座 12': '12 per', '英仙座 13': '13 per', '英仙座 14': '14 per', '英仙座 15': '15 per', '英仙座 16': '16 per', '英仙座 17': '17 per', '英仙座 18': '18 per', '英仙座 20': '20 per', '英仙座 21': '21 per', '英仙座 22': '22 per', '英仙座 23': '23 per', '英仙座 24': '24 per', '英仙座 25': '25 per', '英仙座 26': '26 per', '英仙座 27': '27 per', '英仙座 28': '28 per', '英仙座 29': '29 per', '英仙座 30': '30 per', '英仙座 31': '31 per', '英仙座 32': '32 per', '英仙座 33': '33 per', '英仙座 34': '34 per', '英仙座 35': '35 per', '英仙座 36': '36 per', '英仙座 37': '37 per', '英仙座 38': '38 per', '英仙座 39': '39 per', '英仙座 40': '40 per', '英仙座 41': '41 per', '英仙座 42': '42 per', '英仙座 43': '43 per', '英仙座 44': '44 per', '英仙座 45': '45 per', '英仙座 46': '46 per', '英仙座 47': '47 per', '英仙座 48': '48 per', '英仙座 49': '49 per', '英仙座 50': '50 per', '英仙座 51': '51 per', '英仙座 52': '52 per', '英仙座 53': '53 per', '英仙座 54': '54 per', '英仙座 55': '55 per', '英仙座 56': '56 per', '英仙座 57': '57 per', '英仙座 58': '58 per', '英仙座 59': '59 per', '凤凰座 α': 'alf phe', '凤凰座 β': 'bet phe', '凤凰座 γ': 'gam phe', '凤凰座 δ': 'del phe', '凤凰座 ε': 'eps phe', '凤凰座 ζ': 'zet phe', '凤凰座 η': 'eta phe', '凤凰座 θ': 'tet phe', '凤凰座 ι': 'iot phe', '凤凰座 κ': 'kap phe', '凤凰座 λ1': 'lam1 phe', '凤凰座 λ2': 'lam2 phe', '凤凰座 μ': 'mu. phe', '凤凰座 ν': 'nu. phe', '凤凰座 ξ': 'ksi phe', '凤凰座 π': 'pi. phe', '凤凰座 ρ': 'rho phe', '凤凰座 σ': 'sig phe', '凤凰座 τ': 'tau phe', '凤凰座 υ': 'ups phe', '凤凰座 φ': 'phi phe', '凤凰座 χ': 'chi phe', '凤凰座 ψ': 'psi phe', '凤凰座 ω': 'ome phe', '凤凰座 120': '120 phe', '绘架座 α': 'alf pic', '绘架座 β': 'bet pic', '绘架座 γ': 'gam pic', '绘架座 δ': 'del pic', '绘架座 ζ': 'zet pic', '绘架座 η1': 'eta1 pic', '绘架座 η2': 'eta2 pic', '绘架座 θ': 'tet pic', '绘架座 ι': 'iot pic', '绘架座 κ': 'kap pic', '绘架座 λ': 'lam pic', '绘架座 μ': 'mu. pic', '绘架座 ν': 'nu. pic', '绘架座 61': '61 pic', '双鱼座 α': 'alf psc', '双鱼座 β': 'bet psc', '双鱼座 γ': 'gam psc', '双鱼座 δ': 'del psc', '双鱼座 ε': 'eps psc', '双鱼座 ζ': 'zet psc', '双鱼座 η': 'eta psc', '双鱼座 θ': 'tet psc', '双鱼座 ι': 'iot psc', '双鱼座 κ': 'kap psc', '双鱼座 λ': 'lam psc', '双鱼座 μ': 'mu. psc', '双鱼座 ν': 'nu. psc', '双鱼座 ξ': 'ksi psc', '双鱼座 ο': 'omi psc', '双鱼座 π': 'pi. psc', '双鱼座 ρ': 'rho psc', '双鱼座 σ': 'sig psc', '双鱼座 τ': 'tau psc', '双鱼座 υ': 'ups psc', '双鱼座 φ': 'phi psc', '双鱼座 χ': 'chi psc', '双鱼座 ψ1': 'psi1 psc', '双鱼座 ψ2': 'psi2 psc', '双鱼座 ψ3': 'psi3 psc', '双鱼座 ω': 'ome psc', '双鱼座 b': 'b psc', '双鱼座 c': 'c psc', '双鱼座 d': 'd psc', '双鱼座 e': 'e psc', '双鱼座 f': 'f psc', '双鱼座 g': 'g psc', '双鱼座 h': 'h psc', '双鱼座 i': 'i psc', '双鱼座 k': 'k psc', '双鱼座 l': 'l psc', '双鱼座 A': 'a psc', '双鱼座 1': '1 psc', '双鱼座 2': '2 psc', '双鱼座 3': '3 psc', '双鱼座 4': '4 psc', '双鱼座 5': '5 psc', '双鱼座 6': '6 psc', '双鱼座 7': '7 psc', '双鱼座 8': '8 psc', '双鱼座 9': '9 psc', '双鱼座 10': '10 psc', '双鱼座 11': '11 psc', '双鱼座 12': '12 psc', '双鱼座 13': '13 psc', '双鱼座 14': '14 psc', '双鱼座 15': '15 psc', '双鱼座 16': '16 psc', '双鱼座 17': '17 psc', '双鱼座 18': '18 psc', '双鱼座 19': '19 psc', '双鱼座 20': '20 psc', '双鱼座 21': '21 psc', '双鱼座 22': '22 psc', '双鱼座 23': '23 psc', '双鱼座 24': '24 psc', '双鱼座 25': '25 psc', '双鱼座 26': '26 psc', '双鱼座 27': '27 psc', '双鱼座 28': '28 psc', '双鱼座 29': '29 psc', '双鱼座 30': '30 psc', '双鱼座 31': '31 psc', '双鱼座 32': '32 psc', '双鱼座 33': '33 psc', '双鱼座 34': '34 psc', '双鱼座 35': '35 psc', '双鱼座 36': '36 psc', '双鱼座 37': '37 psc', '双鱼座 38': '38 psc', '双鱼座 39': '39 psc', '双鱼座 40': '40 psc', '双鱼座 41': '41 psc', '双鱼座 42': '42 psc', '双鱼座 43': '43 psc', '双鱼座 44': '44 psc', '双鱼座 45': '45 psc', '双鱼座 46': '46 psc', '双鱼座 47': '47 psc', '双鱼座 48': '48 psc', '双鱼座 49': '49 psc', '双鱼座 51': '51 psc', '双鱼座 52': '52 psc', '双鱼座 53': '53 psc', '双鱼座 54': '54 psc', '双鱼座 55': '55 psc', '双鱼座 57': '57 psc', '双鱼座 58': '58 psc', '双鱼座 59': '59 psc', '双鱼座 60': '60 psc', '双鱼座 61': '61 psc', '双鱼座 62': '62 psc', '双鱼座 63': '63 psc', '双鱼座 64': '64 psc', '双鱼座 65': '65 psc', '双鱼座 66': '66 psc', '双鱼座 67': '67 psc', '双鱼座 68': '68 psc', '双鱼座 69': '69 psc', '仙女座 40': '40 and', '双鱼座 70': '70 psc', '双鱼座 71': '71 psc', '双鱼座 72': '72 psc', '双鱼座 73': '73 psc', '双鱼座 74': '74 psc', '双鱼座 75': '75 psc', '双鱼座 76': '76 psc', '双鱼座 77': '77 psc', '双鱼座 78': '78 psc', '双鱼座 79': '79 psc', '双鱼座 80': '80 psc', '双鱼座 81': '81 psc', '双鱼座 82': '82 psc', '双鱼座 83': '83 psc', '双鱼座 84': '84 psc', '双鱼座 85': '85 psc', '双鱼座 86': '86 psc', '双鱼座 87': '87 psc', '双鱼座 88': '88 psc', '双鱼座 89': '89 psc', '双鱼座 90': '90 psc', '双鱼座 91': '91 psc', '双鱼座 92': '92 psc', '双鱼座 93': '93 psc', '双鱼座 94': '94 psc', '双鱼座 95': '95 psc', '双鱼座 96': '96 psc', '双鱼座 97': '97 psc', '双鱼座 98': '98 psc', '双鱼座 99': '99 psc', '双鱼座 100': '100 psc', '双鱼座 101': '101 psc', '双鱼座 102': '102 psc', '双鱼座 103': '103 psc', '双鱼座 104': '104 psc', '双鱼座 105': '105 psc', '双鱼座 106': '106 psc', '鲸鱼座 51': '51 cet', '双鱼座 107': '107 psc', '白羊座 2': '2 ari', '双鱼座 109': '109 psc', '双鱼座 110': '110 psc', '双鱼座 111': '111 psc', '双鱼座 112': '112 psc', '双鱼座 113': '113 psc', '南鱼座 α': 'alf psa', '南鱼座 β': 'bet psa', '南鱼座 γ': 'gam psa', '南鱼座 δ': 'del psa', '南鱼座 ε': 'eps psa', '南鱼座 ζ': 'zet psa', '南鱼座 η': 'eta psa', '南鱼座 θ': 'tet psa', '南鱼座 ι': 'iot psa', '南鱼座 λ': 'lam psa', '南鱼座 μ': 'mu. psa', '南鱼座 π': 'pi. psa', '南鱼座 τ': 'tau psa', '南鱼座 υ': 'ups psa', '南鱼座 1': '1 psa', '南鱼座 2': '2 psa', '南鱼座 3': '3 psa', '南鱼座 4': '4 psa', '南鱼座 5': '5 psa', '南鱼座 6': '6 psa', '南鱼座 7': '7 psa', '南鱼座 8': '8 psa', '南鱼座 9': '9 psa', '南鱼座 10': '10 psa', '南鱼座 11': '11 psa', '南鱼座 12': '12 psa', '南鱼座 13': '13 psa', '南鱼座 14': '14 psa', '南鱼座 15': '15 psa', '南鱼座 16': '16 psa', '南鱼座 17': '17 psa', '南鱼座 18': '18 psa', '南鱼座 19': '19 psa', '南鱼座 20': '20 psa', '南鱼座 21': '21 psa', '南鱼座 22': '22 psa', '南鱼座 23': '23 psa', '南鱼座 24': '24 psa', '宝瓶座 79': '79 aqr', '船尾座 ζ': 'zet pup', '船尾座 ν': 'nu. pup', '船尾座 ξ': 'ksi pup', '船尾座 ο': 'omi pup', '船尾座 π': 'pi. pup', '船尾座 ρ': 'rho pup', '船尾座 σ': 'sig pup', '船尾座 τ': 'tau pup', '船尾座 χ': 'chi pup', '船尾座 a': 'a pup', '船尾座 b': 'b pup', '船尾座 c': 'c pup', '船尾座 d1': 'd1 pup', '船尾座 d2': 'd2 pup', '船尾座 d3': 'd3 pup', '船尾座 d4': 'd4 pup', '船尾座 e': 'e pup', '船尾座 f': 'f pup', '船尾座 h1': 'h1 pup', '船尾座 h2': 'h2 pup', '船尾座 j': 'j pup', '船尾座 k': 'k pup', '船尾座 l': 'l pup', '船尾座 m': 'm pup', '船尾座 n': 'n pup', '船尾座 p': 'p pup', '船尾座 q': 'q pup', '船尾座 r': 'r pup', '船尾座 t': 't pup', '船尾座 v1': 'v1 pup', '船尾座 v2': 'v2 pup', '船尾座 w': 'w pup', '船尾座 x': 'x pup', '船尾座 y': 'y pup', '船尾座 y1': 'y1 pup', '船尾座 y2': 'y2 pup', '船尾座 y3': 'y3 pup', '船尾座 z': 'z pup', '船尾座 A': 'a pup', '船尾座 C': 'c pup', '船尾座 D': 'd pup', '船尾座 E': 'e pup', '船尾座 F': 'f pup', '船尾座 G': 'g pup', '船尾座 H': 'h pup', '船尾座 I': 'i pup', '船尾座 J': 'j pup', '船尾座 L1': 'l1 pup', '船尾座 L2': 'l2 pup', '船尾座 M': 'm pup', '船尾座 N': 'n pup', '船尾座 O': 'o pup', '船尾座 P': 'p pup', '船尾座 Q': 'q pup', '船尾座 1': '1 pup', '船尾座 2': '2 pup', '船尾座 3': '3 pup', '船尾座 4': '4 pup', '船尾座 5': '5 pup', '船尾座 6': '6 pup', '船尾座 7': '7 pup', '船尾座 8': '8 pup', '船尾座 9': '9 pup', '船尾座 10': '10 pup', '船尾座 11': '11 pup', '船尾座 12': '12 pup', '船尾座 13': '13 pup', '船尾座 14': '14 pup', '船尾座 15': '15 pup', '船尾座 16': '16 pup', '船尾座 18': '18 pup', '船尾座 19': '19 pup', '船尾座 20': '20 pup', '船尾座 21': '21 pup', '船尾座 22': '22 pup', '船尾座 59': '59 pup', '船尾座 61': '61 pup', '船尾座 70': '70 pup', '船尾座 71': '71 pup', '船尾座 72': '72 pup', '船尾座 138': '138 pup', '船尾座 140': '140 pup', '船尾座 142': '142 pup', '船尾座 171': '171 pup', '船尾座 188': '188 pup', '船尾座 212': '212 pup', '罗盘座 α': 'alf pyx', '罗盘座 β': 'bet pyx', '罗盘座 γ': 'gam pyx', '罗盘座 δ': 'del pyx', '罗盘座 ε': 'eps pyx', '罗盘座 ζ': 'zet pyx', '罗盘座 η': 'eta pyx', '罗盘座 θ': 'tet pyx', '罗盘座 κ': 'kap pyx', '罗盘座 λ': 'lam pyx', '网罟座 α': 'alf ret', '网罟座 β': 'bet ret', '网罟座 γ': 'gam ret', '网罟座 δ': 'del ret', '网罟座 ε': 'eps ret', '网罟座 ζ1': 'zet1 ret', '网罟座 ζ2': 'zet2 ret', '网罟座 η': 'eta ret', '网罟座 θ': 'tet ret', '网罟座 ι': 'iot ret', '网罟座 κ': 'kap ret', '天箭座 α': 'alf sge', '天箭座 β': 'bet sge', '天箭座 γ': 'gam sge', '天箭座 δ': 'del sge', '天箭座 ε': 'eps sge', '天箭座 ζ': 'zet sge', '天箭座 η': 'eta sge', '天箭座 θ': 'tet sge', '天箭座 1': '1 sge', '天箭座 2': '2 sge', '天箭座 3': '3 sge', '天箭座 4': '4 sge', '天箭座 5': '5 sge', '天箭座 6': '6 sge', '天箭座 7': '7 sge', '天箭座 8': '8 sge', '天箭座 9': '9 sge', '天箭座 10': '10 sge', '天箭座 11': '11 sge', '天箭座 12': '12 sge', '天箭座 13': '13 sge', '天箭座 14': '14 sge', '天箭座 15': '15 sge', '天箭座 16': '16 sge', '天箭座 17': '17 sge', '天箭座 18': '18 sge', '人马座 α': 'alf sgr', '人马座 β1': 'bet1 sgr', '人马座 β2': 'bet2 sgr', '人马座 γ': 'gam sgr', '人马座 γ1': 'gam1 sgr', '人马座 γ2': 'gam2 sgr', '人马座 δ': 'del sgr', '人马座 ε': 'eps sgr', '人马座 ζ': 'zet sgr', '人马座 η': 'eta sgr', '人马座 θ1': 'tet1 sgr', '人马座 θ2': 'tet2 sgr', '人马座 ι': 'iot sgr', '人马座 κ1': 'kap1 sgr', '人马座 κ2': 'kap2 sgr', '人马座 λ': 'lam sgr', '人马座 μ': 'mu. sgr', '人马座 ν1': 'nu.1 sgr', '人马座 ν2': 'nu.2 sgr', '人马座 ξ1': 'ksi1 sgr', '人马座 ξ2': 'ksi2 sgr', '人马座 ο': 'omi sgr', '人马座 π': 'pi. sgr', '人马座 ρ1': 'rho1 sgr', '人马座 ρ2': 'rho2 sgr', '人马座 σ': 'sig sgr', '人马座 τ': 'tau sgr', '人马座 υ': 'ups sgr', '人马座 φ': 'phi sgr', '人马座 χ1': 'chi1 sgr', '人马座 χ2': 'chi2 sgr', '人马座 χ3': 'chi3 sgr', '人马座 ψ': 'psi sgr', '人马座 ω': 'ome sgr', '人马座 b': 'b sgr', '人马座 c': 'c sgr', '人马座 d': 'd sgr', '人马座 e1': 'e1 sgr', '人马座 e2': 'e2 sgr', '人马座 f': 'f sgr', '人马座 g': 'g sgr', '人马座 h1': 'h1 sgr', '人马座 h2': 'h2 sgr', '人马座 A': 'a sgr', '人马座 1': '1 sgr', '人马座 2': '2 sgr', '人马座 3': '3 sgr', '人马座 4': '4 sgr', '人马座 5': '5 sgr', '人马座 6': '6 sgr', '人马座 7': '7 sgr', '人马座 9': '9 sgr', '人马座 10': '10 sgr', '人马座 11': '11 sgr', '人马座 12': '12 sgr', '人马座 13': '13 sgr', '人马座 14': '14 sgr', '人马座 15': '15 sgr', '人马座 16': '16 sgr', '人马座 17': '17 sgr', '人马座 18': '18 sgr', '人马座 19': '19 sgr', '人马座 20': '20 sgr', '人马座 21': '21 sgr', '人马座 22': '22 sgr', '人马座 23': '23 sgr', '人马座 24': '24 sgr', '人马座 25': '25 sgr', '人马座 26': '26 sgr', '人马座 27': '27 sgr', '人马座 28': '28 sgr', '人马座 29': '29 sgr', '人马座 30': '30 sgr', '人马座 31': '31 sgr', '人马座 32': '32 sgr', '人马座 33': '33 sgr', '人马座 34': '34 sgr', '人马座 35': '35 sgr', '人马座 36': '36 sgr', '人马座 37': '37 sgr', '人马座 38': '38 sgr', '人马座 39': '39 sgr', '人马座 40': '40 sgr', '人马座 41': '41 sgr', '人马座 42': '42 sgr', '人马座 43': '43 sgr', '人马座 44': '44 sgr', '人马座 45': '45 sgr', '人马座 46': '46 sgr', '人马座 47': '47 sgr', '人马座 48': '48 sgr', '人马座 49': '49 sgr', '人马座 50': '50 sgr', '人马座 51': '51 sgr', '人马座 52': '52 sgr', '人马座 53': '53 sgr', '人马座 54': '54 sgr', '人马座 55': '55 sgr', '人马座 56': '56 sgr', '人马座 57': '57 sgr', '人马座 58': '58 sgr', '人马座 59': '59 sgr', '人马座 60': '60 sgr', '人马座 61': '61 sgr', '人马座 62': '62 sgr', '人马座 63': '63 sgr', '人马座 64': '64 sgr', '人马座 65': '65 sgr', '人马座 70': '70 sgr', '天蝎座 α': 'alf sco', '天蝎座 β1': 'bet1 sco', '天蝎座 β2': 'bet2 sco', '天蝎座 δ': 'del sco', '天蝎座 ε': 'eps sco', '天蝎座 ζ1': 'zet1 sco', '天蝎座 ζ2': 'zet2 sco', '天蝎座 η': 'eta sco', '天蝎座 θ': 'tet sco', '天蝎座 ι1': 'iot1 sco', '天蝎座 ι2': 'iot2 sco', '天蝎座 κ': 'kap sco', '天蝎座 λ': 'lam sco', '天蝎座 μ1': 'mu.1 sco', '天蝎座 μ2': 'mu.2 sco', '天蝎座 ν': 'nu. sco', '天蝎座 ξ': 'ksi sco', '天蝎座 ο': 'omi sco', '天蝎座 π': 'pi. sco', '天蝎座 ρ': 'rho sco', '天蝎座 σ': 'sig sco', '天蝎座 τ': 'tau sco', '天蝎座 υ': 'ups sco', '天蝎座 χ': 'chi sco', '天蝎座 ψ': 'psi sco', '天蝎座 ω1': 'ome1 sco', '天蝎座 ω2': 'ome2 sco', '天蝎座 b': 'b sco', '天蝎座 c1': 'c1 sco', '天蝎座 c2': 'c2 sco', '天蝎座 d': 'd sco', '天蝎座 i': 'i sco', '天蝎座 k': 'k sco', '天蝎座 A': 'a sco', '天蝎座 G': 'g sco', '天蝎座 H': 'h sco', '天蝎座 N': 'n sco', '天蝎座 Q': 'q sco', '天蝎座 1': '1 sco', '天蝎座 2': '2 sco', '天蝎座 3': '3 sco', '天蝎座 4': '4 sco', '天蝎座 5': '5 sco', '天蝎座 6': '6 sco', '天蝎座 7': '7 sco', '天蝎座 8': '8 sco', '天蝎座 9': '9 sco', '天蝎座 10': '10 sco', '天蝎座 11': '11 sco', '天蝎座 12': '12 sco', '天蝎座 13': '13 sco', '天蝎座 14': '14 sco', '天蝎座 15': '15 sco', '天蝎座 16': '16 sco', '天蝎座 17': '17 sco', '天蝎座 18': '18 sco', '天蝎座 19': '19 sco', '天蝎座 20': '20 sco', '天蝎座 21': '21 sco', '天蝎座 22': '22 sco', '天蝎座 23': '23 sco', '天蝎座 24': '24 sco', '天蝎座 25': '25 sco', '天蝎座 26': '26 sco', '天蝎座 27': '27 sco', '天蝎座 28': '28 sco', '天蝎座 29': '29 sco', '天蝎座 30': '30 sco', '天蝎座 31': '31 sco', '天蝎座 32': '32 sco', '天蝎座 33': '33 sco', '天蝎座 34': '34 sco', '天蝎座 35': '35 sco', '玉夫座 α': 'alf scl', '玉夫座 β': 'bet scl', '玉夫座 γ': 'gam scl', '玉夫座 δ': 'del scl', '玉夫座 ε': 'eps scl', '玉夫座 ζ': 'zet scl', '玉夫座 η': 'eta scl', '玉夫座 θ': 'tet scl', '玉夫座 ι': 'iot scl', '玉夫座 κ1': 'kap1 scl', '玉夫座 κ2': 'kap2 scl', '玉夫座 λ1': 'lam1 scl', '玉夫座 λ2': 'lam2 scl', '玉夫座 μ': 'mu. scl', '玉夫座 ξ': 'ksi scl', '玉夫座 π': 'pi. scl', '玉夫座 σ': 'sig scl', '玉夫座 τ': 'tau scl', '盾牌座 α': 'alf sct', '天鹰座 1': '1 aql', '盾牌座 β': 'bet sct', '天鹰座 6': '6 aql', '盾牌座 γ': 'gam sct', '盾牌座 δ': 'del sct', '天鹰座 2': '2 aql', '盾牌座 ε': 'eps sct', '天鹰座 3': '3 aql', '盾牌座 ζ': 'zet sct', '盾牌座 η': 'eta sct', '天鹰座 9': '9 aql', '巨蛇座 α': 'alf ser', '巨蛇座 β': 'bet ser', '巨蛇座 γ': 'gam ser', '巨蛇座 δ': 'del ser', '巨蛇座 ε': 'eps ser', '巨蛇座 ζ': 'zet ser', '巨蛇座 η': 'eta ser', '巨蛇座 θ1': 'tet1 ser', '巨蛇座 θ2': 'tet2 ser', '巨蛇座 ι': 'iot ser', '巨蛇座 κ': 'kap ser', '巨蛇座 λ': 'lam ser', '巨蛇座 μ': 'mu. ser', '巨蛇座 ν': 'nu. ser', '巨蛇座 ξ': 'ksi ser', '巨蛇座 ο': 'omi ser', '巨蛇座 π': 'pi. ser', '巨蛇座 ρ': 'rho ser', '巨蛇座 σ': 'sig ser', '巨蛇座 τ1': 'tau1 ser', '巨蛇座 τ2': 'tau2 ser', '巨蛇座 τ3': 'tau3 ser', '巨蛇座 τ4': 'tau4 ser', '巨蛇座 τ5': 'tau5 ser', '巨蛇座 τ6': 'tau6 ser', '巨蛇座 τ7': 'tau7 ser', '巨蛇座 τ8': 'tau8 ser', '巨蛇座 υ': 'ups ser', '巨蛇座 φ': 'phi ser', '巨蛇座 χ': 'chi ser', '巨蛇座 ψ': 'psi ser', '巨蛇座 ω': 'ome ser', '巨蛇座 b': 'b ser', '巨蛇座 c': 'c ser', '巨蛇座 d': 'd ser', '巨蛇座 e': 'e ser', '巨蛇座 A1': 'a1 ser', '巨蛇座 A2': 'a2 ser', '巨蛇座 1': '1 ser', '巨蛇座 2': '2 ser', '巨蛇座 3': '3 ser', '巨蛇座 4': '4 ser', '巨蛇座 5': '5 ser', '巨蛇座 6': '6 ser', '巨蛇座 7': '7 ser', '巨蛇座 8': '8 ser', '巨蛇座 9': '9 ser', '巨蛇座 10': '10 ser', '巨蛇座 11': '11 ser', '巨蛇座 12': '12 ser', '巨蛇座 13': '13 ser', '巨蛇座 14': '14 ser', '巨蛇座 15': '15 ser', '巨蛇座 16': '16 ser', '巨蛇座 17': '17 ser', '巨蛇座 18': '18 ser', '巨蛇座 19': '19 ser', '巨蛇座 20': '20 ser', '巨蛇座 21': '21 ser', '巨蛇座 22': '22 ser', '巨蛇座 23': '23 ser', '巨蛇座 24': '24 ser', '巨蛇座 25': '25 ser', '巨蛇座 26': '26 ser', '巨蛇座 27': '27 ser', '巨蛇座 28': '28 ser', '巨蛇座 29': '29 ser', '巨蛇座 30': '30 ser', '巨蛇座 31': '31 ser', '巨蛇座 32': '32 ser', '巨蛇座 34': '34 ser', '巨蛇座 35': '35 ser', '巨蛇座 36': '36 ser', '巨蛇座 37': '37 ser', '巨蛇座 38': '38 ser', '巨蛇座 39': '39 ser', '巨蛇座 40': '40 ser', '巨蛇座 41': '41 ser', '巨蛇座 43': '43 ser', '巨蛇座 44': '44 ser', '巨蛇座 45': '45 ser', '巨蛇座 46': '46 ser', '巨蛇座 47': '47 ser', '巨蛇座 48': '48 ser', '巨蛇座 49': '49 ser', '巨蛇座 50': '50 ser', '巨蛇座 51': '51 ser', '巨蛇座 53': '53 ser', '巨蛇座 55': '55 ser', '巨蛇座 56': '56 ser', '巨蛇座 57': '57 ser', '巨蛇座 58': '58 ser', '巨蛇座 59': '59 ser', '巨蛇座 60': '60 ser', '巨蛇座 61': '61 ser', '巨蛇座 62': '62 ser', '巨蛇座 63': '63 ser', '巨蛇座 64': '64 ser', '六分仪座 α': 'alf sex', '六分仪座 β': 'bet sex', '六分仪座 γ': 'gam sex', '六分仪座 δ': 'del sex', '六分仪座 ε': 'eps sex', '六分仪座 1': '1 sex', '六分仪座 2': '2 sex', '六分仪座 3': '3 sex', '六分仪座 4': '4 sex', '六分仪座 5': '5 sex', '六分仪座 6': '6 sex', '六分仪座 7': '7 sex', '六分仪座 8': '8 sex', '六分仪座 9': '9 sex', '六分仪座 10': '10 sex', '六分仪座 11': '11 sex', '六分仪座 12': '12 sex', '六分仪座 13': '13 sex', '六分仪座 14': '14 sex', '六分仪座 15': '15 sex', '六分仪座 16': '16 sex', '六分仪座 17': '17 sex', '六分仪座 18': '18 sex', '六分仪座 19': '19 sex', '六分仪座 20': '20 sex', '六分仪座 21': '21 sex', '六分仪座 22': '22 sex', '六分仪座 23': '23 sex', '六分仪座 24': '24 sex', '六分仪座 25': '25 sex', '六分仪座 26': '26 sex', '六分仪座 27': '27 sex', '六分仪座 29': '29 sex', '六分仪座 30': '30 sex', '六分仪座 31': '31 sex', '六分仪座 32': '32 sex', '六分仪座 33': '33 sex', '六分仪座 34': '34 sex', '六分仪座 35': '35 sex', '六分仪座 36': '36 sex', '六分仪座 37': '37 sex', '六分仪座 38': '38 sex', '六分仪座 39': '39 sex', '六分仪座 40': '40 sex', '六分仪座 41': '41 sex', '金牛座 α': 'alf tau', '金牛座 β': 'bet tau', '金牛座 γ': 'gam tau', '金牛座 δ1': 'del1 tau', '金牛座 δ2': 'del2 tau', '金牛座 δ3': 'del3 tau', '金牛座 ε': 'eps tau', '金牛座 ζ': 'zet tau', '金牛座 η': 'eta tau', '金牛座 θ1': 'tet1 tau', '金牛座 θ2': 'tet2 tau', '金牛座 ι': 'iot tau', '金牛座 κ1': 'kap1 tau', '金牛座 κ2': 'kap2 tau', '金牛座 λ': 'lam tau', '金牛座 μ': 'mu. tau', '金牛座 ν': 'nu. tau', '金牛座 ξ': 'ksi tau', '金牛座 ο': 'omi tau', '金牛座 π': 'pi. tau', '金牛座 ρ': 'rho tau', '金牛座 σ1': 'sig1 tau', '金牛座 σ2': 'sig2 tau', '金牛座 τ': 'tau tau', '金牛座 υ': 'ups tau', '金牛座 φ': 'phi tau', '金牛座 χ': 'chi tau', '金牛座 ψ': 'psi tau', '金牛座 ω': 'ome tau', '金牛座 ω1': 'ome1 tau', '金牛座 ω2': 'ome2 tau', '金牛座 b': 'b tau', '金牛座 c': 'c tau', '金牛座 d': 'd tau', '金牛座 e': 'e tau', '金牛座 f': 'f tau', '金牛座 g': 'g tau', '金牛座 h': 'h tau', '金牛座 i': 'i tau', '金牛座 k': 'k tau', '金牛座 l': 'l tau', '金牛座 m': 'm tau', '金牛座 n': 'n tau', '金牛座 o': 'o tau', '金牛座 p': 'p tau', '金牛座 q': 'q tau', '金牛座 r': 'r tau', '金牛座 s': 's tau', '金牛座 t': 't tau', '金牛座 u': 'u tau', '金牛座 A1': 'a1 tau', '金牛座 A2': 'a2 tau', '金牛座 1': '1 tau', '金牛座 2': '2 tau', '金牛座 4': '4 tau', '金牛座 5': '5 tau', '金牛座 6': '6 tau', '金牛座 7': '7 tau', '金牛座 9': '9 tau', '金牛座 10': '10 tau', '金牛座 11': '11 tau', '金牛座 12': '12 tau', '金牛座 13': '13 tau', '金牛座 14': '14 tau', '金牛座 16': '16 tau', '金牛座 17': '17 tau', '金牛座 18': '18 tau', '金牛座 19': '19 tau', '金牛座 20': '20 tau', '金牛座 21': '21 tau', '金牛座 22': '22 tau', '金牛座 23': '23 tau', '金牛座 25': '25 tau', '金牛座 26': '26 tau', '金牛座 27': '27 tau', '金牛座 28': '28 tau', '金牛座 29': '29 tau', '金牛座 30': '30 tau', '金牛座 31': '31 tau', '金牛座 32': '32 tau', '金牛座 33': '33 tau', '金牛座 35': '35 tau', '金牛座 36': '36 tau', '金牛座 37': '37 tau', '金牛座 38': '38 tau', '金牛座 39': '39 tau', '金牛座 40': '40 tau', '金牛座 41': '41 tau', '金牛座 42': '42 tau', '金牛座 43': '43 tau', '金牛座 44': '44 tau', '金牛座 45': '45 tau', '金牛座 46': '46 tau', '金牛座 47': '47 tau', '金牛座 48': '48 tau', '金牛座 49': '49 tau', '金牛座 50': '50 tau', '金牛座 51': '51 tau', '金牛座 52': '52 tau', '金牛座 53': '53 tau', '金牛座 54': '54 tau', '金牛座 55': '55 tau', '金牛座 56': '56 tau', '金牛座 57': '57 tau', '金牛座 58': '58 tau', '金牛座 59': '59 tau', '金牛座 60': '60 tau', '金牛座 61': '61 tau', '金牛座 62': '62 tau', '金牛座 63': '63 tau', '金牛座 64': '64 tau', '金牛座 65': '65 tau', '金牛座 66': '66 tau', '金牛座 67': '67 tau', '金牛座 68': '68 tau', '金牛座 69': '69 tau', '金牛座 70': '70 tau', '金牛座 71': '71 tau', '金牛座 72': '72 tau', '金牛座 73': '73 tau', '金牛座 74': '74 tau', '金牛座 75': '75 tau', '金牛座 76': '76 tau', '金牛座 77': '77 tau', '金牛座 78': '78 tau', '金牛座 79': '79 tau', '金牛座 80': '80 tau', '金牛座 81': '81 tau', '金牛座 83': '83 tau', '金牛座 84': '84 tau', '金牛座 85': '85 tau', '金牛座 86': '86 tau', '金牛座 87': '87 tau', '金牛座 88': '88 tau', '金牛座 89': '89 tau', '金牛座 90': '90 tau', '金牛座 91': '91 tau', '金牛座 92': '92 tau', '金牛座 93': '93 tau', '金牛座 94': '94 tau', '金牛座 95': '95 tau', '金牛座 96': '96 tau', '金牛座 97': '97 tau', '金牛座 98': '98 tau', '金牛座 99': '99 tau', '金牛座 101': '101 tau', '金牛座 102': '102 tau', '金牛座 103': '103 tau', '金牛座 104': '104 tau', '金牛座 105': '105 tau', '金牛座 106': '106 tau', '金牛座 107': '107 tau', '金牛座 108': '108 tau', '金牛座 109': '109 tau', '金牛座 110': '110 tau', '金牛座 111': '111 tau', '金牛座 112': '112 tau', '御夫座 γ': 'gam aur', '御夫座 23': '23 aur', '金牛座 113': '113 tau', '金牛座 114': '114 tau', '金牛座 115': '115 tau', '金牛座 116': '116 tau', '金牛座 117': '117 tau', '金牛座 118': '118 tau', '金牛座 119': '119 tau', '金牛座 120': '120 tau', '金牛座 121': '121 tau', '金牛座 122': '122 tau', '金牛座 123': '123 tau', '金牛座 125': '125 tau', '金牛座 126': '126 tau', '金牛座 127': '127 tau', '金牛座 128': '128 tau', '金牛座 129': '129 tau', '金牛座 130': '130 tau', '金牛座 131': '131 tau', '金牛座 132': '132 tau', '金牛座 133': '133 tau', '金牛座 134': '134 tau', '金牛座 135': '135 tau', '金牛座 136': '136 tau', '金牛座 137': '137 tau', '金牛座 139': '139 tau', '金牛座 140': '140 tau', '金牛座 141': '141 tau', '望远镜座 α': 'alf tel', '望远镜座 δ1': 'del1 tel', '望远镜座 δ2': 'del2 tel', '望远镜座 ε': 'eps tel', '望远镜座 ζ': 'zet tel', '望远镜座 η': 'eta tel', '望远镜座 ι': 'iot tel', '望远镜座 κ': 'kap tel', '望远镜座 λ': 'lam tel', '望远镜座 μ': 'mu. tel', '望远镜座 ν': 'nu. tel', '望远镜座 ξ': 'ksi tel', '望远镜座 ρ': 'rho tel', '三角座 α': 'alf tri', '三角座 β': 'bet tri', '三角座 γ': 'gam tri', '三角座 δ': 'del tri', '三角座 ε': 'eps tri', '三角座 ι': 'iot tri', '三角座 1': '1 tri', '三角座 2': '2 tri', '三角座 3': '3 tri', '三角座 4': '4 tri', '三角座 5': '5 tri', '三角座 6': '6 tri', '三角座 7': '7 tri', '三角座 8': '8 tri', '三角座 9': '9 tri', '三角座 10': '10 tri', '三角座 11': '11 tri', '三角座 12': '12 tri', '三角座 13': '13 tri', '三角座 14': '14 tri', '三角座 15': '15 tri', '三角座 16': '16 tri', '南三角座 α': 'alf tra', '南三角座 β': 'bet tra', '南三角座 γ': 'gam tra', '南三角座 δ': 'del tra', '南三角座 ε': 'eps tra', '南三角座 ζ': 'zet tra', '南三角座 η1': 'eta1 tra', '南三角座 θ': 'tet tra', '南三角座 ι': 'iot tra', '南三角座 κ': 'kap tra', '杜鹃座 α': 'alf tuc', '杜鹃座 β1': 'bet1 tuc', '杜鹃座 β2': 'bet2 tuc', '杜鹃座 γ': 'gam tuc', '杜鹃座 δ': 'del tuc', '杜鹃座 ε': 'eps tuc', '杜鹃座 ζ': 'zet tuc', '杜鹃座 η': 'eta tuc', '杜鹃座 θ': 'tet tuc', '杜鹃座 ι': 'iot tuc', '杜鹃座 κ': 'kap tuc', '杜鹃座 λ': 'lam tuc', '杜鹃座 λ1': 'lam1 tuc', '杜鹃座 λ2': 'lam2 tuc', '杜鹃座 ν': 'nu. tuc', '杜鹃座 π': 'pi. tuc', '杜鹃座 ρ': 'rho tuc', '大熊座 α': 'alf uma', '大熊座 β': 'bet uma', '大熊座 γ': 'gam uma', '大熊座 δ': 'del uma', '大熊座 ε': 'eps uma', '大熊座 ζ': 'zet uma', '大熊座 η': 'eta uma', '大熊座 θ': 'tet uma', '大熊座 ι': 'iot uma', '大熊座 κ': 'kap uma', '大熊座 λ': 'lam uma', '大熊座 μ': 'mu. uma', '大熊座 ν': 'nu. uma', '大熊座 ξ': 'ksi uma', '大熊座 ο': 'omi uma', '大熊座 π1': 'pi.1 uma', '大熊座 π2': 'pi.2 uma', '大熊座 ρ': 'rho uma', '大熊座 σ1': 'sig1 uma', '大熊座 σ2': 'sig2 uma', '大熊座 τ': 'tau uma', '大熊座 υ': 'ups uma', '大熊座 φ': 'phi uma', '大熊座 χ': 'chi uma', '大熊座 ψ': 'psi uma', '大熊座 ω': 'ome uma', '大熊座 b': 'b uma', '大熊座 c': 'c uma', '大熊座 d': 'd uma', '大熊座 e': 'e uma', '大熊座 f': 'f uma', '大熊座 g': 'g uma', '大熊座 h': 'h uma', '大熊座 A': 'a uma', '大熊座 1': '1 uma', '大熊座 2': '2 uma', '大熊座 3': '3 uma', '大熊座 4': '4 uma', '大熊座 5': '5 uma', '大熊座 6': '6 uma', '大熊座 8': '8 uma', '大熊座 9': '9 uma', '大熊座 10': '10 uma', '大熊座 11': '11 uma', '大熊座 12': '12 uma', '大熊座 13': '13 uma', '大熊座 14': '14 uma', '大熊座 15': '15 uma', '大熊座 16': '16 uma', '大熊座 17': '17 uma', '大熊座 18': '18 uma', '大熊座 19': '19 uma', '大熊座 20': '20 uma', '大熊座 21': '21 uma', '大熊座 22': '22 uma', '大熊座 23': '23 uma', '大熊座 24': '24 uma', '大熊座 25': '25 uma', '大熊座 26': '26 uma', '大熊座 27': '27 uma', '大熊座 28': '28 uma', '大熊座 29': '29 uma', '大熊座 30': '30 uma', '大熊座 31': '31 uma', '大熊座 32': '32 uma', '大熊座 33': '33 uma', '大熊座 35': '35 uma', '大熊座 34': '34 uma', '大熊座 36': '36 uma', '大熊座 37': '37 uma', '大熊座 38': '38 uma', '大熊座 39': '39 uma', '大熊座 40': '40 uma', '大熊座 41': '41 uma', '大熊座 42': '42 uma', '大熊座 43': '43 uma', '大熊座 44': '44 uma', '大熊座 45': '45 uma', '大熊座 46': '46 uma', '大熊座 47': '47 uma', '大熊座 48': '48 uma', '大熊座 49': '49 uma', '大熊座 50': '50 uma', '大熊座 51': '51 uma', '大熊座 52': '52 uma', '大熊座 53': '53 uma', '大熊座 54': '54 uma', '大熊座 55': '55 uma', '大熊座 56': '56 uma', '大熊座 57': '57 uma', '大熊座 58': '58 uma', '大熊座 59': '59 uma', '大熊座 60': '60 uma', '大熊座 61': '61 uma', '大熊座 62': '62 uma', '大熊座 63': '63 uma', '大熊座 64': '64 uma', '大熊座 65': '65 uma', '大熊座 66': '66 uma', '大熊座 67': '67 uma', '大熊座 68': '68 uma', '大熊座 69': '69 uma', '大熊座 70': '70 uma', '大熊座 71': '71 uma', '大熊座 72': '72 uma', '大熊座 73': '73 uma', '大熊座 74': '74 uma', '大熊座 75': '75 uma', '大熊座 76': '76 uma', '大熊座 77': '77 uma', '大熊座 78': '78 uma', '大熊座 79': '79 uma', '大熊座 80': '80 uma', '大熊座 81': '81 uma', '大熊座 82': '82 uma', '大熊座 83': '83 uma', '大熊座 84': '84 uma', '大熊座 85': '85 uma', '大熊座 86': '86 uma', '大熊座 87': '87 uma', '小熊座 α': 'alf umi', '小熊座 β': 'bet umi', '小熊座 γ': 'gam umi', '小熊座 δ': 'del umi', '小熊座 ε': 'eps umi', '小熊座 ζ': 'zet umi', '小熊座 η': 'eta umi', '小熊座 θ': 'tet umi', '小熊座 λ': 'lam umi', '小熊座 π1': 'pi.1 umi', '小熊座 π2': 'pi.2 umi', '小熊座 1': '1 umi', '小熊座 2': '2 umi', '小熊座 3': '3 umi', '小熊座 4': '4 umi', '小熊座 5': '5 umi', '小熊座 6': '6 umi', '小熊座 7': '7 umi', '小熊座 8': '8 umi', '小熊座 9': '9 umi', '小熊座 10': '10 umi', '小熊座 11': '11 umi', '小熊座 12': '12 umi', '小熊座 13': '13 umi', '小熊座 14': '14 umi', '小熊座 15': '15 umi', '小熊座 16': '16 umi', '小熊座 17': '17 umi', '小熊座 18': '18 umi', '小熊座 19': '19 umi', '小熊座 20': '20 umi', '小熊座 21': '21 umi', '小熊座 22': '22 umi', '小熊座 23': '23 umi', '小熊座 24': '24 umi', '船帆座 γ': 'gam vel', '船帆座 γ2': 'gam2 vel', '船帆座 δ': 'del vel', '船帆座 κ': 'kap vel', '船帆座 λ': 'lam vel', '船帆座 μ': 'mu. vel', '船帆座 ο': 'omi vel', '船帆座 φ': 'phi vel', '船帆座 ψ': 'psi vel', '船帆座 a': 'a vel', '船帆座 b': 'b vel', '船帆座 c': 'c vel', '船帆座 d': 'd vel', '船帆座 e': 'e vel', '船帆座 f': 'f vel', '船帆座 g': 'g vel', '船帆座 h': 'h vel', '船帆座 i': 'i vel', '船帆座 k': 'k vel', '船帆座 k1': 'k1 vel', '船帆座 l': 'l vel', '船帆座 m': 'm vel', '船帆座 n': 'n vel', '船帆座 p': 'p vel', '船帆座 q': 'q vel', '船帆座 r': 'r vel', '船帆座 s': 's vel', '船帆座 t': 't vel', '船帆座 u': 'u vel', '船帆座 w': 'w vel', '船帆座 x': 'x vel', '船帆座 y': 'y vel', '船帆座 z': 'z vel', '船帆座 A': 'a vel', '船帆座 B': 'b vel', '船帆座 C': 'c vel', '船帆座 D': 'd vel', '船帆座 E': 'e vel', '船帆座 F': 'f vel', '船帆座 H': 'h vel', '船帆座 I': 'i vel', '船帆座 J': 'j vel', '船帆座 K': 'k vel', '船帆座 L': 'l vel', '船帆座 M': 'm vel', '船帆座 N': 'n vel', '船帆座 O': 'o vel', '船帆座 Q': 'q vel', '船帆座 16': '16 vel', '船帆座 33': '33 vel', '船帆座 47': '47 vel', '船帆座 154': '154 vel', '室女座 α': 'alf vir', '室女座 β': 'bet vir', '室女座 γ': 'gam vir', '室女座 δ': 'del vir', '室女座 ε': 'eps vir', '室女座 ζ': 'zet vir', '室女座 η': 'eta vir', '室女座 θ': 'tet vir', '室女座 ι': 'iot vir', '室女座 κ': 'kap vir', '室女座 λ': 'lam vir', '室女座 μ': 'mu. vir', '室女座 ν': 'nu. vir', '室女座 ξ': 'ksi vir', '室女座 ο': 'omi vir', '室女座 π': 'pi. vir', '室女座 ρ': 'rho vir', '室女座 σ': 'sig vir', '室女座 τ': 'tau vir', '室女座 υ': 'ups vir', '室女座 φ': 'phi vir', '室女座 χ': 'chi vir', '室女座 ψ': 'psi vir', '室女座 ω': 'ome vir', '室女座 b': 'b vir', '室女座 c': 'c vir', '室女座 d1': 'd1 vir', '室女座 d2': 'd2 vir', '室女座 e': 'e vir', '室女座 f': 'f vir', '室女座 g': 'g vir', '室女座 h': 'h vir', '室女座 i': 'i vir', '室女座 k': 'k vir', '室女座 l': 'l vir', '室女座 m': 'm vir', '室女座 o': 'o vir', '室女座 p': 'p vir', '室女座 q': 'q vir', '室女座 y': 'y vir', '室女座 A1': 'a1 vir', '室女座 A2': 'a2 vir', '室女座 M': 'm vir', '室女座 1': '1 vir', '室女座 2': '2 vir', '室女座 3': '3 vir', '室女座 4': '4 vir', '室女座 5': '5 vir', '室女座 6': '6 vir', '室女座 7': '7 vir', '室女座 8': '8 vir', '室女座 9': '9 vir', '室女座 10': '10 vir', '室女座 11': '11 vir', '室女座 12': '12 vir', '室女座 13': '13 vir', '室女座 14': '14 vir', '室女座 15': '15 vir', '室女座 16': '16 vir', '室女座 17': '17 vir', '室女座 20': '20 vir', '室女座 21': '21 vir', '室女座 25': '25 vir', '室女座 26': '26 vir', '室女座 27': '27 vir', '室女座 28': '28 vir', '室女座 29': '29 vir', '室女座 30': '30 vir', '室女座 31': '31 vir', '室女座 32': '32 vir', '室女座 33': '33 vir', '室女座 34': '34 vir', '室女座 35': '35 vir', '室女座 36': '36 vir', '室女座 37': '37 vir', '室女座 38': '38 vir', '室女座 40': '40 vir', '室女座 41': '41 vir', '室女座 43': '43 vir', '室女座 44': '44 vir', '室女座 46': '46 vir', '室女座 47': '47 vir', '室女座 48': '48 vir', '室女座 49': '49 vir', '室女座 50': '50 vir', '室女座 51': '51 vir', '室女座 53': '53 vir', '室女座 54': '54 vir', '室女座 55': '55 vir', '室女座 56': '56 vir', '室女座 57': '57 vir', '室女座 58': '58 vir', '室女座 59': '59 vir', '室女座 60': '60 vir', '室女座 61': '61 vir', '室女座 62': '62 vir', '室女座 63': '63 vir', '室女座 64': '64 vir', '室女座 65': '65 vir', '室女座 66': '66 vir', '室女座 67': '67 vir', '室女座 68': '68 vir', '室女座 69': '69 vir', '室女座 70': '70 vir', '室女座 71': '71 vir', '室女座 72': '72 vir', '室女座 73': '73 vir', '室女座 74': '74 vir', '室女座 75': '75 vir', '室女座 76': '76 vir', '室女座 77': '77 vir', '室女座 78': '78 vir', '室女座 79': '79 vir', '室女座 80': '80 vir', '室女座 81': '81 vir', '室女座 82': '82 vir', '室女座 83': '83 vir', '室女座 84': '84 vir', '室女座 85': '85 vir', '室女座 86': '86 vir', '室女座 87': '87 vir', '室女座 88': '88 vir', '室女座 89': '89 vir', '室女座 90': '90 vir', '室女座 92': '92 vir', '室女座 93': '93 vir', '室女座 94': '94 vir', '室女座 95': '95 vir', '室女座 96': '96 vir', '室女座 97': '97 vir', '室女座 98': '98 vir', '室女座 99': '99 vir', '室女座 100': '100 vir', '室女座 101': '101 vir', '室女座 102': '102 vir', '室女座 103': '103 vir', '室女座 104': '104 vir', '室女座 105': '105 vir', '室女座 106': '106 vir', '室女座 107': '107 vir', '室女座 108': '108 vir', '室女座 109': '109 vir', '室女座 110': '110 vir', '室女座 236': '236 vir', '飞鱼座 α': 'alf vol', '飞鱼座 β': 'bet vol', '飞鱼座 γ1': 'gam1 vol', '飞鱼座 γ2': 'gam2 vol', '飞鱼座 δ': 'del vol', '飞鱼座 ε': 'eps vol', '飞鱼座 ζ': 'zet vol', '飞鱼座 η': 'eta vol', '飞鱼座 θ': 'tet vol', '飞鱼座 ι': 'iot vol', '飞鱼座 κ1': 'kap1 vol', '飞鱼座 κ2': 'kap2 vol', '狐狸座 α': 'alf vul', '狐狸座 1': '1 vul', '狐狸座 2': '2 vul', '狐狸座 3': '3 vul', '狐狸座 4': '4 vul', '狐狸座 5': '5 vul', '狐狸座 6': '6 vul', '狐狸座 7': '7 vul', '狐狸座 8': '8 vul', '狐狸座 9': '9 vul', '狐狸座 10': '10 vul', '狐狸座 12': '12 vul', '狐狸座 13': '13 vul', '狐狸座 14': '14 vul', '狐狸座 15': '15 vul', '狐狸座 16': '16 vul', '狐狸座 17': '17 vul', '狐狸座 18': '18 vul', '狐狸座 19': '19 vul', '狐狸座 20': '20 vul', '狐狸座 21': '21 vul', '狐狸座 22': '22 vul', '狐狸座 23': '23 vul', '狐狸座 24': '24 vul', '狐狸座 25': '25 vul', '狐狸座 26': '26 vul', '狐狸座 27': '27 vul', '狐狸座 28': '28 vul', '狐狸座 29': '29 vul', '狐狸座 30': '30 vul', '狐狸座 31': '31 vul', '狐狸座 32': '32 vul', '狐狸座 33': '33 vul', '狐狸座 34': '34 vul', '狐狸座 35': '35 vul', }; export { starZH2EN }; ================================================ FILE: src/interface/utils.js ================================================ // 获取原始星星数据 function getOriginalStars(interactPhoto) { let stars = []; for (let i = 1; i <= interactPhoto.CeleArray.num(); i++) { const coordXInput = document.getElementById(`coordX${i}`); const coordYInput = document.getElementById(`coordY${i}`); let coordX = parseFloat(coordXInput.dataset.rawValue ?? coordXInput.value); let coordY = parseFloat(coordYInput.dataset.rawValue ?? coordYInput.value); let name = document.getElementById(`name${i}`).value; stars.push({ x: coordX, y: coordY, name: name, lon: (getHADE(i)[0] / 180) * Math.PI, lat: (getHADE(i)[1] / 180) * Math.PI, }); } return stars; } // 获取铅垂线端点坐标 function getGlobalPLPointsCoord(interactPhoto) { let globalPLPointsCoord = []; for (let i = 0; i < interactPhoto.PLArray.num(); i++) { let pl = interactPhoto.PLArray.array[i]; let points = []; for (let j = 0; j < pl.points.length; j++) { points.push(pl.points[j].coordinate); } globalPLPointsCoord.push(points); } return globalPLPointsCoord; } // 设置参考时角和赤纬,将角度数值化为度/时分秒形式 function setHADE(id, hourAngle, declination) { const rawHourAngle = hourAngle; const rawDeclination = declination; let sign = hourAngle < 0 ? '-' : ''; hourAngle = Math.abs(hourAngle) / 15; document.getElementById(`hAngleH${id}`).textContent = sign + parseInt(hourAngle); hourAngle = (hourAngle - parseInt(hourAngle)) * 60; document.getElementById(`hAngleM${id}`).textContent = parseInt(hourAngle); hourAngle = (hourAngle - parseInt(hourAngle)) * 60; const hAngleS = document.getElementById(`hAngleS${id}`); hAngleS.textContent = roundTo(hourAngle, 2); hAngleS.dataset.rawValue = rawHourAngle; sign = declination < 0 ? '-' : ''; declination = Math.abs(declination); document.getElementById(`declinD${id}`).textContent = sign + parseInt(declination); declination = (declination - parseInt(declination)) * 60; document.getElementById(`declinM${id}`).textContent = parseInt(declination); declination = (declination - parseInt(declination)) * 60; const declinS = document.getElementById(`declinS${id}`); declinS.textContent = roundTo(declination, 2); declinS.dataset.rawValue = rawDeclination; } // 转换参考时角和赤纬,将度/时分秒形式转化为角度数值 function getHADE(id) { const hAngleSInput = document.getElementById(`hAngleS${id}`); const declinSInput = document.getElementById(`declinS${id}`); const rawHourAngle = parseFloat(hAngleSInput.dataset.rawValue); const rawDeclination = parseFloat(declinSInput.dataset.rawValue); if ( Number.isFinite(rawHourAngle) && Number.isFinite(rawDeclination) && isDisplayedHADEUnchanged(id, rawHourAngle, rawDeclination) ) { return [rawHourAngle, rawDeclination]; } let hAngleH = parseInt(document.getElementById(`hAngleH${id}`).textContent); let hAngleM = parseInt(document.getElementById(`hAngleM${id}`).textContent); let hAngleS = parseFloat(document.getElementById(`hAngleS${id}`).textContent); let hourSign = hAngleH < 0 ? -1 : 1; let declinD = parseInt(document.getElementById(`declinD${id}`).textContent); let declinM = parseInt(document.getElementById(`declinM${id}`).textContent); let declinS = parseFloat(document.getElementById(`declinS${id}`).textContent); let decSign = declinD < 0 ? -1 : 1; let hourAngle = hourSign * (Math.abs(hAngleH) + hAngleM / 60 + hAngleS / 3600) * 15; let declination = decSign * (Math.abs(declinD) + declinM / 60 + declinS / 3600); return [hourAngle, declination]; } function roundTo(num, digits) { const tmp = 10 ** digits; return Math.round(num * tmp) / tmp; } function formatHADE(hourAngle, declination) { let sign = hourAngle < 0 ? '-' : ''; hourAngle = Math.abs(hourAngle) / 15; const hAngleH = sign + parseInt(hourAngle); hourAngle = (hourAngle - parseInt(hourAngle)) * 60; const hAngleM = String(parseInt(hourAngle)); hourAngle = (hourAngle - parseInt(hourAngle)) * 60; const hAngleS = String(roundTo(hourAngle, 2)); sign = declination < 0 ? '-' : ''; declination = Math.abs(declination); const declinD = sign + parseInt(declination); declination = (declination - parseInt(declination)) * 60; const declinM = String(parseInt(declination)); declination = (declination - parseInt(declination)) * 60; const declinS = String(roundTo(declination, 2)); return { hAngleH, hAngleM, hAngleS, declinD, declinM, declinS }; } function isDisplayedHADEUnchanged(id, hourAngle, declination) { const displayed = formatHADE(hourAngle, declination); return ( document.getElementById(`hAngleH${id}`).textContent === displayed.hAngleH && document.getElementById(`hAngleM${id}`).textContent === displayed.hAngleM && document.getElementById(`hAngleS${id}`).textContent === displayed.hAngleS && document.getElementById(`declinD${id}`).textContent === displayed.declinD && document.getElementById(`declinM${id}`).textContent === displayed.declinM && document.getElementById(`declinS${id}`).textContent === displayed.declinS ); } // json数据的POST请求 async function post(url, data, Type) { try { let response; if (Type === 'form') { let formData = new FormData(); for (let key in data) { if (data[key] instanceof Array) { for (let item of data[key]) { formData.append(key, item); } } else { formData.append(key, data[key]); } } response = await fetch(url, { method: 'POST', body: formData, }); } else if (Type === 'json') { response = await fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify(data), }); } else { throw new Error('Invalid POST request type'); } let results = await response.json(); let detail = results?.detail ?? 'success'; if (!response.ok) { results = null; detail = results?.detail ?? `HTTP ${response.status}`; } return [results, detail]; } catch (error) { console.error(error.message); return [null, error.message]; } } export { getOriginalStars, getGlobalPLPointsCoord, post, setHADE, getHADE }; ================================================ FILE: webpack.common.js ================================================ /* eslint-disable no-undef */ const path = require('path'); const HtmlWebpackPlugin = require('html-webpack-plugin'); const MiniCssExtractPlugin = require('mini-css-extract-plugin'); const CssMinimizerPlugin = require('css-minimizer-webpack-plugin'); const Handlebars = require('handlebars'); const { BACKEND_API } = require('./src/config'); const version = require('./package.json').version; module.exports = { entry: { sitecss: './src/css/site.css', main: './src/index.js', }, output: { filename: '[name].js', path: path.resolve(__dirname, 'dist'), publicPath: 'auto', clean: true, }, module: { rules: [ { test: /\.css$/i, use: [MiniCssExtractPlugin.loader, 'css-loader'], // 从右向左解析 }, { test: /\.(png|svg|jpg|jpeg|gif)$/i, type: 'asset/resource', }, { test: /\.html$/i, loader: 'html-loader', options: { preprocessor: (content, loaderContext) => { // 文本替换 let result; try { result = Handlebars.compile(content)({ back_host: BACKEND_API, version: version, }); } catch (error) { loaderContext.emitError(error); return content; } return result; }, }, }, ], }, plugins: [ new HtmlWebpackPlugin({ template: './src/index.html', // 指定模板文件的位置 filename: 'index.html', // 设置生成的HTML文件名 }), new HtmlWebpackPlugin({ template: './src/help.html', // 指定模板文件的位置 filename: 'help.html', // 设置生成的HTML文件名 chunks: ['sitecss'], // 指定需要加载的chunk }), new MiniCssExtractPlugin({ filename: '[name].css', }), ], optimization: { minimizer: [`...`, new CssMinimizerPlugin()], }, }; /* eslint-enable no-undef */ ================================================ FILE: webpack.dev.js ================================================ /* eslint-disable no-undef */ const { merge } = require('webpack-merge'); const common = require('./webpack.common.js'); module.exports = merge(common, { mode: 'development', devtool: 'eval-source-map', devServer: { port: 6974, }, }); /* eslint-enable no-undef */ ================================================ FILE: webpack.prod.js ================================================ /* eslint-disable no-undef */ const { merge } = require('webpack-merge'); const common = require('./webpack.common.js'); module.exports = merge(common, { mode: 'production', }); /* eslint-enable no-undef */