随着2.3 >位置数据处理和查询,MongoDB 的引入变得更加有用.MongoDB将文档存储为BSON,因此每个文档都包含所有文档字段,这显然可能导致比传统RMDBS更大的数据库.
我曾经将折线和多边形存储为一系列索引点,一个额外的字段代表每一行的顺序(我这样做是为了确保一致性,因为我使用JavaScript,因此点并不总是以正确的顺序存储).它是这样的:
polyline: {
[
point: [0,0],
order: 0
],
[
point: [0,1],
order: 1
]
}
Run Code Online (Sandbox Code Playgroud)
而现在我使用:
polyline: {
type: 'LineString',
coordinates: [
[0,0],
[1,0]
]
}
Run Code Online (Sandbox Code Playgroud)
我已经看到文档大小有所改善,因为一些折线最多可以有500个点.
但是,我想知道存储我所有Point数据的好处是什么GeoJSON.我对文档大小的增加感到气馁,例如:
loc: [1,0]
Run Code Online (Sandbox Code Playgroud)
比...更好
loc: {
type: 'Point',
coordinates: [0,1]
}
Run Code Online (Sandbox Code Playgroud)
因此更容易合作.
我的问题是:
是否更好/建议将点存储为GeoJSON对象而不是2点阵列?
我考虑的是以下内容:
lng, lat格式中的每组坐标,而不是坚持lat, lng使用点,而前者用于我所有其他位置功能.$geoWithin或$geoIntersects使用它,在将其用作query参数之前,我不需要先将其转换为GeoJSON .我不确定的是:
loc: [x,y]将在MongoDB上放弃支持2dsphere而不是2d我在WGS84,我想转变为一个地图投影使用SWEREF99 TM协调GPS坐标PROJ.4在Java或Proj4js在JavaScript中.
很难找到PROJ.4的文档以及如何使用它.如果您有良好的链接,请将其作为评论发布.
SWEREF99 TM的PROJ.4参数是+proj=utm +zone=33 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs
我试图使用PROJ.4 Java库进行转换Lat: 55° 00’ N, Long: 12° 45’ E并尝试使用此代码:
String[] proj4_w = new String[] {
"+proj=utm",
"+zone=33",
"+ellps=GRS80",
"+towgs84=0,0,0,0,0,0,0",
"+units=m",
"+no_defs"
};
Projection proj = ProjectionFactory.fromPROJ4Specification(proj4_w);
Point2D.Double testLatLng = new Point2D.Double(55.0000, 12.7500);
Point2D.Double testProjec = proj.transform(testLatLng, new Point2D.Double());
Run Code Online (Sandbox Code Playgroud)
这给了我一点,Point2D.Double[5197915.86288144, 1822635.9083898761]但我应该N: 6097106.672, E: 356083.438
是我做错了什么?我应该使用什么方法和参数呢?
正确的值取自Lantmäteriet.
我不确定是否proj.transform(testLatLng, new Point2D.Double());使用正确的方法.
搜索一些示例代码,用于将WGS84坐标系中的点转换为Google地图中的地图位置(像素位置),同时支持缩放级别.
如果代码评论很好,那么它也可以使用其他语言.
您还可以向我指出一个开源Java项目:)
找到一些资源:
OpenLayer实现.
JOSM项目
来自JH LABS的优秀Java Map Projection Library.这是一个纯Java PROJ.4端口.是否从WGS84投影到米.从那里将米转换为平铺像素非常简单.
您好
我试图实现一个简单的GPS跟踪器.因此被使用
lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 0, this);
Run Code Online (Sandbox Code Playgroud)
然后我用了
public void onLocationChanged(Location location) {
Run Code Online (Sandbox Code Playgroud)
读取当前位置高度的方法.
但我真的不知道Location.getAltitude()返回什么.该文件说它返回了海拔高度.但这是米吗?还是脚?如果我把手机放在我旁边的桌子上,这个值会在500到-500之间变化吗?
这真的有用吗???
我有一张来自地图一部分的真实比例的 8640x11520 像素的图像。我需要将我的 x, y 点转换为坐标,有人想知道吗?
var mapWidth = 8640;
var mapHeight = 11520;
var mapLatitudeStart = 28.349768989955244;
var mapLongitudeStart = -81.55803680419922;
var maxLatitude = 28.349806758250104;
var maxLongitude = -81.541128;
var pointNeedConversion = {'x': 4813.10 'y': 2674.84};
var pointLatitude = ??
Run Code Online (Sandbox Code Playgroud) 考虑地球表面上的点P1(60°N,20°E,0)和P2(60°N,22°E,0)
当使用WGS-84椭圆体模拟地球的形状时,点P1和P2之间的最短距离是多少?
我正在使用GDAL库.目前,我可以接受左上角和右上角,并从原始图像中切出图像.我现在要做的是,接受两个WKT点并转换为X,Y坐标来做同样的事情.我只是想知道如果我知道GeoTransform及它使用的坐标系统(WGS84)是否可以这样做?
我在GeoTools的帮助下遇到了一个关于心爱坐标变换的问题:我想将Gauss-Kruger(第5区,EPSG 31469)的一组坐标转换成普通的WGS84坐标(EPSG 4326).
我用一个简单的例子构建了一个代码(只需要一对坐标):
double coordX = 5408301.53;
double coordY = 5659230.5;
double[] punt = new double[2];
CoordinateReferenceSystem sourceCRS = CRS.decode("EPSG:31469");
CoordinateReferenceSystem targetCRS = CRS.decode("EPSG:4326");
MathTransform transform = CRS.findMathTransform(sourceCRS, targetCRS, true);
DirectPosition expPt = new GeneralDirectPosition(coordX, coordY);
expPt = transform.transform(expPt, null);
punt = expPt.getCoordinate();
System.out.println(punt[0] + ", " + punt[1]); //lon, lat
Run Code Online (Sandbox Code Playgroud)
调试后的结果如下:48.791886921764345,17.16525096311777
当我检查我获得的WGS84坐标(只是将它们打到谷歌地图)时,我最终在奥地利附近的捷克共和国的某个地方,虽然这对坐标应该在德国东部的某个地方(当然,我用一些html检查了它)解码器):
--->应该是结果:51.0609167,13.6900142.
我无法想象出现这种失败的原因.GeoTools获得了两个想要的CRS(我从java控制台中附加了响应的摘录)
有人能解释一下吗?我很感激任何帮助!
许多问候,塞巴斯蒂安
**sourceCRS:**
PROJCS["DHDN / 3-degree Gauss-Kruger zone 5",
GEOGCS["DHDN",
DATUM["Deutsches Hauptdreiecksnetz",
SPHEROID["Bessel 1841", 6377397.155, 299.1528128, AUTHORITY["EPSG","7004"]],
TOWGS84[612.4, 77.0, 440.2, -0.054, 0.057, -2.797, 2.55], …Run Code Online (Sandbox Code Playgroud) 对于我正在编写的应用程序,我们正在将IOS设备与外部传感器连接,外部传感器通过本地wifi网络输出GPS数据.这些数据以海拔高度的"原始"格式出现.通常,所有GPS高度需要具有与基于当前位置的WGS84大地水准面高度相关的校正因子.
例如,在以下地理控制点(http://www.ngs.noaa.gov/cgi-bin/ds_mark.prl?PidBox=HV9830)位于Lat 38 56 36.77159和Lon 077 01 08.34929
HV9830* NAD 83(2011) POSITION- 38 56 36.77159(N) 077 01 08.34929(W) ADJUSTED
HV9830* NAD 83(2011) ELLIP HT- 42.624 (meters) (06/27/12) ADJUSTED
HV9830* NAD 83(2011) EPOCH - 2010.00
HV9830* NAVD 88 ORTHO HEIGHT - 74.7 (meters) 245. (feet) VERTCON
HV9830 ______________________________________________________________________
HV9830 GEOID HEIGHT - -32.02 (meters) GEOID12A
HV9830 NAD 83(2011) X - 1,115,795.966 (meters) COMP
HV9830 NAD 83(2011) Y - -4,840,360.447 (meters) COMP
HV9830 NAD 83(2011) Z - 3,987,471.457 (meters) …Run Code Online (Sandbox Code Playgroud) 我需要一个函数来高精度地计算一对WGS 84位置之间的距离,并且我打算使用Boost几何中的geographic函数。
该升压几何设计合理的状态:
有Andoyer方法,既快速又精确,还有Vincenty方法,又慢又精确。
但是,在boost::geometry::distance同时使用Andoyer和Vincenty策略测试功能时,我得到了以下结果:
WGS 84 values (metres)
Semimajor axis: 6378137.000000
Flattening: 0.003353
Semiminor axis: 6356752.314245
Semimajor distance: 20037508.342789
Semiminor distance: 19970326.371123
Boost geometry near poles
Andoyer function:
Semimajor distance: 20037508.151445
Semiminor distance: 20003917.164970
Vincenty function:
Semimajor distance: **19970326.180419**
Semiminor distance: 20003931.266635
Boost geometry at poles
Andoyer function:
Semimajor distance: 0.000000
Semiminor distance: 0.000000
Vincenty function:
Semimajor distance: **19970326.371122**
Semiminor distance: 20003931.458623
Run Code Online (Sandbox Code Playgroud)
在Vincenty沿半长轴(即在赤道附近)距离小于周围的短半轴的距离北极和南极之间的轴。那是不正确的。 …