POINT (X, Y)와 GeomFromText (“POINT (XY)”)의 차이점은 무엇입니까?


17

MySQL 데이터베이스에 기하학적 위치를 저장하고 싶습니다. 이를 위해 POINT 데이터 유형을 사용합니다. 거의 모든 곳에서 함수 GeomFromText를 사용하여 테이블에 데이터를 삽입해야 한다는 것을 읽었습니다 .

그러나 나는 그것이 POINT(X,Y)작동 한다는 것을 알았습니다 . 왜 GeomFromText대신 사용해야 하는 설명을 찾지 못했습니다 POINT.

예를 들어 다음과 같은 간단한 관계가 있습니다.

CREATE TABLE Site (
    SiteID      BIGINT UNSIGNED,
    Position    POINT
);

그리고 다음 두 가지 변형을 사용하여 값을 삽입 할 수 있습니다.

INSERT INTO Site (
    1,
    GeomFromText( 'POINT(48.19976 16.45572)' )
);

INSERT INTO Site (
    2,
    POINT(48.19976, 16.45572)
);

테이블 ( SELECT * FROM Site)을 볼 때 위치에 대해 동일한 이진 얼룩이 보이고 좌표 ( SELECT *, AsText(Position) FROM Site)를 볼 때도 동일한 값이 나타납니다.

왜 GeomFromText를 사용해야합니까? 이 두 변형 사이에 알려진 성능 차이가 있습니까? 이것은 MySQL 이외의 다른 데이터베이스 시스템에서 어떻게 해결됩니까?


성능 차이가 있는지 모르겠습니다 (추측은 아니지만 추측 일뿐입니다). 그러나 두 번째 방법은 다른 테이블에서 위도 및 경도 값을 변환 할 때 더 간단합니다. INSERT INTO Site (Position) SELECT POINT(latitude, longitude) FROM tmp보다 간단합니다...SELECT GeomFromText(CONCAT('POINT(',latitude,' ',longitude,')' )) ...
ypercubeᵀᴹ

또한 두 번째 변형이 구성하기가 훨씬 간단하다는 것을 알았습니다. 그래서 일반적으로 첫 번째 변형이 MySQL 공간 확장이 사용되는 거의 모든 곳에서 사용되는지 궁금합니다.
ComSubVie

방금 두 변형을 사용하여 위의 표에서 (내 호스트의) 10.000.000 위치를 삽입하려고 시도했지만 측정 가능한 성능 차이를 감지하지 못했습니다.
ComSubVie

답변:


16

MySQL 공간 확장과 관련된 두 가지 다른 이진 형식 , 표준의 "WKB (잘 알려진 이진 형식 )" 형식 및 MySQL 내부 GEOMETRY데이터 형식이 있습니다.

MySQL 5.1.35 이전에는 같은 함수 POINT()가 MySQL 내부 데이터 형식을 반환하지 않았습니다. 그들은 WKB를 반환했습니다 ... 그래서 그 전에는 이렇게해야했습니다.

INSERT INTO t1 (pt_col) VALUES (GeomFromWKB(Point(1,2)));

그러나 이제는 귀하의 예에서와 같이 작동합니다.

INSERT INTO t1 (pt_col) VALUES(Point(1,2));

개발자가 신용을 변경 Point()하고 유사한 기능을 사용하여 GEOMETRY객체 를 (더 이상하게) 반환하는 GeomFromWKB()경우 WKB 또는 MySQL Geometry 데이터를 입력으로 받아 들여도 실제로 유사한 기능을 입력으로 받아 들일 수있었습니다.

첫 번째 방법은 새로운 서버에서 (기술적으로 잘못 되었지만) 작동하고 두 번째 방법은 MySQL 5.1.35 이전에는 전혀 작동하지 않는다는 사실 은 사용자가 본 접근법을 사용하여 예제가 작성된 이유를 설명 할 수 있습니다. 문제를 완전히 피하십시오. 그렇지 않으면 ... 난 아무것도 없어

텍스트를 연결하고 구문 분석하는 것은 적절한 변수를 입력으로 받아들이는 함수보다 직관적으로 느리고 오류가 발생하기 쉬운 것처럼 보이므로 연결된 문자열을 만들고 텍스트 기반 함수를 사용해야하는 이유를 생각할 수 없습니다.

http://dev.mysql.com/doc/refman/5.1/en/creating-spatial-values.html#gis-wkb-functions

http://dev.mysql.com/doc/relnotes/mysql/5.1/en/news-5-1-35.html


1
고맙게도, 이것은 릴리스 노트와 문서에서 "각주"로만 언급된다는 점이 흥미 롭습니다. 따라서 텍스트 기반 방법에서 멀리 떨어져 있습니다.
ComSubVie

1
5 년이 지난 후에도 MySQL 문서에서 삽입시 ST_GeomFromText () 함수를 사용하는 예를 제공하는 이유는 무엇입니까? 이 답변은 여전히 ​​관련이 있습니까? 약간 혼란 스럽습니다. dev.mysql.com/doc/refman/5.7/en/populating-spatial-columns.html
Matt Kieran

1
@MattKieran WKB 및 WKT는 지리 공간 데이터를 표현하기위한 표준화 된 개방형 형식입니다. 표준 지향 지리 공간 응용 프로그램은 이미 이러한 형식으로 데이터를 보유 할 수 있기 때문에이 예제를 사용하므로 MySQL ST_GeomFromText()은 외부 응용 프로그램이 기하 객체를 구성하는 기본 SQL 함수를 사용하도록 요구하지 않고 외부 지오메트리를 단일 인수 및 유사한 변환 함수 로 받아 들일 수 있습니다. 에서 발견되는 공간 함수 참조 . 문서를 더 잘 정리할 수 있습니다.
Michael-sqlbot

또한 @MattKieran이 답변은 이전 예제가 문서가 나타내는 것과 반대로 작성된 이유, MySQL 이이 유형의 함수를 사용 하여이 방식으로 사용하는 것처럼 보이는 명백한 유형 불일치로 작동하는 이유를 설명한다는 의미에서 여전히 관련이 있습니다. 기본 SQL 함수, WKB (이진) 또는 WKT (텍스트)의 세 가지 방법이 모두 유효합니다. 더 이상 필요하지 않은 것은 반환 유형이 더 이상 WKB가 아니기 때문에 WKB 에서 기본 함수 리턴 값 수렴하는 것 입니다.
Michael-sqlbot

4

MySQL 8 이상

후손을 위해서만 중요한 것은

  • Point(X,Y)는 정밀도가 높은 숫자의 생성자이며 먼저 텍스트로 변환하여 더 빨리 만들 필요가 없습니다. 또한 반환 POINT또는 실패를 보장합니다 . 그렇게 생각하고 싶다면 강력하게 입력하십시오.
  • 텍스트 (WKT) 잘 알려진 생성자 :이은 항상 그들이 구문 분석 할 수있는 별도의 단계를 필요로, 느린 잘 알려진 텍스트 (WKT를) . 이전 버전에서는 ST_접두사 없이 찾을 수 있습니다 . 가능한 경우 ST_접두사가 있는 버전을 사용하십시오 . 입력 내용이 이미 잘 알려진 텍스트 인 경우에만 WKT 생성자를 사용하십시오. 그렇지 않은 경우 Point(x,y)위 의 생성자를 사용하십시오 .
    • ST_GeomFromText(wkt, srid)MySQL에서 지원하고 WKT로 나타낼 수있는 모든 공간 유형을 반환 할 수 있습니다. 이렇게 생각하면 느슨하게 입력 할 수 있습니다.
    • ST_PointFromText(wkt, srid)POINT잘 알려진 텍스트 의 강력한 형식의 생성자

명쾌함

역사 수업을 건너 뛰지 마십시오 GeomFromText(Point(x,y)). 그것은 끔찍하고, 지원되지 않으며, 문서화되지 않았습니다.


-1

GeomFromText 또는 다른 * FromText 함수를 사용하여 SRID를 지정할 수 있습니다 . 다른 방법으로는 할 수 없다고 생각합니다.

PointFromText('POINT(lat lng)', 4326)

이것은 POINT(lng lat)대신에 다른 방법이어야합니다POINT(lat lng)
Zishan

MySQL은 어쨌든 SRID를 사용하지 않습니다. 그래서 그것은 쓸모가 없습니다. SRID가 필요한 경우 PostgreSQL / PostGIS로 마이그레이션하십시오.
Evan Carroll

1
MySQL 8은 SRID를 사용합니다. 실제로 SRID로 인해 MySQL DB가 5.7에서 8로 정확하게 마이그레이션하는 데 문제가 있습니다.
cmoran92
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.