用postgreSQL做基于地理位置的app
前言:项目中用到了postgreSQL中的earthdistance()函数功能计算地球上两点之间的距离,中文的资料太少了,我找到了一篇英文的、讲的很好的文章 ,特此翻译,希望能够帮助到以后用到earthdistance的同学。 一、两种可用的选择 当我们想用Postgres作为GEO函数
前言:项目中用到了postgreSQL中的earthdistance()函数功能计算地球上两点之间的距离,中文的资料太少了,我找到了一篇英文的、讲的很好的文章 ,特此翻译,希望能够帮助到以后用到earthdistance的同学。
一、两种可用的选择
当我们想用Postgres作为GEO函数使用时,我们通常有2中选择(据我所知):
1.PostGIS: 为postgreSQL提供了高级GEO函数功能。我用了它一段时间,但是它对于我的需求来说太笨重了。
2.Cube和Earthdistance: 这两个拓展为轻量级的Geo关系实体提供了简单、快速的实现方法。
二、为什么在数据库服务器端做计算
这是件非常明显的事。服务器存储了所有的数据,服务器拓展是用C/C++实现的,非常快。为数据表做索引也能加快计算速度。
三、使用我的选择--Cube and EarthDistance
作为开始,你应该先建一个数据库(我想你知道该怎么做),然后使它们能用我们的架构。 执行:
?
1
2
CREATE EXTENSION cube;
CREATE EXTENSION earthdistance;
上面的命令创建了大约40个函数,以后我们做数据查询的时候就可以用了。
在我们的例子中,我创建了名为events的表,字段有:id(serial), name(varchar 255), lat(double), lng(double)。(别忘了~~)
四、计算2个坐标之间的距离
计算2个坐标之间的距离,我们要用到earth_distance(ll_to_earth($latlngcube), ll_to_earth($latlng_cube))这个函数。 earth_distance()函数接受2组坐标值,返回值一个以米为单位的的数值。这能用于很多场景,比如根据某一位置找到离其最近的发生的新闻事件的列表。
【译者注】这里要提下几个重要的函数:(参考:)
Table F-3. Cube-based earthdistance functions
Function Returns Description
earth() float8 Returns the assumed radius of the Earth.
sec_to_gc(float8) float8 Converts the normal straight line (secant) distance between between two points on the surface of the Earth to the great circle distance between them.
gc_to_sec(float8) float8 Converts the great circle distance between two points on the surface of the Earth to the normal straight line (secant) distance between them.
ll_to_earth(float8, float8) earth Returns the location of a point on the surface of the Earth given its latitude (argument 1) and longitude (argument 2) in degrees.
latitude(earth) float8 Returns the latitude in degrees of a point on the surface of the Earth.
longitude(earth) float8 Returns the longitude in degrees of a point on the surface of the Earth.
earth_distance(earth, earth) float8 Returns the great circle distance between two points on the surface of the Earth.
earth_box(earth, float8) cube Returns a box suitable for an indexed search using the cube @> operator for points within a given great circle distance of a location. Some points in this box are further than the specified great circle distance from the location, so a second check using earth_distance should be included in the query.
数据库的操作可能就像下面这样:
?
1
2
3
SELECT events.id events.name, eaerthdiatance(ll_to_earth({currentuserlat}, {currentuserlng}), llto_earth(events.lat, events.lng))
as distancefromcurrentlocation FROM events
ORDER BY distancefromcurretnlocation ASC;
这将给我们一个很nice的新闻事件列表,按他们的离我们当前位置的距离由近到远排序。第一个是离我们最近的。
五、找到某个半径范围内的记录
Cube和Earthdiatance拓展提供的另一个伟大的函数是earth_box(ll_to_earch($latlngcub), $radiusinmetres)。 这个函数通过简单的比较就能到找到某个半径范围内的所有记录。它是靠返回2点之间的“大圆距离”实现的。
【译者注】大圆距离(Great circle disstance)指的是从球面的一点A出发到达球面上另一点B,所经过的最短路径的长度。一般说来,,球面上任意两点A和B都可以与球心确定唯一的大圆,这个大圆被称为黎曼圆,而在大圆上连接这两点的较短的一条弧的长度就是大圆距离。如果想了解更多,请看wiki:大圆距离
它能用于查询我们城市中所有的新闻事件:
?
1
2
SELECT events.id, events.name FROM events
WHERE earth_box({currentuserlat}, {currentuserlng}, {radiusinmetres}) @> ll_to_earth(events.lat, events.lng);
这条查询语句仅仅会返回在radius_in_metres指定的半径范围内的记录,非常简单吧!
六、提高查询速度
你可能会发现上面的查询有不小的开销。以我的经验,最好对一些字段建立索引。 (下面这条语句假定你又events表, 同时events表有字段lat和lng)
?
1
CREATE INDEX ${nameofindex} on events USING gits(lltoearth(lat, lng));
七、数据类型
我的应用比较简单,所以我把经纬度(lat和lng)都设成了double类型。这使得我用Node.js开发起来更加快速,而不用再去自己定制针对GIST类型的解决方案。
八、就这些!
很神奇,对么?!?我们仅仅用常用的数据类型(double)就足以去用一些GEO函数创建基于地理位置的社交app(【译者注】知乎上的一个回答)!
---------------------------
英语水平有限,如有翻译不周之处,请您指点!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











예, 다음과 같이 Douyin IP 위치를 수정할 수 있습니다. Douyin을 열고 프로필을 편집하세요. 도시 정보를 수정하고 표시하려는 도시 또는 지역을 선택하세요. 변경 사항을 적용하려면 로그아웃했다가 다시 로그인하세요.

예, 보안, 개인화 서비스 및 계정 관리를 위해 Amap에는 휴대폰 번호 등록이 필요합니다. 등록 단계는 다음과 같습니다: Amap 앱을 열고 "내" 및 "로그인/등록"을 클릭하고 등록할 휴대폰 번호를 선택하고 인증 코드를 받기 위해 휴대폰 번호를 입력하고 등록을 완료하기 위해 비밀번호를 설정합니다.

사진과 동영상을 웨이보에 동시에 게시하는 방법은 다음과 같습니다. 관련되거나 보완적인 사진과 동영상을 선택하세요. Weibo 클라이언트를 열고 게시 버튼을 클릭하세요. "사진 및 비디오" 탭을 선택하세요. 사진 및 동영상을 추가하세요(최대 9개의 사진과 1개의 동영상). 텍스트를 입력하고 관련 정보를 추가하세요. 그냥 출판하세요.

짧은 동영상에 초점을 맞춘 소셜 플랫폼인 Douyin의 추천 알고리즘은 핵심 기능 중 하나입니다. 사용자의 관심분야와 행동을 기반으로 관련 동영상 콘텐츠를 추천할 수 있습니다. 때때로 사용자는 자신의 선호도에 더 부합하는 콘텐츠를 얻기 위해 추천 알고리즘을 재설정하기를 원할 수 있습니다. 그렇다면 Douyin 추천을 재설정하는 방법은 무엇입니까? Douyin 추천을 추천으로 변경하는 방법은 무엇입니까? 이 기사에서는 두 가지 질문에 대한 답변을 모두 제공합니다. 1. Douyin 추천을 재설정하는 방법은 무엇입니까? 1. Douyin 앱을 열고 개인 홈페이지에 들어갑니다. 2. 오른쪽 상단에 있는 "설정" 아이콘을 클릭하여 설정 페이지로 들어갑니다. 3. 설정 페이지에서 '권장 관리' 옵션을 찾아 클릭해 들어갑니다. 4. 추천 관리 페이지에서는 귀하의 관심 태그와 관심 선호도를 확인할 수 있습니다. 다른 항목을 선택하거나 선택 취소할 수 있습니다.

Douyin 추천은 추천 동영상 유형 조정, 관심 있는 제작자 팔로우, 싫어하는 콘텐츠 차단, 동영상 언어 설정, 지리적 위치 제한, 인기 주제 팔로우, 검색/탐색 기록 삭제 등을 포함한 "콘텐츠 기본 설정" 설정을 변경하여 변경할 수 있습니다.

Douyin 위치 권한을 수정하는 단계: 1. Douyin 앱을 열고 "나"를 클릭하세요. 2. 오른쪽 상단에 있는 "가로 막대 3개 아이콘"을 클릭하세요. 3. 설정을 선택합니다. 4. "개인정보 설정"을 찾아 클릭하세요. 5. "위치 서비스"를 클릭하세요. 6. 적절하게 타겟팅 허용 또는 사용할 때만 묻기를 선택합니다. 7. 수정 후 Douyin 애플리케이션을 다시 시작해야 적용됩니다.

Douyin 시간대 설정은 변경할 수 없으며, 시간대는 현재 지리적 위치를 기준으로 자동으로 설정됩니다.

1. 먼저 카메라를 열고 오른쪽 상단에 있는 설정 아이콘을 클릭합니다. 2. 위치정보 및 자동 워터마크 스위치를 끕니다.
