我已經(jīng)找到原因,是存入的點(diǎn)沒有閉合導(dǎo)致的。
創(chuàng)新互聯(lián)是專業(yè)的細(xì)河網(wǎng)站建設(shè)公司,細(xì)河接單;提供成都做網(wǎng)站、成都網(wǎng)站制作,網(wǎng)頁設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行細(xì)河網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來合作!
只要你的多邊形第一點(diǎn)和最后一個(gè)點(diǎn)是相同的就沒有問題。
插入代碼
INSERT?INTO?`region`?(name,lonlat_points)?VALUES?('one',POLYGONFROMTEXT('POLYGON((104.589612?28.793973,104.585012?28.724563,104.624107?28.693643,104.692522?28.72507,104.697696?28.773205,104.67125?28.808153,104.622382?28.810178,104.589612?28.793973))'))
更新代碼
update?region?set?name?=?'tow',lonlat_points?=?POLYGONFROMTEXT('POLYGON((104.613183?28.809165,104.613758?28.695671,104.720693?28.745847,104.682173?28.816761,104.613183?28.809165))')?where?id=1
1. 直接按字符串整個(gè)存進(jìn)去就好;
2. 或者你把度分秒的數(shù)字分開,分別存到三個(gè)數(shù)字類型的字段
正常的做法是用nvarchar保存,應(yīng)為google map,設(shè)置地點(diǎn)用String就可以了。
google.map({'center':'35.3232432434,139.32434234'})
復(fù)雜的計(jì)算,偉大的Google都已經(jīng)做了。我們?yōu)槭裁催€要再進(jìn)行一次呢?
告訴我,你們?yōu)槭裁捶堑米屪砸涯敲醇m結(jié)?難道人生最大的敵人永遠(yuǎn)都是自己。
建議你看下MongoDB數(shù)據(jù)庫。
MongoDB提供了一種GEO數(shù)據(jù)類型,專門處理地理位置坐標(biāo)的,跟你這個(gè)應(yīng)用場(chǎng)景極其吻合。
另外你的坐標(biāo)數(shù)量是海量的,用MySQL很難抗的住。
MySQL到千萬級(jí)的數(shù)據(jù)量就很吃力了。
兩種方式不同點(diǎn)在于前者把數(shù)據(jù)作為文件上傳,后者是把NSData作參POST上傳,覺得作為客戶端,其實(shí)工作量都差不多,關(guān)鍵是后臺(tái)了,另外,文件上傳的好處就是能知道上傳進(jìn)度,后者的亂碼,我不知道你怎么傳的,反正base64編碼后再上傳是沒問題的。
1. 直接按字符串整個(gè)存進(jìn)去就好;
2. 或者你把度分秒的數(shù)字分開,分別存到三個(gè)數(shù)字類型的字段
探索和學(xué)習(xí)MySQL中GIS相關(guān)功能和特性
這里記錄了學(xué)習(xí)和了解MySQL中GIS特性相關(guān)內(nèi)容的過程。
MySQL官方論壇中GIS的舉例
測(cè)試數(shù)據(jù)已經(jīng)導(dǎo)入成功,下面開始對(duì)GIS相關(guān)函數(shù)和GEOHASH進(jìn)行了解和體驗(yàn);
mysql中g(shù)eometry類型的簡(jiǎn)單使用
MySQL空間數(shù)據(jù)類型
經(jīng)緯度信息存儲(chǔ)在geometry格式的字段中,該字段必須非空。
MySQL8.0前按照longitude-latitude的順序存儲(chǔ)位置
MySQL8.0前按照longitude-latitude的順序存儲(chǔ)位置
MySQL8.0前按照longitude-latitude的順序存儲(chǔ)位置
插入數(shù)據(jù)時(shí)候可使用如下語句:
MySQL存儲(chǔ)geometry信息的方式采用了25bytes,相比WKB的21bytes,多了4bytes的坐標(biāo)系表示,組成部分如下:
WTF字符串格式說明
select ST_GeomFromText(WTF格式字符串);
WKT(Well-known text)是一種文本標(biāo)記語言,用于表示矢量幾何對(duì)象、空間參照系統(tǒng)及空間參照系統(tǒng)之間的轉(zhuǎn)換。通過WTF字符串生成geometry的方法:
點(diǎn): POINT(x y)
線: LINESTRING(x1 y1, x2 y2, x3 y3...)
多邊形: POLYGON((0 0, 10 0, 10 10,0 10,0 0),(5 5,7 5,7 7,5 7,5 5))
多點(diǎn)集: MULTIPOINT(0 0, 20 20, 60 60) 或 MULTIPOINT((0 0),(5 5),(5 0))
多線集: MULTILINESTRING((10 10, 20 20), (15 15, 30 15))
多多邊形集: MULTIPOLYGON(((0 0,10 0,10 10,0 10,0 0)),((5 5,7 5,7 7,5 7, 5 5)))
例如兩點(diǎn)一線組成的幾何集: GEOMETRYCOLLECTION(POINT(10 10), POINT(30 30), LINESTRING(15 15, 20 20))
A geometry is syntactically well-formed if it satisfies conditions such as those in this (nonexhaustive) list:
Collections are not empty (except GeometryCollection)
更多內(nèi)容參見
ST_PointFromText('POINT(X Y)');
ST_LineStringFromText('LINESTRING(0 0,1 1,2 2)');
ST_PolygonFromText('POLYGON((0 0,10 0,10 10,0 10,0 0),(5 5,7 5,7 7,5 7,5 5))');
ST_GeomCollFromText();
更多內(nèi)容參見
參見
Point(x,y)
LineString((x1,y1),(x2,y2)...)
Polygon(LineString(),LineString()....)
參見
ST_AsText()
ST_AsBinary()
ST_AsWKT()
參見
ST_Dimension(geom) :返回geom的維度(-1,0,1,2)
ST_Envelope(geom) :返回geom的最小外接矩形(MBR)
ST_GeometryType(geom) :返回geom的類型
ST_IsEmpty(geom) :該函數(shù)并不能真實(shí)的判空,當(dāng)geom為任何有效的幾何值時(shí)返回0,無效的幾何值返回1;
ST_IsSimple(geom) :當(dāng)geom無任何異常幾何點(diǎn)返回1(如自相交和自切線等),否則返回0
ST_SRID(geom) :返回geom的坐標(biāo)系ID
參見
ST_X(Point) :獲取Point的X值
ST_Y(Point) :獲取Point的Y值
參見
ST_StartPoint(linestrng) : 線的起點(diǎn)
ST_EndPoint(linestring) :返回線的最后一個(gè)點(diǎn)
ST_IsClosed(linestring或multilinestring) :線是否閉合(若為線,則判斷起點(diǎn)與終點(diǎn)是否一致;若為線組,則判斷組內(nèi)每個(gè)元素是否符合閉合線)
ST_Length(linestring) :返回線的長(zhǎng)度,若入?yún)榫€集,則返回集合內(nèi)所有長(zhǎng)度的和
ST_NumPoiints(linestring) :返回點(diǎn)的數(shù)量;
ST_PointN(linestring,N) :返回第N個(gè)點(diǎn)(從1開始)
參見
具體不在一一列舉,主要有計(jì)算多邊形面積、中心點(diǎn)、最小外接圓,最大內(nèi)接圓等函數(shù),列舉幾個(gè)可能會(huì)用到的:
ST_Area(Poly|mPoly) :返回雙精度的面積或面積的和
'ST_Centroid(Poly|mPoly)':返回?cái)?shù)學(xué)上的中心點(diǎn)
ST_ExteriorRing(Poly) :返回外接圓
參見
ST_Buffer說明
不再列舉,主要有:ST_Buffer(不懂干啥用),ST_ConvexHull(geom)凸包,ST_Dfference(g1,g2)比較差異,ST_Intersecton(g1,g2)交叉點(diǎn),ST_SymDifference(g1,g2)對(duì)稱差分,ST_Union(g1,g2)連接、合并等。
檢查geometry Objects之間的空間關(guān)系的方法。
參見
計(jì)算兩個(gè)Object之間的空間關(guān)系的函數(shù),有兩個(gè)間距離、相交、不相交,包含、相等、相切、重疊、接觸、在內(nèi)等等空間關(guān)系。下面列舉幾個(gè)可能會(huì)常用的方法:
ST_Contains(g1,g2) :g1是否完全包含g2
ST_Within(g1,g2) :g1是否包含于g2中
ST_Distance(g1,g2) :返回g1和g2之間的距離,已坐標(biāo)單位計(jì)算的
ST_Equals(g1,g2) :返回g1和g2是否相等
參見
MBRContains(g1,g2) :g1的mbr是否包含g2的mbr
MBRWithin(g1,g2) :g1的mbr是否在g2的mbr內(nèi)
MBRCoveredBy(g1,g2) :g1的mbr是否被g2的mbr覆蓋
MBRCovers(g1,g2) :g1的mbr是否覆蓋g2的mbr
MBRDisjoint(g1,g2) :g1的mbr,g2的mbr是否不相交
MBRIntersects(g1,g2) :g1mbr,g2mbr是否相交
MBREqual(g1,g2) :g1的mbr,g2的mbr的外接是否相等
MBREquals(g1,g2) :g1的mbr,g2的mbr的外接是否相等
MBROverlaps(g1,g2) :g1mbr、g2mbr
其他函數(shù)請(qǐng)參看原文
GeoHash介紹
GeoHash Wiki百科
MySQL中自帶函數(shù) st_geohash(longtude,latitude,max_length) 或 st_geohash(point, max_length) 即可生成某一點(diǎn)的geohash值。
返回一個(gè)geohash字符串中的latitude或longitude
返回一個(gè)geohash解析出的point數(shù)據(jù)
官方文檔
通過geometry生成一個(gè)GeoJSON Object, select st_asgeojson(geometry,max_length,options);
通過GeoJSON生成GeoMetry對(duì)象。
ST_GeomFromGeoJSON(jsonstring, [options [, srid]])
具體使用方法參見官方文檔
官方文檔
MySQL中提供的方便空間運(yùn)算的函數(shù)們
select ST_Distance_Spher(geomPoint1,geomPoint2 [, radius]);
此方法用于計(jì)算兩點(diǎn)或多個(gè)點(diǎn)之間的地球上的距離(是地球球面距離而不是直線距離),返回單位為米,
select ST_IsValid(ST_GeomFromText('LINESTRING(0 0,1 1)'))
判斷入?yún)⑹欠袷欠系乩砦恢妹枋龅母袷健7祷?(符合)或者0(不符);
例如:
返回0:
select st_isvalid(st_geomfromtext('linestring(0 0, -0.00 0, 0.0 0)')
返回1:
select st_isvalid(st_geomfromtext('linestring(0 0,1 1)')
select st_astext(st_makeenvelope(pt1, pt2));
返回兩點(diǎn)構(gòu)成的包絡(luò)。(此計(jì)算是基于笛卡爾坐標(biāo)系而非球面)
例如:
SELECT ST_AsText ( st_makeenvelope ( st_geomfromtext ( 'point(0 0)' ), st_geomfromtext ( 'point(1 1)' ) ) );
返回結(jié)果:
POLYGON((0 0,1 0,1 1,0 1,0 0))
效果說明
JS抽稀算法
select st_simplify(geometry, max_distance);
用道格拉斯-普克算法(抽稀函數(shù))簡(jiǎn)化geometry,并返回與原格式相同格式的結(jié)果。
例如,以下點(diǎn)集擬合為直線,步長(zhǎng)0.5:
SELECT st_simplify ( st_geomfromtext ( 'LINESTRING(0 0,0 1,1 1,1 2,2 2,2 3,3 3)' ), 0.5 )
返回結(jié)果:
LINESTRING(0 0, 0 1, 1 1, 2 3, 3 3)
再如,步長(zhǎng)1.0:
SELECT st_simplify ( st_geomfromtext ( 'LINESTRING(0 0,0 1,1 1,1 2,2 2,2 3,3 3)' ), 1.0 )
返回結(jié)果:
LINESTRING(0 0, 3 3)
SELECT ST_Validate(geometry);
驗(yàn)證geometry是符合正確的地理位置信息格式。例如 Point(0 0) 是合格的; Linestring(0 0) 是非法的; Linestring(0 0, 1 1) 是合格的
了解了上述MySQL中關(guān)于集合對(duì)象的功能,下面來實(shí)踐一下
由上面geohash長(zhǎng)度-精度對(duì)應(yīng)表可知,前6位表示±610米左右的誤差,這里先查詢前六位范圍之后再用上述方法精確篩選一次即可:
可將上述查詢方法封裝為MySQL函數(shù)方便和簡(jiǎn)化程序調(diào)用.
該方法是運(yùn)用了內(nèi)置的幾何關(guān)系運(yùn)算函數(shù) ST_Contains 和 ST_MakeEnvelop 來實(shí)現(xiàn)的,0.5對(duì)應(yīng)大概500米左右的范圍,具體如下;
鏈接:
提取碼: jagn
網(wǎng)站標(biāo)題:mysql經(jīng)緯度怎么存 mysql計(jì)算經(jīng)緯度之間的距離
鏈接分享:http://chinadenli.net/article20/hihjjo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司、搜索引擎優(yōu)化、ChatGPT、小程序開發(fā)、定制開發(fā)、網(wǎng)站營(yíng)銷
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)