我正在做一个室内地图导航应用程序,我想要做的是在建筑物中建立一个地图点数据库.
我使用的所有坐标都取自Google Map(这意味着EPSG为3857).我现在需要做的是找到以米为单位的距离以及以米为单位的D_Within
当我试图提取出2点之间的距离时:
SELECT ST_DISTANCE(
ST_GeomFromText('POINT(' || StartLon || ' ' || StartLat || ')',3857),
ST_GeomFromText('POINT(' || EndLon || ' ' || EndLat || ')',3857))
FROM i3_building.floordata;
Run Code Online (Sandbox Code Playgroud)
对于前两行:
Start: 103.776047 1.292149; End: 103.77607 1.292212 (3 meters away)
Start: 103.776070 1.292212; End: 103.77554 1.292406 (50 meters away)
Run Code Online (Sandbox Code Playgroud)
给出的结果是:
2.59422435413724e-005
4.11096095831604e-005
Run Code Online (Sandbox Code Playgroud)
即使它们处于rad,第二个结果也只是第一个结果的两倍.所以这让我感到困惑.然后我尝试将其输出为米:
SELECT ST_DISTANCE(
ST_GeographyFromText('POINT(' || StartLon || ' ' || StartLat || ')'),
ST_GeographyFromText('POINT(' || EndLon || ' ' || EndLat || ')'))
FROM i3_building.floordata;
Run Code Online (Sandbox Code Playgroud)
给出相同行的结果是:
2.872546829
4.572207435
Run Code Online (Sandbox Code Playgroud)
这不是我所期望的.我对PostGis和SRID不是很熟悉,所以这个问题可能看起来很简单,但请帮助我,我没有被@@
我正在尝试向我的Geoserver请求检索地图上用户点击附近的功能.

地图占据了所有空间.因此我用这种方式计算了BBOX:
region = mMap.getProjection().getVisibleRegion().latLngBounds;
double left = region.southwest.longitude;
double top = region.northeast.latitude;
double right = region.northeast.longitude;
double bottom = region.southwest.latitude;
Run Code Online (Sandbox Code Playgroud)
宽度和高度如下:
mMapFragment.getView().getWidth();
mMapFragment.getView().getHeight();
Run Code Online (Sandbox Code Playgroud)
而X和Y参数按以下方式计算:
Point click = mMap.getProjection().toScreenLocation(latLng);
Run Code Online (Sandbox Code Playgroud)
其中latLng是来自事件onMapClick(LatLng)的点(参考此处:https://developers.google.com/android/reference/com/google/android/gms/maps/GoogleMap.OnMapClickListener).
我获得的结果是:
http://localhost/geoserver/sindot/wms?service=WMS&request=GetFeatureInfo&info_format=application%2Fjson&version=1.1.1&srs=EPSG%3A3857&bbox=1222173.74033,5056403.44084,1222174.11356,5056403.7028&query_layers=sindot:verticale&layers=sindot:verticale&feature_count=3&styles=tabletb3lab&width=2048&height=1262&x=1441&y=503
Run Code Online (Sandbox Code Playgroud)
问题是服务器总是返回一个空响应,即使我知道那里有功能,因为我可以看到地图上的斑点.会是什么呢?
提前致谢.
使用fiona和使用Python处理坐标系时osgeo,似乎有很多方法可以通过导入/导出不同的crs格式来定义坐标系,例如:
FIONA:
from fiona.crs import from_epsg,from_string,to_string
# Import crs from different formats:
wgs = from_epsg(4326)
wgs = from_string("+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs ")
# Export crs as proj4 string
wgs_proj4_string = to_string(wgs)
Run Code Online (Sandbox Code Playgroud)
OSGEO:
from osgeo import osr
srs = osr.SpatialReference()
srs.ImportFromESRI(['GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]]'])
srs.ImportFromProj4("+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs")
srs.ImportFromEPSG(4326)
#the import options are very rich
# Export to different formats
srs.ExportToProj4()
srs.ExportToWkt()
srs.ExportToXML()
#... many export options!
Run Code Online (Sandbox Code Playgroud)
但是,我注意到,这两个库都允许通过其EPSG代码轻松定义crs,但是它们都缺少逆函数(将crs导出为ESPG代码)。
我最接近EPSG代码的方式是:
srs.AutoIdentifyEPSG()
epsg = srs.GetAuthorityCode(None)
Run Code Online (Sandbox Code Playgroud)
但是它似乎并不那么可靠,而且其他提议的解决方案似乎也包括大量的调整或至少与Web服务相关。
问题: …
我正在使用 anaconda 作为 geopandas。但是,每次我尝试使用 epsg:4326: 时,都会出现错误。
CRSError: Invalid projection: epsg:4326: (Internal Proj Error: proj_create: SQLite error on SELECT name, type, coordinate_system_auth_name, coordinate_system_code, datum_auth_name, datum_code, area_of_use_auth_name, area_of_use_code, text_definition, deprecated FROM geodetic_crs WHERE auth_name = ? AND code = ?: no such column: area_of_use_auth_name)
Run Code Online (Sandbox Code Playgroud)
我怎么解决这个问题?
我试过:
from functools import partial
from pyproj import Proj, transform
proj_4326 = Proj(init="epsg:4326")
proj_3857 = Proj(init="epsg:3857")
Run Code Online (Sandbox Code Playgroud)
我还尝试重置环境:
conda update anaconda
Run Code Online (Sandbox Code Playgroud)
但他们都给出了相同的 CRSError
我的版本是:
import sys
import pyproj
import geopandas
Run Code Online (Sandbox Code Playgroud)
print(sys.version)
print(pyproj.__version__)
print(geopandas.__version__)
Run Code Online (Sandbox Code Playgroud)
3.8.5 (default, Sep 4 2020, …Run Code Online (Sandbox Code Playgroud) 我在我的数据库中有EPSG 3857格式的坐标列表.我需要在EPSG 4326中转换它们我试图使用DotSpatial,但我的代码总是重新调整一个无限的双数组.
public double[] ConvertCoodinates()
{
double[] xy = new double[2];
xy[0] = 5085240.8300000000;
xy[1] = 1530088.9600000000;
//An array for the z coordinate
double[] z = new double[1];
z[0] = 0;
ProjectionInfo pStart = KnownCoordinateSystems.Geographic.World.WGS1984;
pStart.AuthorityCode = 3857;
ProjectionInfo pEnd = KnownCoordinateSystems.Geographic.World.WGS1984;
pEnd.AuthorityCode = 4326;
Reproject.ReprojectPoints(xy, z, pStart, pEnd, 0, 1);
return xy;
}
Run Code Online (Sandbox Code Playgroud)
xy数组总是无穷大; 有人能帮我吗?
我有以下 OpenGis 数据,我想将其转换为纬度/经度坐标(如 Google 地图所使用)。
\n\n<address xmlns:gml="http://www.opengis.net/gml">\n <gml:Point srsName="urn:ogc:def:crs:EPSG::28992">\n <gml:pos>142629.0 523546.0</gml:pos>\n </gml:Point>\n</address>\nRun Code Online (Sandbox Code Playgroud)\n\n在EPSG注册表中,我找到了EPSG的起始位置:28992。
\n\nLatitude of natural origin 52\xc2\xb009\'22.178"N\nLongitude of natural origin 5\xc2\xb023\'15.5"E\nScale factor at natural origin 0.9999079 unity\nFalse easting 155000 metre\nFalse northing 463000 metre\nRun Code Online (Sandbox Code Playgroud)\n\n我尝试过使用proj4js,但我不知道如何将其放入投影中以及如何获得所需的输出。
\n\n我也尝试过自己计算一下。但我不知道我在这里做什么,也没有什么真正有意义的:(。
\n如何使用 R 从 PROJ4 字符串接收 EPSG 代码?
我有一堆栅格数据集(随机分布在世界各地,北半球和南半球),具有坐标参考系统UTM WGS84。现在我想使用 R 找出每个数据集的具体 EPSG 代码。你有什么想法吗?
# Install and load package raster
install.packages('raster')
library(raster)
# Load a specific raster dataset and query the crs
raster_dat <- raster('D:/UnknownUser/GlobalRasterData/raster_dat1')
crs(raster_dat)
# CRS arguments:
# +proj=utm +zone=13 +datum=WGS84 +units=m +no_defs +ellps=WGS84 +towgs84=0,0,0
Run Code Online (Sandbox Code Playgroud)
也许可以以动态方式创建 EPSG 代码,因为 EPSG 代码似乎始终是北半球的 <326> 和特定区域编号(例如 <32>)(德国)的组合,这会导致EPSG 代码 <326> + <32> = <32632>。
不幸的是,我发现您似乎从南半球的 <327> 开始,然后添加特定的区域编号,例如 <32> (尼日利亚),结果是 <327> + <32> =<32732>。
现在我不确定这个理论是否正确(需要验证,包括来源))以及是否有更简单的方法从 PROJ4 字符串接收 EPSG 代码。
我发现的有用链接:
网址: …
我正在尝试将数据框中的 sf 点(CRS:4326,基于度数)转换为本地公制投影(EPSG:23867,DGN95 / UTM 区域 47N)。
所以我有一个数据框“航点”,其中包含我的所有属性以及经度/纬度作为列。我在数据框中创建一个 sf 点几何图形,并以“lat”和“lon”作为输入(waypoints_sf)。(此外,我将坐标保存为两个新列中的北距和东距)
waypoints_sf <- st_as_sf(waypoints,
coords = c("lat", "lon"),
crs = 4326)
coordinates_tmp <- st_coordinates(waypoints_sf)
colnames(coordinates_tmp) <- c("E","N")
waypoints_sf <- cbind(waypoints_sf,coordinates_tmp) # save coordinates as column E and N
class(waypoints_sf)
[1] "sf" "grouped_df" "tbl_df" "tbl" "data.frame"
class(waypoints_sf$geometry)
[1] "sfc_POINT" "sfc"
st_crs(waypoints_sf$geometry)
[1] Coordinate Reference System:
EPSG: 4326
proj4string: "+proj=longlat +datum=WGS84 +no_defs"
Run Code Online (Sandbox Code Playgroud)
现在,当我尝试 st_transform 这个数据框时,它不会抛出错误或警告,但无论我尝试什么,sf 点都是空几何图形c(NaN, NaN)。
waypoints_sf <- st_transform(waypoints_sf, 23867)
waypoints_sf$geometry[1]
[1] Geometry set for 1 feature (with 1 geometry …Run Code Online (Sandbox Code Playgroud)