För några år sedan släppte Zillow sina gränsgränsfiler för USA via Creative Commons Sharealike 3.0-licens. Det är en stor resurs. Om du är intresserad av kartor till andra länder, kolla in OpenStreetMaps.
Om du inte har använt geografiska shapefiler tidigare kan det dock vara lite förvirrande om hur du integrerar Zillows kartdata i din egen ansökan.
Jag har byggt en gratis, öppen källdemoapplikation, MapApp, för att visa hur man använder gränserna för Zillow-grannskapet och integrera dem med Google Maps, geolocation och geocoding.
MapApp är byggt med hjälp av Yii Framework och kan köras på alla MySQL, PHP-kompatibla servrar. MapApp använder också Google Maps API, HTML5 Geolocation-hjälpen från estebanav, eGeocoder och egMap (de senare två är Yii-tillägg).
För att komma igång kan du hitta MapApp-koden på GitHub. Följ installationsstegen som har testats för Ubuntu 14.04 på Digital Ocean, men ska fungera med någon version av LAMP.
Du kan antingen klona förvaret eller hämta en kopia. Konfigurera Apache-webbplatsen (som beskrivs i installationsstegen) och starta om Apache.
Processen tar cirka 45 till 60 minuter. Det finns mycket att konfigurera: Konfigurera din server, din DNS, packa upp koden, konfigurera din Apache-server, din MySQL-databas, installera konfigurationsfilen, kör aktiva migreringen, installera kartläggningsbiblioteken, ladda ner och importera och justera Zillow data.
Om du vill spara tid, erbjuder jag en förkonfigurerad bild av MapApp för Digital Ocean. Men du lär dig mer om du går igenom alla steg själv.
När du har skapat din MySQL-databas för MapApp, är det dags att få Zillow-data.
Installera Geospatial Data Abstraction Libraries och unzip:
sudo apt-get installera gdal-bin sudo apt-get installera unzip
Skapa en katalog för att tillfälligt lagra Zillow-data och kopiera nedladdningsskripten.
mkdir ~ / zillow cp /var/www/mapapp/docs/wget-zillow.txt ~ / zillow / wget-zillow
Anpassa batchfilen för att ladda ner filerna för de stater du vill ha (t.ex. Kalifornien, Oregon, Washington eller alla). Kör sedan nedladdningsskriptet. Detta hämtar alla önskade zip-filer från Zillow:
bash wget-zillow
Gör så förbereda MySQL-importskript:
cp /var/www/mapapp/docs/import-zillow.txt ~ / zillow / import-zillow kopiera /docs/import-zillow.txt till ~ / zillow / import-zillow
Anpassa listan över stater i skriptet vars formfiler du vill importera till MySQL. Du måste också anpassa databasnamnet, referensuppgifterna och kvarterstabellnamnet i din lokala fil och köra skriptet. Detta kommer att använda verktyget ogr2ogr för att importera formen (.shp) -filerna till MySQL:
bash import-zillow
Du måste anpassa filen /docs/config-mapapp.ini med dina egna inställningar, särskilt MySQL-åtkomstinställningarna:
mkdir / var / www / secure cd / var / www / secure #not: namn är omvänd nedan från github till servern cp /var/www/mapapp/docs/mapapp-config.ini / var / www / secure / config- mapapp.ini sudo nano config-mapapp.ini
Kör sedan aktiv migreringsdatabasmigrering för att initiera MapApp. Databasmigreringar ingår i Yii Framework, och tjänar till att skapa tabeller och scheman på ett programmerat sätt:
cd / var / www / mapapp ./app/protected/yiic migrera upp
När du uppmanas ange ett användarnamn, e-postadress och lösenord för ditt administratörskonto. Det här är vad du ska använda för att logga in på MapApps hemsida.
Slutligen måste du köra ett manus för att vända de geografiska koordinaterna i MySQL-tabellen i Zillow-kvarteret. Besök http://yourdomain.com/neighborhoods/reverse. Beroende på antalet Zillow-tillståndsfiler du importerade kan det ta några minuter. Jag har funnit att ogr importerar Zillows latitud- och longituddata i motsatt koordinatordning än vad Google Maps kräver.
Besök din hemsida på http://mapapp.yourdomain.com. Logga in med användarnamnet och lösenordet du skapade under migrering av databasen.
Bläddra bland dina importerade stadsdelar och klicka på någon du vill visa. Nästa grannlänk gör det enkelt att se mer än en. Du kan också söka efter stadsnamn, stad, stat eller län
Jag använder Yii-tillägget egMap för att visa Google Maps med hjälp av Zillow-områdets polygondata. Men alla PHP-bibliotek för Google Maps eller JavaScript fungerar lika bra.
De prepareMap
funktionen i grannskapsmodellen begär Zillow-polygondata från databasen såväl som centrumpunkten i grannskapet (kallad centroid). Vi använder centroid för att placera visningsporten på kartan.
public function prepareMap ($ id) $ pg = Yii :: app () -> db-> createCommand () -> välj ('AsText (SHAPE) som region, ASTEXT (Centroid (SHAPE)) som centrum') -> från (Yii :: app () -> getDb () -> tablePrefix.'neighborhoods ') -> var (' OGR_FID =: ogr_fid ', array (': ogr_fid '=> $ id)) -> queryRow (); Yii :: import ( 'ext.gmap *.'); $ gMap = ny EGMap (); $ GMap-> setJsName (map_region '); $ gMap-> width = '500'; $ gMap-> height = '500'; $ gMap-> zoom = 13; $ center = ny stdClass; lista ($ center-> lat, $ center-> lon) = $ this-> string_to_lat_lon ($ pg ['center']); $ gMap-> setCenter ($ center-> lat, $ center-> lon); $ coords = $ this-> string_to_coords ($ pg ['region']); $ polygon = ny EGMapPolygon ($ koordinater); $ GMap-> addPolygon ($ polygon); returnera $ gMap;
Kvarterskontrollens visningsåtgärd gör sidan med kartan:
public function actionView ($ id) $ gMap = Områden :: modell () -> prepareMap ($ id); $ this-> render ('view', array ('modell' => $ this-> loadModel ($ id), 'gMap' => $ gMap,));
Klicka på Geolocation i navigeringsfältet för att hitta ditt grannskap från din WiFi-adress. Detta kommer inte att fungera via mobilen.
Du kommer sannolikt att behöva ge din webbläsare tillåtelse för geolocation för att den här funktionen ska fungera (leta efter en popup under adressfältet).
Då kan du klicka på alternativet Sök efter din plats automatiskt:
Ibland behöver du uppdatera för att få rätt svar efter beviljande av tillstånd - eller från vissa WiFi-platser. Vi använder opositionen från estebanav för att stödja HTML5 Geolocation med största möjliga webbläsarstöd.
När din plats hittades visar vi din plats på en karta med ditt Zillow-område och Geocoding-informationen tittade upp självständigt.
Vi använder Yii eGeocoding-förlängningen för att leta upp ytterligare data om din plats. Det här är främst att visa ytterligare datakällor som du kan använda utöver Zillows gränsdata.
public function actionIndex () $ model = ny Geolocation (); om isset ($ _ POST ['Geolocation'])) $ info = Yii :: app () -> geocoder-> omvänd ($ _ POST ['Geolocation'] ['lat'], $ _ POST ['Geolocation'] [ 'lon']); $ gps_for_sql = "Punkt (". $ _ POST ['Geolocation'] ['lat']. "". $ _ POST ['Geolocation'] ['lon']. ")"; $ neighborhood = Neighborhoods :: model () -> lookupFromLatLon ($ gps_for_sql); $ gMap = Områden :: modell () -> prepareMap ($ neighborhood ['OGR_FID']); $ markör = ny EGMapMarkerWithLabel ($ _ POST ['Geolocation'] ['lat'], $ _ POST ['Geolocation'] ['lon'], array ('title' => 'Du är här!')); $ GMap-> addMarker ($ markör); $ gMap-> width = '400'; $ gMap-> height = '400'; $ this-> render ('view', array ('data' => $ grannskap, 'info' => $ info, 'gMap' => $ gMap)); else $ this-> render ('index', array ('model' => $ modell));
Om du vill se mer, inklusive att skriva dina egna regionskartor, prova mitt sidprojekt, Geogram. Det låter dig skapa e-postdrivna samhällen kring stadsdelar, användardefinierade regioner, platser och Google Places-katalogen.
Geogram har ett antal utökade kartläggnings- och e-postfunktioner. Om du är intresserad av en handledning om Geograms användning av Mailgun-epost-API läser du hur Geogram byggt en gratis grupp-e-posttjänst med hjälp av Yii för PHP med MySQL. Jag kan skriva en handledning om att dra regioner för Google Maps i framtiden - skriv en kommentar nedan om du vill läsa det. Du kanske också är intresserad av några av mina andra Yii-baserade handledning. Jag kommer att skriva en Yii Framework introduktion för Tuts + snart.
Vänligen gärna posta rättelser, frågor eller kommentarer nedan. Du kan också nå mig på Twitter @ reifman eller maila mig direkt.