SQL 쿼리로 가장 가까운 위도 / 경도 찾기


183

위도와 경도가 있고 거리에 가장 가까운 위도와 경도가있는 데이터베이스에서 레코드를 가져오고 싶습니다. 해당 거리가 지정된 거리보다 길어지면 검색하지 마십시오.

테이블 구조 :

id
latitude
longitude
place name
city
country
state
zip
sealevel

1
이것은 근접 검색 질문 의 일종의 중복입니다 .
Darius Bacon

1
MySQL을 사용한 Geo (근접) 검색 에 대한 Alexander Rubin의 슬라이드 세트 (PDF 링크)
Martijn Pieters

답변:


224
SELECT latitude, longitude, SQRT(
    POW(69.1 * (latitude - [startlat]), 2) +
    POW(69.1 * ([startlng] - longitude) * COS(latitude / 57.3), 2)) AS distance
FROM TableName HAVING distance < 25 ORDER BY distance;

여기서 [starlat][startlng] 는 거리 측정을 시작할 위치입니다.


50
성능 참고 사항입니다. 거리 변수를 sqrt하지 않고 대신 '25'테스트 값을 제곱하는 것이 가장 좋습니다. 나중에 거리를 표시해야하는 경우 통과 한 결과를 sqrt
sradforth

10
거리에 대한 동일한 쿼리는 무엇입니까? (현재 마일 단위입니다. 맞습니까?)
httpete

8
그 25는 얼마입니까?
Steffan Donal 2013 년

17
여기서 명확히하기 위해 69.1은 마일에서 위도까지의 변환 계수입니다. 57.3은 대략 180 / pi이므로 코사인 함수에 대해 각도에서 라디안으로 변환됩니다. 25는 마일 단위의 검색 반경입니다. 이것은 십진수도 및 법령 마일을 사용할 때 사용하는 공식입니다.
John Vance 2013

8
또한 지구의 곡률을 고려하지 않습니다. 짧은 검색 반경에서는 문제가되지 않습니다. 그렇지 않으면 Evan과 Igor의 답변이 더 완벽합니다.
John Vance 2013

72

Google의 솔루션 :

테이블 생성

MySQL 테이블을 생성 할 때 lat 및 lng 속성에 특히주의해야합니다. Google지도의 현재 확대 / 축소 기능을 사용하면 소수점 이하 6 자리의 정밀도 만 필요합니다. 테이블에 필요한 스토리지 공간을 최소한으로 유지하기 위해 lat 및 lng 속성이 부동 소수점 크기 (10,6)임을 지정할 수 있습니다. 그러면 필드가 소수점 이하 6 자리와 소수점 이하 최대 4 자리 (예 : -123.456789도)를 저장할 수 있습니다. 테이블에는 기본 키 역할을 할 id 속성도 있어야합니다.

CREATE TABLE `markers` (
  `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
  `name` VARCHAR( 60 ) NOT NULL ,
  `address` VARCHAR( 80 ) NOT NULL ,
  `lat` FLOAT( 10, 6 ) NOT NULL ,
  `lng` FLOAT( 10, 6 ) NOT NULL
) ENGINE = MYISAM ;

테이블 채우기

테이블을 만든 후 데이터로 채울 시간입니다. 아래 제공된 샘플 데이터는 미국 전역에 흩어져있는 약 180 개의 피자 리아에 대한 것입니다. phpMyAdmin에서 가져 오기 탭을 사용하여 CSV (쉼표로 구분 된 값)를 포함한 다양한 파일 형식을 가져올 수 있습니다. Microsoft Excel 및 Google 스프레드 시트는 모두 CSV 형식으로 내보내므로 CSV 파일 내보내기 / 가져 오기를 통해 스프레드 시트에서 MySQL 테이블로 데이터를 쉽게 전송할 수 있습니다.

INSERT INTO `markers` (`name`, `address`, `lat`, `lng`) VALUES ('Frankie Johnnie & Luigo Too','939 W El Camino Real, Mountain View, CA','37.386339','-122.085823');
INSERT INTO `markers` (`name`, `address`, `lat`, `lng`) VALUES ('Amici\'s East Coast Pizzeria','790 Castro St, Mountain View, CA','37.38714','-122.083235');
INSERT INTO `markers` (`name`, `address`, `lat`, `lng`) VALUES ('Kapp\'s Pizza Bar & Grill','191 Castro St, Mountain View, CA','37.393885','-122.078916');
INSERT INTO `markers` (`name`, `address`, `lat`, `lng`) VALUES ('Round Table Pizza: Mountain View','570 N Shoreline Blvd, Mountain View, CA','37.402653','-122.079354');
INSERT INTO `markers` (`name`, `address`, `lat`, `lng`) VALUES ('Tony & Alba\'s Pizza & Pasta','619 Escuela Ave, Mountain View, CA','37.394011','-122.095528');
INSERT INTO `markers` (`name`, `address`, `lat`, `lng`) VALUES ('Oregano\'s Wood-Fired Pizza','4546 El Camino Real, Los Altos, CA','37.401724','-122.114646');

MySQL로 위치 찾기

지정된 위도 / 경도의 특정 반경 거리 내에있는 마커 테이블에서 위치를 찾으려면 Haversine 수식을 기반으로하는 SELECT 문을 사용할 수 있습니다. Haversine 공식은 일반적으로 구에있는 두 좌표 쌍 사이의 대원 거리를 계산하는 데 사용됩니다. 심도있는 수학적 설명은 Wikipedia에서 제공하며 프로그래밍과 관련된 공식에 대한 좋은 토론은 Movable Type의 사이트에 있습니다.

다음은 37, -122 좌표에 대해 반경 25 마일 내에있는 가장 가까운 20 개의 위치를 ​​찾는 SQL 문입니다. 해당 행의 위도 / 경도와 대상 위도 / 경도를 기반으로 거리를 계산 한 다음 거리 값이 25 미만인 행만 요청하고 전체 쿼리를 거리별로 정렬 한 다음 결과를 20 개로 제한합니다. 마일 대신 킬로미터로 검색하려면 3959를 6371로 바꿉니다.

SELECT 
id, 
(
   3959 *
   acos(cos(radians(37)) * 
   cos(radians(lat)) * 
   cos(radians(lng) - 
   radians(-122)) + 
   sin(radians(37)) * 
   sin(radians(lat )))
) AS distance 
FROM markers 
HAVING distance < 28 
ORDER BY distance LIMIT 0, 20;

이것은 28 마일 미만의 거리에서 위도와 경도를 찾는 것입니다.

또 다른 방법은 28 마일에서 29 마일 사이의 거리에서 찾는 것입니다.

SELECT 
id, 
(
   3959 *
   acos(cos(radians(37)) * 
   cos(radians(lat)) * 
   cos(radians(lng) - 
   radians(-122)) + 
   sin(radians(37)) * 
   sin(radians(lat )))
) AS distance 
FROM markers 
HAVING distance < 29 and distance > 28 
ORDER BY distance LIMIT 0, 20;

https://developers.google.com/maps/articles/phpsqlsearch_v3#creating-the-map


1
HAVING distance < 25반경 25 마일 이내의 위치를 ​​쿼리 해야합니까 ?
Vitalii Elenhaupt

그 다음은 모든 레코드를 검색합니다> 25해야
vidur punj

25 이상에 대해 @vidurpunj 확실합니까?
Amranur Rahman

... 샘플 마커 거리로 모두 25 위입니다 .. 어떤 결과를 거리 <25 만 발견 : 나는 사용하여 SQL 쿼리를 시도하지
IbrahimShendy

37, -122 좌표, 거리를 구해야하는 위치에서의 위도와 경도입니까?
Prasobh.Kollattu

28

다음은 PHP로 구현 된 전체 솔루션입니다.

이 솔루션은 http://www.scribd.com/doc/2569355/Geo-Distance-Search-with-MySQL에 제시된 Haversine 공식을 사용합니다 .

Haversine 공식은 극 주변에서 약점을 경험한다는 점에 유의해야합니다. 이 답변 은이 문제를 해결하기 위해 vincenty Great Circle Distance 공식 을 구현하는 방법을 보여 주지만 , 내 목적에 충분하기 때문에 Haversine을 사용하기로 선택했습니다.

위도를 DECIMAL (10,8)로, 경도를 DECIMAL (11,8)로 저장하고 있습니다. 도움이 되었기를 바랍니다.

showClosest.php

<?PHP
/**
 * Use the Haversine Formula to display the 100 closest matches to $origLat, $origLon
 * Only search the MySQL table $tableName for matches within a 10 mile ($dist) radius.
 */
include("./assets/db/db.php"); // Include database connection function
$db = new database(); // Initiate a new MySQL connection
$tableName = "db.table";
$origLat = 42.1365;
$origLon = -71.7559;
$dist = 10; // This is the maximum distance (in miles) away from $origLat, $origLon in which to search
$query = "SELECT name, latitude, longitude, 3956 * 2 * 
          ASIN(SQRT( POWER(SIN(($origLat - latitude)*pi()/180/2),2)
          +COS($origLat*pi()/180 )*COS(latitude*pi()/180)
          *POWER(SIN(($origLon-longitude)*pi()/180/2),2))) 
          as distance FROM $tableName WHERE 
          longitude between ($origLon-$dist/cos(radians($origLat))*69) 
          and ($origLon+$dist/cos(radians($origLat))*69) 
          and latitude between ($origLat-($dist/69)) 
          and ($origLat+($dist/69)) 
          having distance < $dist ORDER BY distance limit 100"; 
$result = mysql_query($query) or die(mysql_error());
while($row = mysql_fetch_assoc($result)) {
    echo $row['name']." > ".$row['distance']."<BR>";
}
mysql_close($db);
?>

./assets/db/db.php

<?PHP
/**
 * Class to initiate a new MySQL connection based on $dbInfo settings found in dbSettings.php
 *
 * @example $db = new database(); // Initiate a new database connection
 * @example mysql_close($db); // close the connection
 */
class database{
    protected $databaseLink;
    function __construct(){
        include "dbSettings.php";
        $this->database = $dbInfo['host'];
        $this->mysql_user = $dbInfo['user'];
        $this->mysql_pass = $dbInfo['pass'];
        $this->openConnection();
        return $this->get_link();
    }
    function openConnection(){
    $this->databaseLink = mysql_connect($this->database, $this->mysql_user, $this->mysql_pass);
    }

    function get_link(){
    return $this->databaseLink;
    }
}
?>

./assets/db/dbSettings.php

<?php
$dbInfo = array(
    'host'      => "localhost",
    'user'      => "root",
    'pass'      => "password"
);
?>

위에 게시 된 "Geo-Distance-Search-with-MySQL"기사에서 제안한대로 MySQL 저장 프로 시저를 사용하여 성능을 향상시킬 수 있습니다.

~ 17,000 개 장소의 데이터베이스가 있고 쿼리 실행 시간은 0.054 초입니다.


Km 또는 미터 단위로 거리를 어떻게 얻을 수 있습니까? 문안 인사!
chemitaxis

2
마일 * 1.609344 = km
신안 Dizdarević

2
경고. 탁월한 솔루션이지만 버그가 있습니다. 모두 abs제거해야합니다. 도에서 라디안으로 변환 할 때 abs 값을 취할 필요가 없으며, 그렇게하더라도 위도 중 하나에 만 수행하는 것입니다. 버그를 수정하도록 수정하세요.
Chango

1
그리고 이것을 미터 단위로 원하는 사람을 위해 : 3956 마일을 킬로미터로 변환하십시오 : 지구 반경; 69 마일을 킬로미터로 변환 : 위도 1 도의 근사 길이 (km) 그리고 거리를 킬로미터 단위로 입력하십시오.
Chango

1
그리고 교체 69와 함께 111,044736(잊어 그 위의 코멘트에서)
rkeet

24

당신이 나처럼 게으른 경우를 대비하여 여기에 이것과 다른 답변을 합친 솔루션이 있습니다.

set @orig_lat=37.46; 
set @orig_long=-122.25; 
set @bounding_distance=1;

SELECT
*
,((ACOS(SIN(@orig_lat * PI() / 180) * SIN(`lat` * PI() / 180) + COS(@orig_lat * PI() / 180) * COS(`lat` * PI() / 180) * COS((@orig_long - `long`) * PI() / 180)) * 180 / PI()) * 60 * 1.1515) AS `distance` 
FROM `cities` 
WHERE
(
  `lat` BETWEEN (@orig_lat - @bounding_distance) AND (@orig_lat + @bounding_distance)
  AND `long` BETWEEN (@orig_long - @bounding_distance) AND (@orig_long + @bounding_distance)
)
ORDER BY `distance` ASC
limit 25;

1
정확히 무엇을 bounding_distance나타 냅니까? 이 값은 결과를 마일로 제한합니까? 이 경우 1 마일 이내에 결과를 반환합니까?
james

1
@ bounding_distance는 여기서도 단위이며 유효 검색 영역을 제한하여 계산 속도를 높이는 데 사용됩니다. 예를 들어 사용자가 특정 도시에 있고 해당 도시 내에 몇 개의 지점이 있음을 알고 있다면 경계 거리를 몇 도로 안전하게 설정할 수 있습니다.
Evan

1
이것은 어떤 지리적 거리 공식을 사용하고 있습니까?
bbodenmiller

13

쉬운 것;)

SELECT * FROM `WAYPOINTS` W ORDER BY
ABS(ABS(W.`LATITUDE`-53.63) +
ABS(W.`LONGITUDE`-9.9)) ASC LIMIT 30;

좌표를 필요한 것으로 바꾸십시오. 값은 double로 저장되어야합니다. 이것은 작동하는 MySQL 5.x 예제가 아닙니다.

건배


2
왜 upvote, OP는 30으로 제한하지 않고 특정 거리로 제한하고 주문하고 싶어하는지 모르겠습니다.dx+dy
okm

3
이것은 나를 위해 해냈습니다. OP가 원했던 건 아니지만 제가 원했던 거니까 답변 해주셔서 감사합니다! :)
웹 마스터 G

가장 바깥 쪽 ABS ()이면 충분합니다.
dzona

8

질문에 대한 원래 답변은 좋지만 최신 버전의 mysql (MySQL 5.7.6 이상)은 지역 쿼리를 지원하므로 이제 복잡한 쿼리를 수행하는 대신 기본 제공 기능을 사용할 수 있습니다.

이제 다음과 같이 할 수 있습니다.

select *, ST_Distance_Sphere( point ('input_longitude', 'input_latitude'), 
                              point(longitude, latitude)) * .000621371192 
          as `distance_in_miles` 
  from `TableName`
having `distance_in_miles` <= 'input_max_distance'
 order by `distance_in_miles` asc

결과는 meters. 따라서 (마일에 해당하는) 대신 KM단순히 사용 하려는 경우 ..001.000621371192

MySql 문서가 여기 있습니다


가능하면 대답에 mysql 버전을 추가하십시오.
Parixit 2018 년

ST_Distance_Sphere내 호스트의 설치 ( mysql Ver 15.1 Distrib 10.2.23-MariaDB)에 존재하지 않습니다 . 나는 대체 할 곳을 읽었 ST_Distance지만 거리가 멀다.
ashleedawg

@ashleedawg-버전에서는 mysql의 포크 인 MariaDB를 사용하고 있다고 생각합니다. 에서 이 대화 MariaDB가 구현되지 않은 것 같습니다ST_Distance_Sphere
셔먼

6

이것을 시도하면 제공된 좌표에 가장 가까운 지점 (50km 이내)이 표시됩니다. 완벽하게 작동합니다.

SELECT m.name,
    m.lat, m.lon,
    p.distance_unit
             * DEGREES(ACOS(COS(RADIANS(p.latpoint))
             * COS(RADIANS(m.lat))
             * COS(RADIANS(p.longpoint) - RADIANS(m.lon))
             + SIN(RADIANS(p.latpoint))
             * SIN(RADIANS(m.lat)))) AS distance_in_km
FROM <table_name> AS m
JOIN (
      SELECT <userLat> AS latpoint, <userLon> AS longpoint,
             50.0 AS radius, 111.045 AS distance_unit
     ) AS p ON 1=1
WHERE m.lat
BETWEEN p.latpoint  - (p.radius / p.distance_unit)
    AND p.latpoint  + (p.radius / p.distance_unit)
    AND m.lon BETWEEN p.longpoint - (p.radius / (p.distance_unit * COS(RADIANS(p.latpoint))))
    AND p.longpoint + (p.radius / (p.distance_unit * COS(RADIANS(p.latpoint))))
ORDER BY distance_in_km

그냥 변경하십시오 <table_name>. <userLat><userLon>

이 솔루션에 대한 자세한 내용은 http://www.plumislandmedia.net/mysql/haversine-mysql-nearest-loc/에서 확인할 수 있습니다 .


5

당신은 haversine 공식 과 같은 것을 찾고 있습니다. 여기도 참조 하십시오 .

다른 것들이 있지만 이것이 가장 일반적으로 인용됩니다.

더 강력한 것을 찾고 있다면 데이터베이스 GIS 기능을 살펴볼 수 있습니다. 그들은 주어진 다각형 (지역, 국가, 대륙) 내에 점 (도시)이 나타나는지 여부를 알려주는 것과 같은 멋진 일을 할 수 있습니다.


실제로 가장 많이 인용되지만 다른 방법을 사용한 부정확 한 컴퓨팅에 대한 진술과 관련하여 많은 기사에서 오래된 컴퓨팅 하드웨어를 언급합니다. 참조 movable-type.co.uk/scripts/latlong.html#cosine-law
Arjan

4

Geo-Distance-Search-with-MySQL 기사를 기반으로이 코드를 확인하십시오 .

예 : 반경 10 마일 내 현재 위치에서 가장 가까운 호텔 10 개 찾기 :

#Please notice that (lat,lng) values mustn't be negatives to perform all calculations

set @my_lat=34.6087674878572; 
set @my_lng=58.3783670308302;
set @dist=10; #10 miles radius

SELECT dest.id, dest.lat, dest.lng,  3956 * 2 * ASIN(SQRT(POWER(SIN((@my_lat -abs(dest.lat)) * pi()/180 / 2),2) + COS(@my_lat * pi()/180 ) * COS(abs(dest.lat) *  pi()/180) * POWER(SIN((@my_lng - abs(dest.lng)) *  pi()/180 / 2), 2))
) as distance
FROM hotel as dest
having distance < @dist
ORDER BY distance limit 10;

#Also notice that distance are expressed in terms of radius.

3
simpledb.execSQL("CREATE TABLE IF NOT EXISTS " + tablename + "(id INTEGER PRIMARY KEY   AUTOINCREMENT,lat double,lng double,address varchar)");
            simpledb.execSQL("insert into '" + tablename + "'(lat,lng,address)values('22.2891001','70.780154','craftbox');");
            simpledb.execSQL("insert into '" + tablename + "'(lat,lng,address)values('22.2901396','70.7782428','kotecha');");//22.2904718 //70.7783906
            simpledb.execSQL("insert into '" + tablename + "'(lat,lng,address)values('22.2863155','70.772108','kkv Hall');");
            simpledb.execSQL("insert into '" + tablename + "'(lat,lng,address)values('22.275993','70.778076','nana mava');");
            simpledb.execSQL("insert into '" + tablename + "'(lat,lng,address)values('22.2667148','70.7609386','Govani boys hostal');");


    double curentlat=22.2667258;  //22.2677258
    double curentlong=70.76096826;//70.76096826

    double curentlat1=curentlat+0.0010000;
    double curentlat2=curentlat-0.0010000;

    double curentlong1=curentlong+0.0010000;
    double curentlong2=curentlong-0.0010000;

    try{

        Cursor c=simpledb.rawQuery("select * from '"+tablename+"' where (lat BETWEEN '"+curentlat2+"' and '"+curentlat1+"') or (lng BETWEEN         '"+curentlong2+"' and '"+curentlong1+"')",null);

        Log.d("SQL ", c.toString());
        if(c.getCount()>0)
        {
            while (c.moveToNext())
            {
                double d=c.getDouble(1);
                double d1=c.getDouble(2);

            }
        }
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }

3

가장 가까운 사용자 찾기 :

미터 거리

Vincenty의 공식에 기반

사용자 테이블이 있습니다.

+----+-----------------------+---------+--------------+---------------+
| id | email                 | name    | location_lat | location_long |
+----+-----------------------+---------+--------------+---------------+
| 13 | xxxxxx@xxxxxxxxxx.com | Isaac   | 17.2675625   | -97.6802361   |
| 14 | xxxx@xxxxxxx.com.mx   | Monse   | 19.392702    | -99.172596    |
+----+-----------------------+---------+--------------+---------------+

SQL :

-- my location:  lat   19.391124   -99.165660
SELECT 
(ATAN(
    SQRT(
        POW(COS(RADIANS(users.location_lat)) * SIN(RADIANS(users.location_long) - RADIANS(-99.165660)), 2) +
        POW(COS(RADIANS(19.391124)) * SIN(RADIANS(users.location_lat)) - 
       SIN(RADIANS(19.391124)) * cos(RADIANS(users.location_lat)) * cos(RADIANS(users.location_long) - RADIANS(-99.165660)), 2)
    )
    ,
    SIN(RADIANS(19.391124)) * 
    SIN(RADIANS(users.location_lat)) + 
    COS(RADIANS(19.391124)) * 
    COS(RADIANS(users.location_lat)) * 
    COS(RADIANS(users.location_long) - RADIANS(-99.165660))
 ) * 6371000) as distance,
users.id
FROM users
ORDER BY distance ASC

지구의 반경 : 6371000 (미터)


2

거리에 경계가있는 가장 가까운 이웃 검색을 수행하려는 것 같습니다. SQL은 내가 아는 한 이와 같은 것을 지원하지 않으며 R-tree 또는 kd-tree 와 같은 대체 데이터 구조를 사용해야합니다 .


1

MS SQL 에디션 :

        DECLARE @SLAT AS FLOAT
        DECLARE @SLON AS FLOAT

        SET @SLAT = 38.150785
        SET @SLON = 27.360249

        SELECT TOP 10 [LATITUDE], [LONGITUDE], SQRT(
            POWER(69.1 * ([LATITUDE] - @SLAT), 2) +
            POWER(69.1 * (@SLON - [LONGITUDE]) * COS([LATITUDE] / 57.3), 2)) AS distance
        FROM [TABLE] ORDER BY 3

1
 +----+-----------------------+---------+--------------+---------------+
| id | email                 | name    | location_lat | location_long |
+----+-----------------------+---------+--------------+---------------+
| 7  | test@gmail.com        | rembo   | 23.0249256   |  72.5269697   |
| 25 | test1@gmail.com.      | Rajnis  | 23.0233221    | 72.5342112   |
+----+-----------------------+---------+--------------+---------------+

$ lat = 23.02350629;

$ long = 72.53230239;

DB :: SELECT ( "SELECT * FROM (SELECT , (((acos (sin ((". $ lat. "* pi () / 180)) * sin (( lat* pi () / 180))) + cos (( ". $ lat." pi () / 180)) * cos (( lat* pi () / 180)) * cos ((( ". $ long."- LONG) * pi () / 180)))) * 180 / pi ()) * 60 * 1.1515 * 1.609344) as distance FROM users ) users WHERE distance <= 2 ");


가독성을 높이기 위해 쿼리 형식을 지정할 수 있습니다. 또한 코드를 붙여 넣을 때 적절한 태그를 사용하면 올바르게 표시됩니다.
Curious Mind

여기서 무슨 일이 일어나고 있는지 설명 할 수 있다면 좋을 것입니다. 복사하여 붙여 넣은 답변입니다
Diego

0

PostGIS, SpatialLite, SQLServer2008 또는 Oracle Spatial을 사용해야하는 것 같습니다. 그들은 모두 공간 SQL로이 질문에 답할 수 있습니다.


7
내가 "Oracle"을 명시 적으로 검색 할 때 사람들이 전체 데이터베이스 플랫폼을 전환하고 관련없는 결과가 내 Google 검색에 표시되도록 제안해서는 안되는 것처럼 들립니다
한 번 곰과 씨름했습니다.

0

극단적 인 경우이 방법은 실패하지만 성능을 위해 삼각법을 건너 뛰고 단순히 대각선 제곱을 계산했습니다.


-15

이 문제는 그다지 어렵지 않지만 최적화해야 할 경우 더 복잡해집니다.

내 말은, 데이터베이스에 100 개의 위치가 있습니까, 아니면 1 억개입니까? 그것은 큰 차이를 만듭니다.

위치 수가 적 으면 다음을 수행하여 SQL에서 코드로 가져옵니다.

Select * from Location

코드를 작성하면 Haversine 공식을 사용하여 각 위도 / 경도와 원본 사이의 거리를 계산하고 정렬합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.