在PHP中,我有以下代码来计算两个位置之间的距离:
<?php
function distance($lat1, $long1, $lat2, $long2) {
// DEGREE TO RADIAN
$latitude1 = $lat1/180*pi();
$longitude1 = $long1/180*pi();
$latitude2 = $lat2/180*pi();
$longitude2 = $long2/180*pi();
// FORMULA: e = ARCCOS ( SIN(Latitude1) * SIN(Latitude2) + COS(Latitude1) * COS(Latitude2) * COS(Longitude2-Longitude1) ) * EARTH_RADIUS
$distance = acos(sin($latitude1)*sin($latitude2)+cos($latitude1)*cos($latitude2)*cos($longitude2-$longitude1))*6371;
return $distance;
}
echo distance(9.9921962, 53.5534074, 9.1807688, 48.7771056); // Hamburg, DE - Stuttgart, DE
?>
Run Code Online (Sandbox Code Playgroud)
但是现在,我想从我的MySQL数据库中通过PHP选择靠近给定位置的位置:
我希望你能帮助我.提前致谢!
我创建了一个包含以下列的表:
Text:varchar(255)
Location:geography
Run Code Online (Sandbox Code Playgroud)
它们包含来自荷兰的一些城市作为数据(从谷歌地图获得坐标):
Rotterdam - POINT (51.925637 4.493408 4326)
Utrecht - POINT (52.055868 5.103149 4326)
Nijmegen - POINT (51.801822 5.828247 4326)
Breda - POINT (51.542919 4.77356 4326)
Run Code Online (Sandbox Code Playgroud)
我想知道鹿特丹数据库中所有城市之间的距离,所以我执行这个查询:
Select
Text, Location,
Location.STDistance(geography::Point(51.925638, 4.493408, 4326)) as Distance
from Messages
Run Code Online (Sandbox Code Playgroud)
但结果是每个城市的距离接近6800000.
可能是什么导致了这个?
我能想到的唯一原因是我使用了错误的SRID,但我无法弄清楚应该使用哪一个.
谢谢!
编辑:
只是为了它,我去玩数字,我得到了一些奇怪的结果:
Distance from Rotterdam to Rotterdam: 6828459.57 (A) (weird but true)
Distance from Rotterdam to Breda: 6779956.10 (B)
Distance from Rotterdam to Nijmegen: 6695336.38 (C)
Run Code Online (Sandbox Code Playgroud)
现在这里有趣的地方:
(A) - (B) = 48504 m = 48 km
(A) …Run Code Online (Sandbox Code Playgroud) 在Azure上的SQL Server(2008 R2)中,有一个包含大量地理Points(纬度/经度)的表:
CREATE TABLE MyPoints
(
Region uniqueidentifier NOT NULL,
Number int NOT NULL,
Position geography NOT NULL,
CONSTRAINT PK_MyPoints PRIMARY KEY(Region, Number)
)
Run Code Online (Sandbox Code Playgroud)
现在我想创建一个Polygon从这一点来确定,我的哪些商店位于由点定义的区域.
是否有一种原生的快速方法从T-SQL中的给定点构建多边形?我找到的解决方案是使用STGeomFromText/ STGeomFomWKB方法创建一个多边形,这对我来说似乎非常麻烦和缓慢.
就像是:
SET @POLY = geometry::STPolyFromPoints(SELECT Position FROM MyPoints)
Run Code Online (Sandbox Code Playgroud) 我的问题是我有一个包含数千个城市的文件,我想将城市名称映射到(大都市统计区域和非美国城市的MSA等价物.在这里有类似问题的一堆帖子.我正在使用Python如果有帮助(例如,如果有一个类似于googlemaps python包工作的python包...)
将城市映射到邮政编码.这里有一个很好的答案,为美国的每个城市提供带有邮政编码的csv.但由于人口普查数据的发布将美国各县映射到MSA,而不是美国城市,我仍然需要找到一种方法从邮政编码映射到美国城市.
美国城市MSA数据库这基本上是我的问题(至少是美国部分),但海报或我的问题并没有得到满足.
谷歌的地理编码开发者网站谷歌地理编码开发者网站有一个有用的CSV,其中一些美国城市映射到谷歌地铁区域代码.问题是它不是MSA.可下载的旧Google csv 没有说明如何创建城域编码系统.该网站还提供了基于尼尔森DMA(指定市场区域)编码系统的新Google编码系统的链接.
我真的只是在寻找一个有城市,州(如果是美国),国家,地区代码的csv文件.区域代码基于良好的标准(美国人口普查局的MSA将是美国城市的理想选择,非美国城市的非美国国家人口普查分类也是理想的).这样的文件存在吗?或者,是否有一个python包连接到某个数据库,以便我在我的输入文件上运行我的脚本,它输出相应的区域代码?
非常感谢!
回答
对于任何有兴趣的人来说,这是一个非常好的文件,将美国城市映射到各个县:http://www.census.gov/statab/ccdb/ccdbcityplace.html
我有一条@a与另一条线相交的线@b.当我取交点并检测它是否/在哪里与@b相交时,它返回false
declare @a GEOMETRY = Geometry::STGeomFromText('LINESTRING (-83 24, -80.4907132243685 24.788632986627039)', 4326)
declare @b GEOMETRY = Geometry::STGeomFromText('LINESTRING (-74.7 21.8, -75.7 22.1, -77.8 22.6, -79.4 23.3, -80.4 24.5, -81.5 28, -84 33, -87 36)', 4326)
DECLARE @intersectionPoint geometry = @a.STIntersection(@b) -- POINT (-80.49071322436852 24.788632986627078)
IF @intersectionPoint IS NULL
THROW 50000, '@intersectionPoint not found', 1
-- Expect 1, Result 0
SELECT @b.STIntersects(@intersectionPoint)
Run Code Online (Sandbox Code Playgroud) 我一直未能成功找到一个由城市定义的美国大都会区(旧金山湾区,南湾,伯克希尔,纽约上州等)数据库.
有谁知道这样的事情是否存在?
维基百科有一个"州内地区"列表:
http://en.wikipedia.org/w/index.php?title=List_of_regions_of_the_United_States#Intrastate_regions
除了这将是每个50个州的痛苦,然后拉出该地区的文章,以找出哪个城市所说的区域组成.
来自联邦调查局的MSA和CSA列表没有帮助,因为它基于统计分组而不是通用名称.
非常感谢,提前
- 迈克尔
我有一个程序,它将lat/long点数组作为输入.我需要对该数组执行检查以确保所有点都在某个半径范围内.因此,例如,我允许的最大半径是100英里.给定一个lat/long数组(来自MySQL数据库,可能是10个点可能是10000)我需要弄清楚它们是否都适合半径为100英里的圆.
有点难过如何处理这个问题.任何帮助将不胜感激.
我正在用C++设计一个应用程序来查看和编辑虚构行星的地图.它的工作原理与Google地图类似.我希望用户能够在GUI上看到它们在纬度/经度和世界坐标上的当前位置.
如何将纬度和经度值转换为"世界坐标"并返回,如Google地图中所示?或"像素坐标"并返回?
我需要一个函数来计算A点和B点之间的距离.
命名空间System.Spatial似乎正是我需要的,但我无法想象如何使用它.
IPoint是一个提供Latitude和Longitude两种类型的接口double.
第一次尝试 :
public static double CalculateDistance(IPoint pointA, IPoint pointB)
{
var gp1 = GeographyPoint.Create(pointA.Latitude, pointA.Longitude);
var gp2 = GeographyPoint.Create(pointB.Latitude, pointB.Longitude);
return gp1.Distance(gp2) ?? 0;
}
Run Code Online (Sandbox Code Playgroud)
以A结尾NotImplementedException的point1.Distance(point2).该消息是法语,但基本上它说"没有注册操作.请使用属性SpatialImplementation.CurrentImplementation.Operations提供操作".
好的,我会试试这个:
public static double CalculateDistance(IPoint pointA, IPoint pointB)
{
var gp1 = GeographyPoint.Create(pointA.Latitude, pointA.Longitude);
var gp2 = GeographyPoint.Create(pointB.Latitude, pointB.Longitude);
return SpatialImplementation.CurrentImplementation.Operations.Distance(gp1, gp2);
}
Run Code Online (Sandbox Code Playgroud)
现在,我得到了一个NullReferenceException上SpatialImplementation.CurrentImplementation.Operations.
Msdn对此并不是很冗长.
任何人都可以解释如何获得这些实现?
我不想将我的地理数据转换为几何,只是因此它在STIntersect中返回true.
这是SQL中的代码:
DECLARE @point GEOGRAPHY = GEOGRAPHY::Point(1, 1, 4326)
DECLARE @polygon GEOGRAPHY = GEOGRAPHY::STGeomFromText('POLYGON((0 0, 0 2, 2 2, 2 0, 0 0))', 4326)
SELECT @polygon.STIntersects(@point), @point.STIntersects(@polygon)
Run Code Online (Sandbox Code Playgroud)
以下返回false(0),但是如果我使用:
DECLARE @point GEOMETRY = GEOMETRY::Point(1, 1, 4326)
DECLARE @polygon GEOMETRY = GEOMETRY::STGeomFromText('POLYGON((0 0, 0 2, 2 2, 2 0, 0 0))', 4326)
SELECT @polygon.STIntersects(@point), @point.STIntersects(@polygon)
Run Code Online (Sandbox Code Playgroud)
它返回true,有什么我想念的吗?我所知道的是地理是3D平面,几何是平面地图,但是如果点在多边形中,我正在使用地球进行计算.
PS:它与STContains,STWithin,STOverlaps不兼容
使用Microsoft SQL Server 2012