标签: geography

PHP/MySQL:从DB中选择靠近给定位置的位置

在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选择靠近给定位置的位置:

  • 用户进入他的家乡
  • 我的脚本通过Google API获取纬度/经度值
  • 在我的数据库中,我有大约200个位置,其中包含纬度值的字段和经度值的字段
  • 我需要一个PHP和MySQL代码来选择最接近用户家乡的10个位置

我希望你能帮助我.提前致谢!

php mysql geography distance geolocation

8
推荐指数
1
解决办法
1万
查看次数

SQL Server 2008 R2地理距离?

我创建了一个包含以下列的表:

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)

.net sql sql-server geography distance

8
推荐指数
1
解决办法
4692
查看次数

从T-SQL中的点创建地理多边形

在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)

t-sql sql-server geography sql-server-2008-r2

8
推荐指数
2
解决办法
2万
查看次数

数据库映射世界城市到大都市统计区域(和非美国MSA等价物)

我的问题是我有一个包含数千个城市的文件,我想将城市名称映射到(大都市统计区域和非美国城市的MSA等价物.在这里有类似问题的一堆帖子.我正在使用Python如果有帮助(例如,如果有一个类似于googlemaps python包工作的python包...)

  1. 将城市映射到邮政编码.这里有一个很好的答案,为美国的每个城市提供带有邮政编码的csv.但由于人口普查数据的发布将美国各县映射到MSA,而不是美国城市,我仍然需要找到一种方法从邮政编码映射到美国城市.

  2. 美国城市MSA数据库这基本上是我的问题(至少是美国部分),但海报或我的问题并没有得到满足.

  3. 谷歌的地理编码开发者网站谷歌地理编码开发者网站有一个有用的CSV,其中一些美国城市映射到谷歌地铁区域代码.问题是它不是MSA.可下载的旧Google csv 没有说明如何创建城域编码系统.该网站还提供了基于尼尔森DMA(指定市场区域)编码系统的新Google编码系统的链接.

我真的只是在寻找一个有城市,州(如果是美国),国家,地区代码的csv文件.区域代码基于良好的标准(美国人口普查局的MSA将是美国城市的理想选择,非美国城市的非美国国家人口普查分类也是理想的).这样的文件存在吗?或者,是否有一个python包连接到某个数据库,以便我在我的输入文件上运行我的脚本,它输出相应的区域代码?

非常感谢!

回答

对于任何有兴趣的人来说,这是一个非常好的文件,将美国城市映射到各个县:http://www.census.gov/statab/ccdb/ccdbcityplace.html

python csv geocoding geography google-adwords

8
推荐指数
1
解决办法
6779
查看次数

STIntersection结果是STIntersects = 0

我有一条@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)

sql sql-server floating-point geometry geography

8
推荐指数
1
解决办法
154
查看次数

美国大都市区名称数据库?

我一直未能成功找到一个由城市定义的美国大都会区(旧金山湾区,南湾,伯克希尔,纽约上州等)数据库.

有谁知道这样的事情是否存在?

维基百科有一个"州内地区"列表:

http://en.wikipedia.org/w/index.php?title=List_of_regions_of_the_United_States#Intrastate_regions

除了这将是每个50个州的痛苦,然后拉出该地区的文章,以找出哪个城市所说的区域组成.

来自联邦调查局的MSA和CSA列表没有帮助,因为它基于统计分组而不是通用名称.

非常感谢,提前

- 迈克尔

database geocoding geography

7
推荐指数
1
解决办法
4979
查看次数

多个纬度/经度点的半径

我有一个程序,它将lat/long点数组作为输入.我需要对该数组执行检查以确保所有点都在某个半径范围内.因此,例如,我允许的最大半径是100英里.给定一个lat/long数组(来自MySQL数据库,可能是10个点可能是10000)我需要弄清楚它们是否都适合半径为100英里的圆.

有点难过如何处理这个问题.任何帮助将不胜感激.

ruby mysql math geography

7
推荐指数
1
解决办法
4376
查看次数

如何将纬度和经度转换为Google地图的世界坐标

我正在用C++设计一个应用程序来查看和编辑虚构行星的地图.它的工作原理与Google地图类似.我希望用户能够在GUI上看到它们在纬度/经度和世界坐标上的当前位置.

如何将纬度和经度值转换为"世界坐标"并返回,如Google地图中所示?或"像素坐标"并返回?

google-maps geography latitude-longitude

7
推荐指数
1
解决办法
6883
查看次数

如何使用System.Spatial.GeographyPoint

我需要一个函数来计算A点和B点之间的距离.

命名空间System.Spatial似乎正是我需要的,但我无法想象如何使用它.

IPoint是一个提供LatitudeLongitude两种类型的接口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结尾NotImplementedExceptionpoint1.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)

现在,我得到了一个NullReferenceExceptionSpatialImplementation.CurrentImplementation.Operations.

Msdn对此并不是很冗长.

任何人都可以解释如何获得这些实现?

c# geography

7
推荐指数
1
解决办法
6441
查看次数

内部多边形中的SQL Geography点在ST​​Intersect上未返回true(但使用Geometry返回true)

我不想将我的地理数据转换为几何,只是因此它在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

sql geometry geography point polygon

7
推荐指数
1
解决办法
1万
查看次数